Files
iptvnator/libs/shared/interfaces
4grayandClaude Opus 5 f430dec851 feat(dashboard): say where you left off instead of which provider it came from
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>
2026-09-20 20:22:22 +02:00
..