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; } }
svn_error_t *diff_playlist_tracks(svn_diff_t **diff, sp_playlist *playlist, sp_track **tracks, int num_tracks, apr_pool_t *pool) { sp_playlist_add_ref(playlist); struct track_tokens_t sources[2]; fill_track_tokens_from_playlist(&sources[0], playlist); fill_track_tokens_from_tracks(&sources[1], tracks, num_tracks); // Run through SVN diff apr_pool_t *local_pool = svn_pool_create(pool); svn_error_t *result = svn_diff_diff(diff, &sources, &diff_playlist_search_vtable, local_pool); svn_pool_destroy(local_pool); sp_playlist_release(playlist); return result; }
svn_error_t *diff_playlist_tracks_apply(svn_diff_t *diff, sp_playlist *playlist, sp_track **tracks, int num_tracks, sp_session *session) { sp_playlist_add_ref(playlist); struct output_baton_t *baton = malloc(sizeof (struct output_baton_t)); baton->playlist = playlist; baton->tracks = tracks; baton->num_tracks = num_tracks; baton->session = session; svn_error_t *result = svn_diff_output(diff, baton, &output_fns_vtable); free(baton); sp_playlist_release(playlist); return result; }
PHP_METHOD(SpotifyPlaylist, __construct) { zval *object = getThis(); zval *parent; sp_playlist *playlist; int timeout = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Oz", &parent, spotify_ce, &playlist) == FAILURE) { return; } spotify_object *p = (spotify_object*)zend_object_store_get_object((parent) TSRMLS_CC); spotifyplaylist_object *obj = (spotifyplaylist_object*)zend_object_store_get_object(object TSRMLS_CC); obj->session = p->session; obj->playlist = playlist; zend_update_property(spotifyplaylist_ce, getThis(), "spotify", strlen("spotify"), parent TSRMLS_CC); while (!sp_playlist_is_loaded(playlist)) { sp_session_process_events(p->session, &timeout); } sp_playlist_add_ref(obj->playlist); }
// Request dispatcher static void handle_request(struct evhttp_request *request, void *userdata) { evhttp_connection_set_timeout(request->evcon, 1); evhttp_add_header(evhttp_request_get_output_headers(request), "Server", "[email protected]/spotify-api-server"); // Check request method int http_method = evhttp_request_get_command(request); switch (http_method) { case EVHTTP_REQ_GET: case EVHTTP_REQ_PUT: case EVHTTP_REQ_POST: break; default: evhttp_send_error(request, HTTP_NOTIMPL, "Not Implemented"); return; } struct state *state = userdata; sp_session *session = state->session; char *uri = evhttp_decode_uri(evhttp_request_get_uri(request)); char *entity = strtok(uri, "/"); if (entity == NULL) { evhttp_send_error(request, HTTP_BADREQUEST, "Bad Request"); free(uri); return; } // Handle requests to /user/<user_name>/inbox if (strncmp(entity, "user", 4) == 0) { char *username = strtok(NULL, "/"); if (username == NULL) { evhttp_send_error(request, HTTP_BADREQUEST, "Bad Request"); free(uri); return; } char *action = strtok(NULL, "/"); handle_user_request(request, action, username, session); free(uri); return; } // Handle requests to /playlist/<playlist_uri>/<action> if (strncmp(entity, "playlist", 8) != 0) { evhttp_send_error(request, HTTP_BADREQUEST, "Bad Request"); free(uri); return; } char *playlist_uri = strtok(NULL, "/"); if (playlist_uri == NULL) { switch (http_method) { case EVHTTP_REQ_PUT: case EVHTTP_REQ_POST: put_playlist(NULL, request, session); break; default: send_error(request, HTTP_BADREQUEST, "Bad Request"); break; } free(uri); return; } sp_link *playlist_link = sp_link_create_from_string(playlist_uri); if (playlist_link == NULL) { send_error(request, HTTP_NOTFOUND, "Playlist link not found"); free(uri); return; } if (sp_link_type(playlist_link) != SP_LINKTYPE_PLAYLIST) { sp_link_release(playlist_link); send_error(request, HTTP_BADREQUEST, "Not a playlist link"); free(uri); return; } sp_playlist *playlist = sp_playlist_create(session, playlist_link); sp_link_release(playlist_link); if (playlist == NULL) { send_error(request, HTTP_NOTFOUND, "Playlist not found"); free(uri); return; } sp_playlist_add_ref(playlist); // Dispatch request char *action = strtok(NULL, "/"); // Default request handler handle_playlist_fn request_callback = ¬_implemented; void *callback_userdata = session; switch (http_method) { case EVHTTP_REQ_GET: { if (action == NULL) { // Send entire playlist request_callback = &get_playlist; } else if (strncmp(action, "collaborative", 13) == 0) { request_callback = &get_playlist_collaborative; } else if (strncmp(action, "subscribers", 11) == 0) { request_callback = &get_playlist_subscribers; } } break; case EVHTTP_REQ_PUT: case EVHTTP_REQ_POST: { if (strncmp(action, "add", 3) == 0) { request_callback = &put_playlist_add_tracks; } else if (strncmp(action, "remove", 6) == 0) { request_callback = &put_playlist_remove_tracks; } else if (strncmp(action, "patch", 5) == 0) { callback_userdata = state; request_callback = &put_playlist_patch; } } break; } if (sp_playlist_is_loaded(playlist)) { request_callback(playlist, request, callback_userdata); } else { // Wait for playlist to load register_playlist_callbacks(playlist, request, request_callback, &playlist_state_changed_callbacks, callback_userdata); } free(uri); }