Skip to content

Commit ea9aa9b

Browse files
committed
Fix url lookup by adding LinkParser plugins
1 parent 0585acc commit ea9aa9b

26 files changed

+745
-638
lines changed

src/libtomahawk/CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ set( libGuiSources
126126
utils/LinkGenerator.cpp
127127
utils/LinkGeneratorPlugin.cpp
128128
utils/TomaHkLinkGeneratorPlugin.cpp
129+
utils/LinkParser.cpp
130+
utils/LinkParserPlugin.cpp
129131

130132
viewpages/SearchViewPage.cpp
131133
viewpages/SourceViewPage.cpp
@@ -350,22 +352,23 @@ list(APPEND libSources
350352
resolvers/ScriptCommand_AllArtists.cpp
351353
resolvers/ScriptCommand_AllAlbums.cpp
352354
resolvers/ScriptCommand_AllTracks.cpp
353-
resolvers/ScriptCommand_LookupUrl.cpp
354-
resolvers/ScriptCommandQueue.cpp
355355
resolvers/ScriptPluginFactory.cpp
356356

357357
# ScriptPlugins
358358
resolvers/ScriptCollection.cpp
359359
resolvers/plugins/ScriptCollectionFactory.cpp
360360
resolvers/ScriptInfoPlugin.cpp
361361
resolvers/plugins/ScriptInfoPluginFactory.cpp
362+
resolvers/plugins/ScriptLinkParserPlugin.cpp
363+
resolvers/plugins/ScriptLinkParserPluginFactory.cpp
362364

363365

364366
sip/SipPlugin.cpp
365367
sip/SipInfo.cpp
366368
sip/PeerInfo.cpp
367369
sip/SipStatusMessage.cpp
368370

371+
utils/UrlType.cpp
369372
utils/Cloudstream.cpp
370373
utils/Json.cpp
371374
utils/TomahawkUtils.cpp

src/libtomahawk/DropJob.cpp

Lines changed: 11 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "utils/Logger.h"
3636
#include "utils/TomahawkUtils.h"
3737
#include "utils/XspfLoader.h"
38+
#include "utils/LinkParser.h"
3839

3940
#include "Artist.h"
4041
#include "Album.h"
@@ -172,12 +173,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
172173
if ( url.contains( "grooveshark.com" ) && url.contains( "playlist" ) )
173174
return true;
174175

175-
// Check Scriptresolvers
176-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
177-
{
178-
if ( resolver->canParseUrl( url, ExternalResolver::UrlTypePlaylist ) )
179-
return true;
180-
}
176+
return Tomahawk::Utils::LinkParser::instance()->canParseUrl( url, Tomahawk::Utils::UrlTypePlaylist );
181177
}
182178

183179
if ( acceptedType.testFlag( Track ) )
@@ -198,12 +194,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
198194
|| url.contains( "playlists" ) ) ) )
199195
return true;
200196

201-
// Check Scriptresolvers
202-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
203-
{
204-
if ( resolver->canParseUrl( url, ExternalResolver::UrlTypeTrack ) )
205-
return true;
206-
}
197+
return Tomahawk::Utils::LinkParser::instance()->canParseUrl( url, Tomahawk::Utils::UrlTypeTrack );
207198
}
208199

209200
if ( acceptedType.testFlag( Album ) )
@@ -215,12 +206,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
215206
if ( url.contains( "rdio.com" ) && ( url.contains( "artist" ) && url.contains( "album" ) && !url.contains( "track" ) ) )
216207
return true;
217208

218-
// Check Scriptresolvers
219-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
220-
{
221-
if ( resolver->canParseUrl( url, ExternalResolver::UrlTypeAlbum ) )
222-
return true;
223-
}
209+
return Tomahawk::Utils::LinkParser::instance()->canParseUrl( url, Tomahawk::Utils::UrlTypeAlbum );
224210
}
225211

226212
if ( acceptedType.testFlag( Artist ) )
@@ -232,12 +218,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
232218
if ( url.contains( "rdio.com" ) && ( url.contains( "artist" ) && !url.contains( "album" ) && !url.contains( "track" ) ) )
233219
return true;
234220

