void songlist_update(void) { struct mpd_song *song; if (!mpd_send_list_queue_meta(conn)) printErrorAndExit(conn); int i = 0; while ((song = mpd_recv_song(conn)) != NULL && i < MAX_SONGLIST_STORE_LENGTH) { pretty_copy(songlist->meta[i].title, get_song_tag(song, MPD_TAG_TITLE), 512, -1); pretty_copy(songlist->meta[i].pretty_title, get_song_tag(song, MPD_TAG_TITLE), 128, 26); pretty_copy(songlist->meta[i].artist, get_song_tag(song, MPD_TAG_ARTIST), 128, 14); pretty_copy(songlist->meta[i].album, get_song_tag(song, MPD_TAG_ALBUM), 128, -1); songlist->meta[i].id = i + 1; ++i; mpd_song_free(song); } songlist->length = i; my_finishCommand(conn); }
int cmd_playlist(mpd_unused int argc, mpd_unused char **argv, struct mpd_connection *conn) { struct mpd_song *song; if (!mpd_send_list_queue_meta(conn)) printErrorAndExit(conn); while ((song = mpd_recv_song(conn)) != NULL) { pretty_print_song(song); mpd_song_free(song); printf("\n"); } my_finishCommand(conn); return 0; }
bool mpd_is_in_queue(const char *uri) { bool res = false; struct mpd_entity *entity; struct mpd_connection *conn = mpd_connection_new(NULL, NULL, 3000); if (conn == NULL) { syslog(LOG_ERR, "%s - Out of memory.", __func__); goto DONE; } if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS) { syslog(LOG_ERR, "%s - MPD connection: %s\n", __func__, mpd_connection_get_error_message(conn)); goto DONE; } if (!mpd_send_list_queue_meta(conn)) { syslog(LOG_ERR, "%s: %s", __func__, mpd_connection_get_error_message(conn)); mpd_connection_clear_error(conn); goto DONE; } while((entity = mpd_recv_entity(conn)) != NULL) { const struct mpd_song *song; if(mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG && !res) { song = mpd_entity_get_song(entity); if (strcmp(mpd_song_get_uri(song), uri) == 0) { syslog(LOG_INFO, "%s: %s is already in the queue", __func__, uri); res = true; } } mpd_entity_free(entity); } DONE: if(conn != NULL) mpd_connection_free(conn); return res; }
/* * pgmpc_playlist * List all songs in given playlist. If not playlist is specified list * songs of current playlist. */ Datum pgmpc_playlist(PG_FUNCTION_ARGS) { TupleDesc tupdesc; Tuplestorestate *tupstore; char *playlist = NULL; bool ret; if (PG_NARGS() == 1 && !PG_ARGISNULL(0)) playlist = text_to_cstring(PG_GETARG_TEXT_PP(0)); /* Initialize function context */ pgmpc_init_setof_single(fcinfo, TEXTOID, "playlist", &tupdesc, &tupstore); /* * Run the command to get all the songs. */ pgmpc_init(); ret = playlist ? mpd_send_list_playlist_meta(mpd_conn, playlist) : mpd_send_list_queue_meta(mpd_conn); if (!ret) pgmpc_print_error(); /* Now get all the songs and send them back to caller */ while (true) { Datum values[1]; bool nulls[1]; struct mpd_song *song = mpd_recv_song(mpd_conn); /* Leave if done */ if (song == NULL) break; /* Assign song name */ nulls[0] = false; values[0] = CStringGetTextDatum(mpd_song_get_uri(song)); /* Save values */ tuplestore_putvalues(tupstore, tupdesc, values, nulls); /* Clean up for the next one */ mpd_song_free(song); } /* We may be in error state, so check for it */ if (mpd_connection_get_error(mpd_conn) != MPD_ERROR_SUCCESS) { const char *message = mpd_connection_get_error_message(mpd_conn); pgmpc_reset(); ereport(ERROR, (errcode(ERRCODE_SYSTEM_ERROR), errmsg("mpd command failed: %s", message))); } /* Clean up */ pgmpc_reset(); /* clean up and return the tuplestore */ tuplestore_donestoring(tupstore); return (Datum) 0; }