Commit graph

19 commits

Author SHA1 Message Date
s8n
004016b3cf doc 04 §3c: header icon hide (keep search, drop syncplay/cast/user)
Three top-right header icons hidden via CSS appended to existing CustomCss:
.headerSyncButton, .headerCastButton, .headerUserButton. Search button
.headerSearchButton intentionally untouched so its event handler still
fires. Selectors confirmed by grepping live JF 10.10.3 web bundle.
Branding POST returned 204; verified via GET that Cineplex @import,
cast/crew hide, ARRFLIX logo override, Quick Connect hide, Settings
drawer hide, LoginDisclaimer, and SplashscreenEnabled all preserved.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-08 03:33:27 +01:00
s8n
ba4c281ce0 doc 04 §3b: triple-logo fix re-applied (sibling POST overwrote first attempt)
Branding endpoint accepts full-object POSTs only — no field-level merge,
no ETag locking. Concurrent agents writing to /System/Configuration/branding
race; last writer wins. Lock-in: branding-CSS POST must be the final POST
in any sequence touching that endpoint.
2026-05-08 03:26:19 +01:00
s8n
514dcb6ffc Branding shim: lock <title> + favicon at runtime against SPA overwrites
The static <title>ARRFLIX</title> patch wasn't enough - Jellyfin's bundle
calls document.title=... on hydrate and per-route, so the tab kept showing
'Jellyfin'. Add a self-contained inline IIFE in <head> that:

  - Replaces 'Jellyfin' with 'ARRFLIX' on the title (incl. ' - Jellyfin' suffix)
  - Pins favicon hrefs to the existing data: URL already in the page
  - Watches <head> via MutationObserver for SPA churn
  - Has a 1s setInterval safety net for late-binding navigations
  - One-shot unregisters the Jellyfin service worker so old clients reload fresh

bin/inject-shim.py is the source of truth - idempotent (replaces marker block).
docs/10-spa-runtime-shim.md covers root cause, deploy flow, SW eviction, and
how to extend the shim on Jellyfin upgrade.
2026-05-08 03:25:16 +01:00
s8n
6bf78d66e1 Restrict non-admin users + 3 imports landed
- EnableUserPreferenceAccess=false on guest + 5 (hides Display, Home,
  Playback, Subtitles pref pages — owner controls UX centrally).
- Wrapper bin/add-jellyfin-user.sh updated to bake this into all future
  non-admin user creations.
- ROADMAP entries (added by sibling import agents):
  - Imported: The Incredible Hulk (2008), TMDB 1724, 4 images
  - Imported: Idiocracy (2006), TMDB 7512 (NOT 1542 = Office Space)
  - Imported: American Dad! (2005) S01-S04, 58 eps, TMDB 1433
- WAN exposure docs added (doc 09, 256 lines): Gandi A record live,
  no-guest middleware dropped, lockout=5 baked in. Owner still must
  port-forward 80/443 on home router for actual public access.
2026-05-08 03:18:58 +01:00
s8n
84799e1bd3 Branding fixes: triple-logo overlap + Quick Connect disable + index.html override
- Logo override: removed phantom .imgLogoIcon selector + split content/
  background-image per element type (.adminDrawerLogo img uses content:,
  .pageTitleWithLogo uses background-image:). Triple-stack gone.
- Quick Connect: server-disabled via POST /System/Configuration with
  QuickConnectAvailable=false; belt-and-braces .btnQuick CSS hide.
- index.html bind-mount: title=ARRFLIX, application-name=ARRFLIX,
  apple-touch-icon + favicon set to logo data URL, .splashLogo background
  replaces Jellyfin banner with ARRFLIX wordmark. Mounted via compose
  /opt/docker/jellyfin/web-overrides/index.html → /jellyfin/jellyfin-web/.
- Doc 04 updated: §3a logo fix, §4g Quick Connect disabled.
- Compose synced from nullstone (PublishedServerUrl + Host + bind mount).
2026-05-08 03:09:25 +01:00
s8n
1f5ba31483 Rename: nasflix → ARRFLIX + apply Cineplex theme
Domain + repo rename: nasflix.s8n.ru → arrflix.s8n.ru, NASFLIX → ARRFLIX
(Forgejo repo, Pi-hole DNS, Traefik file+label routes, compose env+labels,
onyx /etc/hosts, branding LoginDisclaimer, all repo refs, logo asset).

