diff --git a/src/libs/database/impl/Artist.cpp b/src/libs/database/impl/Artist.cpp index 7c46386c..bb070c5d 100644 --- a/src/libs/database/impl/Artist.cpp +++ b/src/libs/database/impl/Artist.cpp @@ -133,10 +133,13 @@ namespace lms::db { case ArtistSortMethod::None: break; - case ArtistSortMethod::ByName: + case ArtistSortMethod::Id: + query.orderBy("a.id"); + break; + case ArtistSortMethod::Name: query.orderBy("a.name COLLATE NOCASE"); break; - case ArtistSortMethod::BySortName: + case ArtistSortMethod::SortName: query.orderBy("a.sort_name COLLATE NOCASE"); break; case ArtistSortMethod::Random: diff --git a/src/libs/database/impl/Release.cpp b/src/libs/database/impl/Release.cpp index 9e1f8217..23997c67 100644 --- a/src/libs/database/impl/Release.cpp +++ b/src/libs/database/impl/Release.cpp @@ -168,6 +168,9 @@ namespace lms::db { case ReleaseSortMethod::None: break; + case ReleaseSortMethod::Id: + query.orderBy("r.id"); + break; case ReleaseSortMethod::Name: query.orderBy("r.name COLLATE NOCASE"); break; diff --git a/src/libs/database/impl/Track.cpp b/src/libs/database/impl/Track.cpp index f2552dbb..5a459397 100644 --- a/src/libs/database/impl/Track.cpp +++ b/src/libs/database/impl/Track.cpp @@ -153,6 +153,9 @@ namespace lms::db { case TrackSortMethod::None: break; + case TrackSortMethod::Id: + query.orderBy("t.id"); + break; case TrackSortMethod::LastWritten: query.orderBy("t.file_last_write DESC"); break; diff --git a/src/libs/database/include/database/Types.hpp b/src/libs/database/include/database/Types.hpp index e9cc5a2a..506355b4 100644 --- a/src/libs/database/include/database/Types.hpp +++ b/src/libs/database/include/database/Types.hpp @@ -108,8 +108,9 @@ namespace lms::db enum class ArtistSortMethod { None, - ByName, - BySortName, + Id, + Name, + SortName, Random, LastWritten, StarredDateDesc, @@ -118,6 +119,7 @@ namespace lms::db enum class ReleaseSortMethod { None, + Id, Name, ArtistNameThenName, Date, @@ -138,6 +140,7 @@ namespace lms::db enum class TrackSortMethod { None, + Id, Random, LastWritten, StarredDateDesc, diff --git a/src/libs/database/test/Artist.cpp b/src/libs/database/test/Artist.cpp index bd486544..49d3e729 100644 --- a/src/libs/database/test/Artist.cpp +++ b/src/libs/database/test/Artist.cpp @@ -588,21 +588,21 @@ namespace lms::db::tests } { - const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"MyArtist%"}).setSortMethod(ArtistSortMethod::ByName)) }; + const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"MyArtist%"}).setSortMethod(ArtistSortMethod::Name)) }; ASSERT_EQ(artists.results.size(), 2); EXPECT_EQ(artists.results[0], artist1.getId()); EXPECT_EQ(artists.results[1], artist4.getId()); } { - const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"%MyArtist"}).setSortMethod(ArtistSortMethod::ByName)) }; + const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"%MyArtist"}).setSortMethod(ArtistSortMethod::Name)) }; ASSERT_EQ(artists.results.size(), 2); EXPECT_EQ(artists.results[0], artist2.getId()); EXPECT_EQ(artists.results[1], artist5.getId()); } { - const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"_MyArtist"}).setSortMethod(ArtistSortMethod::ByName)) }; + const auto artists{ Artist::findIds(session, Artist::FindParameters {}.setKeywords({"_MyArtist"}).setSortMethod(ArtistSortMethod::Name)) }; ASSERT_EQ(artists.results.size(), 1); EXPECT_EQ(artists.results[0], artist3.getId()); } @@ -624,8 +624,8 @@ namespace lms::db::tests { auto transaction{ session.createReadTransaction() }; - auto allArtistsByName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::ByName)) }; - auto allArtistsBySortName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::BySortName)) }; + auto allArtistsByName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::Name)) }; + auto allArtistsBySortName{ Artist::findIds(session, Artist::FindParameters {}.setSortMethod(ArtistSortMethod::SortName)) }; ASSERT_EQ(allArtistsByName.results.size(), 2); EXPECT_EQ(allArtistsByName.results.front(), artistA.getId()); diff --git a/src/libs/services/scanner/impl/ScanStepAnalyze.cpp b/src/libs/services/scanner/impl/ScanStepAnalyze.cpp index 91731641..f7101db9 100644 --- a/src/libs/services/scanner/impl/ScanStepAnalyze.cpp +++ b/src/libs/services/scanner/impl/ScanStepAnalyze.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Emeric Poupon + * Copyright (C) 2024 Emeric Poupon * * This file is part of LMS. * diff --git a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp index 3aecebcd..ec43f5d2 100644 --- a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp +++ b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp @@ -197,7 +197,7 @@ namespace lms::api::subsonic { feedback::IFeedbackService::ArtistFindParameters artistFindParams; artistFindParams.setUser(context.userId); - artistFindParams.setSortMethod(ArtistSortMethod::BySortName); + artistFindParams.setSortMethod(ArtistSortMethod::SortName); for (const ArtistId artistId : feedbackService.findStarredArtists(artistFindParams).results) { if (auto artist{ Artist::find(context.dbSession, artistId) }) diff --git a/src/libs/subsonic/impl/entrypoints/Browsing.cpp b/src/libs/subsonic/impl/entrypoints/Browsing.cpp index c85797c9..19d4777b 100644 --- a/src/libs/subsonic/impl/entrypoints/Browsing.cpp +++ b/src/libs/subsonic/impl/entrypoints/Browsing.cpp @@ -109,7 +109,7 @@ namespace lms::api::subsonic if (!user) throw UserNotAuthorizedError{}; - parameters.setSortMethod(ArtistSortMethod::BySortName); + parameters.setSortMethod(ArtistSortMethod::SortName); switch (user->getSubsonicArtistListMode()) { case SubsonicArtistListMode::AllArtists: @@ -329,7 +329,7 @@ namespace lms::api::subsonic directoryNode.setAttribute("name", "Music"); // TODO: this does not scale when a lot of artists are present - Artist::find(context.dbSession, Artist::FindParameters{}.setSortMethod(ArtistSortMethod::BySortName), [&](const Artist::pointer& artist) + Artist::find(context.dbSession, Artist::FindParameters{}.setSortMethod(ArtistSortMethod::SortName), [&](const Artist::pointer& artist) { directoryNode.addArrayChild("child", createArtistNode(context, artist, user, false /* no id3 */)); }); diff --git a/src/libs/subsonic/impl/entrypoints/Searching.cpp b/src/libs/subsonic/impl/entrypoints/Searching.cpp index 502dd28d..6d672428 100644 --- a/src/libs/subsonic/impl/entrypoints/Searching.cpp +++ b/src/libs/subsonic/impl/entrypoints/Searching.cpp @@ -132,6 +132,7 @@ namespace lms::api::subsonic params.setKeywords(keywords); params.setRange(Range{ artistOffset, artistCount }); params.setMediaLibrary(mediaLibrary); + params.setSortMethod(ArtistSortMethod::Id); // must be consistent with both methods Artist::find(context.dbSession, params, [&](const Artist::pointer& artist) { @@ -197,6 +198,7 @@ namespace lms::api::subsonic params.setKeywords(keywords); params.setRange(Range{ albumOffset, albumCount }); params.setMediaLibrary(mediaLibrary); + params.setSortMethod(ReleaseSortMethod::Id); // must be consistent with both methods Release::find(context.dbSession, params, [&](const Release::pointer& release) { @@ -262,6 +264,7 @@ namespace lms::api::subsonic params.setKeywords(keywords); params.setRange(Range{ songOffset, songCount }); params.setMediaLibrary(mediaLibrary); + params.setSortMethod(TrackSortMethod::Id); // must be consistent with both methods Track::find(context.dbSession, params, [&](const Track::pointer& track) { diff --git a/src/lms/ui/explore/ArtistCollector.cpp b/src/lms/ui/explore/ArtistCollector.cpp index 91f464da..d927c86b 100644 --- a/src/lms/ui/explore/ArtistCollector.cpp +++ b/src/lms/ui/explore/ArtistCollector.cpp @@ -119,7 +119,7 @@ namespace lms::ui Artist::FindParameters params; params.setClusters(getFilters().getClusterIds()); params.setLinkType(_linkType); - params.setSortMethod(ArtistSortMethod::BySortName); + params.setSortMethod(ArtistSortMethod::SortName); params.setRange(range); {