Skip to content

Commit e0b58d0

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

26 files changed

+748
-639
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: 12 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Copyright 2011, Leo Franchi <[email protected]>
55
* Copyright 2011-2012, Jeff Mitchell <[email protected]>
66
* Copyright 2011-2012, Christian Muehlhaeuser <[email protected]>
7+
* Copyright 2016, Dominik Schmidt <[email protected]>
78
*
89
* Tomahawk is free software: you can redistribute it and/or modify
910
* it under the terms of the GNU General Public License as published by
@@ -35,6 +36,7 @@
3536
#include "utils/Logger.h"
3637
#include "utils/TomahawkUtils.h"
3738
#include "utils/XspfLoader.h"
39+
#include "utils/LinkParser.h"
3840

3941
#include "Artist.h"
4042
#include "Album.h"
@@ -172,12 +174,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
172174
if ( url.contains( "grooveshark.com" ) && url.contains( "playlist" ) )
173175
return true;
174176

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

183180
if ( acceptedType.testFlag( Track ) )
@@ -198,12 +195,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
198195
|| url.contains( "playlists" ) ) ) )
199196
return true;
200197

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

209201
if ( acceptedType.testFlag( Album ) )
@@ -215,12 +207,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
215207
if ( url.contains( "rdio.com" ) && ( url.contains( "artist" ) && url.contains( "album" ) && !url.contains( "track" ) ) )
216208
return true;
217209

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

226213
if ( acceptedType.testFlag( Artist ) )
@@ -232,12 +219,7 @@ DropJob::acceptsMimeData( const QMimeData* data, DropJob::DropTypes acceptedType
232219
if ( url.contains( "rdio.com" ) && ( url.contains( "artist" ) && !url.contains( "album" ) && !url.contains( "track" ) ) )
233220
return true;
234221

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

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

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-
}
288+
return Tomahawk::Utils::LinkParser::instance()->canParseUrl( url, Tomahawk::Utils::UrlTypePlaylist );
315289

316290
}
317291

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

762736
foreach ( QString track, tracks )
763737
{
764-
foreach ( QPointer<ExternalResolver> resolver, Pipeline::instance()->scriptResolvers() )
738+
QList< QSharedPointer< Utils::LinkParserPlugin > > parserPlugins = Utils::LinkParser::instance()->parserPluginsForUrl( track, Utils::UrlTypeAny );
739+
if( !parserPlugins.isEmpty() )
765740
{
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-
}
741+
Tomahawk::Utils::LinkParser::instance()->lookupUrl( track, parserPlugins );
742+
connect( Tomahawk::Utils::LinkParser::instance(), SIGNAL( informationFound( QString, QSharedPointer<QObject> ) ), this, SLOT( informationForUrl( QString, QSharedPointer<QObject> ) ) );
743+
m_queryCount++;
774744
}
775745
}
776746
}

src/libtomahawk/GlobalActionManager.cpp

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Copyright (C) 2011-2014, Christian Muehlhaeuser <[email protected]>
66
* Copyright (C) 2013, Uwe L. Korn <[email protected]>
77
* Copyright (C) 2013, Teo Mrnjavac <[email protected]>
8+
* Copyright (C) 2016, Dominik Schmidt <[email protected]>
89
*
910
* Tomahawk is free software: you can redistribute it and/or modify
1011
* it under the terms of the GNU General Public License as published by
@@ -35,13 +36,13 @@
3536
#include "playlist/TrackView.h"
3637
#include "playlist/PlayableModel.h"
3738
#include "resolvers/ExternalResolver.h"
38-
#include "resolvers/ScriptCommand_LookupUrl.h"
3939
#include "utils/JspfLoader.h"
4040
#include "utils/Logger.h"
4141
#include "utils/SpotifyParser.h"
4242
#include "utils/XspfLoader.h"
4343
#include "utils/XspfGenerator.h"
4444
#include "viewpages/SearchViewPage.h"
45+
#include "utils/LinkParser.h"
4546

4647
#include "Pipeline.h"
4748
#include "TomahawkSettings.h"
@@ -162,27 +163,12 @@ GlobalActionManager::openUrl( const QString& url )
162163
else if ( url.contains( "open.spotify.com" ) || url.startsWith( "spotify:" ) )
163164
return openSpotifyLink( url );
164165

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() )
166+
// Can we parse the Url using LinkParser?
167+
QList< QSharedPointer< Utils::LinkParserPlugin > > parserPlugins = Utils::LinkParser::instance()->parserPluginsForUrl( url, Utils::UrlTypeAny );
168+
if( !parserPlugins.isEmpty() )
169169
{
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-
170+
Tomahawk::Utils::LinkParser::instance()->lookupUrl( url, parserPlugins );
171+
connect( Tomahawk::Utils::LinkParser::instance(), SIGNAL( informationFound( QString, QSharedPointer<QObject> ) ), this, SLOT( informationForUrl( QString, QSharedPointer<QObject> ) ), Qt::UniqueConnection );
186172
return true;
187173
}
188174

src/libtomahawk/resolvers/ExternalResolver.h

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright 2010-2011, Christian Muehlhaeuser <[email protected]>
44
* Copyright 2010-2011, Leo Franchi <[email protected]>
55
* Copyright 2013, Teo Mrnjavac <[email protected]>
6+
* Copyright 2016, Dominik Schmidt <[email protected]>
67
*
78
* Tomahawk is free software: you can redistribute it and/or modify
89
* it under the terms of the GNU General Public License as published by
@@ -24,8 +25,6 @@
2425
#include "Source.h"
2526
#include "DllMacro.h"
2627
#include "Resolver.h"
27-
#include "ScriptCommandQueue.h"
28-
#include "ScriptCommand_LookupUrl.h"
2928
#include "Typedefs.h"
3029

3130
#include <QObject>
@@ -45,7 +44,6 @@ class DLLEXPORT ExternalResolver : public Resolver
4544
{
4645
Q_OBJECT
4746

48-
friend class ScriptCommandQueue;
4947
friend class ScriptCommand_LookupUrl;
5048

5149
public:
@@ -61,26 +59,13 @@ Q_OBJECT
6159
Browsable = 0x1, // can be represented in one or more collection tree views
6260
PlaylistSync = 0x2, // can sync playlists
6361
AccountFactory = 0x4, // can configure multiple accounts at the same time
64-
UrlLookup = 0x8 // can be queried for information on an Url
6562
};
6663
Q_DECLARE_FLAGS( Capabilities, Capability )
6764
Q_FLAGS( Capabilities )
6865

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-
8166
ExternalResolver( const QString& filePath )
82-
: m_commandQueue( new ScriptCommandQueue( this ) )
83-
{ m_filePath = filePath; }
67+
: m_filePath( filePath )
68+
{}
8469

8570
QString filePath() const { return m_filePath; }
8671
virtual void setIcon( const QPixmap& ) {}
@@ -92,12 +77,6 @@ Q_OBJECT
9277
virtual bool running() const = 0;
9378
virtual Capabilities capabilities() const = 0;
9479

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-
10180
public slots:
10281
virtual void start() = 0;
10382
virtual void stop() = 0;
@@ -112,11 +91,6 @@ public slots:
11291

11392
protected:
11493
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;
12094

12195
private:
12296
QString m_filePath;

0 commit comments

Comments
 (0)