Add support for query-modifier=containers in DACP playqueue-edit

This commit is contained in:
ejurgensen 2014-03-31 01:53:46 +02:00
parent 8740249e05
commit 9efc97d702
3 changed files with 41 additions and 6 deletions

View File

@ -55,6 +55,12 @@ daap_query_parse_sql(const char *daap_query)
char *ret = NULL;
if (!daap_query)
{
DPRINTF(E_LOG, L_DAAP, "DAAP query is null\n");
return NULL;
}
DPRINTF(E_DBG, L_DAAP, "Trying DAAP query -%s-\n", daap_query);
#if ANTLR3C_NEW_INPUT

View File

@ -1314,10 +1314,13 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
struct player_source *ps;
const char *editquery;
const char *queuefilter;
const char *querymodifier;
const char *sort;
const char *param;
char modifiedquery[32];
uint32_t idx;
int mode;
int plid;
int ret;
int quirkyquery;
@ -1347,10 +1350,28 @@ dacp_reply_playqueueedit_add(struct evhttp_request *req, struct evbuffer *evbuf,
queuefilter = evhttp_find_header(query, "queuefilter");
/* Detect the quirky query - a query that needs special treatment */
quirkyquery = (mode == 1) && strstr(editquery, "dmap.itemid:") && ((!queuefilter) || strstr(queuefilter, "(null)"));
querymodifier = evhttp_find_header(query, "query-modifier");
if (!querymodifier || (strcmp(querymodifier, "containers") != 0))
{
quirkyquery = (mode == 1) && strstr(editquery, "dmap.itemid:") && ((!queuefilter) || strstr(queuefilter, "(null)"));
ret = player_queue_make_daap(&ps, editquery, queuefilter, sort, quirkyquery);
}
else
{
// Modify the query: Take the id from the editquery and use it as a queuefilter playlist id
ret = safe_atoi32(strchr(editquery, ':') + 1, &plid);
if (ret < 0)
{
DPRINTF(E_LOG, L_DACP, "Invalid playlist id in request: %s\n", editquery);
dmap_send_error(req, "cacr", "Invalid request");
return;
}
snprintf(modifiedquery, sizeof(modifiedquery), "playlist:%d", plid);
ret = player_queue_make_daap(&ps, NULL, modifiedquery, sort, 0);
}
ret = player_queue_make_daap(&ps, editquery, queuefilter, sort, quirkyquery);
if (ret < 0)
{
DPRINTF(E_LOG, L_DACP, "Could not build song queue\n");
@ -1401,6 +1422,9 @@ dacp_reply_playqueueedit(struct evhttp_request *req, struct evbuffer *evbuf, cha
User selected play (album or artist tab):
?command=add&query='...'&sort=album&mode=1&session-id=...
-> clear queue, play query results
User selected play (playlist):
?command=add&query='dmap.itemid:...'&query-modifier=containers&mode=1&session-id=...
-> clear queue, play playlist with the id specified by itemid
User selected track (album tab):
?command=add&query='dmap.itemid:...'&queuefilter=album:...&sort=album&mode=1&session-id=...
-> clear queue, play itemid and the rest of album

View File

@ -736,9 +736,14 @@ player_queue_make_daap(struct player_source **head, const char *query, const cha
char *s;
char buf[1024];
id = find_first_song_id(query);
if (id < 0)
return -1;
if (query)
{
id = find_first_song_id(query);
if (id < 0)
return -1;
}
else
id = 0;
memset(&qp, 0, sizeof(struct query_params));