refactor: extract TrackManager, fix subtitle bugs

- Extract track lifecycle logic from VideoPlayerScreen (3248→2928 lines) into TrackManager
- Parse isDefault/isForced for subtitle tracks in parseTrackList
- Emit forced flag from ExoPlayer's emitTrackList
- Fix detectSubtitleMimeType failing on URLs with query params
- Add missing external_ ID prefix in ExoPlayer addSubtitleTrack
- Replace polling loop with stream in selectAndApplyTracks
- Handle play() failure in resumeAfterSubtitleLoad
- Handle addExternalSubtitles failure in onBackendSwitched
This commit is contained in:
edde746
2026-03-20 03:32:32 +01:00
parent d64c72f40e
commit 2d37d37596
9 changed files with 562 additions and 447 deletions
+11 -4
View File
@@ -1,3 +1,5 @@
import 'dart:async';
import '../mpv/mpv.dart';
import '../models/plex_media_info.dart';
@@ -640,10 +642,15 @@ class TrackSelectionService {
Function(SubtitleTrack)? onSubtitleTrackChanged,
}) async {
// Wait for tracks to be loaded
int attempts = 0;
while (player.state.tracks.audio.isEmpty && player.state.tracks.subtitle.isEmpty && attempts < 100) {
await Future.delayed(const Duration(milliseconds: 100));
attempts++;
if (player.state.tracks.audio.isEmpty && player.state.tracks.subtitle.isEmpty) {
try {
await player.streams.tracks
.where((t) => t.audio.isNotEmpty || t.subtitle.isNotEmpty)
.first
.timeout(const Duration(seconds: 10));
} catch (_) {
// Timeout or stream closed — proceed with whatever state we have
}
}
if (player.disposed) return;