Nymbo commited on
Commit
1aafe8d
·
verified ·
1 Parent(s): 9de515a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +150 -390
app.py CHANGED
@@ -1,394 +1,154 @@
1
  import gradio as gr
2
  import subprocess
3
-
4
- def run_yt_dlp(command, url):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  try:
6
- result = subprocess.run(command.split() + [url], capture_output=True, text=True)
7
- return result.stdout
 
 
 
 
 
 
 
 
 
8
  except Exception as e:
9
- return str(e)
10
-
11
- def download_mp3(url, quality, embed_metadata, embed_thumbnail, split_chapters, bitrate):
12
- command = [
13
- "yt-dlp",
14
- "-f", "bestaudio",
15
- "--extract-audio",
16
- "--audio-format", "mp3",
17
- "--audio-quality", quality,
18
- "-o", "P:/Local Music/%(title)s.%(ext)s"
19
- ]
20
- if embed_metadata:
21
- command.append("--embed-metadata")
22
- if embed_thumbnail:
23
- command.append("--embed-thumbnail")
24
- if split_chapters:
25
- command.append("--split-chapters")
26
- if bitrate:
27
- command.extend(["--postprocessor-args", f"-b:a {bitrate}k"])
28
- return run_yt_dlp(" ".join(command), url)
29
-
30
- def list_formats(url):
31
- return run_yt_dlp("yt-dlp -F", url)
32
-
33
- def download_playlist(url, start, end):
34
- command = [
35
- "yt-dlp",
36
- "--playlist-items", f"{start}-{end}",
37
- "-f", "bestaudio",
38
- "--extract-audio",
39
- "--audio-format", "mp3",
40
- "--audio-quality", "0",
41
- "-o", "P:/Local Music/%(playlist_title)s/%(title)s.%(ext)s"
42
- ]
43
- return run_yt_dlp(" ".join(command), url)
44
-
45
- def download_from_platform(url, platform):
46
- command = [
47
- "yt-dlp",
48
- "-f", "bestaudio",
49
- "--extract-audio",
50
- "--audio-format", "mp3",
51
- "--audio-quality", "0",
52
- "-o", f"P:/Local Music/{platform}/%(uploader)s - %(title)s.%(ext)s"
53
- ]
54
- return run_yt_dlp(" ".join(command), url)
55
-
56
- def download_transcript(url, format):
57
- command = [
58
- "yt-dlp",
59
- "--write-auto-subs",
60
- "--sub-lang", "en",
61
- "--skip-download",
62
- "-o", f"P:/Local Music/%(title)s.{format}"
63
- ]
64
- return run_yt_dlp(" ".join(command), url)
65
-
66
- def download_video_info(url):
67
- command = [
68
- "yt-dlp",
69
- "--write-info-json",
70
- "--skip-download",
71
- "-o", "P:/Local Music/%(title)s.json"
72
- ]
73
- return run_yt_dlp(" ".join(command), url)
74
-
75
- def download_age_restricted(url, username, password):
76
- command = [
77
- "yt-dlp",
78
- "--username", username,
79
- "--password", password,
80
- "-f", "bestvideo+bestaudio",
81
- "-o", "P:/Local Music/%(title)s.%(ext)s"
82
- ]
83
- return run_yt_dlp(" ".join(command), url)
84
-
85
- def download_from_url_list(file_path):
86
- command = [
87
- "yt-dlp",
88
- "-a", file_path,
89
- "-f", "bestaudio",
90
- "--extract-audio",
91
- "--audio-format", "mp3",
92
- "--audio-quality", "0",
93
- "-o", "P:/Local Music/%(title)s.%(ext)s"
94
- ]
95
- return run_yt_dlp(" ".join(command), "")
96
-
97
- def download_with_speed_limit(url, speed_limit):
98
- command = [
99
- "yt-dlp",
100
- "-f", "bestaudio",
101
- "--extract-audio",
102
- "--audio-format", "mp3",
103
- "--audio-quality", "0",
104
- "--rate-limit", f"{speed_limit}M",
105
- "-o", "P:/Local Music/%(title)s.%(ext)s"
106
- ]
107
- return run_yt_dlp(" ".join(command), url)
108
-
109
- def download_specific_portion(url, start_time, end_time):
110
- command = [
111
- "yt-dlp",
112
- "-f", "bestvideo+bestaudio",
113
- "--external-downloader", "ffmpeg",
114
- "--external-downloader-args", f"ffmpeg_i:-ss {start_time} -to {end_time}",
115
- "-o", "P:/Local Music/%(title)s.%(ext)s"
116
- ]
117
- return run_yt_dlp(" ".join(command), url)
118
-
119
- def update_metadata(url):
120
- command = [
121
- "yt-dlp",
122
- "--download-archive", "P:/Local Music/downloaded.txt",
123
- "--skip-download",
124
- "--embed-metadata",
125
- "--embed-thumbnail",
126
- "--write-description"
127
- ]
128
- return run_yt_dlp(" ".join(command), url)
129
-
130
- def auto_rename_duplicates(url):
131
- command = [
132
- "yt-dlp",
133
- "-f", "bestaudio",
134
- "--extract-audio",
135
- "--audio-format", "mp3",
136
- "--audio-quality", "0",
137
- "--force-overwrites",
138
- "-o", "P:/Local Music/%(title)s.%(ext)s"
139
- ]
140
- return run_yt_dlp(" ".join(command), url)
141
-
142
- def download_multiple_files(urls):
143
- command = [
144
- "yt-dlp",
145
- "-f", "bestaudio",
146
- "--extract-audio",
147
- "--audio-format", "mp3",
148
- "--audio-quality", "0",
149
- "--add-metadata",
150
- "--embed-thumbnail",
151
- "--write-description",
152
- "--postprocessor-args", "-b:a 320k",
153
- "-o", "P:/Local Music/%(title)s.%(ext)s"
154
- ]
155
- return run_yt_dlp(" ".join(command), " ".join(urls))
156
-
157
- def download_opus(url):
158
- command = [
159
- "yt-dlp",
160
- "-f", "bestaudio",
161
- "--extract-audio",
162
- "--audio-format", "opus",
163
- "-o", "P:/Local Music/%(title)s.%(ext)s"
164
- ]
165
- return run_yt_dlp(" ".join(command), url)
166
-
167
- def download_soundcloud(url, quality, embed_metadata, embed_thumbnail, split_chapters, bitrate):
168
- command = [
169
- "yt-dlp",
170
- "-f", "bestaudio",
171
- "--extract-audio",
172
- "--audio-format", "mp3",
173
- "--audio-quality", quality,
174
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
175
- ]
176
- if embed_metadata:
177
- command.append("--embed-metadata")
178
- if embed_thumbnail:
179
- command.append("--embed-thumbnail")
180
- if split_chapters:
181
- command.append("--split-chapters")
182
- if bitrate:
183
- command.extend(["--postprocessor-args", f"-b:a {bitrate}k"])
184
- return run_yt_dlp(" ".join(command), url)
185
-
186
- def download_soundcloud_playlist(url, start, end):
187
- command = [
188
- "yt-dlp",
189
- "--playlist-items", f"{start}-{end}",
190
- "-f", "bestaudio",
191
- "--extract-audio",
192
- "--audio-format", "mp3",
193
- "--audio-quality", "0",
194
- "-o", "P:/Local Music/SoundCloud/%(playlist_title)s/%(title)s.%(ext)s"
195
- ]
196
- return run_yt_dlp(" ".join(command), url)
197
-
198
- def download_soundcloud_from_url_list(file_path):
199
- command = [
200
- "yt-dlp",
201
- "-a", file_path,
202
- "-f", "bestaudio",
203
- "--extract-audio",
204
- "--audio-format", "mp3",
205
- "--audio-quality", "0",
206
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
207
- ]
208
- return run_yt_dlp(" ".join(command), "")
209
-
210
- def download_soundcloud_with_speed_limit(url, speed_limit):
211
- command = [
212
- "yt-dlp",
213
- "-f", "bestaudio",
214
- "--extract-audio",
215
- "--audio-format", "mp3",
216
- "--audio-quality", "0",
217
- "--rate-limit", f"{speed_limit}M",
218
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
219
- ]
220
- return run_yt_dlp(" ".join(command), url)
221
-
222
- def download_soundcloud_specific_portion(url, start_time, end_time):
223
- command = [
224
- "yt-dlp",
225
- "-f", "bestaudio",
226
- "--external-downloader", "ffmpeg",
227
- "--external-downloader-args", f"ffmpeg_i:-ss {start_time} -to {end_time}",
228
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
229
- ]
230
- return run_yt_dlp(" ".join(command), url)
231
-
232
- def update_soundcloud_metadata(url):
233
- command = [
234
- "yt-dlp",
235
- "--download-archive", "P:/Local Music/downloaded_soundcloud.txt",
236
- "--skip-download",
237
- "--embed-metadata",
238
- "--embed-thumbnail"
239
- ]
240
- return run_yt_dlp(" ".join(command), url)
241
-
242
- def auto_rename_soundcloud_duplicates(url):
243
- command = [
244
- "yt-dlp",
245
- "-f", "bestaudio",
246
- "--extract-audio",
247
- "--audio-format", "mp3",
248
- "--audio-quality", "0",
249
- "--force-overwrites",
250
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
251
- ]
252
- return run_yt_dlp(" ".join(command), url)
253
-
254
- def download_soundcloud_multiple_files(urls):
255
- command = [
256
- "yt-dlp",
257
- "-f", "bestaudio",
258
- "--extract-audio",
259
- "--audio-format", "mp3",
260
- "--audio-quality", "0",
261
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
262
- ]
263
- return run_yt_dlp(" ".join(command), " ".join(urls))
264
-
265
- def download_soundcloud_opus(url):
266
- command = [
267
- "yt-dlp",
268
- "-f", "bestaudio",
269
- "--extract-audio",
270
- "--audio-format", "opus",
271
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
272
- ]
273
- return run_yt_dlp(" ".join(command), url)
274
-
275
- def download_soundcloud_playlist_with_metadata(url):
276
- command = [
277
- "yt-dlp",
278
- "-f", "bestaudio",
279
- "--extract-audio",
280
- "--audio-format", "mp3",
281
- "--audio-quality", "0",
282
- "--embed-metadata",
283
- "--add-metadata",
284
- "--embed-thumbnail",
285
- "-o", "P:/Local Music/%(playlist_title)s/%(title)s.%(ext)s"
286
- ]
287
- return run_yt_dlp(" ".join(command), url)
288
-
289
- def download_soundcloud_multiple_playlists_with_metadata(urls):
290
- command = [
291
- "yt-dlp",
292
- "-f", "bestaudio",
293
- "--extract-audio",
294
- "--audio-format", "mp3",
295
- "--audio-quality", "0",
296
- "--embed-metadata",
297
- "--add-metadata",
298
- "--embed-thumbnail",
299
- "-o", "P:/Local Music/SoundCloud/%(playlist_title)s/%(title)s.%(ext)s"
300
- ]
301
- return run_yt_dlp(" ".join(command), " ".join(urls))
302
-
303
- def download_soundcloud_playlist_with_specific_range(url, start, end):
304
- command = [
305
- "yt-dlp",
306
- "--playlist-items", f"{start}-{end}",
307
- "-f", "bestaudio",
308
- "--extract-audio",
309
- "--audio-format", "mp3",
310
- "--audio-quality", "0",
311
- "-o", "P:/Local Music/SoundCloud/%(playlist_title)s/%(title)s.%(ext)s"
312
- ]
313
- return run_yt_dlp(" ".join(command), url)
314
-
315
- def download_soundcloud_and_embed_album_art(url):
316
- command = [
317
- "yt-dlp",
318
- "-f", "bestaudio",
319
- "--extract-audio",
320
- "--audio-format", "mp3",
321
- "--audio-quality", "0",
322
- "--embed-thumbnail",
323
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
324
- ]
325
- return run_yt_dlp(" ".join(command), url)
326
-
327
- def download_soundcloud_skip_already_downloaded(url):
328
- command = [
329
- "yt-dlp",
330
- "--download-archive", "P:/Local Music/downloaded_soundcloud.txt",
331
- "-f", "bestaudio",
332
- "--extract-audio",
333
- "--audio-format", "mp3",
334
- "--audio-quality", "0",
335
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
336
- ]
337
- return run_yt_dlp(" ".join(command), url)
338
-
339
- def download_soundcloud_multiple_tracks(urls):
340
- command = [
341
- "yt-dlp",
342
- "-f", "bestaudio",
343
- "--extract-audio",
344
- "--audio-format", "mp3",
345
- "--audio-quality", "0",
346
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
347
- ]
348
- return run_yt_dlp(" ".join(command), " ".join(urls))
349
-
350
- def download_soundcloud_and_split_by_chapters(url):
351
- command = [
352
- "yt-dlp",
353
- "-f", "bestaudio",
354
- "--extract-audio",
355
- "--audio-format", "mp3",
356
- "--audio-quality", "0",
357
- "--split-chapters",
358
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
359
- ]
360
- return run_yt_dlp(" ".join(command), url)
361
-
362
- def download_soundcloud_track_and_extract_specific_portion(url, start_time, end_time):
363
- command = [
364
- "yt-dlp",
365
- "-f", "bestaudio",
366
- "--external-downloader", "ffmpeg",
367
- "--external-downloader-args", f"ffmpeg_i:-ss {start_time} -to {end_time}",
368
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
369
- ]
370
- return run_yt_dlp(" ".join(command), url)
371
-
372
- def update_soundcloud_metadata_of_existing_files(url):
373
- command = [
374
- "yt-dlp",
375
- "--download-archive", "P:/Local Music/downloaded_soundcloud.txt",
376
- "--skip-download",
377
- "--embed-metadata",
378
- "--embed-thumbnail"
379
- ]
380
- return run_yt_dlp(" ".join(command), url)
381
-
382
- def auto_rename_soundcloud_duplicate_files(url):
383
- command = [
384
- "yt-dlp",
385
- "-f", "bestaudio",
386
- "--extract-audio",
387
- "--audio-format", "mp3",
388
- "--audio-quality", "0",
389
- "--force-overwrites",
390
- "-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s"
391
- ]
392
- return run_yt_dlp(" ".join(command), url)
393
-
394
- def download_sound
 
