Jellyfin episodes still present in Jellyfin are flagged FileNotFound and never restored (7675 items, 1557 upcoming playout items on 28 channels) #932
Open
opened 2026-10-27 22:18:35 +01:00 by timothy
·
1 comment
No Branch/Tag Specified
main
renovate/meziantou.analyzer-3.x
renovate/nuget-sixlabors.imagesharp-vulnerability
913-scripted-playout-401
929-vuln-pkcs-imagesharp-v4
renovate/dotnet-monorepo
release/v26.15.0-notes
renovate/lucene.net
renovate/cliwrap-3.x
issue-806-guard-populations
scratch/767b-poisoned
scratch/767b-control
release/v26.14.0-notes
release/v26.14.0
renovate/sqlitepclraw.bundle_e_sqlite3-3.x
docs/510-skill-logo-bug-policy
fix/510-watermark-resolution-policy
fix/629-verdict-classifier-falseopens
fix/609-decisions-edit-token-scope
issue-135-clear-to-none
release/v26.12.0-notes
fix/409b-lastscan-api-parity
fix/401-updatechannel-mirror-422
fix/327-playlist-rename-validation
fix/410-scancancel-log-level
fix/409-447-librariesscreen-neverscanned
fix/338-zap-exit-code
fix/367-plex-budget-message
fix/310-debom-legacy-cs
ci/604-lane-rebalance
feat/388-design-mirror
feat/247-test-ownership
feat/247-primary-action
feat/357-player-owned-playback
feat/357-jellyfin-plugin-poc
fix/289-mcp-hardening
issue58-mcp
feat/244-channels-extract
ci/auto-bump-prod-compose
feat/multi-rerun-collections-api
feat/collections-api
feat/quick-wins
feat/185-docs-part2
feat/140-collections-screen
feat/146-channel-edit
feat/147-classic-ui-link
issue22-renovate-dashboard
feat/91-cutover
feat/63-composite-create
feat/65-library-browse
feat/85-epg
feat/86-schedule-editor
feat/109-dashboard-data
feat/99-session-tracking
fix/dockerfile-node-tag
feat/59-spa-foundation
docs/59-ui-redesign-brief
feat/102-json-guide
feat/111-schedule-durations
feat/104-artwork-upload
feat/103-media-sources-api
feat/playouts-read-api
feat/108-health-api
feat/105-picker-list-endpoints
issue-97-channel-state-api
issue42-jellyfin-musicvideos
issue46-rest-api-error-contract
dependabot/nuget/ErsatzTV.FFmpeg.Tests/multi-d307a2e06f
qsv-improvements
hdr-vulkan-cuda-test
v26.16.0
v26.15.0
v26.14.0
v26.13.0
v26.12.0
v26.11.0
v26.10.0
v26.9.0
v26.8.0
v26.7.0
blazor-final
v26.6.0
v26.5.0
v26.4.0
v26.3.1
v26.3.0
v26.2.0
v26.1.1
v26.1.0
v25.9.0
v25.8.0
v25.7.1
v25.7.0
v25.6.0
v25.5.0
v25.4.0
v25.3.1
v25.3.0
v25.2.0
v25.1.0
v0.8.8-beta
v0.8.7-beta
v0.8.6-beta
v0.8.5-beta
v0.8.4-beta
v0.8.3-beta
v0.8.2-beta
v0.8.1-beta
v0.8.0-beta
v0.7.9-beta
v0.7.8-beta
v0.7.7-beta
v0.7.6-beta
v0.7.5-beta
v0.7.4-beta
v0.7.3-beta
v0.7.2-beta
v0.7.1-beta
v0.7.0-beta
v0.6.9-beta
v0.6.8-beta
v0.6.7-beta
v0.6.6-beta
v0.6.5-beta
v0.6.4-beta
v0.6.3-beta
v0.6.2-beta
v0.6.1-beta
v0.6.0-beta
v0.5.8-beta
v0.5.7-beta
v0.5.6-beta
v0.5.5-beta
v0.5.4-beta
v0.5.3-beta
v0.5.2-beta
v0.5.1-beta
v0.5.0-beta
v0.4.5-alpha
v0.4.4-alpha
v0.4.3-alpha
v0.4.2-alpha
v0.4.1-alpha
v0.4.0-alpha
v0.3.8-alpha
v0.3.7-alpha
develop
v0.3.6-alpha
v0.3.5-alpha
v0.3.4-alpha
v0.3.3-alpha
v0.3.2-alpha
v0.3.1-alpha
v0.3.0-alpha
v0.2.5-alpha
v0.2.4-alpha
v0.2.3-alpha
v0.2.2-alpha
v0.2.1-alpha
v0.2.0-alpha
v0.1.5-alpha
v0.1.4-alpha
v0.1.3-alpha
v0.1.2-alpha
v0.1.1-alpha
v0.1.0-alpha
v0.0.62-alpha
v0.0.61-alpha
v0.0.60-alpha
v0.0.59-alpha
v0.0.58-alpha
v0.0.57-alpha
v0.0.56-alpha
v0.0.55-alpha
v0.0.54-alpha
v0.0.53-alpha
v0.0.52-alpha
v0.0.51-alpha
v0.0.50-alpha
v0.0.49-prealpha
v0.0.48-prealpha
v0.0.47-prealpha
v0.0.46-prealpha
v0.0.45-prealpha
v0.0.44-prealpha
v0.0.43-prealpha
v0.0.42-prealpha
v0.0.41-prealpha
v0.0.40-prealpha
v0.0.39-prealpha
v0.0.38-prealpha
v0.0.37-prealpha
v0.0.36-prealpha
v0.0.35-prealpha
v0.0.34-prealpha
v0.0.33-prealpha
v0.0.32-prealpha
v0.0.31-prealpha
v0.0.30-prealpha
v0.0.29-prealpha
v0.0.28-prealpha
v0.0.27-prealpha
v0.0.26-prealpha
v0.0.25-prealpha
v0.0.24-prealpha
v0.0.23-prealpha
v0.0.22-prealpha
v0.0.21-prealpha
v0.0.20-prealpha
v0.0.19-prealpha
v0.0.18-prealpha
v0.0.17-prealpha
v0.0.16-prealpha
v0.0.15-prealpha
v0.0.14-prealpha
v0.0.13-prealpha
v0.0.12-prealpha
v0.0.11-prealpha
v0.0.10-prealpha
v0.0.9-prealpha
v0.0.8-prealpha
v0.0.7-prealpha
v0.0.6-prealpha
v0.0.5-prealpha
v0.0.4-prealpha
v0.0.3-prealpha
v0.0.2-prealpha
v0.0.1-prealpha
Labels
Clear labels
ad-hoc
api
bug
ci-cd
content
dependencies
enhancement
frontend
in-progress
jellyfin
parked
priority: high
priority: low
priority: medium
review
security
One-off / ad-hoc work not tracked by a dedicated issue
REST API / HTTP endpoints
Something isn't working
Build, test, deploy pipeline
Channel content / schedules / playlists
Dependency updates (Renovate)
New feature or improvement
ChicoryTV React SPA frontend
Claimed by an active session — do not pick up
Jellyfin tuner / IPTV integration
Excluded from automatic queue pickup; work only when explicitly selected
Adversarial review finding
Security / vulnerability fix
No labels
priority: medium
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: timothy/ersatztv#932
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
Jellyfin episodes that still exist in Jellyfin, under the same ItemId, and on disk are flagged
MediaItemState.FileNotFound(State=1) in prod, and the flag is not cleared.Measured 2026-10-27 ~22:30 against prod (jazz, read-only):
MediaItemrows with State=1: 7675.PlayoutItems (Finish > now) that reference State=1 media: 1557 across 28 channels (Friends 126, Seinfeld 119, Frasier 128, Simpsons 130, Family Guy 130, South Park 120, …). State=0: 2441.b7afd9793d560a4b3e8867b40945b737, State=1.GET /Items?Ids=b7afd979…on Jellyfin returns 1 record with the same path, and the file is present at/data/tvshows/Friends/Season 03/inside the container./QI/Series 18/path, idbe7bc4bc…). Jellyfin returns 0 records, because the episode now lives at S00E05 under Specials. This one caused ch130's error card at 22:14 (PlayoutItemNotAvailableFromMediaServer); the playout rebuild is handed to media-management.For a media-server library, FileNotFound means the ItemId is absent from the scan's incoming set (
MediaServerTelevisionLibraryScanner:existingEpisodes.Except(incomingItemIds)→FlagFileNotFoundEpisodes). It does not describe the disk. Why a still-present id lands there, and why later scans don't restore Normal, is unmeasured. Do not assume a cause before reproducing.Impact
PlayoutBuilderwithskipMissingItemsdrops these items, so a rebuild can silently empty a healthy channel. Do not mass-rebuild playouts on the strength of the 1557 count.ChannelRepositorycounts them asBrokenin the channel listing.FileNotFoundHealthCheckreports 7675, which hides the real ones.Done-when
Refs #924, #927
Evidence from the ch130 playout reset (media-management, 2026-10-27 21:28Z, channel id 12 / playout 11):
Second mechanism: replaced files leave a stale State=1 row. When a file is replaced by one with the same name and a different extension (
.avi→.mkvfor Penn & Teller,.mkv→.mp4for House of Games), Jellyfin issues a new ItemId. ErsatzTV adds the new row and flags the old one FileNotFound, then keeps it. That flag is correct, but the row is never retired. All six ch130 flags media-management checked are of this kind.Why rebuilds still schedule them.
PlayoutBuilderskips FileNotFound/Unavailable only when ConfigElementplayout.skip_missing_itemsis true (PlayoutBuilder.cs~410, default false), and prod has no row for that key. After the reset, ch130 picked 3 different stale rows within 24h: MediaItem 30876 (House of Games S08E13), 44848 (Penn & Teller S02E13) and 30915 (House of Games S08E52). Resetting again only re-rolls which stale rows it picks.The false flags (this issue's original case) make every obvious remedy unsafe: enabling skip-missing drops falsely flagged healthy items from rebuilds, and Empty Trash permanently deletes them. Prod is on hold, with no reset, deep scan, Empty Trash or skip-missing setting, until this issue is resolved.
Done-when addition: the fix must distinguish the two populations, a real replaced-file row (retire it) and a false flag (restore Normal), and the recovery path must be safe to run on prod with both present.