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 "tomahawksettings.h"
|
||||
#include "utils/tomahawkutils.h"
|
||||
|
||||
using namespace Tomahawk;
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
@@ -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 );
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
@@ -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()
|
||||
{
|
||||
|
@@ -14,8 +14,9 @@
|
||||
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; }
|
||||
@@ -28,6 +29,7 @@ public:
|
||||
void stop();
|
||||
|
||||
QString exe() const { return m_cmd; }
|
||||
|
||||
signals:
|
||||
void finished();
|
||||
|
||||
@@ -36,7 +38,7 @@ 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
|
||||
|
Reference in New Issue
Block a user