diff --git a/src/libtomahawk/utils/SoundcloudParser.cpp b/src/libtomahawk/utils/SoundcloudParser.cpp index 35fc6fc22..5e10379f7 100644 --- a/src/libtomahawk/utils/SoundcloudParser.cpp +++ b/src/libtomahawk/utils/SoundcloudParser.cpp @@ -71,10 +71,11 @@ void SoundcloudParser::lookupUrl( const QString& link ) { tDebug() << "Looking up URL..." << link; + QUrl scLink( QString( "http://api.soundcloud.com/resolve.json?client_id=TiNg2DRYhBnp01DA3zNag&url=" ) + link ); NetworkReply* reply = new NetworkReply( TomahawkUtils::nam()->get( QNetworkRequest( scLink ) ) ); - connect( reply, SIGNAL( finished() ), SLOT( soundcloudBrowseFinished() ) ); + connect( reply, SIGNAL( finished() ), SLOT( soundcloudLookupFinished() ) ); m_browseJob = new DropJobNotifier( pixmap(), "Soundcloud", DropJob::All, reply ); JobStatusView::instance()->model()->addJob( m_browseJob ); @@ -123,13 +124,25 @@ SoundcloudParser::soundcloudLookupFinished() QJson::Parser p; bool ok; QVariantMap res = p.parse( r->reply(), &ok ).toMap(); - if ( !ok ) { tLog() << "Failed to parse json from Soundcloud browse item:" << p.errorString() << "On line" << p.errorLine(); return; } + if( res.value( "kind" ).toString() == "playlist" ) + m_type = DropJob::Playlist; + if( res.value( "kind" ).toString() == "track" ) + m_type = DropJob::Track; + if( res.value( "kind" ).toString() == "user" ) + { + QUrl url = QUrl( QString( res.value( "uri" ).toString() + "/tracks.json?client_id=TiNg2DRYhBnp01DA3zNag" ) ); + qDebug() << Q_FUNC_INFO << url; + NetworkReply* reply = new NetworkReply( TomahawkUtils::nam()->get( QNetworkRequest( QUrl( url ) ) ) ); + connect( reply, SIGNAL( finished() ), SLOT( soundcloudArtistLookupFinished() ) ); + return; + } + if ( m_type == DropJob::Track ) { parseTrack( res ); @@ -160,10 +173,6 @@ SoundcloudParser::soundcloudLookupFinished() return; } } - else if ( m_type == DropJob::Artist ) - { - // cant parse soundcloud json here atm. - } } if ( m_single && !m_tracks.isEmpty() ) @@ -185,7 +194,7 @@ SoundcloudParser::playlistCreated() void -SoundcloudParser::soundcloudBrowseFinished() +SoundcloudParser::soundcloudArtistLookupFinished() { NetworkReply* r = qobject_cast< NetworkReply* >( sender() ); Q_ASSERT( r ); @@ -194,39 +203,19 @@ SoundcloudParser::soundcloudBrowseFinished() if ( r->reply()->error() == QNetworkReply::NoError ) { - if ( r->reply()->rawHeaderList().contains( "Location" ) ) - { - QString url = r->reply()->rawHeader( "Location" ); - if ( url.contains( "tracks" ) ) - { - m_type = DropJob::Track; - } - else if ( url.contains( "users" ) ) - { - // For now, dont handle user tracklists - m_type = DropJob::All; //DropJob::Artist; - url = url.replace( ".json", "/tracks.json" ); -} - else if ( url.contains( "playlists" ) ) - { - m_type = DropJob::Playlist; - } + QJson::Parser p; + bool ok; + QVariantList res = p.parse( r->reply(), &ok ).toList(); + foreach( const QVariant& track, res ) + parseTrack( track.toMap() ); - if ( m_type != DropJob::All ) - { - NetworkReply* reply = new NetworkReply( TomahawkUtils::nam()->get( QNetworkRequest( QUrl( url ) ) ) ); - connect( reply, SIGNAL( finished() ), SLOT( soundcloudLookupFinished() ) ); - } - } - } + if ( m_single && !m_tracks.isEmpty() ) + emit track( m_tracks.first() ); + else if ( !m_single && !m_tracks.isEmpty() ) + emit tracks( m_tracks ); - if ( m_type == DropJob::All ) - { // No good - m_queries.remove( r ); + deleteLater(); - if ( m_browseJob ) - m_browseJob->setFinished(); - return; } } diff --git a/src/libtomahawk/utils/SoundcloudParser.h b/src/libtomahawk/utils/SoundcloudParser.h index bb35b6029..37018b121 100644 --- a/src/libtomahawk/utils/SoundcloudParser.h +++ b/src/libtomahawk/utils/SoundcloudParser.h @@ -63,7 +63,7 @@ signals: void playlist( const Tomahawk::query_ptr& playlist ); private slots: - void soundcloudBrowseFinished(); + void soundcloudArtistLookupFinished(); void soundcloudLookupFinished(); void playlistCreated();