88 lines
3.1 KiB
Python
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)
|
|
|