Spaces:
Sleeping
Sleeping
import gradio as gr | |
import yt_dlp | |
import os | |
import tempfile | |
from glob import glob | |
def download_media(urls, output_format, audio_quality, custom_bitrate, embed_metadata, embed_thumbnail, write_description): | |
# Create a temporary directory to store downloads | |
temp_dir = tempfile.mkdtemp() | |
output_template = os.path.join(temp_dir, '%(title)s.%(ext)s') | |
# Prepare the options | |
ydl_opts = { | |
'outtmpl': output_template, | |
'format': 'bestaudio/best', | |
'postprocessors': [], | |
'cookiesfrombrowser': ('edge',), | |
} | |
# Set format options | |
if output_format in ['mp3', 'opus']: | |
extract_audio_postprocessor = { | |
'key': 'FFmpegExtractAudio', | |
'preferredcodec': output_format, | |
} | |
# Set postprocessor args | |
if audio_quality == 'Best': | |
extract_audio_postprocessor['preferredquality'] = '0' # Best quality | |
elif audio_quality == 'Custom' and custom_bitrate: | |
extract_audio_postprocessor['preferredquality'] = '5' # Default value | |
extract_audio_postprocessor['postprocessor_args'] = ['-b:a', custom_bitrate] | |
ydl_opts['postprocessors'].append(extract_audio_postprocessor) | |
else: | |
ydl_opts['format'] = 'bestvideo+bestaudio/best' | |
# Additional options | |
if embed_metadata: | |
ydl_opts['addmetadata'] = True | |
ydl_opts['postprocessors'].append({'key': 'FFmpegMetadata'}) | |
if embed_thumbnail: | |
ydl_opts['writethumbnail'] = True | |
ydl_opts['postprocessors'].append({'key': 'EmbedThumbnail'}) | |
if write_description: | |
ydl_opts['writedescription'] = True | |
# Process URLs | |
url_list = urls.strip().split() | |
with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
ydl.download(url_list) | |
# Collect output files | |
downloaded_files = glob(os.path.join(temp_dir, '*')) | |
# Return the list of file paths for download | |
return downloaded_files | |
def main(): | |
with gr.Blocks() as demo: | |
gr.Markdown("# YT-DLP Gradio Interface") | |
with gr.Row(): | |
url_input = gr.Textbox(label="Video URL(s)", placeholder="Enter one or more URLs separated by space or newline") | |
with gr.Row(): | |
output_format = gr.Dropdown(['mp3', 'opus', 'bestvideo+bestaudio'], label="Output Format", value='mp3') | |
audio_quality = gr.Dropdown(['Best', 'Custom'], label="Audio Quality", value='Best') | |
custom_bitrate = gr.Textbox(label="Custom Bitrate (e.g., 192k)", visible=False) | |
with gr.Row(): | |
embed_metadata = gr.Checkbox(label="Embed Metadata") | |
embed_thumbnail = gr.Checkbox(label="Embed Thumbnail") | |
write_description = gr.Checkbox(label="Write Description") | |
start_button = gr.Button("Start Download") | |
output_files = gr.Files(label="Downloaded Files") | |
def show_custom_bitrate(audio_quality): | |
if audio_quality == 'Custom': | |
return gr.update(visible=True) | |
else: | |
return gr.update(visible=False) | |
audio_quality.change(show_custom_bitrate, inputs=audio_quality, outputs=custom_bitrate) | |
start_button.click(download_media, | |
inputs=[url_input, output_format, audio_quality, custom_bitrate, embed_metadata, embed_thumbnail, write_description], | |
outputs=output_files) | |
demo.launch() | |
if __name__ == "__main__": | |
main() |