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)