Hello,

searchadd<tag> <search_term> - adds search results to current playlist (similar to command findadd)

searchaddpl<playlist> <tag> <search_term> - adds search results to a stored playlist


Use case: search for tracks/songs to add to the play queue or to a stored playlist.

I think this use case is very useful for clients. And when the search results are numerous it is less efficient to implement with the existing API.

Hope you find it useful.

Yoav


New command searchaddpl

From: geneticdrift <geneticdr...@iotide.com>

Search and add search result to a stored playlist.
---
 src/command.c |   27 +++++++++++++++++++++++++++
 src/dbUtils.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+)

diff --git a/src/command.c b/src/command.c
index 65e4457..32ac824 100644
--- a/src/command.c
+++ b/src/command.c
@@ -878,6 +878,32 @@ handle_searchadd(struct client *client, int argc, char 
*argv[])
 }
 
 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 = searchAddInToStoredPlaylist("", playlist, 
list, &error)
+               ? COMMAND_RETURN_OK
+               : print_error(client, error);
+
+       locate_item_list_free(list);
+
+       return ret;
+}
+
+static enum command_return
 handle_count(struct client *client, int argc, char *argv[])
 {
        struct locate_item_list *list =
@@ -2027,6 +2053,7 @@ static const struct command commands[] = {
        { "save", PERMISSION_CONTROL, 1, 1, handle_save },
        { "search", PERMISSION_READ, 2, -1, handle_search },
        { "searchadd", PERMISSION_READ, 2, -1, handle_searchadd },
+       { "searchaddpl", PERMISSION_READ, 3, -1, handle_searchaddpl },
        { "seek", PERMISSION_CONTROL, 2, 2, handle_seek },
        { "seekcur", PERMISSION_CONTROL, 1, 1, handle_seekcur },
        { "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid },
diff --git a/src/dbUtils.c b/src/dbUtils.c
index 0b7a678..e3f3642 100644
--- a/src/dbUtils.c
+++ b/src/dbUtils.c
@@ -172,3 +172,47 @@ searchAddForSongsIn(struct player_control *pc, const char 
*name,
        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
+searchAddInToStoredPlaylist(const char *name,
+               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;
+
+       data.playlist = path_utf8;
+       data.criteria = new_list;
+
+       bool success = db_walk(name, &searchaddpl_visitor, &data, error_r);
+
+       locate_item_list_free(new_list);
+
+       return success;
+}
+
New command searchadd similar to command findadd.

From: geneticdrift <geneticdr...@iotide.com>


---
 src/command.c |   25 +++++++++++++++++++++++++
 src/dbUtils.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/dbUtils.h |    5 +++++
 3 files changed, 80 insertions(+)

diff --git a/src/command.c b/src/command.c
index 7d44033..65e4457 100644
--- a/src/command.c
+++ b/src/command.c
@@ -854,6 +854,30 @@ handle_search(struct client *client, int argc, char 
*argv[])
 }
 
 static enum command_return
+handle_searchadd(struct client *client, int argc, char *argv[])
+{
+       struct locate_item_list *list =
+               locate_item_list_parse(argv + 1, argc - 1);
+
+       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 = searchAddForSongsIn(client->player_control, 
"", list, &error)
+               ? COMMAND_RETURN_OK
+               : print_error(client, error);
+
+       locate_item_list_free(list);
+
+       return ret;
+}
+
+static enum command_return
 handle_count(struct client *client, int argc, char *argv[])
 {
        struct locate_item_list *list =
@@ -2002,6 +2026,7 @@ static const struct command commands[] = {
        { "rm", PERMISSION_CONTROL, 1, 1, handle_rm },
        { "save", PERMISSION_CONTROL, 1, 1, handle_save },
        { "search", PERMISSION_READ, 2, -1, handle_search },
+       { "searchadd", PERMISSION_READ, 2, -1, handle_searchadd },
        { "seek", PERMISSION_CONTROL, 2, 2, handle_seek },
        { "seekcur", PERMISSION_CONTROL, 1, 1, handle_seekcur },
        { "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid },
diff --git a/src/dbUtils.c b/src/dbUtils.c
index 827d0a0..0b7a678 100644
--- a/src/dbUtils.c
+++ b/src/dbUtils.c
@@ -122,3 +122,53 @@ findAddIn(struct player_control *pc, const char *name,
 
        return db_walk(name, &find_add_visitor, &data, error_r);
 }
+
+struct search_add_data {
+       struct player_control *pc;
+       const struct locate_item_list *criteria;
+};
+
+static bool
+searchadd_visitor_song(struct song *song, void *_data,
+                   G_GNUC_UNUSED GError **error_r)
+{
+       struct search_add_data *data = _data;
+
+       if (!locate_song_search(song, data->criteria))
+               return true;
+
+       enum playlist_result result =
+               playlist_append_song(&g_playlist, data->pc,
+                                        song, NULL);
+       if (result != PLAYLIST_RESULT_SUCCESS) {
+               g_set_error(error_r, playlist_quark(), result,
+                               "Playlist error");
+               return false;
+       }
+
+       return true;
+}
+
+static const struct db_visitor searchadd_visitor = {
+       .song = searchadd_visitor_song,
+};
+
+bool
+searchAddForSongsIn(struct player_control *pc, const char *name,
+                const struct locate_item_list *criteria,
+                GError **error_r)
+{
+       struct locate_item_list *new_list
+               = locate_item_list_casefold(criteria);
+       struct search_add_data data;
+
+       data.pc = pc;
+       data.criteria = new_list;
+
+       bool success = db_walk(name, &searchadd_visitor, &data, error_r);
+
+       locate_item_list_free(new_list);
+
+       return success;
+}
+
diff --git a/src/dbUtils.h b/src/dbUtils.h
index 4059465..41a788f 100644
--- a/src/dbUtils.h
+++ b/src/dbUtils.h
@@ -42,4 +42,9 @@ bool
 findAddIn(struct player_control *pc, const char *name,
          const struct locate_item_list *criteria, GError **error_r);
 
+gcc_nonnull(1,2,3)
+bool
+searchAddForSongsIn(struct player_control *pc, const char *name,
+                const struct locate_item_list *criteria, GError **error_r);
+
 #endif
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team

Reply via email to