- 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)'). |
||
|---|---|---|
| docs | ||
| docker-compose.yml | ||
| README.md | ||
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 Traefikno-guest@filemiddleware.- 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
- Browse to
https://tv.s8n.rufrom the LAN. - Create the admin user (Jellyfin onboarding wizard).
- Add libraries pointing at
/media/moviesand/media/tvinside the container (these map to/home/user/media/{movies,tv}). - (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), S01–S03, 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