Esempio n. 1
0
/*
 * 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();
}
Esempio n. 2
0
/**
 * 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();
}