mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-12 12:06:16 -08:00
Every dashboard title carried a "Xtream · Series" / "Stalker · Movie" subtitle. Provider kind and content kind are this app's own taxonomy, not a property of the title, and they are identical on every card in a rail — so the one line that could tell two cards apart told the user nothing. The hero now shows the source name alone, through `playlistDisplayLabel` (a stored playlist name is routinely the pasted URL with credentials, or a MAC). Continue Watching cards show what actually varies: the "S1·E5" chip plus "12 min left". Favorites keep the title alone, Recently Added keeps the source name, and a meta row with nothing in it is no longer rendered. Stalker shows filed under Movies had no badge, no progress and no resume. Their stored rows carry a `series[]` episode array (or a Ministra `is_series` flag) while living in the VOD catalog, so `extractStalkerItemType` reports `movie` on purpose: the detail must route there. But their progress is a set of EPISODE positions keyed by the parent id, and the dashboard was looking them up as a single `vod` row and finding nothing. Split the two questions. `PortalActivityItem.watch_kind` records the progress model when it differs from the routing type, the Stalker mappers set it from `isStalkerSeriesItem`, and every reader that has to choose — position lookup, the S·E badge, the resume and mark-watched actions — goes through `resolvePortalActivityWatchKind` instead of `type`. That makes the resume handoff reachable for Stalker, so wire it: a new `STALKER_SERIES_RESUME_TARGET` token, provided by the collection detail and consumed once by `StalkerSeriesViewComponent` after the series positions are read (a failed read plays nothing, rather than restarting the episode from zero). A lazy Ministra season the target lives in is hydrated first, and an episode matched by season/episode coordinates instead of a tracking id still resumes at the offset the card displayed. The global-recent route template bound `[seriesResume]` only on its Xtream branch, so the Stalker detail never received the target. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>