Files
YTDownloader/app/main.py.bak

88 lines
3.1 KiB
Python

from flask import Flask, render_template, request, send_file
import subprocess
import os
import uuid
import shutil
app = Flask(__name__)
BASE_DOWNLOADS_DIR = "downloads"
os.makedirs(BASE_DOWNLOADS_DIR, exist_ok=True)
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "POST":
url = request.form.get("url")
mode = request.form.get("mode") # 'audio' o 'video'
download_type = request.form.get("type") # 'single' o 'playlist'
if not url:
return render_template("index.html", error="URL obligatoria")
# Modo single o playlist
if download_type == "single":
unique_id = str(uuid.uuid4())
filename_template = f"{unique_id}.%(ext)s"
output_path = os.path.join(BASE_DOWNLOADS_DIR, filename_template)
cmd = ["yt-dlp", "-o", output_path]
if mode == "audio":
cmd += ["-x", "--audio-format", "mp3"]
cmd.append(url)
try:
subprocess.run(cmd, check=True)
# Encuentra el archivo resultante
downloaded_file = None
for file in os.listdir(BASE_DOWNLOADS_DIR):
if file.startswith(unique_id):
downloaded_file = os.path.join(BASE_DOWNLOADS_DIR, file)
break
if not downloaded_file:
return render_template("index.html", error="No se encontró el archivo descargado.")
# Enviar al navegador y luego borrar
return send_file(downloaded_file, as_attachment=True, download_name=os.path.basename(downloaded_file), mimetype='application/octet-stream')
except subprocess.CalledProcessError:
return render_template("index.html", error="Error al descargar el archivo.")
elif download_type == "playlist":
folder_id = str(uuid.uuid4())
folder_path = os.path.join(BASE_DOWNLOADS_DIR, folder_id)
os.makedirs(folder_path, exist_ok=True)
output_path = os.path.join(folder_path, "%(title)s.%(ext)s")
cmd = ["yt-dlp", "-o", output_path]
if mode == "audio":
cmd += ["-x", "--audio-format", "mp3"]
cmd.append(url)
try:
subprocess.run(cmd, check=True)
# Comprimir en ZIP
zip_path = shutil.make_archive(folder_path, 'zip', folder_path)
# Enviar al navegador
# return send_file(zip_path, as_attachment=True, download_name="descarga_playlist.zip", mimetype='application/zip')
return send_file(zip_path, as_attachment=True, download_name="%(playlist_title).zip", mimetype='application/zip')
except subprocess.CalledProcessError:
return render_template("index.html", error="Error al descargar la lista.")
else:
return render_template("index.html", error="Tipo de descarga no válido.")
return render_template("index.html")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)