You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(12) |
Jul
(42) |
Aug
(106) |
Sep
(2) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
|
Feb
|
Mar
(17) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(2) |
Aug
(2) |
Sep
|
Oct
(1) |
Nov
(2) |
Dec
(1) |
2007 |
Jan
(3) |
Feb
(3) |
Mar
|
Apr
(2) |
May
(10) |
Jun
(9) |
Jul
(20) |
Aug
(34) |
Sep
(29) |
Oct
(10) |
Nov
(9) |
Dec
(6) |
2008 |
Jan
(8) |
Feb
(15) |
Mar
(34) |
Apr
(20) |
May
(8) |
Jun
(16) |
Jul
(32) |
Aug
(14) |
Sep
(24) |
Oct
(14) |
Nov
(33) |
Dec
(69) |
2009 |
Jan
(123) |
Feb
(31) |
Mar
(54) |
Apr
(49) |
May
(116) |
Jun
(95) |
Jul
(68) |
Aug
(21) |
Sep
(20) |
Oct
(34) |
Nov
(9) |
Dec
(13) |
2010 |
Jan
(5) |
Feb
(6) |
Mar
(28) |
Apr
(47) |
May
(73) |
Jun
(74) |
Jul
(38) |
Aug
(45) |
Sep
(32) |
Oct
(1) |
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(2) |
Nov
|
Dec
|
2015 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <je...@us...> - 2003-08-08 00:37:59
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv8469 Modified Files: base.py Log Message: Changed int_* to ui_* Index: base.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/base.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** base.py 7 Aug 2003 19:01:54 -0000 1.8 --- base.py 8 Aug 2003 00:30:01 -0000 1.9 *************** *** 140,144 **** if os.path.isfile(os.path.join(path, program)): return os.path.join(path, program) ! self.int_configError(program) --- 140,144 ---- if os.path.isfile(os.path.join(path, program)): return os.path.join(path, program) ! self.ui_configError(program) *************** *** 203,207 **** def up_DVDInfo(self, line): if self.re_error.search(line): ! self.int_noTitles() elif self.re_title.search(line): self.numtitles = int(re_title.search(line).group(1)) --- 203,207 ---- def up_DVDInfo(self, line): if self.re_error.search(line): ! self.ui_noTitles() elif self.re_title.search(line): self.numtitles = int(re_title.search(line).group(1)) *************** *** 224,228 **** for line in self.run('tcprobe', arguments): if re_error.search(line): ! self.int_noTitles() return if re_time.search(line): --- 224,228 ---- for line in self.run('tcprobe', arguments): if re_error.search(line): ! self.ui_noTitles() return if re_time.search(line): *************** *** 250,254 **** def scanDVD(self): """Scan the DVD and build up a data structure for the titles""" ! self.int_startScanning() # Reset values to default (in case user scans two different discs in same session) --- 250,254 ---- def scanDVD(self): """Scan the DVD and build up a data structure for the titles""" ! self.ui_startScanning() # Reset values to default (in case user scans two different discs in same session) *************** *** 260,264 **** if self.numtitles is 0: return ! self.int_dispDVD(self.numtitles) for i in range(int(self.numtitles) + 1): --- 260,264 ---- if self.numtitles is 0: return ! self.ui_dispDVD(self.numtitles) for i in range(int(self.numtitles) + 1): *************** *** 288,299 **** self.titles.append(title) ! self.int_dispTitle(title) ! self.int_finishScanning() def ripDVD(self): """Rip the DVD titles based on gathered settings""" ! self.int_startRipping() self.state = "ripping" --- 288,299 ---- self.titles.append(title) ! self.ui_dispTitle(title) ! self.ui_finishScanning() def ripDVD(self): """Rip the DVD titles based on gathered settings""" ! self.ui_startRipping() self.state = "ripping" *************** *** 318,322 **** i = 0 for title in self.torip: ! self.int_newTitle(title['name'], i, self.numrips, title['vbr']) i = i + 1 --- 318,322 ---- i = 0 for title in self.torip: ! self.ui_newTitle(title['name'], i, self.numrips, title['vbr']) i = i + 1 *************** *** 367,376 **** perc = re_progress.search(line).group(1) trem = re_progress.search(line).group(2) ! self.int_updateProgress(perc, trem, passtype) def mp3Audio(self, title): """Rip the audio from a DVD title and encode as MP3""" ! self.int_newPass("mp3audio") try: --- 367,376 ---- perc = re_progress.search(line).group(1) trem = re_progress.search(line).group(2) ! self.ui_updateProgress(perc, trem, passtype) def mp3Audio(self, title): """Rip the audio from a DVD title and encode as MP3""" ! self.ui_newPass("mp3audio") try: *************** *** 400,404 **** def aviVideo(self, title, output, resolution, merge=1): """Rip the video from a DVD title, and optionally merge with audio""" ! self.int_newPass("video") if self.config['videocodec']: --- 400,404 ---- def aviVideo(self, title, output, resolution, merge=1): """Rip the video from a DVD title, and optionally merge with audio""" ! self.ui_newPass("video") if self.config['videocodec']: *************** *** 450,480 **** ## INHERIT THE CLASS AND SUBSTITUE THESE CLASS METHODS WITH YOUR ## OWN UI HOOKS ! def int_startScanning(self): pass ! def int_noTitles(self): pass ! def int_dispDVD(self, numtitles): pass ! def int_dispTitle(self, title): pass ! def int_finishScanning(self): pass ! def int_startRipping(self): pass ! def int_newTitle(self, name, number, total, vbr): pass ! def int_newPass(self, passtype): pass ! def int_updateProgress(self, perc, trem, tpass): pass ! def int_finishRipping(self): pass --- 450,480 ---- ## INHERIT THE CLASS AND SUBSTITUE THESE CLASS METHODS WITH YOUR ## OWN UI HOOKS ! def ui_startScanning(self): pass ! def ui_noTitles(self): pass ! def ui_dispDVD(self, numtitles): pass ! def ui_dispTitle(self, title): pass ! def ui_finishScanning(self): pass ! def ui_startRipping(self): pass ! def ui_newTitle(self, name, number, total, vbr): pass ! def ui_newPass(self, passtype): pass ! def ui_updateProgress(self, perc, trem, tpass): pass ! def ui_finishRipping(self): pass |
From: <je...@us...> - 2003-08-08 00:37:58
|
Update of /cvsroot/quickrip/quickrip/qt In directory sc8-pr-cvs1:/tmp/cvs-serv8469/qt Modified Files: qtmain.py Log Message: Changed int_* to ui_* Index: qtmain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/qt/qtmain.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** qtmain.py 7 Aug 2003 13:55:56 -0000 1.2 --- qtmain.py 8 Aug 2003 00:30:01 -0000 1.3 *************** *** 13,17 **** from base import * try: ! from qt import * except: print """ --- 13,18 ---- from base import * try: ! #from qt import * ! import qt except: print """ *************** *** 46,59 **** """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): --- 47,60 ---- """GUI-specific functions to add a Qt GUI to the DVD class: changeState() - start/stop the ripping process ! ui_startScanning() - notify user that the DVD is being scanned ! ui_noTracks() - notify user that no tracks were found ! ui_dispDVD() - display information about the DVD ! ui_dispTrack() - display information about scanned track ! ui_finishScanning() - notify user that scanning has finished ! ui_startRipping() - notify user that ripping has started ! ui_newTrack() - notify that ripping has begun on a new track ! ui_newPass() - notify that new ripping pass has begun ! ui_updateProgress() - update any ripping progress display being used ! ui_finishRipping() - notify user that ripping has finished""" def __init__(self, app, parent=None): *************** *** 73,88 **** 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" --- 74,89 ---- self.outdir = self.config['outputdir'] ! def ui_configError(self, bin): self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! qt.QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") sys.exit(2) ! def ui_startScanning(self): print "* Scanning DVD..." self.b_ScanDVD.setText("Scanning...") self.dvdTracks.clear() ! def ui_noTracks(self): ! qt.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" *************** *** 91,95 **** self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): #print "Found %s titles" % (self.numtitles) #print "Found audio languages %s" % (self.alangs) --- 92,96 ---- self.b_ScanDVD.setText("Scan DVD") ! def ui_dispDVD(self): #print "Found %s titles" % (self.numtitles) #print "Found audio languages %s" % (self.alangs) *************** *** 103,110 **** 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'])) --- 104,111 ---- self.subTitles.insertItem(lang, -1) ! def ui_dispTrack(self, track): self.track = track print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = qt.QListViewItem(self.dvdTracks,None) item.setText(0, self.track['name']) item.setText(1, str(self.track['timelabel'])) *************** *** 114,129 **** 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: --- 115,130 ---- if i < 10: i = "0" + str(i) chap_label = "Chapter %s" % (i) ! subitem = qt.QListViewItem(item,None) subitem.setText(0, self.tr(chap_label)) self.app.processEvents() ! def ui_finishScanning(self): print "* Finished scanning" self.b_ScanDVD.setText("Scan DVD") ! def ui_startRipping(self): print "* Starting ripping" ! def ui_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: *************** *** 138,142 **** 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": --- 139,143 ---- self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def ui_newPass(self, passtype): self.passtype = passtype if self.passtype is "video1": *************** *** 146,150 **** ! def int_updateProgress(self, perc, trem, tpass): self.percentage = perc self.trem = trem --- 147,151 ---- ! def ui_updateProgress(self, perc, trem, tpass): self.percentage = perc self.trem = trem *************** *** 162,166 **** self.app.processEvents() ! def int_finishRipping(self): if self.config['passes'] is 1: self.Dialogue.pm_audioPass.setProgress(100) --- 163,167 ---- self.app.processEvents() ! def ui_finishRipping(self): if self.config['passes'] is 1: self.Dialogue.pm_audioPass.setProgress(100) *************** *** 274,278 **** def browseHD(self): """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ self, \ "get existing directory", \ --- 275,279 ---- def browseHD(self): """Launch file dialogue and set output directory""" ! directory = qt.QFileDialog.getExistingDirectory(self.config['outputdir'], \ self, \ "get existing directory", \ *************** *** 299,306 **** # 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) --- 300,307 ---- # Add in progress bars appropriate to number of passes ! l_audiopass = qt.QHBoxLayout(None,0,6,"l_audiopass") ! self.Dialogue.textLabel3 = qt.QLabel(self.Dialogue.groupBox3,"textlabel3") l_audiopass.addWidget(self.Dialogue.textLabel3) ! self.Dialogue.pm_audioPass = qt.QProgressBar(self.Dialogue.groupBox3,"pm_audioPass") self.Dialogue.pm_audioPass.setMinimumSize(QSize(400,0)) l_audiopass.addWidget(self.Dialogue.pm_audioPass) *************** *** 309,316 **** 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) --- 310,317 ---- if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = qt.QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = qt.QLabel(self.Dialogue.groupBox3,"textlabel4") l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = qt.QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) l_videopass1.addWidget(self.Dialogue.pm_videoPass1) *************** *** 320,327 **** 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) --- 321,328 ---- if self.config['passes'] is 3: ! l_videopass2 = qt.QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = qt.QLabel(self.Dialogue.groupBox3,"textlabel5") l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = qt.QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) l_videopass2.addWidget(self.Dialogue.pm_videoPass2) *************** *** 407,411 **** """Launch file dialogue and set path to MPlayer""" self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = QFileDialog.getOpenFileName( self.path, \ "*", \ --- 408,412 ---- """Launch file dialogue and set path to MPlayer""" self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = qt.QFileDialog.getOpenFileName( self.path, \ "*", \ *************** *** 418,422 **** """Launch file dialogue and set path to Mencoder""" self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = QFileDialog.getOpenFileName( self.path, \ "*", \ --- 419,423 ---- """Launch file dialogue and set path to Mencoder""" self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = qt.QFileDialog.getOpenFileName( self.path, \ "*", \ *************** *** 429,433 **** """Launch file dialogue and set path to Tcprobe""" self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( self.path, \ "*", \ --- 430,434 ---- """Launch file dialogue and set path to Tcprobe""" self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = qt.QFileDialog.getOpenFileName( self.path, \ "*", \ *************** *** 443,447 **** except: self.path = os.path.join("/", "dev", "dvd") ! dvd_device = QFileDialog.getOpenFileName( self.path, \ "*", \ --- 444,448 ---- except: self.path = os.path.join("/", "dev", "dvd") ! dvd_device = qt.QFileDialog.getOpenFileName( self.path, \ "*", \ *************** *** 453,457 **** def selectOutDir(self): """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ self, \ "get existing directory", \ --- 454,458 ---- def selectOutDir(self): """Launch file dialogue and set output directory""" ! directory = qt.QFileDialog.getExistingDirectory(self.config['outputdir'], \ self, \ "get existing directory", \ *************** *** 506,511 **** 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) --- 507,512 ---- def main(): print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! app = qt.QApplication(sys.argv) ! qt.QObject.connect(app, SIGNAL('lastWindowClosed()'), app, SLOT('quit()')) win = GUI(app) |
From: <je...@us...> - 2003-08-08 00:37:57
|
Update of /cvsroot/quickrip/quickrip/cli In directory sc8-pr-cvs1:/tmp/cvs-serv8469/cli Modified Files: cli.py Log Message: Changed int_* to ui_* Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli/cli.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** cli.py 6 Aug 2003 16:18:02 -0000 1.3 --- cli.py 8 Aug 2003 00:30:01 -0000 1.4 *************** *** 96,100 **** ! def int_noTitles(self): self.TL.win.addstr(2, 1, "ERROR: No titles were found!", curses.A_STANDOUT) self.TL.win.refresh() --- 96,100 ---- ! def ui_noTitles(self): self.TL.win.addstr(2, 1, "ERROR: No titles were found!", curses.A_STANDOUT) self.TL.win.refresh() *************** *** 104,108 **** ! def int_dispDVD(self, numtitles): self.y = 1 self.TL.win.addstr(1, 1, "".join([str(numtitles), " titles found on this DVD"])) --- 104,108 ---- ! def ui_dispDVD(self, numtitles): self.y = 1 self.TL.win.addstr(1, 1, "".join([str(numtitles), " titles found on this DVD"])) *************** *** 110,114 **** ! def int_dispTitle(self, title): self.y = self.y + 1 self.TL.win.addstr(self.y, 1, "".join(["[ ] ", title['name'], " ", title['timelabel']])) --- 110,114 ---- ! def ui_dispTitle(self, title): self.y = self.y + 1 self.TL.win.addstr(self.y, 1, "".join(["[ ] ", title['name'], " ", title['timelabel']])) |
From: <je...@us...> - 2003-08-08 00:37:48
|
Update of /cvsroot/quickrip/quickrip/gtk In directory sc8-pr-cvs1:/tmp/cvs-serv8469/gtk Modified Files: gtkmain.py Log Message: Changed int_* to ui_* Index: gtkmain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkmain.py,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** gtkmain.py 7 Aug 2003 06:56:58 -0000 1.19 --- gtkmain.py 8 Aug 2003 00:30:01 -0000 1.20 *************** *** 360,374 **** ogmmerge = os.path.join(path, "ogmmerge") if not mplayer:# == "": ! self.int_configError("mplayer") if not mencoder:# == "": ! self.int_configError("mencoder") if not tcprobe:# == "": ! self.int_configError("tcprobe") if not ogmmerge:# == "": ! self.int_configError("ogmmerge") dvd_device = "/dev/dvd" if not os.path.isfile(dvd_device): ! self.int_configError("dvd_device") logfile = os.path.join(os.path.expanduser("~"), "quickrip.log") --- 360,374 ---- ogmmerge = os.path.join(path, "ogmmerge") if not mplayer:# == "": ! self.ui_configError("mplayer") if not mencoder:# == "": ! self.ui_configError("mencoder") if not tcprobe:# == "": ! self.ui_configError("tcprobe") if not ogmmerge:# == "": ! self.ui_configError("ogmmerge") dvd_device = "/dev/dvd" if not os.path.isfile(dvd_device): ! self.ui_configError("dvd_device") logfile = os.path.join(os.path.expanduser("~"), "quickrip.log") *************** *** 434,438 **** ################################# HOOKS ! def int_startScanning(self): print "start scanning backend" model = gtk.TreeStore( gobject.TYPE_STRING, #track title --- 434,438 ---- ################################# HOOKS ! def ui_startScanning(self): print "start scanning backend" model = gtk.TreeStore( gobject.TYPE_STRING, #track title *************** *** 447,460 **** self.modelIter = None ! def int_configError(self, config): msg = gtkerrorbox.GTKErrorBox("Error!", "Config couldn't autodetect: " + config) ! def int_noTitles(self): msg = gtkerrorbox.GTKErrorBox("Sorry!", "No DVD Video Titles were found!") ! def int_dispDVD(self, numtitles): print "Found %s titles" % (self.numtitles) ! def int_dispTitle(self, track): if self.modelIter == None: self.modelIter = self.model.insert_before(None, None) --- 447,460 ---- self.modelIter = None ! def ui_configError(self, config): msg = gtkerrorbox.GTKErrorBox("Error!", "Config couldn't autodetect: " + config) ! def ui_noTitles(self): msg = gtkerrorbox.GTKErrorBox("Sorry!", "No DVD Video Titles were found!") ! def ui_dispDVD(self, numtitles): print "Found %s titles" % (self.numtitles) ! def ui_dispTitle(self, track): if self.modelIter == None: self.modelIter = self.model.insert_before(None, None) *************** *** 484,488 **** self.updateSize() ! def int_finishScanning(self): print "finish scanning" self.showRip() --- 484,488 ---- self.updateSize() ! def ui_finishScanning(self): print "finish scanning" self.showRip() *************** *** 492,510 **** # print "title add " + str(i) ! def int_startRipping(self): self.hideScan() self.hideRip() ! def int_newTitle(self, name, number, total, vbr): print "new track" ! def int_newPass(self, passtype): print "new pass" ! def int_updateProgress(self, perc, trem, tpass): print "%s percent, %s remaining in %s" % (perc, trem, tpass) print "update progress" ! def int_finishRipping(self): print "finish ripping" self.showScan() --- 492,510 ---- # print "title add " + str(i) ! def ui_startRipping(self): self.hideScan() self.hideRip() ! def ui_newTitle(self, name, number, total, vbr): print "new track" ! def ui_newPass(self, passtype): print "new pass" ! def ui_updateProgress(self, perc, trem, tpass): print "%s percent, %s remaining in %s" % (perc, trem, tpass) print "update progress" ! def ui_finishRipping(self): print "finish ripping" self.showScan() |
From: <je...@us...> - 2003-08-07 19:08:26
|
Update of /cvsroot/quickrip/quickrip/qt/ui/images In directory sc8-pr-cvs1:/tmp/cvs-serv12385/qt/ui/images Added Files: quickrip.xpm Log Message: Added logo to images folder. --- NEW FILE: quickrip.xpm --- /* XPM */ static char *quickrip[] = { /* columns rows colors chars-per-pixel */ "16 16 42 1", " c #000000", ". c #0c0c0b", "X c #171614", "o c #191916", "O c #1d1d19", "+ c #24221f", "@ c #2a2925", "# c #34332d", "$ c #3e3c36", "% c #47453f", "& c #4b4942", "* c #545249", "= c #6c6a5f", "- c #6d6b60", "; c #767467", ": c #787669", "> c #7c7a6d", ", c #989485", "< c #a19e8d", "1 c #a4a191", "2 c #aba796", "3 c #ada897", "4 c #b7b2a0", "5 c #bbb8a4", "6 c #c2bdaa", "7 c #cecab5", "8 c #d0ccb7", "9 c #d2ceb8", "0 c #d6d1bc", "q c #d9d4be", "w c #dad6c0", "e c #ded9c3", "r c #e1ddc6", "t c #e4dfc8", "y c #e5e0c9", "u c #e9e4cc", "i c #ede9d0", "p c #f1ecd4", "a c #f9f4db", "s c #fef9df", "d c #fefce2", "f c None", /* pixels */ "ffffffffffffffff", "fffffff O&$ fff", "fffffffuuttt: f", "fff ffi8789r1 f", "ff :affi0er09t* ", "f ;tufffu@+2q06 ", " Xt9edfff r8uO", " =e8e* ffff e8u@", " ,q95 ffff @r9t.", " 1q94 ffff 8tq, ", " ;e8e@ dfffitO ", " oy90e34taffd% f", "f :t88989aff ff", "ff :urweu,ffffff", "fff o-,># fffff", "ffff fffffff" }; |
From: <je...@us...> - 2003-08-07 19:06:39
|
Update of /cvsroot/quickrip/quickrip/qt/ui In directory sc8-pr-cvs1:/tmp/cvs-serv12673 Added Files: quickrip.pro Log Message: Added designer project file. --- NEW FILE: quickrip.pro --- unix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj } FORMS = frmquickrip.ui IMAGES = images/filenew \ images/fileopen \ images/filesave \ images/print \ images/undo \ images/redo \ images/editcut \ images/editcopy \ images/editpaste \ images/searchfind \ images/cdrom_unmount.png \ images/ok.png TEMPLATE =app CONFIG += qt warn_on release LANGUAGE = C++ |
From: <je...@us...> - 2003-08-07 19:03:18
|
Update of /cvsroot/quickrip/quickrip/qt/ui/images In directory sc8-pr-cvs1:/tmp/cvs-serv12073/images Log Message: Directory /cvsroot/quickrip/quickrip/qt/ui/images added to the repository |
From: <te...@us...> - 2003-08-07 19:01:57
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv11451 Modified Files: base.py Log Message: Half-way to getting threading working. CommandThread() class and QuickRip.run() method look fine to me, but for some reason the getDVDInfo() method (and its associated update method beneath it) is failing to work with it. I'm stumped at the moment. N.B. None of the methods will work atm, I've just been using getDVDInfo() as a test. Index: base.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/base.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** base.py 7 Aug 2003 02:16:49 -0000 1.7 --- base.py 7 Aug 2003 19:01:54 -0000 1.8 *************** *** 19,26 **** class CommandThread(threading.Thread): """Handle threading of external commands""" ! def __init__(self, command, flushbuffer): threading.Thread.__init__(self) ! self.command = command self.flushbuffer = flushbuffer def run(self): --- 19,28 ---- class CommandThread(threading.Thread): """Handle threading of external commands""" ! def __init__(self, command, updatefunc, flushbuffer): threading.Thread.__init__(self) ! self.updateFunc = updatefunc self.flushbuffer = flushbuffer + self.command = command + def run(self): *************** *** 35,39 **** if not line: break ! yield line except: # For PyGtk... weird! --- 37,42 ---- if not line: break ! else: ! self.updateFunc(line) except: # For PyGtk... weird! *************** *** 50,53 **** --- 53,58 ---- pass + sys.exit(2) + def kill_pipe(self): *************** *** 61,64 **** --- 66,70 ---- + class QuickRip: """QuickRip base class, including the following methods: *************** *** 169,181 **** ! def run(self, program, arguments, flushbuffer=0): """Runs a program; supply program name (string) and arguments (list)""" command = arguments command[:0] = [self.config[program]] ! self.thread = CommandThread(command, flushbuffer) ! ! for line in self.thread.run(): ! yield line --- 175,185 ---- ! def run(self, program, arguments, updatefunc, flushbuffer=0): """Runs a program; supply program name (string) and arguments (list)""" command = arguments command[:0] = [self.config[program]] ! self.thread = CommandThread(command, updatefunc, flushbuffer) ! self.thread.start() *************** *** 192,209 **** """Find number of titles on DVD""" arguments = ['-vo', 'null', '-ao', 'null', '-v', 'dvd://', '-identify', '-quiet', '-nocache'] - numtitles = 0 - re_title = re.compile('There are (\d*) titles on this DVD') - re_error = re.compile('libdvdread: Could not open device') - for line in self.run('mplayer', arguments): - if re_error.search(line): - self.int_noTitles() - if re_title.search(line): - numtitles = int(re_title.search(line).group(1)) ! if not numtitles: self.int_noTitles() ! ! return numtitles --- 196,210 ---- """Find number of titles on DVD""" arguments = ['-vo', 'null', '-ao', 'null', '-v', 'dvd://', '-identify', '-quiet', '-nocache'] + self.re_title = re.compile('There are (\d*) titles on this DVD') + self.re_error = re.compile('libdvdread: Could not open device') + self.run('mplayer', arguments, self.up_DVDInfo) ! def up_DVDInfo(self, line): ! if self.re_error.search(line): self.int_noTitles() ! elif self.re_title.search(line): ! self.numtitles = int(re_title.search(line).group(1)) ! print "***GOT NUMTITLES***" *************** *** 255,259 **** self.numtitles = 0 ! self.numtitles = self.getDVDInfo() if self.numtitles is 0: return --- 256,261 ---- self.numtitles = 0 ! self.getDVDInfo() ! if self.numtitles is 0: return |
From: <je...@us...> - 2003-08-07 19:01:57
|
Update of /cvsroot/quickrip/quickrip/qt/ui In directory sc8-pr-cvs1:/tmp/cvs-serv11750 Added Files: frmquickrip.ui Log Message: Added designer file for qtmain --- NEW FILE: frmquickrip.ui --- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>frmQuickRip</class> <widget class="QMainWindow"> <property name="name"> <cstring>frmQuickRip</cstring> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>432</width> <height>422</height> </rect> </property> <property name="caption"> <string>QuickRip</string> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLayoutWidget" row="0" column="0"> <property name="name"> <cstring>layout6</cstring> </property> <vbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QListView"> <column> <property name="text"> <string>Title</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Length</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <property name="name"> <cstring>listView2</cstring> </property> </widget> <widget class="QFrame"> <property name="name"> <cstring>frame4</cstring> </property> <property name="frameShape"> <enum>StyledPanel</enum> </property> <property name="frameShadow"> <enum>Raised</enum> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>textLabel2</cstring> </property> <property name="text"> <string>&Language:</string> </property> <property name="buddy" stdset="0"> <cstring>comboBox5</cstring> </property> </widget> <widget class="QCheckBox" row="1" column="0"> <property name="name"> <cstring>checkBox1</cstring> </property> <property name="text"> <string>Subtitles:</string> </property> </widget> <widget class="Line" row="2" column="0" rowspan="1" colspan="3"> <property name="name"> <cstring>line1</cstring> </property> <property name="frameShape"> <enum>HLine</enum> </property> <property name="frameShadow"> <enum>Sunken</enum> </property> <property name="orientation"> <enum>Horizontal</enum> </property> </widget> <widget class="QLabel" row="3" column="0" rowspan="2" colspan="1"> <property name="name"> <cstring>textLabel3</cstring> </property> <property name="text"> <string>Video quality:</string> </property> </widget> <widget class="QLabel" row="5" column="0"> <property name="name"> <cstring>textLabel4</cstring> </property> <property name="text"> <string>Audio quality:</string> </property> </widget> <widget class="Line" row="6" column="0" rowspan="1" colspan="3"> <property name="name"> <cstring>line2</cstring> </property> <property name="frameShape"> <enum>HLine</enum> </property> <property name="frameShadow"> <enum>Sunken</enum> </property> <property name="orientation"> <enum>Horizontal</enum> </property> </widget> <widget class="QSpinBox" row="3" column="2" rowspan="2" colspan="1"> <property name="name"> <cstring>spinBox3</cstring> </property> <property name="acceptDrops"> <bool>false</bool> </property> <property name="suffix"> <string> kbps</string> </property> <property name="maxValue"> <number>2048</number> </property> <property name="minValue"> <number>64</number> </property> <property name="lineStep"> <number>2</number> </property> <property name="value"> <number>112</number> </property> </widget> <widget class="QComboBox" row="1" column="1" rowspan="1" colspan="2"> <property name="name"> <cstring>comboBox6</cstring> </property> <property name="enabled"> <bool>false</bool> </property> </widget> <widget class="QComboBox" row="0" column="1" rowspan="1" colspan="2"> <property name="name"> <cstring>comboBox5</cstring> </property> </widget> <widget class="QLayoutWidget" row="7" column="1"> <property name="name"> <cstring>layout4</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel"> <property name="name"> <cstring>textLabel10</cstring> </property> <property name="text"> <string>0</string> </property> <property name="alignment"> <set>AlignVCenter|AlignRight</set> </property> </widget> <widget class="QLabel"> <property name="name"> <cstring>textLabel11</cstring> </property> <property name="text"> <string>MB</string> </property> </widget> </hbox> </widget> <widget class="QLabel" row="7" column="0"> <property name="name"> <cstring>textLabel5</cstring> </property> <property name="text"> <string>Projected size:</string> </property> </widget> <widget class="Line" row="0" column="3" rowspan="8" colspan="1"> <property name="name"> <cstring>line3</cstring> </property> <property name="frameShape"> <enum>VLine</enum> </property> <property name="frameShadow"> <enum>Sunken</enum> </property> <property name="orientation"> <enum>Vertical</enum> </property> </widget> <widget class="QPushButton" row="6" column="4" rowspan="2" colspan="1"> <property name="name"> <cstring>pushButton6</cstring> </property> <property name="font"> <font> <bold>1</bold> </font> </property> <property name="text"> <string>&Rip DVD</string> </property> </widget> <widget class="QPushButton" row="0" column="4"> <property name="name"> <cstring>pushButton5</cstring> </property> <property name="font"> <font> <bold>1</bold> </font> </property> <property name="text"> <string>&Scan DVD</string> </property> </widget> <widget class="QSlider" row="5" column="1"> <property name="name"> <cstring>slider3</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>7</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="lineStep"> <number>32</number> </property> <property name="orientation"> <enum>Horizontal</enum> </property> </widget> <widget class="QSlider" row="4" column="1"> <property name="name"> <cstring>slider2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>7</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="lineStep"> <number>2</number> </property> <property name="orientation"> <enum>Horizontal</enum> </property> </widget> <widget class="QSpinBox" row="5" column="2"> <property name="name"> <cstring>spinBox4</cstring> </property> <property name="suffix"> <string> kbps</string> </property> <property name="maxValue"> <number>256</number> </property> <property name="minValue"> <number>64</number> </property> <property name="lineStep"> <number>32</number> </property> <property name="value"> <number>128</number> </property> </widget> </grid> </widget> </vbox> </widget> </grid> </widget> <menubar> <property name="name"> <cstring>menubar</cstring> </property> <item text="&File" name="fileMenu"> <separator/> <separator/> <action name="fileExitAction"/> </item> <item text="&Help" name="helpMenu"> <separator/> <action name="helpAboutAction"/> </item> </menubar> <toolbars> </toolbars> <actions> <action> <property name="name"> <cstring>fileExitAction</cstring> </property> <property name="text"> <string>Exit</string> </property> <property name="menuText"> <string>E&xit</string> </property> <property name="accel"> <string></string> </property> </action> <action> <property name="name"> <cstring>helpAboutAction</cstring> </property> <property name="text"> <string>About</string> </property> <property name="menuText"> <string>&About</string> </property> <property name="accel"> <string></string> </property> </action> </actions> <connections> <connection> <sender>fileExitAction</sender> <signal>activated()</signal> <receiver>frmQuickRip</receiver> <slot>fileExit()</slot> </connection> <connection> <sender>helpAboutAction</sender> <signal>activated()</signal> <receiver>frmQuickRip</receiver> <slot>helpAbout()</slot> </connection> <connection> <sender>checkBox1</sender> <signal>toggled(bool)</signal> <receiver>comboBox6</receiver> <slot>setEnabled(bool)</slot> </connection> <connection> <sender>slider2</sender> <signal>valueChanged(int)</signal> <receiver>spinBox3</receiver> <slot>setValue(int)</slot> </connection> <connection> <sender>slider3</sender> <signal>valueChanged(int)</signal> <receiver>spinBox4</receiver> <slot>setValue(int)</slot> </connection> <connection> <sender>spinBox3</sender> <signal>valueChanged(int)</signal> <receiver>slider2</receiver> <slot>setValue(int)</slot> </connection> <connection> <sender>spinBox4</sender> <signal>valueChanged(int)</signal> <receiver>slider3</receiver> <slot>setValue(int)</slot> </connection> </connections> <slots> <slot>fileNew()</slot> <slot>fileOpen()</slot> <slot>fileSave()</slot> <slot>fileSaveAs()</slot> <slot>filePrint()</slot> <slot>fileExit()</slot> <slot>helpIndex()</slot> <slot>helpContents()</slot> <slot>helpAbout()</slot> </slots> <pixmapinproject/> <layoutdefaults spacing="6" margin="11"/> </UI> |
From: <je...@us...> - 2003-08-07 13:56:00
|
Update of /cvsroot/quickrip/quickrip/qt In directory sc8-pr-cvs1:/tmp/cvs-serv15185/qt Modified Files: qtgui.py qtmain.py Log Message: Renamed files. Index: qtgui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/qt/qtgui.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** qtgui.py 5 Aug 2003 17:50:37 -0000 1.1 --- qtgui.py 7 Aug 2003 13:55:56 -0000 1.2 *************** *** 1,514 **** ! #!/usr/bin/env python ! """ ! gui.py - GUI specific functions for QuickRip - copyright: (C) 2003, Tom Chance - license: GNU General Public License (GPL) (see LICENSE file) - web: http://quickrip.sf.net - email: tom...@gm... - """ [...2150 lines suppressed...] ! def renameTrack(self): ! print "MainWindow.renameTrack(): Not implemented yet" ! ! def openSettingsDialogue(self): ! print "MainWindow.openSettingsDialogue(): Not implemented yet" ! ! def browseHD(self): ! print "MainWindow.browseHD(): Not implemented yet" ! ! def newBitrate(self): ! print "MainWindow.newBitrate(): Not implemented yet" ! ! def newFileSize(self): ! print "MainWindow.newFileSize(): Not implemented yet" ! ! def newAudioBitrate(self): ! print "MainWindow.newAudioBitrate(): Not implemented yet" ! ! def openRipDialogue(self): ! print "MainWindow.openRipDialogue(): Not implemented yet" Index: qtmain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/qt/qtmain.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** qtmain.py 5 Aug 2003 17:50:37 -0000 1.1 --- qtmain.py 7 Aug 2003 13:55:56 -0000 1.2 *************** *** 1,1665 **** ! # -*- coding: utf-8 -*- ! ! # Form implementation generated from reading ui file 'guimain.ui' ! # ! # Created: jeu jui 31 14:08:59 2003 ! # by: The PyQt User Interface Compiler (pyuic) 3.6 ! # ! # WARNING! All changes made in this file will be lost! ! ! [...2150 lines suppressed...] ! 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() |
From: <je...@us...> - 2003-08-07 13:29:45
|
Update of /cvsroot/quickrip/quickrip/gtk/glade In directory sc8-pr-cvs1:/tmp/cvs-serv10235/gtk/glade Modified Files: gtkmain.glade Log Message: Added kbd shortcuts. Index: gtkmain.glade =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/glade/gtkmain.glade,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** gtkmain.glade 6 Aug 2003 08:33:58 -0000 1.8 --- gtkmain.glade 7 Aug 2003 13:29:40 -0000 1.9 *************** *** 3,6 **** --- 3,7 ---- <glade-interface> + <requires lib="gnome"/> <widget class="GtkWindow" id="window"> *************** *** 42,48 **** <property name="use_underline">True</property> <signal name="activate" handler="on_scan_activate" last_modification_time="Mon, 04 Aug 2003 00:12:23 GMT"/> <child internal-child="image"> ! <widget class="GtkImage" id="image22"> <property name="visible">True</property> <property name="stock">gtk-index</property> --- 43,50 ---- <property name="use_underline">True</property> <signal name="activate" handler="on_scan_activate" last_modification_time="Mon, 04 Aug 2003 00:12:23 GMT"/> + <accelerator key="s" modifiers="GDK_CONTROL_MASK" signal="activate"/> <child internal-child="image"> ! <widget class="GtkImage" id="image37"> <property name="visible">True</property> <property name="stock">gtk-index</property> *************** *** 63,69 **** <property name="use_underline">True</property> <signal name="activate" handler="on_rip_activate" last_modification_time="Mon, 04 Aug 2003 00:13:09 GMT"/> <child internal-child="image"> ! <widget class="GtkImage" id="image23"> <property name="visible">True</property> <property name="stock">gtk-cdrom</property> --- 65,72 ---- <property name="use_underline">True</property> <signal name="activate" handler="on_rip_activate" last_modification_time="Mon, 04 Aug 2003 00:13:09 GMT"/> + <accelerator key="r" modifiers="GDK_CONTROL_MASK" signal="activate"/> <child internal-child="image"> ! <widget class="GtkImage" id="image38"> <property name="visible">True</property> <property name="stock">gtk-cdrom</property> *************** *** 90,96 **** <property name="use_underline">True</property> <signal name="activate" handler="on_quit_activate" last_modification_time="Mon, 04 Aug 2003 00:48:22 GMT"/> <child internal-child="image"> ! <widget class="GtkImage" id="image24"> <property name="visible">True</property> <property name="stock">gtk-quit</property> --- 93,100 ---- <property name="use_underline">True</property> <signal name="activate" handler="on_quit_activate" last_modification_time="Mon, 04 Aug 2003 00:48:22 GMT"/> + <accelerator key="q" modifiers="GDK_CONTROL_MASK" signal="activate"/> <child internal-child="image"> ! <widget class="GtkImage" id="image39"> <property name="visible">True</property> <property name="stock">gtk-quit</property> *************** *** 126,130 **** <child internal-child="image"> ! <widget class="GtkImage" id="image25"> <property name="visible">True</property> <property name="stock">gtk-preferences</property> --- 130,134 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image40"> <property name="visible">True</property> <property name="stock">gtk-preferences</property> *************** *** 160,164 **** <child internal-child="image"> ! <widget class="GtkImage" id="image26"> <property name="visible">True</property> <property name="stock">gtk-help</property> --- 164,168 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image41"> <property name="visible">True</property> <property name="stock">gtk-help</property> *************** *** 511,515 **** <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> <property name="inverted">False</property> ! <property name="adjustment">112 64 2048 2 16 16</property> <signal name="value_changed" handler="on_video_moved" after="yes" last_modification_time="Wed, 06 Aug 2003 04:28:10 GMT"/> </widget> --- 515,519 ---- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> <property name="inverted">False</property> ! <property name="adjustment">241.443 64 2048 2 16 16</property> <signal name="value_changed" handler="on_video_moved" after="yes" last_modification_time="Wed, 06 Aug 2003 04:28:10 GMT"/> </widget> *************** *** 721,725 **** <widget class="GtkLabel" id="label41"> <property name="visible">True</property> ! <property name="label" translatable="yes">Scan</property> <property name="use_underline">True</property> <property name="use_markup">False</property> --- 725,729 ---- <widget class="GtkLabel" id="label41"> <property name="visible">True</property> ! <property name="label" translatable="yes">_Scan</property> <property name="use_underline">True</property> <property name="use_markup">False</property> *************** *** 788,792 **** <widget class="GtkLabel" id="label42"> <property name="visible">True</property> ! <property name="label" translatable="yes">Rip</property> <property name="use_underline">True</property> <property name="use_markup">False</property> --- 792,796 ---- <widget class="GtkLabel" id="label42"> <property name="visible">True</property> ! <property name="label" translatable="yes">_Rip</property> <property name="use_underline">True</property> <property name="use_markup">False</property> |
From: <iwa...@us...> - 2003-08-07 06:57:02
|
Update of /cvsroot/quickrip/quickrip/gtk In directory sc8-pr-cvs1:/tmp/cvs-serv9275 Modified Files: gtkmain.py gtkprogress.py gtksettings.py Log Message: Touch ups to gtk stuff. Index: gtkmain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkmain.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** gtkmain.py 6 Aug 2003 16:18:02 -0000 1.18 --- gtkmain.py 7 Aug 2003 06:56:58 -0000 1.19 *************** *** 11,20 **** pygtk.require("2.0") import gtk, gobject - # import gnome.ui - import gtksettings, gtkprogress - from gtksettings import * - from gtkprogress import * import gtk.glade ! #gnome.init("quickrip", "1.0") except: print "Couldn't load some required modules!" --- 11,16 ---- pygtk.require("2.0") import gtk, gobject import gtk.glade ! import ConfigParser except: print "Couldn't load some required modules!" *************** *** 28,42 **** pygtk.require("2.0") import gtk, gobject - # import gnome.ui - import gtksettings, gtkprogress - from gtksettings import * - from gtkprogress import * import gtk.glade ! #gnome.init("quickrip", "1.0") ! from base import * import config import gtkerrorbox - from gtkerrorbox import * __app__ = config.app --- 24,35 ---- pygtk.require("2.0") import gtk, gobject import gtk.glade ! import ConfigParser ! import base ! import gtksettings ! import gtkprogress import config import gtkerrorbox __app__ = config.app *************** *** 48,52 **** ! class GTKMain(QuickRip): def rip(self, widget, data=None): print "Rip" --- 41,45 ---- ! class GTKMain(base.QuickRip): def rip(self, widget, data=None): print "Rip" *************** *** 74,78 **** def about(self, widget, data=None): ! box = GTKErrorBox("About Quickrip", "A quick dvd ripper.\nSee the homepage at quickrip.sf.net.\nVersion " + config.version) --- 67,71 ---- def about(self, widget, data=None): ! box = gtkerrorbox.GTKErrorBox("About Quickrip", "A quick dvd ripper.\nSee the homepage at quickrip.sf.net.\nVersion " + config.version) *************** *** 170,177 **** def slideVideo(self, widget, data=None): self.lVideo.set_text(str(int(widget.get_adjustment().value))) ! track = self.model.get_value(self.modelIter, 5) ! adj = widget.get_adjustment() ! track['vbr'] = int(adj.value) ! self.updateSize() def slideAudio(self, widget, data=None): --- 163,173 ---- def slideVideo(self, widget, data=None): self.lVideo.set_text(str(int(widget.get_adjustment().value))) ! try: ! track = self.model.get_value(self.modelIter, 5) ! adj = widget.get_adjustment() ! track['vbr'] = int(adj.value) ! self.updateSize() ! except: ! return # dvd not scanned yet def slideAudio(self, widget, data=None): *************** *** 184,190 **** ival = (ival + 32) - (ival % 32) self.lAudio.set_text(str(ival)) ! track = self.model.get_value(self.modelIter, 5) ! track['abr'] = ival ! self.updateSize() def languageSelect(self, widget, data=None): --- 180,189 ---- ival = (ival + 32) - (ival % 32) self.lAudio.set_text(str(ival)) ! try: ! track = self.model.get_value(self.modelIter, 5) ! track['abr'] = ival ! self.updateSize() ! except: ! return #dvd not scanned yet def languageSelect(self, widget, data=None): *************** *** 211,219 **** track['slang'] = short return def __init__(self): self.oldtrack = None gtk.threads_init() ! xml = gtk.glade.XML('gtk/glade/gtkmain.glade') self.window = xml.get_widget('window') self.buttonScan = xml.get_widget('buttonScan') --- 210,230 ---- track['slang'] = short return + + def loadGladeFile(self, title): + try: + xml = gtk.glade.XML("glade/" + title + ".glade") + except: + try: + xml = gtk.glade.XML("gtk/glade/" + title + ".glade") + except: + gtkerrorbox.GTKErrorBox("Error!", "Couldn't load " + title + + ".glade file") + self.quit() + return xml def __init__(self): self.oldtrack = None gtk.threads_init() ! xml = self.loadGladeFile("gtkmain") self.window = xml.get_widget('window') self.buttonScan = xml.get_widget('buttonScan') *************** *** 245,250 **** self.initTree() ! self.dialogSettings = GTKSettings(self) ! self.dialogProgress = GTKProgress() self.window.show_all() --- 256,261 ---- self.initTree() ! self.dialogSettings = gtksettings.GTKSettings(self) ! self.dialogProgress = gtkprogress.GTKProgress() self.window.show_all() *************** *** 437,444 **** def int_configError(self, config): ! msg = GTKErrorBox("Error!", "Config couldn't autodetect: " + config) def int_noTitles(self): ! msg = GTKErrorBox("Sorry!", "No DVD Video Titles were found!") def int_dispDVD(self, numtitles): --- 448,455 ---- def int_configError(self, config): ! msg = gtkerrorbox.GTKErrorBox("Error!", "Config couldn't autodetect: " + config) def int_noTitles(self): ! msg = gtkerrorbox.GTKErrorBox("Sorry!", "No DVD Video Titles were found!") def int_dispDVD(self, numtitles): *************** *** 506,508 **** def main(): app = GTKMain() ! app.main() \ No newline at end of file --- 517,519 ---- def main(): app = GTKMain() ! app.main() Index: gtkprogress.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkprogress.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** gtkprogress.py 6 Aug 2003 16:18:02 -0000 1.6 --- gtkprogress.py 7 Aug 2003 06:56:58 -0000 1.7 *************** *** 30,44 **** import gtk.glade ! from gtkerrorbox import * class GTKProgress: def quit(self, widget, data=None): ! error = GTKErrorBox("Warning!", "Are you sure you want to stop the current task?") self.window.hide() return gtk.TRUE ! def __init__(self): ! xml = gtk.glade.XML('gtk/glade/gtkprogress.glade') self.window = xml.get_widget('window') --- 30,56 ---- import gtk.glade ! import gtkerrorbox class GTKProgress: def quit(self, widget, data=None): ! error = gtkerrorbox.GTKErrorBox("Warning!", "Are you sure you want to stop the current task?") self.window.hide() return gtk.TRUE ! ! def loadGladeFile(self, title): ! try: ! xml = gtk.glade.XML("glade/" + title + ".glade") ! except: ! try: ! xml = gtk.glade.XML("gtk/glade/" + title + ".glade") ! except: ! gtkerrorbox.GTKErrorBox("Error!", "Couldn't load " + title + ! ".glade file") ! self.quit() ! return xml ! def __init__(self): ! xml = self.loadGladeFile('gtkprogress') self.window = xml.get_widget('window') Index: gtksettings.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtksettings.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** gtksettings.py 6 Aug 2003 16:18:02 -0000 1.11 --- gtksettings.py 7 Aug 2003 06:56:58 -0000 1.12 *************** *** 18,22 **** import gtk import gtk.glade ! from time import * except: print "Couldn't load PyGTK module! Check it's installed properly." --- 18,22 ---- import gtk import gtk.glade ! import time except: print "Couldn't load PyGTK module! Check it's installed properly." *************** *** 35,39 **** import gtkerrorbox - from gtkerrorbox import * class GTKSettings: --- 35,38 ---- *************** *** 113,118 **** self.findGeneric("Location of OGMMerge", self.wteOgmmerge) def __init__(self, parent): ! xml = gtk.glade.XML('gtk/glade/gtksettings.glade') self.parent = parent self.window = xml.get_widget('window') --- 112,129 ---- self.findGeneric("Location of OGMMerge", self.wteOgmmerge) + def loadGladeFile(self, title): + try: + xml = gtk.glade.XML("glade/" + title + ".glade") + except: + try: + xml = gtk.glade.XML("gtk/glade/" + title + ".glade") + except: + gtkerrorbox.GTKErrorBox("Error!", "Couldn't load " + title + + ".glade file") + self.quit() + return xml + def __init__(self, parent): ! xml = self.loadGladeFile('gtksettings') self.parent = parent self.window = xml.get_widget('window') |
From: <je...@us...> - 2003-08-07 02:16:52
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv4341 Modified Files: base.py config.py Log Message: Set date to 7 Aug 2003... :-P Very minor (aesthetical?) changes to base.py Index: base.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/base.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** base.py 7 Aug 2003 02:00:28 -0000 1.6 --- base.py 7 Aug 2003 02:16:49 -0000 1.7 *************** *** 234,243 **** alang = re_alang.search(line).group(1) alang_full = config.langs[alang] ! if alang != "xx": alangs.append([alang, alang_full]) if re_slang.search(line): slang = re_slang.search(line).group(1) slang_full = config.langs[slang] ! if slang != "xx": slangs.append([slang, slang_full]) if re_chap.search(line): --- 234,243 ---- alang = re_alang.search(line).group(1) alang_full = config.langs[alang] ! if alang is not "xx": alangs.append([alang, alang_full]) if re_slang.search(line): slang = re_slang.search(line).group(1) slang_full = config.langs[slang] ! if slang is not "xx": slangs.append([slang, slang_full]) if re_chap.search(line): *************** *** 304,316 **** self.torip = [] for title in self.titles: ! if title['rip'] == 'yes': self.torip.append(title) self.numrips = len(self.torip) # Check PDA mode (universal to all ripping methods) ! if int(self.config['pdamode']) is 0: ! resolution = "720" ! else: resolution = "320" i = 0 --- 304,316 ---- self.torip = [] for title in self.titles: ! if title['rip'] is 'yes': self.torip.append(title) self.numrips = len(self.torip) # Check PDA mode (universal to all ripping methods) ! if int(self.config['pdamode']) is 1: resolution = "320" + else: + resolution = "720" i = 0 Index: config.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/config.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** config.py 6 Aug 2003 01:36:05 -0000 1.12 --- config.py 7 Aug 2003 02:16:49 -0000 1.13 *************** *** 15,19 **** author = "Tom Chance <tom...@gm...>" version = "0.9-cvs" ! date = "2003-08-05" copyright = "(C) 2003 Tom Chance" license = "GNU General Public License (GPL) (see LICENSE file)" --- 15,19 ---- author = "Tom Chance <tom...@gm...>" version = "0.9-cvs" ! date = "2003-08-07" copyright = "(C) 2003 Tom Chance" license = "GNU General Public License (GPL) (see LICENSE file)" *************** *** 53,55 **** "vo": "Volapuk", "wo": "Wolof", "xh": "Xhosa", "yi": "Yiddish", "yo": "Yoruba", "za": "Zhuang", \ "zh": "Chinese", "zu": "Zulu" \ ! } \ No newline at end of file --- 53,55 ---- "vo": "Volapuk", "wo": "Wolof", "xh": "Xhosa", "yi": "Yiddish", "yo": "Yoruba", "za": "Zhuang", \ "zh": "Chinese", "zu": "Zulu" \ ! } |
From: <je...@us...> - 2003-08-07 02:00:32
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv2065 Modified Files: base.py Log Message: Changed from threading import * to import threading Index: base.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/base.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** base.py 6 Aug 2003 12:22:15 -0000 1.5 --- base.py 7 Aug 2003 02:00:28 -0000 1.6 *************** *** 11,15 **** from __future__ import generators ! from threading import * from time import sleep import sys, os, re, popen2, ConfigParser, copy --- 11,15 ---- from __future__ import generators ! import threading from time import sleep import sys, os, re, popen2, ConfigParser, copy *************** *** 17,24 **** ! class CommandThread(Thread): """Handle threading of external commands""" def __init__(self, command, flushbuffer): ! Thread.__init__(self) self.command = command self.flushbuffer = flushbuffer --- 17,24 ---- ! class CommandThread(threading.Thread): """Handle threading of external commands""" def __init__(self, command, flushbuffer): ! threading.Thread.__init__(self) self.command = command self.flushbuffer = flushbuffer |
From: <te...@us...> - 2003-08-06 16:50:33
|
Update of /cvsroot/quickrip/quickrip/gtk In directory sc8-pr-cvs1:/tmp/cvs-serv26040/gtk Modified Files: gtkmain.py gtkprogress.py gtksettings.py Log Message: More minor CLI changes; Gtk files changed here and there to make them work properly with quickrip, so you can do: ./quickrip.py -g And launch the Gtk UI. Also fixed little bits of code to work with the info scanDVD sends back. Index: gtkmain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkmain.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** gtkmain.py 6 Aug 2003 15:04:52 -0000 1.17 --- gtkmain.py 6 Aug 2003 16:18:02 -0000 1.18 *************** *** 35,45 **** #gnome.init("quickrip", "1.0") - import base from base import * import config import gtkerrorbox from gtkerrorbox import * - import commandthread - from commandthread import * __app__ = config.app --- 35,42 ---- *************** *** 218,222 **** self.oldtrack = None gtk.threads_init() ! xml = gtk.glade.XML('glade/gtkmain.glade') self.window = xml.get_widget('window') self.buttonScan = xml.get_widget('buttonScan') --- 215,219 ---- self.oldtrack = None gtk.threads_init() ! xml = gtk.glade.XML('gtk/glade/gtkmain.glade') self.window = xml.get_widget('window') self.buttonScan = xml.get_widget('buttonScan') *************** *** 445,452 **** msg = GTKErrorBox("Sorry!", "No DVD Video Titles were found!") ! def int_dispDVD(self): print "Found %s titles" % (self.numtitles) - print "Found audio languages %s" % (self.alangs) - print "Found subtitle languages %s" % (self.slangs) def int_dispTitle(self, track): --- 442,447 ---- msg = GTKErrorBox("Sorry!", "No DVD Video Titles were found!") ! def int_dispDVD(self, numtitles): print "Found %s titles" % (self.numtitles) def int_dispTitle(self, track): *************** *** 508,509 **** --- 503,508 ---- app = GTKMain() app.main() + + def main(): + app = GTKMain() + app.main() \ No newline at end of file Index: gtkprogress.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkprogress.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** gtkprogress.py 6 Aug 2003 10:58:40 -0000 1.5 --- gtkprogress.py 6 Aug 2003 16:18:02 -0000 1.6 *************** *** 40,44 **** def __init__(self): ! xml = gtk.glade.XML('glade/gtkprogress.glade') self.window = xml.get_widget('window') --- 40,44 ---- def __init__(self): ! xml = gtk.glade.XML('gtk/glade/gtkprogress.glade') self.window = xml.get_widget('window') Index: gtksettings.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtksettings.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** gtksettings.py 6 Aug 2003 10:58:40 -0000 1.10 --- gtksettings.py 6 Aug 2003 16:18:02 -0000 1.11 *************** *** 114,118 **** def __init__(self, parent): ! xml = gtk.glade.XML('glade/gtksettings.glade') self.parent = parent self.window = xml.get_widget('window') --- 114,118 ---- def __init__(self, parent): ! xml = gtk.glade.XML('gtk/glade/gtksettings.glade') self.parent = parent self.window = xml.get_widget('window') |
From: <te...@us...> - 2003-08-06 16:50:33
|
Update of /cvsroot/quickrip/quickrip/cli In directory sc8-pr-cvs1:/tmp/cvs-serv26040/cli Modified Files: cli.py ncurses.py Log Message: More minor CLI changes; Gtk files changed here and there to make them work properly with quickrip, so you can do: ./quickrip.py -g And launch the Gtk UI. Also fixed little bits of code to work with the info scanDVD sends back. Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli/cli.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** cli.py 6 Aug 2003 12:22:15 -0000 1.2 --- cli.py 6 Aug 2003 16:18:02 -0000 1.3 *************** *** 49,54 **** choice = self.stdscr.getch() ! if chr(choice) in 'qQ': ! sys.exit(2) self.handleInput(choice) --- 49,61 ---- choice = self.stdscr.getch() ! if 0<choice<256: ! if chr(choice) in 'qQ': ! sys.exit(2) ! ! elif self.mode == 'titlelist': ! if choice == curses.KEY_UP: ! self.TL.move_pointer("up") ! elif choice == curses.KEY_DOWN: ! self.TL.move_pointer("down") self.handleInput(choice) *************** *** 72,76 **** def front(self): self.draw_screen() ! self.TL = ncurses.TitleList(self.stdscr, SCREEN_WIDTH, SCREEN_HEIGHT) self.TL.win.addstr(0,2,"Hit ENTER to scan the DVD",curses.A_BOLD) self.TL.win.refresh() --- 79,83 ---- def front(self): self.draw_screen() ! self.TL = ncurses.TitleList(self, SCREEN_WIDTH, SCREEN_HEIGHT) self.TL.win.addstr(0,2,"Hit ENTER to scan the DVD",curses.A_BOLD) self.TL.win.refresh() *************** *** 83,93 **** self.TL.win.refresh() self.scanDVD() ! #i = 2 ! #for title in self.titles: ! # i = i + 1 ! # self.stdscr.addstr(i,0,"".join(["* Title ", str(title['id']), ", ", title['timelabel']])) ! # self.stdscr.refresh() ! #self.stdscr.move(self.pointer['y'], self.pointer['x']) ! --- 90,97 ---- self.TL.win.refresh() self.scanDVD() ! self.TL.win.addstr(0,2,"Select titles to rip",curses.A_BOLD) ! self.TL.win.move(2, 2) ! self.TL.win.refresh() ! return 1 *************** *** 113,115 **** def main(): ! cli = Main() \ No newline at end of file --- 117,119 ---- def main(): ! cli = Main() Index: ncurses.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli/ncurses.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ncurses.py 6 Aug 2003 12:22:15 -0000 1.2 --- ncurses.py 6 Aug 2003 16:18:02 -0000 1.3 *************** *** 18,26 **** class TitleList: """Handle the list of DVD titles in a window""" ! def __init__(self, mainwindow, SCREEN_WIDTH, SCREEN_HEIGHT): height = SCREEN_HEIGHT - 10 width = SCREEN_WIDTH - 4 self.win = curses.newwin(height, width, 2, 2) self.display() --- 18,30 ---- class TitleList: """Handle the list of DVD titles in a window""" ! def __init__(self, parent, SCREEN_WIDTH, SCREEN_HEIGHT): height = SCREEN_HEIGHT - 10 width = SCREEN_WIDTH - 4 + self.parent = parent self.win = curses.newwin(height, width, 2, 2) self.display() + self.pointer = {} + self.pointer['x'] = 2 + self.pointer['y'] = 2 *************** *** 31,32 **** --- 35,47 ---- self.win.idlok(1) self.win.refresh() + + + def move_pointer(self, mode): + if mode == 'up': + if (self.pointer['y'] - 1) >= 2: + self.pointer['y'] = self.pointer['y'] - 1 + else: + if (self.pointer['y'] + 1) <= self.parent.y: + self.pointer['y'] = self.pointer['y'] + 1 + self.win.move(self.pointer['y'],self.pointer['x']) + self.win.refresh() \ No newline at end of file |
From: <je...@us...> - 2003-08-06 16:04:11
|
Update of /cvsroot/quickrip/quickrip/ui In directory sc8-pr-cvs1:/tmp/cvs-serv23231 Removed Files: guimain.ui guiprogressdialogue.ui guisettings.ui Log Message: Moved *.ui to qt/ui --- guimain.ui DELETED --- --- guiprogressdialogue.ui DELETED --- --- guisettings.ui DELETED --- |
From: <je...@us...> - 2003-08-06 15:59:28
|
Update of /cvsroot/quickrip/quickrip/qt/ui In directory sc8-pr-cvs1:/tmp/cvs-serv21917/qt/ui Added Files: guimain.ui guiprogressdialogue.ui guisettings.ui Log Message: Moved ui/ into qt/. --- NEW FILE: guimain.ui --- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>MainWindow</class> <widget class="QMainWindow"> <property name="name"> <cstring>MainWindow</cstring> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>507</width> <height>562</height> </rect> </property> <property name="caption"> <string>QuickRip</string> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>logo</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="frameShape"> <enum>StyledPanel</enum> </property> <property name="frameShadow"> <enum>Plain</enum> </property> <property name="pixmap"> <pixmap>image0</pixmap> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> <widget class="QListView" row="1" column="0" rowspan="1" colspan="2"> <column> <property name="text"> <string>Track</string> </property> <property name="clickable"> <bool>false</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Length</string> </property> <property name="clickable"> <bool>false</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Rip</string> </property> <property name="clickable"> <bool>false</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <property name="name"> <cstring>dvdTracks</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>5</hsizetype> <vsizetype>7</vsizetype> <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="cursor"> <cursor>13</cursor> </property> <property name="focusPolicy"> <enum>TabFocus</enum> </property> <property name="resizePolicy"> <enum>Manual</enum> </property> <property name="vScrollBarMode"> <enum>Auto</enum> </property> <property name="selectionMode"> <enum>Single</enum> </property> <property name="allColumnsShowFocus"> <bool>true</bool> </property> <property name="rootIsDecorated"> <bool>true</bool> </property> <property name="resizeMode"> <enum>AllColumns</enum> </property> <property name="defaultRenameAction"> <enum>Accept</enum> </property> <property name="toolTip" stdset="0"> <string>Click on tracks to select them for ripping</string> </property> </widget> <widget class="QGroupBox" row="3" column="0" rowspan="1" colspan="2"> <property name="name"> <cstring>groupBox3</cstring> </property> <property name="title"> <string>File S&ettings</string> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel" row="1" column="0"> <property name="name"> <cstring>textLabel1_4_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>5</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Output &file:</string> </property> <property name="buddy" stdset="0"> <cstring>outputDir</cstring> </property> </widget> <widget class="QPushButton" row="1" column="4" rowspan="1" colspan="2"> <property name="name"> <cstring>b_Browse</cstring> </property> <property name="text"> <string>&Browse</string> </property> <property name="accel"> <string>Alt+B</string> </property> </widget> <widget class="QComboBox" row="0" column="5"> <item> <property name="text"> <string>10</string> </property> </item> <item> <property name="text"> <string>9</string> </property> </item> <item> <property name="text"> <string>8</string> </property> </item> <item> <property name="text"> <string>7</string> </property> </item> <item> <property name="text"> <string>6</string> </property> </item> <item> <property name="text"> <string>5</string> </property> </item> <item> <property name="text"> <string>4</string> </property> </item> <item> <property name="text"> <string>3</string> </property> </item> <item> <property name="text"> <string>2</string> </property> </item> <item> <property name="text"> <string>1</string> </property> </item> <item> <property name="text"> <string>0</string> </property> </item> <property name="name"> <cstring>volume</cstring> </property> <property name="currentItem"> <number>10</number> </property> <property name="toolTip" stdset="0"> <string>Select volume increase level (0-10)</string> </property> </widget> <widget class="QComboBox" row="0" column="1"> <property name="name"> <cstring>aLang</cstring> </property> <property name="toolTip" stdset="0"> <string>Select language for audio (dialogue)</string> </property> </widget> <widget class="QLabel" row="0" column="4"> <property name="name"> <cstring>textLabel3_2_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>5</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&Volume +:</string> </property> <property name="buddy" stdset="0"> <cstring>volume</cstring> </property> </widget> <widget class="QComboBox" row="0" column="3"> <item> <property name="text"> <string>None</string> </property> </item> <property name="name"> <cstring>subTitles</cstring> </property> <property name="toolTip" stdset="0"> <string>Select language for subtitles</string> </property> </widget> <widget class="QLabel" row="0" column="2"> <property name="name"> <cstring>textLabel2_3_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>5</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&Subtitles:</string> </property> <property name="buddy" stdset="0"> <cstring>subTitles</cstring> </property> </widget> <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>textLabel1_3_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>5</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Audio &language:</string> </property> <property name="buddy" stdset="0"> <cstring>aLang</cstring> </property> </widget> <widget class="QLineEdit" row="1" column="1" rowspan="1" colspan="3"> <property name="name"> <cstring>outputDir</cstring> </property> <property name="toolTip" stdset="0"> <string>Select directory to place files in</string> </property> </widget> </grid> </widget> <widget class="QLayoutWidget" row="0" column="1"> <property name="name"> <cstring>layout4</cstring> </property> <vbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QPushButton"> <property name="name"> <cstring>b_Settings</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> <property name="text"> <string>&Configure...</string> <comment>Scan the DVD for tracks, to populate list</comment> </property> <property name="accel"> <string>Alt+C</string> </property> <property name="autoDefault"> <bool>true</bool> </property> <property name="flat"> <bool>false</bool> </property> <property name="toolTip" stdset="0"> <string>Scan the DVD for tracks, to populate list</string> </property> </widget> <widget class="QPushButton"> <property name="name"> <cstring>b_ScanDVD</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>150</width> <height>0</height> </size> </property> <property name="text"> <string>&Scan DVD</string> <comment>Scan the DVD for tracks, to populate list</comment> </property> <property name="accel"> <string>Alt+S</string> </property> <property name="autoDefault"> <bool>true</bool> </property> <property name="default"> <bool>true</bool> </property> <property name="flat"> <bool>false</bool> </property> <property name="toolTip" stdset="0"> <string>Scan the DVD for tracks, to populate list</string> </property> </widget> </vbox> </widget> <widget class="QLayoutWidget" row="4" column="0" rowspan="1" colspan="2"> <property name="name"> <cstring>layout6</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <spacer> <property name="name"> <cstring>spacer7</cstring> </property> <property name="orientation"> <enum>Horizontal</enum> </property> <property name="sizeType"> <enum>Expanding</enum> </property> <property name="sizeHint"> <size> <width>210</width> <height>20</height> </size> </property> </spacer> <widget class="QPushButton"> <property name="name"> <cstring>b_RipDVD</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>170</width> <height>40</height> </size> </property> <property name="text"> <string>&Rip DVD</string> <comment>Scan the DVD for tracks, to populate list</comment> </property> <property name="accel"> <string>Alt+R</string> </property> <property name="autoDefault"> <bool>true</bool> </property> <property name="flat"> <bool>false</bool> </property> <property name="toolTip" stdset="0"> <string>Rip selected tracks</string> </property> </widget> <spacer> <property name="name"> <cstring>spacer7_2</cstring> </property> <property name="orientation"> <enum>Horizontal</enum> </property> <property name="sizeType"> <enum>Expanding</enum> </property> <property name="sizeHint"> <size> <width>210</width> <height>20</height> </size> </property> </spacer> </hbox> </widget> <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="2"> <property name="name"> <cstring>groupBox1</cstring> </property> <property name="title"> <string>T&rack Settings</string> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>textLabel1_4</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&Target file size:</string> </property> <property name="buddy" stdset="0"> <cstring>fileSize</cstring> </property> </widget> <widget class="QSpinBox" row="0" column="1"> <property name="name"> <cstring>fileSize</cstring> </property> <property name="suffix"> <string> MB</string> </property> <property name="maxValue"> <number>5000</number> </property> <property name="minValue"> <number>1</number> </property> <property name="lineStep"> <number>5</number> </property> <property name="value"> <number>680</number> </property> <property name="toolTip" stdset="0"> <string></string> </property> </widget> <widget class="QSpinBox" row="1" column="1"> <property name="name"> <cstring>videoBitRate</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>1</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="suffix"> <string> kbps</string> </property> <property name="maxValue"> <number>10000</number> </property> <property name="minValue"> <number>100</number> </property> <property name="lineStep"> <number>5</number> </property> <property name="value"> <number>700</number> </property> </widget> <widget class="QLabel" row="1" column="0"> <property name="name"> <cstring>textLabel4_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>5</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&Video bitrate:</string> </property> <property name="buddy" stdset="0"> <cstring>videoBitRate</cstring> </property> </widget> <widget class="QLayoutWidget" row="1" column="2" rowspan="1" colspan="3"> <property name="name"> <cstring>layout12</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel"> <property name="name"> <cstring>textLabel3_3_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>L&ow</string> </property> <property name="buddy" stdset="0"> <cstring>videoBitRate</cstring> </property> </widget> <widget class="QSlider"> <property name="name"> <cstring>videoBitRateSlider</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="minValue"> <number>300</number> </property> <property name="maxValue"> <number>2000</number> </property> <property name="lineStep"> <number>50</number> </property> <property name="pageStep"> <number>50</number> </property> <property name="value"> <number>700</number> </property> <property name="orientation"> <enum>Horizontal</enum> </property> <property name="tickmarks"> <enum>NoMarks</enum> </property> <property name="tickInterval"> <number>200</number> </property> <property name="toolTip" stdset="0"> <string>Indicates the quality of the video (bitrate)</string> </property> </widget> <widget class="QLabel"> <property name="name"> <cstring>textLabel3_3_2_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&High</string> </property> <property name="buddy" stdset="0"> <cstring>videoBitRateSlider</cstring> </property> </widget> </hbox> </widget> <widget class="QLabel" row="0" column="4"> <property name="name"> <cstring>textLabel2_2_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>5</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>kbps</string> </property> </widget> <widget class="QLabel" row="0" column="2"> <property name="name"> <cstring>textLabel3_3</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&Audio bitrate:</string> </property> <property name="buddy" stdset="0"> <cstring>audioBitRate</cstring> </property> </widget> <widget class="QComboBox" row="0" column="3"> <item> <property name="text"> <string>64</string> </property> </item> <item> <property name="text"> <string>96</string> </property> </item> <item> <property name="text"> <string>128</string> </property> </item> <item> <property name="text"> <string>160</string> </property> </item> <property name="name"> <cstring>audioBitRate</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>1</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="currentItem"> <number>1</number> </property> <property name="toolTip" stdset="0"> <string>Select audio quality</string> </property> </widget> </grid> </widget> </grid> </widget> <toolbars> </toolbars> <images> <image name="image0"> <data format="XPM.GZ" length="82281">789ced9d6953eb3ab7e7dfdf4ff1d4d5bb5b5dba0192905457bf208c6108100843bafa852d4b9e6d2084005dfddd5bf65a4b78484202fb3c679f73d8aa14fb174fb2f4f7d25a1a9cfffeaf7fdd5d9cfdebbffefb3f26cfd6b32ffe253cebe95fffe54ce3f8ed7fff9ffff57fffe33fb736b7feb5d168e8cff6f6bf36fff37ffcc77f72f62ff1af419ac81c9e34b046fe2f632736dcc9b7ef233761bbba41eee0f676ce1d3a9e0f0de7dbad6b643cde0a0ce7db9583dcc1e30f0ce7dbd93bb2c0fd47c01b8d0dc82f330cf979cb78e323ff3131eccf5e91f1fab62086eda2898cf9619e61385f400cfbfb16b280fda357c390ff0931ecaf368137b0bc588b18b673cccf06e687efe4dc31f93f379c9f3fba44c6fbe13e31eebf6938df9e0864bc3f7fcf30e47783188f1f20e3fdb18661b89e470cfb872930dd9f35330c7a60c898df78448cf77b6718f2db41c6fcf043c3f9763925deccb7dbafc802f59064bcd9a0f2e2efc8787eb6450cc7b307643c3fdb2786edb1858cf7efb588217fd2360cf73b0036f7ff420cfb0797c8f87c8837c3b0ff3931d6476a38dfee47c8589fceade17cbb7b450cc7db4d62b89f740719ef277d27c6eb5d1986f2bb2686e3a3187813ef276e1986f2eb13c3fec26cdfece6db7d642cfff88db86de5d7cbeb7fb34be5cf0e8037e87c0d642c2f1113e3f3766138dfee44c4707cf2868ce5250e89e178d76c47bd3162c87ff48c8ccf877c340ce73b26c6fa1686a17e5ce04d7c5e54db306c9f12637d9c1986fadf2786fb91dc709ebff81299eebf478ccfcbd470be7f728b8cf7cb1d62d81e62f96d62fd5b0786f3edc126f0967ec0f2f3e7c76f6d507dc90632d9db11311c2f42642c7f39310ce56f1163f9d3f9b1bc03c3d83ebc1986f2f281a9bc856d18ec694a8ccfcb9b61a8cf2362b81ff5828ccfaffb6a189e5fba1ede6f7c6218da9f3b62389ff7848ccf73f8c190bf7b62d4b72086e3fd8961a82fda1fefdfde23c6e7d7369cefcfe9fec5565e7ff10df016de7ffa480cc707a786e1f85b62389e617d6c35811d280ff37c459b86a17cc7c8587fdeb661682fb680a9bee24762d8eecd90b13e820bc370ffe7c4f83c8d0dc3f9ee88b17e1f90a93e360c83deb68971ff1819ed41f2428c7a1f1886fc04c4688fae80b7f0fee40931eaf9c030f8434fc450fece0419ef2f191a067bb2470cfbdbc7c4503ffcd130e8e70d19ef2fa2f37570ff9e61a87f3abf00b6dac4600f8223c3b97d7772bd35cdf31a1f1b86fb9b019be7f1da303c0f8218f217f691c9be740dc3fde3f9c9bec51c99eaebd530e8e99d18af9f1886fa7181b7d09e78d230e4ff9918ed195e7f0bf52943c3a0a74362acef67c3e00f9d12a35e6e90b17e9c2762a89f740f199fefa44b0cdbed9161688f1362a82f0bcfdf447b9e1c18ceeb2fc6fc34513f2c2286fd43db70bebf82f2b1a8feec1b64bc3fd127c6f6e21919ebcbee12e3fd9f2363fd850931da0fd08b45f5e3be13a31e9e90c97e7789f1fc663bdaaf5364b40711370cf63121c6fac3fbdb423d2527c4d87e3e10c3f9dd267013f317768851df2f86f3fa4a036238dedf2286f277a6c8f8bcbb6d62dc5f1886f67b468cedf7d0705e7f01de6f139ff7d42146bd1c1acef70f2f90515f095d1ff5c5a686f3fda31be2561eacfa79fdb736cdf3eb11a3ffd741267dec10a33dbe44c6f2b6ef814dfd06c4501ed12332d66f1c1b86f69c13c3f16e8a8cfaf38e0d837d691363fe7bc04dd4a3bc26c678e10819eb23b940267fdd2586f28bf691b17c7d3a1f966fe819cecbd7be2486f20d2de016ea25181bcef7678218f79f22b7f0fcb161f0d74362d8dffa60d04fdebeb52cf24fc43632d64fc80d437b864cfe86dd40c6fa0e1f90c9ffbe23c6f2ee10a33d81fbb7a8fc1366189ecf7b62b41f6786a17e2c62cc8fd90ef9957d64b427ac438cfe54848cf621b9340c7a3920c6fa7e300ce7c7ed2d7afe6d62a80ff7c2705ede9218eb4b3c1043fd28db70bebf3847eec276161886e77907d9417d3c13c3763bb78fed4daaaf706018fc0117999edfc830e83d06a6f2172931fa1f67c4509e9e8f8ce59d4c0d43fd87c4707e758f8ccfb7bb854cedbf61f40ff17e5a0df4873691f17e598fb89d97578ad76f6fe0769b18b7ef1a86e7812163f9b32762d8dfd9320ccf57febcb42dd35fb1874cfd13703d8bfa17921e32dd6f408cedd3ae61f0773691a9bfed8d18e3f943e0cd06e4c77190315e9737c81dbcbf6b60aa6febc230e8e11d19f56ddf22e3f3eff789a1be931130d5b77f8f8cf727ce88f17a9e6168ff2e89e17c720799faef1a86215e96c468af38311c1fec13c3f3e0817ef5f307e7b37bc4a89f21720beb03f46b915ee207647c3ee5b66128ef4b62d0079b1986f6730b199fdf28309c6f4faf89e1783e300cfac2f26d3bc0ea8a787b2b3f1ef4696d6f6cdb797de4cff3f616c5f3fe8b6188b79f90c9be1d0193ffe75ac4a8df3d647c7ec33362ec5f3c4416a8bf5762c89fb805de6a00db983fd257dc2486fab31432d6af8d4cf65cf488617fb5838cf63cb191c95e8c8851df77c4e85f3c00933e3cc7303c6f6364d4874888b17d3f46eea2bd2276f0fc98df36daa328340ce52588a17c02ccfff606fa5b5d62d447448ce57b8ddc020ef70ce77a70f2e767db36f1fa9418edfd3b30d537bb46c6fa8d66c8e45f9f1a06fba488513f1364ea6fc3eb6d35213fee2d7207d882f2b1a97ead3132ea4181de6c6a5f858fdcc2ed787f54fe7e6018fc7f4e0cf7634d89b1bd7a4476f0f987f2b7db2dd4df05323ebf21e8c9dec6e7db7d2686fb4931bfdbf8fcc68218ebebc570be7f74854ced574c8cdbcf8175f1e66ce7f14a678bfce948226379db2d62ec0fea0053fc9bb48831be13c8d85e445d64eabfba42c6e7995d1277e07e9e81b579c8d93a45c6e7cb9f02933feaef22637dc927628ce786c8581ffeab61b0ff63628ccf7680db1bb87f1b199f57ef1078db81fca507c01d7c7ea26dc379f932490cfb3b8f86a13e46c858df2c24c6f3ef1b86facadbcb8e4df6357845a6fedf7762ec6f6c2363f97b7bc0142f472786c19e3f2053ffe63e31fa0f4d647c7ed52131c65b1364d44b0af767379b703f766418ee7f808ccf2fdb2586edc11419e31f3926ee3673bde0fd50fdc5f7c0547f89340cf773458cfbd376acdf64c330f8435d62bc3ede6f9bf4766418ecfb3932ea2db5803b684fd343c3f9fda95362b8dfd845c6e73d382186fd6d460cfb272932da7f7e460cdbe50b319497c4fdbba83fa588b13c73fd779ba417b1818cf5a98e81a9fe03dc4ef1996286c13e3489b1bd7806a6f82cdc25067b9aa6c868df53898cf1b0ec1163792a62d05772878cf171b24d0cf76b45c470bff135b0ae6ed89e10c3761bf3477af11f91511f222046fbd1300cf67e428cf137e68ff4e3370c83deee89e17817f34f7a925de06dd4b71822b730bffbc05a1f797928cc6f07fd81b0470cdbe32762383eed0377d15e719718b64707c8a857ab4b0cdb556858e4e7cfdbbbae203dc90d646a4fde0c4379417e04c593629718f46dbd2253ff7d8f18dbcf43643a3f94a720bd05bb86a13d0f89d13f6923a3fd4b05700bdba314f423a8feac3e31d6ff816118bf3a42c6fa4b760d437ddf1263ff1ce84f50fd7a1b86e1f9c1e3b7d15e858c18ee9f5d1043f9b31de42e707a496c81fe3d6407e349c3509fc11631ee0f7a1754ff414c0ce70fce90d13f89ee88617f7e4e8cf973911d6007f424ac0d3c5f6edfad26f537389bc4e8ef6e20d378c723316c0f8f809b189f093cbe49f16acb303c6f6362d4d30931dc8f8be7a778343c310ce3051d621c4f4881a97e933360aa5fcb26c6f1943d62b017be838cf51d29c3e09ff9c4682fee89c17ef21631d49fa2f393fd490d43feaf9051afbc4b0cc7733c7f670338dc42c6f3a7e7c05d6c7fa20e31b62f97c4783cde9f85f6857162bc1ee6c7c2f30bc770ae8f04ea4350fd3b1e31da8b4d648c0f138718edf91098e235b90fbc8df6da7b40c6f24a9961f0278e89617fe51906fdbd2293fd16c4b03d99114379b9097007f591e2f93bf47c3589a13cecd870be3dda43eea23fff4e0ce5cb2531ecef726407d8c3fba7fa50163295ff8561b8de1bb205f631bc23c6fab30de7fb87d7c812f66774bc84ede286d8ce8fb772fb6537a9fed49018fd7bb31debfb8d189e576b0399e2f53362ec1f6810c3fe52029bfe8077c3605f1e88d1ffe82153ff621f98f4e40f0c837f88f9a1f85f9e02b7295e3b2286fb0f02e0ed0d606f0b998e7f330cfe7f9318edf9a661f057ccf150fed1217217b7df13a3ff84e543fa8d8e0d83fe1d621c8f720d437f619b18eac70f8149df81320ce79b10e3f9ee0d437f15964f87fad786c4d89f86f5d5c1e7d5f388d1bf318cf607f3dbc1fb0be8fae40fd1f5f1f9104fc4501f31965f17dbabf48418f6b74362d8df1f0193fe23460cc7fbe7c4b0bfc2f3d99bf8fc3f12e3f3b5450cfb333c9fdd064e4f8995cacb07f56f5bb6935f2f7f5e6d879e0709f7eb687d833dda076e617b1b3e2263f9464fc8587e21e8c3213dba31313c3fde8818fa9f5c460ccf53bc838ce7b72d62c8afab90c99fc2eda41ff78818c77386c4389edd4046fdf8a78661bec11899dac733c310ff0e90a97fc730d48f07f5e57429fe7c406e417dd85b86f3fb09b17cbb5dacbfa1e17cbbc4f2b2db50df564c0cdb8317640bda8ff48218db63b31df5ab88e1f8f81599ecef23316c77e87c52b4f2fbc3f2d50e7bce766e2f458bfacffc1d64ea5f3927c6ed2d608ac79304781bfbc3923d648a9f6f89a17c426518cac730e427c0fd8d3dd92686edc92132d5af340cfef51819afef0586c13fc2fc53fdc6b786c1be6f21937da6edd85e7a581e5dbcbe632363fe2ddcdfc2fc3a33e416303b06a6fa092262d81e3681757307f5ff4a8cd7b789e1787e498ce5776318b6e3f5441bb6ab036207ca33f73f8579febd0b608a8fd404781be34f6fc730f47730607afedc73e42e5cdf792186eb090fd981edf10630d587d7330cfd59c4d47f171a86ebcd9029bf53629ccfd947a6e7fdc5309c1fcad3b1f0f90e5262acbf7dc3797e5507d902960fc812392186fb55a05f47a03de71631ec1f62f90b0bb75f10e3f63132b627fc9418b6dbcfc4703d3900763681e39c9d16f577289718e3954b626cef3d642c2f1500937fc04e88d15fdb02a6fed04421a3ff222c62b85efc8e4cfe786c18ea630319eb279d11437d08490cf7e79e01937eac0e316c0ff1feba2d60ef1619af1f9e1a86f601f36bf4e2005be4ef84c858dec10130b5dfe91131dad74362ac9f57c3f9fa0eb58fdc96ed3c3f783ed24388f9a5faf73b86e1f9b90276c8bf6811a3bf1e10c3feb64d0cf9f131bf0eb64fec9118b6a7cf86f3fc3ab9be1d49fd23c93e32d6973821c6f154014cf172302206fd7897c8f87cdb901fd9c1f8cd8f91693c6d6c18da1fda9fc607c686213fafc4e8bf40f949636f5e0d83fe3691f179f1b789b17f372486f2612f86f3f2897d64b47736370ceb7930bf5d07589e1343fd471360d29b172163f9c4987fcbc2f998983f4be2fa8b26b08df52567c4707eb9876c815ec23631b6179bc470bc9512a33edf91497fa80721a17cc21b60d25b2891d1df896e89e1f948ef88e17ac131b285cfcf0b31962fe647df71ae57e78118b6dbb9fd92ed36c5f3b7c0d41f9344c8d47eec22933f3c258678ceba07eee0f9d80d32ea49ed12633cd007263db13b621c1f9b21537f720399ece18018eac37b43467d3b2131d4478af9b1d0def15d62dc3e319c978f7f824ce3d76d62d8df1b225ba8bf2b6489f94326bd044fc8680ff90d31eaa5054cfe8aea12c376f56a18ec8b858c7a4df1fe1df48f626518fc8b8018f61707c012cfcf9ac8783e756d18ca83f6477fdacaf52aa5d1cb353295d729316e7f47c6fa0ba461e8dfbb2286fde33e32c53f03c3d03e835e24c5d70e7217e37d6f1799faaf9e8971fe18ed8fe3073e47a678ff9118c71b3688a1fe9c4360b23fc2456e4179c59bc8a8070fefc7de44fbab90dba817d09314d8de386786f3f3453bc8681fec4d62b85e6021a3deec0362d8ee114be0e88518e2650e7acf320cf617f32b717f1511ab5c1f76de7ea836d557b4814ce52788713eed8961985ff70e4cfd1f1e370ce3813e32c5170e31c44fde2932d9a308d9c178781798da2317b753fddb1d62d4cb0d32e6dfde2646bd30626cdf26c016da2f4711e3f61e328d5fcc90d15e242130e9211822a31e540b19f78f9ac002ed7bea13c3f36ae3f905d64f7805ec607c136e1363fd3e10c3fe12cbcb6903273b86737db8981fd283d32186fda36b6045fd338a18b6b336329edf19205ba827d8ae480f56d330ccafb840c6f20c3cc3e07f5c22537fd8b361a89f1632f9eb03c3e0cfbac4381f07f4a5c8ff095cc3301fa18b4cf9d9310cc74b648abfdf0c437c1d20533c39360cfa1b10e3f875024cf626e186e17a1bc438ff811986f8e58918fd8f0931fadb43641a7f710dc3f93791a9bd7b310cfd09fbc4381ff30899ecdfd430d4d78c18d727f681e979f0268661ff0b623cff31323e2f5ec330d4cf3b318e777ac4383e44d7c3fbf1df0d833fbc4f0cfa572932dd4fd730dcff8c18c71f3688e17807f52df0fee273c360af46c4b83f31de9f9f1886fe3b8b18fb675f88b1fdd823c6f39d2053fda586a1bc9e8971fcea8a18ef1ff526f0fe7d6618da639f18e79b0bc3a0f74d629c1fd524467b44f9a7f2c2eb3bd45eba86418fd7c458bfbbc4d85f1611a3bf332186f37b589e0e95af6718cab7458cfef93931f64f6d13637e514f0e966fd0330cf915c438be4bc7537b3b26467b8bf5ef607927cf86416f5d627c7eee8831debf2186fb0f1e0c837f72460cf697bf1a86fe73ac1f49cfe3bd61289f84188f5786a13cb07e243d9f7786e1789f18fb1f42626c2f2cc3901fda1fcb37ec1263ff559b18fb031ac498bf67c370be2d642cdfe09c18eb838ec7f250581e0acb83cf88617bec2053ffd58418eb13cb5f61fee32131c69b3131e6776a383fde3f4456389e71438cfda1cf8621de181063ffc52d319cffd2ec0fe7bf7cfe493fe9cf4d9cfd28f127fd0ee947893fe9f7483f4afc49bf47fa51e24ffa3dd28f127fd2ef917e94f8937e8ff4a3c49ff47ba41f25fea4df23fd28f1ef94b8f567e7e01b79ff51e2df26719b0bee70c9d59f9d932fe5fe47897fa3c45dee719f073cfcb373f285bcff28f16f9578c4639ee84fca1ffeecbcac99f31f25fecd127fd45631d1e9894ffeecbcac95ef3595c89ff994bfe8bfb33f3be73f697ee2affc8dbfebb4c37b7f765ed6caf71a4ae4bb7c4ffbc4fbfa693be087faff47bcff07e4e8984fbf7d8e13fd39e50ffc8c0ff8f9afcfe39c2b4ef8c5bfe33a2be4e4920f732526faefd59f9d9b35f2bda212f90bef690556d335777f717e46f9796fbe758e5b7e973f2f90eed73a56b7687ccc1b7c43ebf88a6f6a2ddff02ddd1234961ed5ccaf34fab565f1c5bb6ff136dfd64aec68dbd8fdb373b346be575222e3859aada65f18a73186e7dc675fee19e327da6217f2c7ec958e7ae5232698a36dfdfcbbdc670e936c6eff88b6877845f68b9fcb2fdcbd629e6e97df31ddfed9f95923e72b2891bb0b5508e917f9237cca7c73ce6f94615989abd944167c728f900ed89ce78e451f7bfc9a92f8d25d3fb398252cfdd0217be0017bfcf372b466fe3f55a26e9b3ead21f64b6a80abd2592fbf7616a6d8a494b7d58eb257526276be8a17cbfba5ad2fbfa224d62cb7319b694bf8a4fd4252e18e5661c23becf5af133f7fa644ed312d6aafcaf5f3f6fdbcb0e7d239e597cff35ecad9ce4ac7ccf38217a5925d441f91d2bf395ed52adccd15986b90eda135dc6707b91e0f97fbb7bf53fa4c89ec68454bd1ff7e1cad238de239f7be789669d926aee6c7aea5c427c60a4796dbf5c3ef47feab2576cc4ed8293b6303ee65bdd9ecdc7887d03227fc6d351ff9f7489fdac4d5eba7f9edbc5c97ebf4abe7a9b4ce2bf5aeace82752720a475e96b7fdcada59504e361bb22b76cd46ec86ddb23b76cfc6acc13678ccced926db326af4f8eb1f9f9b5f76574b95c8cfbf563b5f49acc95a2505b5be7ca6f279c44ac7aca7c4a78f9e7dd62f6f61ed5f5f4b857c6eb33eebb0aec52d6659966d09cbb1a4a574722dcff2adc0f88a6fd65f6af479b912ad689ddab1e26fe64594ce977ef53c65255ac94ac7acabc481c975c9a760efbfbe8e0af5915a0fd6a3d6de9335b19eada9f562cdac57adc237ebdddab17ad6aeb567ed6bbf311fedfbebc4cd59fac426ae573b5ff4ecf05a53abdc0f187df54c1525aed4caafad44d3cbc44acf0ffb03469d0a65d4b38eacbeb683c7d689fe9c6afd9d5903eb5cff8574615d5a43ebcacafc9cbf94455cae446bb45eed7cd71e583725057db947b16c5bd9ee4ac7845fbd57362c7dff87c52bfc81a72cb5ee727b786f8dad46aec377fdf7c2dad07f33bbb8a9ffbf95ff76c41fea23fc21f7b74c89db6bda8927bef5adbcec96ce75fce5f3dcad6f5beb4a6481d5b1bab60e0f6c4bffffa6b61ddb3ebbd41369f33fa89e7ab6e03becdc762c6e4b5be5f6ef7d5eb25ddbb37d3bf8f3c77bd6bcc3254aacd60e7be7f7bca73d7451e927f9a8876fb5087c56d0d09723e7aa12ed9594586e63f35499df57db6ee2529e16befd45f5524e760cb31ad83e7fb3133bb51f72bff01dfd43f3d77eb406f6933dd176d3b603fb0fc9cb1f95962a312d97bd6d5a1efbc59ef1813db52ade15f3bf999b333a93b5fdf5b3d8afa55cade4bdce5162a52fae66134d5f3e336dc76a3ee9821c2c882ff894d938cfeb9dc7f69bd6d8bb6e9b3f3cc3a23ddc6157dcb17b3aa611f6aebd67ef7faf3efe9d6969eb5cd5d91c6f9c4d2b35f4cd798b7c90d7e8cd77fa87cbfd2a6ca551c3ba12ed834aceaa4a2dcc17b2611c6aa5fea2f9c966daeacd1d29e40ddec6fec14d3eccfd44c73e023b68f7ed63fbc43e253fd17ed26d96659fe97d8eed8175659fdbbfc95cb5cfd36225b2c75addcc51476dbcf6db336859f3bb235476f9e95869fccdbeac29ed139bc8cf2adbbfb5aece1eeaf29d7b06fd54c6641159c3bed231b3d05ad49ea27d6d8f325b60df189b786bdf698ff25e6f1fe7f1b56d372cdfdef86e9dfc3bd26225da9bb5b29fd3775dedfdf815e3cf9fe4f881c556c284bdb5681e2877d65762cdb67f6e1337d7cef9161b5a87dae79b3377572bf16ddef80c7fb59b3c41250eed96ddb6b7b5bdeb58aeb569df6533d2ecc8becee3e8cc5f6cd85d2b103cb7897a3fc1acec37666c2184a36deb6f3d06bdc426ca6ad95b0773f6aa2851ac306f8167f3b267995fc49afab3467f03bf2aab8cb56cabde8e57fa9a2bcf0f8ff49db9f681505cf153fa767d9bc8d68a92b50e8ab912a212d9e64a1cd6cf29bccc47640f79ebfc2afcbc1f518840845a7f1ddb667dd610917dfbe12b8a5824999fa8b53806fba93fb6482d5ffcd66bac162b51c7c9d5ba9933ea518baff1b9168fe289bbfc819ff29998949f479c8578c0de598bb5569f535d7f3672edd7e653f3925f214a4a152fa5dc9a793a566dc651d926eab8be7ae5f11aa53cadcc99acd954968dd2253ca8f683b1281bbd432536c44cdbb8cccebd8a37f12e26595fa6d811bdbc5f11e367b1abb759f97ec62e5acf62cf6e89df3a7e596213eb237d73fa9aab9e3ec3b1359b57ec69a770cdb2cd2a2885f7798371dbd26def30b397a52b2dee7bee95ed62659d4321d7e2a0d4eb7d601bbb5757e26736d1c6f822b3e9b66dcf98643d7d67b99fcc4fb48d1d09c96de8d5a944f373b46ccf745cd2d11ee175b11f955f701c47660fec5c1ce6e3cc999db3ad8138cad6acb0778c570a49f4c5b138b126da7e3ae254dbcf333110e7bfcb3a9b4569894dac452cd5762eaf878a7f45518db8a858ae4204cb4a2dac189a2b965452b9ced25e76bb64495852da5ae81db14b6a2eceefcd2286ca39cb36b1aa44b3b51ca90bf45d3fbed165715d3d375ebfd0e7c5b556c5289f5f38d431c881b8d1da7e13b7d07f937f9fb0b1b813f7999d6377e2508c996017a251b487f95fad4bb161cdc4a6e5892dd114ad5fbdd6e88f494b6c62bf5676737cff9a2db9c6f33e549458f0062b360b7bc3ed72bb39c9d6e7158e716ab929a7420b5d5155c12616fba5ca639375257e62138dbe2b2b7cf27cf0fec795182f8f83974aa5d06f93f75d27f9ead01d9e798d6dfd792bcc398cb5afe7a0ef77acede3bbd8169ddc067645581d7171b8683aac7a0fbf735aa44466cd194759418934974ba84a9917da06be573ac2f86aa56f4b3a71ac4f7458ea532ee7497ccc552845574ea996eabe48c52656eec7317d87e572a2f6be306ffcae7ae67a696531b0e36805768ab35dc93fe4ef629429d1918ecafc3ec7b59ec4b1e381fdcbe266d1650dc7b3ddd2b84bc3f1ede95fe71d394b5ae77ab9cd995f55b325fbf36bae58afe5315c5a67e204258bd52ada44f699452c68a01a0753c45fe91f15e539e6752556fba32adb8d0d2eaf55003f91295e1fb3999b1c333eca07250b584a4ea43fb193403cac3f8ee5d93bb9dede719c6fc71a38bc3a06eda4d68df3c05fed5f681b9d47e7c99938cfced4f9a56b761629918feba566cd59855c9f1900df8babc5f55a39c6c4ce2525165602f1e395ead4f4a957e2798cf82b732dcf3ebb0fb6a36390218f84f627edb8ac6ea73017ba6cf304e67bb5d53fbcd0ce687f0656cc77ea4ad47ee20e1b7fc4c3d6933575de8af6cf761d1d5b9b7e45fcded9b1af9d9efde6ec3adf9ab16754b8ef1c3887ce91d3778e9d13e7d439fbfe393f55e29c390ef366b52c5262edf8425f56b9f534fd3e07c59e0e6d138dcd72e6db977d6d770a477cf47656fa389d7a7eeaf3c1ebf7b1341522a48af5cb95c8da85f5b29f247397039d87b78f16b994123ed456f0fda38fd039b70625fbb7635d386f626cece486f9deb55db1fd9d1171ccdf8573e90c9d2badc06b67a43f273addfcbab7d22c52a23d67d5a53dacefb75089159b5a5c8354f12d4d5f78b19d2bd9c4d24c0c1d4fbaf60cfa3a9cfde211343ba6e20fe6df5662fcdaf84825de5e9aca4f6465f50df6cc7c1a617d9ccd8cf1b16d9cfb9f143eef7c3b7bf79773ebdce97825ef1f74eef567ec34aa7ea1f617c93e6e58e7ce26d947fbd6daf9ee1a7c67cb693a2dd4601b3f239d9e9d6fcc555945896c4e8c30efb9aad7a03973f9fb62df59793c03e7e1b366d1f7672d077b20754c5dea1516d785dc97df0980de7965b5aa93f7cb15bf59e93e16a5ea4853a5af107bb12aeb149729b1302ae57425e743762099b4f063f3369b8807712cee61dc448aec47d1ad2b1d2f57fa1173dda92ca6b6ae99a7e36ab48f525aeaebab5f9d0ba9a42b3da72d7da341a34519c85046f29beb469629916fcc29b3393320ea6fcbc1efabb173a17fbfdc1bfe31a7b1d8dbf1d17eda95d18d62cc5b1e1bb7f02d3095d659fb89a2accd39fe7b399e5fa29bdab19576986ce2eaab564befae61964c58681f6abb7f2853fb9049f9a0db97a97cc4f192e32c7eb69ee4939c689b58999fa8e3e76bb1239fb5c7782d368adfcba995ca1739136bacc4e70df96a5fca37f9ae357852d1207d741b2d77648f7ddb322e54e243bdcce6ad925ba4c49a4d2cf42654c665b0ade3276525d23b68aa637cc5f78194df4fc1d06729db44eb4096e682cf5f33b8924ddc9fd7475c56227d5be91fe8eb36fc5027a1e39beaa8d40a6b22e59e783371b3f613e5bec5ed6badc4d22c45dd2abf31a123141da768bbf8316bf154c4f2401eca23d997c7da8685f2449eca25d1861cc87379a1f7bb9443adb4ba2d2cdb455f5ec96bf9cdf7532d5262b53f706525529f895519692d8cb194635b36778ce5432f6ca77285664105251f82bc87b24dd42a28b79407f3e655af66c3aca0de2ec8b2a74ccf4f2152cffa46f37790cdf053d6e20ab184bc9577593fa260ba8d7e625d3b115d795f99b7ddb04fe5381bad910df21bb3f65b6e8843ab253733bb26b7b46e9a5a3f7dd9926d16cc55c4abdc961dd9555cb7c75b25bf7099165b8aa96fcd8b5bc74f54f35ab5ea98e09dd9525ea957c8a52a454334cec0fba5fe10417374aceadc81c29caa4a5cd59ba7c47aaace83997b1f8bd558f113cbf933392bfac2079571f1f28aaf4fd7a1f19912f655e6278a7bfd77cf9a294784a223a2b29fa8a45299bfedf44487eca57de3dc2a577975ed285f05aab2da4345ec49c52ac9ede02a1a341f7dbe543da86fac6b5d6813e7f4e2cc55e2edfc7ae295b10751984b586e9d3fd6f015fbe00aa30fd59eb952af66a94efbab2971defacbd5238cea3b9f2af339ac39f7581d43af8cfe7d5647ea494d600e0ebbb313f5aca679adbfb086d8d16a3c43fb77a6662aef27e0e7ea4d6cab77b5a37ada7abe5a8eda758e6bdad9527b6a9f4f79431d302bab1ff9a20ed551eefbada1c18216fbea589d7c7637eb2a716e7fe21c6b5eadc18f9e9e4aeb5c9c1556b609183b6a9b58d49cb189d57a2bae59e3139bf333752a5ed8117b367ee2674a9c333baaba66677912078b4ac0dc63f119a9d8c4f594c81c75a663e513adc391b68603c5f376b6a9ce55de5364bda80b75a9863a66ee287cded535efa991ba518ebacdfb1fefd45dddc6a97bf5a2edcbd819aa86da509bfaff5baaf9351da2165baaadbe18bbac33c632effd6f5525d23e153f71bf38de5456a232f3c5ca4ac4ef66d57a539fbe27758555f4b5d9cbabf7ff65c92dcc6815e59e4aca4331e2ff864de4a1cbf2773e5cb97917b5d1c948db34ee5cbb8eeabbd255ae6bbdb89e9c643155f62e74d777033774a3cc963af76eec2695b863e41cbba9fba075bd95f98f8aaba63ed3a3fb948f9e7c598b72e84ec497dea9bcd6b873ad75d6b6bd624bdc45c7177a0fcafd89140b3b9d52cf9c203b5219d75d61aef4e74a2cf649629e6aab0796a642ec561e1337775f1c5bfcb24de43d6d07b53dd49a9aba2f0b7cb7117cefcedc57fbda7db3033b71df9dc4f6cdbced13e1576da2f4dd1db953d65ca655ada49ebbfb2d2db69ce7aff42fae331767de3bd016c513e5fe442b28f66c97c73be6fb89c626aaaa12ed4fd78f7cae44a7f60eadb21255d7d963dbf09e6dc716d7a2ee459a5ea94aab4079888b4aace4afacc40533a955d7dd73f7dd03f7d09ab947aaff490ca1f5e8f6f9d08539da4f30468de3d48e7be29ed66ca256dd9cfe99131d57f7ddb32f6b31efd37107f3efe92b4a9c373f91d5c618abefb2e1c5f5e80b4bbbac4486cf0f3f29c594c62656e7dd7fd12656ce523ba6dc3f5d99df5c9febfa31b7687e7fa27b5ebaf6329b38677510cecc6d6b4b78c142e734b77b9fdba32d79e95e66eb56dc21f53d42ffa37be55ed774bc48d723ad50d71dad173b97cedb572feedaefec5fac44b76e07e628bde65fa1ade0e531b08362cf7679dcf963cca43cda87e769fc0a3fd19e96d7afd4dfcd5e79ee2a6714756547f38fa4d8b9340eb9d426ceef69d77ecf4336cfc2bd73ef65b08a0ec1cea9d81dbb0df00f617e776e23cfdd8d15cf919fc7dd74b7d6edc729e5e3c86dfe3a25ce7953cc51adcedb55ffaa707cf1fb924d2ccf6924cfb23a176751ecfcf9efabd495c87875f6bf5d598f5f5162652bbc0fa0f43c98e7a73c2bcc7c5b7c17ef529bb8ecbd196ecb6dd7628d659f13e7cadd763bda067659d7e330bf5b7f661e9b6b1317dbc5be67ad71dd5a3ed4bdb7e69cc8c54ab4ea3671ce784eb96dfa981f5db589c59eedf248d8c71a94e23cfc25fd896bfb89b0b6a6a2cd4a7f7265464d65a673dd267ecc1aae3c2978a428f56c57f2577eabde92768c37d483b673694133cbf4837e9ae29ef01c4fba5db59bcfdf713ce5b9555dc9a6ecbafdf9e7d23ea754f172bdb9a3dc779def27e8e33def5729915f554b9fd7e627d6e6e1993d78d95696eaa232930c8f714a23dd8571e7aabf5a6857c563d686c187bd9991b6ea1a6c77de7944693ca0ac4451192be04bd63996d7b1d0b74eb14559ee272e79ab9578f47c2f50032f74aea89ebd48f14fc740f2785a1eaa67759baf779eaa8d6a0ca25aeac58b176b49ba5eb2f81a5eea3d788f8be31ab9e5adf99ee7a56f68aa94bea8cd16e793ca9c28331fb63c0ea73dc0420f5e79de0bcdc5296bb730ee5c7e97dd93b3ff71f5f27340bdea65258a29e8a066d74aef08a8dc4725b62ebf23314b1f637e952d344772653f71d9fbd5f8ab56e2c47bf6a6ee2669cc7bf166deabca7a0053d4e35c3b99f57f7b6fdebbb793f98cd295cdeadc42d7d5b105f627d6b47de21cbb3b0b743a72475ecfdb757bfab805cf82b6cb7bde5aebab97d8c469ad8fcd61b1cdb9ed1d585def50fb914e350a748c122b6334e5d549e5d90683b9da35f313ab716bb12fb0ac9f05632ce8aff0eadcdfd21c98ca9958b92c4a7d32a09fa989edcb5bf0dbd56de2b2f71c7a47f232b789fda22df39ee58e772c5db5e19d80be6436937a6e5fa377ea3e7967c2b7b83728ea4ac7d93bda173c979e3cf42ef4e7d29dc9d2f88aa723e8453af3aebc67b5e75de77ec3a2f679db1bd96bac7459661357ffb51c2cd342dd96c768b44d2cf46c57d647d1685fa37c84d1c866f92a1fe31bd5df8aa171c3a2128b6f95aae5b7d00657ce5419b1529ddab1fd0567c57ed3653671de7a8345c97df56ebc5befaea2af7b6fec35bc0d6f33b75b236f4bdd2fb05fdad6b933756ccd54acfa259bd554b1d7b2af9d77fbc66b7bdbec55b7d69d7c9fdcc67a5defc999ef478ef4b59f7dae1efc7a1c54b0b9be655dabb66fafb6be7069eb3c678ee2b2547ccf43656e42a9a7a26c133fde5f523e82d6b154d73114c71c2b75ba5b576271d67c35f6f978870f6b57b655de09f2f15ec70f25526c5fd9422baa0ab1337bd7f730e1175c3166cff85579cc6059ed30e50bdf59d0b73772aeb433f72a5b3a766879beaf16db27c57dd739d5fea5897b7c7d40368b5184d640361c6e6d889e88bc6df1e63de6d7eb7b811f94ede8c7c7976ae0877e245b4be2eb1335cef2e426ee9c08634d25ae370276501c47a9ced95e92706d5ff92d0fc5d8b6e2255c332977c5a3ea3aa2b81a50ff9fde0f52fcb6608f5855358519f5154d57df27dbac1c696c62f57d3934bebef2ef877cf2ce45f1e2c70bdbc0919ff8a9ffa05bef7bdd5676968e8b9c3847aeb18972cb7ff49fb40e5b599df1a93ff19fad863fb5ceac0bff25eb4b547d7fe6bf3a878571eea6ffe6bfe7f6b4ef4d7de9bd681b3a5d16b3b83bce516693b5fded884ffbde3ef9158c55d74a66a9e279afbae2976c5c39562fbe03a2de9b37f73c1f314ed126a61f3e5ae53ddefa089a5353fb2d98ea5ae79aae16da44f455abef055a98eb4fd6c68917b5b7445f6d9ff991bfe3f764a0e3e085f103da50d2d4966af9bbfe9ebfefebfbf70ff5e7287ba784f5eef7b37530ce9b7facada8f477dced0f7bec9fe816f934f347bdd43fd35154e00fd4f9129b98f9a814f38cbccbcf56177ef22b18f3df2c343f95cab43e376261c231135e9e6f5ff09ec46ab3588dd7b7d0263e56c7fcec8fdff7799fff3dea6ab3ae443caef2be1eb3de79459be87f622bf8482de8f3235ba7e3e8867fe15ffac395c68ab33938ae7fe55fb3c8c7fe61ffc6bf1587fe9dedc23c47dd4a6f6a3f74e2dffb636d6fbb10a36b3ef35efc37b9e5593a7ed7f1bcdff06b7d431f1f1d5f078a997991237fd3dff29b5f55e2eab3a5e6ac345ab56da75e9c922fc626c57785d546b7e725b32e63914dac7b8a3452525b3f581d77aefb1ad76013cb711637f3cd56b589cb7568dbceb377b54c5bd2d7f14c669f5afebcb577457b089fbe3bf5b7fd8e6e91bb010f5860653631b0ad2010fec4e9d9d7d99a98c009a4d75371a0b43f781ab8da86bafea9b689676aa035f596d944ff2cf09cd325fd38adc0759f02ec1bd2f91cf0a138d4975910bf7caac4157e535727a7be023b58f1174ee877f59c520f71790c847fbe2e7eff43718b6ca2567475dd14ae75d0f144e9ead5f93e73de9e884706d53e6fbc9ba0d6ef33377df2ee48f9107c36d6a77d45ad96b173ba20ce057d5eb9336d9d465a0f8f419abdcfd2ef040fc163f0a4f538099e8369f092cdbad0f99e05afb61bbcb969f0eefbda064a6faa95def07a6807cffc24d8d1df9f795335908fd91cc9f9f90a7a811becfac7a8d513b72f27c15eb01f1cccffcd9acf7fdf79ce5bf9abe970de7bf3ebefe92eeaa3a039f4d9cbfd86ecbd68136bb16d2d15df0a505662d1265addea71300ac94fcb4aaccef711359b4c6340b5fe05b2662bd844361173e7e1149ee6c315e6c48cd4403d38adc57317d58675101c798fd20ffaf22238e6136d131bf8990427c169a0db936090b5d3c1b9fd666d5817c185bbed5d7b4166fb167dd420b85c6c1383a1b689a98ff36ef57ec3e02ab80e46c1405ef0396b0c56f9cdfb05efa19c5bd7a5732ff2147bc5de46fa5dbdf21848755c98b1e5b55a5a27536c9d4bfdd775db0673d26a6f47ac8d05d7ae881aaabe2792de3fb38a4d649fcc270d6e82db4f7dbf13e74addebffd5e6376431abd6de5d701f8c7983c541c369071bc166b0c5b2194edb7c966991bf682d3e064d772f68063ae60bdac176e62fdae7eac16fc0f84e66ffe6fdf57a4127e82e9abfeb275ef0611315572ce48e17b2cbe770ee1ac05594c8acca3b02cbe53977ad625e4bedb94764ab784e0b4ac45a2ff7b1b0f7aabd58d6cf5ecec3629bc814afce34cc233a5e79cbb6559b7956bda215c0735db57d6645d54bf5885a9e3ffdcd8cd02e8ead2c884f13f552598b37cad7c9f7653f14c1213f0cb5e714ca5085ae6a7a7d39f4a2a06bbf869edae68dd0cf3fb330084376251b6114c6e2305b171826cad1764f2eb389991f18a68bfa1cbd5b35081fc27c6c3aeb870a9f44645d8493f0399c7ed52666317475e674212df175e6ac22de87b894d6ff667dbeb06fc5879bf776f905d153f5d7398aab58ab73ae681db26e19b3b8b40bef7caff511d4e6fbd49f45f8deaeda6a9c4f56f503aa33e057f90db7f0e593b6399b03d6738e551acee47b3e2f622b9bb913beba4a8d45337c0bdfc31d6def5fb4d67ae16ef89aeb74cb95d66db817eeebef1be1016f88ab4c8fa156607824ba72432bf12cec87c73a6e5e680fc14ff4075e1c9eb8342e53b689efbaf5069ba8ed63781a9e8503350ccff57dcd7dcff26a4accece2a2369a2d89ffc44165aecec1bcb5c698139725da825d93e6e78d59ce8bc7ebf3fbdc731669ef36643d663359f61dd4297bb72fabef23616f95b3d6de8f507f1f27ccd7e163eb86dfb2bee98fc4defdb0fa5b0663ed07a3c7adf75de17d09f68b7a5e6e0f03df4d5de99c848fe1501efa6db5e1c5bae60fbd0b6f90cd9b0eafc2eb7014de689ddd6a2dde85f7f938cc899baaeb6cfea98cf4f76017c761c33a80f7ea681d5e78dbe1861f6aa52db487e027667651ee683d0ee7c4f441e0860f59cfa43bcaf653ed6c7d76e68b869bce9c5f41585589b9ae5ee6fd5e5fb8f45723f513790f47b18975f8f92f4f651652dbc9d7456b04ac6e71c4854d16fb060bcebfa027d91a691fe49859ce9efe3be757ad5860bf6a05152217bbd453ab8f9af0631de32bca6745b7937c1fc5afb4c3b4d2bb12f8b3f734c7d6988fa7e35b956affabaffdc47c8db2ea6bfda5f0ae0719f076d80c5bc12c6c8781b67b93703bec84ddac1f27e241a8ef7727627c96db436d17232bb2b3f7ec88ed48444e2423e54d306efec42e7a53e946f5b912d99c21f0137d19782f812b6cfbd47a8bbcecb9579d39f7bb8612331be71df0b38ac796fd3ed727732ef805b3aabf25f0d5a4bdccb1aee7018b85fb59ecf9ab93f3a0efe3cdeaf08175c396fef24ccd26aefdab3cde9156d8e239d59ebb95f5dbc82df510d4df9f3472b5271ef9c159a445e764fd87b3288c227cf7e189ec4671300e1eb29825b3897e274a02cec651ea3e450f8197cdff596e0f3f3e5ee0df478f652daabe37cefa21e565f4144d729f72277a1651701d4dfd1b1ecdfb4da7f59408a9fabe5848da871772a5df52fe27a4cafbf49e3e7e8368d514bd2c9c1f988d21f7721d6a0d4633558b6bb27ee4e8357a8bdefdc36827eaf149b4cb76a3bdfc5d37fa18c5a3fdcb67f213b3f8393a880ea3a3289bf730d3eacafa0b5ff0efa776313a8e4ef4df14faceb3316baf01f632d855638ab3a3d37060ed4467d160deafee7d4d89b571858fd6f22ff17b0bff8e6455e791ad6d13a3f3e862c19cac4b37c579af23d97767f3de6be8b4a2cb681869db135d07331d27cfa21113d18d3cc9b41224e23cba257ba8b7dd45f7d1d867ded04bfd132ff5a2fcef58b6b231966cbcb9620b4fcb31b41a470d5f466e76bc67d17635881ea20d88bf03d7f3436e9f66714514cc7d6fe01794b8e4b751d65e5bf8774d359bb8f6dbd11d7b6effc8c81de5f3fa4fa82f715e7f9efeae156db246907ba4d156d41413adb7169ffa229ba71db5a36d3ed5fee32cffbe1375dd537c2f98f9e463cdf7ceb1ef3a47beebf68ddf3871fb3ef3dff27197895658361ebd1bf3ba1df502f023c13ec62cb6623b1697cfb1236f94cd76cafda95f51e29c7e5e4a9fcefdf9a7a45f6013b7e7d944d98ca5bb9baf674add9173ea9d2e98bba89568dfc52a8b556357b7cfb33c460ec479ec39d7ee8edb8e0e623f0ee2300ae2c88b96c5e8d97bc02297e2652fcadf15d1fcf838579e15c7eece32df52b7d4893c8913ff364ee387f8d13e151dfba6342fef2badf3825fbce7a5771bfeb3535c2d99b5fdc4208d2e684e95d14453d7796e87b4bd6904ddf879d158b33788a7cc8b5f7cdd4ac533ee44bbb93f388b5fe3b76c5cc4dd8cdfd538ded19f1ebdcf64be0ef5e718e6e168a525f3fb0e9deb7837ded3f95aec4fca783f3e880fedbdf8c8bea6df4b88ad8fb8ef8b3671d128f08f9f88e957d8c4389fd3a0522f55adbcceaffc5ed1579397aeb368cd93d39293f8383e71ef722d9e4689f6159f433f3e6357ae84df0e98b38eaaaee9a6370cf27938da6ef617ede79fa841deafb8609c3a1a6b9506f1c0ba660df96c9d895efe76c733ed379adf5cfc9a12adfaaacb397d6cffe454b3896bfb89da261e7977ce283ef74fb3f522412f9b275db033aff20a7c3bd50f7ace71f631718caffdbe89a5e28bf8321ec657f1753c0a4e9923a6f14d7cbece3b6fbcb16e974ffdc4ac239cb7df11d83dd785fcc5b73977f5df97c0cdd645fbaefe30add3899f06bbccb31f6d377bdfade3c57766bdc5d794589bd3824a64eb9ee9ef9a44f51780d7b6892c8eefb52decc7e3c0f386d2877eb9829d9928eeddfa6f14dfc60dfdd9f0c659dc1b6fca61bc1537ad77d9885bf1a3b68eed785bf97127ee96d6f07fa6c551c2f5f9f9b27d551ab8d0af9830df09dc780cf95169c2b33e456fe8bf7dc4df6a905889cd1ae1207bff77225c13597c4d898b6296797de7ffcc545b83b5b69fe8d8ced07ff7426d573c6d13dbd97abaa2df95ffa57895becf592bf725be8d66623b5b9792fd9e5fe2c43c5f8b5fb06b5e570d56d1e2679af5ba78fd4922a59bcf5fd4b6d139d2714e52cb1fc6d189b25e12d7dd4b3c16d1fcf8af2ab1f6cce7e9b3794eff9c5453e2da3651bc247ee677651fd7c9c66e571bf3a058d5ddd1ed73fefb2cd65912a871126a7f93d6668dbc04e65f17fb6cca9a0b868be6de96e2eaa1b9a64c22e9ead67c92f985d9b1994dace74db7d9636d3f63d14c92f0394969bcf6ab4accde9b53ffb55836fcca99fe8ea9a6c4b5fdc4e421b8fbb02372b8da7847e16fc38fc4aea592c7e42999b812e65b838692e76cdeb597bd832c9b4718ea387c47db5fcb67da1f6ceaf6b697f0ac3f50fb9ecbe399ccee7dcc570c2257a5febbe646fe3e93a0660f5fe4305bdfafaf33f07693a9ec252fc90c6296af2b314b56d7becc6606b077adca43bef757fa3de13f36b9d515556bdbc4b0e35f7ecc0f5c7d1cf8633c387a4c5ee573f2e63e65fe1bda2dee45c18ef627614dca89d32f8f9d647e5e16e766764d9fc3a218687edf4de60bc6e342fe4ef5f97a705c30d4eaaee6c9c23e9f5bb0f5de43f21ef324ff5de5ef29f1272d4ab5798b6bfa897c9af43e9b1ff8c9df49b2eb49772772f37ebeba5ff9a295d8f70a760baf57f23bbd5e7caed576ae922cfe2db4e3c73a161ecfd91fce37f1cfe2fd6a7e32df317f774a501887e9257b16ac4dfb51e21f92d4e9f76c229f78d7daa6c8a22dccfebf866d94c9be9bc5b572d131fafbdea2e3f536499fe2fefe9b17a24d9de3032efee863369dbef63db14f94ee25709d6192cfa8fa51e21f93b2f97fd68dbca1199debbe8f9f3fcb1367e8edeab8f99dc6779343ef267c8db2b67325bb98d9a7dcce49b077661cf893798759bf9f8ebf6f82c4eb4447c9117cfc7174e4bdea506382f375aae79d503e75db3b9963cf5fc84e66e7d7f1330f5fbd1b3f4cf... [truncated message content] |
From: <je...@us...> - 2003-08-06 15:57:12
|
Update of /cvsroot/quickrip/quickrip/qt/ui In directory sc8-pr-cvs1:/tmp/cvs-serv21641/ui Log Message: Directory /cvsroot/quickrip/quickrip/qt/ui added to the repository |
From: <je...@us...> - 2003-08-06 15:04:55
|
Update of /cvsroot/quickrip/quickrip/gtk In directory sc8-pr-cvs1:/tmp/cvs-serv7376/gtk Modified Files: gtkmain.py Log Message: Removed gnome module dependencies. Index: gtkmain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkmain.py,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** gtkmain.py 6 Aug 2003 10:58:40 -0000 1.16 --- gtkmain.py 6 Aug 2003 15:04:52 -0000 1.17 *************** *** 11,20 **** pygtk.require("2.0") import gtk, gobject ! import gnome.ui import gtksettings, gtkprogress from gtksettings import * from gtkprogress import * import gtk.glade ! gnome.init("quickrip", "1.0") except: print "Couldn't load some required modules!" --- 11,20 ---- pygtk.require("2.0") import gtk, gobject ! # import gnome.ui import gtksettings, gtkprogress from gtksettings import * from gtkprogress import * import gtk.glade ! #gnome.init("quickrip", "1.0") except: print "Couldn't load some required modules!" *************** *** 28,37 **** pygtk.require("2.0") import gtk, gobject ! import gnome.ui import gtksettings, gtkprogress from gtksettings import * from gtkprogress import * import gtk.glade ! gnome.init("quickrip", "1.0") import base --- 28,37 ---- pygtk.require("2.0") import gtk, gobject ! # import gnome.ui import gtksettings, gtkprogress from gtksettings import * from gtkprogress import * import gtk.glade ! #gnome.init("quickrip", "1.0") import base |
From: <te...@us...> - 2003-08-06 12:22:18
|
Update of /cvsroot/quickrip/quickrip/cli In directory sc8-pr-cvs1:/tmp/cvs-serv8375/cli Modified Files: ncurses.py cli.py Log Message: Added threading support to base.py, and removed commandthread.py This way, you should still be able to use the base.QuickRip.run() method as before, only it will use a seperate thread :) Also updates on the CLI... have a look to see how much of a pain curses can be :) Index: ncurses.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli/ncurses.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ncurses.py 6 Aug 2003 01:36:06 -0000 1.1 --- ncurses.py 6 Aug 2003 12:22:15 -0000 1.2 *************** *** 18,26 **** class TitleList: """Handle the list of DVD titles in a window""" ! def __init__(self, mainwindow, SCREEN_WIDTH, SCREEN_HEIGHT, numtitles): height = SCREEN_HEIGHT - 10 width = SCREEN_WIDTH - 4 self.win = curses.newwin(height, width, 2, 2) self.win.border() ! self.win.addstr(0,2,"".join([numtitles, " DVD titles available"]),curses.A_BOLD) self.win.refresh() --- 18,32 ---- class TitleList: """Handle the list of DVD titles in a window""" ! def __init__(self, mainwindow, SCREEN_WIDTH, SCREEN_HEIGHT): height = SCREEN_HEIGHT - 10 width = SCREEN_WIDTH - 4 self.win = curses.newwin(height, width, 2, 2) + self.display() + + + def display(self): + self.win.clear() self.win.border() ! self.win.scrollok(1) ! self.win.idlok(1) self.win.refresh() Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli/cli.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** cli.py 6 Aug 2003 01:36:06 -0000 1.1 --- cli.py 6 Aug 2003 12:22:15 -0000 1.2 *************** *** 52,56 **** sys.exit(2) ! self.switch(choice) --- 52,56 ---- sys.exit(2) ! self.handleInput(choice) *************** *** 62,66 **** ! def switch(self, choice): if self.mode== 'front': self.mode = 'titlelist' --- 62,66 ---- ! def handleInput(self, choice): if self.mode== 'front': self.mode = 'titlelist' *************** *** 72,85 **** def front(self): self.draw_screen() ! self.stdscr.addstr(2,0,"Hit ENTER to scan the DVD",curses.A_BOLD) ! self.stdscr.refresh() return 1 def titleList(self): ! self.draw_screen() self.scanDVD() - self.draw_screen() - self.list = ncurses.TitleList(self.stdscr, SCREEN_WIDTH, SCREEN_HEIGHT, self.numtitles) #i = 2 #for title in self.titles: --- 72,86 ---- def front(self): self.draw_screen() ! self.TL = ncurses.TitleList(self.stdscr, SCREEN_WIDTH, SCREEN_HEIGHT) ! self.TL.win.addstr(0,2,"Hit ENTER to scan the DVD",curses.A_BOLD) ! self.TL.win.refresh() return 1 def titleList(self): ! self.TL.display() ! self.TL.win.addstr(0,2,"Scanning DVD...",curses.A_BOLD) ! self.TL.win.refresh() self.scanDVD() #i = 2 #for title in self.titles: *************** *** 92,113 **** def int_noTitles(self): ! self.draw_screen() ! self.stdscr.addstr(4, 0, "ERROR: No titles were found!", curses.A_STANDOUT) def int_dispDVD(self, numtitles): ! self.j = 4 ! self.stdscr.addstr(2, 0, "Scanning DVD...", curses.A_BOLD) ! self.stdscr.addstr(4, 0, "".join([numtitles, " titles found on this DVD"])) ! self.stdscr.refresh() def int_dispTitle(self, title): ! self.j = self.j + 1 ! text = "".join(["* Title ", str(title['id']), ", ", title['timelabel']]) ! self.stdscr.addstr(self.j, 0, text) ! self.stdscr.refresh() def main(): ! cli = Main() --- 93,115 ---- def int_noTitles(self): ! self.TL.win.addstr(2, 1, "ERROR: No titles were found!", curses.A_STANDOUT) ! self.TL.win.refresh() ! import time ! time.sleep(2) ! self.mode = '' def int_dispDVD(self, numtitles): ! self.y = 1 ! self.TL.win.addstr(1, 1, "".join([str(numtitles), " titles found on this DVD"])) ! self.TL.win.refresh() def int_dispTitle(self, title): ! self.y = self.y + 1 ! self.TL.win.addstr(self.y, 1, "".join(["[ ] ", title['name'], " ", title['timelabel']])) ! self.TL.win.refresh() def main(): ! cli = Main() \ No newline at end of file |
From: <te...@us...> - 2003-08-06 12:22:18
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv8375 Modified Files: base.py Removed Files: commandthread.py Log Message: Added threading support to base.py, and removed commandthread.py This way, you should still be able to use the base.QuickRip.run() method as before, only it will use a seperate thread :) Also updates on the CLI... have a look to see how much of a pain curses can be :) Index: base.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/base.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** base.py 6 Aug 2003 11:01:07 -0000 1.4 --- base.py 6 Aug 2003 12:22:15 -0000 1.5 *************** *** 11,18 **** --- 11,64 ---- from __future__ import generators + from threading import * from time import sleep import sys, os, re, popen2, ConfigParser, copy import config # QuickRip global configuration. + + class CommandThread(Thread): + """Handle threading of external commands""" + def __init__(self, command, flushbuffer): + Thread.__init__(self) + self.command = command + self.flushbuffer = flushbuffer + + def run(self): + self.pipe = popen2.Popen4(self.command) + pid = self.pipe.pid + while 1: + try: + if self.flushbuffer: + line = self.pipe.fromchild.read(1000) + else: + line = self.pipe.fromchild.readline() + if not line: + break + yield line + except: + # For PyGtk... weird! + continue + + # Clean up process table + try: + self.kill_pipe() + except: + pass + try: + os.waitpid(pid, os.WNOHANG) + except: + pass + + + def kill_pipe(self): + """Kills current process (pipe)""" + try: + os.kill(self.pipe.pid, 9) + os.waitpid(self.pipe.pid, os.WNOHANG) + except: + pass + + + class QuickRip: """QuickRip base class, including the following methods: *************** *** 128,156 **** command[:0] = [self.config[program]] ! self.pipe = popen2.Popen4(command) ! pid = self.pipe.pid ! while 1: ! try: ! if flushbuffer: ! line = self.pipe.fromchild.read(1000) ! else: ! line = self.pipe.fromchild.readline() ! if not line: ! break ! yield line ! except: ! # For PyGtk... weird! ! sleep(1) ! continue ! # Clean up process table ! try: ! self.kill_pipe() ! except: ! pass ! try: ! os.waitpid(pid, os.WNOHANG) ! except: ! pass --- 174,181 ---- command[:0] = [self.config[program]] ! self.thread = CommandThread(command, flushbuffer) ! for line in self.thread.run(): ! yield line *************** *** 168,171 **** --- 193,197 ---- arguments = ['-vo', 'null', '-ao', 'null', '-v', 'dvd://', '-identify', '-quiet', '-nocache'] + numtitles = 0 re_title = re.compile('There are (\d*) titles on this DVD') re_error = re.compile('libdvdread: Could not open device') *************** *** 174,181 **** self.int_noTitles() if re_title.search(line): ! numtitles = re_title.search(line).group(1) return numtitles def getTitleInfo(self, no): """Find number of chapters, audio/subtitle languages & length for title""" --- 200,211 ---- self.int_noTitles() if re_title.search(line): ! numtitles = int(re_title.search(line).group(1)) ! ! if not numtitles: ! self.int_noTitles() return numtitles + def getTitleInfo(self, no): """Find number of chapters, audio/subtitle languages & length for title""" *************** *** 226,229 **** --- 256,261 ---- self.numtitles = self.getDVDInfo() + if self.numtitles is 0: + return self.int_dispDVD(self.numtitles) --- commandthread.py DELETED --- |
From: <iwa...@us...> - 2003-08-06 11:01:10
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv26944 Modified Files: base.py Added Files: commandthread.py Log Message: minor touchups in base.py, see lines 248 and 253. New commandthread module is here for real. --- NEW FILE: commandthread.py --- #!/usr/bin/python #CommandThread: Steven Grafton #execute a shell command in a threaded process import threading from threading import * import sys, os, re, popen2, ConfigParser, copy from time import sleep class CommandThread(Thread): def __init__(self, command, doneFunc): Thread.__init__(self) self.command = command self.resultsRead = 0 self.results = "" self.doneFunc = doneFunc pass def run(self): print "command process: " + self.command self.pipe = popen2.Popen4(self.command) pid = self.pipe.pid while 1: try: line = self.pipe.fromchild.readline() if not line: break self.results += line except: # For PyGtk... weird! continue # Clean up process table self.kill_pipe() try: os.waitpid(pid, os.WNOHANG) except: pass self.doneFunc(self.results) def kill_pipe(self): """Kills current process (pipe)""" try: os.kill(self.pipe.pid, 9) os.waitpid(self.pipe.pid, os.WNOHANG) except: pass Index: base.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/base.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** base.py 6 Aug 2003 01:36:05 -0000 1.3 --- base.py 6 Aug 2003 11:01:07 -0000 1.4 *************** *** 245,253 **** title['size'] = 680 title['vbr'] = self.calcRate(int(time), 96, 680) title['rip'] = "no" title['alangs'] = alangs title['alang'] = 'en' title['slangs'] = slangs ! title['slang'] = '' self.titles.append(title) --- 245,254 ---- title['size'] = 680 title['vbr'] = self.calcRate(int(time), 96, 680) + title['abr'] = 128 #biggs added title['rip'] = "no" title['alangs'] = alangs title['alang'] = 'en' title['slangs'] = slangs ! title['slang'] = ' ' # biggs changed to a double space self.titles.append(title) |
From: <iwa...@us...> - 2003-08-06 10:58:44
|
Update of /cvsroot/quickrip/quickrip/gtk/glade In directory sc8-pr-cvs1:/tmp/cvs-serv26504/glade Modified Files: gtkprogress.glade Log Message: minor touchups in base.py, see lines 248 and 253. Also, a new module commandthread has been submitted for use in base.py. Minor updates elsewhere. Index: gtkprogress.glade =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/glade/gtkprogress.glade,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** gtkprogress.glade 4 Aug 2003 01:18:10 -0000 1.2 --- gtkprogress.glade 6 Aug 2003 10:58:40 -0000 1.3 *************** *** 8,12 **** <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_CENTER</property> ! <property name="modal">False</property> <property name="default_width">388</property> <property name="default_height">135</property> --- 8,12 ---- <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_CENTER</property> ! <property name="modal">True</property> <property name="default_width">388</property> <property name="default_height">135</property> |
From: <iwa...@us...> - 2003-08-06 10:58:44
|
Update of /cvsroot/quickrip/quickrip/gtk In directory sc8-pr-cvs1:/tmp/cvs-serv26504 Modified Files: gtkmain.py gtkprogress.py gtksettings.py Log Message: minor touchups in base.py, see lines 248 and 253. Also, a new module commandthread has been submitted for use in base.py. Minor updates elsewhere. Index: gtkmain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkmain.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** gtkmain.py 6 Aug 2003 08:33:57 -0000 1.15 --- gtkmain.py 6 Aug 2003 10:58:40 -0000 1.16 *************** *** 40,43 **** --- 40,45 ---- import gtkerrorbox from gtkerrorbox import * + import commandthread + from commandthread import * __app__ = config.app *************** *** 58,63 **** --- 60,72 ---- self.hideRip() self.hideScan() + self.dialogProgress.window.present() + # cmd = CommandThread("sleep 2; ls /bin", self.results) + # cmd.start() self.scanDVD() + def results(self, stdout): + print "my: " + stdout + self.showRip() + def configure(self, widget, data=None): self.dialogSettings.window.show_all() *************** *** 208,211 **** --- 217,221 ---- def __init__(self): self.oldtrack = None + gtk.threads_init() xml = gtk.glade.XML('glade/gtkmain.glade') self.window = xml.get_widget('window') *************** *** 472,475 **** --- 482,486 ---- self.showRip() self.showScan() + self.dialogProgress.window.hide() # for i in range(1, int(self.numtitles) + 1): # print "title add " + str(i) Index: gtkprogress.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtkprogress.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** gtkprogress.py 4 Aug 2003 05:49:16 -0000 1.4 --- gtkprogress.py 6 Aug 2003 10:58:40 -0000 1.5 *************** *** 8,11 **** --- 8,14 ---- #cancel button (that stops the ripping and closes the dialogue) + #all encodings have one pass for audio + #all videos can have one or two passes + #ogg has an extra merge passes try: import pygtk *************** *** 26,34 **** import gtk import gtk.glade ! class GTKProgress: def quit(self, widget, data=None): ! print "close progress" self.window.hide() return gtk.TRUE --- 29,39 ---- import gtk import gtk.glade ! ! from gtkerrorbox import * ! class GTKProgress: def quit(self, widget, data=None): ! error = GTKErrorBox("Warning!", "Are you sure you want to stop the current task?") self.window.hide() return gtk.TRUE *************** *** 40,50 **** xml.signal_autoconnect( {'on_window_delete_event': self.quit} ) xml.signal_autoconnect( {'on_buttonCancel_clicked': self.quit} ) - - # self.window.show_all() - - def main(self): - gtk.main() - - if __name__ == "__main__": - app = GTKProgress() - app.main() --- 45,46 ---- Index: gtksettings.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gtk/gtksettings.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** gtksettings.py 6 Aug 2003 00:33:48 -0000 1.9 --- gtksettings.py 6 Aug 2003 10:58:40 -0000 1.10 *************** *** 7,10 **** --- 7,16 ---- #mencoder - deinterlacing, aspect ratio, etc + + #all formats have a one pass for audio... + #all video formats have one or two pass options + #SVCD is 1 audio 1 video only + #ogg adds an extra pass for merge + try: import pygtk |