From 5f1c51ff6c577635ffe66d0dabc85fd525eb8468 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 2 Mar 2026 07:32:20 +0100 Subject: [PATCH] fix: skip specials in playback order close #601 --- lib/providers/offline_watch_provider.dart | 4 ++++ lib/screens/media_detail_screen.dart | 7 +++++-- lib/screens/video_player_screen.dart | 5 ++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/providers/offline_watch_provider.dart b/lib/providers/offline_watch_provider.dart index da5f7a5a..ef96dfcb 100644 --- a/lib/providers/offline_watch_provider.dart +++ b/lib/providers/offline_watch_provider.dart @@ -99,7 +99,11 @@ class OfflineWatchProvider extends ChangeNotifier { final episodes = _downloadProvider.getDownloadedEpisodesForShow(showRatingKey); if (episodes.isEmpty) return episodes; + // Sort Season 0 (Specials) to the end so regular seasons play first episodes.sort((a, b) { + final aIsSpecial = (a.parentIndex ?? 0) == 0; + final bIsSpecial = (b.parentIndex ?? 0) == 0; + if (aIsSpecial != bIsSpecial) return aIsSpecial ? 1 : -1; final seasonCompare = (a.parentIndex ?? 0).compareTo(b.parentIndex ?? 0); if (seasonCompare != 0) return seasonCompare; return (a.index ?? 0).compareTo(b.index ?? 0); diff --git a/lib/screens/media_detail_screen.dart b/lib/screens/media_detail_screen.dart index 47c18a46..21521060 100644 --- a/lib/screens/media_detail_screen.dart +++ b/lib/screens/media_detail_screen.dart @@ -1677,8 +1677,11 @@ class _MediaDetailScreenState extends State with WatchStateAw return; } - // Get the first season (usually Season 1, but could be Season 0 for specials) - final firstSeason = _seasons.first; + // Skip Season 0 (Specials) — prefer the first regular season + final firstSeason = _seasons.firstWhere( + (s) => (s.index ?? 0) > 0, + orElse: () => _seasons.first, + ); // Get episodes of the first season List episodes; diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index 2980364f..09313a71 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -910,9 +910,12 @@ class VideoPlayerScreenState extends State with WidgetsBindin if (episodes.isEmpty) return; - // Sort by season then episode number + // Sort by season then episode number, with Season 0 (Specials) at the end final sorted = List.from(episodes) ..sort((a, b) { + final aIsSpecial = (a.parentIndex ?? 0) == 0; + final bIsSpecial = (b.parentIndex ?? 0) == 0; + if (aIsSpecial != bIsSpecial) return aIsSpecial ? 1 : -1; final seasonCmp = (a.parentIndex ?? 0).compareTo(b.parentIndex ?? 0); if (seasonCmp != 0) return seasonCmp; return (a.index ?? 0).compareTo(b.index ?? 0);