refactor(player): clarify requested vs session-effective media source id

This commit is contained in:
edde746
2026-06-12 14:21:12 +02:00
parent acdae74587
commit bb92b6083b
4 changed files with 16 additions and 11 deletions
@@ -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;
@@ -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,
),
);
+2 -2
View File
@@ -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;
+9 -4
View File
@@ -270,7 +270,12 @@ class VideoPlayerScreenState extends State<VideoPlayerScreen> 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<VideoPlayerScreen> 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<VideoPlayerScreen> 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<VideoPlayerScreen> with WidgetsBindin
_playbackDataFuture = playbackResolver.resolve(
metadata: _currentMetadata,
selectedMediaIndex: _effectiveSelectedMediaIndex,
selectedMediaSourceId: _selectedMediaSourceId,
selectedMediaSourceId: _requestedMediaSourceId,
offlineLibraryMode: false,
qualityPreset: _selectedQualityPreset,
selectedAudioStreamId: _selectedAudioStreamId,