ARRFLIX — my own premium streaming service: AI-upscaled masters, best-quality everything, no compromise. https://arrflix.s8n.ru
Find a file
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
docs Add pre-import cleanup + filename normalization rulesets 2026-05-08 02:07:11 +01:00
docker-compose.yml Restore userns_mode: host (perms regression on userns-remap host) 2026-05-08 00:13:23 +01:00
README.md Add file-structure rules + per-library theming research 2026-05-08 01:46:38 +01:00

jellyfin-stack

Self-hosted Jellyfin media server on nullstone, LAN-only.

Endpoint

  • https://tv.s8n.ru — accessible only from LAN (192.168.0.0/24) and Tailscale admin/infra tags via Traefik no-guest@file middleware.
  • DNS resolved internally by Pi-hole (/opt/docker/pihole/etc-pihole/custom.list).
  • TLS via Let's Encrypt DNS-01 (Gandi).

Storage

Path Purpose
/home/docker/jellyfin/config/ Jellyfin config + DB (writable, UID 1000)
/home/docker/jellyfin/cache/ Transcode + image cache
/home/user/media/movies/ Movies library (mounted RO)
/home/user/media/tv/ TV library (mounted RO)

Routing

Traefik docker-label provider does NOT pick up the labels on this container (unknown reason — file-provider routing for the same backend works). The deploy uses file-provider routing in /opt/docker/traefik/config/jellyfin-test.yml. If you fix the docker-provider issue later, flip routing back to labels and remove the file-provider snippet.

Transcoding

GTX 1660 Ti is present on nullstone but nvidia-smi currently fails — driver is broken or not loaded. Jellyfin runs CPU-only transcode for now. After fixing the driver, add the standard NVIDIA hwaccel block in compose:

deploy:
  resources:
    reservations:
      devices:
        - driver: nvidia
          count: all
          capabilities: [gpu]

…and enable NVENC in Jellyfin's Playback → Transcoding settings.

First-run setup

  1. Browse to https://tv.s8n.ru from the LAN.
  2. Create the admin user (Jellyfin onboarding wizard).
  3. Add libraries pointing at /media/movies and /media/tv inside the container (these map to /home/user/media/{movies,tv}).
  4. (Optional) Apply Netflix-style theme — see docs/04-theming-and-users.md.

Operations docs

Detailed playbooks (research-grade, with API curls, failure modes, recovery):

File Topic
docs/01-artwork-and-images.md Posters, backdrops, scrapers (TMDB/TVDB/Fanart), refresh API, language fallback
docs/02-metadata-and-titles.md Filename parsing, Identify flow, locking the right show, language cascade, multi-episode files
docs/03-subtitles.md OpenSubtitles plugin (.com), sidecar naming, ffmpeg/mkvextract extraction, per-user prefs
docs/04-theming-and-users.md ElegantFin theme, branding API, multi-user policies, SyncPlay, friend account playbook
docs/05-file-structure-rules.md Authoritative folder/filename rules for movies, TV, anime, stand-up, concerts, docs, extras, NFO, artwork overrides
docs/06-per-library-themes.md Per-library theming research: JS-injector plugin shim + scoped CSS for Movies/Anime/Music looks

State as of 2026-05-08

  • Library: Futurama 1999 series (TMDB 615), S01S03, 44 episodes, fully scraped (Polish metadata + posters + backdrops + episode stills)
  • Theme: ElegantFin v25.12.31 applied via /System/Configuration/branding
  • Subtitles: OpenSubtitles plugin v20 installed; user must add opensubtitles.com creds (free tier = 20 dl/day)
  • Users: 1 admin (s8n); friend account creation playbook in doc 04

Deploy

cd /opt/docker/jellyfin
docker compose up -d