diff options
author | Anton Khirnov <wyskas@gmail.com> | 2009-08-20 07:32:00 +0200 |
---|---|---|
committer | Anton Khirnov <wyskas@gmail.com> | 2009-08-20 07:32:00 +0200 |
commit | 0234dc6dd54d591a241107bd2b847569f7849c34 (patch) | |
tree | 63ee08e1c9ad8f4090e062e1e0494d3bad542ebe /nephilim/plugins/Lyrics.py | |
parent | 1307c71c790cc7a2da7f40b3b2f17d340ede0b8c (diff) |
Lyrics: implement priority for fetchers.
Diffstat (limited to 'nephilim/plugins/Lyrics.py')
-rw-r--r-- | nephilim/plugins/Lyrics.py | 108 |
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) + |