#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ radarr_fallback.py - moteur hybride pour push Radarr Version 1.0 ----------------------------------------------- Analyse un .torrent (lecture bencode), enregistre les infos dans une base SQLite locale, et génère un JSON compatible avec l'API Radarr (pour release/push). """ import os import sys import json import time import hashlib import sqlite3 import datetime import bencodepy DB_DEFAULT = "/scripts/sqlites/autobrr_torrents.db" LOG_FILE = "/scripts/autobrr/log/radarr_fallback.log" def log(msg): ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") with open(LOG_FILE, "a", encoding="utf-8") as f: f.write(f"[{ts}] {msg}\n") def init_db(db_path): os.makedirs(os.path.dirname(db_path), exist_ok=True) conn = sqlite3.connect(db_path) conn.execute( """CREATE TABLE IF NOT EXISTS torrents ( id INTEGER PRIMARY KEY AUTOINCREMENT, infohash TEXT UNIQUE, release_name TEXT, season INTEGER, episode INTEGER, resolution TEXT, indexer TEXT, download_url TEXT, size INTEGER, info_url TEXT, last_seen TEXT )""" ) conn.commit() return conn def parse_torrent_info(torrent_path): """Extrait le hash info et quelques infos de base du .torrent""" try: with open(torrent_path, "rb") as f: data = bencodepy.decode(f.read()) info_raw = bencodepy.encode(data[b"info"]) infohash = hashlib.sha1(info_raw).hexdigest() return infohash except Exception as e: log(f"[WARN] Impossible de parser {torrent_path}: {e}") return None def main(): # Arguments CLI args = sys.argv[1:] if "--torrent-file" not in args or "--release-name" not in args: print("Usage: radarr_fallback.py --torrent-file --release-name ", file=sys.stderr) sys.exit(1) arg_dict = {args[i]: args[i + 1] for i in range(0, len(args) - 1, 2)} db_path = arg_dict.get("--db", DB_DEFAULT) torrent_path = arg_dict.get("--torrent-file") torrent_url = arg_dict.get("--torrent-url", "") release_name = arg_dict.get("--release-name") indexer = arg_dict.get("--indexer", "autobrr") size = int(arg_dict.get("--size", "0")) info_url = arg_dict.get("--info-url", "") log(f"[RUN] Fallback Radarr → Analyse {release_name}") conn = init_db(db_path) infohash = parse_torrent_info(torrent_path) last_seen = datetime.datetime.utcnow().isoformat() conn.execute( """INSERT OR REPLACE INTO torrents (infohash, release_name, season, episode, resolution, indexer, download_url, size, info_url, last_seen) VALUES (?, ?, 0, 0, '', ?, ?, ?, ?, ?)""", (infohash, release_name, indexer, torrent_url, size, info_url, last_seen), ) conn.commit() payload = { "title": release_name, "downloadUrl": torrent_url, "protocol": "torrent", "indexer": indexer, "size": size, "publishDate": datetime.datetime.utcnow().isoformat() + "Z", "guid": f"torrent:{infohash or release_name}", } print(json.dumps(payload, ensure_ascii=False)) log(f"[OK ] JSON généré pour {release_name}") conn.close() if __name__ == "__main__": main()