mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-07 22:56:42 +02:00
Remove SoundCloud and add ScriptResolvers to DropJob
This commit is contained in:
@@ -25,13 +25,13 @@
|
|||||||
#include "jobview/JobStatusView.h"
|
#include "jobview/JobStatusView.h"
|
||||||
#include "jobview/JobStatusModel.h"
|
#include "jobview/JobStatusModel.h"
|
||||||
#include "jobview/ErrorStatusMessage.h"
|
#include "jobview/ErrorStatusMessage.h"
|
||||||
|
#include "resolvers/ExternalResolver.h"
|
||||||
#include "utils/SpotifyParser.h"
|
#include "utils/SpotifyParser.h"
|
||||||
#include "utils/ItunesParser.h"
|
#include "utils/ItunesParser.h"
|
||||||
#include "utils/ItunesLoader.h"
|
#include "utils/ItunesLoader.h"
|
||||||
#include "utils/RdioParser.h"
|
#include "utils/RdioParser.h"
|
||||||
#include "utils/M3uLoader.h"
|
#include "utils/M3uLoader.h"
|
||||||
#include "utils/ShortenedLinkParser.h"
|
#include "utils/ShortenedLinkParser.h"
|
||||||
#include "utils/SoundcloudParser.h"
|
|
||||||
#include "utils/ExfmParser.h"
|
#include "utils/ExfmParser.h"
|
||||||
#include "utils/Logger.h"
|
#include "utils/Logger.h"
|
||||||
#include "utils/TomahawkUtils.h"
|
#include "utils/TomahawkUtils.h"
|
||||||
@@ -141,14 +141,18 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
|
|||||||
if ( url.contains( "spotify" ) && url.contains( "playlist" ) && s_canParseSpotifyPlaylists )
|
if ( url.contains( "spotify" ) && url.contains( "playlist" ) && s_canParseSpotifyPlaylists )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if( url.contains( "soundcloud" ) && url.contains( "sets" ) )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( url.contains( "ex.fm" ) && !url.contains( "/song/" ) ) // We treat everything but song as playlist
|
if( url.contains( "ex.fm" ) && !url.contains( "/song/" ) ) // We treat everything but song as playlist
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ( url.contains( "grooveshark.com" ) && url.contains( "playlist" ) )
|
if ( url.contains( "grooveshark.com" ) && url.contains( "playlist" ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Check Scriptresolvers
|
||||||
|
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
|
||||||
|
{
|
||||||
|
if ( resolver->canParseUrl( url, ExternalResolver::Playlist ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( acceptedType.testFlag( Track ) )
|
if ( acceptedType.testFlag( Track ) )
|
||||||
@@ -168,12 +172,17 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
|
|||||||
if ( url.contains( "ex.fm" ) && url.contains( "/song/" ) )
|
if ( url.contains( "ex.fm" ) && url.contains( "/song/" ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if( url.contains( "soundcloud" ) )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if ( url.contains( "rdio.com" ) && ( ( ( url.contains( "track" ) && url.contains( "artist" ) && url.contains( "album" ) )
|
if ( url.contains( "rdio.com" ) && ( ( ( url.contains( "track" ) && url.contains( "artist" ) && url.contains( "album" ) )
|
||||||
|| url.contains( "playlists" ) ) ) )
|
|| url.contains( "playlists" ) ) ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Check Scriptresolvers
|
||||||
|
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
|
||||||
|
{
|
||||||
|
if ( resolver->canParseUrl( url, ExternalResolver::Track ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( acceptedType.testFlag( Album ) )
|
if ( acceptedType.testFlag( Album ) )
|
||||||
@@ -186,6 +195,14 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
|
|||||||
return true;
|
return true;
|
||||||
if ( url.contains( "ex.fm" ) && url.contains( "site" ) && url.contains( "album" ) )
|
if ( url.contains( "ex.fm" ) && url.contains( "site" ) && url.contains( "album" ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Check Scriptresolvers
|
||||||
|
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
|
||||||
|
{
|
||||||
|
if ( resolver->canParseUrl( url, ExternalResolver::Album ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( acceptedType.testFlag( Artist ) )
|
if ( acceptedType.testFlag( Artist ) )
|
||||||
@@ -196,10 +213,16 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
|
|||||||
return true;
|
return true;
|
||||||
if ( url.contains( "rdio.com" ) && ( url.contains( "artist" ) && !url.contains( "album" ) && !url.contains( "track" ) ) )
|
if ( url.contains( "rdio.com" ) && ( url.contains( "artist" ) && !url.contains( "album" ) && !url.contains( "track" ) ) )
|
||||||
return true;
|
return true;
|
||||||
if( url.contains( "soundcloud" ) )
|
|
||||||
|
// Check Scriptresolvers
|
||||||
|
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
|
||||||
|
{
|
||||||
|
if ( resolver->canParseUrl( url, ExternalResolver::Artist ) )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// We whitelist certain url-shorteners since they do some link checking. Often playable (e.g. spotify) links hide behind them,
|
// We whitelist certain url-shorteners since they do some link checking. Often playable (e.g. spotify) links hide behind them,
|
||||||
// so we do an extra level of lookup
|
// so we do an extra level of lookup
|
||||||
if ( ShortenedLinkParser::handlesUrl( url ) )
|
if ( ShortenedLinkParser::handlesUrl( url ) )
|
||||||
@@ -254,9 +277,6 @@ DropJob::isDropType( DropJob::DropType desired, const QMimeData* data )
|
|||||||
if ( url.contains( "spotify" ) && url.contains( "playlist" ) && s_canParseSpotifyPlaylists )
|
if ( url.contains( "spotify" ) && url.contains( "playlist" ) && s_canParseSpotifyPlaylists )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if( url.contains( "soundcloud" ) && url.contains( "sets" ) )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( url.contains( "ex.fm" ) && !url.contains( "/song/" ) ) // We treat all but song as playlist
|
if( url.contains( "ex.fm" ) && !url.contains( "/song/" ) ) // We treat all but song as playlist
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -268,6 +288,14 @@ DropJob::isDropType( DropJob::DropType desired, const QMimeData* data )
|
|||||||
#endif //QCA2_FOUND
|
#endif //QCA2_FOUND
|
||||||
if ( ShortenedLinkParser::handlesUrl( url ) )
|
if ( ShortenedLinkParser::handlesUrl( url ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Check Scriptresolvers
|
||||||
|
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
|
||||||
|
{
|
||||||
|
if ( resolver->canParseUrl( url, ExternalResolver::Playlist ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -632,24 +660,6 @@ DropJob::handleRdioUrls( const QString& urlsRaw )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
DropJob::handleSoundcloudUrls( const QString& urlsRaw )
|
|
||||||
{
|
|
||||||
QStringList urls = urlsRaw.split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
|
||||||
qDebug() << "Got Soundcloud urls!" << urls;
|
|
||||||
|
|
||||||
|
|
||||||
if ( dropAction() == Default )
|
|
||||||
setDropAction( Create );
|
|
||||||
|
|
||||||
SoundcloudParser* sc = new SoundcloudParser( urls, dropAction() == Create, this );
|
|
||||||
connect( sc, SIGNAL( tracks( QList<Tomahawk::query_ptr> ) ), this, SLOT( onTracksAdded( QList< Tomahawk::query_ptr > ) ) );
|
|
||||||
|
|
||||||
m_queryCount++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
DropJob::handleExfmUrls( const QString& urlsRaw )
|
DropJob::handleExfmUrls( const QString& urlsRaw )
|
||||||
{
|
{
|
||||||
@@ -705,8 +715,6 @@ DropJob::handleAllUrls( const QString& urls )
|
|||||||
handleSpotifyUrls( urls );
|
handleSpotifyUrls( urls );
|
||||||
else if ( urls.contains( "rdio.com" ) )
|
else if ( urls.contains( "rdio.com" ) )
|
||||||
handleRdioUrls( urls );
|
handleRdioUrls( urls );
|
||||||
else if( urls.contains( "soundcloud" ) )
|
|
||||||
handleSoundcloudUrls( urls );
|
|
||||||
else if( urls.contains( "ex.fm" ) )
|
else if( urls.contains( "ex.fm" ) )
|
||||||
handleExfmUrls( urls );
|
handleExfmUrls( urls );
|
||||||
#ifdef QCA2_FOUND
|
#ifdef QCA2_FOUND
|
||||||
@@ -745,15 +753,6 @@ DropJob::handleTrackUrls( const QString& urls )
|
|||||||
connect( spot, SIGNAL( tracks( QList<Tomahawk::query_ptr> ) ), this, SLOT( onTracksAdded( QList< Tomahawk::query_ptr > ) ) );
|
connect( spot, SIGNAL( tracks( QList<Tomahawk::query_ptr> ) ), this, SLOT( onTracksAdded( QList< Tomahawk::query_ptr > ) ) );
|
||||||
m_queryCount++;
|
m_queryCount++;
|
||||||
}
|
}
|
||||||
else if ( urls.contains( "soundcloud" ) )
|
|
||||||
{
|
|
||||||
QStringList tracks = urls.split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
|
||||||
|
|
||||||
tDebug() << "Got a list of Soundcloud tracks!" << tracks;
|
|
||||||
SoundcloudParser* sc = new SoundcloudParser( tracks, false, this );
|
|
||||||
connect( sc, SIGNAL( tracks( QList<Tomahawk::query_ptr> ) ), this, SLOT( onTracksAdded( QList< Tomahawk::query_ptr > ) ) );
|
|
||||||
m_queryCount++;
|
|
||||||
}
|
|
||||||
else if ( urls.contains( "ex.fm" ) )
|
else if ( urls.contains( "ex.fm" ) )
|
||||||
{
|
{
|
||||||
QStringList tracks = urls.split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
QStringList tracks = urls.split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
||||||
@@ -783,6 +782,26 @@ DropJob::handleTrackUrls( const QString& urls )
|
|||||||
connect( parser, SIGNAL( urls( QStringList ) ), this, SLOT( expandedUrls( QStringList ) ) );
|
connect( parser, SIGNAL( urls( QStringList ) ), this, SLOT( expandedUrls( QStringList ) ) );
|
||||||
m_queryCount++;
|
m_queryCount++;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Try Scriptresolvers
|
||||||
|
QStringList tracks = urls.split( QRegExp( "\\s+" ), QString::SkipEmptyParts );
|
||||||
|
|
||||||
|
foreach ( QString track, tracks )
|
||||||
|
{
|
||||||
|
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
|
||||||
|
{
|
||||||
|
if ( resolver->canParseUrl( track, ExternalResolver::Any ) )
|
||||||
|
{
|
||||||
|
ScriptCommand_LookupUrl* cmd = new ScriptCommand_LookupUrl( resolver, track );
|
||||||
|
connect( cmd, SIGNAL( information( QString, QSharedPointer<QObject> ) ), this, SLOT( informationForUrl( QString, QSharedPointer<QObject> ) ) );
|
||||||
|
cmd->enqueue();
|
||||||
|
m_queryCount++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -794,6 +813,32 @@ DropJob::expandedUrls( QStringList urls )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropJob::informationForUrl( const QString&, const QSharedPointer<QObject>& information )
|
||||||
|
{
|
||||||
|
if ( information.isNull() )
|
||||||
|
{
|
||||||
|
// No information was transmitted, nothing to do.
|
||||||
|
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Empty information received.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to interpret as Track/Query
|
||||||
|
Tomahawk::query_ptr query = information.objectCast<Tomahawk::Query>();
|
||||||
|
if ( !query.isNull() )
|
||||||
|
{
|
||||||
|
QList<Tomahawk::query_ptr> tracks;
|
||||||
|
// The Url describes a track
|
||||||
|
tracks.append( query );
|
||||||
|
onTracksAdded( tracks );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing relevant for this url, but still finalize this query.
|
||||||
|
onTracksAdded( QList<Tomahawk::query_ptr>() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
DropJob::onTracksAdded( const QList<Tomahawk::query_ptr>& tracksList )
|
DropJob::onTracksAdded( const QList<Tomahawk::query_ptr>& tracksList )
|
||||||
{
|
{
|
||||||
|
@@ -120,6 +120,7 @@ signals:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void expandedUrls( QStringList );
|
void expandedUrls( QStringList );
|
||||||
|
void informationForUrl( const QString& url, const QSharedPointer<QObject>& information );
|
||||||
void onTracksAdded( const QList<Tomahawk::query_ptr>& );
|
void onTracksAdded( const QList<Tomahawk::query_ptr>& );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Reference in New Issue
Block a user