Spaces:
Runtime error
Runtime error
| 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() |