235-
// Check Scriptresolvers
236-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
237-
{
238-
if ( resolver->canParseUrl( url, ExternalResolver::UrlTypeArtist ) )
239-
return true;
240-
}
221+
return Tomahawk::Utils::LinkParser::instance()->canParseUrl( url, Tomahawk::Utils::UrlTypeArtist );
241222
}
242223

243224
// We whitelist certain url-shorteners since they do some link checking. Often playable (e.g. spotify) links hide behind them,
@@ -303,15 +284,7 @@ DropJob::isDropType( DropJob::DropType desired, const QMimeData* data )
303284
if ( ShortenedLinkParser::handlesUrl( url ) )
304285
return true;
305286

306-
// Check Scriptresolvers
307-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
308-
{
309-
if ( resolver->canParseUrl( url, ExternalResolver::UrlTypePlaylist ) )
310-
{
311-
tLog( LOGVERBOSE ) << Q_FUNC_INFO << "Accepting current drop as a playlist" << resolver->name();
312-
return true;
313-
}
314-
}
287+
return Tomahawk::Utils::LinkParser::instance()->canParseUrl( url, Tomahawk::Utils::UrlTypePlaylist );
315288

316289
}
317290

@@ -761,16 +734,12 @@ DropJob::handleTrackUrls( const QString& urls )
761734

762735
foreach ( QString track, tracks )
763736
{
764-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
737+
QList< QSharedPointer< Utils::LinkParserPlugin > > parserPlugins = Utils::LinkParser::instance()->parserPluginsForUrl( track, Utils::UrlTypeAny );
738+
if( !parserPlugins.isEmpty() )
765739
{
766-
if ( resolver->canParseUrl( track, ExternalResolver::UrlTypeAny ) )
767-
{
768-
ScriptCommand_LookupUrl* cmd = new ScriptCommand_LookupUrl( resolver, track );
769-
connect( cmd, SIGNAL( information( QString, QSharedPointer<QObject> ) ), this, SLOT( informationForUrl( QString, QSharedPointer<QObject> ) ) );
770-
cmd->enqueue();
771-
m_queryCount++;
772-
break;
773-
}
740+
Tomahawk::Utils::LinkParser::instance()->lookupUrl( track, parserPlugins );
741+
connect( Tomahawk::Utils::LinkParser::instance(), SIGNAL( informationFound( QString, QSharedPointer<QObject> ) ), this, SLOT( informationForUrl( QString, QSharedPointer<QObject> ) ) );
742+
m_queryCount++;
774743
}
775744
}
776745
}

src/libtomahawk/GlobalActionManager.cpp

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@
3535
#include "playlist/TrackView.h"
3636
#include "playlist/PlayableModel.h"
3737
#include "resolvers/ExternalResolver.h"
38-
#include "resolvers/ScriptCommand_LookupUrl.h"
3938
#include "utils/JspfLoader.h"
4039
#include "utils/Logger.h"
4140
#include "utils/SpotifyParser.h"
4241
#include "utils/XspfLoader.h"
4342
#include "utils/XspfGenerator.h"
4443
#include "viewpages/SearchViewPage.h"
44+
#include "utils/LinkParser.h"
4545

4646
#include "Pipeline.h"
4747
#include "TomahawkSettings.h"
@@ -162,27 +162,12 @@ GlobalActionManager::openUrl( const QString& url )
162162
else if ( url.contains( "open.spotify.com" ) || url.startsWith( "spotify:" ) )
163163
return openSpotifyLink( url );
164164

