New command searchaddpl
Search and add search result to a stored playlist.
This commit is contained in:
parent
16e91baa79
commit
799843cc97
@ -878,6 +878,33 @@ handle_searchadd(struct client *client, int argc, char *argv[])
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum command_return
|
||||||
|
handle_searchaddpl(struct client *client, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
const char *playlist = argv[1];
|
||||||
|
|
||||||
|
struct locate_item_list *list =
|
||||||
|
locate_item_list_parse(argv + 2, argc - 2);
|
||||||
|
|
||||||
|
if (list == NULL || list->length == 0) {
|
||||||
|
if (list != NULL)
|
||||||
|
locate_item_list_free(list);
|
||||||
|
|
||||||
|
command_error(client, ACK_ERROR_ARG, "incorrect arguments");
|
||||||
|
return COMMAND_RETURN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
GError *error = NULL;
|
||||||
|
enum command_return ret =
|
||||||
|
search_add_to_playlist("", playlist, list, &error)
|
||||||
|
? COMMAND_RETURN_OK
|
||||||
|
: print_error(client, error);
|
||||||
|
|
||||||
|
locate_item_list_free(list);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static enum command_return
|
static enum command_return
|
||||||
handle_count(struct client *client, int argc, char *argv[])
|
handle_count(struct client *client, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -2028,6 +2055,7 @@ static const struct command commands[] = {
|
|||||||
{ "save", PERMISSION_CONTROL, 1, 1, handle_save },
|
{ "save", PERMISSION_CONTROL, 1, 1, handle_save },
|
||||||
{ "search", PERMISSION_READ, 2, -1, handle_search },
|
{ "search", PERMISSION_READ, 2, -1, handle_search },
|
||||||
{ "searchadd", PERMISSION_READ, 2, -1, handle_searchadd },
|
{ "searchadd", PERMISSION_READ, 2, -1, handle_searchadd },
|
||||||
|
{ "searchaddpl", PERMISSION_READ, 3, -1, handle_searchaddpl },
|
||||||
{ "seek", PERMISSION_CONTROL, 2, 2, handle_seek },
|
{ "seek", PERMISSION_CONTROL, 2, 2, handle_seek },
|
||||||
{ "seekcur", PERMISSION_CONTROL, 1, 1, handle_seekcur },
|
{ "seekcur", PERMISSION_CONTROL, 1, 1, handle_seekcur },
|
||||||
{ "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid },
|
{ "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid },
|
||||||
|
@ -164,3 +164,46 @@ search_add_songs(struct player_control *pc, const char *uri,
|
|||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct search_add_playlist_data {
|
||||||
|
const char *playlist;
|
||||||
|
const struct locate_item_list *criteria;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool
|
||||||
|
searchaddpl_visitor_song(struct song *song, void *_data,
|
||||||
|
G_GNUC_UNUSED GError **error_r)
|
||||||
|
{
|
||||||
|
struct search_add_playlist_data *data = _data;
|
||||||
|
|
||||||
|
if (!locate_song_search(song, data->criteria))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!spl_append_song(data->playlist, song, error_r))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct db_visitor searchaddpl_visitor = {
|
||||||
|
.song = searchaddpl_visitor_song,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool
|
||||||
|
search_add_to_playlist(const char *uri, const char *path_utf8,
|
||||||
|
const struct locate_item_list *criteria,
|
||||||
|
GError **error_r)
|
||||||
|
{
|
||||||
|
struct locate_item_list *new_list
|
||||||
|
= locate_item_list_casefold(criteria);
|
||||||
|
struct search_add_playlist_data data = {
|
||||||
|
.playlist = path_utf8,
|
||||||
|
.criteria = new_list,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool success = db_walk(uri, &searchaddpl_visitor, &data, error_r);
|
||||||
|
|
||||||
|
locate_item_list_free(new_list);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
@ -47,4 +47,10 @@ bool
|
|||||||
search_add_songs(struct player_control *pc, const char *uri,
|
search_add_songs(struct player_control *pc, const char *uri,
|
||||||
const struct locate_item_list *criteria, GError **error_r);
|
const struct locate_item_list *criteria, GError **error_r);
|
||||||
|
|
||||||
|
gcc_nonnull(1,2,3)
|
||||||
|
bool
|
||||||
|
search_add_to_playlist(const char *uri, const char *path_utf8,
|
||||||
|
const struct locate_item_list *criteria,
|
||||||
|
GError **error_r);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user