diff options
author | Anton Khirnov <wyskas@gmail.com> | 2009-04-30 09:45:53 +0200 |
---|---|---|
committer | Anton Khirnov <wyskas@gmail.com> | 2009-04-30 09:45:53 +0200 |
commit | 0cc4383b3647b619c2dc1286cb1379ef0e99fbf7 (patch) | |
tree | f33c9d0155e66867d58f022c7b9c29866b31bc76 /nephilim/plugins/AlbumCover.py | |
parent | d03647012a5f15773495c53d8573d19fb25fb941 (diff) |
AlbumCover: use a separate thread for fetching.
doesn't work with manual setting atm.
Diffstat (limited to 'nephilim/plugins/AlbumCover.py')
-rw-r--r-- | nephilim/plugins/AlbumCover.py | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/nephilim/plugins/AlbumCover.py b/nephilim/plugins/AlbumCover.py index a33a3bc..cbee07b 100644 --- a/nephilim/plugins/AlbumCover.py +++ b/nephilim/plugins/AlbumCover.py @@ -42,11 +42,15 @@ class wgAlbumCover(QtGui.QLabel): _cover_filepath = None # for current song should be stored. _menu = None # popup menu + _cover_lock = None # mutex for the cover + def __init__(self, plugin): QtGui.QLabel.__init__(self) self.plugin = plugin self.setAlignment(QtCore.Qt.AlignCenter) + self._cover_lock = QtCore.QMutex() + # popup menu self._menu = QtGui.QMenu("album") refresh = self._menu.addAction('&Refresh cover.') @@ -66,6 +70,8 @@ class wgAlbumCover(QtGui.QLabel): self.connect(self.plugin.mpclient(), QtCore.SIGNAL('disconnected'), self.refresh) self.connect(self.plugin.mpclient(), QtCore.SIGNAL('state_changed'),self.refresh) + self.connect(self, QtCore.SIGNAL('new_cover_fetched'), self.set_cover) + def mousePressEvent(self, event): if event.button() == QtCore.Qt.RightButton: self._menu.popup(event.globalPos()) @@ -74,25 +80,38 @@ class wgAlbumCover(QtGui.QLabel): """Set cover for current song, attempt to write it to a file if write is True and it's globally allowed.""" logging.info('Setting cover') + self._cover_lock.lock() if not cover or cover.isNull(): self.cover = None self.cover_loaded = False self.setPixmap(QtGui.QPixmap('gfx/no-cd-cover.png')) self.plugin.emit(QtCore.SIGNAL('cover_changed'), None) + self._cover_lock.unlock() return - self.cover = cover + self.cover = QtGui.QPixmap.fromImage(cover) self.cover_loaded = True - self.setPixmap(cover.scaled(self.size(), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)) + self.setPixmap(self.cover.scaled(self.size(), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)) self.plugin.emit(QtCore.SIGNAL('cover_changed'), self.cover) logging.info('Cover set.') if (write and self.plugin.settings().value(self.plugin.name() + '/store').toBool() and self._cover_filepath): - if cover.save(self._cover_filepath, 'png'): + if self.cover.save(self._cover_filepath, 'png'): logging.info('Cover saved.') else: logging.error('Error saving cover.') + self._cover_lock.unlock() + + class FetchThread(QtCore.QThread): + def __init__(self, parent, fetch_func, song): + QtCore.QThread.__init__(self) + self.setParent(parent) + self.fetch_func = fetch_func + self.song = song + + def run(self): + self.fetch_func(self.song) def refresh(self): """Autofetch cover for currently playing song.""" @@ -113,7 +132,8 @@ class wgAlbumCover(QtGui.QLabel): filebase = self.plugin.settings().value(self.plugin.name() + '/covername').toString() self._cover_filepath = '%s/%s'%(self._cover_dirname, expand_tags(filebase, (self.plugin.parent(), song)).replace('/', '_')) - self._fetch_cover(song) + fetch_thread = self.FetchThread(self, self._fetch_cover, song) + fetch_thread.start() def _fetch_cover(self, song): write = False @@ -125,15 +145,15 @@ class wgAlbumCover(QtGui.QLabel): elif src == AC_FETCH_AMAZON: cover = self._fetch_amazon(song) else: - cover = QtGui.QPixmap() + cover = QtGui.QImage() if cover and not cover.isNull(): write = True break else: - cover = QtGui.QPixmap(self._cover_filepath) + cover = QtGui.QImage(self._cover_filepath) - self.set_cover(cover, write) + self.emit(QtCore.SIGNAL('new_cover_fetched'), cover, write) def _fetch_local_manual(self): song = self.plugin.mpclient().current_song() @@ -143,11 +163,10 @@ class wgAlbumCover(QtGui.QLabel): file = QtGui.QFileDialog.getOpenFileName(self, 'Select album cover for %s - %s'%(song.artist(), song.album()), self._cover_dirname, '') - cover = QtGui.QPixmap(file) + cover = QtGui.QImage(file) if cover.isNull(): return - self.set_cover(cover, True) - self.cover_loaded = True + self.emit(QtCore.SIGNAL('new_cover_fetched'), cover, True) def _fetch_local(self, song): logging.info('Trying to guess local cover name.') @@ -171,7 +190,7 @@ class wgAlbumCover(QtGui.QLabel): dir.setNameFilters(filter) files = dir.entryList() if files: - cover = QtGui.QPixmap(dir.filePath(files[0])) + cover = QtGui.QImage(dir.filePath(files[0])) if not cover.isNull(): logging.info('Found a cover.') return cover @@ -180,7 +199,7 @@ class wgAlbumCover(QtGui.QLabel): dir.setNameFilters(exts) files = dir.entryList() if files: - return QtGui.QPixmap(dir.filePath(files[0])) + return QtGui.QImage(dir.filePath(files[0])) logging.info('No matching cover found') return None @@ -189,7 +208,7 @@ class wgAlbumCover(QtGui.QLabel): if not song: return cover = self._fetch_amazon(song) - self.set_cover(cover, True) + self.emit(QtCore.SIGNAL('new_cover_fetched'), cover, True) def _fetch_amazon(self, song): if not song.artist() or not song.album(): @@ -202,7 +221,7 @@ class wgAlbumCover(QtGui.QLabel): return None img = urllib.urlopen(coverURL) - cover = QtGui.QPixmap() + cover = QtGui.QImage() cover.loadFromData(img.read()) return cover |