fix(dashboard): live rails find XMLTV programmes outside the global EPG sources

The dashboard's "Now on air on favorite channels" and "Recently watched
Live TV" rails looked up XMLTV programmes scoped to the Settings-managed
global EPG URLs only, with no fallback. A favourite whose guide lives in
another playlist's XMLTV (or whose programmes are tagged with a source
other than the channel row's) showed only the LIVE chip while its "See
all" row — resolved by StreamResolverService, which never scopes by
source — showed the programme.

EpgLookupOptions gains a renderer-only `anySourceFallback`: after the
scope (playlist sources, then global) has answered, the keys still
without a programme are retried once through the source-less batch path
and its cache. The dashboard rails pass it; the channel list keeps the
strict scope.

Regression E2E: playlist-declared XMLTV + a global XMLTV without the
channel → the favourite's dashboard card shows the programme (fails on
the old code with the subtitle in its place).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5.1 committed 2026-09-19 17:23:06 +02:00
1 parent 4cce4acaad
commit 54071e2a4d
8 files changed
+367 -11

No files matched your search

+11 -1
View File
@@ -978,7 +978,17 @@ These URLs are playlist-scoped by default:
TTL expires.
- Scoped lookups fall back only to Settings-managed EPG URLs for channels
missing from the playlist-declared source. Playlist-local sources from other
playlists are not treated as global fallback sources. Single-channel current
playlists are not treated as global fallback sources. The one opt-out is
`EpgLookupOptions.anySourceFallback` (renderer-only, never forwarded to the
bridge): after the scope — playlist sources, then the global ones — has
answered, the keys still without a programme are retried once against every
imported source through the source-less batch path and its cache. The
dashboard live rails pass it because they mix channels of every playlist
and have no playlist scope to offer; without it a favourite whose guide
only exists in another playlist's XMLTV showed no programme on the
dashboard while its "See all" row — resolved by `StreamResolverService`,
which never scopes by source — had one. The channel list keeps the strict
scope. Single-channel current
program lookups include the source URL set in their cache and in-flight keys,
so playlist-local and global lookups deduplicate without reusing the wrong
source scope. Batch current-program lookups use the same source-scoped