#!/usr/bin/env python #-*- coding: UTF-8 -*- # Filename: lrcEditorQt4.py # Author: Xu Jia (Sanfanling) E-mail:xujia19@sohu.com # Lisence: GPL-2.0 from PyQt4.QtGui import * from PyQt4.QtCore import * import sys,os,commands,re,s2t from locale import getdefaultlocale class lrcEditorQt4(QMainWindow): def __init__(self,f,e,d,key1,key2,*args): apply(QMainWindow.__init__,(self,)+args) self.setWindowIcon(QIcon('../scripts/lrcShow-II/icon/logo.png')) self.setWindowTitle(_(u'lrcShow-II歌词编辑器')) self.setMinimumSize(QSize(500,280)) self.initMenuBar(key1,key2) self.initToolBar() self.initCenterWidget() self.fileName=f self.encoderForSave=d if(os.path.isfile(f)): file=open(f) content=unicode(file.read(),e) file.close() self.lrcArea.setText(content) else: self.lrcArea.setText(u'[ti:]\n[ar:]\n[al:]\n[by:]') self.connect(self.quitAction,SIGNAL("triggered()"),self,SLOT("close()")) self.connect(self.saveAction,SIGNAL("triggered()"),self.saveAction_) self.connect(self.lrcArea,SIGNAL("textChanged()"),self.saveEnable) self.connect(self.saveasAction,SIGNAL("triggered()"),self.saveasAction_) self.connect(self.lrcArea,SIGNAL("redoAvailable(bool)"),self.redoAction,SLOT("setEnabled(bool)")) self.connect(self.lrcArea,SIGNAL("undoAvailable(bool)"),self.undoAction,SLOT("setEnabled(bool)")) self.connect(self.redoAction,SIGNAL("triggered()"),self.lrcArea,SLOT("redo()")) self.connect(self.undoAction,SIGNAL("triggered()"),self.lrcArea,SLOT("undo()")) self.connect(self.selectallAction,SIGNAL("triggered()"),self.lrcArea,SLOT("selectAll()")) self.connect(self.lrcArea,SIGNAL("copyAvailable(bool)"),self.copyEnable) self.connect(self.copyAction,SIGNAL("triggered()"),self.lrcArea,SLOT("copy()")) self.connect(self.pasteAction,SIGNAL("triggered()"),self.lrcArea,SLOT("paste()")) self.connect(self.cutAction,SIGNAL("triggered()"),self.lrcArea,SLOT("cut()")) self.connect(self.inserttagAction,SIGNAL("triggered()"),self.inserttagAction_) self.connect(self.cleartagAction,SIGNAL("triggered()"),self.cleartagAction_) self.connect(self.clearlrcAction,SIGNAL("triggered()"),self.clearlrcAction_) self.connect(self.clearheadAction,SIGNAL("triggered()"),self.clearheadAction_) self.connect(self.cutpointAction,SIGNAL("triggered()"),self.cutpointAction_) self.connect(self.cutspaceAction,SIGNAL("triggered()"),self.cutspaceAction_) self.connect(self.sttransferAction,SIGNAL("triggered()"),self.sttransferAction_) def sttransferAction_(self): p=s2t.s2t(str(self.lrcArea.toPlainText().toUtf8())) content=p.transfer() self.lrcArea.selectAll() self.lrcArea.insertPlainText(content.decode('utf8')) self.lrcArea.moveCursor(QTextCursor.Start) def cutspaceAction_(self): lrc_before=str(self.lrcArea.toPlainText().toUtf8()) self.lrcArea.selectAll() lrc_before=re.sub('^\s{1,}|\s{1,}$','',lrc_before) lrc_after=re.sub('\s{0,}\n\s{0,}','\n',lrc_before) self.lrcArea.insertPlainText(lrc_after.decode('utf8')) self.lrcArea.moveCursor(QTextCursor.Start) def cutpointAction_(self): lrc_before=str(self.lrcArea.toPlainText().toUtf8()) self.lrcArea.selectAll() lrc_after=re.sub('\.\d\d\]',']',lrc_before) self.lrcArea.insertPlainText(lrc_after.decode('utf8')) self.lrcArea.moveCursor(QTextCursor.Start) def clearheadAction_(self): lrc_before=str(self.lrcArea.toPlainText().toUtf8()) self.lrcArea.selectAll() lrc_after=re.sub('\[[a-z,A-Z]{1,}:.*?\]\n{0,1}','',lrc_before) self.lrcArea.insertPlainText(lrc_after.decode('utf8')) self.lrcArea.moveCursor(QTextCursor.Start) def clearlrcAction_(self): self.lrcArea.selectAll() self.lrcArea.cut() def cleartagAction_(self): content=str(self.lrcArea.toPlainText().toUtf8()) self.lrcArea.selectAll() content=re.sub('\[\d+:\d+.*?\]','',content) self.lrcArea.insertPlainText(content.decode('utf8')) self.lrcArea.moveCursor(QTextCursor.Start) def inserttagAction_(self): currentTime=int(commands.getoutput('dcop amarok player trackCurrentTimeMs')) munites,ms=divmod(currentTime,60000) if(len(str(ms))==3): seconds='00' elif(len(str(ms))==4): seconds='0'+str(ms)[0] else: seconds=str(ms)[0:2] mseconds=str(ms)[-3:-1] munites=str(munites) if(len(munites)<>2): munites='0'+munites currentTag='[%s:%s.%s]' %(munites,seconds,mseconds) self.lrcArea.textCursor().insertText(currentTag) self.lrcArea.moveCursor(QTextCursor.StartOfLine) self.lrcArea.moveCursor(QTextCursor.Down) def copyEnable(self,bool): if(bool==True): self.copyAction.setEnabled(True) self.cutAction.setEnabled(True) else: self.copyAction.setEnabled(False) self.cutAction.setEnabled(False) def saveasAction_(self): filename=QFileDialog.getSaveFileName(self,_(u'另存为'),self.fileName.decode(getdefaultlocale()[1]),'*.txt *.lrc') if(str(filename.toUtf8())<>''): content=str(self.lrcArea.toPlainText().toUtf8()) try: content=unicode(content,'utf8').encode(self.encoderForSave) except UnicodeEncodeError: QMessageBox.critical(self,_(u'编码错误'),_(u'当前文本使用写编码进行保存时发生错误\n请检查相关设置')) else: file=open(str(filename.toLocal8Bit()),'w') file.write(content) file.close() def saveEnable(self): if(os.path.isfile(self.fileName)): self.saveAction.setEnabled(True) else: pass def saveAction_(self): content=str(self.lrcArea.toPlainText().toUtf8()) try: content=unicode(content,'utf8').encode(self.encoderForSave) except UnicodeEncodeError: QMessageBox.critical(self,_(u'编码错误'),_(u'当前文本使用写编码进行保存时发生错误\n请检查相关设置')) else: file=open(self.fileName,'w') file.write(content) file.close() self.saveAction.setEnabled(False) def initCenterWidget(self): self.lrcArea=QTextEdit(self) self.lrcArea.setAcceptRichText(False) self.setCentralWidget(self.lrcArea) def initToolBar(self): toolBar=self.addToolBar(_(u'工具栏')) toolBar.addAction(self.saveAction) toolBar.addAction(self.saveasAction) toolBar.addAction(self.undoAction) toolBar.addAction(self.redoAction) toolBar.addAction(self.cutAction) toolBar.addAction(self.copyAction) toolBar.addAction(self.pasteAction) toolBar.addAction(self.cleartagAction) toolBar.addAction(self.inserttagAction) def initMenuBar(self,key1,key2): menuBar=self.menuBar() menuFile=menuBar.addMenu(_(u'文件(&F)')) self.saveAction=QAction(QIcon('../scripts/lrcShow-II/icon/save.png'),_(u'保存(&S)'),self) self.saveAction.setEnabled(False) menuFile.addAction(self.saveAction) self.saveasAction=QAction(QIcon('../scripts/lrcShow-II/icon/saveas.png'),_(u'另存为(&A)...'),self) menuFile.addAction(self.saveasAction) self.quitAction=QAction(QIcon('../scripts/lrcShow-II/icon/exit.png'),_(u'退出(&Q)'),self) menuFile.addAction(self.quitAction) menuEdit=menuBar.addMenu(_(u'编辑(&E)')) self.undoAction=QAction(QIcon('../scripts/lrcShow-II/icon/undo.png'),_(u'撤销(&U)'),self) self.undoAction.setShortcut(key2) self.undoAction.setEnabled(False) menuEdit.addAction(self.undoAction) self.redoAction=QAction(QIcon('../scripts/lrcShow-II/icon/redo.png'),_(u'重做(&D)'),self) self.redoAction.setEnabled(False) menuEdit.addAction(self.redoAction) self.cutAction=QAction(QIcon('../scripts/lrcShow-II/icon/editcut.png'),_(u'剪切(&X)'),self) self.cutAction.setEnabled(False) menuEdit.addAction(self.cutAction) self.copyAction=QAction(QIcon('../scripts/lrcShow-II/icon/editcopy.png'),_(u'复制(&C)'),self) self.copyAction.setEnabled(False) menuEdit.addAction(self.copyAction) self.pasteAction=QAction(QIcon('../scripts/lrcShow-II/icon/editpaste.png'),_(u'粘帖(&P)'),self) menuEdit.addAction(self.pasteAction) self.selectallAction=QAction(QIcon(),_(u'全选(&A)'),self) menuEdit.addAction(self.selectallAction) menuOperation=menuBar.addMenu(_(u'操作(&O)')) self.inserttagAction=QAction(QIcon('../scripts/lrcShow-II/icon/insert_tag.png'),_(u'插入时间标签(&I)'),self) self.inserttagAction.setShortcut(key1) menuOperation.addAction(self.inserttagAction) self.cleartagAction=QAction(QIcon('../scripts/lrcShow-II/icon/del_tags.png'),_(u'清除时间标签(&R)'),self) menuOperation.addAction(self.cleartagAction) self.cutpointAction=QAction(QIcon(),_(u'清除小数部分(&S)'),self) menuOperation.addAction(self.cutpointAction) self.cutspaceAction=QAction(QIcon(),_(u'清除多余字符(&P)'),self) menuOperation.addAction(self.cutspaceAction) self.clearlrcAction=QAction(QIcon(),_(u'清空歌词区(&C)'),self) menuOperation.addAction(self.clearlrcAction) self.clearheadAction=QAction(QIcon(),_(u'清空LRC头(&H)'),self) menuOperation.addAction(self.clearheadAction) self.sttransferAction=QAction(QIcon('../scripts/lrcShow-II/icon/st.png'),_(u'简繁体转换(&T)'),self) menuOperation.addAction(self.sttransferAction) def main(args): app=QApplication(args) win=lrcEditorQt4('/mnt/hda7/Lrc歌词/小情歌 - 苏打绿.lrc','utf8') win.show() sys.exit(app.exec_()) if(__name__=="__main__"): main(sys.argv)