From 8a83bc5c0b02b529664fd93daf85c74a34ead078 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 10 May 2010 10:57:30 +0200 Subject: Lyrics: move fetcher classes to top level. --- nephilim/plugins/Lyrics.py | 217 ++++++++++++++++++++++----------------------- 1 file changed, 108 insertions(+), 109 deletions(-) diff --git a/nephilim/plugins/Lyrics.py b/nephilim/plugins/Lyrics.py index d110fd3..f0ca266 100644 --- a/nephilim/plugins/Lyrics.py +++ b/nephilim/plugins/Lyrics.py @@ -128,7 +128,7 @@ class Lyrics(Plugin): Plugin.__init__(self, parent, mpclient, name) self.__fetchers = [] - self.available_fetchers = [self.FetchLyricwiki, self.FetchAnimelyrics] + self.available_fetchers = [FetchLyricwiki, FetchAnimelyrics] def __new_lyrics_fetched(self, song, lyrics): self.logger.info('Got new lyrics.') @@ -143,114 +143,6 @@ class Lyrics(Plugin): elif self.__results >= len(self.__fetchers) and not self.o.lyrics_loaded: self.o.set_lyrics(song, None) - class FetchLyricwiki(common.MetadataFetcher): - name = 'Lyricwiki' - - __apiaddress = 'http://lyrics.wikia.com/api.php' - - def fetch(self, song): - url = QtCore.QUrl(self.__apiaddress) - url.setQueryItems([('func', 'getArtist'), ('artist', song['?artist']), - ('fmt', 'xml'), ('action', 'lyrics')]) - self.fetch2(song, url) - self.rep.finished.connect(self.__handle_artist_res) - - def __handle_artist_res(self): - artist = None - xml = QtCore.QXmlStreamReader(self.rep) - while not xml.atEnd(): - token = xml.readNext() - if token == QtCore.QXmlStreamReader.StartElement: - if xml.name() == 'artist': - artist = xml.readElementText() - xml.clear() - if not artist: - self.logger.info('Didn\'t find artist in %s artist search results.'%self.name) - return self.finish() - self.logger.info('Found artist: %s'%artist) - - url = QtCore.QUrl(self.__apiaddress) - url.setQueryItems([('action', 'lyrics'), ('func', 'getSong'), ('artist', artist), - ('song', self.song['?title']), ('fmt', 'xml')]) - self.rep = self.nam.get(QtNetwork.QNetworkRequest(url)) - self.rep.finished.connect(self.__handle_search_res) - self.rep.error.connect(self.handle_error) - - def __handle_search_res(self): - url = None - - # the page is borked utf-8 as of nov 2009, qxmlstreamreader chokes - # on it => use regexps - match = re.search('(.*)', str(self.rep.readAll()).decode('utf-8', 'replace'), - re.DOTALL|re.IGNORECASE) - if match and not 'action=edit' in match.group(1): - url = QtCore.QUrl() # the url is already percent-encoded - url.setEncodedUrl(match.group(1)) - - if not url: - self.logger.info('Didn\'t find the song on Lyricwiki.') - return self.finish() - self.logger.info('Found Lyricwiki song URL: %s.'%url.toString()) - - req = QtNetwork.QNetworkRequest(url) - self.rep = self.nam.get(req) - self.rep.finished.connect(self.__handle_lyrics) - self.rep.error.connect(self.handle_error) - - def __handle_lyrics(self): - # the page isn't valid xml, so use regexps - lyrics = '' - for it in re.finditer('
(?:.*?
)?(.*?)(?:.*?)?', - str(self.rep.readAll()).decode('utf-8'), re.DOTALL): - gr = re.sub('
', '\n', it.group(1)) - gr = re.sub(re.compile('<.*>', re.DOTALL), '', gr) - lyrics += gr + '\n' - self.finish(common.decode_htmlentities(lyrics)) - - class FetchAnimelyrics(common.MetadataFetcher): - name = 'Animelyrics' - - def fetch(self, song): - url = QtCore.QUrl('http://www.animelyrics.com/search.php') - url.setQueryItems([('t', 'performer'), ('q', song['?artist'])]) - self.fetch2(song, url) - self.rep.finished.connect(self.__handle_search_res) - - def __handle_search_res(self): - # TODO use Qt xml functions - try: - tree = etree.HTML(unicode(self.rep.readAll(), encoding = 'utf-8', errors='ignore')) - except etree.XMLSyntaxError, e: - self.logger.error('Error parsing lyrics: %s' %e) - return self.finish() - - url = None - for elem in tree.iterfind('.//a'): - if ('href' in elem.attrib) and elem.text and (self.song['?title'] in elem.text): - url = QtCore.QUrl('http://www.animelyrics.com/%s'%elem.get('href')) - - if not url: - self.logger.info('Didn\'t find the URL in Animelyrics search results.') - return self.finish() - self.logger.info('Found Animelyrics song URL: %s.'%url) - - self.rep = self.nam.get(QtNetwork.QNetworkRequest(url)) - self.rep.finished.connect(self.__handle_lyrics) - self.rep.error.connect(self.handle_error) - - def __handle_lyrics(self): - lyrics = '' - try: - tree = etree.HTML(unicode(self.rep.readAll(), encoding = 'utf-8')) - except etree.XMLSyntaxError, e: - self.logger.error('Error parsing lyrics: %s' %e) - return self.finish() - for elem in tree.iterfind('.//pre'): - if elem.get('class') == 'lyrics': - lyrics += '%s\n\n'%etree.tostring(elem, method = 'text', encoding = 'utf-8') - - self.finish(lyrics) - class SettingsWidgetLyrics(Plugin.SettingsWidget): # private lyricdir = None @@ -409,3 +301,110 @@ class Lyrics(Plugin): self.__fetchers.append(fetcher(self)) self.__fetchers[-1].finished.connect(self.__new_lyrics_fetched) +class FetchLyricwiki(common.MetadataFetcher): + name = 'Lyricwiki' + + __apiaddress = 'http://lyrics.wikia.com/api.php' + + def fetch(self, song): + url = QtCore.QUrl(self.__apiaddress) + url.setQueryItems([('func', 'getArtist'), ('artist', song['?artist']), + ('fmt', 'xml'), ('action', 'lyrics')]) + self.fetch2(song, url) + self.rep.finished.connect(self.__handle_artist_res) + + def __handle_artist_res(self): + artist = None + xml = QtCore.QXmlStreamReader(self.rep) + while not xml.atEnd(): + token = xml.readNext() + if token == QtCore.QXmlStreamReader.StartElement: + if xml.name() == 'artist': + artist = xml.readElementText() + xml.clear() + if not artist: + self.logger.info('Didn\'t find artist in %s artist search results.'%self.name) + return self.finish() + self.logger.info('Found artist: %s'%artist) + + url = QtCore.QUrl(self.__apiaddress) + url.setQueryItems([('action', 'lyrics'), ('func', 'getSong'), ('artist', artist), + ('song', self.song['?title']), ('fmt', 'xml')]) + self.rep = self.nam.get(QtNetwork.QNetworkRequest(url)) + self.rep.finished.connect(self.__handle_search_res) + self.rep.error.connect(self.handle_error) + + def __handle_search_res(self): + url = None + + # the page is borked utf-8 as of nov 2009, qxmlstreamreader chokes + # on it => use regexps + match = re.search('(.*)', str(self.rep.readAll()).decode('utf-8', 'replace'), + re.DOTALL|re.IGNORECASE) + if match and not 'action=edit' in match.group(1): + url = QtCore.QUrl() # the url is already percent-encoded + url.setEncodedUrl(match.group(1)) + + if not url: + self.logger.info('Didn\'t find the song on Lyricwiki.') + return self.finish() + self.logger.info('Found Lyricwiki song URL: %s.'%url.toString()) + + req = QtNetwork.QNetworkRequest(url) + self.rep = self.nam.get(req) + self.rep.finished.connect(self.__handle_lyrics) + self.rep.error.connect(self.handle_error) + + def __handle_lyrics(self): + # the page isn't valid xml, so use regexps + lyrics = '' + for it in re.finditer('
(?:.*?
)?(.*?)(?:.*?)?', + str(self.rep.readAll()).decode('utf-8'), re.DOTALL): + gr = re.sub('
', '\n', it.group(1)) + gr = re.sub(re.compile('<.*>', re.DOTALL), '', gr) + lyrics += gr + '\n' + self.finish(common.decode_htmlentities(lyrics)) + +class FetchAnimelyrics(common.MetadataFetcher): + name = 'Animelyrics' + + def fetch(self, song): + url = QtCore.QUrl('http://www.animelyrics.com/search.php') + url.setQueryItems([('t', 'performer'), ('q', song['?artist'])]) + self.fetch2(song, url) + self.rep.finished.connect(self.__handle_search_res) + + def __handle_search_res(self): + # TODO use Qt xml functions + try: + tree = etree.HTML(unicode(self.rep.readAll(), encoding = 'utf-8', errors='ignore')) + except etree.XMLSyntaxError, e: + self.logger.error('Error parsing lyrics: %s' %e) + return self.finish() + + url = None + for elem in tree.iterfind('.//a'): + if ('href' in elem.attrib) and elem.text and (self.song['?title'] in elem.text): + url = QtCore.QUrl('http://www.animelyrics.com/%s'%elem.get('href')) + + if not url: + self.logger.info('Didn\'t find the URL in Animelyrics search results.') + return self.finish() + self.logger.info('Found Animelyrics song URL: %s.'%url) + + self.rep = self.nam.get(QtNetwork.QNetworkRequest(url)) + self.rep.finished.connect(self.__handle_lyrics) + self.rep.error.connect(self.handle_error) + + def __handle_lyrics(self): + lyrics = '' + try: + tree = etree.HTML(unicode(self.rep.readAll(), encoding = 'utf-8')) + except etree.XMLSyntaxError, e: + self.logger.error('Error parsing lyrics: %s' %e) + return self.finish() + for elem in tree.iterfind('.//pre'): + if elem.get('class') == 'lyrics': + lyrics += '%s\n\n'%etree.tostring(elem, method = 'text', encoding = 'utf-8') + + self.finish(lyrics) -- cgit v1.2.3