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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +387 -126
app.py CHANGED
@@ -1,133 +1,394 @@
1
  import gradio as gr
2
  import subprocess
3
- import os
4
-
5
- # Function to run yt-dlp commands
6
- def run_yt_dlp(command, url, output_path, bitrate=None, start_time=None, end_time=None, playlist_items=None, archive_file=None):
7
- base_command = ["yt-dlp", "-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "-o", output_path]
8
-
9
- if command == "list_formats":
10
- base_command = ["yt-dlp", "-F", url]
11
- elif command == "download_mp3_max_quality":
12
- base_command.extend(["--postprocessor-args", "-b:a 320k", url])
13
- elif command == "basic_high_quality_mp3":
14
- base_command.append(url)
15
- elif command == "custom_bitrate":
16
- base_command.extend(["--postprocessor-args", f"-b:a {bitrate}k", url])
17
- elif command == "add_metadata_tags":
18
- base_command.extend(["--embed-metadata", url])
19
- elif command == "download_playlist":
20
- base_command.append(url)
21
- elif command == "download_playlist_range":
22
- base_command.extend(["--playlist-items", playlist_items, url])
23
- elif command == "download_hq_soundcloud":
24
- base_command.extend(["-o", "P:/Local Music/SoundCloud/%(uploader)s - %(title)s.%(ext)s", url])
25
- elif command == "embed_album_art":
26
- base_command.extend(["--embed-thumbnail", url])
27
- elif command == "download_opus":
28
- base_command.extend(["--audio-format", "opus", url])
29
- elif command == "skip_downloaded_files":
30
- base_command.extend(["--download-archive", archive_file, url])
31
- elif command == "download_multiple_files":
32
- base_command.extend(url.split())
33
- elif command == "download_split_chapters":
34
- base_command.extend(["--split-chapters", url])
35
- elif command == "extract_portion":
36
- base_command.extend(["-f", "bestvideo+bestaudio", "--external-downloader", "ffmpeg", "--external-downloader-args", f"ffmpeg_i:-ss {start_time} -to {end_time}", url])
37
- elif command == "update_metadata":
38
- base_command.extend(["--download-archive", archive_file, "--skip-download", "--embed-metadata", "--embed-thumbnail", url])
39
- elif command == "auto_rename":
40
- base_command.extend(["--force-overwrites", url])
41
- elif command == "download_url_list":
42
- base_command.extend(["-a", url])
43
- elif command == "limit_speed":
44
- base_command.extend(["--rate-limit", "1M", url])
45
- elif command == "download_vimeo":
46
- base_command.extend(["-o", "P:/Local Music/Vimeo/%(uploader)s - %(title)s.%(ext)s", url])
47
- elif command == "download_facebook":
48
- base_command.extend(["-o", "P:/Local Music/Facebook/%(uploader)s - %(title)s.%(ext)s", url])
49
- elif command == "download_instagram":
50
- base_command.extend(["-o", "P:/Local Music/Instagram/%(uploader)s - %(title)s.%(ext)s", url])
51
- elif command == "download_twitter":
52
- base_command.extend(["-o", "P:/Local Music/Twitter/%(uploader)s - %(title)s.%(ext)s", url])
53
- elif command == "download_tiktok":
54
- base_command.extend(["-o", "P:/Local Music/TikTok/%(uploader)s - %(title)s.%(ext)s", url])
55
- elif command == "download_reddit":
56
- base_command.extend(["-o", "P:/Local Music/Reddit/%(uploader)s - %(title)s.%(ext)s", url])
57
- elif command == "download_dailymotion":
58
- base_command.extend(["-o", "P:/Local Music/Dailymotion/%(uploader)s - %(title)s.%(ext)s", url])
59
- elif command == "download_transcript_text":
60
- base_command.extend(["--write-auto-subs", "--sub-lang", "en", "--skip-download", url])
61
- elif command == "download_transcript_markdown":
62
- base_command.extend(["--write-auto-subs", "--sub-lang", "en", "--skip-download", "--convert-subs", "srt", "-o", "P:/Local Music/%(title)s.md", url])
63
- elif command == "download_video_info":
64
- base_command.extend(["--write-info-json", "--skip-download", "-o", "P:/Local Music/%(title)s.json", url])
65
- elif command == "list_formats_no_download":
66
- base_command = ["yt-dlp", "-F", url]
67
- elif command == "download_age_restricted":
68
- base_command.extend(["--username", "YOUR_YOUTUBE_EMAIL", "--password", "YOUR_PASSWORD", "-f", "bestvideo+bestaudio", url])
69
-
70
  try:
71
- result = subprocess.run(base_command, capture_output=True, text=True)
72
  return result.stdout
73
  except Exception as e:
74
  return str(e)
75
 
76
- # Gradio Interface
77
- with gr.Blocks() as demo:
78
- gr.Markdown("# yt-dlp Command Executor")
79
-
80
- with gr.Row():
81
- command = gr.Dropdown(choices=[
82
- "list_formats",
83
- "download_mp3_max_quality",
84
- "basic_high_quality_mp3",
85
- "custom_bitrate",
86
- "add_metadata_tags",
87
- "download_playlist",
88
- "download_playlist_range",
89
- "download_hq_soundcloud",
90
- "embed_album_art",
91
- "download_opus",
92
- "skip_downloaded_files",
93
- "download_multiple_files",
94
- "download_split_chapters",
95
- "extract_portion",
96
- "update_metadata",
97
- "auto_rename",
98
- "download_url_list",
99
- "limit_speed",
100
- "download_vimeo",
101
- "download_facebook",
102
- "download_instagram",
103
- "download_twitter",
104
- "download_tiktok",
105
- "download_reddit",
106
- "download_dailymotion",
107
- "download_transcript_text",
108
- "download_transcript_markdown",
109
- "download_video_info",
110
- "list_formats_no_download",
111
- "download_age_restricted"
112
- ], label="Command")
113
-
114
- url = gr.Textbox(label="URL", placeholder="Enter the URL here")
115
-
116
- with gr.Row():
117
- output_path = gr.Textbox(label="Output Path", placeholder="Enter the output path here")
118
- bitrate = gr.Textbox(label="Bitrate (for custom bitrate)", placeholder="Enter bitrate in kbps, e.g., 192")
119
- start_time = gr.Textbox(label="Start Time (HH:MM:SS)", placeholder="Enter start time, e.g., 00:01:00")
120
- end_time = gr.Textbox(label="End Time (HH:MM:SS)", placeholder="Enter end time, e.g., 00:05:00")
121
- playlist_items = gr.Textbox(label="Playlist Items (e.g., 1-5)", placeholder="Enter range of items, e.g., 1-5")
122
- archive_file = gr.Textbox(label="Archive File", placeholder="Enter path to archive file, e.g., P:/Local Music/downloaded.txt")
123
-
124
- execute_button = gr.Button("Execute Command")
125
- output = gr.Textbox(label="Output", lines=10)
126
-
127
- execute_button.click(
128
- fn=run_yt_dlp,
129
- inputs=[command, url, output_path, bitrate, start_time, end_time, playlist_items, archive_file],
130
- outputs=output
131
- )
132
-
133
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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