From 35d89459758cad1f1e5c6b83810e9823382f6b5b Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Fri, 13 Nov 2015 13:20:52 +0100 Subject: [PATCH] Port JSResolver::resolve() --- data/js/tomahawk.js | 39 +++++++------ src/libtomahawk/resolvers/JSResolver.cpp | 58 +++++++++++++++---- src/libtomahawk/resolvers/JSResolver.h | 3 + .../resolvers/JSResolverHelper.cpp | 19 ------ src/libtomahawk/resolvers/JSResolverHelper.h | 2 - 5 files changed, 70 insertions(+), 51 deletions(-) diff --git a/data/js/tomahawk.js b/data/js/tomahawk.js index 40fd2e57d..b88ac8cda 100644 --- a/data/js/tomahawk.js +++ b/data/js/tomahawk.js @@ -281,27 +281,23 @@ Tomahawk.Resolver = { }); }, - _adapter_resolve: function (qid, artist, album, title) { + _adapter_resolve: function (params) { var that = this; var collectionPromises = []; Tomahawk.collections.forEach(function (col) { if (col.resolve) { - collectionPromises.push(col.resolve({artist: artist, album: album, track: title})); + collectionPromises.push(col.resolve(params)); } }); - RSVP.Promise.all(collectionPromises).then(function (collectionResults) { + + return RSVP.Promise.all(collectionPromises).then(function (collectionResults) { var merged = []; return merged.concat.apply(merged, collectionResults); }).then(function (collectionResults) { - RSVP.Promise.resolve(that.resolve({ - artist: artist, - album: album, - track: title - })).then(function (results) { - Tomahawk.addTrackResults({ - 'qid': qid, + return RSVP.Promise.resolve(that.resolve(params)).then(function (results) { + return { 'results': that._convertUrls(results.concat(collectionResults)) - }); + }; }); }); }, @@ -320,23 +316,22 @@ Tomahawk.Resolver = { }); }, - _adapter_search: function (qid, query) { + _adapter_search: function (params) { var that = this; var collectionPromises = []; Tomahawk.collections.forEach(function (col) { if (col.search) { - collectionPromises.push(col.search({query: query})); + collectionPromises.push(col.search(params)); } }); - RSVP.Promise.all(collectionPromises).then(function (collectionResults) { + return RSVP.Promise.all(collectionPromises).then(function (collectionResults) { var merged = []; return merged.concat.apply(merged, collectionResults); }).then(function (collectionResults) { - RSVP.Promise.resolve(that.search({query: query})).then(function (results) { - Tomahawk.addTrackResults({ - 'qid': qid, + return RSVP.Promise.resolve(that.search(params)).then(function (results) { + return { 'results': that._convertUrls(results.concat(collectionResults)) - }); + }; }); }); }, @@ -815,7 +810,9 @@ Tomahawk.base64Encode = function (b) { return window.btoa(b); }; + Tomahawk.PluginManager = { + wrapperPrefix: '_adapter_', objects: {}, objectCounter: 0, identifyObject: function (object) { @@ -852,6 +849,12 @@ Tomahawk.PluginManager = { } } + + if (this.objects[objectId][this.wrapperPrefix + methodName]) { + methodName = this.wrapperPrefix + methodName; + } + + var pluginManager = this; if (!this.objects[objectId]) { Tomahawk.log("Object not found! objectId: " + objectId + " methodName: " + methodName); diff --git a/src/libtomahawk/resolvers/JSResolver.cpp b/src/libtomahawk/resolvers/JSResolver.cpp index 816580621..b1c84379e 100644 --- a/src/libtomahawk/resolvers/JSResolver.cpp +++ b/src/libtomahawk/resolvers/JSResolver.cpp @@ -44,6 +44,7 @@ #include "Track.h" #include "ScriptInfoPlugin.h" #include "JSAccount.h" +#include "ScriptJob.h" #include #include @@ -250,8 +251,7 @@ JSResolver::init() d->scriptAccount->loadScript( filePath() ); // HACK: register resolver object - d->scriptAccount->evaluateJavaScript( "Tomahawk.PluginManager.registerPlugin('resolver', Tomahawk.resolver.instance);" ) -; + d->scriptAccount->evaluateJavaScript( "Tomahawk.PluginManager.registerPlugin('resolver', Tomahawk.resolver.instance);" ); // init resolver resolverInit(); @@ -394,23 +394,28 @@ JSResolver::resolve( const Tomahawk::query_ptr& query ) return; } - QString eval; + ScriptJob* job = nullptr; if ( !query->isFullTextQuery() ) { - eval = QString( "resolve( '%1', '%2', '%3', '%4' )" ) - .arg( JSAccount::escape( query->id() ) ) - .arg( JSAccount::escape( query->queryTrack()->artist() ) ) - .arg( JSAccount::escape( query->queryTrack()->album() ) ) - .arg( JSAccount::escape( query->queryTrack()->track() ) ); + QVariantMap arguments; + arguments["artist"] = query->queryTrack()->artist(); + arguments["album"] = query->queryTrack()->album(); + arguments["track"] = query->queryTrack()->track(); + + job = scriptObject()->invoke( "resolve", arguments ); } else { - eval = QString( "search( '%1', '%2' )" ) - .arg( JSAccount::escape( query->id() ) ) - .arg( JSAccount::escape( query->fullTextQuery() ) ); + QVariantMap arguments; + arguments["query"] = query->fullTextQuery(); + job = scriptObject()->invoke( "search", arguments ); } - QVariantMap m = callOnResolver( eval ).toMap(); + + job->setProperty( "qid", query->id() ); + connect( job, SIGNAL( done( QVariantMap ) ), SLOT( onResolveRequestDone( QVariantMap ) ) ); + + job->start(); } @@ -552,3 +557,32 @@ JSResolver::callOnResolver( const QString& scriptSource ) "}" ).arg( propertyName ).arg( scriptSource ) ); } + + +void +JSResolver::onResolveRequestDone( const QVariantMap& data ) +{ + Q_ASSERT( QThread::currentThread() == thread() ); + Q_D( JSResolver ); + + ScriptJob* job = qobject_cast< ScriptJob* >( sender() ); + if ( job->error() ) + { + // what do here?! + } + else + { + + QList< Tomahawk::result_ptr > results = scriptAccount()->parseResultVariantList( data.value( "results" ).toList() ); + + foreach( const result_ptr& result, results ) + { + result->setResolvedByResolver( this ); + result->setFriendlySource( name() ); + } + + Tomahawk::Pipeline::instance()->reportResults( job->property( "qid" ).toString(), this, results ); + } + + sender()->deleteLater(); +} diff --git a/src/libtomahawk/resolvers/JSResolver.h b/src/libtomahawk/resolvers/JSResolver.h index 7bcd9b2fc..ab6b5a4a0 100644 --- a/src/libtomahawk/resolvers/JSResolver.h +++ b/src/libtomahawk/resolvers/JSResolver.h @@ -89,6 +89,9 @@ signals: protected: QVariant callOnResolver( const QString& scriptSource ); +private slots: + void onResolveRequestDone(const QVariantMap& data); + private: void init(); diff --git a/src/libtomahawk/resolvers/JSResolverHelper.cpp b/src/libtomahawk/resolvers/JSResolverHelper.cpp index 4b9ea8ec1..881cfd023 100644 --- a/src/libtomahawk/resolvers/JSResolverHelper.cpp +++ b/src/libtomahawk/resolvers/JSResolverHelper.cpp @@ -140,25 +140,6 @@ JSResolverHelper::log( const QString& message ) } -void -JSResolverHelper::addTrackResults( const QVariantMap& results ) -{ - Q_ASSERT( results["results"].toMap().isEmpty() ); - - QList< Tomahawk::result_ptr > tracks = m_resolver->scriptAccount()->parseResultVariantList( results.value( "results" ).toList() ); - - foreach( const result_ptr& track, tracks ) - { - track->setResolvedByResolver( m_resolver ); - track->setFriendlySource( m_resolver->name() ); - } - - QString qid = results.value("qid").toString(); - - Tomahawk::Pipeline::instance()->reportResults( qid, m_resolver, tracks ); -} - - query_ptr JSResolverHelper::parseTrack( const QVariantMap& track ) { diff --git a/src/libtomahawk/resolvers/JSResolverHelper.h b/src/libtomahawk/resolvers/JSResolverHelper.h index ddb52938a..b69c92135 100644 --- a/src/libtomahawk/resolvers/JSResolverHelper.h +++ b/src/libtomahawk/resolvers/JSResolverHelper.h @@ -142,8 +142,6 @@ public slots: void log( const QString& message ); bool fakeEnv() { return false; } - void addTrackResults( const QVariantMap& results ); - void addUrlResult( const QString& url, const QVariantMap& result ); void nativeReportCapabilities( const QVariant& capabilities );