summaryrefslogtreecommitdiff
path: root/nephilim
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2009-08-20 07:32:00 +0200
committerAnton Khirnov <wyskas@gmail.com>2009-08-20 07:32:00 +0200
commit0234dc6dd54d591a241107bd2b847569f7849c34 (patch)
tree63ee08e1c9ad8f4090e062e1e0494d3bad542ebe /nephilim
parent1307c71c790cc7a2da7f40b3b2f17d340ede0b8c (diff)
Lyrics: implement priority for fetchers.
Diffstat (limited to 'nephilim')
-rw-r--r--nephilim/plugins/Lyrics.py108
1 files changed, 60 insertions, 48 deletions
diff --git a/nephilim/plugins/Lyrics.py b/nephilim/plugins/Lyrics.py
index 9239d24..18f5d1e 100644
--- a/nephilim/plugins/Lyrics.py
+++ b/nephilim/plugins/Lyrics.py
@@ -104,32 +104,39 @@ class LyricsWidget(QtGui.QWidget):
class Lyrics(Plugin):
# public, read-only
o = None
- """A dict of { site name : fetcher object }. The fetcher object provides a
- fetch(song)Function takes a song and emits finished(song, lyrics) signal
- when finished. Lyrics is either a python unicode string, QString
- or None if not found."""
# private
- DEFAULTS = {'sites' : QtCore.QStringList(['lyricwiki', 'animelyrics']), 'lyricdir' : '$musicdir/$songdir',
+ DEFAULTS = {'sites' : QtCore.QStringList(['Lyricwiki', 'Animelyrics']), 'lyricdir' : '$musicdir/$songdir',
'lyricname' : '.lyrics_nephilim_$artist_$album_$title', 'store' : True}
- __available_sites = {}
- __fetchers = {}
- __results = 0
+ "implemented fetchers"
+ __available_sites = None
+ "enabled fetchers, those with higher priority first"
+ __fetchers = None
+ "number of returned results from last refresh() call"
+ __results = None
+ "index/priority of current lyrics"
+ __index = None
+ "metadata"
__lyrics_dir = None
+ "paths"
__lyrics_path = None
#### private ####
def __init__(self, parent, mpclient, name):
Plugin.__init__(self, parent, mpclient, name)
- self.__available_sites['lyricwiki'] = self.FetchLyricwiki
- self.__available_sites['animelyrics'] = self.FetchAnimelyrics
+ self.__fetchers = []
+ self.__available_sites = [self.FetchLyricwiki, self.FetchAnimelyrics]
def __new_lyrics_fetched(self, song, lyrics):
self.logger.info('Got new lyrics.')
self.__results += 1
- if lyrics and self.settings.value(self.name + '/store').toBool():
- self.save_lyrics_file(lyrics)
+
+ i = self.__fetchers.index(self.sender())
+ if lyrics and i < self.__index:
+ if self.settings.value(self.name + '/store').toBool():
+ self.save_lyrics_file(lyrics)
+ self.__index = i
return self.o.set_lyrics(song, lyrics)
elif self.__results >= len(self.__fetchers) and not self.o.lyrics_loaded:
self.o.set_lyrics(song, None)
@@ -140,6 +147,7 @@ class Lyrics(Plugin):
Python unicode string or None if not found."""
#public, read-only
logger = None
+ name = ''
#private
nam = None # NetworkAccessManager
@@ -147,14 +155,26 @@ class Lyrics(Plugin):
lrep = None # lyrics page NetworkReply
song = None # current song
+ #### private ####
def __init__(self, plugin):
QtCore.QObject.__init__(self, plugin)
self.nam = QtNetwork.QNetworkAccessManager()
self.logger = plugin.logger
- def fetch(self, song):
- """Reimplement this in subclasses."""
- pass
+
+ def fetch2(self, song, url):
+ """A private convenience function to initiate fetch process."""
+ # abort any existing connections
+ if self.srep:
+ self.srep.abort()
+ self.srep = None
+ if self.lrep:
+ self.lrep.abort()
+ self.lrep = None
+ self.song = song
+
+ self.logger.info('Searching %s: %s.'%(self. name, url))
+ self.srep = self.nam.get(QtNetwork.QNetworkRequest(url))
def finish(self, lyrics = None):
"""A private convenience function to clean up and emit finished().
@@ -164,24 +184,19 @@ class Lyrics(Plugin):
self.emit(QtCore.SIGNAL('finished'), self.song, lyrics)
self.song = None
+ #### public ####
+ def fetch(self, song):
+ """Reimplement this in subclasses."""
+ pass
+
class FetchLyricwiki(Fetcher):
+ name = 'Lyricwiki'
def fetch(self, song):
- # abort any existing connections
- if self.srep:
- self.srep.abort()
- self.srep = None
- if self.lrep:
- self.lrep.abort()
- self.lrep = None
- self.song = song
-
url = QtCore.QUrl('http://lyricwiki.org/api.php')
url.setQueryItems([('func', 'getSong'), ('artist', song.artist()),
('song', song.title()), ('fmt', 'xml')])
-
- self.logger.info('Searching Lyricwiki: %s.'%url)
- self.srep = self.nam.get(QtNetwork.QNetworkRequest(url))
+ self.fetch2(song, url)
self.connect(self.srep, QtCore.SIGNAL('finished()'), self.__handle_search_res)
def __handle_search_res(self):
@@ -219,22 +234,12 @@ class Lyrics(Plugin):
self.finish(lyrics)
class FetchAnimelyrics(Fetcher):
+ name = 'Animelyrics'
def fetch(self, song):
- # abort any existing connections
- if self.srep:
- self.srep.abort()
- self.srep = None
- if self.lrep:
- self.lrep.abort()
- self.lrep = None
- self.song = song
-
url = QtCore.QUrl('http://www.animelyrics.com/search.php')
- url.setQueryItems([('t', 'performer'), ('q', self.song.artist())])
-
- self.logger.info('Searching Animelyrics: %s.'%url)
- self.srep = self.nam.get(QtNetwork.QNetworkRequest(url))
+ url.setQueryItems([('t', 'performer'), ('q', song.artist())])
+ self.fetch2(song, url)
self.connect(self.srep, QtCore.SIGNAL('finished()'), self.__handle_search_res)
def __handle_search_res(self):
@@ -313,16 +318,12 @@ class Lyrics(Plugin):
#### public ####
def _load(self):
- for site in self.__available_sites:
- if site in self.settings.value('%s/sites'%self.name).toStringList():
- self.__fetchers[site] = self.__available_sites[site](self)
+ self.refresh_fetchers()
self.o = LyricsWidget(self)
- for fetcher in self.__fetchers:
- self.connect(self.__fetchers[fetcher], QtCore.SIGNAL('finished'), self.__new_lyrics_fetched)
self.connect(self.mpclient, QtCore.SIGNAL('song_changed'), self.refresh)
def _unload(self):
- self.o = None
- self.sites = {}
+ self.o = None
+ self.__fetchers = None
self.disconnect(self.mpclient, QtCore.SIGNAL('song_changed'), self.refresh)
def info(self):
return "Show (and fetch) the lyrics of the currently playing song."
@@ -334,6 +335,7 @@ class Lyrics(Plugin):
"""Attempt to automatically get lyrics first from a file, then from the internet."""
self.logger.info('Autorefreshing lyrics.')
self.__results = 0
+ self.__index = len(self.__fetchers)
self.o.lyrics_loaded = False
song = self.mpclient.current_song()
if not song:
@@ -354,7 +356,7 @@ class Lyrics(Plugin):
except IOError, e:
self.logger.info('Error reading lyrics file: %s.'%e)
- for fetcher in self.__fetchers.values():
+ for fetcher in self.__fetchers:
fetcher.fetch(song)
def save_lyrics_file(self, lyrics, path = None):
@@ -389,3 +391,13 @@ class Lyrics(Plugin):
def get_settings_widget(self):
return self.SettingsWidgetLyrics(self)
+ def refresh_fetchers(self):
+ """Refresh the list of available fetchers."""
+ self.__fetchers = []
+ # append fetchers in order they are stored in settings
+ for name in self.settings.value('%s/sites'%self.name).toStringList():
+ for site in self.__available_sites:
+ if site.name == name:
+ self.__fetchers.append(site(self))
+ self.connect(self.__fetchers[-1], QtCore.SIGNAL('finished'), self.__new_lyrics_fetched)
+