Spaces:
Runtime error
Runtime error
File size: 7,314 Bytes
9a5da81 ea4a110 2d7a52d ea4a110 499b696 6f71a51 ea4a110 6f71a51 ea4a110 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import gradio as gr
import subprocess
import os
def run_ytdlp_command(command_type, url_or_id, quality, bitrate, start_time, end_time, playlist_range, output_dir="downloads", archive_file="", sub_lang="en", additional_urls="", speed_limit="", cookies_browser=None):
"""Runs the yt-dlp command based on the selected command type and parameters."""
# sanitize output_dir to prevent arbitrary code execution
output_dir = os.path.abspath(output_dir)
# Create output directory if it doesn't exist
os.makedirs(output_dir, exist_ok=True)
# Basic command structure
base_command = ["yt-dlp", "-o", f"{output_dir}/%(title)s.%(ext)s"]
# Add archive file if provided
if archive_file:
base_command.extend(["--download-archive", archive_file])
# Add cookies from browser if selected
if cookies_browser and cookies_browser != "None":
base_command.extend(["--cookies-from-browser", cookies_browser])
# Construct command based on type
if command_type == "List Formats":
command = ["yt-dlp", "-F", url_or_id]
elif command_type == "Download MP3 (Max Quality)":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "--postprocessor-args", "ffmpeg_a:-b:a 320k", url_or_id] # Explicit post-processor
elif command_type == "Basic MP3 Download":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", quality, url_or_id]
elif command_type == "Download with Custom Bitrate":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--postprocessor-args", f"ffmpeg_a:-b:a {bitrate}k", url_or_id] # Explicit post-processor
elif command_type == "Download with Metadata":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "--embed-metadata", url_or_id]
elif command_type == "Download Playlist":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "-o", f"{output_dir}/%(playlist_title)s/%(title)s.%(ext)s", url_or_id]
elif command_type == "Download Playlist (Range)":
command = base_command + ["--playlist-items", playlist_range, "-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "-o", f"{output_dir}/%(playlist_title)s/%(title)s.%(ext)s", url_or_id]
elif command_type == "Download with Album Art":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--embed-thumbnail", "--audio-quality", "0", url_or_id]
elif command_type == "Download Opus":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "opus", url_or_id]
elif command_type == "Skip Downloaded":
command = base_command + ["--download-archive", archive_file, "-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", url_or_id]
elif command_type == "Download Multiple URLs":
if additional_urls:
urls = [url_or_id] + additional_urls.split(",")
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "--add-metadata", "--embed-thumbnail", "--write-description", "--postprocessor-args", "ffmpeg_a:-b:a 320k", *urls] # Explicit post-processor
else:
return "Please provide additional URLs separated by commas."
elif command_type == "Download with Chapters":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "--split-chapters", url_or_id]
elif command_type == "Extract Portion":
command = base_command + ["-f", "bestvideo+bestaudio", "--external-downloader", "ffmpeg", "--external-downloader-args", f"ffmpeg_i:-ss {start_time} -to {end_time}", url_or_id]
elif command_type == "Update Metadata":
command = ["yt-dlp", "--download-archive", archive_file, "--skip-download", "--embed-metadata", "--embed-thumbnail", "--write-description", url_or_id]
elif command_type == "Rename Duplicate":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "--force-overwrites", url_or_id]
elif command_type == "Download from URL List":
command = ["yt-dlp", "-a", url_or_id, "-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "-o", f"{output_dir}/%(title)s.%(ext)s"]
elif command_type == "Limit Download Speed":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "--rate-limit", speed_limit, url_or_id]
elif command_type == "Download Transcript (Text)":
command = ["yt-dlp", "--write-auto-subs", "--sub-lang", sub_lang, "--skip-download", "-o", f"{output_dir}/%(title)s.%(ext)s", url_or_id]
elif command_type == "Download Transcript (Markdown)":
command = ["yt-dlp", "--write-auto-subs", "--sub-lang", sub_lang, "--skip-download", "--convert-subs", "srt", "-o", f"{output_dir}/%(title)s.md", url_or_id]
elif command_type == "Download Video Info (JSON)":
command = ["yt-dlp", "--write-info-json", "--skip-download", "-o", f"{output_dir}/%(title)s.json", url_or_id]
# SoundCloud Commands
elif command_type == "SoundCloud - Download MP3 (HQ)":
command = base_command + ["-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "-o", f"{output_dir}/SoundCloud/%(uploader)s - %(title)s.%(ext)s", url_or_id]
# ... (rest of the SoundCloud commands - apply the same fixes as above if they use postprocessor-args)
else:
return "Invalid command type selected."
try:
# Execute command and capture output
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
# Decode output to string
stdout = stdout.decode("utf-8")
stderr = stderr.decode("utf-8")
if process.returncode != 0:
return f"Error executing command:\n{stderr}"
else:
return f"Command executed successfully:\n{stdout}"
except Exception as e:
return f"An error occurred: {e}"
# Define Gradio interface
with gr.Blocks() as demo:
gr.Markdown("# YT-DLP Gradio Interface")
with gr.Row():
with gr.Column():
# ... (other input elements)
cookies_browser = gr.Dropdown(
choices=["None", "chrome", "firefox", "edge", "opera", "chromium"], # Add more if needed
value="None",
label="Cookies from Browser"
)
submit_btn = gr.Button("Run Command")
with gr.Column():
output_text = gr.Textbox(label="Output", lines=10)
submit_btn.click(
run_ytdlp_command,
inputs=[command_type, url_or_id, quality, bitrate, start_time, end_time, playlist_range, output_dir, archive_file, sub_lang, additional_urls, speed_limit, cookies_browser], # Add cookies_browser to inputs
outputs=output_text
)
if __name__ == "__main__":
demo.launch() |