summaryrefslogtreecommitdiff
path: root/nephilim/plugins/AlbumCover.py
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2009-04-30 09:45:53 +0200
committerAnton Khirnov <wyskas@gmail.com>2009-04-30 09:45:53 +0200
commit0cc4383b3647b619c2dc1286cb1379ef0e99fbf7 (patch)
treef33c9d0155e66867d58f022c7b9c29866b31bc76 /nephilim/plugins/AlbumCover.py
parentd03647012a5f15773495c53d8573d19fb25fb941 (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.py47
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