Theme: ElegantFin → Cineplex v1.0.6 (MRunkehl, pinned). Picked by research
agent over JellyFlix (halted), DarkFlix (10.8.x only), Theme Park (no
Netflix preset). Real #E50914 + Netflix Sans webfont + transform:scale
hover + gradient login backdrop. Doc 04 updated with full candidate
matrix, theme-history subsection, rollback-to-ElegantFin snippet.

Logo asset saved at assets/logo.png (235x85 RGBA).

Live: https://arrflix.s8n.ru → 302. tv.s8n.ru + nasflix.s8n.ru retired (404).
2026-05-08 02:57:34 +01:00
s8n
cb95dce8bc Rename: tv.s8n.ru → nasflix.s8n.ru, jellyfin-stack → NASFLIX
- Domain: tv.s8n.ru retired (404). nasflix.s8n.ru live (302 → /web).
  Pi-hole local DNS updated. Traefik file-provider router rule + docker-label
  router rule both flipped. Jellyfin PublishedServerUrl env updated. Cert
  re-issued via Gandi DNS-01. Onyx /etc/hosts pin moved.
- Repo: forgejo PATCH /api/v1/repos rename. Local clone remote URL updated.
  All in-tree refs to tv.s8n.ru and jellyfin-stack swept (sed).
- Scope: TV Shows + Movies only. anime/, musicvideos/, home/, music/,
  docs-*/ libraries removed from canonical layout. Sections kept as
  reference for re-introduction.
- Branding LoginDisclaimer text updated to nasflix.s8n.ru.
2026-05-08 02:53:46 +01:00
s8n
ab16861314 wrapper: default new users to English audio + subs (was pol/eng)
Owner flipped libraries to PreferredMetadataLanguage=en, MetadataCountryCode=US.
New-user defaults must match. Wrapper now sets:
  AudioLanguagePreference=eng (was pol)
  SubtitleLanguagePreference=eng
  SubtitleMode=Default (was Always — let player decide based on audio)
2026-05-08 02:37:23 +01:00
s8n
a5fc7a5018 Add ROADMAP.md + link from admin guide
Tracks done / open / blocked / deferred. 8 done items, 9 open
(3 high-value: OpenSubtitles creds, GPU transcode, loading splash;
3 medium-value: extract bin scripts, per-library themes, audit pass;
3 low-value: scaffolding, backups, CI). 5 deferred with rationale.
2026-05-08 02:32:42 +01:00
s8n
30a94f41c1 ADMIN-GUIDE: snapshot update post-import (English Futurama replaces Polish) 2026-05-08 02:26:30 +01:00
s8n
1c0cca9ece Add ADMIN-GUIDE.md as canonical entry point
Single page that links to docs/01..08 + bin/. Five operational rules
locked: wrapper-only user creation, stage-before-import, verify-before-
delete, no-public-DNS, repo-as-truth. Daily-ops table, troubleshooting
matrix, emergency rollback procedures, current-state snapshot.

README now points new readers at ADMIN-GUIDE.md first.
2026-05-08 02:20:02 +01:00
s8n
b935d6d42e Add wrapper script: add-jellyfin-user.sh
Jellyfin has no native global default for new-user DisplayPreferences;
home-layout defaults are baked into the web bundle. This wrapper layers
the s8n canonical prefs on top after user creation:

  - Home sections: resume, resumeaudio, nextup, latestmedia, none x6
    (drops the 'My Media' tile row — sidebar already exposes libraries)
  - SubtitleMode=Always, SubtitleLanguagePreference=eng
  - AudioLanguagePreference=pol

Use for every new user from now on; achieves the 'global default' the
admin wanted without patching the web bundle.

Already retroactively applied to s8n + guest.
2026-05-08 02:09:41 +01:00
s8n
1a6a697afd Add pre-import cleanup + filename normalization rulesets
- 07-pre-import-cleanup: 1002-line ruleset for stripping non-media junk before
  files land in /home/user/media/. Catalogs 10 categories (codec promo,
  group brag, promo images, OS thumb caches, samples, sub leftovers, torrent
  residue, proof folders, multi-disc cruft, Win executables). NFO discriminator
  uses 4096-byte head + XML-root regex (covers prologue case the brief 100-byte
  version misses). 15 auto-delete security categories (.exe/.msi/.bat/.scr/...);
  threat model = friend clicking 'Download original' then running on Win.
  Verified extras folders against Jellyfin docs (lowercase 'featurettes',
  'behind the scenes', etc.). Includes idempotent dry-run-default
  cleanup-import.sh that quarantines first, returns staging path on stdout.

