From f758465e91d5ac1704b4f8f05202ab9f8fdc7999 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 10 May 2010 10:56:09 +0200 Subject: AlbumCover: move fetcher classes to top level. --- nephilim/plugins/AlbumCover.py | 209 ++++++++++++++++++++--------------------- 1 file 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 -- cgit v1.2.3