queue/Print: implement sorting
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user