165-
// Can we parse the Url using a ScriptResolver?
166-
bool canParse = false;
167-
QList< QPointer< ExternalResolver > > possibleResolvers;
168-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
165+
// Can we parse the Url using LinkParser?
166+
QList< QSharedPointer< Utils::LinkParserPlugin > > parserPlugins = Utils::LinkParser::instance()->parserPluginsForUrl( url, Utils::UrlTypeAny );
167+
if( !parserPlugins.isEmpty() )
169168
{
170-
if ( resolver->canParseUrl( url, ExternalResolver::UrlTypeAny ) )
171-
{
172-
canParse = true;
173-
possibleResolvers << resolver;
174-
}
175-
}
176-
if ( canParse )
177-
{
178-
m_queuedUrl = url;
179-
foreach ( QPointer<ExternalResolver> resolver, possibleResolvers )
180-
{
181-
ScriptCommand_LookupUrl* cmd = new ScriptCommand_LookupUrl( resolver, url );
182-
connect( cmd, SIGNAL( information( QString, QSharedPointer<QObject> ) ), this, SLOT( informationForUrl( QString, QSharedPointer<QObject> ) ) );
183-
cmd->enqueue();
184-
}
185-
169+
Tomahawk::Utils::LinkParser::instance()->lookupUrl( url, parserPlugins );
170+
connect( Tomahawk::Utils::LinkParser::instance(), SIGNAL( informationFound( QString, QSharedPointer<QObject> ) ), this, SLOT( informationForUrl( QString, QSharedPointer<QObject> ) ), Qt::UniqueConnection );
186171
return true;
187172
}
188173

src/libtomahawk/resolvers/ExternalResolver.h

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
#include "Source.h"
2525
#include "DllMacro.h"
2626
#include "Resolver.h"
27-
#include "ScriptCommandQueue.h"
28-
#include "ScriptCommand_LookupUrl.h"
2927
#include "Typedefs.h"
3028

3129
#include <QObject>
@@ -45,7 +43,6 @@ class DLLEXPORT ExternalResolver : public Resolver
4543
{
4644
Q_OBJECT
4745

48-
friend class ScriptCommandQueue;
4946
friend class ScriptCommand_LookupUrl;
5047

5148
public:
@@ -61,26 +58,13 @@ Q_OBJECT
6158
Browsable = 0x1, // can be represented in one or more collection tree views
6259
PlaylistSync = 0x2, // can sync playlists
6360
AccountFactory = 0x4, // can configure multiple accounts at the same time
64-
UrlLookup = 0x8 // can be queried for information on an Url
6561
};
6662
Q_DECLARE_FLAGS( Capabilities, Capability )
6763
Q_FLAGS( Capabilities )
6864

69-
enum UrlType
70-
{
71-
UrlTypeAny = 0x00,
72-
UrlTypePlaylist = 0x01,
73-
UrlTypeTrack = 0x02,
74-
UrlTypeAlbum = 0x04,
75-
UrlTypeArtist = 0x08,
76-
UrlTypeXspf = 0x10
77-
};
78-
Q_DECLARE_FLAGS( UrlTypes, UrlType )
79-
Q_FLAGS( UrlTypes )
80-
8165
ExternalResolver( const QString& filePath )
82-
: m_commandQueue( new ScriptCommandQueue( this ) )
83-
{ m_filePath = filePath; }
66+
: m_filePath( filePath )
67+
{}
8468

8569
QString filePath() const { return m_filePath; }
8670
virtual void setIcon( const QPixmap& ) {}
@@ -92,12 +76,6 @@ Q_OBJECT
9276
virtual bool running() const = 0;
9377
virtual Capabilities capabilities() const = 0;
9478

95-
// UrlLookup, sync call
96-
virtual bool canParseUrl( const QString& url, UrlType type ) = 0;
97-
98-
virtual void enqueue( const QSharedPointer< ScriptCommand >& req )
99-
{ m_commandQueue->enqueue( req ); }
100-
10179
public slots:
10280
virtual void start() = 0;
10381
virtual void stop() = 0;
@@ -112,11 +90,6 @@ public slots:
11290

11391
protected:
11492
void setFilePath( const QString& path ) { m_filePath = path; }
115-
ScriptCommandQueue* m_commandQueue;
116-
117-
// Should only be called by ScriptCommands
118-
// UrlLookup
119-
virtual void lookupUrl( const QString& url ) = 0;
12093

12194
private:
12295
QString m_filePath;

0 commit comments

Comments
 (0)