/* * Remove a song from the queue. * * Returns true on success, false on failure. */ bool Control::remove(Songlist * list, Song * song) { Playlist * playlist; assert(song != NULL); assert(list != NULL); assert(list != _library); EXIT_IDLE; pms->log(MSG_DEBUG, 0, "Removing song with id=%d pos=%d uri=%s from list %s.\n", song->id, song->pos, song->file.c_str(), list->filename.c_str()); /* Remove song from queue */ if (list == _queue) { // All songs must have ID's // FIXME: version requirement assert(song->id != MPD_SONG_NO_ID); return mpd_run_delete_id(conn->h(), song->id); } /* Remove song from stored playlist */ assert(list->filename.size() > 0); if (mpd_run_playlist_delete(conn->h(), (char *)list->filename.c_str(), song->pos)) { playlist = static_cast<Playlist *>(list); playlist->set_synchronized(false); } return get_error_bool(); }
/** * Retrieves all playlist contents from MPD. Requires that the local playlist * index is updated using `update_playlist_index()`. * * Returns true on success, false on failure. */ bool Control::update_playlists() { vector<Playlist *>::iterator playlist_iterator; Playlist * playlist; EXIT_IDLE; pms->log(MSG_DEBUG, 0, "Synchronizing all playlists with MPD\n"); playlist_iterator = playlists.begin(); while (playlist_iterator != playlists.end()) { playlist = *playlist_iterator; if (!playlist->exists_in_mpd()) { pms->disp->remove_list(playlist); delete playlist; playlist_iterator = playlists.erase(playlist_iterator); continue; } else if (!playlist->is_synchronized()) { if (!update_playlist(playlist)) { return false; } playlist->set_synchronized(true); } else { pms->log(MSG_DEBUG, 0, "Playlist %s is already synchronized.\n", playlist->filename.c_str()); } ++playlist_iterator; } pms->log(MSG_DEBUG, 0, "Playlist synchronization is finished.\n"); return get_error_bool(); }