From d291ae4bce7433913d5e0f88d916ba0dca6cfb63 Mon Sep 17 00:00:00 2001 From: G1org1owo <77230371+G1org1owo@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:51:51 +0100 Subject: [PATCH] Move tracks already in queue to head of queue when pressing play next --- lib/provider/audio_player/audio_player.dart | 39 +++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/lib/provider/audio_player/audio_player.dart b/lib/provider/audio_player/audio_player.dart index 66878714..23912b3c 100644 --- a/lib/provider/audio_player/audio_player.dart +++ b/lib/provider/audio_player/audio_player.dart @@ -228,24 +228,43 @@ class AudioPlayerNotifier extends Notifier { final addableTracks = _blacklist .filter(tracks) - .where( - (track) => - allowDuplicates || - !state.tracks.any((element) => _compareTracks(element, track)), - ) .toList(); + final remainingTracks = state.tracks.where( + (track) => + allowDuplicates || + !addableTracks.any((element) => _compareTracks(element, track)) + ) + .toList(); + state = state.copyWith( - tracks: [...addableTracks, ...state.tracks], + tracks: [...addableTracks, ...remainingTracks], ); for (int i = 0; i < addableTracks.length; i++) { final track = addableTracks.elementAt(i); - await audioPlayer.addTrackAt( - SpotubeMedia(track), - max(state.currentIndex, 0) + i + 1, - ); + final (currentIndex, _) = remainingTracks + .indexed + .cast<(int, SpotubeTrackObject?)>() + .firstWhere( + (record) { + final (idx, element) = record; + return _compareTracks(element!, track); + }, + orElse: () => (-1, null) + ); + + final newIndex = max(state.currentIndex, 0) + i + 1; + + if (allowDuplicates || newIndex < 0) { + await audioPlayer.addTrackAt( + SpotubeMedia(track), + newIndex + ); + } else { + await audioPlayer.moveTrack(currentIndex, newIndex); + } } await _updatePlayerState(