fix(portals): fifth review round on the cinematic details

- Stalker movie and series menu launches in MPV/VLC close the title's
  own running external session first through the new shared
  replaceOwnedExternalSession(), cancelling when teardown is not
  confirmed or the selection moved on.
- The reset-progress row is disabled while an external player owns the
  position, on the shared and the Xtream movie menus.
- Every ISO comma-bearing country name stays whole in provider lists.
- The dashboard hero spec competes a favorite movie for a slot so the
  movie-title case is actually exercised.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5.1 committed 2026-10-03 11:19:22 +02:00
1 parent 026a69c14e
commit 87cc85a54f
14 files changed
+245 -20

No files matched your search

@@ -114,6 +114,9 @@ export function createVodDetailsHeroState(deps: VodDetailsHeroStateDeps) {
hasPlaybackPosition: deps.hasPlaybackPosition(),
hasStoredProgress:
(deps.playbackPosition() ?? 0) > 0 || deps.isWatched(),
// Inline playback collapses the hero; only an external
// player can still own the row while the menu is reachable.
playbackActive: deps.externalState() !== 'idle',
})
),
};
@@ -164,6 +164,8 @@ export function buildVodMenuSections(input: {
externalPlayerHint: 'MPV' | 'VLC';
hasPlaybackPosition: boolean;
hasStoredProgress: boolean;
/** An external player owns the row: its next tick would undo a reset. */
playbackActive: boolean;
}): VodMoreMenuSection[] {
const sourceRows: VodMoreMenuSection['items'][number][] = [];
if (input.externalPlayerAvailable) {
@@ -189,6 +191,7 @@ export function buildVodMenuSections(input: {
id: VOD_DETAILS_MENU_ACTION.ResetProgress,
labelKey: 'PORTALS.DETAIL.RESET_PROGRESS',
icon: 'history_toggle_off',
disabled: input.playbackActive,
testId: 'vod-menu-reset-progress',
});
}