Generates optimized search terms from pending requests & active subscriptions. Mirrors search_generator.py logic.
π₯ Download Queue
Torrent client status & manual download. Requires Jackett/Prowlarr + Transmission/aria2.
Jackett / Prowlarr
Configure in Settings
Transmission / aria2
Configure in Settings
Manual Magnet Link
No active downloads. Run python3 downloader.py from terminal.
π Library Scanner
Scan your media library for quality analysis, orphan files, duplicates, and Apple library comparison. Mirrors plex_scanner.py.
Scanning...
π Quality Breakdown
π Orphan Files (Bad Naming)
π Duplicate Files
π Apple Library Comparison
π‘ Suggestions
βοΈ Configuration
Edit the web UI's local config. To update the Python backend, edit config.json directly.
π Sync with CLI
The web UI uses IndexedDB for standalone operation. The Python CLI uses SQLite (media.db). Use these tools to sync between them.
Export from Python SQLite β Web UI: python3 -c "import sqlite3,json;c=sqlite3.connect('media.db');print(json.dumps({'requests':[dict(zip(['id','type','title','year','status','requested_at','imported_at','file_path','notes'],r)) for r in c.execute('SELECT * FROM requests')],'subscriptions':[dict(zip(['id','show_name','active','subscribed_at','last_checked','notes'],r)) for r in c.execute('SELECT * FROM subscriptions')],'episodes':[dict(zip(['id','show_name','season','episode','file_path','imported_at','file_hash'],r)) for r in c.execute('SELECT * FROM episodes')],'imports':[dict(zip(['id','source_path','dest_path','file_hash','imported_at','file_size'],r)) for r in c.execute('SELECT * FROM imports')]}))" > export.json
Import Web UI data β Python SQLite: python3 -c "import sqlite3,json;d=json.load(open('export.json'));c=sqlite3.connect('media.db');[c.execute('INSERT OR IGNORE INTO requests (type,title,year,status,requested_at) VALUES (?,?,?,?,?)',(r['type'],r['title'],r.get('year'),r['status'],r.get('requested_at',''))) for r in d.get('requests',[])];c.commit()"