queue/Print: implement sorting

This commit is contained in:
Max Kellermann
2022-02-14 06:39:39 +01:00
parent 166ce0da5a
commit c3be961ccf
5 changed files with 119 additions and 3 deletions

View File

@@ -24,6 +24,7 @@
#include "protocol/RangeArg.hxx"
#include "db/DatabaseQueue.hxx"
#include "db/Selection.hxx"
#include "tag/ParseName.hxx"
#include "song/Filter.hxx"
#include "SongLoader.hxx"
#include "song/DetachedSong.hxx"
@@ -286,6 +287,19 @@ handle_playlistid(Client &client, Request args, Response &r)
return CommandResult::OK;
}
static TagType
ParseSortTag(const char *s)
{
if (StringIsEqualIgnoreCase(s, "Last-Modified"))
return TagType(SORT_TAG_LAST_MODIFIED);
TagType tag = tag_name_parse_i(s);
if (tag == TAG_NUM_OF_ITEM_TYPES)
throw ProtocolError(ACK_ERROR_ARG, "Unknown sort tag");
return tag;
}
static CommandResult
handle_playlist_match(Client &client, Request args, Response &r,
bool fold_case)
@@ -298,6 +312,21 @@ handle_playlist_match(Client &client, Request args, Response &r,
args.pop_back();
}
TagType sort = TAG_NUM_OF_ITEM_TYPES;
bool descending = false;
if (args.size >= 2 && StringIsEqual(args[args.size - 2], "sort")) {
const char *s = args.back();
if (*s == '-') {
descending = true;
++s;
}
sort = ParseSortTag(s);
args.pop_back();
args.pop_back();
}
SongFilter filter;
try {
filter.Parse(args, fold_case);
@@ -311,6 +340,8 @@ handle_playlist_match(Client &client, Request args, Response &r,
QueueSelection selection;
selection.filter = &filter;
selection.window = window;
selection.sort = sort;
selection.descending = descending;
playlist_print_find(r, client.GetPlaylist(), selection);
return CommandResult::OK;