summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2010-05-10 10:56:09 +0200
committerAnton Khirnov <wyskas@gmail.com>2010-05-10 10:56:09 +0200
commitf758465e91d5ac1704b4f8f05202ab9f8fdc7999 (patch)
tree861b001d39812b9aa62a2eadb9e8cbd3161e9349
parent48c1445953b12bd247e1d74dbd436d867cea7ebd (diff)
AlbumCover: move fetcher classes to top level.
-rw-r--r--nephilim/plugins/AlbumCover.py209
1 files changed, 103 insertions, 106 deletions
diff --git a/nephilim/plugins/AlbumCover.py b/nephilim/plugins/AlbumCover.py
index c462d2f..8d7f8dc 100644
--- a/nephilim/plugins/AlbumCover.py
+++ b/nephilim/plugins/AlbumCover.py
@@ -24,7 +24,6 @@ from ..plugin import Plugin
from .. import common
from .. import icons
-
class AlbumCoverWidget(QtGui.QLabel):
"cover - QPixmap or None"
cover = None
@@ -125,7 +124,7 @@ class AlbumCover(Plugin):
Plugin.__init__(self, parent, mpclient, name)
self.__fetchers = []
- self.available_fetchers = [self.FetcherLocal, self.FetcherLastfm]
+ self.available_fetchers = [FetcherLocal, FetcherLastfm]
def __new_cover_fetched(self, song, cover):
self.logger.info('Got new cover.')
@@ -216,110 +215,6 @@ class AlbumCover(Plugin):
self.plugin.refresh_fetchers()
self.plugin.refresh()
- class FetcherLastfm(common.MetadataFetcher):
- name = 'Last.fm'
-
- def fetch(self, song):
- if not 'artist' in song or 'album' in song:
- return self.finish()
- url = QtCore.QUrl('http://ws.audioscrobbler.com/2.0/')
- url.setQueryItems([('api_key', 'beedb2a8a0178b8059cd6c7e57fbe428'),
- ('method', 'album.getInfo'),
- ('artist', song['artist']),
- ('album', song['album']),
- ('mbid', song['?MUSICBRAINZ_ALBUMID'])])
- self.fetch2(song, url)
- self.rep.finished.connect(self.__handle_search_res)
-
- def __handle_search_res(self):
- url = None
- xml = QtCore.QXmlStreamReader(self.rep)
-
- while not xml.atEnd():
- token = xml.readNext()
- if token == QtCore.QXmlStreamReader.StartElement:
- if xml.name() == 'image' and xml.attributes().value('size') == 'extralarge':
- url = QtCore.QUrl() # the url is already percent-encoded
- try:
- url.setEncodedUrl(xml.readElementText())
- except TypeError: #no text
- url = None
- if xml.hasError():
- self.logger.error('Error parsing seach results: %s'%xml.errorString())
-
- if not url:
- self.logger.info('Didn\'t find the URL in %s search results.'%self.name)
- return self.finish()
- self.logger.info('Found %s song URL: %s.'%(self.name, url))
-
- self.rep = self.nam.get(QtNetwork.QNetworkRequest(url))
- self.rep.finished.connect(self.__handle_cover)
-
- def __handle_cover(self):
- data = self.rep.readAll()
- pixmap = QtGui.QPixmap()
- if pixmap.loadFromData(data):
- self.finish(pixmap)
- self.finish()
-
- class FetcherLocal(QtCore.QObject):
- """This fetcher tries to find cover files in the same directory as
- current song."""
- #public, read-only
- name = 'local'
- logger = None
- settings = None
-
- # SIGNALS
- finished = QtCore.pyqtSignal('song', 'metadata')
-
- def __init__(self, plugin):
- QtCore.QObject.__init__(self, plugin)
- self.logger = plugin.logger
- self.settings = QtCore.QSettings()
-
- def fetch(self, song):
- self.logger.info('Trying to guess local cover name.')
- # guess cover name
- covers = ['cover', 'album', 'front']
-
- exts = []
- for ext in QtGui.QImageReader().supportedImageFormats():
- exts.append('*.%s'%str(ext))
-
- filter = []
- for cover in covers:
- for ext in exts:
- filter.append('*.%s%s'%(cover,ext))
-
- dirname, filename = common.generate_metadata_path(song, '$musicdir/$songdir', '')
- dir = QtCore.QDir(dirname)
- if not dir:
- self.logger.error('Error opening directory %s.'%dirname)
- return self.finished.emit(song, None)
-
- dir.setNameFilters(filter)
- files = dir.entryList()
- if files:
- cover = QtGui.QPixmap(dir.filePath(files[0]))
- if not cover.isNull():
- self.logger.info('Found a cover: %s'%dir.filePath(files[0]))
- return self.finished.emit(song, cover)
-
- # if this failed, try any supported image
- dir.setNameFilters(exts)
- files = dir.entryList()
- if files:
- cover = QtGui.QPixmap(dir.filePath(files[0]))
- if not cover.isNull():
- self.logger.info('Found a cover: %s'%dir.filePath(files[0]))
- return self.finished.emit(song, cover)
- self.logger.info('No matching cover found')
- self.finished.emit(song, None)
-
- def abort(self):
- pass
-
#### public ####
def _load(self):
self.o = AlbumCoverWidget(self)
@@ -421,4 +316,106 @@ class AlbumCover(Plugin):
def get_settings_widget(self):
return self.SettingsWidgetAlbumCover(self)
+class FetcherLastfm(common.MetadataFetcher):
+ name = 'Last.fm'
+
+ def fetch(self, song):
+ if not 'artist' in song or 'album' in song:
+ return self.finish()
+ url = QtCore.QUrl('http://ws.audioscrobbler.com/2.0/')
+ url.setQueryItems([('api_key', 'beedb2a8a0178b8059cd6c7e57fbe428'),
+ ('method', 'album.getInfo'),
+ ('artist', song['artist']),
+ ('album', song['album']),
+ ('mbid', song['?MUSICBRAINZ_ALBUMID'])])
+ self.fetch2(song, url)
+ self.rep.finished.connect(self.__handle_search_res)
+
+ def __handle_search_res(self):
+ url = None
+ xml = QtCore.QXmlStreamReader(self.rep)
+
+ while not xml.atEnd():
+ token = xml.readNext()
+ if token == QtCore.QXmlStreamReader.StartElement:
+ if xml.name() == 'image' and xml.attributes().value('size') == 'extralarge':
+ url = QtCore.QUrl() # the url is already percent-encoded
+ try:
+ url.setEncodedUrl(xml.readElementText())
+ except TypeError: #no text
+ url = None
+ if xml.hasError():
+ self.logger.error('Error parsing seach results: %s'%xml.errorString())
+
+ if not url:
+ self.logger.info('Didn\'t find the URL in %s search results.'%self.name)
+ return self.finish()
+ self.logger.info('Found %s song URL: %s.'%(self.name, url))
+
+ self.rep = self.nam.get(QtNetwork.QNetworkRequest(url))
+ self.rep.finished.connect(self.__handle_cover)
+
+ def __handle_cover(self):
+ data = self.rep.readAll()
+ pixmap = QtGui.QPixmap()
+ if pixmap.loadFromData(data):
+ self.finish(pixmap)
+ self.finish()
+
+class FetcherLocal(QtCore.QObject):
+ """This fetcher tries to find cover files in the same directory as
+ current song."""
+ #public, read-only
+ name = 'local'
+ logger = None
+ settings = None
+
+ # SIGNALS
+ finished = QtCore.pyqtSignal('song', 'metadata')
+
+ def __init__(self, plugin):
+ QtCore.QObject.__init__(self, plugin)
+ self.logger = plugin.logger
+ self.settings = QtCore.QSettings()
+
+ def fetch(self, song):
+ self.logger.info('Trying to guess local cover name.')
+ # guess cover name
+ covers = ['cover', 'album', 'front']
+
+ exts = []
+ for ext in QtGui.QImageReader().supportedImageFormats():
+ exts.append('*.%s'%str(ext))
+
+ filter = []
+ for cover in covers:
+ for ext in exts:
+ filter.append('*.%s%s'%(cover,ext))
+
+ dirname, filename = common.generate_metadata_path(song, '$musicdir/$songdir', '')
+ dir = QtCore.QDir(dirname)
+ if not dir:
+ self.logger.error('Error opening directory %s.'%dirname)
+ return self.finished.emit(song, None)
+
+ dir.setNameFilters(filter)
+ files = dir.entryList()
+ if files:
+ cover = QtGui.QPixmap(dir.filePath(files[0]))
+ if not cover.isNull():
+ self.logger.info('Found a cover: %s'%dir.filePath(files[0]))
+ return self.finished.emit(song, cover)
+
+ # if this failed, try any supported image
+ dir.setNameFilters(exts)
+ files = dir.entryList()
+ if files:
+ cover = QtGui.QPixmap(dir.filePath(files[0]))
+ if not cover.isNull():
+ self.logger.info('Found a cover: %s'%dir.filePath(files[0]))
+ return self.finished.emit(song, cover)
+ self.logger.info('No matching cover found')
+ self.finished.emit(song, None)
+ def abort(self):
+ pass