Subsonic API: order directories by name + order tracks by file name when using directory based commands, fixes #589

This commit is contained in:
emeric
2025-01-08 14:05:34 +01:00
parent 10d900faf2
commit dd163f04c8
6 changed files with 31 additions and 0 deletions
+10
View File
@@ -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;
}
+2
View File
@@ -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)");
+3
View File
@@ -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;
@@ -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> _range)
{
@@ -92,6 +93,11 @@ namespace lms::db
mediaLibrary = _mediaLibrary;
return *this;
}
FindParameters& setSortMethod(DirectorySortMethod _method)
{
sortMethod = _method;
return *this;
}
};
// find
@@ -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
@@ -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));