1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-19 04:11:46 +02:00

* Work in progress: Script Resolvers.

This commit is contained in:
Christian Muehlhaeuser
2011-03-14 03:10:29 +01:00
parent 736e0800de
commit b7b6a64171
4 changed files with 75 additions and 44 deletions

View File

@@ -20,6 +20,7 @@
#include "portfwdthread.h"
#include "tomahawksettings.h"
#include "utils/tomahawkutils.h"
using namespace Tomahawk;
@@ -42,7 +43,7 @@ Servent::Servent( QObject* parent )
s_instance = this;
setProxy( QNetworkProxy::NoProxy );
{
boost::function<QSharedPointer<QIODevice>(result_ptr)> fac =
boost::bind( &Servent::localFileIODeviceFactory, this, _1 );
@@ -760,9 +761,8 @@ Servent::localFileIODeviceFactory( const Tomahawk::result_ptr& result )
QSharedPointer<QIODevice>
Servent::httpIODeviceFactory( const Tomahawk::result_ptr& result )
{
/* qDebug() << Q_FUNC_INFO << result->url();
qDebug() << Q_FUNC_INFO << result->url();
QNetworkRequest req( result->url() );
QNetworkReply* reply = APP->nam()->get( req );
return QSharedPointer<QIODevice>( reply );*/
return QSharedPointer<QIODevice>();
QNetworkReply* reply = TomahawkUtils::nam()->get( req );
return QSharedPointer<QIODevice>( reply );
}

View File

@@ -199,7 +199,7 @@ Pipeline::shuntNext()
query_ptr q;
{
QMutexLocker lock( &m_mut );
if ( m_queries_pending.isEmpty() )
{
emit idle();
@@ -255,7 +255,7 @@ Pipeline::shunt( const query_ptr& q )
lasttimeout = r->timeout();
// resolvers aren't allowed to block in this call:
//qDebug() << "Dispaching to resolver" << r->name();
qDebug() << "Dispatching to resolver" << r->name();
{
QMutexLocker lock( &m_mut );
@@ -267,7 +267,7 @@ Pipeline::shunt( const query_ptr& q )
state = m_qidsState.value( q->id() );
}
qDebug() << Q_FUNC_INFO << "inserting to qidsstate:" << q->id() << state + 1;
// qDebug() << Q_FUNC_INFO << "inserting to qidsstate:" << q->id() << state + 1;
m_qidsState.insert( q->id(), state + 1 );
}

View File

@@ -2,12 +2,14 @@
#include <QtEndian>
#include "artist.h"
#include "album.h"
#include "pipeline.h"
#include "sourcelist.h"
ScriptResolver::ScriptResolver(const QString& exe) :
Tomahawk::Resolver()
ScriptResolver::ScriptResolver( const QString& exe )
: Tomahawk::Resolver()
, m_cmd( exe )
, m_num_restarts( 0 )
, m_msgsize( 0 )
@@ -15,26 +17,29 @@ ScriptResolver::ScriptResolver(const QString& exe) :
, m_stopped( false )
{
qDebug() << Q_FUNC_INFO << exe;
connect( &m_proc, SIGNAL(readyReadStandardError()), SLOT(readStderr()) );
connect( &m_proc, SIGNAL(readyReadStandardOutput()), SLOT(readStdout()) );
connect( &m_proc, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(cmdExited(int,QProcess::ExitStatus)) );
connect( &m_proc, SIGNAL( readyReadStandardError() ), SLOT( readStderr() ) );
connect( &m_proc, SIGNAL( readyReadStandardOutput() ), SLOT( readStdout() ) );
connect( &m_proc, SIGNAL( finished( int, QProcess::ExitStatus ) ), SLOT( cmdExited( int, QProcess::ExitStatus ) ) );
m_proc.start( m_cmd );
}
ScriptResolver::~ScriptResolver()
{
Tomahawk::Pipeline::instance()->removeResolver( this );
}
void ScriptResolver::readStderr()
void
ScriptResolver::readStderr()
{
qDebug() << "SCRIPT_STDERR" << m_cmd << m_proc.readAllStandardError();
}
void ScriptResolver::readStdout()
void
ScriptResolver::readStdout()
{
qDebug() << Q_FUNC_INFO << m_proc.bytesAvailable();
if( m_msgsize == 0 )
@@ -56,14 +61,17 @@ void ScriptResolver::readStdout()
handleMsg( m_msg );
m_msgsize = 0;
m_msg.clear();
if( m_proc.bytesAvailable() ) QTimer::singleShot( 0, this, SLOT(readStdout()) );
if( m_proc.bytesAvailable() )
QTimer::singleShot( 0, this, SLOT( readStdout() ) );
}
}
void ScriptResolver::sendMsg( const QByteArray& msg )
void
ScriptResolver::sendMsg( const QByteArray& msg )
{
qDebug() << Q_FUNC_INFO << m_ready << msg;
qDebug() << Q_FUNC_INFO << m_ready << msg << msg.length();
if( !m_ready ) return;
@@ -74,9 +82,10 @@ void ScriptResolver::sendMsg( const QByteArray& msg )
}
void ScriptResolver::handleMsg( const QByteArray& msg )
void
ScriptResolver::handleMsg( const QByteArray& msg )
{
qDebug() << Q_FUNC_INFO << msg.size() << QString::fromAscii(msg);
qDebug() << Q_FUNC_INFO << msg.size() << QString::fromAscii( msg );
bool ok;
QVariant v = m_parser.parse( msg, &ok );
if( !ok || v.type() != QVariant::Map )
@@ -85,7 +94,7 @@ void ScriptResolver::handleMsg( const QByteArray& msg )
return;
}
QVariantMap m = v.toMap();
const QString& msgtype = m.value( "_msgtype" ).toString();
QString msgtype = m.value( "_msgtype" ).toString();
if( msgtype == "settings" )
{
@@ -96,13 +105,25 @@ void ScriptResolver::handleMsg( const QByteArray& msg )
if( msgtype == "results" )
{
QList< Tomahawk::result_ptr > results;
const QString& qid = m.value( "qid" ).toString();
const QVariantList& reslist = m.value( "results" ).toList();
const QString qid = m.value( "qid" ).toString();
const QVariantList reslist = m.value( "results" ).toList();
Tomahawk::collection_ptr coll = SourceList::instance()->getLocal()->collection();
foreach( const QVariant& rv, reslist )
{
qDebug() << "RES" << rv;
QVariantMap m = rv.toMap();
qDebug() << "RES" << m;
Tomahawk::result_ptr rp( new Tomahawk::Result() );
Tomahawk::artist_ptr ap = Tomahawk::Artist::get( 0, m.value( "artist" ).toString(), coll );
rp->setArtist( ap );
rp->setAlbum( Tomahawk::Album::get( 0, m.value( "album" ).toString(), ap, coll ) );
rp->setTrack( m.value( "track" ).toString() );
rp->setDuration( m.value( "duration" ).toUInt() );
rp->setBitrate( m.value( "bitrate" ).toUInt() );
rp->setUrl( m.value( "url" ).toString() );
rp->setSize( m.value( "size" ).toUInt() );
rp->setScore( m.value( "score" ).toFloat() * ( (float)weight() / 100.0 ) );
rp->setRID( uuid() );
rp->setCollection( coll );
results << rp;
}
@@ -111,7 +132,8 @@ void ScriptResolver::handleMsg( const QByteArray& msg )
}
void ScriptResolver::cmdExited(int code, QProcess::ExitStatus status)
void
ScriptResolver::cmdExited( int code, QProcess::ExitStatus status )
{
m_ready = false;
qDebug() << Q_FUNC_INFO << "SCRIPT EXITED, code" << code << "status" << status << m_cmd;
@@ -121,10 +143,10 @@ void ScriptResolver::cmdExited(int code, QProcess::ExitStatus status)
{
qDebug() << "*** Script resolver stopped ";
emit finished();
return;
}
if( m_num_restarts < 10 )
{
m_num_restarts++;
@@ -138,32 +160,40 @@ void ScriptResolver::cmdExited(int code, QProcess::ExitStatus status)
}
void ScriptResolver::resolve( const Tomahawk::query_ptr& query )
void
ScriptResolver::resolve( const Tomahawk::query_ptr& query )
{
/* m.insert( "_msgtype", "rq" );
const QByteArray msg = m_serializer.serialize( m );
QVariantMap m;
m.insert( "_msgtype", "rq" );
m.insert( "artist", query->artist() );
m.insert( "track", query->track() );
m.insert( "qid", query->id() );
const QByteArray msg = m_serializer.serialize( QVariant( m ) );
qDebug() << "ASKING SCRIPT RESOLVER TO RESOLVE:" << msg;
sendMsg( msg );*/
sendMsg( msg );
}
void ScriptResolver::doSetup( const QVariantMap& m )
void
ScriptResolver::doSetup( const QVariantMap& m )
{
qDebug() << Q_FUNC_INFO << m;
m_name = m.value( "name" ).toString();
m_weight = m.value( "weight", 0 ).toUInt();
m_timeout = m.value( "timeout", 5000 ).toUInt();
m_preference = m.value( "preference", 0 ).toUInt();
qDebug() << "SCRIPT" << m_cmd << "READY, " << endl
<< " name" << m_name << endl
<< " weight" << m_weight << endl
<< " timeout" << m_timeout << endl
<< " preference" << m_preference
;
qDebug() << "SCRIPT" << m_cmd << "READY," << endl
<< "name" << m_name << endl
<< "weight" << m_weight << endl
<< "timeout" << m_timeout << endl
<< "preference" << m_preference;
m_ready = true;
Tomahawk::Pipeline::instance()->addResolver( this );
}
void
ScriptResolver::stop()
{

View File

@@ -14,10 +14,11 @@
class ScriptResolver : public Tomahawk::Resolver
{
Q_OBJECT
public:
explicit ScriptResolver(const QString& exe);
explicit ScriptResolver( const QString& exe );
virtual ~ScriptResolver();
virtual QString name() const { return m_name; }
virtual unsigned int weight() const { return m_weight; }
virtual unsigned int preference() const { return m_preference; }
@@ -26,17 +27,18 @@ public:
virtual void resolve( const Tomahawk::query_ptr& query );
void stop();
QString exe() const { return m_cmd; }
signals:
void finished();
public slots:
private slots:
void readStderr();
void readStdout();
void cmdExited(int code, QProcess::ExitStatus status);
void cmdExited( int code, QProcess::ExitStatus status );
private:
void handleMsg( const QByteArray& msg );
@@ -54,7 +56,6 @@ private:
QJson::Parser m_parser;
QJson::Serializer m_serializer;
};
#endif // SCRIPTRESOLVER_H