diff --git a/src/libtomahawk/audio/AudioEngine.cpp b/src/libtomahawk/audio/AudioEngine.cpp index b42f757fd..87aa12839 100644 --- a/src/libtomahawk/audio/AudioEngine.cpp +++ b/src/libtomahawk/audio/AudioEngine.cpp @@ -639,8 +639,7 @@ AudioEngine::loadTrack( const Tomahawk::result_ptr& result ) setCurrentTrack( result ); - if ( !TomahawkUtils::isHttpResult( d->currentTrack->url() ) && - !TomahawkUtils::isLocalResult( d->currentTrack->url() ) ) + if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) ) { boost::function< void ( QSharedPointer< QIODevice >& ) > callback = boost::bind( &AudioEngine::performLoadTrack, this, result, _1 ); @@ -661,9 +660,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe bool err = false; { - if ( !TomahawkUtils::isHttpResult( d->currentTrack->url() ) && - !TomahawkUtils::isLocalResult( d->currentTrack->url() ) && - ( !io || io.isNull() ) ) + if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) && ( !io || io.isNull() ) ) { tLog() << "Error getting iodevice for" << result->url(); err = true; @@ -675,8 +672,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe d->state = Loading; emit loading( d->currentTrack ); - if ( !TomahawkUtils::isHttpResult( d->currentTrack->url() ) && - !TomahawkUtils::isLocalResult( d->currentTrack->url() ) ) + if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) ) { if ( QNetworkReply* qnr_io = qobject_cast< QNetworkReply* >( io.data() ) ) d->mediaObject->setCurrentSource( new QNR_IODeviceStream( qnr_io, this ) ); @@ -686,6 +682,9 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe } else { + /* + * TODO: Do we need this anymore as we now do HTTP streaming ourselves? + * Maybe this can be useful for letting phonon do other protocols? if ( !TomahawkUtils::isLocalResult( d->currentTrack->url() ) ) { QUrl furl = d->currentTrack->url(); @@ -698,7 +697,7 @@ AudioEngine::performLoadTrack( const Tomahawk::result_ptr& result, QSharedPointe tLog( LOGVERBOSE ) << "Passing to Phonon:" << furl; d->mediaObject->setCurrentSource( furl ); } - else + else*/ { QString furl = d->currentTrack->url(); if ( furl.startsWith( "file://" ) ) diff --git a/src/libtomahawk/network/Servent.cpp b/src/libtomahawk/network/Servent.cpp index 26d231975..2769a8957 100644 --- a/src/libtomahawk/network/Servent.cpp +++ b/src/libtomahawk/network/Servent.cpp @@ -35,6 +35,7 @@ #include "utils/TomahawkUtils.h" #include "utils/Logger.h" #include "utils/NetworkAccessManager.h" +#include "utils/NetworkReply.h" #include "Connection.h" #include "ControlConnection.h" @@ -62,6 +63,7 @@ Q_DECLARE_METATYPE( QList< SipInfo > ) Q_DECLARE_METATYPE( Connection* ) Q_DECLARE_METATYPE( QTcpSocketExtra* ) Q_DECLARE_METATYPE( Tomahawk::peerinfo_ptr ) +Q_DECLARE_METATYPE( IODeviceCallback ) using namespace Tomahawk; @@ -1402,10 +1404,20 @@ Servent::httpIODeviceFactory( const Tomahawk::result_ptr& result, boost::function< void ( QSharedPointer< QIODevice >& ) > callback ) { QNetworkRequest req( result->url() ); - QNetworkReply* reply = Tomahawk::Utils::nam()->get( req ); + // Follow HTTP Redirects + NetworkReply* reply = new NetworkReply( Tomahawk::Utils::nam()->get( req ) ); + qRegisterMetaType("NetworkReply*"); + qRegisterMetaType("IODeviceCallback"); + NewClosure( reply, SIGNAL( finished() ), + this, SLOT( httpIODeviceReady( NetworkReply*, IODeviceCallback ) ), + reply, callback ); +} +void +Servent::httpIODeviceReady( NetworkReply* reply, IODeviceCallback callback ) +{ //boost::functions cannot accept temporaries as parameters - QSharedPointer< QIODevice > sp = QSharedPointer< QIODevice >( reply, &QObject::deleteLater ); + QSharedPointer< QIODevice > sp = QSharedPointer< QIODevice >( reply->reply(), &QObject::deleteLater ); callback( sp ); } diff --git a/src/libtomahawk/network/Servent.h b/src/libtomahawk/network/Servent.h index c20c81925..49eb32459 100644 --- a/src/libtomahawk/network/Servent.h +++ b/src/libtomahawk/network/Servent.h @@ -36,13 +36,14 @@ class Connection; class Connector; class ControlConnection; -class StreamConnection; +class NetworkReply; +class PeerInfo; +class PortFwdThread; class ProxyConnection; class QTcpSocketExtra; class RemoteCollectionConnection; -class PortFwdThread; -class PeerInfo; class SipInfo; +class StreamConnection; namespace boost { @@ -51,6 +52,7 @@ namespace boost typedef boost::function< void( const Tomahawk::result_ptr&, boost::function< void( QSharedPointer< QIODevice >& ) > )> IODeviceFactoryFunc; +typedef boost::function< void ( QSharedPointer< QIODevice >& ) > IODeviceCallback; class ServentPrivate; @@ -162,6 +164,7 @@ public slots: void triggerDBSync(); void onSipInfoChanged(); + void httpIODeviceReady( NetworkReply* reply, IODeviceCallback callback ); private slots: void deleteLazyOffer( const QString& key ); diff --git a/src/libtomahawk/utils/NetworkReply.h b/src/libtomahawk/utils/NetworkReply.h index 7ee0cf21f..e9892d31d 100644 --- a/src/libtomahawk/utils/NetworkReply.h +++ b/src/libtomahawk/utils/NetworkReply.h @@ -61,4 +61,6 @@ private: QUrl m_url; }; +Q_DECLARE_METATYPE( QSharedPointer ) + #endif // NETWORKREPLY_H