docs(489): spec + implementation plan for Jellyfin mixed-content libraries #490

Merged
timothy merged 1 commits from docs/489-mixed-libraries-spec into main 2026-07-20 18:36:06 +02:00
1 Commits
Author SHA1 Message Date
timothy a4ad12f3dc docs(489): spec + implementation plan for Jellyfin mixed-content libraries
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 10s
Build ErsatzTV Image / CI image pin matches docker/ci (pull_request) Successful in 11s
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 34s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 33s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 36s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 34s
Build ErsatzTV Image / decisions.md append-only (pull_request) Successful in 8s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / Docs update reminder (pull_request) Failing after 10m13s
Design and bite-sized TDD plan for supporting Jellyfin libraries whose
collection type is 'mixed' (currently dropped silently by
JellyfinApiClient.Project), so music and standup content is ingested while
staying segregated from the main Movies / TV Shows libraries.

Key findings that shaped the design:
- Jellyfin classifies server-side via parentId + includeItemTypes, so the
  three per-kind scanners see disjoint authoritative sets. No inference.
- No DB migration: MediaItem is TPT keyed on LibraryPathId, so
  heterogeneous items under one library path are already legal.
- MediaKind is dispatch + presentation only; scheduling, playout,
  collections and search carry zero references to it.
- Scoped to Jellyfin deliberately: local mixed libraries would have the
  scanners claim each other's files and thrash LibraryFolder etags.

Blocked by #488 (JellyfinMusicVideoLibraryScanner crashes on first item).

Refs #489
2026-07-20 00:49:49 +02:00