03-ago: [videoclub] descarga a NAS Synology via Download Station + comando 'descargar' en pi_bot (deploy en Pi)

This commit is contained in:
juanjo
2026-08-03 23:35:33 +02:00
parent c2caae0ba7
commit f452ece724
5 changed files with 178 additions and 76 deletions

View File

@@ -1,86 +1,27 @@
"""
nas_dl.py — Anade descargas al NAS Synology via API de Download Station.
nas_dl.py — Carga el modulo compartido vigilancia/nas_dl.py
(anade descargas al NAS Synology via API de Download Station).
Login: POST /webapi/auth.cgi (SYNO.API.Auth, version 6, session DownloadStation)
Crear: POST /webapi/DownloadStation/task.cgi (SYNO.DownloadStation.Task, create)
La URI puede ser un enlace HTTP directo (p. ej. enlace de RealDebrid),
un magnet o una URL de fichero .torrent.
Las credenciales NAS se leen del .env de vigilancia/ o, como respaldo,
del .env de videoclub/.
"""
import json
import os
import importlib.util
import sys
import urllib.parse
import urllib.request
from pathlib import Path
from dotenv import load_dotenv
BASE = Path(__file__).resolve().parent
VIGILANCIA = BASE.parent / "vigilancia"
REAL = VIGILANCIA / "nas_dl.py"
load_dotenv(Path(__file__).resolve().parent / ".env")
if not REAL.exists():
raise ImportError("No se encontro vigilancia/nas_dl.py")
NAS_HOST = os.getenv("NAS_HOST", "192.168.50.31").strip().rstrip("/")
NAS_PORT = os.getenv("NAS_PORT", "5000").strip()
NAS_USER = os.getenv("NAS_USER", "").strip()
NAS_PASS = os.getenv("NAS_PASS", "").strip()
NAS_HTTPS = os.getenv("NAS_HTTPS", "0").strip() == "1"
_spec = importlib.util.spec_from_file_location("vigilancia_nas_dl", REAL)
_vig_nas = importlib.util.module_from_spec(_spec)
sys.modules["vigilancia_nas_dl"] = _vig_nas
_spec.loader.exec_module(_vig_nas)
BASE = f"{'https' if NAS_HTTPS else 'http'}://{NAS_HOST}:{NAS_PORT}"
add_torrent = _vig_nas.add_torrent
login = _vig_nas.login
def _api(path, params, session=None):
data = urllib.parse.urlencode(params).encode()
headers = {"Content-Type": "application/x-www-form-urlencoded"}
if session:
headers["Cookie"] = session
req = urllib.request.Request(f"{BASE}{path}", data=data, headers=headers)
with urllib.request.urlopen(req, timeout=20) as r:
return json.loads(r.read().decode())
def login():
"""Devuelve la cookie de sesion DownloadStation o None."""
if not NAS_USER or not NAS_PASS:
print("[NAS] Faltan NAS_USER/NAS_PASS en .env")
return None
r = _api("/webapi/auth.cgi", {
"api": "SYNO.API.Auth",
"version": "6",
"method": "login",
"account": NAS_USER,
"passwd": NAS_PASS,
"session": "DownloadStation",
"format": "cookie",
})
if r.get("success"):
# la cookie viene en Set-Cookie; la reconstruimos con el sid devuelto
sid = r.get("data", {}).get("sid")
return f"sid={sid}" if sid else None
print(f"[NAS] Login fallido: {r.get('error')}")
return None
def add_torrent(uri, session=None):
"""Anade una URI (http/magnet/.torrent) a Download Station."""
if not session:
session = login()
if not session:
return False
r = _api("/webapi/DownloadStation/task.cgi", {
"api": "SYNO.DownloadStation.Task",
"version": "3",
"method": "create",
"uri": uri,
}, session=session)
if r.get("success"):
print(f"[NAS] Tarea anadida: {uri[:80]}")
return True
print(f"[NAS] Error al anadir tarea: {r.get('error')}")
return False
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Uso: python nas_dl.py <uri|magnet|enlace>")
sys.exit(1)
ok = add_torrent(sys.argv[1])
sys.exit(0 if ok else 1)
__all__ = ["add_torrent", "login"]