""" 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. """ import json import os import sys import urllib.parse import urllib.request from pathlib import Path from dotenv import load_dotenv load_dotenv(Path(__file__).resolve().parent / ".env") 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" BASE = f"{'https' if NAS_HTTPS else 'http'}://{NAS_HOST}:{NAS_PORT}" 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 ") sys.exit(1) ok = add_torrent(sys.argv[1]) sys.exit(0 if ok else 1)