1
  import gradio as gr
2
  import subprocess
3
+ import os
4
+ import tempfile
5
+
6
+ # Function to run yt-dlp commands and return the file path
7
+ def run_yt_dlp(command, url, bitrate=None, start_time=None, end_time=None, playlist_items=None, archive_file=None):
8
+ # Temporary directory to store the downloaded files
9
+ temp_dir = tempfile.mkdtemp()
10
+
11
+ # Base command for yt-dlp
12
+ base_command = ["yt-dlp", "-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "-o", f"{temp_dir}/%(title)s.%(ext)s"]
13
+
14
+ if command == "list_formats":
15
+ base_command = ["yt-dlp", "-F", url]
16
+ elif command == "download_mp3_max_quality":
17
+ base_command.extend(["--postprocessor-args", "-b:a 320k", url])
18
+ elif command == "basic_high_quality_mp3":
19
+ base_command.append(url)
20
+ elif command == "custom_bitrate":
21
+ base_command.extend(["--postprocessor-args", f"-b:a {bitrate}k", url])
22
+ elif command == "add_metadata_tags":
23
+ base_command.extend(["--embed-metadata", url])
24
+ elif command == "download_playlist":
25
+ base_command.append(url)
26
+ elif command == "download_playlist_range":
27
+ base_command.extend(["--playlist-items", playlist_items, url])
28
+ elif command == "download_hq_soundcloud":
29
+ base_command.extend(["-o", f"{temp_dir}/%(uploader)s - %(title)s.%(ext)s", url])
30
+ elif command == "embed_album_art":
31
+ base_command.extend(["--embed-thumbnail", url])
32
+ elif command == "download_opus":
33
+ base_command.extend(["--audio-format", "opus", url])
34
+ elif command == "skip_downloaded_files":
35
+ base_command.extend(["--download-archive", archive_file, url])
36
+ elif command == "download_multiple_files":
37
+ base_command.extend(url.split())
38
+ elif command == "download_split_chapters":
39
+ base_command.extend(["--split-chapters", url])
40
+ elif command == "extract_portion":
41
+ base_command.extend(["-f", "bestvideo+bestaudio", "--external-downloader", "ffmpeg", "--external-downloader-args", f"ffmpeg_i:-ss {start_time} -to {end_time}", url])
42
+ elif command == "update_metadata":
43
+ base_command.extend(["--download-archive", archive_file, "--skip-download", "--embed-metadata", "--embed-thumbnail", url])
44
+ elif command == "auto_rename":
45
+ base_command.extend(["--force-overwrites", url])
46
+ elif command == "download_url_list":
47
+ base_command.extend(["-a", url])
48
+ elif command == "limit_speed":
49
+ base_command.extend(["--rate-limit", "1M", url])
50
+ elif command == "download_vimeo":
51
+ base_command.extend(["-o", f"{temp_dir}/Vimeo/%(uploader)s - %(title)s.%(ext)s", url])
52
+ elif command == "download_facebook":
53
+ base_command.extend(["-o", f"{temp_dir}/Facebook/%(uploader)s - %(title)s.%(ext)s", url])
54
+ elif command == "download_instagram":
55
+ base_command.extend(["-o", f"{temp_dir}/Instagram/%(uploader)s - %(title)s.%(ext)s", url])
56
+ elif command == "download_twitter":
57
+ base_command.extend(["-o", f"{temp_dir}/Twitter/%(uploader)s - %(title)s.%(ext)s", url])
58
+ elif command == "download_tiktok":
59
+ base_command.extend(["-o", f"{temp_dir}/TikTok/%(uploader)s - %(title)s.%(ext)s", url])
60
+ elif command == "download_reddit":
61
+ base_command.extend(["-o", f"{temp_dir}/Reddit/%(uploader)s - %(title)s.%(ext)s", url])
62
+ elif command == "download_dailymotion":
63
+ base_command.extend(["-o", f"{temp_dir}/Dailymotion/%(uploader)s - %(title)s.%(ext)s", url])
64
+ elif command == "download_transcript_text":
65
+ base_command.extend(["--write-auto-subs", "--sub-lang", "en", "--skip-download", url])
66
+ elif command == "download_transcript_markdown":
67
+ base_command.extend(["--write-auto-subs", "--sub-lang", "en", "--skip-download", "--convert-subs", "srt", "-o", f"{temp_dir}/%(title)s.md", url])
68
+ elif command == "download_video_info":
69
+ base_command.extend(["--write-info-json", "--skip-download", "-o", f"{temp_dir}/%(title)s.json", url])
70
+ elif command == "list_formats_no_download":
71
+ base_command = ["yt-dlp", "-F", url]
72
+ elif command == "download_age_restricted":
73
+ base_command.extend(["--username", "YOUR_YOUTUBE_EMAIL", "--password", "YOUR_PASSWORD", "-f", "bestvideo+bestaudio", url])
74
+
75
  try:
76
+ result = subprocess.run(base_command, capture_output=True, text=True)
77
+ if result.returncode != 0:
78
+ return None, result.stderr
79
+ else:
80
+ # Find the downloaded file
81
+ downloaded_files = [f for f in os.listdir(temp_dir) if os.path.isfile(os.path.join(temp_dir, f))]
82
+ if downloaded_files:
83
+ file_path = os.path.join(temp_dir, downloaded_files[0])
84
+ return file_path, result.stdout
85
+ else:
86
+ return None, "No file downloaded."
87
  except Exception as e:
88
+ return None, str(e)
89
+
90
+ # Gradio Interface
91
+ with gr.Blocks() as demo:
92
+ gr.Markdown("# yt-dlp Command Executor")
93
+
94
+ with gr.Row():
95
+ command = gr.Dropdown(choices=[
96
+ "list_formats",
97
+ "download_mp3_max_quality",
98
+ "basic_high_quality_mp3",
99
+ "custom_bitrate",
100
+ "add_metadata_tags",
101
+ "download_playlist",
102
+ "download_playlist_range",
103
+ "download_hq_soundcloud",
104
+ "embed_album_art",
105
+ "download_opus",
106
+ "skip_downloaded_files",
107
+ "download_multiple_files",
108
+ "download_split_chapters",
109
+ "extract_portion",
110
+ "update_metadata",
111
+ "auto_rename",
112
+ "download_url_list",
113
+ "limit_speed",
114
+ "download_vimeo",
115
+ "download_facebook",
116
+ "download_instagram",
117
+ "download_twitter",
118
+ "download_tiktok",
119
+ "download_reddit",
120
+ "download_dailymotion",
121
+ "download_transcript_text",
122
+ "download_transcript_markdown",
123
+ "download_video_info",
124
+ "list_formats_no_download",
125
+ "download_age_restricted"
126
+ ], label="Command")
127
+
128
+ url = gr.Textbox(label="URL", placeholder="Enter the URL here")
129
+
130
+ with gr.Row():
131
+ bitrate = gr.Textbox(label="Bitrate (for custom bitrate)", placeholder="Enter bitrate in kbps, e.g., 192")
132
+ start_time = gr.Textbox(label="Start Time (HH:MM:SS)", placeholder="Enter start time, e.g., 00:01:00")
133
+ end_time = gr.Textbox(label="End Time (HH:MM:SS)", placeholder="Enter end time, e.g., 00:05:00")
134
+ playlist_items = gr.Textbox(label="Playlist Items (e.g., 1-5)", placeholder="Enter range of items, e.g., 1-5")
135
+ archive_file = gr.Textbox(label="Archive File", placeholder="Enter path to archive file, e.g., P:/Local Music/downloaded.txt")
136
+
137
+ execute_button = gr.Button("Execute Command")
138
+ file_output = gr.File(label="Downloaded File")
139
+ output = gr.Textbox(label="Output", lines=10)
140
+
141
+ def execute_and_download(command, url, bitrate, start_time, end_time, playlist_items, archive_file):
142
+ file_path, result = run_yt_dlp(command, url, bitrate, start_time, end_time, playlist_items, archive_file)
143
+ if file_path:
144
+ return file_path, result
145
+ else:
146
+ return None, result
147
+
148
+ execute_button.click(
149
+ fn=execute_and_download,
150
+ inputs=[command, url, bitrate, start_time, end_time, playlist_items, archive_file],
151
+ outputs=[file_output, output]
152
+ )
153
+
154
+ demo.launch()