fix(epg): name search hits, keep guide coverage strict on mapping failures

- Search results and the unresolved programme dialog show the channel's
  display name (playlist row name, else the XMLTV display name the search
  joined in) instead of the raw XMLTV id.
- The guide coverage read resolves manual mappings through a strict variant
  that rejects on database failure, so a mapped channel can never be reported
  as uncovered and hidden by "Only with EPG".
- Architecture doc describes the tiered active-row resolution.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5.1 committed 2026-09-06 17:50:55 +02:00
1 parent c15598b33f
commit 9071bbf19b
9 files changed
+77 -20

No files matched your search

+8 -3
View File
@@ -1147,9 +1147,14 @@ without that both copies lit up as playing and activating either one played
the first, and suffixing only the repeats was not enough because a real
channel id can itself look like a generated suffix (ids `x`, `x`, `x#1`
produced `x#1` twice). Ids move with the scope and the channel list, so only
ids the guide was just handed may be passed back. The active channel marks the
FIRST row carrying its id (`null` when it is outside the scope), and
`activate(rowId)` resolves the row back to its own channel. Opening the
ids the guide was just handed may be passed back. The active channel is
resolved to a row in three steps, because the store spreads the selected
channel (identity is gone) and copies can share an id: the row whose channel
matches the playing one field for field (every field except the
reducer-rewritten `epgParams`, key order ignored — `isSameChannelEntry`),
else the first same-id row with the same stream url, else the first same-id
row; `null` when the channel is outside the scope. `activate(rowId)`
resolves the row back to its own channel object. Opening the
guide mirrors the sidebar view (`applyInitialScope`): favorites stays
favorites, and the groups view opens on the group the sidebar's rail is
SHOWING — forwarded from `GroupsViewComponent.selectedGroupChange` through the