Пример #1
0
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;
    }
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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);
}
Пример #5
0
// 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 = &not_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);
}