From c9c8572394c661792839727b29e467104efa0581 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 13 Aug 2009 08:01:32 +0200 Subject: [PATCH] Lyrics: add a toolbar. --- nephilim/plugins/Lyrics.py | 79 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/nephilim/plugins/Lyrics.py b/nephilim/plugins/Lyrics.py index 8b57f6e..f1bd7f6 100644 --- a/nephilim/plugins/Lyrics.py +++ b/nephilim/plugins/Lyrics.py @@ -19,6 +19,7 @@ from PyQt4 import QtGui, QtCore from PyQt4.QtCore import QVariant import socket +import os from ..plugin import Plugin from .. import misc @@ -37,36 +38,52 @@ class wgLyrics(QtGui.QWidget): txtView = None # text-object p = None # plugin logger = None + + __toolbar = None + __label = None def __init__(self, p, parent=None): QtGui.QWidget.__init__(self, parent) self.p = p self.logger = p.logger self.curLyrics = '' + self.__label = QtGui.QLabel(self) + + # add text area self.txtView = QtGui.QTextEdit(self) self.txtView.setReadOnly(True) - self.setLayout(QtGui.QVBoxLayout()) + # add toolbar + self.__toolbar = QtGui.QToolBar('Lyrics toolbar', self) + self.__toolbar.setOrientation(QtCore.Qt.Vertical) + + edit = self.__toolbar.addAction(QtGui.QIcon('gfx/edit.png'), 'Edit lyrics') + edit.setCheckable(True) + edit.connect(edit, QtCore.SIGNAL('toggled(bool)'), self.__toggle_editable) + + self.__toolbar.addAction(QtGui.QIcon('gfx/save.png'), 'Save lyrics', self.__save_lyrics) + self.__toolbar.addAction(QtGui.QIcon('gfx/delete.png'), 'Delete stored file', self.p.del_lyrics_file) + + self.setLayout(QtGui.QGridLayout()) self.layout().setSpacing(0) self.layout().setMargin(0) - self.layout().addWidget(self.txtView) + self.layout().addWidget(self.__toolbar, 0, 0, -1, 1, QtCore.Qt.AlignTop) + self.layout().addWidget(self.__label, 0, 1) + self.layout().addWidget(self.txtView, 1, 1) self.connect(self.p, QtCore.SIGNAL('new_lyrics_fetched'), self.set_lyrics) def set_lyrics(self, song, lyrics, flags = 0): if not song: + self.__label.clear() return self.txtView.clear() if song != self.p.mpclient.current_song(): return self.txtView.clear() - if song: - self.txtView.insertHtml('%s\n
%s
'\ - '
\n\n'%(song.title(), song.artist())) - else: - return - + self.__label.setText('%s by %s on %s'\ + %(song.title(), song.artist(), song.album())) if lyrics: self.logger.info('Setting new lyrics.') self.txtView.insertPlainText(lyrics.decode('utf-8')) @@ -74,6 +91,12 @@ class wgLyrics(QtGui.QWidget): self.logger.info('Lyrics not found.') self.txtView.insertPlainText('Lyrics not found.') + def __save_lyrics(self): + self.p.save_lyrics_file(unicode(self.txtView.toPlainText()).encode('utf-8')) + + def __toggle_editable(self, val): + self.txtView.setReadOnly(not val) + class Lyrics(Plugin): o = None sites = [] @@ -131,6 +154,35 @@ class Lyrics(Plugin): thread = self.FetchThread(self, self._fetch_lyrics, song) thread.start() + def save_lyrics_file(self, lyrics, path = None): + """Save lyrics to a file specified in path. + If path is None, then a default value is used.""" + self.logger.info('Saving lyrics...') + try: + if path: + file = open(path, 'w') + else: + file = open(self.lyrics_path, 'w') + file.write(lyrics) + file.close() + self.logger.info('Lyrics successfully saved.') + except IOError, e: + self.logger.error('Error writing lyrics: %s', e) + + def del_lyrics_file(self, song = None): + """Delete a lyrics file for song. If song is not specified + current song is used.""" + if not song: + path = self.lyrics_path + else: + path = misc.generate_metadata_path(song, self.settings().value(self.name + '/lyricdir').toString(), + self.settings().value(self.name + '/lyricname').toString()) + + try: + os.remove(path) + except IOError, e: + self.logger.error('Error removing lyrics file %s: %s'%(path, e)) + def _fetch_lyrics(self, song): self.logger.info('Trying to download lyrics from internet.') lyrics = None @@ -138,12 +190,8 @@ class Lyrics(Plugin): self.logger.info('Trying %s.'%site) lyrics = eval('self.fetch_%s(song)'%site) if lyrics: - try: - file = open(self.lyrics_path, 'w') - file.write(lyrics) - file.close() - except IOError, e: - self.logger.error('Error saving lyrics: %s'%e) + if self.settings().value(self.name + '/store').toBool(): + self.save_lyrics_file(lyrics) return self.emit(QtCore.SIGNAL('new_lyrics_fetched'), song, lyrics) self.emit(QtCore.SIGNAL('new_lyrics_fetched'), song, None) @@ -166,7 +214,7 @@ class Lyrics(Plugin): if elem.get('class') == 'lyricbox': lyrics += etree.tostring(elem, method = 'text', encoding = 'utf-8') return lyrics - except socket.error, e: + except (socket.error, IOError), e: self.logger.error('Error downloading lyrics from LyricWiki: %s.'%e) return None @@ -181,7 +229,6 @@ class Lyrics(Plugin): for elem in tree.iterfind('.//a'): if ('href' in elem.attrib) and elem.text and (song.title() in elem.text): url = 'http://www.animelyrics.com/%s'%elem.get('href') - print url if not url: return None #get lyrics -- 2.11.4.GIT