diff --git a/src/libs/database/impl/Directory.cpp b/src/libs/database/impl/Directory.cpp index af4a1b6e..d335cace 100644 --- a/src/libs/database/impl/Directory.cpp +++ b/src/libs/database/impl/Directory.cpp @@ -21,6 +21,7 @@ #include "database/MediaLibrary.hpp" #include "database/Session.hpp" +#include "database/Types.hpp" #include "IdTypeTraits.hpp" #include "PathTraits.hpp" @@ -81,6 +82,15 @@ namespace lms::db if (params.withNoTrack) query.where("NOT EXISTS (SELECT 1 FROM track t WHERE t.directory_id = d.id)"); + switch (params.sortMethod) + { + case DirectorySortMethod::None: + break; + case DirectorySortMethod::Name: + query.orderBy("name COLLATE NOCASE"); + break; + } + return query; } diff --git a/src/libs/database/impl/Session.cpp b/src/libs/database/impl/Session.cpp index 2cb88d37..da854cd1 100644 --- a/src/libs/database/impl/Session.cpp +++ b/src/libs/database/impl/Session.cpp @@ -202,6 +202,7 @@ namespace lms::db utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_parent_directory_idx ON directory(parent_directory_id)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_path_idx ON directory(absolute_path)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_media_library_idx ON directory(media_library_id)"); + utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS directory_name_idx ON directory(name COLLATE NOCASE)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_directory_stem_idx ON image(directory_id, stem COLLATE NOCASE)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_id_idx ON image(id)"); @@ -239,6 +240,7 @@ namespace lms::db utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_directory_release_idx ON track(directory_id, release_id);"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_directory_file_stem_idx ON track(directory_id, file_stem);"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_file_last_write_idx ON track(file_last_write)"); + utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_file_name_idx ON track(file_name COLLATE NOCASE)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_media_library_idx ON track(media_library_id)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_media_library_release_idx ON track(media_library_id, release_id)"); utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_mbid_idx ON track(mbid)"); diff --git a/src/libs/database/impl/Track.cpp b/src/libs/database/impl/Track.cpp index 967b4ff0..a2cbecd3 100644 --- a/src/libs/database/impl/Track.cpp +++ b/src/libs/database/impl/Track.cpp @@ -187,6 +187,9 @@ namespace lms::db case TrackSortMethod::Name: query.orderBy("t.name COLLATE NOCASE"); break; + case TrackSortMethod::FileName: + query.orderBy("t.file_name COLLATE NOCASE"); + break; case TrackSortMethod::DateDescAndRelease: query.orderBy("COALESCE(t.date, CAST(t.year AS TEXT)) DESC,t.release_id,t.disc_number,t.track_number"); break; diff --git a/src/libs/database/include/database/Directory.hpp b/src/libs/database/include/database/Directory.hpp index 31ee3033..45f17743 100644 --- a/src/libs/database/include/database/Directory.hpp +++ b/src/libs/database/include/database/Directory.hpp @@ -55,6 +55,7 @@ namespace lms::db DirectoryId parentDirectory; // If set, directories that have this parent bool withNoTrack{}; // If set, directories that do not contain any track MediaLibraryId mediaLibrary; // If set, directories in this library + DirectorySortMethod sortMethod{ DirectorySortMethod::None }; FindParameters& setRange(std::optional _range) { @@ -92,6 +93,11 @@ namespace lms::db mediaLibrary = _mediaLibrary; return *this; } + FindParameters& setSortMethod(DirectorySortMethod _method) + { + sortMethod = _method; + return *this; + } }; // find diff --git a/src/libs/database/include/database/Types.hpp b/src/libs/database/include/database/Types.hpp index 151a4791..851e88d8 100644 --- a/src/libs/database/include/database/Types.hpp +++ b/src/libs/database/include/database/Types.hpp @@ -131,6 +131,12 @@ namespace lms::db Name, }; + enum class DirectorySortMethod + { + None, + Name, + }; + enum class ReleaseSortMethod { None, @@ -160,6 +166,7 @@ namespace lms::db Random, LastWritten, StarredDateDesc, + FileName, Name, DateDescAndRelease, Release, // order by disc/track number diff --git a/src/libs/subsonic/impl/endpoints/Browsing.cpp b/src/libs/subsonic/impl/endpoints/Browsing.cpp index aa5a25fe..8cdf0ae3 100644 --- a/src/libs/subsonic/impl/endpoints/Browsing.cpp +++ b/src/libs/subsonic/impl/endpoints/Browsing.cpp @@ -88,6 +88,7 @@ namespace lms::api::subsonic { Directory::FindParameters params; params.setParentDirectory(parentDirectory->getId()); + params.setSortMethod(DirectorySortMethod::Name); Directory::find(context.dbSession, params, [&](const Directory::pointer& directory) { const std::string_view name{ directory->getName() }; @@ -313,6 +314,7 @@ namespace lms::api::subsonic { Directory::FindParameters params; params.setParentDirectory(directory->getId()); + params.setSortMethod(DirectorySortMethod::Name); Directory::find(context.dbSession, params, [&](const Directory::pointer& subDirectory) { const Release::pointer release{ getReleaseFromDirectory(context.dbSession, subDirectory->getId()) }; @@ -338,6 +340,7 @@ namespace lms::api::subsonic { Track::FindParameters params; params.setDirectory(directory->getId()); + params.setSortMethod(TrackSortMethod::FileName); Track::find(context.dbSession, params, [&](const Track::pointer& track) { directoryNode.addArrayChild("child", createSongNode(context, track, context.user));