VIDEO — Source of Truth
Films + TV on Studio. Updated Sun 27 Sep 2026 08:05 GST. This file wins over every other video/Transmission doc. Anything not here is history (TRANSMISSION-ISSUES.md, docs/).
Rule: any change to video = update this file in the same session.
1. Goal
|
Target |
Measured in |
| Films into Plex |
70/day (490/week) |
Plex section 6 addedAt |
| Consistency |
no gap >6h without a film landing |
video-eval films_landing |
| New TV episodes |
in Plex within 24h of airing (monitored shows) |
Sonarr calendar vs library |
| Back-catalogue TV |
no target — "TV can stall, except new episodes" (Anthony, 25 Sep) |
— |
| Baseline (20–26 Sep) |
films 77/day avg (46–114) · episodes 154/day avg (9–368) |
Plex |
2. The system — three parts, nothing else
| Part |
What |
Where (Studio) |
Every |
| Config of record |
every setting that matters, one file |
~/video/video-config.json (vault: StudioServer/video/) |
— |
| Controller |
the ONLY writer to Transmission + the *arr settings in the config |
~/video/video_controller.py · launchd com.user.video-controller · log ~/video/controller.log |
60s (heavy steps every 5 min) |
| Monitor |
the ONLY video monitor: 10 checks, one auto-fix each, WhatsApp, 08:00 scorecard |
~/video/video_eval.py · com.user.video-eval · log ~/video/eval.log · incidents ~/video/incidents/ |
60s |
Readers that stay (write nothing): famflix-monitor (tr-metrics.db), tr-truth-collector, dashboards. |
|
|
|
3. Controller algorithm
- Drift (Transmission) — session settings = config. Anything different is put back and logged
DRIFT key: was X -> set Y.
- Trackers — every new torrent gets 8 live trackers; trackers whose host doesn't resolve are stripped; reannounce.
- Drift (*arr) — Transmission client enabled + remove-completed on; quality upgrades off (except Radarr profile 7, IMAX 4K); Prowlarr app profile min seeders 25 (Prowlarr full-sync overwrote 25→1 — the source of the 13 Sep drift); Radarr collections on missing roots →
/data2/media/movies.
- No upgrades — queue items for a film/episode already on disk are removed (no blocklist, no re-search).
- Evict dead — downloading with 0 progress for 6h, or no activity for 24h → removed through the arr queue with blocklist, so the arr grabs a different release. Orphans (no arr owner) removed directly. Never
torrent-stop* (24 Sep: Radarr marks it failed → 159 lost).
- Priority — films + episodes aired ≤14 days: high bandwidth + top of queue. Back-catalogue normal.
- Admission — backlog (incomplete torrents) >150 → *arr RSS sync off; <80 → back on (Sonarr 15 min, Radarr 30 min).
- Finished torrents — seed to ratio 1.0 or 60 min idle, then Transmission stops them and Sonarr/Radarr remove them (remove-completed on).
PAUSE: write
~/video/PAUSE = who | why | until YYYY-MM-DD HH:MM. Controller does nothing until it expires.
4. Config of record (live values)
| Setting |
Value |
Why |
| peer-limit global / per torrent |
120 / 20 |
Etisalat conntrack; 240 crashed gateway 11 May |
| download-queue-size |
20 |
conntrack |
| queue-stalled |
on, 15 min |
off = dead swarms hold every slot (25 Sep, 0.18→8 MB/s) |
| DHT / PEX / uTP / LPD |
all on |
uTP off = new torrents find nobody (13 Sep) |
| speed down / up |
25 MB/s / 2 MB/s |
gateway crash at ~30 MB/s (11 May) |
| seed ratio / idle seeding |
1.0 / 60 min |
finished torrents must leave |
| peer port |
51420 |
forwarded, but inbound blocked by Etisalat above the gateway |
| Prowlarr min seeders |
25 |
1-seeder releases die (13 Sep: 303/386 had 0 peers) |
| *arr upgrades |
off |
27 Sep: 689 of 711 Sonarr queue items were upgrades of owned episodes |
Change a value: edit StudioServer/video/video-config.json, copy to Studio ~/video/, note it in §9. Changing it in the app = drift, put back within 60s. |
|
|
5. Monitor checks → auto-fix
| Check |
Red when |
Auto-fix |
| transmission |
RPC not answering 3 ticks running |
graceful SIGTERM + restart (never for being slow — INC-001) |
| controller |
heartbeat >3 min |
restart controller |
| films_landing |
no film into Plex for 6h |
— |
| new_episodes |
>3 monitored episodes aired 1–4 days ago missing |
Sonarr search for exactly those |
| plex_scanning |
Plex log "signed out or offline" skipped scans in 15 min |
restart Plex if nobody streaming (27 Sep incident) |
| moving |
<3 torrents moving while ≥10 incomplete |
— |
| drift_fight |
same setting put back ≥5× in 1h |
— (something else is writing it — find it) |
| retired_jobs |
any retired job loaded again |
bootout |
| arr_health |
Sonarr/Radarr health error, all indexers down, download client issue |
— |
| disk |
2026 / MOVIES / TV ≥95% |
— |
| Escalation: auto-fix once → still red 15 min later → one WhatsApp + incident file. Green → incident closed automatically. |
|
|
| 08:00 WhatsApp scorecard: yesterday films vs 70, episodes, week to date, torrents/backlog, red checks, fixes, drift count. No scorecard by 08:05 = video-eval or Studio down. |
|
|
6. Managing drift
- One writer: only the controller changes Transmission or the *arr settings in §4. Every other script is retired (§7) and
retired_jobs puts them back down if they reappear.
- Every correction is logged (
DRIFT in controller.log) and counted in the scorecard.
- The same key corrected ≥5× in an hour = two writers fighting → WhatsApp.
- Drift seen 27 Sep first run: seed ratio off, idle seeding 30 (config 60), Prowlarr min seeders 1 (config 25), 50 Radarr collections on missing root
/data3.
7. Retired 27 Sep (plists in ~/Library/LaunchAgents/retired-2026-09-27/)
Were running: famflix-loop (30s, add/remove/evict), movies-stall-recover (LLM restarts), tr-tracker-sweep, tr-wedge-watchdog (the INC-001 killer), space-replace-stop.
Already unloaded, plists removed: space-replace-overnight, slot-balance, tr-autopilot, goal-tick, goal-pipeline, goal-watcher, film-refill, studio-health-monitor, studio-ntfy-monitor.
Never reload one of these. If a behaviour is missing, add it to the controller.
8. Pipeline
Seerr / import lists → Sonarr + Radarr (OrbStack) → Prowlarr indexers → Transmission (native, :9091, downloads /Volumes/2026/data/downloads/{radarr,tv-sonarr}) → arr completed-download handling (remote path maps /Volumes/2026/data/downloads/ → /data4/data/downloads/) → library → Plex sections 6 Movies / 7 TV Shows.
Libraries: films /Volumes/{MOVIES,2026,MUSIC}/…/movies · TV /Volumes/{TV,2026}/data/media/tv.
Credentials: Claude/credentials.md §Transmission RPC; arr keys read live from each container's config.xml.
9. Log
| Date |
Change |
| 27 Sep 07:37 |
Plex restarted — cached "offline" had skipped all scans since 01:20 |
| 27 Sep 07:56 |
System live. First pass: 646 upgrade downloads removed, 4 drifts put back, 761 torrents re-trackered, 40 prioritised. Transmission 872 → 311 torrents, 0.35 → 1.8 MB/s |
| 27 Sep 08:01 |
new_episodes red (14) → Sonarr search fired |
10. Open
| # |
Item |
| 1 |
Inbound port 51420 blocked above the gateway (Etisalat) — fewer peers |
| 2 |
Prowlarr indexers failing: TPB, Knaben, YTS, TorrentByte, Torrent[CORE] |
| 3 |
Who ran 960 manual Sonarr searches on 26 Sep — unknown (upgrades now removed by controller) |
| 4 |
Radarr grabs ~300/day vs ~77 land — measure hit rate after min-seeders 25 |
| 5 |
Controller tuning (queue size, peer limit) — one change a week, judged on Plex landings from tr-metrics.db, never a spot check |
| 6 |
TR creds hard-coded in retired scripts + famflix-monitor — move to env |