From bb92b6083bfa7d216f58ef67ce4ba300f8ef1e28 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Fri, 12 Jun 2026 14:21:12 +0200 Subject: [PATCH] refactor(player): clarify requested vs session-effective media source id --- .../video_player/parts/episode_navigation.dart | 6 +++--- lib/screens/video_player/parts/playback_start.dart | 4 ++-- lib/screens/video_player/parts/seeking.dart | 4 ++-- lib/screens/video_player_screen.dart | 13 +++++++++---- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/screens/video_player/parts/episode_navigation.dart b/lib/screens/video_player/parts/episode_navigation.dart index 592e1e41..dd0b137f 100644 --- a/lib/screens/video_player/parts/episode_navigation.dart +++ b/lib/screens/video_player/parts/episode_navigation.dart @@ -136,12 +136,12 @@ extension _VideoPlayerEpisodeNavigationMethods on VideoPlayerScreenState { final currentSubtitleStreamId = _selectedSourceSubtitleStreamIdForControls(_sourceSubtitleTracksForControls()); final effectiveSubtitleStreamId = newSubtitleStreamId ?? currentSubtitleStreamId; final effectiveMediaSourceId = newMediaIndex != null - ? PlaybackSession.mediaSourceIdForIndex(_availableVersions, effectiveMediaIndex) ?? _selectedMediaSourceId - : _selectedMediaSourceId; + ? PlaybackSession.mediaSourceIdForIndex(_availableVersions, effectiveMediaIndex) ?? _requestedMediaSourceId + : _requestedMediaSourceId; final isVersionChange = effectiveMediaIndex != _effectiveSelectedMediaIndex || - (_selectedMediaSourceId != null && effectiveMediaSourceId != _selectedMediaSourceId); + (_requestedMediaSourceId != null && effectiveMediaSourceId != _requestedMediaSourceId); final isPresetChange = effectivePreset != _selectedQualityPreset; final isAudioChange = effectiveAudioStreamId != _selectedAudioStreamId; final isSubtitleChange = newSubtitleStreamId != null && effectiveSubtitleStreamId != currentSubtitleStreamId; diff --git a/lib/screens/video_player/parts/playback_start.dart b/lib/screens/video_player/parts/playback_start.dart index 43a21d61..4e173044 100644 --- a/lib/screens/video_player/parts/playback_start.dart +++ b/lib/screens/video_player/parts/playback_start.dart @@ -138,7 +138,7 @@ extension _VideoPlayerPlaybackStartMethods on VideoPlayerScreenState { playbackContext = await playbackResolver.resolve( metadata: _currentMetadata, selectedMediaIndex: _effectiveSelectedMediaIndex, - selectedMediaSourceId: _selectedMediaSourceId, + selectedMediaSourceId: _requestedMediaSourceId, offlineLibraryMode: true, qualityPreset: _selectedQualityPreset, selectedAudioStreamId: _selectedAudioStreamId, @@ -174,7 +174,7 @@ extension _VideoPlayerPlaybackStartMethods on VideoPlayerScreenState { PlaybackSession.fromContext( playbackContext, requestedQualityPreset: _selectedQualityPreset, - requestedMediaSourceId: _selectedMediaSourceId, + requestedMediaSourceId: _requestedMediaSourceId, ), ); diff --git a/lib/screens/video_player/parts/seeking.dart b/lib/screens/video_player/parts/seeking.dart index 1adf6fde..86a681c3 100644 --- a/lib/screens/video_player/parts/seeking.dart +++ b/lib/screens/video_player/parts/seeking.dart @@ -65,7 +65,7 @@ extension _VideoPlayerSeekingMethods on VideoPlayerScreenState { final playbackContext = await playbackResolver.resolve( metadata: replacementMetadata, selectedMediaIndex: _effectiveSelectedMediaIndex, - selectedMediaSourceId: _selectedMediaSourceId, + selectedMediaSourceId: _requestedMediaSourceId, offlineLibraryMode: false, qualityPreset: _selectedQualityPreset, selectedAudioStreamId: _selectedAudioStreamId, @@ -84,7 +84,7 @@ extension _VideoPlayerSeekingMethods on VideoPlayerScreenState { final session = PlaybackSession.fromContext( playbackContext, requestedQualityPreset: _selectedQualityPreset, - requestedMediaSourceId: _selectedMediaSourceId, + requestedMediaSourceId: _requestedMediaSourceId, ); final attachesSubsAtOpen = currentPlayer.attachesExternalSubtitlesAtOpen; diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index 8b9deb17..dafa4e52 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -270,7 +270,12 @@ class VideoPlayerScreenState extends State with WidgetsBindin bool _showPlayNextDialog = false; bool _isPhone = false; late int _effectiveSelectedMediaIndex; - String? _selectedMediaSourceId; + + /// Media source id to request on the next resolve: the caller's initial + /// selection, then re-synced to the session's post-fallback effective id + /// by [_commitPlaybackSession]. Post-resolve consumers must read + /// `_playbackSession.mediaSourceId`, never this field. + String? _requestedMediaSourceId; bool get _offlineLibraryMode => widget.isOffline; // Transcode / quality state @@ -454,7 +459,7 @@ class VideoPlayerScreenState extends State with WidgetsBindin void _commitPlaybackSession(PlaybackSession session) { _playbackSession = session; _effectiveSelectedMediaIndex = session.mediaIndex; - _selectedMediaSourceId = session.mediaSourceId; + _requestedMediaSourceId = session.mediaSourceId; _selectedQualityPreset = session.qualityPreset; _selectedAudioStreamId = session.audioStreamId; } @@ -490,7 +495,7 @@ class VideoPlayerScreenState extends State with WidgetsBindin _activeId = widget.metadata.id; _activeMediaIndex = widget.selectedMediaIndex; _effectiveSelectedMediaIndex = widget.selectedMediaIndex; - _selectedMediaSourceId = widget.selectedMediaSourceId; + _requestedMediaSourceId = widget.selectedMediaSourceId; // Reused across in-place quality/version/audio switches so the // server-side transcode session is preserved. @@ -683,7 +688,7 @@ class VideoPlayerScreenState extends State with WidgetsBindin _playbackDataFuture = playbackResolver.resolve( metadata: _currentMetadata, selectedMediaIndex: _effectiveSelectedMediaIndex, - selectedMediaSourceId: _selectedMediaSourceId, + selectedMediaSourceId: _requestedMediaSourceId, offlineLibraryMode: false, qualityPreset: _selectedQualityPreset, selectedAudioStreamId: _selectedAudioStreamId,