- 08-filename-normalization: 1853-line normative renaming ruleset.
  Canonical: 'Show (Year) - SXXEXX - Title.ext' for TV; '<Title> (<Year>).ext'
  for movies; 'Show - NNNN - Title [Sub|Dub].ext' for absolute-numbered anime.
  Strips group tags ([YIFY]/[RARBG]/[FS99 Joy]/[GalaxyRG]), resolution
  (1080p/2160p/4K), codec (x264/x265/HEVC/10bit), source (WEB-DL/BluRay/HDTV),
  audio (DTS-HD.MA/Atmos/5.1/AAC), release-process (PROPER/REPACK/INTERNAL),
  trailing -NOGRP/-RARBG/-EVO, URL refs, basename language tokens.
  Includes stdlib-only normalize.py: dry-run default, --apply commits,
  --force overwrites, audit log to /var/log/jellyfin-imports/<date>.log,
  idempotent. Worked Futurama before/after; flags drift on live tree
  (current 'Futurama/' lacks '(1999)').
2026-05-08 02:07:11 +01:00
s8n
19382879f9 Drop home/ and music/ from canonical layout per owner
Architecture A trimmed to: movies, tv, anime, musicvideos. Removed
mkdir/compose-mount/library-creation curl for home + music. Sections 6
(Music) and the Home-videos category remain in this doc as reference for
re-introduction later.
2026-05-08 01:49:30 +01:00
s8n
e19f20eb75 Add file-structure rules + per-library theming research
- 05-file-structure-rules: 1165-line authoritative ruleset covering 11 media
  categories (movies, tv, anime, stand-up, concerts, docs, home video, extras,
  subs, artwork, NFO). Architecture A flat layout chosen at
  /home/user/media/{movies,tv,anime,musicvideos,music,home}. Top 3 gotchas
  surfaced: no-per-item-folder breaks extras/NFO; year must be in parens;
  anime absolute numbering past 99 needs Shoko or split-by-TVDB-season.

- 06-per-library-themes: 319-line research memo. Verdict: partially feasible.
  No native per-library theming; CustomCss is global, Jellyfin web sets no
  body class for libraryId/collectionType. Recommended approach: JS Injector
  plugin (n00bcodr fork, MIT, last release 2025-12-08) + ~30-line shim that
  mirrors topParentId/collectionType from URL hash to body class, plus three
  scoped CSS blocks (body.lib-movies, body.lib-anime, body.lib-music).
  Reaches 'tinted, branded, recognisable' — not pixel-perfect. Pixel-perfect
  fidelity needs subdomain split (3 instances) at ~100x maintenance.
2026-05-08 01:46:38 +01:00
s8n
f7c872d687 Add operations playbooks: artwork, metadata, subtitles, theming/users
Four research-grade docs covering everything four parallel agents found while
fixing the live Futurama deploy:

- 01-artwork-and-images: root-cause of missing posters (EnableInternetProviders=false
  + wrong fetcher names 'The Movie Database' vs 'TheMovieDb' in 10.10.x). Fixed
  in-place. Doc covers image-type matrix, scraper-to-imagetype map, refresh API.
- 02-metadata-and-titles: Futurama series had empty ProviderIds; locked to
  TMDB 615 (1999 original, not 2023 reboot). All 44 eps now have proper titles +
  Polish overviews. Doc covers filename regex, Identify flow, language cascade.
- 03-subtitles: installed OpenSubtitles plugin v20.0.0.0 (v21+ needs JF 10.11
  ABI). User must add opensubtitles.com creds. Doc covers sidecar naming,
  embedded extraction, per-user prefs.
- 04-theming-and-users: applied ElegantFin v25.12.31 via Branding API. Doc covers
  theme rationale, multi-user policy template, SyncPlay, friend playbook.
2026-05-08 01:13:42 +01:00
s8n
a061949ee1 Restore userns_mode: host (perms regression on userns-remap host) 2026-05-08 00:13:23 +01:00
s8n
115519433d Initial Jellyfin LAN-only stack for tv.s8n.ru 2026-05-07 23:48:20 +01:00
s8n
c290775b62 Initial commit 2026-05-07 23:47:42 +01:00