|
import gradio as gr |
|
from yt_dlp import YoutubeDL |
|
import os |
|
from pathlib import Path |
|
import tempfile |
|
import shutil |
|
from pathlib import Path |
|
|
|
def get_cookies(): |
|
"""Get or create cookie file path""" |
|
with open('firefox-cookies.txt', 'r+') as fh: |
|
cookies = fh.read() |
|
return cookies |
|
|
|
def get_cookies_path(): |
|
"""Get cookie file path""" |
|
return "./firefox-cookies.txt" |
|
|
|
def download_for_browser(url, mode='audio', quality='high'): |
|
if not url: |
|
return None, "Please enter a valid URL" |
|
|
|
|
|
temp_dir = Path(tempfile.mkdtemp()) |
|
cookiefile = get_cookies_path() |
|
|
|
try: |
|
|
|
opts = { |
|
'format': 'bestaudio/best' if mode == 'audio' else 'bestvideo+bestaudio/best', |
|
'outtmpl': str(temp_dir / '%(title)s.%(ext)s'), |
|
'restrictfilenames': True, |
|
'windowsfilenames': True, |
|
'quiet': True, |
|
'no_warnings': True |
|
} |
|
|
|
|
|
if mode == 'audio': |
|
opts.update({ |
|
'postprocessors': [{ |
|
'key': 'FFmpegExtractAudio', |
|
'preferredcodec': 'mp3', |
|
'preferredquality': '320' if quality == 'high' else '192', |
|
}], |
|
'prefer_ffmpeg': True, |
|
'keepvideo': False |
|
}) |
|
else: |
|
opts.update({ |
|
'format': 'bestvideo+bestaudio/best' if quality == 'high' else 'best[height<=720]', |
|
'merge_output_format': 'mp4' |
|
}) |
|
|
|
|
|
opts["cookiefile"] = cookiefile |
|
|
|
|
|
with YoutubeDL(opts) as ydl: |
|
info = ydl.extract_info(url, download=True) |
|
|
|
|
|
files = list(temp_dir.glob('*')) |
|
if not files: |
|
return None, "Download failed - no files found" |
|
|
|
download_file = files[0] |
|
if not download_file.exists(): |
|
return None, f"File not found after download: {download_file.name}" |
|
|
|
|
|
return str(download_file), f"Successfully converted: {download_file.name}" |
|
|
|
except Exception as e: |
|
if temp_dir.exists(): |
|
shutil.rmtree(temp_dir) |
|
return None, f"Error during download: {str(e)}" |
|
|
|
def create_browser_ui(): |
|
with gr.Blocks(title="YouTube Downloader", theme=gr.themes.Soft()) as demo: |
|
gr.Markdown("## YouTube Downloader") |
|
|
|
with gr.Row(): |
|
url_input = gr.Textbox( |
|
label="YouTube URL", |
|
placeholder="https://youtube.com/watch?v=...", |
|
scale=2 |
|
) |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
mode_input = gr.Radio( |
|
choices=["audio", "video"], |
|
value="audio", |
|
label="Format" |
|
) |
|
quality_input = gr.Radio( |
|
choices=["high", "medium"], |
|
value="high", |
|
label="Quality" |
|
) |
|
|
|
download_button = gr.Button("Convert", variant="primary") |
|
|
|
with gr.Column(scale=2): |
|
status_text = gr.Textbox(label="Converting Status", interactive=False) |
|
output_file = gr.File(label="Download to your device ...") |
|
|
|
download_button.click( |
|
fn=download_for_browser, |
|
inputs=[url_input, mode_input, quality_input], |
|
outputs=[output_file, status_text] |
|
) |
|
|
|
return demo |
|
|
|
demo = create_browser_ui() |
|
demo.launch( |
|
share=False, |
|
debug=True, |
|
show_error=True |
|
) |