From: <je...@us...> - 2003-07-30 21:39:18
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv4568 Modified Files: gui.py Log Message: Some cleanup here and there. Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** gui.py 30 Jul 2003 11:07:11 -0000 1.17 --- gui.py 30 Jul 2003 21:37:14 -0000 1.18 *************** *** 13,27 **** from dvd import * try: ! from qt import * except: ! print "Couldn't load PyQT module! Check it's installed properly." ! print "If you think it is, but you still get this message, please" ! print "see the frequent problems page online at:" ! print "http://quickrip.sf.net/fp.shtml" ! print "" ! print "Press Enter for the full Qt error message" ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings --- 13,30 ---- from dvd import * try: ! from qt import * except: ! print """ ! Unable to load the PyQt module! ! Check it's installed properly. ! If you think it is, but you still get this message, please ! see the frequent problems page online at ! http://quickrip.sf.net/fp.shtml ! ! Press Enter for the full Qt error message ! """ ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings *************** *** 41,511 **** class GUI(DVD, MainWindow): ! """GUI-specific functions to add a Qt GUI to the DVD class: ! changeState() - start/stop the ripping process ! int_startScanning() - notify user that the DVD is being scanned ! int_noTracks() - notify user that no tracks were found ! int_dispDVD() - display information about the DVD ! int_dispTrack() - display information about scanned track ! int_finishScanning() - notify user that scanning has finished ! int_startRipping() - notify user that ripping has started ! int_newTrack() - notify that ripping has begun on a new track ! int_newPass() - notify that new ripping pass has begun ! int_updateProgress() - update any ripping progress display being used ! int_finishRipping() - notify user that ripping has finished""" ! def __init__(self, app, parent=None): ! self.app = app ! MainWindow.__init__(self, parent) ! self.setIcon(QPixmap(config.icon)) # set application icon... ! self.DVD_DEVICE = "/dev/dvd" ! self.cwd = os.getcwd() ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! self.configfile = os.path.join(os.path.expanduser("~"),".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! self.outputDir.setText(self.config['outputdir']) ! self.outdir = self.config['outputdir'] ! def int_configError(self, bin): ! self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") ! sys.exit(2) ! def int_startScanning(self): ! print "* Scanning DVD..." ! self.b_ScanDVD.setText("Scanning...") ! self.dvdTracks.clear() ! def int_noTracks(self): ! QMessageBox.warning(self, "QuickRip Error", "QuickRip was unable to find any " ! "DVD tracks.\n\nCheck:\n* Mplayer and Transcode are " ! "installed\n* The program paths are correct in Settings\n" ! "* Mplayer can play DVDs\n* You have a DVD " ! "in your drive", "OK") ! self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): ! #print "Found %s titles" % (self.numtitles) ! #print "Found audio languages %s" % (self.alangs) ! #print "Found subtitle languages %s" % (self.slangs) ! print "Found %s titles\nFound audio languages %s\nFound subtitle languages %s\n" % \ ! (self.numtitles, self.alangs, self.slangs) ! # Add languages to drop-down menus ! for lang in self.alangs: ! self.aLang.insertItem(lang, -1) ! for lang in self.slangs: ! self.subTitles.insertItem(lang, -1) ! def int_dispTrack(self, track): ! self.track = track ! print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = QListViewItem(self.dvdTracks,None) ! item.setText(0, self.track['name']) ! item.setText(1, str(self.track['timelabel'])) ! item.info = self.track ! for i in range(int(self.track['numchapters']) + 1): ! if i > 0: ! if i < 10: i = "0" + str(i) ! chap_label = "Chapter %s" % (i) ! subitem = QListViewItem(item,None) ! subitem.setText(0, self.tr(chap_label)) ! self.app.processEvents() ! def int_finishScanning(self): ! print "* Finished scanning" ! self.b_ScanDVD.setText("Scan DVD") ! def int_startRipping(self): ! print "* Starting ripping" ! def int_newTrack(self, name, number, total, vbr): ! print "*\tRipping track '%s' (%s of %s) at %skbps" % (name, number, total, vbr) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def int_newPass(self, passtype): ! self.passtype = passtype ! if self.passtype is "video1": ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.passtype is "video2": ! self.Dialogue.pm_videoPass1.setProgress(100) ! def int_updateProgress(self, perc, trem, tpass): ! self.percentage = perc ! self.trem = trem ! self.tpass = tpass ! eta = "".join(["ETA: ", str(trem), " (approximately)"]) ! self.Dialogue.l_ETA.setText(eta) ! if self.tpass is "all": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "audio": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "video1": ! self.Dialogue.pm_videoPass1.setProgress(int(perc)) ! elif self.tpass is "video2": ! self.Dialogue.pm_videoPass2.setProgress(int(perc)) ! self.app.processEvents() ! def int_finishRipping(self): ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_videoPass1.setProgress(100) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_videoPass2.setProgress(100) ! print "* Ripping finished" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.l_ETA.setText("ETA: N/A") ! self.state = "stopped" ! os.chdir(self.cwd) ! def selectTrack(self, const, qpoint, col): ! """Select tracks to rip by setting column 2 to 'yes'""" ! # Check the mouse isn't clicking in blank space ! self.track = self.dvdTracks.selectedItem() ! try: ! checker = self.track.text(0) ! del checker ! except: ! return ! # Check if the user has clicked on a title or a chapter ! chap = re.compile('Chapter.*') ! if not chap.search(str(self.track.text(0))): ! # Stop short of tagging for ripping unless "Rip" column is selected ! if col is not 2: ! self.updateTrackDisplay(self.track) ! return ! if self.track.info['rip'] is "yes": ! self.track.setPixmap(2, self.image_blank) ! self.updateTrackRip(self.track, mode="remove") ! else: ! self.track.setPixmap(2, self.image_tick) ! self.updateTrackRip(self.track, mode="add") ! self.checkEnableRip() ! def updateTrackDisplay(self, track): ! self.track = track ! self.track.info['name'] = self.track.text(0) ! if abs(int(str(self.fileSize.cleanText())) - self.track.info['size']) > 1: ! self.fileSize.setValue(self.track.info['size']) ! if abs(self.audioBitRate.currentItem() - self.track.info['abr_id']) > 1: ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.track.info['abr'] = self.audioBitRate.currentText() ! if abs(int(str(self.videoBitRate.cleanText())) - self.track.info['vbr']) > 1: ! self.videoBitRate.setValue(self.track.info['vbr']) ! self.videoBitRateSlider.setValue(self.track.info['vbr']) ! def updateTrackRip(self, track, mode): ! """Update track's rip attribute""" ! if not len(self.tracks): ! return ! # Add/remove "rip" status to/from track ! self.mode = mode ! if self.mode is "remove": ! self.track.info['rip'] = "no" ! elif self.mode is "add": ! self.track.info['rip'] = "yes" ! self.updateTrackDisplay(self.track) ! def newFileSize(self, filesize): ! self.track = self.dvdTracks.selectedItem() ! self.filesize = int(str(self.fileSize.cleanText())) ! self.track.info['size'] = int(self.filesize) ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! #print "new file size, changing video bitrate to %s (size: %s, length %s, abr %s)" % (self.track.info['vbr'], self.track.info['size'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.bitrate = int(str(self.videoBitRate.cleanText())) ! self.track.info['vbr'] = self.bitrate ! self.track.info['size'] = self.calcFileSize(self.track.info['time'], self.track.info['abr'], self.track.info['vbr']) ! #print "new bitrate, changing file size to %s (vbr: %s, length %s, abr %s)" % (self.track.info['size'],self.track.info['vbr'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newAudioBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.audiobitrate = int(str(self.audioBitRate.currentText())) ! print self.audiobitrate ! self.track.info['abr'] = self.audiobitrate ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! self.updateTrackDisplay(self.track) ! def checkEnableRip(self): ! r = str(self.videoBitRate.cleanText()) ! o = str(self.outputDir.text()) ! t = 0 ! for track in self.tracks: ! if track['rip'] is "yes": ! t = 1 ! if len(r) > 0 and len(o) > 0 and t is 1: ! self.b_RipDVD.setEnabled(1) ! else: ! self.b_RipDVD.setEnabled(0) ! def renameTrack(self, item): ! """Set ViewListItem to be renamed""" ! self.item = item ! self.item.setRenameEnabled(0, 1) ! self.item.startRename(0) ! def browseHD(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.outputDir.setText(str(directory)) ! self.outdir = str(directory) ! self.checkEnableRip() ! def openRipDialogue(self): ! try: ! os.chdir(config.qr_dir) ! except OSError, msg: ! print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" ! #import output ! #print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 282, GUI.PY)") ! self.state = "stopped" ! self.Dialogue = dialogueProgress(self) ! self.Dialogue.connect(self.Dialogue.b_changeState,SIGNAL("clicked()"),self.changeState) ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! # Add in progress bars appropriate to number of passes ! l_audiopass = QHBoxLayout(None,0,6,"l_audiopass") ! self.Dialogue.textLabel3 = QLabel(self.Dialogue.groupBox3,"textlabel3") ! l_audiopass.addWidget(self.Dialogue.textLabel3) ! self.Dialogue.pm_audioPass = QProgressBar(self.Dialogue.groupBox3,"pm_audioPass") ! self.Dialogue.pm_audioPass.setMinimumSize(QSize(400,0)) ! l_audiopass.addWidget(self.Dialogue.pm_audioPass) ! self.Dialogue.groupBox3Layout.addLayout(l_audiopass,2,0) ! self.Dialogue.textLabel3.setText(self.tr("Progress:")) ! if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) ! if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) ! # if self.config['passes'] is 1: ! # from guiprogressdialogue_1pass import dialogProgress ! # elif self.config['passes'] is 2: ! # from guiprogressdialogue_2pass import dialogProgress ! # elif not self.config['passes'] or self.config['passes'] is 3: ! # from guiprogressdialogue_3pass import dialogProgress ! self.Dialogue.exec_loop() ! def changeState(self): ! """Switch dialogue between stopped and ripping, changing buttons ! and starting/stopping ripping process""" ! if self.state is "stopped": ! self.Dialogue.b_changeState.setText("Stop") ! self.Dialogue.b_closeProgressDialogue.setEnabled(0) ! os.chdir(self.outdir) ! self.volumead = str(self.volume.currentText()) ! self.aLanguage = str(self.aLang.currentText()) ! self.sLanguage = str(self.subTitles.currentText()) ! self.ripDVD() ! elif self.state is "ripping": ! print "* Ripping aborted" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! try: ! pid = self.pipe.pid ! os.kill(pid, 9) ! os.waitpid(pid, os.WNOHANG) ! except: ! pass ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! #elif self.config['passes'] == 0 or self.config['passes'] == 3: ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.state = "stopped" ! os.chdir(self.cwd) ! def openSettingsDialogue(self): ! """Open the settings dialogue box, connecting slots to functions""" ! self.Dialogue = dialogSettings(self) ! # Set-up defauls from config file ! self.Dialogue.mplayer.setText(self.config['mplayer']) ! self.Dialogue.mencoder.setText(self.config['mencoder']) ! self.Dialogue.tcprobe.setText(self.config['tcprobe']) ! self.Dialogue.dvdDevice.setText(self.config['dvd_device']) ! self.Dialogue.outputDir.setText(self.config['outputdir']) ! self.Dialogue.deInterlacing.setCurrentItem(int(self.config['deinterlacing'])) ! self.Dialogue.aspectRatio.setCurrentItem(int(self.config['aspectratio'])) ! self.Dialogue.encoderPasses.setCurrentItem(int(self.config['passes'])) ! self.Dialogue.videoCodec.setCurrentItem(int(self.config['videocodec'])) ! if self.config['pdamode'] == 1: ! self.Dialogue.c_pdamode.setChecked(1) ! # Connect functions ! self.connect(self.Dialogue.b_browseMPlayer,SIGNAL("clicked()"),self.browseMPlayer) ! self.connect(self.Dialogue.b_browseMencoder,SIGNAL("clicked()"),self.browseMencoder) ! self.connect(self.Dialogue.b_browseTcprobe,SIGNAL("clicked()"),self.browseTcprobe) ! self.connect(self.Dialogue.b_browseDVD,SIGNAL("clicked()"),self.browseDVD) ! self.connect(self.Dialogue.b_selectOutputDir,SIGNAL("clicked()"),self.selectOutDir) ! self.connect(self.Dialogue.b_OK,SIGNAL("clicked()"),self.changeSettings) ! self.connect(self.Dialogue.b_Save,SIGNAL("clicked()"),self.saveSettings) ! self.Dialogue.exec_loop() ! def browseMPlayer(self): ! """Launch file dialogue and set path to MPlayer""" ! self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to MPlayer") ! self.Dialogue.mplayer.setText(str(mplayer)) ! def browseMencoder(self): ! """Launch file dialogue and set path to Mencoder""" ! self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Mencoder") ! self.Dialogue.mencoder.setText(str(mencoder)) ! def browseTcprobe(self): ! """Launch file dialogue and set path to Tcprobe""" ! self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Tcprobe") ! self.Dialogue.tcprobe.setText(str(tcprobe)) ! def browseDVD(self): ! """Launch file dialogue and set path to dvd device""" ! try: ! self.path = re.compile('(/.*)/.*').search(self.config['dvd_device']).group(1) ! except: ! self.path = os.path.join("/", "dev", "dvd") ! dvd_device = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to DVD Device") ! self.Dialogue.dvdDevice.setText(str(dvd_device)) ! def selectOutDir(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.Dialogue.outputDir.setText(str(directory)) ! def changeSettings(self): ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.Dialogue.accept() ! def saveSettings(self): ! print "* Saving new settings to ~/.quickriprc" ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.parser.set('paths', 'mplayer', self.config['mplayer']) ! self.parser.set('paths', 'mencoder', self.config['mencoder']) ! self.parser.set('paths', 'tcprobe', self.config['tcprobe']) ! self.parser.set('paths', 'dvd_device', self.config['dvd_device']) ! self.parser.set('paths', 'outputdir', self.config['outputdir']) ! self.parser.set('mencoder', 'deinterlacing', self.config['deinterlacing']) ! self.parser.set('mencoder', 'aspectratio', self.config['aspectratio']) ! self.parser.set('mencoder', 'passes', self.config['passes']) ! self.parser.set('mencoder', 'pdamode', self.config['pdamode']) ! self.parser.set('mencoder', 'videocodec', self.config['videocodec']) ! self.parser.write(open(self.configfile, 'w')) def main(): ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! app = QApplication(sys.argv) ! QObject.connect(app, SIGNAL('lastWindowClosed()'), ! app, SLOT('quit()')) ! win = GUI(app) ! app.setMainWidget(win) ! win.show() ! app.exec_loop() --- 44,514 ---- class GUI(DVD, MainWindow): ! """GUI-specific functions to add a Qt GUI to the DVD class: ! changeState() - start/stop the ripping process ! int_startScanning() - notify user that the DVD is being scanned ! int_noTracks() - notify user that no tracks were found ! int_dispDVD() - display information about the DVD ! int_dispTrack() - display information about scanned track ! int_finishScanning() - notify user that scanning has finished ! int_startRipping() - notify user that ripping has started ! int_newTrack() - notify that ripping has begun on a new track ! int_newPass() - notify that new ripping pass has begun ! int_updateProgress() - update any ripping progress display being used ! int_finishRipping() - notify user that ripping has finished""" ! def __init__(self, app, parent=None): ! self.app = app ! MainWindow.__init__(self, parent) ! self.setIcon(QPixmap(config.icon)) # set application icon... ! self.DVD_DEVICE = "/dev/dvd" ! self.cwd = os.getcwd() ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! self.configfile = os.path.join(os.path.expanduser("~"),".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! self.outputDir.setText(self.config['outputdir']) ! self.outdir = self.config['outputdir'] ! def int_configError(self, bin): ! self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") ! sys.exit(2) ! def int_startScanning(self): ! print "* Scanning DVD..." ! self.b_ScanDVD.setText("Scanning...") ! self.dvdTracks.clear() ! def int_noTracks(self): ! QMessageBox.warning(self, "QuickRip Error", "QuickRip was unable to find any " ! "DVD tracks.\n\nCheck:\n* Mplayer and Transcode are " ! "installed\n* The program paths are correct in Settings\n" ! "* Mplayer can play DVDs\n* You have a DVD " ! "in your drive", "OK") ! self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): ! #print "Found %s titles" % (self.numtitles) ! #print "Found audio languages %s" % (self.alangs) ! #print "Found subtitle languages %s" % (self.slangs) ! print "Found %s titles\nFound audio languages %s\nFound subtitle languages %s\n" % \ ! (self.numtitles, self.alangs, self.slangs) ! # Add languages to drop-down menus ! for lang in self.alangs: ! self.aLang.insertItem(lang, -1) ! for lang in self.slangs: ! self.subTitles.insertItem(lang, -1) ! def int_dispTrack(self, track): ! self.track = track ! print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = QListViewItem(self.dvdTracks,None) ! item.setText(0, self.track['name']) ! item.setText(1, str(self.track['timelabel'])) ! item.info = self.track ! for i in range(int(self.track['numchapters']) + 1): ! if i > 0: ! if i < 10: i = "0" + str(i) ! chap_label = "Chapter %s" % (i) ! subitem = QListViewItem(item,None) ! subitem.setText(0, self.tr(chap_label)) ! self.app.processEvents() ! def int_finishScanning(self): ! print "* Finished scanning" ! self.b_ScanDVD.setText("Scan DVD") ! def int_startRipping(self): ! print "* Starting ripping" ! def int_newTrack(self, name, number, total, vbr): ! print "*\tRipping track '%s' (%s of %s) at %skbps" % (name, number, total, vbr) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def int_newPass(self, passtype): ! self.passtype = passtype ! if self.passtype is "video1": ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.passtype is "video2": ! self.Dialogue.pm_videoPass1.setProgress(100) ! def int_updateProgress(self, perc, trem, tpass): ! self.percentage = perc ! self.trem = trem ! self.tpass = tpass ! eta = "".join(["ETA: ", str(trem), " (approximately)"]) ! self.Dialogue.l_ETA.setText(eta) ! if self.tpass is "all": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "audio": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "video1": ! self.Dialogue.pm_videoPass1.setProgress(int(perc)) ! elif self.tpass is "video2": ! self.Dialogue.pm_videoPass2.setProgress(int(perc)) ! self.app.processEvents() ! def int_finishRipping(self): ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_videoPass1.setProgress(100) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_videoPass2.setProgress(100) ! print "* Ripping finished" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.l_ETA.setText("ETA: N/A") ! self.state = "stopped" ! os.chdir(self.cwd) ! def selectTrack(self, const, qpoint, col): ! """Select tracks to rip by setting column 2 to 'yes'""" ! # Check the mouse isn't clicking in blank space ! self.track = self.dvdTracks.selectedItem() ! try: ! checker = self.track.text(0) ! del checker ! except: ! return ! # Check if the user has clicked on a title or a chapter ! chap = re.compile('Chapter.*') ! if not chap.search(str(self.track.text(0))): ! # Stop short of tagging for ripping unless "Rip" column is selected ! if col is not 2: ! self.updateTrackDisplay(self.track) ! return ! if self.track.info['rip'] is "yes": ! self.track.setPixmap(2, self.image_blank) ! self.updateTrackRip(self.track, mode="remove") ! else: ! self.track.setPixmap(2, self.image_tick) ! self.updateTrackRip(self.track, mode="add") ! self.checkEnableRip() ! def updateTrackDisplay(self, track): ! self.track = track ! self.track.info['name'] = self.track.text(0) ! if abs(int(str(self.fileSize.cleanText())) - self.track.info['size']) > 1: ! self.fileSize.setValue(self.track.info['size']) ! if abs(self.audioBitRate.currentItem() - self.track.info['abr_id']) > 1: ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.track.info['abr'] = self.audioBitRate.currentText() ! if abs(int(str(self.videoBitRate.cleanText())) - self.track.info['vbr']) > 1: ! self.videoBitRate.setValue(self.track.info['vbr']) ! self.videoBitRateSlider.setValue(self.track.info['vbr']) ! def updateTrackRip(self, track, mode): ! """Update track's rip attribute""" ! if not len(self.tracks): ! return ! # Add/remove "rip" status to/from track ! self.mode = mode ! if self.mode is "remove": ! self.track.info['rip'] = "no" ! elif self.mode is "add": ! self.track.info['rip'] = "yes" ! self.updateTrackDisplay(self.track) ! def newFileSize(self, filesize): ! self.track = self.dvdTracks.selectedItem() ! self.filesize = int(str(self.fileSize.cleanText())) ! self.track.info['size'] = int(self.filesize) ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! #print "new file size, changing video bitrate to %s (size: %s, length %s, abr %s)" % (self.track.info['vbr'], self.track.info['size'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.bitrate = int(str(self.videoBitRate.cleanText())) ! self.track.info['vbr'] = self.bitrate ! self.track.info['size'] = self.calcFileSize(self.track.info['time'], self.track.info['abr'], self.track.info['vbr']) ! #print "new bitrate, changing file size to %s (vbr: %s, length %s, abr %s)" % (self.track.info['size'],self.track.info['vbr'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newAudioBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.audiobitrate = int(str(self.audioBitRate.currentText())) ! print self.audiobitrate ! self.track.info['abr'] = self.audiobitrate ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! self.updateTrackDisplay(self.track) ! def checkEnableRip(self): ! r = str(self.videoBitRate.cleanText()) ! o = str(self.outputDir.text()) ! t = 0 ! for track in self.tracks: ! if track['rip'] is "yes": ! t = 1 ! if len(r) > 0 and len(o) > 0 and t is 1: ! self.b_RipDVD.setEnabled(1) ! else: ! self.b_RipDVD.setEnabled(0) ! def renameTrack(self, item): ! """Set ViewListItem to be renamed""" ! self.item = item ! self.item.setRenameEnabled(0, 1) ! self.item.startRename(0) ! def browseHD(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.outputDir.setText(str(directory)) ! self.outdir = str(directory) ! self.checkEnableRip() ! def openRipDialogue(self): ! try: ! os.chdir(config.qr_dir) ! except OSError, msg: ! print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" ! #import output ! #print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 282, GUI.PY)") ! self.state = "stopped" ! self.Dialogue = dialogueProgress(self) ! self.Dialogue.connect(self.Dialogue.b_changeState,SIGNAL("clicked()"),self.changeState) ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! # Add in progress bars appropriate to number of passes ! l_audiopass = QHBoxLayout(None,0,6,"l_audiopass") ! self.Dialogue.textLabel3 = QLabel(self.Dialogue.groupBox3,"textlabel3") ! l_audiopass.addWidget(self.Dialogue.textLabel3) ! self.Dialogue.pm_audioPass = QProgressBar(self.Dialogue.groupBox3,"pm_audioPass") ! self.Dialogue.pm_audioPass.setMinimumSize(QSize(400,0)) ! l_audiopass.addWidget(self.Dialogue.pm_audioPass) ! self.Dialogue.groupBox3Layout.addLayout(l_audiopass,2,0) ! self.Dialogue.textLabel3.setText(self.tr("Progress:")) ! if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) ! if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) ! # if self.config['passes'] is 1: ! # from guiprogressdialogue_1pass import dialogProgress ! # elif self.config['passes'] is 2: ! # from guiprogressdialogue_2pass import dialogProgress ! # elif not self.config['passes'] or self.config['passes'] is 3: ! # from guiprogressdialogue_3pass import dialogProgress ! self.Dialogue.exec_loop() ! def changeState(self): ! """Switch dialogue between stopped and ripping, changing buttons ! and starting/stopping ripping process""" ! if self.state is "stopped": ! self.Dialogue.b_changeState.setText("Stop") ! self.Dialogue.b_closeProgressDialogue.setEnabled(0) ! os.chdir(self.outdir) ! self.volumead = str(self.volume.currentText()) ! self.aLanguage = str(self.aLang.currentText()) ! self.sLanguage = str(self.subTitles.currentText()) ! self.ripDVD() ! elif self.state is "ripping": ! print "* Ripping aborted" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! try: ! pid = self.pipe.pid ! os.kill(pid, 9) ! os.waitpid(pid, os.WNOHANG) ! except: ! pass ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! #elif self.config['passes'] == 0 or self.config['passes'] == 3: ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.state = "stopped" ! os.chdir(self.cwd) ! def openSettingsDialogue(self): ! """Open the settings dialogue box, connecting slots to functions""" ! self.Dialogue = dialogSettings(self) ! # Set-up defauls from config file ! self.Dialogue.mplayer.setText(self.config['mplayer']) ! self.Dialogue.mencoder.setText(self.config['mencoder']) ! self.Dialogue.tcprobe.setText(self.config['tcprobe']) ! self.Dialogue.dvdDevice.setText(self.config['dvd_device']) ! self.Dialogue.outputDir.setText(self.config['outputdir']) ! self.Dialogue.deInterlacing.setCurrentItem(int(self.config['deinterlacing'])) ! self.Dialogue.aspectRatio.setCurrentItem(int(self.config['aspectratio'])) ! self.Dialogue.encoderPasses.setCurrentItem(int(self.config['passes'])) ! self.Dialogue.videoCodec.setCurrentItem(int(self.config['videocodec'])) ! if self.config['pdamode'] == 1: ! self.Dialogue.c_pdamode.setChecked(1) ! # Connect functions ! self.connect(self.Dialogue.b_browseMPlayer,SIGNAL("clicked()"),self.browseMPlayer) ! self.connect(self.Dialogue.b_browseMencoder,SIGNAL("clicked()"),self.browseMencoder) ! self.connect(self.Dialogue.b_browseTcprobe,SIGNAL("clicked()"),self.browseTcprobe) ! self.connect(self.Dialogue.b_browseDVD,SIGNAL("clicked()"),self.browseDVD) ! self.connect(self.Dialogue.b_selectOutputDir,SIGNAL("clicked()"),self.selectOutDir) ! self.connect(self.Dialogue.b_OK,SIGNAL("clicked()"),self.changeSettings) ! self.connect(self.Dialogue.b_Save,SIGNAL("clicked()"),self.saveSettings) ! self.Dialogue.exec_loop() ! def browseMPlayer(self): ! """Launch file dialogue and set path to MPlayer""" ! self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to MPlayer") ! self.Dialogue.mplayer.setText(str(mplayer)) ! def browseMencoder(self): ! """Launch file dialogue and set path to Mencoder""" ! self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Mencoder") ! self.Dialogue.mencoder.setText(str(mencoder)) ! def browseTcprobe(self): ! """Launch file dialogue and set path to Tcprobe""" ! self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Tcprobe") ! self.Dialogue.tcprobe.setText(str(tcprobe)) ! def browseDVD(self): ! """Launch file dialogue and set path to dvd device""" ! try: ! self.path = re.compile('(/.*)/.*').search(self.config['dvd_device']).group(1) ! except: ! self.path = os.path.join("/", "dev", "dvd") ! dvd_device = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to DVD Device") ! self.Dialogue.dvdDevice.setText(str(dvd_device)) ! def selectOutDir(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.Dialogue.outputDir.setText(str(directory)) ! def changeSettings(self): ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.Dialogue.accept() ! def saveSettings(self): ! print "* Saving new settings to ~/.quickriprc" ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.parser.set('paths', 'mplayer', self.config['mplayer']) ! self.parser.set('paths', 'mencoder', self.config['mencoder']) ! self.parser.set('paths', 'tcprobe', self.config['tcprobe']) ! self.parser.set('paths', 'dvd_device', self.config['dvd_device']) ! self.parser.set('paths', 'outputdir', self.config['outputdir']) ! self.parser.set('mencoder', 'deinterlacing', self.config['deinterlacing']) ! self.parser.set('mencoder', 'aspectratio', self.config['aspectratio']) ! self.parser.set('mencoder', 'passes', self.config['passes']) ! self.parser.set('mencoder', 'pdamode', self.config['pdamode']) ! self.parser.set('mencoder', 'videocodec', self.config['videocodec']) ! self.parser.write(open(self.configfile, 'w')) def main(): ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! app = QApplication(sys.argv) ! QObject.connect(app, SIGNAL('lastWindowClosed()'), ! app, SLOT('quit()')) ! win = GUI(app) ! app.setMainWidget(win) ! win.show() ! app.exec_loop() |