summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2010-05-10 10:57:30 +0200
committerAnton Khirnov <wyskas@gmail.com>2010-05-10 10:57:48 +0200
commit8a83bc5c0b02b529664fd93daf85c74a34ead078 (patch)
tree1c3c5ac85ec8b3cf5ed499b07b564b21c73be701
parentf758465e91d5ac1704b4f8f05202ab9f8fdc7999 (diff)
Lyrics: move fetcher classes to top level.
-rw-r--r--nephilim/plugins/Lyrics.py217
1 files 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('<url>(.*)</url>', 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('<div class=\'lyricbox\'>(?:<div.*?>.*?</div>)?(.*?)(?:<div.*?>.*?</div>)?</div>',
- str(self.rep.readAll()).decode('utf-8'), re.DOTALL):
- gr = re.sub('<br />', '\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('<url>(.*)</url>', 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('<div class=\'lyricbox\'>(?:<div.*?>.*?</div>)?(.*?)(?:<div.*?>.*?</div>)?</div>',
+ str(self.rep.readAll()).decode('utf-8'), re.DOTALL):
+ gr = re.sub('<br />', '\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)