static void playlist_browse_try(void) { int i, tracks; metadata_updated_fn = playlist_browse_try; if(!sp_playlist_is_loaded(playlist_browse)) return; tracks = sp_playlist_num_tracks(playlist_browse); for(i = 0; i < tracks; i++) { sp_track *t = sp_playlist_track(playlist_browse, i); if (!sp_track_is_loaded(t)) return; } printf("\tPlaylist and metadata loaded\n"); for(i = 0; i < tracks; i++) { sp_track *t = sp_playlist_track(playlist_browse, i); printf(" %5d: ", i + 1); print_track(t); } sp_playlist_remove_callbacks(playlist_browse, &pl_callbacks, NULL); sp_playlist_release(playlist_browse); playlist_browse = NULL; metadata_updated_fn = NULL; cmd_done(); }
/** * Callback from libspotify, telling us a playlist was removed from the playlist container. * * This is the place to remove our playlist callbacks. * * @param pc The playlist container handle * @param pl The playlist handle * @param position Index of the removed playlist * @param userdata The opaque pointer */ static void playlist_removed ( sp_playlistcontainer *pc, sp_playlist *pl, int position, void *userdata ) { const char *name = sp_playlist_name(pl); // fprintf(stderr,"jahspotify: playlist removed: %s\n ",name); sp_playlist_remove_callbacks ( pl, &pl_callbacks, NULL ); }
static void playlist_dispatch(sp_playlist *playlist, void *userdata) { struct playlist_handler *handler = userdata; sp_playlist_remove_callbacks(playlist, handler->playlist_callbacks, handler); handler->playlist_callbacks = NULL; handler->callback(playlist, handler->request, handler->userdata); free(handler); }
SxPlaylist::~SxPlaylist() { sp_playlist_remove_callbacks(m_spPlaylist, &m_plCallbacks, this); if (!isFolder()) { removeAllTracks(); } //let it bleed a little, not sure if the reference actualy goes up or if it is linked to the container // if (m_isValid) // sp_playlist_release(m_spPlaylist); }
static void pl_state_change(sp_playlist *pl, void *userdata) { struct pl_update_work *puw = userdata; if(apply_changes(pl, puw)) return; sp_playlist_remove_callbacks(pl, &pl_update_callbacks, puw); sp_playlist_release(pl); cmd_done(); }
bool XplodifyPlaylist::unload() { boost::shared_ptr<XplodifySession> sess(m_session.lock()); sp_playlist_remove_callbacks(m_playlist, const_cast<sp_playlist_callbacks *>(&cbs), this); m_track_cache.get<0>().clear(); m_loading = false; m_playlist = NULL; sess->update_state_ts(); return true; }
static void put_playlist_remove_tracks(sp_playlist *playlist, struct evhttp_request *request, void *userdata) { // sp_session *session = userdata; const char *uri = evhttp_request_get_uri(request); struct evkeyvalq query_fields; evhttp_parse_query(uri, &query_fields); // Parse index const char *index_field = evhttp_find_header(&query_fields, "index"); int index; if (index_field == NULL || sscanf(index_field, "%d", &index) <= 0 || index < 0) { send_error(request, HTTP_BADREQUEST, "Bad parameter: index must be numeric"); return; } const char *count_field = evhttp_find_header(&query_fields, "count"); int count; if (count_field == NULL || sscanf(count_field, "%d", &count) <= 0 || count < 1) { send_error(request, HTTP_BADREQUEST, "Bad parameter: count must be numeric and positive"); return; } int *tracks = calloc(count, sizeof(int)); for (int i = 0; i < count; i++) tracks[i] = index + i; struct playlist_handler *handler = register_playlist_callbacks( playlist, request, &get_playlist, &playlist_update_in_progress_callbacks, NULL); sp_error remove_tracks_error = sp_playlist_remove_tracks(playlist, tracks, count); if (remove_tracks_error != SP_ERROR_OK) { sp_playlist_remove_callbacks(playlist, handler->playlist_callbacks, handler); free(handler); send_error_sp(request, HTTP_BADREQUEST, remove_tracks_error); } free(tracks); }
void Spotify::changeCurrentPlaylist() { sp_error err; sp_playlist * playlist; if (currentPlaylistIdx < 0) { return; } sp_playlistcontainer * pc = sp_session_playlistcontainer(sp); if (currentPlaylistIdx >= sp_playlistcontainer_num_playlists(pc)) { return; } switch (sp_playlistcontainer_playlist_type(pc, currentPlaylistIdx)) { case SP_PLAYLIST_TYPE_PLAYLIST: playlist = sp_playlistcontainer_playlist(pc, currentPlaylistIdx); if (!playlist) { fprintf(stderr, "Spotify: failed to get playlist\n"); break; } err = sp_playlist_add_callbacks(playlist, Spotify_Wrapper::playlistCallbacks(), NULL); if (err != SP_ERROR_OK) { fprintf(stderr, "Spotify: failed to add callbacks to playlist: %s\n", sp_error_message(err)); } if (currentPlaylist) { sp_playlist_remove_callbacks(currentPlaylist, Spotify_Wrapper::playlistCallbacks(), NULL); sp_playlist_release(currentPlaylist); } currentPlaylist = playlist; sp_playlist_add_ref(currentPlaylist); fprintf(stderr, "Spotify: switched to playlist %s\n", sp_playlist_name(currentPlaylist)); tryLoadPlaylist(); break; default: fprintf(stderr, "Spotify: Tried to load a playlist that wasn't a playlist\n"); currentPlaylistIdx = -1; break; } }
/** * Callback from libspotify, telling us a playlist was removed from the playlist container. * * This is the place to remove our playlist callbacks. * * @param pc The playlist container handle * @param pl The playlist handle * @param position Index of the removed playlist * @param userdata The opaque pointer */ static void playlist_removed(sp_playlistcontainer *pc, sp_playlist *pl, int position, void *userdata) { sp_playlist_remove_callbacks(pl, &pl_callbacks, NULL); }
static void put_playlist_add_tracks(sp_playlist *playlist, struct evhttp_request *request, void *userdata) { sp_session *session = userdata; const char *uri = evhttp_request_get_uri(request); struct evkeyvalq query_fields; evhttp_parse_query(uri, &query_fields); // Parse index const char *index_field = evhttp_find_header(&query_fields, "index"); int index; if (index_field == NULL || sscanf(index_field, "%d", &index) <= 0) { index = sp_playlist_num_tracks(playlist); } // Parse JSON json_error_t loads_error; json_t *json = read_request_body_json(request, &loads_error); if (json == NULL) { send_error(request, HTTP_BADREQUEST, loads_error.text ? loads_error.text : "Unable to parse JSON"); return; } if (!json_is_array(json)) { json_decref(json); send_error(request, HTTP_BADREQUEST, "Not valid JSON array"); return; } // Handle empty array int num_tracks = json_array_size(json); if (num_tracks == 0) { send_reply(request, HTTP_OK, "OK", NULL); return; } sp_track **tracks = calloc(num_tracks, sizeof (sp_track *)); int num_valid_tracks = json_to_tracks(json, tracks, num_tracks); json_decref(json); // Bail if no tracks could be read from input if (num_valid_tracks == 0) { send_error(request, HTTP_BADREQUEST, "No valid tracks"); free(tracks); return; } struct playlist_handler *handler = register_playlist_callbacks( playlist, request, &get_playlist, &playlist_update_in_progress_callbacks, NULL); sp_error add_tracks_error = sp_playlist_add_tracks(playlist, tracks, num_valid_tracks, index, session); if (add_tracks_error != SP_ERROR_OK) { sp_playlist_remove_callbacks(playlist, handler->playlist_callbacks, handler); free(handler); send_error_sp(request, HTTP_BADREQUEST, add_tracks_error); } free(tracks); }