legacy-arrflix/ROADMAP.md
s8n eb71cf6beb processes/subtitles: v3.5 YouTube auto-CC stop-gap + Sassy 5/5
Adds lib/sub-yt-fetch.sh (yt-dlp wrapper) and lib/yt-clean.py (collapses
YouTube's rolling-window auto-caption VTT into a flat SRT). For shows
distributed YouTube-first that have no community subs anywhere -- verified
via three parallel research agents covering OpenSubtitles REST, OS legacy,
Addic7ed, SubDL, SubSource, and Podnapisi for the 5 niche shows in the
library, plus a price-vs-coverage analysis of OpenSubtitles VIP.

Findings: OS VIP would not have helped on the niche shows (it is
download-cap relief, not coverage unlock; same catalog as free). All 4
Jarrad Wright shows in the library (Sassy, Big Lez Saga, Donny &
Clarence, Mike Nolan) live on the same channel and have only YouTube
auto-CC available. v3.5 ships those, explicitly violating STYLE.md
'best quality' as a tracked stop-gap.

Sassy the Sasquatch S01 5/5 episodes subbed with cleaned auto-CC. Mike
Nolan special-case noted: a 'COMPLETE SEASON | SUBTITLES' YT upload from
Oct 2025 carries hand-typed CCs and should be preferred over per-episode
auto-CC when subbing that show.

ROADMAP H5 added: v4 WhisperX large-v3 on the friend RTX 4080 node will
regenerate the v3.5 stop-gap with proper-noun-prompted transcription
(~4-6%% WER vs ~12%% YT auto-CC) and restore the STYLE.md quality bar.
H1 OpenSubtitles credentials marked done (was completed 2026-05-09).
2026-05-10 01:05:07 +01:00

8.1 KiB
Raw Blame History

Roadmap — ARRFLIX

Last revised: 2026-05-08


Snapshot

Metric Value
Prod URL https://arrflix.s8n.ru → 302 ✓
Dev URL https://dev.arrflix.s8n.ru → 302 ✓
Theme Cineplex v1.0.6 (rolled back from NeutralFin)
Repo git.s8n.ru/s8n/ARRFLIX
Library 6 series + 2 movies, 175 eps + 9 featurettes
Disk nullstone /home — 156G free (60% used)
Users 9 (1 admin + 8 non-admin)
Snapshot tag snapshot-2026-05-08-pre-elegantfin (rollback)
Docs 17 in docs/ + ADMIN-GUIDE + ROADMAP

🟥 Open — High value (do first)

# Item Effort Blocker
H1 OpenSubtitles credentials — done 2026-05-09; Caveman5 saved + free API key at ~/.config/arrflix-opensubtitles-api.txt done
H2 GPU transcode (nvidia driver kernel module + container toolkit + SecureBoot signing) L owner sudo + reboot
H3 Apply bin/force-english-all-users.sh (German Play button breaks UX for non-English browsers) S none — owner runs
H4 Backup /home/docker/jellyfin/config/ off-host (no automated backup yet) M strategy decision
H5 v4 subtitle path: WhisperX large-v3 on friend RTX 4080 node. Regenerate Sassy + Big Lez Saga + Donny & Clarence + Mike Nolan with proper-noun prompts (replaces v3.5 YT auto-CC stop-gap). New helper at processes/subtitles/lib/sub-whisperx-fetch.py. WhisperX install on 100.64.0.3 (per memory project_friend_gpu.md, currently offline 2d); per-show prompt yaml at processes/subtitles/prompts/<show>.yaml (recurring proper nouns). Expected 46 % WER vs ~12 % for YT auto-CC; restores STYLE.md "best quality" bar. See processes/subtitles/runs/sassy-the-sasquatch.md for context. M friend node back online + WhisperX setup

🟨 Open — Medium value

# Item Effort Notes
M1 Tune detail-page backdrop gradient stops if text contrast off S doc 14 §7
M2 EnableThrottling + EnableSegmentDeletion (kills wasted ffmpeg-after-disconnect) S doc 13 win 1
M3 KnownProxies + LocalNetworkSubnets in network.xml (fixes session origin on WAN endpoint) S doc 13 win 3
M4 PWA manifest bind-mount — kills "Jellyfin" name on Android/iOS install M doc 16 phase 1
M5 Logo-screensaver disable + i18n DOM-rewrite shim M doc 16 phases 2+3
M6 Extract bin/cleanup-import.sh + normalize.py from doc bodies into runnable files S docs 07/08
M7 Per-library themes (JS injector plugin + body class shim) M doc 06 — "tinted, not pixel-perfect"

🟩 Open — Low value (nice-to-have)

# Item Effort Notes
L1 Forgejo Actions CI (lint compose, shellcheck bin/, render docs) M not started
L2 High-res ARRFLIX wordmark for desktop splash variant (currently 235×85, looks soft on 1080p+) S doc 14 finding
L3 Hide lone "User" h3 header above Sign Out (cosmetic) S open Q from settings-fix agent
L4 Rotate dev admin password (currently same as prod for parity) S open Q from settings-fix agent

🚫 Blocked / waiting

Item Blocker Action owner
OpenSubtitles auth account signup at .com s8n
Nvidia GPU sudo + reboot decision s8n
WAN public access home router port-forward 80/443 → 192.168.0.100 s8n

🔒 Deferred (with reason)

Item Reason
Pixel-perfect Netflix/Crunchyroll/Spotify per-lib themes requires 3 separate Jellyfin instances on subdomains; ~100× maintenance cost. Doc 06
Custom Jellyfin Docker image (FROM jellyfin + COPY index.html) bind-mount works; defer until ≥3 web-bundle overrides needed
Subdomain split for friend-only access non-admin user policies + EnabledFolders ACL already do this on a single instance
Move to Jellyfin-Vue alt web client replaces UI, breaks current branding stack
4 TB HDD activation wait until library exceeds 500 GB; currently 50G

Done

Branding + theme

  • Theme: ElegantFin → Cineplex → ElegantFin → NeutralFin → Cineplex v1.0.6 (final), snapshot tag for rollback
  • ARRFLIX logo data-URL injected — overrides Cineplex's logo on .adminDrawerLogo img + .pageTitleWithLogo (split-rule per element type, no overlap)
  • Browser tab title ARRFLIX + favicon = ARRFLIX wordmark (via index.html bind-mount)
  • Pre-bundle splash → ARRFLIX wordmark (no more Jellyfin logo on first paint)
  • LoginDisclaimer "Welcome to ARRFLIX - Private invite only service"
  • Critical-path inline <style> in index.html eliminates pre-bundle theme flash
  • JS shim in index.html: title-lock + favicon-lock + nukeSettings + SW unregister
  • Detail-page backdrop full-bleed gradient fix (was 17vw black band; now Netflix-style)

UI hides + tweaks (CSS in CustomCss)

  • Cast & Crew + USER-F Stars sections (#castCollapsible, #USER-FCastCollapsible)
  • Quick Connect button + server-side disable (.btnQuick, QuickConnectAvailable=false)
  • Settings drawer link v2 (a.btnSettings, [data-itemid="settings"] — verified on dev with headless A/B before swap)
  • Header icons: SyncPlay group, Cast, User menu (.headerSyncButton, .headerCastButton, .headerUserButton)
  • Unwatched-count badges (.countIndicator)
  • Settings menu page access (EnableUserPreferenceAccess=false per non-admin)
  • Slider thumbs blue → white (scrubber + volume on player OSD)
  • Pure-black background

Library

  • Cleanup playbook: 17-doc set including pre-import strip rules + filename normalization
  • Imports applied via cleanup → normalize pipeline:
    • Futurama (1999) S01S04, 72 eps + 9 featurettes (TMDB 615)
    • American Dad! (2005) S01S04, 58 eps (TMDB 1433)
    • Rick and Morty (2013) S01, 11 eps (TMDB 60625)
    • Star Wars: Maul Shadow Lord (2026) S01, 10 eps (TMDB 289219)
    • Obi-Wan Kenobi (2022) S01, 6 eps + 4 featurettes (TMDB 92830)
    • The Incredible Hulk (2008) (TMDB 1724)
    • Idiocracy (2006) (TMDB 7512)
  • The Mandalorian (2019) S01S03 — 18/24 mkv on disk, scrape in flight
  • Futurama season posters re-locked to highest-res TMDB (was low-res)
  • Polish set replaced with English; libraries flipped pl/PLen/US

Users + access

  • 9 users (s8n admin, 5, USER-D, USER-B, USER-F, USER-G, USER-A, USER-E, USER-C)
  • All non-admin policies: IsAdministrator=false, EnableContentDeletion=false, EnableUserPreferenceAccess=false, LoginAttemptsBeforeLockout=5
  • Wrapper bin/add-jellyfin-user.sh — single-call canonical user creation (4-step pipeline: create + home layout + lang prefs + restricted policy)
  • Home layout per-user: resume → resumeaudio → nextup → latestmedia (My Media tile row dropped)

Infra

  • Domain rename: tv.s8n.runasflix.s8n.ruarrflix.s8n.ru
  • Repo rename: jellyfin-stackNASFLIXARRFLIX at git.s8n.ru/s8n/ARRFLIX
  • Pi-hole local DNS for arrflix.s8n.ru + dev.arrflix.s8n.ru
  • LE certs via Gandi DNS-01 for both prod + dev
  • WAN window: Gandi public A record arrflix.s8n.ru → 82.31.156.86, no-USER-F middleware dropped, lockout=5 baked in (router port-forward pending)
  • Dev instance: dev.arrflix.s8n.ru, isolated config, shared /home/user/media:/media:ro mount with prod (read-only), 7 mirror users + s8n-dev admin
  • Snapshot tag snapshot-2026-05-08-pre-elegantfin for one-command rollback

Docs (17 + 2 indexes + bin/)

  • ADMIN-GUIDE.md (entry point)
  • ROADMAP.md (this file)
  • docs/01..16 covering: artwork, metadata, subtitles, theming-and-users, file-structure, per-library-themes, cleanup, normalization, WAN exposure, SPA shim, NeutralFin audit, dev instance, optimization audit, theme audit, force English, Jellyfin-branding leaks, dev mirror + settings fix
  • bin/add-jellyfin-user.sh, bin/inject-shim.py, bin/force-english-all-users.sh

Conventions

When marking an item:

  • Move OpenDone when shipped + verified
  • Move to Blocked when waiting on owner / external
  • Move to Deferred with one-line reason
  • Update Snapshot stats on every revision