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:
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "portfwdthread.h"
|
#include "portfwdthread.h"
|
||||||
#include "tomahawksettings.h"
|
#include "tomahawksettings.h"
|
||||||
|
#include "utils/tomahawkutils.h"
|
||||||
|
|
||||||
using namespace Tomahawk;
|
using namespace Tomahawk;
|
||||||
|
|
||||||
@@ -42,7 +43,7 @@ Servent::Servent( QObject* parent )
|
|||||||
s_instance = this;
|
s_instance = this;
|
||||||
|
|
||||||
setProxy( QNetworkProxy::NoProxy );
|
setProxy( QNetworkProxy::NoProxy );
|
||||||
|
|
||||||
{
|
{
|
||||||
boost::function<QSharedPointer<QIODevice>(result_ptr)> fac =
|
boost::function<QSharedPointer<QIODevice>(result_ptr)> fac =
|
||||||
boost::bind( &Servent::localFileIODeviceFactory, this, _1 );
|
boost::bind( &Servent::localFileIODeviceFactory, this, _1 );
|
||||||
@@ -760,9 +761,8 @@ Servent::localFileIODeviceFactory( const Tomahawk::result_ptr& result )
|
|||||||
QSharedPointer<QIODevice>
|
QSharedPointer<QIODevice>
|
||||||
Servent::httpIODeviceFactory( const Tomahawk::result_ptr& result )
|
Servent::httpIODeviceFactory( const Tomahawk::result_ptr& result )
|
||||||
{
|
{
|
||||||
/* qDebug() << Q_FUNC_INFO << result->url();
|
qDebug() << Q_FUNC_INFO << result->url();
|
||||||
QNetworkRequest req( result->url() );
|
QNetworkRequest req( result->url() );
|
||||||
QNetworkReply* reply = APP->nam()->get( req );
|
QNetworkReply* reply = TomahawkUtils::nam()->get( req );
|
||||||
return QSharedPointer<QIODevice>( reply );*/
|
return QSharedPointer<QIODevice>( reply );
|
||||||
return QSharedPointer<QIODevice>();
|
|
||||||
}
|
}
|
||||||
|
@@ -199,7 +199,7 @@ Pipeline::shuntNext()
|
|||||||
query_ptr q;
|
query_ptr q;
|
||||||
{
|
{
|
||||||
QMutexLocker lock( &m_mut );
|
QMutexLocker lock( &m_mut );
|
||||||
|
|
||||||
if ( m_queries_pending.isEmpty() )
|
if ( m_queries_pending.isEmpty() )
|
||||||
{
|
{
|
||||||
emit idle();
|
emit idle();
|
||||||
@@ -255,7 +255,7 @@ Pipeline::shunt( const query_ptr& q )
|
|||||||
lasttimeout = r->timeout();
|
lasttimeout = r->timeout();
|
||||||
|
|
||||||
// resolvers aren't allowed to block in this call:
|
// 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 );
|
QMutexLocker lock( &m_mut );
|
||||||
@@ -267,7 +267,7 @@ Pipeline::shunt( const query_ptr& q )
|
|||||||
state = m_qidsState.value( q->id() );
|
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 );
|
m_qidsState.insert( q->id(), state + 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,12 +2,14 @@
|
|||||||
|
|
||||||
#include <QtEndian>
|
#include <QtEndian>
|
||||||
|
|
||||||
|
#include "artist.h"
|
||||||
|
#include "album.h"
|
||||||
#include "pipeline.h"
|
#include "pipeline.h"
|
||||||
#include "sourcelist.h"
|
#include "sourcelist.h"
|
||||||
|
|
||||||
|
|
||||||
ScriptResolver::ScriptResolver(const QString& exe) :
|
ScriptResolver::ScriptResolver( const QString& exe )
|
||||||
Tomahawk::Resolver()
|
: Tomahawk::Resolver()
|
||||||
, m_cmd( exe )
|
, m_cmd( exe )
|
||||||
, m_num_restarts( 0 )
|
, m_num_restarts( 0 )
|
||||||
, m_msgsize( 0 )
|
, m_msgsize( 0 )
|
||||||
@@ -15,26 +17,29 @@ ScriptResolver::ScriptResolver(const QString& exe) :
|
|||||||
, m_stopped( false )
|
, m_stopped( false )
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << exe;
|
qDebug() << Q_FUNC_INFO << exe;
|
||||||
connect( &m_proc, SIGNAL(readyReadStandardError()), SLOT(readStderr()) );
|
connect( &m_proc, SIGNAL( readyReadStandardError() ), SLOT( readStderr() ) );
|
||||||
connect( &m_proc, SIGNAL(readyReadStandardOutput()), SLOT(readStdout()) );
|
connect( &m_proc, SIGNAL( readyReadStandardOutput() ), SLOT( readStdout() ) );
|
||||||
connect( &m_proc, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(cmdExited(int,QProcess::ExitStatus)) );
|
connect( &m_proc, SIGNAL( finished( int, QProcess::ExitStatus ) ), SLOT( cmdExited( int, QProcess::ExitStatus ) ) );
|
||||||
|
|
||||||
m_proc.start( m_cmd );
|
m_proc.start( m_cmd );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ScriptResolver::~ScriptResolver()
|
ScriptResolver::~ScriptResolver()
|
||||||
{
|
{
|
||||||
Tomahawk::Pipeline::instance()->removeResolver( this );
|
Tomahawk::Pipeline::instance()->removeResolver( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ScriptResolver::readStderr()
|
void
|
||||||
|
ScriptResolver::readStderr()
|
||||||
{
|
{
|
||||||
qDebug() << "SCRIPT_STDERR" << m_cmd << m_proc.readAllStandardError();
|
qDebug() << "SCRIPT_STDERR" << m_cmd << m_proc.readAllStandardError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ScriptResolver::readStdout()
|
void
|
||||||
|
ScriptResolver::readStdout()
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO << m_proc.bytesAvailable();
|
qDebug() << Q_FUNC_INFO << m_proc.bytesAvailable();
|
||||||
if( m_msgsize == 0 )
|
if( m_msgsize == 0 )
|
||||||
@@ -56,14 +61,17 @@ void ScriptResolver::readStdout()
|
|||||||
handleMsg( m_msg );
|
handleMsg( m_msg );
|
||||||
m_msgsize = 0;
|
m_msgsize = 0;
|
||||||
m_msg.clear();
|
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;
|
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;
|
bool ok;
|
||||||
QVariant v = m_parser.parse( msg, &ok );
|
QVariant v = m_parser.parse( msg, &ok );
|
||||||
if( !ok || v.type() != QVariant::Map )
|
if( !ok || v.type() != QVariant::Map )
|
||||||
@@ -85,7 +94,7 @@ void ScriptResolver::handleMsg( const QByteArray& msg )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QVariantMap m = v.toMap();
|
QVariantMap m = v.toMap();
|
||||||
const QString& msgtype = m.value( "_msgtype" ).toString();
|
QString msgtype = m.value( "_msgtype" ).toString();
|
||||||
|
|
||||||
if( msgtype == "settings" )
|
if( msgtype == "settings" )
|
||||||
{
|
{
|
||||||
@@ -96,13 +105,25 @@ void ScriptResolver::handleMsg( const QByteArray& msg )
|
|||||||
if( msgtype == "results" )
|
if( msgtype == "results" )
|
||||||
{
|
{
|
||||||
QList< Tomahawk::result_ptr > results;
|
QList< Tomahawk::result_ptr > results;
|
||||||
const QString& qid = m.value( "qid" ).toString();
|
const QString qid = m.value( "qid" ).toString();
|
||||||
const QVariantList& reslist = m.value( "results" ).toList();
|
const QVariantList reslist = m.value( "results" ).toList();
|
||||||
Tomahawk::collection_ptr coll = SourceList::instance()->getLocal()->collection();
|
Tomahawk::collection_ptr coll = SourceList::instance()->getLocal()->collection();
|
||||||
foreach( const QVariant& rv, reslist )
|
foreach( const QVariant& rv, reslist )
|
||||||
{
|
{
|
||||||
qDebug() << "RES" << rv;
|
QVariantMap m = rv.toMap();
|
||||||
|
qDebug() << "RES" << m;
|
||||||
|
|
||||||
Tomahawk::result_ptr rp( new Tomahawk::Result() );
|
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 );
|
rp->setCollection( coll );
|
||||||
results << rp;
|
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;
|
m_ready = false;
|
||||||
qDebug() << Q_FUNC_INFO << "SCRIPT EXITED, code" << code << "status" << status << m_cmd;
|
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 ";
|
qDebug() << "*** Script resolver stopped ";
|
||||||
emit finished();
|
emit finished();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_num_restarts < 10 )
|
if( m_num_restarts < 10 )
|
||||||
{
|
{
|
||||||
m_num_restarts++;
|
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" );
|
QVariantMap m;
|
||||||
const QByteArray msg = m_serializer.serialize( 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;
|
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;
|
qDebug() << Q_FUNC_INFO << m;
|
||||||
m_name = m.value( "name" ).toString();
|
m_name = m.value( "name" ).toString();
|
||||||
m_weight = m.value( "weight", 0 ).toUInt();
|
m_weight = m.value( "weight", 0 ).toUInt();
|
||||||
m_timeout = m.value( "timeout", 5000 ).toUInt();
|
m_timeout = m.value( "timeout", 5000 ).toUInt();
|
||||||
m_preference = m.value( "preference", 0 ).toUInt();
|
m_preference = m.value( "preference", 0 ).toUInt();
|
||||||
qDebug() << "SCRIPT" << m_cmd << "READY, " << endl
|
qDebug() << "SCRIPT" << m_cmd << "READY," << endl
|
||||||
<< " name" << m_name << endl
|
<< "name" << m_name << endl
|
||||||
<< " weight" << m_weight << endl
|
<< "weight" << m_weight << endl
|
||||||
<< " timeout" << m_timeout << endl
|
<< "timeout" << m_timeout << endl
|
||||||
<< " preference" << m_preference
|
<< "preference" << m_preference;
|
||||||
;
|
|
||||||
m_ready = true;
|
m_ready = true;
|
||||||
Tomahawk::Pipeline::instance()->addResolver( this );
|
Tomahawk::Pipeline::instance()->addResolver( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ScriptResolver::stop()
|
ScriptResolver::stop()
|
||||||
{
|
{
|
||||||
|
@@ -14,10 +14,11 @@
|
|||||||
class ScriptResolver : public Tomahawk::Resolver
|
class ScriptResolver : public Tomahawk::Resolver
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ScriptResolver(const QString& exe);
|
explicit ScriptResolver( const QString& exe );
|
||||||
virtual ~ScriptResolver();
|
virtual ~ScriptResolver();
|
||||||
|
|
||||||
virtual QString name() const { return m_name; }
|
virtual QString name() const { return m_name; }
|
||||||
virtual unsigned int weight() const { return m_weight; }
|
virtual unsigned int weight() const { return m_weight; }
|
||||||
virtual unsigned int preference() const { return m_preference; }
|
virtual unsigned int preference() const { return m_preference; }
|
||||||
@@ -26,17 +27,18 @@ public:
|
|||||||
virtual void resolve( const Tomahawk::query_ptr& query );
|
virtual void resolve( const Tomahawk::query_ptr& query );
|
||||||
|
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
QString exe() const { return m_cmd; }
|
QString exe() const { return m_cmd; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void finished();
|
void finished();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void readStderr();
|
void readStderr();
|
||||||
void readStdout();
|
void readStdout();
|
||||||
void cmdExited(int code, QProcess::ExitStatus status);
|
void cmdExited( int code, QProcess::ExitStatus status );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void handleMsg( const QByteArray& msg );
|
void handleMsg( const QByteArray& msg );
|
||||||
@@ -54,7 +56,6 @@ private:
|
|||||||
|
|
||||||
QJson::Parser m_parser;
|
QJson::Parser m_parser;
|
||||||
QJson::Serializer m_serializer;
|
QJson::Serializer m_serializer;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SCRIPTRESOLVER_H
|
#endif // SCRIPTRESOLVER_H
|
||||||
|
Reference in New Issue
Block a user