[mpd] fixes for commands noidle, list (handle special case with second

argument 'album'), addid (sql error if virtual path contains
character ') and fix error messages in various commands
This commit is contained in:
chme 2015-02-24 19:24:53 +01:00
parent a7f15eadd3
commit 4a1bff500a
2 changed files with 36 additions and 29 deletions

View File

@ -885,7 +885,7 @@ mpd_command_next(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Player returned an error for start after nextitem\n"); DPRINTF(E_LOG, L_MPD, "Player returned an error for start after nextitem\n");
ret = asprintf(errmsg, "Player returned an error for start after nextitem\n"); ret = asprintf(errmsg, "Player returned an error for start after nextitem");
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1079,7 +1079,7 @@ mpd_command_previous(struct evbuffer *evbuf, int argc, char **argv, char **errms
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Player returned an error for start after previtem\n"); DPRINTF(E_LOG, L_MPD, "Player returned an error for start after previtem\n");
ret = asprintf(errmsg, "Player returned an error for start after previtem\n"); ret = asprintf(errmsg, "Player returned an error for start after previtem");
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1124,7 +1124,7 @@ mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (songpos != 0) if (songpos != 0)
{ {
DPRINTF(E_LOG, L_MPD, "Given song is not the current playing one, seeking is not supported\n"); DPRINTF(E_LOG, L_MPD, "Given song is not the current playing one, seeking is not supported\n");
ret = asprintf(errmsg, "Given song is not the current playing one, seeking is not supported\n"); ret = asprintf(errmsg, "Given song is not the current playing one, seeking is not supported");
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1138,7 +1138,7 @@ mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_DBG, L_MPD, "Failed to seek current song to time %d msec\n", seek_target_msec); DPRINTF(E_DBG, L_MPD, "Failed to seek current song to time %d msec\n", seek_target_msec);
ret = asprintf(errmsg, "Failed to seek current song to time %d msec\n", seek_target_msec); ret = asprintf(errmsg, "Failed to seek current song to time %d msec", seek_target_msec);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1148,7 +1148,7 @@ mpd_command_seek(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Player returned an error for start after seekcur\n"); DPRINTF(E_LOG, L_MPD, "Player returned an error for start after seekcur\n");
ret = asprintf(errmsg, "Player returned an error for start after seekcur\n"); ret = asprintf(errmsg, "Player returned an error for start after seekcur");
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1195,7 +1195,7 @@ mpd_command_seekid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (status.id != id) if (status.id != id)
{ {
DPRINTF(E_LOG, L_MPD, "Given song is not the current playing one, seeking is not supported\n"); DPRINTF(E_LOG, L_MPD, "Given song is not the current playing one, seeking is not supported\n");
ret = asprintf(errmsg, "Given song is not the current playing one, seeking is not supported\n"); ret = asprintf(errmsg, "Given song is not the current playing one, seeking is not supported");
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1209,7 +1209,7 @@ mpd_command_seekid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_DBG, L_MPD, "Failed to seek current song to time %d msec\n", seek_target_msec); DPRINTF(E_DBG, L_MPD, "Failed to seek current song to time %d msec\n", seek_target_msec);
ret = asprintf(errmsg, "Failed to seek current song to time %d msec\n", seek_target_msec); ret = asprintf(errmsg, "Failed to seek current song to time %d msec", seek_target_msec);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1219,7 +1219,7 @@ mpd_command_seekid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Player returned an error for start after seekcur\n"); DPRINTF(E_LOG, L_MPD, "Player returned an error for start after seekcur\n");
ret = asprintf(errmsg, "Player returned an error for start after seekcur\n"); ret = asprintf(errmsg, "Player returned an error for start after seekcur");
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1257,7 +1257,7 @@ mpd_command_seekcur(struct evbuffer *evbuf, int argc, char **argv, char **errmsg
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_DBG, L_MPD, "Failed to seek current song to time %d msec\n", seek_target_msec); DPRINTF(E_DBG, L_MPD, "Failed to seek current song to time %d msec\n", seek_target_msec);
ret = asprintf(errmsg, "Failed to seek current song to time %d msec\n", seek_target_msec); ret = asprintf(errmsg, "Failed to seek current song to time %d msec", seek_target_msec);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1267,7 +1267,7 @@ mpd_command_seekcur(struct evbuffer *evbuf, int argc, char **argv, char **errmsg
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Player returned an error for start after seekcur\n"); DPRINTF(E_LOG, L_MPD, "Player returned an error for start after seekcur\n");
ret = asprintf(errmsg, "Player returned an error for start after seekcur\n"); ret = asprintf(errmsg, "Player returned an error for start after seekcur");
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1324,7 +1324,7 @@ mpd_command_add(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (!ps) if (!ps)
{ {
DPRINTF(E_DBG, L_MPD, "Failed to add song '%s' to playlist\n", argv[1]); DPRINTF(E_DBG, L_MPD, "Failed to add song '%s' to playlist\n", argv[1]);
ret = asprintf(errmsg, "Failed to add song '%s' to playlist\n", argv[1]); ret = asprintf(errmsg, "Failed to add song '%s' to playlist", argv[1]);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1373,7 +1373,7 @@ mpd_command_addid(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (!ps) if (!ps)
{ {
DPRINTF(E_DBG, L_MPD, "Failed to add song '%s' to playlist\n", argv[1]); DPRINTF(E_DBG, L_MPD, "Failed to add song '%s' to playlist\n", argv[1]);
ret = asprintf(errmsg, "Failed to add song '%s' to playlist\n", argv[1]); ret = asprintf(errmsg, "Failed to add song '%s' to playlist", argv[1]);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1567,7 +1567,7 @@ mpd_command_playlistid(struct evbuffer *evbuf, int argc, char **argv, char **err
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Error adding media info for file with id: %d\n", queue->queue[i]); DPRINTF(E_LOG, L_MPD, "Error adding media info for file with id: %d\n", queue->queue[i]);
ret = asprintf(errmsg, "Error adding media info for file with id: %d\n", queue->queue[i]); ret = asprintf(errmsg, "Error adding media info for file with id: %d", queue->queue[i]);
queue_free(queue); queue_free(queue);
@ -1634,7 +1634,7 @@ mpd_command_playlistinfo(struct evbuffer *evbuf, int argc, char **argv, char **e
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Error adding media info for file with id: %d\n", queue->queue[i]); DPRINTF(E_LOG, L_MPD, "Error adding media info for file with id: %d\n", queue->queue[i]);
ret = asprintf(errmsg, "Error adding media info for file with id: %d\n", queue->queue[i]); ret = asprintf(errmsg, "Error adding media info for file with id: %d", queue->queue[i]);
queue_free(queue); queue_free(queue);
@ -1701,7 +1701,7 @@ mpd_command_load(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
free_pli(pli, 0); free_pli(pli, 0);
DPRINTF(E_DBG, L_MPD, "Failed to add song '%s' to playlist\n", argv[1]); DPRINTF(E_DBG, L_MPD, "Failed to add song '%s' to playlist\n", argv[1]);
ret = asprintf(errmsg, "Failed to add song '%s' to playlist\n", argv[1]); ret = asprintf(errmsg, "Failed to add song '%s' to playlist", argv[1]);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_UNKNOWN; return ACK_ERROR_UNKNOWN;
@ -1779,6 +1779,11 @@ mpd_get_query_params_find(int argc, char **argv, struct query_params *qp)
{ {
c1 = sqlite3_mprintf("(f.title = '%q')", argv[i + 1]); c1 = sqlite3_mprintf("(f.title = '%q')", argv[i + 1]);
} }
else if (i == 0 && argc == 1)
{
// Special case: a single token is allowed if listing albums for an artist
c1 = sqlite3_mprintf("(f.album_artist = '%q')", argv[i]);
}
else else
{ {
DPRINTF(E_WARN, L_MPD, "Parameter '%s' is not supported by forked-daapd and will be ignored\n", argv[i]); DPRINTF(E_WARN, L_MPD, "Parameter '%s' is not supported by forked-daapd and will be ignored\n", argv[i]);
@ -1868,13 +1873,16 @@ mpd_command_list(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
char *type; char *type;
int ret; int ret;
if (argc < 2 || (argc % 2) != 0) if (argc < 2 || ((argc % 2) != 0))
{ {
DPRINTF(E_LOG, L_MPD, "Missing argument(s) for command 'list'\n"); if (argc != 3 || (0 != strcasecmp(argv[1], "album")))
ret = asprintf(errmsg, "Missing argument(s) for command 'list'"); {
if (ret < 0) DPRINTF(E_LOG, L_MPD, "Missing argument(s) for command 'list'\n");
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); ret = asprintf(errmsg, "Missing argument(s) for command 'list'");
return ACK_ERROR_ARG; if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n");
return ACK_ERROR_ARG;
}
} }
memset(&qp, 0, sizeof(struct query_params)); memset(&qp, 0, sizeof(struct query_params));
@ -1976,7 +1984,7 @@ mpd_command_lsinfo(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
if (ret < 0) if (ret < 0)
{ {
DPRINTF(E_LOG, L_MPD, "Could not start query for path '%s'\n", argv[1]); DPRINTF(E_LOG, L_MPD, "Could not start query for path '%s'\n", argv[1]);
ret = asprintf(errmsg, "Could not start query for path '%s'\n", argv[1]); ret = asprintf(errmsg, "Could not start query for path '%s'", argv[1]);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_MPD, "Out of memory\n"); DPRINTF(E_LOG, L_MPD, "Out of memory\n");
@ -2629,7 +2637,7 @@ static struct command mpd_handlers[] =
.handler = mpd_command_idle .handler = mpd_command_idle
}, },
{ {
.mpdcommand = "idle", .mpdcommand = "noidle",
.handler = mpd_command_noidle .handler = mpd_command_noidle
}, },
{ {

View File

@ -1028,7 +1028,6 @@ player_queue_make_mpd(char *path, int recursive)
{ {
struct query_params qp; struct query_params qp;
struct player_source *ps; struct player_source *ps;
int ret;
memset(&qp, 0, sizeof(struct query_params)); memset(&qp, 0, sizeof(struct query_params));
@ -1038,20 +1037,20 @@ player_queue_make_mpd(char *path, int recursive)
if (recursive) if (recursive)
{ {
ret = asprintf(&(qp.filter), "f.virtual_path LIKE '/%s%%'", path); qp.filter = sqlite3_mprintf("f.virtual_path LIKE '/%q%%'", path);
if (ret < 0) if (!qp.filter)
DPRINTF(E_DBG, L_PLAYER, "Out of memory\n"); DPRINTF(E_DBG, L_PLAYER, "Out of memory\n");
} }
else else
{ {
ret = asprintf(&(qp.filter), "f.virtual_path LIKE '/%s'", path); qp.filter = sqlite3_mprintf("f.virtual_path LIKE '/%q'", path);
if (ret < 0) if (!qp.filter)
DPRINTF(E_DBG, L_PLAYER, "Out of memory\n"); DPRINTF(E_DBG, L_PLAYER, "Out of memory\n");
} }
ps = player_queue_make(&qp, NULL); ps = player_queue_make(&qp, NULL);
free(qp.filter); sqlite3_free(qp.filter);
return ps; return ps;
} }