Пример #1
0
static int osfy_artistbrowse_browse_callback(struct browse_callback_ctx *brctx) {
	sp_artistbrowse *arb;
	int i;
	struct buf *xml;
	ezxml_t root;

	for(i = 0; i < brctx->num_in_request; i++) {
		arb = brctx->data.artistbrowses[brctx->num_browsed + i];

		/* Set defaults */
		arb->is_loaded = 0;
		arb->error = SP_ERROR_OTHER_TRANSIENT;
	}

	/* Might happen because of a channel error */
	if(brctx->buf == NULL)
		return 0;

	xml = despotify_inflate(brctx->buf->ptr, brctx->buf->len);
#ifdef DEBUG
	{
		FILE *fd;
		DSFYDEBUG("Decompresed %d bytes data, xml=%p\n",
			  brctx->buf->len, xml);
		fd = fopen("browse-artistbrowse.xml", "w");
		if(fd) {
			fwrite(xml->ptr, xml->len, 1, fd);
			fclose(fd);
		}
	}
#endif

	root = ezxml_parse_str((char *) xml->ptr, xml->len);
	if(root == NULL) {
		DSFYDEBUG("Failed to parse XML\n");
		buf_free(xml);
		return -1;
	}

	for(i = 0; i < brctx->num_in_request; i++) {
		arb = brctx->data.artistbrowses[brctx->num_browsed + i];
		osfy_artistbrowse_load_from_xml(brctx->session, arb, root);
		arb->is_loaded = 1;
		arb->error = SP_ERROR_OK;
	}


	ezxml_free(root);
	buf_free(xml);


	/* Release references made in sp_artistbrowse_create() */
	for(i = 0; i < brctx->num_in_request; i++)
		sp_artistbrowse_release(brctx->data.artistbrowses[brctx->num_browsed + i]);


	return 0;
}
Пример #2
0
PHP_METHOD(SpotifyArtist, __destruct)
{
	spotifyartist_object *p = (spotifyartist_object*)zend_object_store_get_object(getThis() TSRMLS_CC);

        if (p->artistbrowse != NULL) {
                sp_artistbrowse_release(p->artistbrowse);
        }

	sp_artist_release(p->artist);
}
Пример #3
0
/**
 * Callback for libspotify
 *
 * @param browse    The browse result object that is now done
 * @param userdata  The opaque pointer given to sp_artistbrowse_create()
 */
static void browse_artist_callback(sp_artistbrowse *browse, void *userdata)
{
	if (sp_artistbrowse_error(browse) == SP_ERROR_OK)
		print_artistbrowse(browse);
	else
		fprintf(stderr, "Failed to browse artist: %s\n",
		        sp_error_message(sp_artistbrowse_error(browse)));

	sp_artistbrowse_release(browse);
	cmd_done();
}
Пример #4
0
static void
ArtistBrowser_dealloc(PyObject *arg)
{
#ifdef DEBUG
    fprintf(stderr, "Deallocating artist browser");
#endif

    ArtistBrowser *self = (ArtistBrowser *) arg;

    Py_XDECREF(self->_callback.callback);
    Py_XDECREF(self->_callback.userdata);
    sp_artistbrowse_release(self->_browser);
    ArtistBrowserType.tp_free(self);
}
Пример #5
0
PHP_METHOD(SpotifyAlbumIterator, __destruct)
{
	spotifyalbumiterator_object *p = (spotifyalbumiterator_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
	sp_artistbrowse_release(p->artistbrowse);
}
Пример #6
0
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;

}