1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-04-20 07:52:30 +02:00

Allow async streamUrl reports for custom IODeviceFactory resolvers.

This commit is contained in:
Teo Mrnjavac 2013-03-14 18:56:24 +01:00
parent 230fbdcef9
commit 918545eddc
2 changed files with 53 additions and 9 deletions

View File

@ -57,6 +57,7 @@
QtScriptResolverHelper::QtScriptResolverHelper( const QString& scriptPath, QtScriptResolver* parent )
: QObject( parent )
, m_urlCallbackIsAsync( false )
{
m_scriptPath = scriptPath;
m_resolver = parent;
@ -291,8 +292,12 @@ QtScriptResolverHelper::md5( const QByteArray& input )
void
QtScriptResolverHelper::addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName )
QtScriptResolverHelper::addCustomUrlHandler( const QString& protocol,
const QString& callbackFuncName,
const QString& async )
{
m_urlCallbackIsAsync = ( async.toLower() == "true" ) ? true : false;
boost::function< void( const Tomahawk::result_ptr&,
boost::function< void( QSharedPointer< QIODevice >& ) > )> fac =
boost::bind( &QtScriptResolverHelper::customIODeviceFactory, this, _1, _2 );
@ -320,20 +325,55 @@ void
QtScriptResolverHelper::customIODeviceFactory( const Tomahawk::result_ptr& result,
boost::function< void( QSharedPointer< QIODevice >& ) > callback )
{
QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2' );" ).arg( m_urlCallback )
.arg( QString( QUrl( result->url() ).toEncoded() ) );
//can be sync or async
QString origResultUrl = QString( QUrl( result->url() ).toEncoded() );
QString urlStr = m_resolver->m_engine->mainFrame()->evaluateJavaScript( getUrl ).toString();
QSharedPointer< QIODevice > sp;
if ( urlStr.isEmpty() )
if ( m_urlCallbackIsAsync )
{
QString qid = uuid();
QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2', '%3' );" ).arg( m_urlCallback )
.arg( qid )
.arg( origResultUrl );
m_streamCallbacks.insert( qid, callback );
m_resolver->m_engine->mainFrame()->evaluateJavaScript( getUrl );
}
else
{
QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2' );" ).arg( m_urlCallback )
.arg( origResultUrl );
QString urlStr = m_resolver->m_engine->mainFrame()->evaluateJavaScript( getUrl ).toString();
returnStreamUrl( urlStr, callback );
}
}
void
QtScriptResolverHelper::reportStreamUrl( const QString& qid,
const QString& streamUrl )
{
if ( !m_streamCallbacks.contains( qid ) )
return;
boost::function< void( QSharedPointer< QIODevice >& ) > callback = m_streamCallbacks.take( qid );
returnStreamUrl( streamUrl, callback );
}
void
QtScriptResolverHelper::returnStreamUrl( const QString& streamUrl, boost::function< void( QSharedPointer< QIODevice >& ) > callback )
{
QSharedPointer< QIODevice > sp;
if ( streamUrl.isEmpty() )
{
callback( sp );
return;
}
QUrl url = QUrl::fromEncoded( urlStr.toUtf8() );
QUrl url = QUrl::fromEncoded( streamUrl.toUtf8() );
QNetworkRequest req( url );
tDebug() << "Creating a QNetowrkReply with url:" << req.url().toString();
QNetworkReply* reply = TomahawkUtils::nam()->get( req );

View File

@ -54,7 +54,8 @@ public:
Q_INVOKABLE QString hmac( const QByteArray& key, const QByteArray& input );
Q_INVOKABLE QString md5( const QByteArray& input );
Q_INVOKABLE void addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName );
Q_INVOKABLE void addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName, const QString& async = "false" );
Q_INVOKABLE void reportStreamUrl( const QString& origResultUrl, const QString& streamUrl );
Q_INVOKABLE QByteArray base64Encode( const QByteArray& input );
Q_INVOKABLE QByteArray base64Decode( const QByteArray& input );
@ -82,7 +83,10 @@ public slots:
void reportCapabilities( const QVariant& capabilities );
private:
void returnStreamUrl( const QString& streamUrl, boost::function< void( QSharedPointer< QIODevice >& ) > callback );
QString m_scriptPath, m_urlCallback;
QHash< QString, boost::function< void( QSharedPointer< QIODevice >& ) > > m_streamCallbacks;
bool m_urlCallbackIsAsync;
QVariantMap m_resolverConfig;
QtScriptResolver* m_resolver;
#ifdef QCA2_FOUND