ytbmp4 / app.py
cngsm's picture
Upload 2 files
128589b verified
import gradio as gr
import os
import subprocess
import random
import time
DOWNLOAD_DIR = os.path.join(os.getcwd(), "downloads")
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
]
def get_random_user_agent():
return random.choice(USER_AGENTS)
def run_command(command):
try:
result = subprocess.run(
command,
capture_output=True,
text=True,
timeout=600,
encoding='utf-8',
errors='ignore'
)
if result.returncode == 0:
return True, result.stdout
else:
return False, result.stderr
except subprocess.TimeoutExpired:
return False, "⏰ Timeout: demorou muito."
except Exception as e:
return False, f"Erro: {str(e)}"
def download_media(url, tipo="audio", qualidade="best", formato="mp3"):
if not url.strip():
return "❌ URL inválida!", None
filepath = os.path.join(DOWNLOAD_DIR, "%(title)s.%(ext)s")
if tipo == "audio":
cmd = [
"yt-dlp",
"--user-agent", get_random_user_agent(),
"--extract-audio", "-x",
"--audio-format", formato,
"--audio-quality", qualidade,
"-o", filepath,
url
]
else:
format_string = 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'
if qualidade != "best":
format_string = f'bestvideo[height<=?{qualidade}][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'
cmd = [
"yt-dlp",
"--user-agent", get_random_user_agent(),
"-f", format_string,
"--merge-output-format", "mp4",
"-o", filepath,
url
]
ok, log = run_command(cmd)
if ok:
files = sorted(os.listdir(DOWNLOAD_DIR), key=lambda x: os.path.getctime(os.path.join(DOWNLOAD_DIR, x)))
last_file = os.path.join(DOWNLOAD_DIR, files[-1]) if files else None
return f"✅ Download concluído!\n{log}", last_file
else:
return f"❌ Erro:\n{log}", None
def app_fn(url, tipo, qualidade, formato):
msg, arquivo = download_media(url, tipo, qualidade, formato)
return msg, arquivo
with gr.Blocks() as demo:
gr.Markdown("# 🚀 YouTube Downloader (Vídeo & Áudio)")
url = gr.Textbox(label="Cole o link do YouTube", placeholder="https://youtube.com/...")
tipo = gr.Radio(["audio", "video"], value="audio", label="Tipo de Download")
formato = gr.Dropdown(["mp3", "m4a", "wav", "flac"], value="mp3", label="Formato de Áudio")
qualidade = gr.Dropdown(["best", "0", "5", "9", "1080", "720", "480"], value="best", label="Qualidade")
btn = gr.Button("📥 Baixar")
log = gr.Textbox(label="Log", lines=10)
file_out = gr.File(label="Arquivo Gerado")
btn.click(app_fn, inputs=[url, tipo, qualidade, formato], outputs=[log, file_out])
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)