You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Complete the next M3U catch-up product slice: selecting a past EPG programme in Guide must start provider catch-up through the existing service-owned playback/recovery path, without constructing provider URLs in Guide/Compose and without introducing a second player, retry loop, or seek authority.
Confirmed current gap
Guide programme cells currently call onOpenChannel(channelId) for every click, so past programmes collapse to ordinary Live playback.
PlaybackCatalog.resolveIntent() and persisted M3U archive resolution are implemented, but PlaybackStartRequest is still Live/channel-only.
MuxTvPlaybackService resolves candidates through PlaybackCandidateResolver.resolveCandidate(...), so resolving catch-up in presentation before the service would bypass the accepted bounded recovery owner.
Guide presentation clips visible programme bounds to the viewport; catch-up must use the original EPG programme start/end, not clipped display bounds.
Architecture
Keep PlaybackStartRequest provider-neutral and extend it with PlaybackIntent, while preserving the existing Live constructor/source compatibility.
Preserve the existing service-owned candidate ordering/recovery. Add an intent-aware candidate-resolution seam with a Live default; RoomPlaybackCatalog resolves archive intent for the exact candidate selected by the service.
Media3/session command transport serializes only semantic intent fields; no locator/template/token/header crosses this boundary.
Guide emits only a provider-neutral selection: current/status -> Live, completed programme -> CatchupProgram, future programme -> no launch.
App navigation stores only bounded semantic identities/timestamps and reconstructs PlaybackIntent at the player entry point.
Parent: #184
Follows: completed #285 / merged #304.
Objective
Complete the next M3U catch-up product slice: selecting a past EPG programme in Guide must start provider catch-up through the existing service-owned playback/recovery path, without constructing provider URLs in Guide/Compose and without introducing a second player, retry loop, or seek authority.
Confirmed current gap
onOpenChannel(channelId)for every click, so past programmes collapse to ordinary Live playback.PlaybackCatalog.resolveIntent()and persisted M3U archive resolution are implemented, butPlaybackStartRequestis still Live/channel-only.MuxTvPlaybackServiceresolves candidates throughPlaybackCandidateResolver.resolveCandidate(...), so resolving catch-up in presentation before the service would bypass the accepted bounded recovery owner.Architecture
PlaybackStartRequestprovider-neutral and extend it withPlaybackIntent, while preserving the existing Live constructor/source compatibility.RoomPlaybackCatalogresolves archive intent for the exact candidate selected by the service.PlaybackIntentat the player entry point.TDD sequence
PlaybackStartRequest+ Media3 Bundle codec preserveCatchupProgram/CatchupPositionsemantics and keep Live wire compatibility.Acceptance
PlaybackIntent.CatchupProgramwith original EPG start/end;player:media3;Non-goals
Xtream catch-up, local timeshift, DVR, VOD/Series, new provider framework/module, new seek model, new persistent AVD, buffer tuning.