From a287d6b815fd4bf44bc9cfebf5394f81eb5b45dd Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 13 Jul 2026 21:20:37 +0700 Subject: [PATCH] fix(playlists): keep imported playlist track order (#482) Playlist tracks were read newest-first (added_at DESC, rowid DESC), so a batch import - inserted in playlist order with one timestamp - came back reversed, and the in-memory prepend matched that. Playlists now use insertion order: snapshot reads ASC, single adds append, and batch adds append in order. Existing rows were already stored in playlist order, so old libraries display correctly without migration. The preview-cover query follows the first visible track. --- lib/providers/library_collections_provider.dart | 5 +++-- lib/services/library_collections_database.dart | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/providers/library_collections_provider.dart b/lib/providers/library_collections_provider.dart index aff18c42..a0628b90 100644 --- a/lib/providers/library_collections_provider.dart +++ b/lib/providers/library_collections_provider.dart @@ -803,7 +803,7 @@ class LibraryCollectionsNotifier extends Notifier { final changed = _replacePlaylistById(playlistId, (playlist) { if (playlist.containsTrackKey(key)) return playlist; return playlist.copyWith( - tracks: [entry, ...playlist.tracks], + tracks: [...playlist.tracks, entry], updatedAt: now, ); }); @@ -864,7 +864,8 @@ class LibraryCollectionsNotifier extends Notifier { ); final changed = _replacePlaylistById(playlistId, (current) { return current.copyWith( - tracks: [...entriesToAdd.reversed, ...current.tracks], + // Append in playlist order, matching the ASC snapshot ordering. + tracks: [...current.tracks, ...entriesToAdd], updatedAt: now, ); }); diff --git a/lib/services/library_collections_database.dart b/lib/services/library_collections_database.dart index 189f2f57..28eea531 100644 --- a/lib/services/library_collections_database.dart +++ b/lib/services/library_collections_database.dart @@ -269,7 +269,10 @@ class LibraryCollectionsDatabase { ); final playlistTrackRows = await db.query( _tablePlaylistTracks, - orderBy: 'playlist_id ASC, added_at DESC, rowid DESC', + // Playlists keep playlist order: batch imports insert rows in playlist + // order and later additions append, so insertion order IS the order + // (unlike wishlist/loved, which show newest first). + orderBy: 'playlist_id ASC, added_at ASC, rowid ASC', ); final favoriteArtistRows = await db.query( _tableFavoriteArtists, @@ -348,7 +351,7 @@ class LibraryCollectionsDatabase { SELECT inner_tracks.rowid FROM $_tablePlaylistTracks inner_tracks WHERE inner_tracks.playlist_id = outer_tracks.playlist_id - ORDER BY inner_tracks.added_at DESC, inner_tracks.rowid DESC + ORDER BY inner_tracks.added_at ASC, inner_tracks.rowid ASC LIMIT 1 ) ''', playlistIdsNeedingPreview);