PHP_METHOD(SpotifyAlbumIterator, __construct) { zval *thisptr = getThis(), *parent; spotifyartist_object *artistobj; int timeout = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &parent, spotifyartist_ce) == FAILURE) { return; } zval *spotifyobject = GET_PROPERTY(spotifyartist_ce, parent, "spotify"); spotify_object *p = (spotify_object*)zend_object_store_get_object(spotifyobject TSRMLS_CC); artistobj = (spotifyartist_object*)zend_object_store_get_object(parent TSRMLS_CC); spotifyalbumiterator_object *obj = (spotifyalbumiterator_object*)zend_object_store_get_object(getThis() TSRMLS_CC); obj->session = p->session; obj->artist = artistobj->artist; obj->artistbrowse = sp_artistbrowse_create(p->session, artistobj->artist, SP_ARTISTBROWSE_FULL, spotify_artistbrowse_complete, obj); while (!sp_artistbrowse_is_loaded(obj->artistbrowse)) { sp_session_process_events(p->session, &timeout); } obj->position = 0; obj->length = sp_artistbrowse_num_albums(obj->artistbrowse); zend_update_property(spotifyalbumiterator_ce, getThis(), "spotify", strlen("spotify"), spotifyobject TSRMLS_CC); sp_artistbrowse_add_ref(obj->artistbrowse); }
static PyObject * ArtistBrowser_new(PyTypeObject * type, PyObject *args, PyObject *kwds) { PyObject *session, *artist, *callback, *userdata = NULL; static char *kwlist[] = { "session", "artist", "callback", "userdata", NULL }; if (!PyArg_ParseTupleAndKeywords (args, kwds, "O!O!O|O", kwlist, &SessionType, &session, &ArtistType, &artist, &callback, &userdata)) return NULL; ArtistBrowser *self = (ArtistBrowser *) type->tp_alloc(type, 0); self->_callback.callback = callback; self->_callback.userdata = userdata; Py_XINCREF(callback); Py_XINCREF(userdata); Py_BEGIN_ALLOW_THREADS; self->_browser = sp_artistbrowse_create(((Session *) session)->_session, ((Artist *) artist)->_artist, (artistbrowse_complete_cb *) ArtistBrowser_browse_complete, (void *)&self->_callback); Py_END_ALLOW_THREADS; return (PyObject *)self; }
PHP_METHOD(SpotifyArtist, browse) { int timeout = 0; spotifyartist_object *p = (spotifyartist_object*)zend_object_store_get_object(getThis() TSRMLS_CC); if (p->artistbrowse != NULL) { RETURN_TRUE; } sp_artistbrowse *tmpbrowse = sp_artistbrowse_create(p->session, p->artist, SP_ARTISTBROWSE_FULL, artistbrowse_complete, p); while (!sp_artistbrowse_is_loaded(tmpbrowse)) { sp_session_process_events(p->session, &timeout); } RETURN_TRUE; }
int cmd_browse(int argc, char **argv) { sp_link *link; if (argc != 2) { browse_usage(); return -1; } link = sp_link_create_from_string(argv[1]); if (!link) { fprintf(stderr, "Not a spotify link\n"); return -1; } switch(sp_link_type(link)) { default: fprintf(stderr, "Can not handle link"); sp_link_release(link); return -1; case SP_LINKTYPE_ALBUM: sp_albumbrowse_create(g_session, sp_link_as_album(link), browse_album_callback, NULL); break; case SP_LINKTYPE_ARTIST: sp_artistbrowse_create(g_session, sp_link_as_artist(link), browse_artist_callback, NULL); break; case SP_LINKTYPE_TRACK: track_browse = sp_link_as_track(link); metadata_updated_fn = track_browse_try; sp_track_add_ref(track_browse); track_browse_try(); break; case SP_LINKTYPE_PLAYLIST: browse_playlist(sp_playlist_create(g_session, link)); break; } sp_link_release(link); return 0; }
sp_artistbrowse* artistbrowse_create(sp_artist* artist, artistbrowse_complete_cb* callback, gpointer userdata) { return sp_artistbrowse_create(g_session, artist, SP_ARTISTBROWSE_FULL, callback, userdata); }
jobject createJArtistInstance(JNIEnv *env, sp_artist *artist) { jclass jClass; jobject artistInstance = createInstance(env,"jahspotify/media/Artist"); sp_link *artistLink = sp_link_create_from_artist(artist); jClass = (*env)->FindClass(env, "jahspotify/media/Artist"); if (jClass == NULL) { fprintf(stderr,"jahspotify::createJArtistInstance: could not load jahnotify.media.Artist\n"); return NULL; } if (artistLink) { sp_link_add_ref(artistLink); jobject artistJLink = createJLinkInstance(env, artistLink); setObjectObjectField(env,artistInstance,"id","Ljahspotify/media/Link;",artistJLink); sp_link_release(artistLink); setObjectStringField(env,artistInstance,"name",sp_artist_name(artist)); sp_artistbrowse *artistBrowse = sp_artistbrowse_create(g_sess,artist,artistBrowseCompleteCallback,NULL); if (artistBrowse) { sp_artistbrowse_add_ref(artistBrowse); while (!sp_artistbrowse_is_loaded(artistBrowse)) { usleep(100); } int numSimilarArtists = sp_artistbrowse_num_similar_artists(artistBrowse); if (numSimilarArtists > 0) { jmethodID jMethod = (*env)->GetMethodID(env,jClass,"addSimilarArtist","(Ljahspotify/media/Link;)V"); if (jMethod == NULL) { fprintf(stderr,"jahspotify::createJTrackInstance: could not load method setAlbum(link) on class Track\n"); return NULL; } // Load the artist links int count = 0; for (count = 0; count < numSimilarArtists; count++) { sp_artist *similarArtist = sp_artistbrowse_similar_artist(artistBrowse,0); if (similarArtist) { sp_artist_add_ref(similarArtist); sp_link *similarArtistLink = sp_link_create_from_artist(similarArtist); if (similarArtistLink) { sp_link_add_ref(similarArtistLink); jobject similarArtistJLink = createJLinkInstance(env,similarArtistLink); // set it on the track (*env)->CallVoidMethod(env,artistInstance,jMethod,similarArtistJLink); sp_link_release(similarArtistLink); } sp_artist_release(similarArtist); } } } int numPortraits = sp_artistbrowse_num_portraits(artistBrowse); if (numPortraits > 0) { // Load portrait url const byte *portraitURI = sp_artistbrowse_portrait(artistBrowse,0); if (portraitURI) { char *portraitURIStr = toHexString((byte*)portraitURI); const char spotifyURI[] = "spotify:image:"; int len = strlen(spotifyURI) + strlen(portraitURIStr); char *dest = malloc(len+1); dest[0] = 0; strcat(dest,spotifyURI); strcat(dest,portraitURIStr); sp_link *portraitLink = sp_link_create_from_string(dest); sp_image *portrait = sp_image_create_from_link(g_sess,portraitLink); if (portrait) { sp_image_add_ref(portrait); sp_image_add_load_callback(portrait,imageLoadedCallback,NULL); } free(dest); free(portraitURIStr); if (portraitLink) { sp_link_add_ref(portraitLink); jobject portraitJLlink = createJLinkInstance(env,portraitLink); setObjectObjectField(env,artistInstance,"portrait","Ljahspotify/media/Link;",portraitJLlink); sp_link_release(portraitLink); } } } // sp_artistbrowse_num_albums() // sp_artistbrowse_album() const char *bios = sp_artistbrowse_biography(artistBrowse); if (bios) { setObjectStringField(env,artistInstance,"bios",bios); } // sp_artistbrowse_num_tracks() // sp_artistbrowse_track() sp_artistbrowse_release(artistBrowse); } } return artistInstance; }