mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-13 17:43:59 +02:00
Add urlTranslator and always pass result AND url to all handlers/factories
This commit is contained in:
@@ -244,7 +244,7 @@ Api_v1::sid( QxtWebRequestEvent* event, QString unused )
|
|||||||
|
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback =
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback =
|
||||||
boost::bind( &Api_v1::processSid, this, event, rp, _1 );
|
boost::bind( &Api_v1::processSid, this, event, rp, _1 );
|
||||||
Tomahawk::UrlHandler::getIODeviceForUrl( rp, callback );
|
Tomahawk::UrlHandler::getIODeviceForUrl( rp, rp->url(), callback );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -34,18 +34,19 @@ namespace Tomahawk {
|
|||||||
namespace UrlHandler {
|
namespace UrlHandler {
|
||||||
|
|
||||||
QMap< QString, IODeviceFactoryFunc > iofactories;
|
QMap< QString, IODeviceFactoryFunc > iofactories;
|
||||||
|
QMap< QString, UrlTranslatorFunc > urltranslators;
|
||||||
|
|
||||||
void
|
void
|
||||||
initialiseDefaultIOFactories()
|
initialiseDefaultIOFactories()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
// _1 = result, _2 = callback function for IODevice
|
// _1 = result, _2 = callback function for IODevice
|
||||||
IODeviceFactoryFunc fac = boost::bind( localFileIODeviceFactory, _1, _2 );
|
IODeviceFactoryFunc fac = boost::bind( localFileIODeviceFactory, _1, _2, _3 );
|
||||||
iofactories.insert( "file", fac );
|
iofactories.insert( "file", fac );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
IODeviceFactoryFunc fac = boost::bind( httpIODeviceFactory, _1, _2 );
|
IODeviceFactoryFunc fac = boost::bind( httpIODeviceFactory, _1, _2, _3 );
|
||||||
iofactories.insert( "http", fac );
|
iofactories.insert( "http", fac );
|
||||||
iofactories.insert( "https", fac );
|
iofactories.insert( "https", fac );
|
||||||
}
|
}
|
||||||
@@ -65,7 +66,7 @@ registerIODeviceFactory( const QString &proto, IODeviceFactoryFunc fac )
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
getIODeviceForUrl( const Tomahawk::result_ptr& result,
|
getIODeviceForUrl( const Tomahawk::result_ptr& result, const QString& url,
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
||||||
{
|
{
|
||||||
if ( iofactories.isEmpty() )
|
if ( iofactories.isEmpty() )
|
||||||
@@ -76,7 +77,7 @@ getIODeviceForUrl( const Tomahawk::result_ptr& result,
|
|||||||
QSharedPointer<QIODevice> sp;
|
QSharedPointer<QIODevice> sp;
|
||||||
|
|
||||||
QRegExp rx( "^([a-zA-Z0-9]+)://(.+)$" );
|
QRegExp rx( "^([a-zA-Z0-9]+)://(.+)$" );
|
||||||
if ( rx.indexIn( result->url() ) == -1 )
|
if ( rx.indexIn( url ) == -1 )
|
||||||
{
|
{
|
||||||
callback( sp );
|
callback( sp );
|
||||||
return;
|
return;
|
||||||
@@ -90,16 +91,16 @@ getIODeviceForUrl( const Tomahawk::result_ptr& result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// JSResolverHelper::customIODeviceFactory is async!
|
// JSResolverHelper::customIODeviceFactory is async!
|
||||||
iofactories.value( proto )( result, callback );
|
iofactories.value( proto )( result, url, callback );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
localFileIODeviceFactory( const Tomahawk::result_ptr& result,
|
localFileIODeviceFactory( const Tomahawk::result_ptr&, const QString& url,
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
||||||
{
|
{
|
||||||
// ignore "file://" at front of url
|
// ignore "file://" at front of url
|
||||||
QFile* io = new QFile( result->url().mid( QString( "file://" ).length() ) );
|
QFile* io = new QFile( url.mid( QString( "file://" ).length() ) );
|
||||||
if ( io )
|
if ( io )
|
||||||
io->open( QIODevice::ReadOnly );
|
io->open( QIODevice::ReadOnly );
|
||||||
|
|
||||||
@@ -110,10 +111,10 @@ localFileIODeviceFactory( const Tomahawk::result_ptr& result,
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
httpIODeviceFactory( const Tomahawk::result_ptr& result,
|
httpIODeviceFactory( const Tomahawk::result_ptr&, const QString& url,
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
||||||
{
|
{
|
||||||
QNetworkRequest req( result->url() );
|
QNetworkRequest req( url );
|
||||||
// Follow HTTP Redirects
|
// Follow HTTP Redirects
|
||||||
NetworkReply* reply = new NetworkReply( Tomahawk::Utils::nam()->get( req ) );
|
NetworkReply* reply = new NetworkReply( Tomahawk::Utils::nam()->get( req ) );
|
||||||
qRegisterMetaType<NetworkReply*>("NetworkReply*");
|
qRegisterMetaType<NetworkReply*>("NetworkReply*");
|
||||||
@@ -124,6 +125,31 @@ httpIODeviceFactory( const Tomahawk::result_ptr& result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
getUrlTranslation( const Tomahawk::result_ptr& result, const QString& url, boost::function< void ( const QString& ) > callback )
|
||||||
|
{
|
||||||
|
QRegExp rx( "^([a-zA-Z0-9]+)://(.+)$" );
|
||||||
|
if ( rx.indexIn( url ) == -1 )
|
||||||
|
{
|
||||||
|
callback( QString() );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString proto = rx.cap( 1 );
|
||||||
|
if ( !urltranslators.contains( proto ) )
|
||||||
|
{
|
||||||
|
callback( url );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
urltranslators.value( proto )( result, url, callback );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
registerUrlTranslator( const QString &proto, UrlTranslatorFunc fac )
|
||||||
|
{
|
||||||
|
urltranslators.insert( proto, fac );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace UrlHandler
|
} // namespace UrlHandler
|
||||||
|
@@ -27,8 +27,10 @@
|
|||||||
|
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
|
|
||||||
typedef boost::function< void( const Tomahawk::result_ptr&,
|
typedef boost::function< void( const Tomahawk::result_ptr&, const QString&,
|
||||||
boost::function< void( QSharedPointer< QIODevice >& ) > )> IODeviceFactoryFunc;
|
boost::function< void( QSharedPointer< QIODevice >& ) > )> IODeviceFactoryFunc;
|
||||||
|
typedef boost::function< void( const Tomahawk::result_ptr&, const QString&,
|
||||||
|
boost::function< void( const QString& ) > )> UrlTranslatorFunc;
|
||||||
typedef boost::function< void ( QSharedPointer< QIODevice >& ) > IODeviceCallback;
|
typedef boost::function< void ( QSharedPointer< QIODevice >& ) > IODeviceCallback;
|
||||||
|
|
||||||
|
|
||||||
@@ -38,10 +40,16 @@ namespace Tomahawk
|
|||||||
namespace UrlHandler
|
namespace UrlHandler
|
||||||
{
|
{
|
||||||
|
|
||||||
DLLEXPORT void getIODeviceForUrl( const Tomahawk::result_ptr& result, boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
DLLEXPORT void getIODeviceForUrl( const Tomahawk::result_ptr&, const QString& url, boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
||||||
DLLEXPORT void registerIODeviceFactory( const QString& proto, IODeviceFactoryFunc fac );
|
DLLEXPORT void registerIODeviceFactory( const QString& proto, IODeviceFactoryFunc fac );
|
||||||
DLLEXPORT void localFileIODeviceFactory( const Tomahawk::result_ptr& result, boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
DLLEXPORT void localFileIODeviceFactory( const Tomahawk::result_ptr& result, const QString& url,
|
||||||
DLLEXPORT void httpIODeviceFactory( const Tomahawk::result_ptr& result, boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
||||||
|
DLLEXPORT void httpIODeviceFactory( const Tomahawk::result_ptr& result, const QString& url,
|
||||||
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
||||||
|
|
||||||
|
DLLEXPORT void getUrlTranslation( const Tomahawk::result_ptr& result, const QString& url,
|
||||||
|
boost::function< void ( const QString& ) > callback );
|
||||||
|
DLLEXPORT void registerUrlTranslator( const QString &proto, UrlTranslatorFunc fac );
|
||||||
|
|
||||||
} // namespace UrlHandler
|
} // namespace UrlHandler
|
||||||
|
|
||||||
|
@@ -631,20 +631,41 @@ AudioEngine::loadTrack( const Tomahawk::result_ptr& result )
|
|||||||
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) && !TomahawkUtils::isHttpResult( d->currentTrack->url() )
|
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) && !TomahawkUtils::isHttpResult( d->currentTrack->url() )
|
||||||
&& !TomahawkUtils::isRtmpResult( d->currentTrack->url() ) )
|
&& !TomahawkUtils::isRtmpResult( d->currentTrack->url() ) )
|
||||||
{
|
{
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback =
|
boost::function< void ( const QString& ) > callback =
|
||||||
boost::bind( &AudioEngine::performLoadTrack, this, result, _1 );
|
boost::bind( &AudioEngine::performLoadIODevice, this, result, _1 );
|
||||||
Tomahawk::UrlHandler::getIODeviceForUrl( d->currentTrack, callback );
|
Tomahawk::UrlHandler::getUrlTranslation( d->currentTrack, d->currentTrack->url(), callback );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QSharedPointer< QIODevice > io;
|
QSharedPointer< QIODevice > io;
|
||||||
performLoadTrack( result, io );
|
performLoadTrack( result, result->url(), io );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointer< QIODevice >& io )
|
AudioEngine::performLoadIODevice( const result_ptr& result, const QString& url )
|
||||||
|
{
|
||||||
|
Q_D( AudioEngine );
|
||||||
|
tDebug( LOGEXTRA ) << Q_FUNC_INFO << ( result.isNull() ? QString() : url );
|
||||||
|
|
||||||
|
if ( !TomahawkUtils::isLocalResult( url ) && !TomahawkUtils::isHttpResult( url )
|
||||||
|
&& !TomahawkUtils::isRtmpResult( url ) )
|
||||||
|
{
|
||||||
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback =
|
||||||
|
boost::bind( &AudioEngine::performLoadTrack, this, result, url, _1 );
|
||||||
|
Tomahawk::UrlHandler::getIODeviceForUrl( result, url, callback );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QSharedPointer< QIODevice > io;
|
||||||
|
performLoadTrack( result, url, io );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, const QString& url, QSharedPointer< QIODevice >& io )
|
||||||
{
|
{
|
||||||
Q_D( AudioEngine );
|
Q_D( AudioEngine );
|
||||||
if ( currentTrack() != result )
|
if ( currentTrack() != result )
|
||||||
@@ -657,7 +678,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
|
|||||||
|
|
||||||
bool err = false;
|
bool err = false;
|
||||||
{
|
{
|
||||||
if ( !( TomahawkUtils::isLocalResult( d->currentTrack->url() ) || TomahawkUtils::isHttpResult( d->currentTrack->url() ) || TomahawkUtils::isRtmpResult( d->currentTrack->url() ) )
|
if ( !( TomahawkUtils::isLocalResult( url ) || TomahawkUtils::isHttpResult( url ) || TomahawkUtils::isRtmpResult( url ) )
|
||||||
&& ( !io || io.isNull() ) )
|
&& ( !io || io.isNull() ) )
|
||||||
{
|
{
|
||||||
tLog() << "Error getting iodevice for" << result->url();
|
tLog() << "Error getting iodevice for" << result->url();
|
||||||
@@ -666,12 +687,12 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
|
|||||||
|
|
||||||
if ( !err )
|
if ( !err )
|
||||||
{
|
{
|
||||||
tLog() << "Starting new song:" << d->currentTrack->url();
|
tLog() << "Starting new song:" << url;
|
||||||
d->state = Loading;
|
d->state = Loading;
|
||||||
emit loading( d->currentTrack );
|
emit loading( d->currentTrack );
|
||||||
|
|
||||||
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) && !TomahawkUtils::isHttpResult( d->currentTrack->url() )
|
if ( !TomahawkUtils::isLocalResult( url ) && !TomahawkUtils::isHttpResult( url )
|
||||||
&& !TomahawkUtils::isRtmpResult( d->currentTrack->url() ) )
|
&& !TomahawkUtils::isRtmpResult( url ) )
|
||||||
{
|
{
|
||||||
QSharedPointer<QNetworkReply> qnr = io.objectCast<QNetworkReply>();
|
QSharedPointer<QNetworkReply> qnr = io.objectCast<QNetworkReply>();
|
||||||
if ( !qnr.isNull() )
|
if ( !qnr.isNull() )
|
||||||
@@ -696,13 +717,13 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
|
|||||||
* TODO: Do we need this anymore as we now do HTTP streaming ourselves?
|
* TODO: Do we need this anymore as we now do HTTP streaming ourselves?
|
||||||
* Maybe this can be useful for letting phonon do other protocols?
|
* Maybe this can be useful for letting phonon do other protocols?
|
||||||
*/
|
*/
|
||||||
if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) )
|
if ( !TomahawkUtils::isLocalResult( url ) )
|
||||||
{
|
{
|
||||||
QUrl furl = d->currentTrack->url();
|
QUrl furl = url;
|
||||||
if ( d->currentTrack->url().contains( "?" ) )
|
if ( url.contains( "?" ) )
|
||||||
{
|
{
|
||||||
furl = QUrl( d->currentTrack->url().left( d->currentTrack->url().indexOf( '?' ) ) );
|
furl = QUrl( url.left( url.indexOf( '?' ) ) );
|
||||||
TomahawkUtils::urlSetQuery( furl, QString( d->currentTrack->url().mid( d->currentTrack->url().indexOf( '?' ) + 1 ) ) );
|
TomahawkUtils::urlSetQuery( furl, QString( url.mid( url.indexOf( '?' ) + 1 ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
tLog( LOGVERBOSE ) << "Passing to Phonon:" << furl;
|
tLog( LOGVERBOSE ) << "Passing to Phonon:" << furl;
|
||||||
@@ -710,7 +731,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString furl = d->currentTrack->url();
|
QString furl = url;
|
||||||
if ( furl.startsWith( "file://" ) )
|
if ( furl.startsWith( "file://" ) )
|
||||||
furl = furl.right( furl.length() - 7 );
|
furl = furl.right( furl.length() - 7 );
|
||||||
|
|
||||||
|
@@ -132,7 +132,8 @@ signals:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void loadTrack( const Tomahawk::result_ptr& result ); //async!
|
void loadTrack( const Tomahawk::result_ptr& result ); //async!
|
||||||
void performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointer< QIODevice >& io ); //only call from loadTrack kthxbi
|
void performLoadIODevice( const Tomahawk::result_ptr& result, const QString& url ); //only call from loadTrack kthxbi
|
||||||
|
void performLoadTrack( const Tomahawk::result_ptr& result, const QString& url, QSharedPointer< QIODevice >& io ); //only call from loadTrack or performLoadIODevice kthxbi
|
||||||
void loadPreviousTrack();
|
void loadPreviousTrack();
|
||||||
void loadNextTrack();
|
void loadNextTrack();
|
||||||
|
|
||||||
@@ -155,7 +156,7 @@ private:
|
|||||||
void audioDataArrived( QMap< AudioEngine::AudioChannel, QVector< qint16 > >& data );
|
void audioDataArrived( QMap< AudioEngine::AudioChannel, QVector< qint16 > >& data );
|
||||||
|
|
||||||
|
|
||||||
Q_DECLARE_PRIVATE( AudioEngine );
|
Q_DECLARE_PRIVATE( AudioEngine )
|
||||||
AudioEnginePrivate* d_ptr;
|
AudioEnginePrivate* d_ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -88,7 +88,7 @@ Servent::Servent( QObject* parent )
|
|||||||
|
|
||||||
setProxy( QNetworkProxy::NoProxy );
|
setProxy( QNetworkProxy::NoProxy );
|
||||||
|
|
||||||
IODeviceFactoryFunc fac = boost::bind( &Servent::remoteIODeviceFactory, this, _1, _2 );
|
IODeviceFactoryFunc fac = boost::bind( &Servent::remoteIODeviceFactory, this, _1, _2, _3 );
|
||||||
Tomahawk::UrlHandler::registerIODeviceFactory( "servent", fac );
|
Tomahawk::UrlHandler::registerIODeviceFactory( "servent", fac );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1224,12 +1224,12 @@ Servent::claimOffer( ControlConnection* cc, const QString &nodeid, const QString
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Servent::remoteIODeviceFactory( const Tomahawk::result_ptr& result,
|
Servent::remoteIODeviceFactory( const Tomahawk::result_ptr& result, const QString& url,
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback )
|
||||||
{
|
{
|
||||||
QSharedPointer<QIODevice> sp;
|
QSharedPointer<QIODevice> sp;
|
||||||
|
|
||||||
QStringList parts = result->url().mid( QString( "servent://" ).length() ).split( "\t" );
|
QStringList parts = url.mid( QString( "servent://" ).length() ).split( "\t" );
|
||||||
const QString sourceName = parts.at( 0 );
|
const QString sourceName = parts.at( 0 );
|
||||||
const QString fileId = parts.at( 1 );
|
const QString fileId = parts.at( 1 );
|
||||||
source_ptr s = SourceList::instance()->get( sourceName );
|
source_ptr s = SourceList::instance()->get( sourceName );
|
||||||
|
@@ -77,7 +77,7 @@ public:
|
|||||||
ControlConnection* lookupControlConnection( const SipInfo& sipInfo );
|
ControlConnection* lookupControlConnection( const SipInfo& sipInfo );
|
||||||
ControlConnection* lookupControlConnection( const QString& nodeid );
|
ControlConnection* lookupControlConnection( const QString& nodeid );
|
||||||
|
|
||||||
void remoteIODeviceFactory( const Tomahawk::result_ptr& result,
|
void remoteIODeviceFactory( const Tomahawk::result_ptr& result, const QString& url,
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback );
|
||||||
|
|
||||||
// you may call this method as often as you like for the same peerInfo, dupe checking is done inside
|
// you may call this method as often as you like for the same peerInfo, dupe checking is done inside
|
||||||
|
@@ -190,7 +190,7 @@ StreamConnection::startSending( const Tomahawk::result_ptr& result )
|
|||||||
|
|
||||||
boost::function< void ( QSharedPointer< QIODevice >& ) > callback =
|
boost::function< void ( QSharedPointer< QIODevice >& ) > callback =
|
||||||
boost::bind( &StreamConnection::reallyStartSending, this, result, _1 );
|
boost::bind( &StreamConnection::reallyStartSending, this, result, _1 );
|
||||||
Tomahawk::UrlHandler::getIODeviceForUrl( m_result, callback );
|
Tomahawk::UrlHandler::getIODeviceForUrl( m_result, m_result->url(), callback );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -49,6 +49,7 @@ using namespace Tomahawk;
|
|||||||
JSResolverHelper::JSResolverHelper( const QString& scriptPath, JSResolver* parent )
|
JSResolverHelper::JSResolverHelper( const QString& scriptPath, JSResolver* parent )
|
||||||
: QObject( parent )
|
: QObject( parent )
|
||||||
, m_urlCallbackIsAsync( false )
|
, m_urlCallbackIsAsync( false )
|
||||||
|
, m_urlTranslatorIsAsync( false )
|
||||||
{
|
{
|
||||||
m_scriptPath = scriptPath;
|
m_scriptPath = scriptPath;
|
||||||
m_resolver = parent;
|
m_resolver = parent;
|
||||||
@@ -453,15 +454,43 @@ JSResolverHelper::addCustomUrlHandler( const QString& protocol,
|
|||||||
{
|
{
|
||||||
m_urlCallbackIsAsync = ( isAsynchronous.toLower() == "true" ) ? true : false;
|
m_urlCallbackIsAsync = ( isAsynchronous.toLower() == "true" ) ? true : false;
|
||||||
|
|
||||||
boost::function< void( const Tomahawk::result_ptr&,
|
boost::function< void( const Tomahawk::result_ptr&, const QString&,
|
||||||
boost::function< void( QSharedPointer< QIODevice >& ) > )> fac =
|
boost::function< void( QSharedPointer< QIODevice >& ) > )> fac =
|
||||||
boost::bind( &JSResolverHelper::customIODeviceFactory, this, _1, _2 );
|
boost::bind( &JSResolverHelper::customIODeviceFactory, this, _1, _2, _3 );
|
||||||
Tomahawk::UrlHandler::registerIODeviceFactory( protocol, fac );
|
Tomahawk::UrlHandler::registerIODeviceFactory( protocol, fac );
|
||||||
|
|
||||||
m_urlCallback = callbackFuncName;
|
m_urlCallback = callbackFuncName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JSResolverHelper::addCustomUrlTranslator( const QString& protocol,
|
||||||
|
const QString& callbackFuncName,
|
||||||
|
const QString& isAsynchronous )
|
||||||
|
{
|
||||||
|
m_urlTranslatorIsAsync = ( isAsynchronous.toLower() == "true" ) ? true : false;
|
||||||
|
|
||||||
|
boost::function< void( const Tomahawk::result_ptr&, const QString&,
|
||||||
|
boost::function< void( const QString& ) > )> fac =
|
||||||
|
boost::bind( &JSResolverHelper::customUrlTranslator, this, _1, _2, _3 );
|
||||||
|
Tomahawk::UrlHandler::registerUrlTranslator( protocol, fac );
|
||||||
|
|
||||||
|
m_urlTranslator = callbackFuncName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JSResolverHelper::reportUrlTranslation( const QString& qid, const QString& streamUrl )
|
||||||
|
{
|
||||||
|
if ( !m_translatorCallbacks.contains( qid ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
boost::function< void( const QString& ) > callback = m_translatorCallbacks.take( qid );
|
||||||
|
|
||||||
|
returnUrlTranslation( streamUrl, callback );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QByteArray
|
QByteArray
|
||||||
JSResolverHelper::base64Encode( const QByteArray& input )
|
JSResolverHelper::base64Encode( const QByteArray& input )
|
||||||
{
|
{
|
||||||
@@ -477,11 +506,11 @@ JSResolverHelper::base64Decode( const QByteArray& input )
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
JSResolverHelper::customIODeviceFactory( const Tomahawk::result_ptr& result,
|
JSResolverHelper::customIODeviceFactory( const Tomahawk::result_ptr&, const QString& url,
|
||||||
boost::function< void( QSharedPointer< QIODevice >& ) > callback )
|
boost::function< void( QSharedPointer< QIODevice >& ) > callback )
|
||||||
{
|
{
|
||||||
//can be sync or async
|
//can be sync or async
|
||||||
QString origResultUrl = QString( QUrl( result->url() ).toEncoded() );
|
QString origResultUrl = QString( QUrl( url ).toEncoded() );
|
||||||
|
|
||||||
if ( m_urlCallbackIsAsync )
|
if ( m_urlCallbackIsAsync )
|
||||||
{
|
{
|
||||||
@@ -505,6 +534,34 @@ JSResolverHelper::customIODeviceFactory( const Tomahawk::result_ptr& result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JSResolverHelper::customUrlTranslator( const Tomahawk::result_ptr&, const QString& url, boost::function<void (const QString& )> callback )
|
||||||
|
{
|
||||||
|
//can be sync or async
|
||||||
|
QString origResultUrl = QString( QUrl( url ).toEncoded() );
|
||||||
|
|
||||||
|
if ( m_urlTranslatorIsAsync )
|
||||||
|
{
|
||||||
|
QString qid = uuid();
|
||||||
|
QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2', '%3' );" ).arg( m_urlTranslator )
|
||||||
|
.arg( qid )
|
||||||
|
.arg( origResultUrl );
|
||||||
|
|
||||||
|
m_translatorCallbacks.insert( qid, callback );
|
||||||
|
m_resolver->d_func()->engine->mainFrame()->evaluateJavaScript( getUrl );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2' );" ).arg( m_urlTranslator )
|
||||||
|
.arg( origResultUrl );
|
||||||
|
|
||||||
|
QString urlStr = m_resolver->d_func()->engine->mainFrame()->evaluateJavaScript( getUrl ).toString();
|
||||||
|
|
||||||
|
returnUrlTranslation( urlStr, callback );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
JSResolverHelper::reportStreamUrl( const QString& qid,
|
JSResolverHelper::reportStreamUrl( const QString& qid,
|
||||||
const QString& streamUrl )
|
const QString& streamUrl )
|
||||||
@@ -537,3 +594,18 @@ JSResolverHelper::returnStreamUrl( const QString& streamUrl, boost::function< vo
|
|||||||
sp = QSharedPointer< QIODevice >( reply, &QObject::deleteLater );
|
sp = QSharedPointer< QIODevice >( reply, &QObject::deleteLater );
|
||||||
callback( sp );
|
callback( sp );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
JSResolverHelper::returnUrlTranslation( const QString& streamUrl, boost::function<void (const QString& )> callback )
|
||||||
|
{
|
||||||
|
if ( streamUrl.isEmpty() )
|
||||||
|
{
|
||||||
|
callback( QString() );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//boost::functions cannot accept temporaries as parameters
|
||||||
|
// sp = QSharedPointer< QString >( streamUrl , &QObject::deleteLater );
|
||||||
|
callback( streamUrl );
|
||||||
|
}
|
||||||
|
@@ -46,12 +46,16 @@ public:
|
|||||||
|
|
||||||
Q_INVOKABLE void addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName, const QString& isAsynchronous = "false" );
|
Q_INVOKABLE void addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName, const QString& isAsynchronous = "false" );
|
||||||
Q_INVOKABLE void reportStreamUrl( const QString& qid, const QString& streamUrl );
|
Q_INVOKABLE void reportStreamUrl( const QString& qid, const QString& streamUrl );
|
||||||
|
Q_INVOKABLE void addCustomUrlTranslator( const QString& protocol, const QString& callbackFuncName, const QString& isAsynchronous = "false" );
|
||||||
|
Q_INVOKABLE void reportUrlTranslation( const QString& qid, const QString& streamUrl );
|
||||||
|
|
||||||
Q_INVOKABLE QByteArray base64Encode( const QByteArray& input );
|
Q_INVOKABLE QByteArray base64Encode( const QByteArray& input );
|
||||||
Q_INVOKABLE QByteArray base64Decode( const QByteArray& input );
|
Q_INVOKABLE QByteArray base64Decode( const QByteArray& input );
|
||||||
|
|
||||||
void customIODeviceFactory( const Tomahawk::result_ptr& result,
|
void customIODeviceFactory( const Tomahawk::result_ptr&, const QString& url,
|
||||||
boost::function< void( QSharedPointer< QIODevice >& ) > callback ); // async
|
boost::function< void( QSharedPointer< QIODevice >& ) > callback ); // async
|
||||||
|
void customUrlTranslator( const Tomahawk::result_ptr&, const QString& url,
|
||||||
|
boost::function< void( const QString& ) > callback ); // async
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
QByteArray readRaw( const QString& fileName );
|
QByteArray readRaw( const QString& fileName );
|
||||||
@@ -82,10 +86,13 @@ private slots:
|
|||||||
private:
|
private:
|
||||||
Tomahawk::query_ptr parseTrack( const QVariantMap& track );
|
Tomahawk::query_ptr parseTrack( const QVariantMap& track );
|
||||||
void returnStreamUrl( const QString& streamUrl, boost::function< void( QSharedPointer< QIODevice >& ) > callback );
|
void returnStreamUrl( const QString& streamUrl, boost::function< void( QSharedPointer< QIODevice >& ) > callback );
|
||||||
|
void returnUrlTranslation( const QString& streamUrl, boost::function< void( const QString& ) > callback );
|
||||||
|
|
||||||
QString m_scriptPath, m_urlCallback;
|
QString m_scriptPath, m_urlCallback, m_urlTranslator;
|
||||||
QHash< QString, boost::function< void( QSharedPointer< QIODevice >& ) > > m_streamCallbacks;
|
QHash< QString, boost::function< void( QSharedPointer< QIODevice >& ) > > m_streamCallbacks;
|
||||||
|
QHash< QString, boost::function< void( const QString& ) > > m_translatorCallbacks;
|
||||||
bool m_urlCallbackIsAsync;
|
bool m_urlCallbackIsAsync;
|
||||||
|
bool m_urlTranslatorIsAsync;
|
||||||
QVariantMap m_resolverConfig;
|
QVariantMap m_resolverConfig;
|
||||||
JSResolver* m_resolver;
|
JSResolver* m_resolver;
|
||||||
QString m_pendingUrl;
|
QString m_pendingUrl;
|
||||||
|
Reference in New Issue
Block a user