-
Notifications
You must be signed in to change notification settings - Fork 1
/
yt-dlp-advanced.py
146 lines (120 loc) · 4.1 KB
/
yt-dlp-advanced.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import _json_formatter, _profile_img_downloader, _thumbnail_generator, os, pathlib, urllib.parse, json
from yt_dlp import YoutubeDL
download_youtube_video = True
# if downloading a new video from YouTube,
if download_youtube_video == True:
# get/set the initial youtube video url
upload_url = 'https://vimeo.com/26427650?embedded=true&source=vimeo_logo&owner=905661'
uploader = ''
profile_image = ''
original_thumbnail = ''
platform = 'YouTube'
square_corners = False
file_name = ''
# if fixing an old thumbnail or making a custom video,
else:
upload_url = ''
uploader = 'Jack Rhysider'
profile_image = 'Jack%20Rhysider [YouTube].jpeg'
original_thumbnail = '/users/matthewnau/Downloads/image.jpeg'
platform = 'Spotify'
square_corners = False
file_name = 'watermark'
# get the current directory
current_directory = str(pathlib.Path().resolve())
# set the output directory for all files (defult is current_directory)
output_directory = current_directory
# set yt-dlp's options
ydl_opts = {
'writethumbnail': True,
'writeinfojson': True,
'writesubtitles': True,
'writeautomaticsub': True,
'subtitlesformat': 'srt',
'subtitleslangs': ['en'],
'outtmpl': '%(title)s.%(ext)s',
'nocheckcertificate': True,
'restrictfilenames': True,
'merge_output_format': 'mkv',
'postprocessors': [{
'key': 'FFmpegSubtitlesConvertor',
'format': 'srt'
}, {
'key': 'FFmpegEmbedSubtitle'
}]
}
# download the video
if upload_url != '':
with YoutubeDL(ydl_opts) as ydl:
ydl.download([upload_url])
# set the json file to the most recent (just downloaded)
json_file = os.popen("ls -t '" + output_directory + "'/*.json | head -1").read().strip()
# extract the file name without its extension
file_name = json_file[::-1][10:][::-1]
file_name = file_name[::-1][:file_name[::-1].index('/')][::-1]
# format the json file
_json_formatter.format_json(
output_directory,
file_name,
"YouTube",
json_file
)
# load in the new json file
with open(output_directory + '/' + file_name + '.json', 'r', encoding='utf-8') as file:
json_data = json.load(file)
# if no profile pic has been set,
if profile_image == '':
# then download the uploader profile image
_profile_img_downloader.get_profile_image(
str(pathlib.Path(__file__).parent.resolve()),
output_directory,
json_data['uploader'],
json_data['platform'],
upload_url
)
# set the new profile image
profile_image = urllib.parse.quote(json_data['uploader']) + ' [' + platform + '].jpg'
# if no thumbnail has been set,
if original_thumbnail == '':
original_thumbnail = output_directory + '/' + file_name + '.webp'
# if no platform has been set,
if platform == '':
platform = json_data['platform']
# if no uploader has been set,
if uploader == '':
uploader = json_data['uploader']
# set the initial validation to false
is_validated = False
render_attempts = 0
uploader_font_size = 2.3
# generate and re-generate a thumbnail until it passes validation
while not is_validated:
# increase the counter
render_attempts += 1
# log the current thumbnail render attempt
print("generating thumbnail: attempt " + str(render_attempts) + ". Using uploader font size: " + str(uploader_font_size) + "rem")
# create the new thumbnail
_thumbnail_generator.generate_thumbnail(
output_directory, #output directory
file_name, #file name
original_thumbnail, #original thumbnail
uploader, #uploader name
profile_image, #profile image
platform, #platform
square_corners, #square corners
uploader_font_size #uploader font size
)
# update the is_validated to the result of the validation
validation_output = _thumbnail_generator.validate_thumbnail(
output_directory, #output directory
file_name #file name
)
# if uploader name is cut off (too large to fit), decrease font size
if not validation_output["has_min_font_size"]:
uploader_font_size = round(uploader_font_size - 0.1, 2)
# if all tests pass, update is_validated
if not any(value == False for value in validation_output.values()):
is_validated = True
# print a success message when pipeline finishes
if is_validated:
print("Thumbnail created successfully after " + str(render_attempts) + " attempt(s)!")