diff --git a/lib/provider/proxy_playlist/next_fetcher_mixin.dart b/lib/provider/proxy_playlist/next_fetcher_mixin.dart index 41a88a1a4..daede47f8 100644 --- a/lib/provider/proxy_playlist/next_fetcher_mixin.dart +++ b/lib/provider/proxy_playlist/next_fetcher_mixin.dart @@ -82,6 +82,17 @@ mixin NextFetcher on StateNotifier { } } + List mapSourcesToTracks(List sources) { + final tracks = state.tracks; + + return sources.map((source) { + final track = tracks.firstWhereOrNull( + (track) => makeAppropriateSource(track) == source, + ); + return track!; + }).toList(); + } + /// This method must be called after any playback operation as /// it can increase the latency Future storeTrack(Track track, SpotubeTrack spotubeTrack) async { diff --git a/lib/provider/proxy_playlist/proxy_playlist_provider.dart b/lib/provider/proxy_playlist/proxy_playlist_provider.dart index 89c502dbb..daff20d77 100644 --- a/lib/provider/proxy_playlist/proxy_playlist_provider.dart +++ b/lib/provider/proxy_playlist/proxy_playlist_provider.dart @@ -58,16 +58,34 @@ class ProxyPlaylistNotifier extends StateNotifier audioPlayer.currentIndexChangedStream.listen((index) async { if (index == -1 || index == state.active) return; - final track = state.tracks.elementAtOrNull(index); - if (track == null) return; - notificationService.addTrack(track); - state = state.copyWith(active: index); + final newIndexedTrack = + mapSourcesToTracks([audioPlayer.sources[index]]).firstOrNull; + + if (newIndexedTrack == null) return; + notificationService.addTrack(newIndexedTrack); + state = state.copyWith( + active: state.tracks + .toList() + .indexWhere((element) => element.id == newIndexedTrack.id), + ); if (preferences.albumColorSync) { updatePalette(); } }); + audioPlayer.shuffledStream.listen((event) { + final newlyOrderedTracks = mapSourcesToTracks(audioPlayer.sources); + final newIndex = newlyOrderedTracks.indexWhere( + (element) => element.id == state.activeTrack?.id, + ); + + state = state.copyWith( + tracks: newlyOrderedTracks.toSet(), + active: newIndex, + ); + }); + bool isPreSearching = false; audioPlayer.percentCompletedStream(60).listen((percent) async { if (isPreSearching) return; diff --git a/lib/services/audio_player/mk_state_player.dart b/lib/services/audio_player/mk_state_player.dart index 2cabc55f4..33f7308dc 100644 --- a/lib/services/audio_player/mk_state_player.dart +++ b/lib/services/audio_player/mk_state_player.dart @@ -85,8 +85,6 @@ class MkPlayerWithState extends Player { @override Future setShuffle(bool shuffle) async { _shuffled = shuffle; - await super.setShuffle(shuffle); - _shuffleStream.add(shuffle); if (shuffle) { _tempMedias = _playlist!.medias; final active = _playlist!.medias[_playlist!.index]; @@ -105,6 +103,8 @@ class MkPlayerWithState extends Player { ); _tempMedias = null; } + await super.setShuffle(shuffle); + _shuffleStream.add(shuffle); } @override