Subsonic API: order directories by name + order tracks by file name when using directory based commands, fixes #589
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "database/MediaLibrary.hpp"
|
#include "database/MediaLibrary.hpp"
|
||||||
#include "database/Session.hpp"
|
#include "database/Session.hpp"
|
||||||
|
#include "database/Types.hpp"
|
||||||
|
|
||||||
#include "IdTypeTraits.hpp"
|
#include "IdTypeTraits.hpp"
|
||||||
#include "PathTraits.hpp"
|
#include "PathTraits.hpp"
|
||||||
@@ -81,6 +82,15 @@ namespace lms::db
|
|||||||
if (params.withNoTrack)
|
if (params.withNoTrack)
|
||||||
query.where("NOT EXISTS (SELECT 1 FROM track t WHERE t.directory_id = d.id)");
|
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;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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_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_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_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_directory_stem_idx ON image(directory_id, stem COLLATE NOCASE)");
|
||||||
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_id_idx ON image(id)");
|
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_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_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_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_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_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)");
|
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_mbid_idx ON track(mbid)");
|
||||||
|
|||||||
@@ -187,6 +187,9 @@ namespace lms::db
|
|||||||
case TrackSortMethod::Name:
|
case TrackSortMethod::Name:
|
||||||
query.orderBy("t.name COLLATE NOCASE");
|
query.orderBy("t.name COLLATE NOCASE");
|
||||||
break;
|
break;
|
||||||
|
case TrackSortMethod::FileName:
|
||||||
|
query.orderBy("t.file_name COLLATE NOCASE");
|
||||||
|
break;
|
||||||
case TrackSortMethod::DateDescAndRelease:
|
case TrackSortMethod::DateDescAndRelease:
|
||||||
query.orderBy("COALESCE(t.date, CAST(t.year AS TEXT)) DESC,t.release_id,t.disc_number,t.track_number");
|
query.orderBy("COALESCE(t.date, CAST(t.year AS TEXT)) DESC,t.release_id,t.disc_number,t.track_number");
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ namespace lms::db
|
|||||||
DirectoryId parentDirectory; // If set, directories that have this parent
|
DirectoryId parentDirectory; // If set, directories that have this parent
|
||||||
bool withNoTrack{}; // If set, directories that do not contain any track
|
bool withNoTrack{}; // If set, directories that do not contain any track
|
||||||
MediaLibraryId mediaLibrary; // If set, directories in this library
|
MediaLibraryId mediaLibrary; // If set, directories in this library
|
||||||
|
DirectorySortMethod sortMethod{ DirectorySortMethod::None };
|
||||||
|
|
||||||
FindParameters& setRange(std::optional<Range> _range)
|
FindParameters& setRange(std::optional<Range> _range)
|
||||||
{
|
{
|
||||||
@@ -92,6 +93,11 @@ namespace lms::db
|
|||||||
mediaLibrary = _mediaLibrary;
|
mediaLibrary = _mediaLibrary;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
FindParameters& setSortMethod(DirectorySortMethod _method)
|
||||||
|
{
|
||||||
|
sortMethod = _method;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// find
|
// find
|
||||||
|
|||||||
@@ -131,6 +131,12 @@ namespace lms::db
|
|||||||
Name,
|
Name,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class DirectorySortMethod
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
Name,
|
||||||
|
};
|
||||||
|
|
||||||
enum class ReleaseSortMethod
|
enum class ReleaseSortMethod
|
||||||
{
|
{
|
||||||
None,
|
None,
|
||||||
@@ -160,6 +166,7 @@ namespace lms::db
|
|||||||
Random,
|
Random,
|
||||||
LastWritten,
|
LastWritten,
|
||||||
StarredDateDesc,
|
StarredDateDesc,
|
||||||
|
FileName,
|
||||||
Name,
|
Name,
|
||||||
DateDescAndRelease,
|
DateDescAndRelease,
|
||||||
Release, // order by disc/track number
|
Release, // order by disc/track number
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ namespace lms::api::subsonic
|
|||||||
{
|
{
|
||||||
Directory::FindParameters params;
|
Directory::FindParameters params;
|
||||||
params.setParentDirectory(parentDirectory->getId());
|
params.setParentDirectory(parentDirectory->getId());
|
||||||
|
params.setSortMethod(DirectorySortMethod::Name);
|
||||||
|
|
||||||
Directory::find(context.dbSession, params, [&](const Directory::pointer& directory) {
|
Directory::find(context.dbSession, params, [&](const Directory::pointer& directory) {
|
||||||
const std::string_view name{ directory->getName() };
|
const std::string_view name{ directory->getName() };
|
||||||
@@ -313,6 +314,7 @@ namespace lms::api::subsonic
|
|||||||
{
|
{
|
||||||
Directory::FindParameters params;
|
Directory::FindParameters params;
|
||||||
params.setParentDirectory(directory->getId());
|
params.setParentDirectory(directory->getId());
|
||||||
|
params.setSortMethod(DirectorySortMethod::Name);
|
||||||
|
|
||||||
Directory::find(context.dbSession, params, [&](const Directory::pointer& subDirectory) {
|
Directory::find(context.dbSession, params, [&](const Directory::pointer& subDirectory) {
|
||||||
const Release::pointer release{ getReleaseFromDirectory(context.dbSession, subDirectory->getId()) };
|
const Release::pointer release{ getReleaseFromDirectory(context.dbSession, subDirectory->getId()) };
|
||||||
@@ -338,6 +340,7 @@ namespace lms::api::subsonic
|
|||||||
{
|
{
|
||||||
Track::FindParameters params;
|
Track::FindParameters params;
|
||||||
params.setDirectory(directory->getId());
|
params.setDirectory(directory->getId());
|
||||||
|
params.setSortMethod(TrackSortMethod::FileName);
|
||||||
|
|
||||||
Track::find(context.dbSession, params, [&](const Track::pointer& track) {
|
Track::find(context.dbSession, params, [&](const Track::pointer& track) {
|
||||||
directoryNode.addArrayChild("child", createSongNode(context, track, context.user));
|
directoryNode.addArrayChild("child", createSongNode(context, track, context.user));
|
||||||
|
|||||||
Reference in New Issue
Block a user