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-01 12:26:00
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv2199/testing Modified Files: guimain-hig.ui Log Message: Disabled by default all but the `Scan DVD' and `Preferences' buttons... Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** guimain-hig.ui 1 Aug 2003 12:19:52 -0000 1.11 --- guimain-hig.ui 1 Aug 2003 12:25:57 -0000 1.12 *************** *** 43,46 **** --- 43,49 ---- <cstring>textLabel1</cstring> </property> + <property name="enabled"> + <bool>false</bool> + </property> <property name="text"> <string>Sa&ve to:</string> *************** *** 115,118 **** --- 118,124 ---- <cstring>textLabel12</cstring> </property> + <property name="enabled"> + <bool>false</bool> + </property> <property name="text"> <string>&Format:</string> *************** *** 147,151 **** </property> <property name="enabled"> ! <bool>true</bool> </property> </widget> --- 153,157 ---- </property> <property name="enabled"> ! <bool>false</bool> </property> </widget> *************** *** 158,161 **** --- 164,170 ---- <property name="name"> <cstring>comboBox72</cstring> + </property> + <property name="enabled"> + <bool>false</bool> </property> <property name="editable"> |
From: <je...@us...> - 2003-08-01 12:19:55
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv376/testing Modified Files: guimain-hig.ui Log Message: Fixed a bug introduced while fixing `Save to:' Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** guimain-hig.ui 1 Aug 2003 12:17:19 -0000 1.10 --- guimain-hig.ui 1 Aug 2003 12:19:52 -0000 1.11 *************** *** 47,51 **** </property> <property name="buddy" stdset="0"> ! <cstring>comboBox7</cstring> </property> </widget> --- 47,51 ---- </property> <property name="buddy" stdset="0"> ! <cstring>comboBox72</cstring> </property> </widget> *************** *** 151,156 **** </widget> <widget class="QComboBox" row="2" column="1" rowspan="1" colspan="2"> <property name="name"> ! <cstring>comboBox7</cstring> </property> <property name="editable"> --- 151,161 ---- </widget> <widget class="QComboBox" row="2" column="1" rowspan="1" colspan="2"> + <item> + <property name="text"> + <string>/home/videos</string> + </property> + </item> <property name="name"> ! <cstring>comboBox72</cstring> </property> <property name="editable"> *************** *** 268,272 **** <tabstop>listView1</tabstop> <tabstop>comboBox5</tabstop> ! <tabstop>comboBox7</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> --- 273,277 ---- <tabstop>listView1</tabstop> <tabstop>comboBox5</tabstop> ! <tabstop>comboBox72</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> |
From: <je...@us...> - 2003-08-01 12:17:22
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv32449/testing Modified Files: guimain-hig.ui Log Message: Added /home/videos to `Save to:' Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** guimain-hig.ui 1 Aug 2003 11:32:27 -0000 1.9 --- guimain-hig.ui 1 Aug 2003 12:17:19 -0000 1.10 *************** *** 197,201 **** </property> <property name="text"> ! <string>&Preferences</string> </property> <property name="iconSet"> --- 197,201 ---- </property> <property name="text"> ! <string>P&references</string> </property> <property name="iconSet"> |
From: <je...@us...> - 2003-08-01 12:07:02
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv26413/testing Modified Files: guisettings-hig.ui Log Message: Changed `Subtitles' to `[ ] Subtitles' Index: guisettings-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guisettings-hig.ui,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** guisettings-hig.ui 29 Jul 2003 23:24:34 -0000 1.2 --- guisettings-hig.ui 1 Aug 2003 12:06:58 -0000 1.3 *************** *** 123,145 **** </property> </widget> - <widget class="QLabel" row="3" column="0"> - <property name="name"> - <cstring>textLabel2_3_2_4</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_4</cstring> - </property> - </widget> <widget class="QLabel" row="2" column="0"> <property name="name"> --- 123,126 ---- *************** *** 385,431 **** </vbox> </widget> - <widget class="QComboBox" row="3" column="1" rowspan="1" colspan="3"> - <item> - <property name="text"> - <string>None</string> - </property> - </item> - <item> - <property name="text"> - <string>English</string> - </property> - </item> - <item> - <property name="text"> - <string>Spanish</string> - </property> - </item> - <item> - <property name="text"> - <string>French</string> - </property> - </item> - <item> - <property name="text"> - <string>German</string> - </property> - </item> - <item> - <property name="text"> - <string>Italian</string> - </property> - </item> - <item> - <property name="text"> - <string>Russian</string> - </property> - </item> - <property name="name"> - <cstring>subTitles_4</cstring> - </property> - <property name="toolTip" stdset="0"> - <string>Select language for subtitles</string> - </property> - </widget> <widget class="QComboBox" row="2" column="1" rowspan="1" colspan="3"> <item> --- 366,369 ---- *************** *** 648,651 **** --- 586,638 ---- </hbox> </widget> + <widget class="QComboBox" row="3" column="1" rowspan="1" colspan="3"> + <item> + <property name="text"> + <string>English</string> + </property> + </item> + <item> + <property name="text"> + <string>Spanish</string> + </property> + </item> + <item> + <property name="text"> + <string>French</string> + </property> + </item> + <item> + <property name="text"> + <string>German</string> + </property> + </item> + <item> + <property name="text"> + <string>Italian</string> + </property> + </item> + <item> + <property name="text"> + <string>Russian</string> + </property> + </item> + <property name="name"> + <cstring>subTitles_4</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="toolTip" stdset="0"> + <string>Select language for subtitles</string> + </property> + </widget> + <widget class="QCheckBox" row="3" column="0"> + <property name="name"> + <cstring>checkBox3</cstring> + </property> + <property name="text"> + <string>&Subtitles</string> + </property> + </widget> </grid> </widget> *************** *** 1467,1470 **** --- 1454,1463 ---- <receiver>videoBitRateSlider_4_2_2</receiver> <slot>setValue(int)</slot> + </connection> + <connection> + <sender>checkBox3</sender> + <signal>toggled(bool)</signal> + <receiver>subTitles_4</receiver> + <slot>setEnabled(bool)</slot> </connection> </connections> |
From: <te...@us...> - 2003-08-01 11:51:48
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv21423 Modified Files: cli.py guimain.py Log Message: Fixed errors found by Jason in: https://sourceforge.net/forum/forum.php?thread_id=911209&forum_id=272293 Namely: 1) CLI launches GUI when track number is chosen from main screen 2) De-interlacing options couldn't be selected in CLI 3) CLI would crash when you hit ENTER without putting in any data on prompt Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli.py,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** cli.py 31 Jul 2003 18:03:19 -0000 1.16 --- cli.py 1 Aug 2003 11:51:44 -0000 1.17 *************** *** 290,299 **** print "" choice = raw_input("> ") - choice = int(choice) try: null = self.dio[choice] except: print output.bold("Invalid option!") ! self.changeDeinterlacing() self.config['deinterlacing'] = choice self.main("settings") --- 290,299 ---- print "" choice = raw_input("> ") try: + choice = int(choice) null = self.dio[choice] except: print output.bold("Invalid option!") ! self.changeDeinterlacing() self.config['deinterlacing'] = choice self.main("settings") *************** *** 313,317 **** choice = int(choice) except ValueError, error_message: ! print output.bold("Invalid value:", error_message) try: null = self.aro[choice] --- 313,318 ---- choice = int(choice) except ValueError, error_message: ! print output.bold("".join(["Invalid value: ", str(error_message)])) ! self.changeAspectRatio() try: null = self.aro[choice] *************** *** 333,337 **** choice = int(choice) except ValueError, error_message: ! print output.bold("Invalid value:", error_message) if choice < 1 or choice > 3: print output.bold("Invalid number!") --- 334,339 ---- choice = int(choice) except ValueError, error_message: ! print output.bold("".join(["Invalid value: ", str(error_message)])) ! self.changePasses() if choice < 1 or choice > 3: print output.bold("Invalid number!") Index: guimain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guimain.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** guimain.py 1 Aug 2003 02:10:41 -0000 1.6 --- guimain.py 1 Aug 2003 11:51:44 -0000 1.7 *************** *** 1191,1194 **** --- 1191,1337 ---- "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#" ] + image1_data = [ + "22 22 110 2", + ".# c None", + "Qt c None", + "#J c #005d00", + "#F c #006500", + ".P c #008d00", + ".O c #009100", + ".B c #009900", + "#n c #007900", + ".6 c #008100", + ".V c #008500", + ".H c #008d00", + ".v c #009100", + ".n c #009900", + ".f c #00a100", + ".a c #10ae00", + "#z c #006900", + "#t c #007100", + ".5 c #008100", + ".U c #008500", + ".G c #008d00", + ".u c #009500", + ".m c #009900", + ".s c #009d00", + ".e c #00a100", + ".j c #08a500", + "#A c #006500", + ".C c #008d00", + "#N c #005d00", + "#q c #007900", + "#m c #007d00", + "#R c #005d00", + "#b c #007d00", + "#u c #006900", + "#P c #005900", + "#M c #005d00", + ".7 c #008100", + "#a c #008500", + ".W c #008900", + ".I c #008d00", + ".w c #009500", + ".o c #009900", + ".g c #00a500", + ".b c #10ae00", + "#K c #005d00", + ".0 c #008500", + ".N c #009100", + ".d c #08a500", + "#I c #005d00", + "#E c #006100", + ".A c #009900", + "#r c #007100", + ".r c #009d00", + "#G c #005d00", + "#y c #006900", + "#s c #006d00", + "#g c #007d00", + ".4 c #008100", + ".T c #008900", + ".F c #009100", + ".k c #009900", + ".l c #009d00", + ".i c #08a500", + ".c c #18b200", + "#Q c #005d00", + "#O c #006d00", + "#L c #007100", + "#B c #007500", + "#H c #007900", + "#o c #007d00", + "#h c #008100", + "#l c #008500", + ".Q c #008900", + "#D c #008d00", + ".X c #009100", + ".q c #009900", + "#x c #009d00", + ".h c #00a100", + "#c c #00ae00", + "#i c #00ba00", + ".8 c #00c200", + "#f c #00ca00", + ".3 c #00ce00", + "#C c #00d200", + ".1 c #00d600", + "#v c #00da00", + "#w c #00de00", + "#k c #00e200", + "#p c #00e600", + "#j c #00ee00", + "#d c #00f600", + "#e c #00fa00", + "#. c #00ff00", + ".J c #089508", + ".x c #089d08", + ".p c #08a508", + "## c #08ea08", + ".9 c #08fa08", + ".2 c #08ff08", + ".M c #10a110", + ".t c #18aa18", + ".D c #18ae18", + ".Y c #18c618", + ".S c #18d618", + ".K c #29c629", + ".Z c #29fa29", + ".z c #31b631", + ".E c #31d631", + ".R c #31fa31", + ".y c #41ce41", + ".L c #52f252", + "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", + "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", + "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", + ".#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.a.b.c", + ".d.e.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.f.g.h.i.j", + ".k.l.m.#.#.#.#.#.#.#.#.#.#.#.#.n.o.p.q.r.s.#", + ".o.t.k.u.#.#.#.#.#.#.#.#.#.v.w.x.y.z.A.B.#.#", + ".C.D.E.F.G.#.#.#.#.#.#.H.I.J.K.L.M.N.O.#.#.#", + ".P.Q.R.S.T.U.#.#.#.V.W.X.Y.Z.R.x.I.#.#.#.#.#", + ".#.0.1.2.3.4.5.6.7.Q.8.9#.##.Q#a.#.#.#.#.#.#", + ".##b#c#d#e#f#g#h#i#j#e#d#k#l#m.#.#.#.#.#.#.#", + ".##n#o#j#j#j.1#p#j#j#j.8#o#q.#.#.#.#.#.#.#.#", + ".#.##r.3#p#p#p#p#p#p#i#s#t.#.#.#.#.#.#.#.#.#", + ".#.##u.h#v#w#v#w#v#x#y#z.#.#.#.#.#.#.#.#.#.#", + ".#.##A#B.1#C.1#C#D#E#F.#.#.#.#.#.#.#.#.#.#.#", + ".#.#.##G#i#f.8#H#I#J.#.#.#.#.#.#.#.#.#.#.#.#", + ".#.#.##K#x#i#L#M#J.#.#.#.#.#.#.#.#.#.#.#.#.#", + ".#.#.##N#O#O#P.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", + ".#.#.##J#Q#R.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#", + "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", + "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", + "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt" + ] + image2_data = [ + "2 2 1 1", + ". c None", + "..", + ".." + ] + + class MainWindow(QMainWindow): *************** *** 1198,1201 **** --- 1341,1346 ---- self.image0 = QPixmap(image0_data) + self.image_tick = QPixmap(image1_data) + self.image_blank = QPixmap(image2_data) if not name: |
From: <je...@us...> - 2003-08-01 11:32:30
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv18620/testing Modified Files: guimain-hig.ui Log Message: Yet simpler. Quit is gone. Rearranged buttons. I like this one more. Feedback?? Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** guimain-hig.ui 1 Aug 2003 11:25:27 -0000 1.8 --- guimain-hig.ui 1 Aug 2003 11:32:27 -0000 1.9 *************** *** 236,240 **** </property> <property name="text"> ! <string>&Rip DVD</string> </property> <property name="iconSet"> --- 236,240 ---- </property> <property name="text"> ! <string>&Copy DVD</string> </property> <property name="iconSet"> *************** *** 263,272 **** </images> <tabstops> - <tabstop>pushButton4</tabstop> <tabstop>pushButton2</tabstop> <tabstop>listView1</tabstop> <tabstop>comboBox5</tabstop> <tabstop>comboBox7</tabstop> - <tabstop>pushButton1</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> --- 263,272 ---- </images> <tabstops> <tabstop>pushButton2</tabstop> + <tabstop>pushButton4</tabstop> + <tabstop>pushButton1</tabstop> <tabstop>listView1</tabstop> <tabstop>comboBox5</tabstop> <tabstop>comboBox7</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> |
From: <je...@us...> - 2003-08-01 11:25:30
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv17741/testing Modified Files: guimain-hig.ui Log Message: Yet another modification. The Quit button is gone. Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** guimain-hig.ui 1 Aug 2003 11:20:55 -0000 1.7 --- guimain-hig.ui 1 Aug 2003 11:25:27 -0000 1.8 *************** *** 10,14 **** <y>0</y> <width>495</width> ! <height>332</height> </rect> </property> --- 10,14 ---- <y>0</y> <width>495</width> ! <height>298</height> </rect> </property> *************** *** 25,29 **** <widget class="QLayoutWidget" row="0" column="0"> <property name="name"> ! <cstring>layout38</cstring> </property> <hbox> --- 25,29 ---- <widget class="QLayoutWidget" row="0" column="0"> <property name="name"> ! <cstring>layout40</cstring> </property> <hbox> *************** *** 162,166 **** <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout36</cstring> </property> <vbox> --- 162,166 ---- <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout39</cstring> </property> <vbox> *************** *** 170,174 **** <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton3</cstring> </property> <property name="font"> --- 170,174 ---- <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton4</cstring> </property> <property name="font"> *************** *** 178,182 **** </property> <property name="text"> ! <string>&Quit</string> </property> <property name="iconSet"> --- 178,182 ---- </property> <property name="text"> ! <string>&Scan DVD</string> </property> <property name="iconSet"> *************** *** 184,188 **** </property> <property name="toolTip" stdset="0"> ! <string>Quit the application</string> </property> </widget> --- 184,188 ---- </property> <property name="toolTip" stdset="0"> ! <string>Scan the DVD for tracks</string> </property> </widget> *************** *** 225,247 **** <widget class="QPushButton"> <property name="name"> - <cstring>pushButton4</cstring> - </property> - <property name="font"> - <font> - <bold>1</bold> - </font> - </property> - <property name="text"> - <string>&Scan DVD</string> - </property> - <property name="iconSet"> - <iconset>image3</iconset> - </property> - <property name="toolTip" stdset="0"> - <string>Scan the DVD for tracks</string> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> <cstring>pushButton2</cstring> </property> --- 225,228 ---- *************** *** 275,301 **** </image> <image name="image1"> ! <data format="XPM.GZ" length="1917">789c5dd5d96eda401406e0fb3c05cab98baa13dbd8c656d58b84ec2b900da87a318c6db60059205bd577eff19cdf56d54c50f8fc9f593cb626bb3b8d7ee7b2b1b3bbf5ba36eba96dd8897969ec649bc5e2f3e7af1fbfb7b6fdb821bf89df08b6bf6d6d77d70ddbb85a2df3123c16506a7dcff39c4d691356a6291c22a7da89cb2d9c209fd47639b7608bfa55655feb3d75e0c1b77008bfd6d6f1ce9d6d90c0056c03adcfd54d0fcee010b67012a4cee566d0286c5a8c775019f9481d7a4ddf79e39c451ef2373845fe0e67f0873af69b5aff55da46711a6a7e58db38dfc319f2bdda9acfd42d1fde8723f8a272e41e36cfe1143e8533d877ceeafa47b8ca17b575fca53af1e1151cc1c3cab1f67f8253e4bdca9a53565bf36738438ef5a43ef21b38823f4bcbf6fbada6f3195ce5319c226fc3999ab8f6c8e591daf86a1a574eb4ff0b1ca1ffa432f2d03997f9b43fa9ebfe57b5359fc346cd099ca7a1cb97ea51a0e6291cc377a5f3d818f85a5dd5535edbba7c00c76a5aa8ad316af7bee7b90dd4dc87e3918eff50ba886d3eca9c4fd459001fc1b18d9c2f9d0bb1cbc9c079e6722ad4790ccf6aebf9d481f33c760ed44500376b6b7d0ac770173685d61fc3f2a38721131b1eb19596b9964b2be4ef9827ddb59e79924d79c6737ee4052fa5ada43df133bff02b4ff4dc948a356ff88ddff9833fa57df19ef4d9975e6dd677f140fa6f243fe4233e463b91d1e67cca677caee7135fc818872ebbe42bbee68e7ceb724fea6ef816358f324a39c61ddff303f7a5cf40f4c0431907e79eacd47763dccb2a3a1cb8599a72a5f74fcd52d679cca15b6720ed54aef4e54ac431b7feabd99759ca9aa5cc52d624725f5a93cb6e2cddbd5cc82c81cc32945952b91213637fca9abdf25e88f8948cacb5472391918a88f45d2b644f679495f72ed7731e50e1be138d694253ace7c9ed694fc6c01ed24c2a98e652a3e38ce5b9ccddbd0ce951767050ae43c698d342ae8ef5ff943cb9b6ecc48d7ccee46edb6e1d132a9f86a115de8d893cd773be654f5a4b9acc40539af29856f26efcf9bef517d333b338</data> </image> <image name="image2"> <data format="XPM.GZ" length="1055">789c55d1cb6ee2301480e13d4f11e11d1a5191c42656358b5e6880164abbaa349a856fe15242b8849650cdbb8f8f8f135a2b42f97edb8923ae3ac1db6c1274ae5a8752944b15a885d8071d7dccf3eacfdfdf5fad768f05f68aed6ffb57abdd0d54302d3606ee85bd27118f122a80064805e57d09fc00b290d124024e1d05e3899b7df4d4c807603feaf790af35790cac3c29f2d951f639f2a5a102a69e1a49804994f4901347698fecf69e3d3972eca9855b3c02f29853e4c051712edde27b4f8d9c01452c7a52034f9e1479745442209f3c8da2c00350c6354ba40c913b4fa6dcdea1a39602b9f534c81ca8a80ab5dbbbf664c87747ad8476ffe0cad32097481d2217404debd90259cfce3d996140ed68b440ee3d0d326be8f62aa0613525d284c83b4f86bc753446206f6a66eec99f9e06b901662c0b915d3b088c2e8eba0929957dfb8f4644a6f57c61be371bf57cb96a1a3e8890c5fb3a3775db4024c56a9d6f2f4d129becaaedeed2f6daa7c3a5d937c2c65d796cdac767e1d3a932fe2ce27c737b2765919fee070f061b1182903425c3e160347e34feccb6da91ee9ec6e7c9b4f90e37f1bc3b4e48fabdd95895b3f4e547b3f1b51c55ed7fd7adff102afcf2</data> </image> - <image name="image3"> - <data format="XPM.GZ" length="1821">789c7dd1594f1b311007f0f77c8a157e43d590bdd7aafac07d07c20d551fbcb6370784331ca1ea77af3d33de42844a10e697f97b3cde5d5a8c2e0ef7a3c5a5ced3544d473ad243f5182d9ae7c964f6f3d78fdf9d85b888dc6f9947c9c2b7ce427f1ae9a877776b3da072105dfc414befa49be84c790b85966996a3a1f44e65aa0bf23e39eb9629fad83b8bb3aaac71ff00adf2bc228fd8923d641b99e1fe57ef3c0979c8d8b2a2fe976855e49417dabb480a2935d60fc9a5d439fac9bb4cabb83668bc4f95cad816e835742d435d9055dc605da065260df7bb25abd89087ec9cfb3db32def6fd05ac59afac7e43aa13aec792b97a77ec2b6a6f7b342ae0bceefb255d360be46bb7e3c4f9f5db0cfd88ae75b66f37cb043d6619ed5d6d81fb6bdebacb6bc5f0773fe85ac13aedf04733d6187f90f5a53ff0bb6e2ba411bad2cdd7f3d98eb0fec70fe15d9f0f3802d6f9deb82f70fd8617fc3b65cef920ddf57003bcc9bb7a6fe27ec70de39dacdc3f7df20b7f91e3be48fd8967d47b6219f7a9bdc84fbcd5a53fd8d6cc3fba9d9617f81b6869f9f30ecd0cf926d783fa7ad69ff353bf41bb1c3f9f7deb6b0e13eef68db847ed3d654dff46edcd3643fb2c3fe09ba693d6637e4fef4ff9fcf1910a0fe97811a3418b0d0c000865f65600463b8861b98b875ec92b7f319b8837bac3df03a8647789acbd45c99ba5eb43ec30bbcce65def89419bcbbbfcbb002abb0369759870d77cea6cb6cc1b6d30eecc21eec7fca2c63aa070770087db7fad4111c7fc89cb8ef7c6a06a77006e76ee21e5cb8f32f3f64aea00b31243851ea4ef4ebbd9b3ffbf47c72770add6dd2debf80f2439f0aa43b9d3302e83f21feddcb25dc4728d76bccf7774f49d442cf67f0b3eae63a154658d188c117efd465fc2a866234f7deff7ceffc05ba9fc710</data> - </image> </images> - <connections> - <connection> - <sender>pushButton3</sender> - <signal>toggled(bool)</signal> - <receiver>mainForm</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>pushButton3</sender> - <signal>clicked()</signal> - <receiver>mainForm</receiver> - <slot>close()</slot> - </connection> - </connections> <tabstops> <tabstop>pushButton4</tabstop> --- 256,265 ---- </image> <image name="image1"> ! <data format="XPM.GZ" length="1821">789c7dd1594f1b311007f0f77c8a157e43d590bdd7aafac07d07c20d551fbcb6370784331ca1ea77af3d33de42844a10e697f97b3cde5d5a8c2e0ef7a3c5a5ced3544d473ad243f5182d9ae7c964f6f3d78fdf9d85b888dc6f9947c9c2b7ce427f1ae9a877776b3da072105dfc414befa49be84c790b85966996a3a1f44e65aa0bf23e39eb9629fad83b8bb3aaac71ff00adf2bc228fd8923d641b99e1fe57ef3c0979c8d8b2a2fe976855e49417dabb480a2935d60fc9a5d439fac9bb4cabb83668bc4f95cad816e835742d435d9055dc605da065260df7bb25abd89087ec9cfb3db32def6fd05ac59afac7e43aa13aec792b97a77ec2b6a6f7b342ae0bceefb255d360be46bb7e3c4f9f5db0cfd88ae75b66f37cb043d6619ed5d6d81fb6bdebacb6bc5f0773fe85ac13aedf04733d6187f90f5a53ff0bb6e2ba411bad2cdd7f3d98eb0fec70fe15d9f0f3802d6f9deb82f70fd8617fc3b65cef920ddf57003bcc9bb7a6fe27ec70de39dacdc3f7df20b7f91e3be48fd8967d47b6219f7a9bdc84fbcd5a53fd8d6cc3fba9d9617f81b6869f9f30ecd0cf926d783fa7ad69ff353bf41bb1c3f9f7deb6b0e13eef68db847ed3d654dff46edcd3643fb2c3fe09ba693d6637e4fef4ff9fcf1910a0fe97811a3418b0d0c000865f65600463b8861b98b875ec92b7f319b8837bac3df03a8647789acbd45c99ba5eb43ec30bbcce65def89419bcbbbfcbb002abb0369759870d77cea6cb6cc1b6d30eecc21eec7fca2c63aa070770087db7fad4111c7fc89cb8ef7c6a06a77006e76ee21e5cb8f32f3f64aea00b31243851ea4ef4ebbd9b3ffbf47c72770add6dd2debf80f2439f0aa43b9d3302e83f21feddcb25dc4728d76bccf7774f49d442cf67f0b3eae63a154658d188c117efd465fc2a866234f7deff7ceffc05ba9fc710</data> </image> <image name="image2"> <data format="XPM.GZ" length="1055">789c55d1cb6ee2301480e13d4f11e11d1a5191c42656358b5e6880164abbaa349a856fe15242b8849650cdbb8f8f8f135a2b42f97edb8923ae3ac1db6c1274ae5a8752944b15a885d8071d7dccf3eacfdfdf5fad768f05f68aed6ffb57abdd0d54302d3606ee85bd27118f122a80064805e57d09fc00b290d124024e1d05e3899b7df4d4c807603feaf790af35790cac3c29f2d951f639f2a5a102a69e1a49804994f4901347698fecf69e3d3972eca9855b3c02f29853e4c051712edde27b4f8d9c01452c7a52034f9e1479745442209f3c8da2c00350c6354ba40c913b4fa6dcdea1a39602b9f534c81ca8a80ab5dbbbf664c87747ad8476ffe0cad32097481d2217404debd90259cfce3d996140ed68b440ee3d0d326be8f62aa0613525d284c83b4f86bc753446206f6a66eec99f9e06b901662c0b915d3b088c2e8eba0929957dfb8f4644a6f57c61be371bf57cb96a1a3e8890c5fb3a3775db4024c56a9d6f2f4d129becaaedeed2f6daa7c3a5d937c2c65d796cdac767e1d3a932fe2ce27c737b2765919fee070f061b1182903425c3e160347e34feccb6da91ee9ec6e7c9b4f90e37f1bc3b4e48fabdd95895b3f4e547b3f1b51c55ed7fd7adff102afcf2</data> </image> </images> <tabstops> <tabstop>pushButton4</tabstop> *************** *** 305,309 **** <tabstop>comboBox7</tabstop> <tabstop>pushButton1</tabstop> - <tabstop>pushButton3</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> --- 269,272 ---- |
From: <je...@us...> - 2003-08-01 11:20:58
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv16963/testing Modified Files: guimain-hig.ui Log Message: Completely new, simpler Qt GUI. Please, feed back. Thanks. Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** guimain-hig.ui 30 Jul 2003 15:40:33 -0000 1.6 --- guimain-hig.ui 1 Aug 2003 11:20:55 -0000 1.7 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>622</width> ! <height>512</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>495</width> ! <height>332</height> </rect> </property> *************** *** 19,31 **** <pixmap>image0</pixmap> </property> ! <vbox> <property name="name"> <cstring>unnamed</cstring> </property> ! <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout10</cstring> </property> ! <vbox> <property name="name"> <cstring>unnamed</cstring> --- 19,31 ---- <pixmap>image0</pixmap> </property> ! <grid> <property name="name"> <cstring>unnamed</cstring> </property> ! <widget class="QLayoutWidget" row="0" column="0"> <property name="name"> ! <cstring>layout38</cstring> </property> ! <hbox> <property name="name"> <cstring>unnamed</cstring> *************** *** 33,43 **** <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout9</cstring> </property> ! <hbox> <property name="name"> <cstring>unnamed</cstring> </property> ! <widget class="QListView"> <column> <property name="text"> --- 33,54 ---- <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout37</cstring> </property> ! <grid> <property name="name"> <cstring>unnamed</cstring> </property> ! <widget class="QLabel" row="1" column="1"> ! <property name="name"> ! <cstring>textLabel1</cstring> ! </property> ! <property name="text"> ! <string>Sa&ve to:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox7</cstring> ! </property> ! </widget> ! <widget class="QListView" row="0" column="0" rowspan="1" colspan="3"> <column> <property name="text"> *************** *** 64,68 **** <column> <property name="text"> ! <string>Rip?</string> </property> <property name="clickable"> --- 75,79 ---- <column> <property name="text"> ! <string>Rip</string> </property> <property name="clickable"> *************** *** 83,483 **** </property> </widget> ! <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout8</cstring> </property> ! <grid> ! <property name="name"> ! <cstring>unnamed</cstring> </property> ! <widget class="QSpinBox" row="8" column="2"> ! <property name="name"> ! <cstring>spinBox3</cstring> ! </property> ! <property name="enabled"> ! <bool>true</bool> ! </property> ! <property name="suffix"> ! <string> MB</string> ! </property> ! <property name="maxValue"> ! <number>4096</number> ! </property> ! <property name="lineStep"> ! <number>5</number> ! </property> ! <property name="value"> ! <number>10</number> ! </property> ! </widget> ! <widget class="QLabel" row="14" column="2"> ! <property name="name"> ! <cstring>textLabel10_2</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="text"> ! <string>kbps</string> ! </property> ! </widget> ! <widget class="QLabel" row="8" column="0"> ! <property name="name"> ! <cstring>textLabel2</cstring> ! </property> ! <property name="enabled"> ! <bool>true</bool> ! </property> ! <property name="text"> ! <string>&Size:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox5</cstring> ! </property> ! </widget> ! <widget class="QLabel" row="14" column="0"> ! <property name="name"> ! <cstring>textLabel6</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="text"> ! <string>&Video:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox8</cstring> ! </property> ! </widget> ! <widget class="QLabel" row="0" column="0"> ! <property name="name"> ! <cstring>textLabel1</cstring> ! </property> ! <property name="text"> ! <string><b>Track</b></string> ! </property> ! </widget> ! <widget class="QComboBox" row="4" column="1" rowspan="1" colspan="2"> ! <item> ! <property name="text"> ! <string>English</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Spanish</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>French</string> ! </property> ! </item> ! <property name="name"> ! <cstring>comboBox5_2</cstring> ! </property> ! </widget> ! <widget class="QComboBox" row="5" column="1" rowspan="1" colspan="2"> ! <item> ! <property name="text"> ! <string>English</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Spanish</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>French</string> ! </property> ! </item> ! <property name="name"> ! <cstring>comboBox6_2</cstring> ! </property> ! <property name="enabled"> ! <bool>true</bool> ! </property> ! </widget> ! <spacer row="2" column="1"> ! <property name="name"> ! <cstring>spacer7_3_2</cstring> ! </property> ! <property name="orientation"> ! <enum>Vertical</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QLabel" row="13" column="2"> ! <property name="name"> ! <cstring>textLabel10</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="text"> ! <string>kbps</string> ! </property> ! </widget> ! <widget class="Line" row="10" column="0" rowspan="1" colspan="3"> ! <property name="name"> ! <cstring>line3</cstring> ! </property> ! <property name="frameShape"> ! <enum>HLine</enum> ! </property> ! <property name="frameShadow"> ! <enum>Sunken</enum> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> ! </property> ! </widget> ! <spacer row="6" column="1"> ! <property name="name"> ! <cstring>spacer7_5</cstring> ! </property> ! <property name="orientation"> ! <enum>Vertical</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QLabel" row="7" column="0" rowspan="1" colspan="3"> ! <property name="name"> ! <cstring>textLabel12</cstring> ! </property> ! <property name="text"> ! <string><b>Ripping</b></string> ! </property> ! </widget> ! <spacer row="15" column="1"> ! <property name="name"> ! <cstring>spacer7_3</cstring> ! </property> ! <property name="orientation"> ! <enum>Vertical</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QCheckBox" row="5" column="0"> ! <property name="name"> ! <cstring>checkBox1</cstring> ! </property> ! <property name="text"> ! <string>Sub&titles:</string> ! </property> ! </widget> ! <widget class="QComboBox" row="14" column="1"> ! <item> ! <property name="text"> ! <string>64</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>128</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>256</string> ! </property> ! </item> ! <property name="name"> ! <cstring>comboBox8</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="editable"> ! <bool>true</bool> ! </property> ! </widget> ! <widget class="QComboBox" row="13" column="1"> ! <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>comboBox7</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="acceptDrops"> ! <bool>false</bool> ! </property> ! <property name="editable"> ! <bool>true</bool> ! </property> ! </widget> ! <widget class="QLabel" row="1" column="0"> ! <property name="name"> ! <cstring>textLabel3</cstring> ! </property> ! <property name="text"> ! <string>&Name:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox7_2</cstring> ! </property> ! </widget> ! <widget class="QComboBox" row="1" column="1" rowspan="1" colspan="2"> ! <property name="name"> ! <cstring>comboBox7_2</cstring> ! </property> ! </widget> ! <widget class="QLabel" row="3" column="0" rowspan="1" colspan="3"> ! <property name="name"> ! <cstring>textLabel1_2</cstring> ! </property> ! <property name="text"> ! <string><b>Language</b></string> ! </property> ! </widget> ! <widget class="QLabel" row="13" column="0"> ! <property name="name"> ! <cstring>textLabel5</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="text"> ! <string>Au&dio:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox7</cstring> ! </property> ! </widget> ! <widget class="QLabel" row="12" column="0" rowspan="1" colspan="3"> ! <property name="name"> ! <cstring>textLabel4</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="text"> ! <string><b>Bitrates</b></string> ! </property> ! </widget> ! <widget class="QCheckBox" row="11" column="0" rowspan="1" colspan="3"> ! <property name="name"> ! <cstring>checkBox2</cstring> ! </property> ! <property name="text"> ! <string>Advan&ced</string> ! </property> ! </widget> ! <widget class="QLabel" row="4" column="0"> ! <property name="name"> ! <cstring>textLabel2_2</cstring> ! </property> ! <property name="text"> ! <string>&Audio:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox5_2</cstring> ! </property> ! </widget> ! <widget class="QComboBox" row="8" column="1"> ! <item> ! <property name="text"> ! <string>CDROM</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>VCD</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>SVCD</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>PDA</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Other =></string> ! </property> ! </item> ! <property name="name"> ! <cstring>comboBox5</cstring> ! </property> ! <property name="enabled"> ! <bool>true</bool> ! </property> ! </widget> ! <spacer row="9" column="1"> ! <property name="name"> ! <cstring>spacer7_4</cstring> ! </property> ! <property name="orientation"> ! <enum>Vertical</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! </grid> </widget> ! </hbox> </widget> <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout79</cstring> </property> ! <hbox> <property name="name"> <cstring>unnamed</cstring> --- 94,168 ---- </property> </widget> ! <spacer row="1" column="2"> <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>200</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QLabel" row="1" column="0"> ! <property name="name"> ! <cstring>textLabel12</cstring> ! </property> ! <property name="text"> ! <string>&Format:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox5</cstring> ! </property> ! </widget> ! <widget class="QComboBox" row="2" column="0"> ! <item> ! <property name="text"> ! <string>MPEG</string> </property> ! </item> ! <item> ! <property name="text"> ! <string>VCD</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>SVCD</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>PDA</string> ! </property> ! </item> ! <property name="name"> ! <cstring>comboBox5</cstring> ! </property> ! <property name="enabled"> ! <bool>true</bool> ! </property> </widget> ! <widget class="QComboBox" row="2" column="1" rowspan="1" colspan="2"> ! <property name="name"> ! <cstring>comboBox7</cstring> ! </property> ! <property name="editable"> ! <bool>true</bool> ! </property> ! </widget> ! </grid> </widget> <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout36</cstring> </property> ! <vbox> <property name="name"> <cstring>unnamed</cstring> *************** *** 485,489 **** <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton1</cstring> </property> <property name="font"> --- 170,174 ---- <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton3</cstring> </property> <property name="font"> *************** *** 493,497 **** </property> <property name="text"> ! <string>Preferences</string> </property> <property name="iconSet"> --- 178,182 ---- </property> <property name="text"> ! <string>&Quit</string> </property> <property name="iconSet"> *************** *** 499,525 **** </property> <property name="toolTip" stdset="0"> ! <string>Set your preferences</string> </property> </widget> - <spacer> - <property name="name"> - <cstring>spacer2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>130</width> - <height>20</height> - </size> - </property> - </spacer> <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton4</cstring> </property> <property name="font"> --- 184,193 ---- </property> <property name="toolTip" stdset="0"> ! <string>Quit the application</string> </property> </widget> <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton1</cstring> </property> <property name="font"> *************** *** 529,533 **** </property> <property name="text"> ! <string>Scan DVD</string> </property> <property name="iconSet"> --- 197,201 ---- </property> <property name="text"> ! <string>&Preferences</string> </property> <property name="iconSet"> *************** *** 535,544 **** </property> <property name="toolTip" stdset="0"> ! <string>Scan the DVD for tracks</string> </property> </widget> <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton3</cstring> </property> <property name="font"> --- 203,229 ---- </property> <property name="toolTip" stdset="0"> ! <string>Set your preferences</string> </property> </widget> + <spacer> + <property name="name"> + <cstring>spacer8_2</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>170</height> + </size> + </property> + </spacer> <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton4</cstring> </property> <property name="font"> *************** *** 548,552 **** </property> <property name="text"> ! <string>Quit</string> </property> <property name="iconSet"> --- 233,237 ---- </property> <property name="text"> ! <string>&Scan DVD</string> </property> <property name="iconSet"> *************** *** 554,558 **** </property> <property name="toolTip" stdset="0"> ! <string>Quit the application</string> </property> </widget> --- 239,243 ---- </property> <property name="toolTip" stdset="0"> ! <string>Scan the DVD for tracks</string> </property> </widget> *************** *** 570,574 **** </property> <property name="text"> ! <string>Rip DVD</string> </property> <property name="iconSet"> --- 255,259 ---- </property> <property name="text"> ! <string>&Rip DVD</string> </property> <property name="iconSet"> *************** *** 579,587 **** </property> </widget> ! </hbox> </widget> ! </vbox> </widget> ! </vbox> </widget> <images> --- 264,272 ---- </property> </widget> ! </vbox> </widget> ! </hbox> </widget> ! </grid> </widget> <images> *************** *** 590,610 **** </image> <image name="image1"> ! <data format="XPM.GZ" length="1055">789c55d1cb6ee2301480e13d4f11e11d1a5191c42656358b5e6880164abbaa349a856fe15242b8849650cdbb8f8f8f135a2b42f97edb8923ae3ac1db6c1274ae5a8752944b15a885d8071d7dccf3eacfdfdf5fad768f05f68aed6ffb57abdd0d54302d3606ee85bd27118f122a80064805e57d09fc00b290d124024e1d05e3899b7df4d4c807603feaf790af35790cac3c29f2d951f639f2a5a102a69e1a49804994f4901347698fecf69e3d3972eca9855b3c02f29853e4c051712edde27b4f8d9c01452c7a52034f9e1479745442209f3c8da2c00350c6354ba40c913b4fa6dcdea1a39602b9f534c81ca8a80ab5dbbbf664c87747ad8476ffe0cad32097481d2217404debd90259cfce3d996140ed68b440ee3d0d326be8f62aa0613525d284c83b4f86bc753446206f6a66eec99f9e06b901662c0b915d3b088c2e8eba0929957dfb8f4644a6f57c61be371bf57cb96a1a3e8890c5fb3a3775db4024c56a9d6f2f4d129becaaedeed2f6daa7c3a5d937c2c65d796cdac767e1d3a932fe2ce27c737b2765919fee070f061b1182903425c3e160347e34feccb6da91ee9ec6e7c9b4f90e37f1bc3b4e48fabdd95895b3f4e547b3f1b51c55ed7fd7adff102afcf2</data> </image> <image name="image2"> ! <data format="XPM.GZ" length="1821">789c7dd1594f1b311007f0f77c8a157e43d590bdd7aafac07d07c20d551fbcb6370784331ca1ea77af3d33de42844a10e697f97b3cde5d5a8c2e0ef7a3c5a5ced3544d473ad243f5182d9ae7c964f6f3d78fdf9d85b888dc6f9947c9c2b7ce427f1ae9a877776b3da072105dfc414befa49be84c790b85966996a3a1f44e65aa0bf23e39eb9629fad83b8bb3aaac71ff00adf2bc228fd8923d641b99e1fe57ef3c0979c8d8b2a2fe976855e49417dabb480a2935d60fc9a5d439fac9bb4cabb83668bc4f95cad816e835742d435d9055dc605da065260df7bb25abd89087ec9cfb3db32def6fd05ac59afac7e43aa13aec792b97a77ec2b6a6f7b342ae0bceefb255d360be46bb7e3c4f9f5db0cfd88ae75b66f37cb043d6619ed5d6d81fb6bdebacb6bc5f0773fe85ac13aedf04733d6187f90f5a53ff0bb6e2ba411bad2cdd7f3d98eb0fec70fe15d9f0f3802d6f9deb82f70fd8617fc3b65cef920ddf57003bcc9bb7a6fe27ec70de39dacdc3f7df20b7f91e3be48fd8967d47b6219f7a9bdc84fbcd5a53fd8d6cc3fba9d9617f81b6869f9f30ecd0cf926d783fa7ad69ff353bf41bb1c3f9f7deb6b0e13eef68db847ed3d654dff46edcd3643fb2c3fe09ba693d6637e4fef4ff9fcf1910a0fe97811a3418b0d0c000865f65600463b8861b98b875ec92b7f319b8837bac3df03a8647789acbd45c99ba5eb43ec30bbcce65def89419bcbbbfcbb002abb0369759870d77cea6cb6cc1b6d30eecc21eec7fca2c63aa070770087db7fad4111c7fc89cb8ef7c6a06a77006e76ee21e5cb8f32f3f64aea00b31243851ea4ef4ebbd9b3ffbf47c72770add6dd2debf80f2439f0aa43b9d3302e83f21feddcb25dc4728d76bccf7774f49d442cf67f0b3eae63a154658d188c117efd465fc2a866234f7deff7ceffc05ba9fc710</data> </image> <image name="image3"> ! <data format="XPM.GZ" length="1917">789c5dd5d96eda401406e0fb3c05cab98baa13dbd8c656d58b84ec2b900da87a318c6db60059205bd577eff19cdf56d54c50f8fc9f593cb626bb3b8d7ee7b2b1b3bbf5ba36eba96dd8897969ec649bc5e2f3e7af1fbfb7b6fdb821bf89df08b6bf6d6d77d70ddbb85a2df3123c16506a7dcff39c4d691356a6291c22a7da89cb2d9c209fd47639b7608bfa55655feb3d75e0c1b77008bfd6d6f1ce9d6d90c0056c03adcfd54d0fcee010b67012a4cee566d0286c5a8c775019f9481d7a4ddf79e39c451ef2373845fe0e67f0873af69b5aff55da46711a6a7e58db38dfc319f2bdda9acfd42d1fde8723f8a272e41e36cfe1143e8533d877ceeafa47b8ca17b575fca53af1e1151cc1c3cab1f67f8253e4bdca9a53565bf36738438ef5a43ef21b38823f4bcbf6fbada6f3195ce5319c226fc3999ab8f6c8e591daf86a1a574eb4ff0b1ca1ffa432f2d03997f9b43fa9ebfe57b5359fc346cd099ca7a1cb97ea51a0e6291cc377a5f3d818f85a5dd5535edbba7c00c76a5aa8ad316af7bee7b90dd4dc87e3918eff50ba886d3eca9c4fd459001fc1b18d9c2f9d0bb1cbc9c079e6722ad4790ccf6aebf9d481f33c760ed44500376b6b7d0ac770173685d61fc3f2a38721131b1eb19596b9964b2be4ef9827ddb59e79924d79c6737ee4052fa5ada43df133bff02b4ff4dc948a356ff88ddff9833fa57df19ef4d9975e6dd677f140fa6f243fe4233e463b91d1e67cca677caee7135fc818872ebbe42bbee68e7ceb724fea6ef816358f324a39c61ddff303f7a5cf40f4c0431907e79eacd47763dccb2a3a1cb8599a72a5f74fcd52d679cca15b6720ed54aef4e54ac431b7feabd99759ca9aa5cc52d624725f5a93cb6e2cddbd5cc82c81cc32945952b91213637fca9abdf25e88f8948cacb5472391918a88f45d2b644f679495f72ed7731e50e1be138d694253ace7c9ed694fc6c01ed24c2a98e652a3e38ce5b9ccddbd0ce951767050ae43c698d342ae8ef5ff943cb9b6ecc48d7ccee46edb6e1d132a9f86a115de8d893cd773be654f5a4b9acc40539af29856f26efcf9bef517d333b338</data> </image> </images> <connections> <connection> - <sender>checkBox1</sender> - <signal>toggled(bool)</signal> - <receiver>comboBox6_2</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> <sender>pushButton3</sender> <signal>toggled(bool)</signal> --- 275,289 ---- </image> <image name="image1"> ! <data format="XPM.GZ" length="1917">789c5dd5d96eda401406e0fb3c05cab98baa13dbd8c656d58b84ec2b900da87a318c6db60059205bd577eff19cdf56d54c50f8fc9f593cb626bb3b8d7ee7b2b1b3bbf5ba36eba96dd8897969ec649bc5e2f3e7af1fbfb7b6fdb821bf89df08b6bf6d6d77d70ddbb85a2df3123c16506a7dcff39c4d691356a6291c22a7da89cb2d9c209fd47639b7608bfa55655feb3d75e0c1b77008bfd6d6f1ce9d6d90c0056c03adcfd54d0fcee010b67012a4cee566d0286c5a8c775019f9481d7a4ddf79e39c451ef2373845fe0e67f0873af69b5aff55da46711a6a7e58db38dfc319f2bdda9acfd42d1fde8723f8a272e41e36cfe1143e8533d877ceeafa47b8ca17b575fca53af1e1151cc1c3cab1f67f8253e4bdca9a53565bf36738438ef5a43ef21b38823f4bcbf6fbada6f3195ce5319c226fc3999ab8f6c8e591daf86a1a574eb4ff0b1ca1ffa432f2d03997f9b43fa9ebfe57b5359fc346cd099ca7a1cb97ea51a0e6291cc377a5f3d818f85a5dd5535edbba7c00c76a5aa8ad316af7bee7b90dd4dc87e3918eff50ba886d3eca9c4fd459001fc1b18d9c2f9d0bb1cbc9c079e6722ad4790ccf6aebf9d481f33c760ed44500376b6b7d0ac770173685d61fc3f2a38721131b1eb19596b9964b2be4ef9827ddb59e79924d79c6737ee4052fa5ada43df133bff02b4ff4dc948a356ff88ddff9833fa57df19ef4d9975e6dd677f140fa6f243fe4233e463b91d1e67cca677caee7135fc818872ebbe42bbee68e7ceb724fea6ef816358f324a39c61ddff303f7a5cf40f4c0431907e79eacd47763dccb2a3a1cb8599a72a5f74fcd52d679cca15b6720ed54aef4e54ac431b7feabd99759ca9aa5cc52d624725f5a93cb6e2cddbd5cc82c81cc32945952b91213637fca9abdf25e88f8948cacb5472391918a88f45d2b644f679495f72ed7731e50e1be138d694253ace7c9ed694fc6c01ed24c2a98e652a3e38ce5b9ccddbd0ce951767050ae43c698d342ae8ef5ff943cb9b6ecc48d7ccee46edb6e1d132a9f86a115de8d893cd773be654f5a4b9acc40539af29856f26efcf9bef517d333b338</data> </image> <image name="image2"> ! <data format="XPM.GZ" length="1055">789c55d1cb6ee2301480e13d4f11e11d1a5191c42656358b5e6880164abbaa349a856fe15242b8849650cdbb8f8f8f135a2b42f97edb8923ae3ac1db6c1274ae5a8752944b15a885d8071d7dccf3eacfdfdf5fad768f05f68aed6ffb57abdd0d54302d3606ee85bd27118f122a80064805e57d09fc00b290d124024e1d05e3899b7df4d4c807603feaf790af35790cac3c29f2d951f639f2a5a102a69e1a49804994f4901347698fecf69e3d3972eca9855b3c02f29853e4c051712edde27b4f8d9c01452c7a52034f9e1479745442209f3c8da2c00350c6354ba40c913b4fa6dcdea1a39602b9f534c81ca8a80ab5dbbbf664c87747ad8476ffe0cad32097481d2217404debd90259cfce3d996140ed68b440ee3d0d326be8f62aa0613525d284c83b4f86bc753446206f6a66eec99f9e06b901662c0b915d3b088c2e8eba0929957dfb8f4644a6f57c61be371bf57cb96a1a3e8890c5fb3a3775db4024c56a9d6f2f4d129becaaedeed2f6daa7c3a5d937c2c65d796cdac767e1d3a932fe2ce27c737b2765919fee070f061b1182903425c3e160347e34feccb6da91ee9ec6e7c9b4f90e37f1bc3b4e48fabdd95895b3f4e547b3f1b51c55ed7fd7adff102afcf2</data> </image> <image name="image3"> ! <data format="XPM.GZ" length="1821">789c7dd1594f1b311007f0f77c8a157e43d590bdd7aafac07d07c20d551fbcb6370784331ca1ea77af3d33de42844a10e697f97b3cde5d5a8c2e0ef7a3c5a5ced3544d473ad243f5182d9ae7c964f6f3d78fdf9d85b888dc6f9947c9c2b7ce427f1ae9a877776b3da072105dfc414befa49be84c790b85966996a3a1f44e65aa0bf23e39eb9629fad83b8bb3aaac71ff00adf2bc228fd8923d641b99e1fe57ef3c0979c8d8b2a2fe976855e49417dabb480a2935d60fc9a5d439fac9bb4cabb83668bc4f95cad816e835742d435d9055dc605da065260df7bb25abd89087ec9cfb3db32def6fd05ac59afac7e43aa13aec792b97a77ec2b6a6f7b342ae0bceefb255d360be46bb7e3c4f9f5db0cfd88ae75b66f37cb043d6619ed5d6d81fb6bdebacb6bc5f0773fe85ac13aedf04733d6187f90f5a53ff0bb6e2ba411bad2cdd7f3d98eb0fec70fe15d9f0f3802d6f9deb82f70fd8617fc3b65cef920ddf57003bcc9bb7a6fe27ec70de39dacdc3f7df20b7f91e3be48fd8967d47b6219f7a9bdc84fbcd5a53fd8d6cc3fba9d9617f81b6869f9f30ecd0cf926d783fa7ad69ff353bf41bb1c3f9f7deb6b0e13eef68db847ed3d654dff46edcd3643fb2c3fe09ba693d6637e4fef4ff9fcf1910a0fe97811a3418b0d0c000865f65600463b8861b98b875ec92b7f319b8837bac3df03a8647789acbd45c99ba5eb43ec30bbcce65def89419bcbbbfcbb002abb0369759870d77cea6cb6cc1b6d30eecc21eec7fca2c63aa070770087db7fad4111c7fc89cb8ef7c6a06a77006e76ee21e5cb8f32f3f64aea00b31243851ea4ef4ebbd9b3ffbf47c72770add6dd2debf80f2439f0aa43b9d3302e83f21feddcb25dc4728d76bccf7774f49d442cf67f0b3eae63a154658d188c117efd465fc2a866234f7deff7ceffc05ba9fc710</data> </image> </images> <connections> <connection> <sender>pushButton3</sender> <signal>toggled(bool)</signal> *************** *** 618,684 **** <slot>close()</slot> </connection> - <connection> - <sender>checkBox2</sender> - <signal>toggled(bool)</signal> - <receiver>comboBox7</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>checkBox2</sender> - <signal>toggled(bool)</signal> - <receiver>textLabel4</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>checkBox2</sender> - <signal>toggled(bool)</signal> - <receiver>textLabel5</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>checkBox2</sender> - <signal>toggled(bool)</signal> - <receiver>textLabel6</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>checkBox2</sender> - <signal>toggled(bool)</signal> - <receiver>comboBox8</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>comboBox5</sender> - <signal>activated(int)</signal> - <receiver>spinBox3</receiver> - <slot>setValue(int)</slot> - </connection> - <connection> - <sender>checkBox2</sender> - <signal>toggled(bool)</signal> - <receiver>textLabel10</receiver> - <slot>setEnabled(bool)</slot> - </connection> - <connection> - <sender>checkBox2</sender> - <signal>toggled(bool)</signal> - <receiver>textLabel10_2</receiver> - <slot>setEnabled(bool)</slot> - </connection> </connections> <tabstops> <tabstop>pushButton4</tabstop> <tabstop>pushButton2</tabstop> - <tabstop>pushButton1</tabstop> - <tabstop>pushButton3</tabstop> <tabstop>listView1</tabstop> - <tabstop>comboBox5_2</tabstop> - <tabstop>checkBox1</tabstop> - <tabstop>comboBox6_2</tabstop> <tabstop>comboBox5</tabstop> - <tabstop>spinBox3</tabstop> - <tabstop>checkBox2</tabstop> <tabstop>comboBox7</tabstop> ! <tabstop>comboBox8</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> --- 297,309 ---- <slot>close()</slot> </connection> </connections> <tabstops> <tabstop>pushButton4</tabstop> <tabstop>pushButton2</tabstop> <tabstop>listView1</tabstop> <tabstop>comboBox5</tabstop> <tabstop>comboBox7</tabstop> ! <tabstop>pushButton1</tabstop> ! <tabstop>pushButton3</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> |
From: <jh...@us...> - 2003-08-01 02:19:32
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv5136 Modified Files: guimain.py guiprogressdialogue.py guisettings.py Log Message: removed clearWState calls which break PyQt 3.5 compatibility Index: guimain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guimain.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** guimain.py 31 Jul 2003 18:10:51 -0000 1.5 --- guimain.py 1 Aug 2003 02:10:41 -0000 1.6 *************** *** 1399,1403 **** self.resize(QSize(507,562).expandedTo(self.minimumSizeHint())) ! self.clearWState(Qt.WState_Polished) self.connect(self.b_ScanDVD,SIGNAL("clicked()"),self.scanDVD) --- 1399,1403 ---- self.resize(QSize(507,562).expandedTo(self.minimumSizeHint())) ! # self.clearWState(Qt.WState_Polished) self.connect(self.b_ScanDVD,SIGNAL("clicked()"),self.scanDVD) Index: guiprogressdialogue.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guiprogressdialogue.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** guiprogressdialogue.py 16 Jul 2003 18:44:31 -0000 1.3 --- guiprogressdialogue.py 1 Aug 2003 02:10:41 -0000 1.4 *************** *** 125,129 **** self.resize(QSize(567,201).expandedTo(self.minimumSizeHint())) ! self.clearWState(Qt.WState_Polished) self.connect(self.b_closeProgressDialogue,SIGNAL("clicked()"),self,SLOT("accept()")) --- 125,129 ---- self.resize(QSize(567,201).expandedTo(self.minimumSizeHint())) ! # self.clearWState(Qt.WState_Polished) self.connect(self.b_closeProgressDialogue,SIGNAL("clicked()"),self,SLOT("accept()")) Index: guisettings.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guisettings.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** guisettings.py 24 Jul 2003 14:13:26 -0000 1.8 --- guisettings.py 1 Aug 2003 02:10:41 -0000 1.9 *************** *** 454,458 **** self.resize(QSize(519,436).expandedTo(self.minimumSizeHint())) ! self.clearWState(Qt.WState_Polished) self.connect(self.b_Cancel,SIGNAL("clicked()"),self,SLOT("accept()")) --- 454,458 ---- self.resize(QSize(519,436).expandedTo(self.minimumSizeHint())) ! # self.clearWState(Qt.WState_Polished) self.connect(self.b_Cancel,SIGNAL("clicked()"),self,SLOT("accept()")) |
From: <je...@us...> - 2003-07-31 18:24:45
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv5983 Modified Files: cli.py dvd.py gui.py quickrip.py Log Message: Tabs for spaces. ;-) Please, confirm... Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** cli.py 24 Jul 2003 14:13:26 -0000 1.15 --- cli.py 31 Jul 2003 18:03:19 -0000 1.16 *************** *** 6,11 **** copyright: (C) 2003, Tom Chance license: GNU General Public License (GPL) (see LICENSE file) ! web: http://quickrip.sf.net ! email: tom...@gm... """ try: --- 6,11 ---- copyright: (C) 2003, Tom Chance license: GNU General Public License (GPL) (see LICENSE file) ! web: http://quickrip.sf.net ! email: tom...@gm... """ try: *************** *** 109,113 **** print "Track %2s information:" % (track['id']) print "(n) Name: \t\t%s" % (track['name']) ! print " Length: \t\t%s" % (track['timelabel']) print "(s) File size: \t%sMB" % (track['size']) print "(v) Video bitrate: \t%skbps" % (track['vbr']) --- 109,113 ---- print "Track %2s information:" % (track['id']) print "(n) Name: \t\t%s" % (track['name']) ! print " Length: \t\t%s" % (track['timelabel']) print "(s) File size: \t%sMB" % (track['size']) print "(v) Video bitrate: \t%skbps" % (track['vbr']) *************** *** 138,142 **** self.ripDVD() self.main("toplevel") ! def askTrack(self): print output.bold("Enter letter/track number to edit information, or 'r' to start ripping") --- 138,142 ---- self.ripDVD() self.main("toplevel") ! def askTrack(self): print output.bold("Enter letter/track number to edit information, or 'r' to start ripping") *************** *** 146,150 **** print "\n\nExiting..." sys.exit(2) ! if choice == 'r': self.main("rip") --- 146,150 ---- print "\n\nExiting..." sys.exit(2) ! if choice == 'r': self.main("rip") *************** *** 161,165 **** elif choice == 'q': self.quit() ! try: choice = int(choice) --- 161,165 ---- elif choice == 'q': self.quit() ! try: choice = int(choice) *************** *** 168,172 **** print output.bold("Invalid track number!") self.askTrack() ! self.main("track", track) def changeDir(self): --- 168,172 ---- print output.bold("Invalid track number!") self.askTrack() ! self.main("track", track) def changeDir(self): *************** *** 180,184 **** self.outdir = path self.main("toplevel") ! def changeVolume(self): #print "" --- 180,184 ---- self.outdir = path self.main("toplevel") ! def changeVolume(self): #print "" *************** *** 192,199 **** if vol < 0 or vol > 10: print output.bold("Invalid volume adjustment!") ! self.changeVolume() self.volumead = vol self.main("toplevel") ! def changeALang(self): langs = "" --- 192,199 ---- if vol < 0 or vol > 10: print output.bold("Invalid volume adjustment!") ! self.changeVolume() self.volumead = vol self.main("toplevel") ! def changeALang(self): langs = "" *************** *** 213,217 **** del success, lang, langchoice self.main("toplevel") ! def changeSLang(self): lang = "" --- 213,217 ---- del success, lang, langchoice self.main("toplevel") ! def changeSLang(self): lang = "" *************** *** 239,243 **** os.system("clear") sys.exit(2) ! def askSettings(self): #print "" --- 239,243 ---- os.system("clear") sys.exit(2) ! def askSettings(self): #print "" *************** *** 272,276 **** print output.bold("Invalid operation!") self.askSettings() ! def changePath(self, type): #print "" --- 272,276 ---- print output.bold("Invalid operation!") self.askSettings() ! def changePath(self, type): #print "" *************** *** 282,286 **** self.config[type] = path self.main("settings") ! def changeDeinterlacing(self): #print "" --- 282,286 ---- self.config[type] = path self.main("settings") ! def changeDeinterlacing(self): #print "" *************** *** 298,302 **** self.config['deinterlacing'] = choice self.main("settings") ! def changeAspectRatio(self): #print "" --- 298,302 ---- self.config['deinterlacing'] = choice self.main("settings") ! def changeAspectRatio(self): #print "" *************** *** 321,325 **** self.config['aspectratio'] = choice self.main("settings") ! def changePasses(self): #print "" --- 321,325 ---- self.config['aspectratio'] = choice self.main("settings") ! def changePasses(self): #print "" *************** *** 369,373 **** self.main("settings") ! def saveSettings(self): #print "" --- 369,373 ---- self.main("settings") ! def saveSettings(self): #print "" *************** *** 393,397 **** sys.exit(2) self.main("settings") ! def changeTrack(self, track): --- 393,397 ---- sys.exit(2) self.main("settings") ! def changeTrack(self, track): *************** *** 403,407 **** print output.bold("\n\nExiting...") sys.exit(2) ! if choice == 'n': self.changeName(track) --- 403,407 ---- print output.bold("\n\nExiting...") sys.exit(2) ! if choice == 'n': self.changeName(track) *************** *** 419,423 **** print output.bold("Invalid operation!") self.changeTrack(track) ! def changeName(self, track): #print "" --- 419,423 ---- print output.bold("Invalid operation!") self.changeTrack(track) ! def changeName(self, track): #print "" *************** *** 430,436 **** track['name'] = name self.main("track", track) ! def changeSize(self, track): ! #print "" print output.bold("\nEnter new file size (MB):") try: --- 430,436 ---- track['name'] = name self.main("track", track) ! def changeSize(self, track): ! #print "" print output.bold("\nEnter new file size (MB):") try: *************** *** 449,453 **** def changeVBR(self, track): ! #print "" print output.bold("\nEnter new video bitrate (kbps):") try: --- 449,453 ---- def changeVBR(self, track): ! #print "" print output.bold("\nEnter new video bitrate (kbps):") try: *************** *** 466,470 **** def changeABR(self, track): ! #print "" print output.bold("\nEnter new audio bitrate (kbps) [64, 96, 128, 160]:") try: --- 466,470 ---- def changeABR(self, track): ! #print "" print output.bold("\nEnter new audio bitrate (kbps) [64, 96, 128, 160]:") try: *************** *** 509,521 **** #print "*** ERROR: No DVD tracks found ***" #print "*** Check:" ! #print "*** - Mplayer and transcode are installed" ! #print "*** - Mplayer can play DVDs" ! #print "*** - There is a DVD in the drive" print """ *** ERROR: No DVD tracks found *** *** Check: ! *** - Mplayer and transcode are installed ! *** - Mplayer can play DVDs ! *** - There is a DVD in the drive """ sys.exit(2) --- 509,521 ---- #print "*** ERROR: No DVD tracks found ***" #print "*** Check:" ! #print "*** - Mplayer and transcode are installed" ! #print "*** - Mplayer can play DVDs" ! #print "*** - There is a DVD in the drive" print """ *** ERROR: No DVD tracks found *** *** Check: ! *** - Mplayer and transcode are installed ! *** - Mplayer can play DVDs ! *** - There is a DVD in the drive """ sys.exit(2) *************** *** 553,557 **** sys.stdout.write("|\n") sys.stdout.write(slashn + passtype + " |") ! self.spinner = "\|/-\|/-" self.spinpos = 0 --- 553,557 ---- sys.stdout.write("|\n") sys.stdout.write(slashn + passtype + " |") ! self.spinner = "\|/-\|/-" self.spinpos = 0 *************** *** 567,572 **** width = float(width) self.jumper = 100 / (width - 20) ! ! n = int(int(perc) / self.jumper) if int(perc) <= 9: --- 567,572 ---- width = float(width) self.jumper = 100 / (width - 20) ! ! n = int(int(perc) / self.jumper) if int(perc) <= 9: *************** *** 596,600 **** def main(): #print "QuickRip v0.6, (C) Tom Chance, 2003" ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) cli = CLI() cli.main() --- 596,600 ---- def main(): #print "QuickRip v0.6, (C) Tom Chance, 2003" ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) cli = CLI() cli.main() Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** dvd.py 30 Jul 2003 21:48:15 -0000 1.27 --- dvd.py 31 Jul 2003 18:03:20 -0000 1.28 *************** *** 6,11 **** copyright: (C) 2003, Tom Chance license: GNU General Public License (GPL) (see LICENSE file) ! web: http://quickrip.sf.net ! email: tom...@gm... """ --- 6,11 ---- copyright: (C) 2003, Tom Chance license: GNU General Public License (GPL) (see LICENSE file) ! web: http://quickrip.sf.net ! email: tom...@gm... """ *************** *** 14,486 **** class DVD: ! """Generic DVD functions for QuickRip: ! loadConfig() - load config file ! createConfig - create config file ! calcRate() - calculates a DivX bitrate ! scanDVD() - scans DVD for tracks, builds data structure ! ripDVD() - takes data structure and rips given tracks ! To use, inherit the class and provide the interface functions DVD() calls: ! 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): ! self.cwd = os.getcwd() ! self.numtitles = 0 ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! #self.configfile = os.path.expanduser("~") + "/.quickriprc" ! self.configfile = os.path.join(os.path.expanduser("~"), ".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! def loadConfig(self): ! # Check config file exists ! if not os.path.isfile(self.configfile): ! self.createConfig() ! # Load configuration options from config file ! config = {} ! parser = ConfigParser.ConfigParser() ! parser.readfp(open(self.configfile, 'r')) ! config['mplayer'] = parser.get("paths", "mplayer") ! config['mencoder'] = parser.get("paths", "mencoder") ! config['tcprobe'] = parser.get("paths", "tcprobe") ! config['outputdir'] = parser.get("paths", "outputdir") ! config['deinterlacing'] = parser.get("mencoder", "deinterlacing") ! config['aspectratio'] = parser.get("mencoder", "aspectratio") ! # Upgrade old configs by catching exceptions ! try: ! config['passes'] = int(parser.get("mencoder", "passes")) ! except: ! config['passes'] = 0 ! parser.set("mencoder", "passes", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['pdamode'] = parser.get("mencoder", "pdamode") ! except: ! config['pdamode'] = 0 ! parser.set("mencoder", "pdamode", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['dvd_device'] = parser.get("paths", "dvd_device") ! except: ! config['dvd_device'] = os.path.join("/", "dev", "dvd") ! parser.set("paths", "dvd_device", config['dvd_device']) ! parser.write(open(self.configfile, 'w')) ! try: ! config['videocodec'] = parser.get("mencoder", "videocodec") ! except: ! config['videocodec'] = 0 ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! return (config, parser) ! def createConfig(self): ! # Find the programs mplayer, mencoder and tcprobe ! paths = config.paths ! mplayer, mencoder, tcprobe = "", "", "" ! for path in paths: ! if os.path.isfile(os.path.join(path, "mplayer")): ! mplayer = os.path.join(path, "mplayer") ! if os.path.isfile(os.path.join(path, "mencoder")): ! mencoder = os.path.join(path, "mencoder") ! if os.path.isfile(os.path.join(path, "tcprobe")): ! tcprobe = os.path.join(path, "tcprobe") ! if not mplayer: ! self.int_configError("mplayer") ! if not mencoder: ! self.int_configError("mencoder") ! if not tcprobe: ! self.int_configError("tcprobe") ! # Find home directory ! outdir = os.path.expanduser("~") ! dvd_device = os.path.join("/", "dev", "dvd") ! # Create config ! parser = ConfigParser.ConfigParser() ! parser.add_section("paths") ! parser.add_section("mencoder") ! parser.set("paths", "mplayer", mplayer) ! parser.set("paths", "mencoder", mencoder) ! parser.set("paths", "tcprobe", tcprobe) ! parser.set("paths", "dvd_device", dvd_device) ! parser.set("paths", "outputdir", outdir) ! parser.set("mencoder", "deinterlacing", 0) ! parser.set("mencoder", "aspectratio", 0) ! parser.set("mencoder", "passes", 3) ! parser.set("mencoder", "pdamode", 0) ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! def calcRate(self, length, audiobr, filesize): ! """Calculate bitrate for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - size of resultant file (MB)""" ! try: ! self.filesize = int(filesize) ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.rate = ((self.filesize * 8192) / self.length) - self.audiobr ! self.rate = self.rate * 0.98 # Correction based on addition of credits and usual error ! return self.rate ! except: ! return 1 ! def calcFileSize(self, length, audiobr, bitrate): ! """Calculate vilesize for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - bitrate of track (Kbps)""" ! try: ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.bitrate = int(bitrate) ! self.filesize = ((self.bitrate + self.audiobr) * self.length) / 8192 ! self.filesize = self.filesize * (1 / 0.98) # Correction based on addition of credits and usual error ! return self.filesize ! except: ! return 1 ! def scanDVD(self): ! """Scan DVD drive for titles with mplayer, and chapters and playback time with tcprobe""" ! self.int_startScanning() ! self.tracks = [] ! # Find number of tracks, audio languages and subtitle languages with MPlayer ! self.numtitles = 0 ! cmd_mplayer = "".join([str(self.config['mplayer']), ' -v dvd:// -identify -quiet -nocache 2>/dev/null']) ! text = os.popen(cmd_mplayer).readlines() ! del cmd_mplayer ! regexp_titl = re.compile('There are (\d.*) titles on this DVD') ! regexp_lang = re.compile('\[open\] audio stream:.*language: (\w*) aid.*') ! regexp_subt = re.compile('\[open\] subtitle.*language: (\w*)') ! for line in text: ! if regexp_titl.search(line): ! self.numtitles = regexp_titl.search(line).group(1) ! elif regexp_lang.search(line): ! lang = regexp_lang.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.alangs.append(lang) ! elif regexp_subt.search(line): ! lang = regexp_subt.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.slangs.append(lang) ! self.alangs.sort() ! self.slangs.sort() ! # Warn user of problems scanning drive ! if not self.numtitles: ! self.int_noTracks() ! # Assume DVD is in english if nothing else ! # TODO: add default language to settings ! if not len(self.alangs): ! self.alangs.append("en") ! self.int_dispDVD() ! # Run through tracks looking for playback times, chapters and cropping ! for i in range(int(self.numtitles) + 1): ! if i > 0: ! cmd_tcprobe = "".join([str(self.config['tcprobe']), " -i ", str(self.config['dvd_device']) + " -T ", str(i) + " 2>&1"]) ! text = os.popen(cmd_tcprobe).readlines() ! del cmd_tcprobe ! regexp_error = re.compile('No such file or directory') ! regexp_time = re.compile('.*title playback time: (.*):(.*):(\d*)\.\d* (\d*) sec') ! regexp_chap = re.compile('.*: (\d*) chapter.*') ! #regexp_scale = re.compile('.* (\d*x\d*) video.*') ! time_label = "" ! numchapters = 0 ! # Look for info in output, line by line ! for line in text: ! if regexp_error.search(line): ! self.int_noTracks() ! return ! if regexp_time.search(line): ! hours = regexp_time.search(line).group(1) ! minutes = regexp_time.search(line).group(2) ! seconds = regexp_time.search(line).group(3) ! time = regexp_time.search(line).group(4) ! time_label = "%2s hrs %2s mins %2s secs" % (hours, minutes, seconds) ! elif regexp_chap.search(line): ! numchapters = regexp_chap.search(line).group(1) ! #elif regexp_scale.search(line): ! # scale = regexp_scale.search(line).group(1) ! ! # Clean up title ! if i < 10: title_label = "".join(["0", str(i)]) ! else: title_label = str(i) ! # TODO ! # Find out length of each chapter ! # Set-up new track ! self.track = {} ! self.track['id'] = i ! self.track['name'] = title_label ! self.track['numchapters'] = int(numchapters) ! self.track['time'] = int(time) ! self.track['timelabel'] = time_label ! self.track['size'] = 680 ! self.track['abr'] = 96 ! self.track['abr_id'] = 1 ! self.track['vbr'] = self.calcRate(int(time), 96, 680) ! #self.track['scale'] = scale ! self.track['rip'] = "no" ! self.tracks.append(self.track) ! self.int_dispTrack(self.track) ! self.int_finishScanning() ! def ripDVD(self): ! """Rip the DVD based on the tracks data structure""" ! self.int_startRipping() ! self.state = "ripping" ! try: ! os.chdir(self.outdir) ! except OSError, msg: ! print "Unable to change to directory %s: %s" % (self.outdir, msg) ! # Build list of tracks to rip ! self.torip = [] ! for track in self.tracks: ! if track['rip'] == 'yes': ! self.torip.append(track) ! self.numrips = len(self.torip) ! # Check PDA mode (universal to all ripping methods) ! if int(self.config['pdamode']) == 0: ! resolution = "720" ! else: ! resolution = "320" ! # Run through selected tracks ripping each one ! i = 0 ! for item in self.torip: ! i = i + 1 ! self.track = item ! self.output = os.path.join(self.outdir, "".join([str(self.track['name']), ".avi"])) ! #self.output = re.sub(' ', '\\ ', self.output) # deprecated by making command a list ! self.int_newTrack(self.track['name'], i, self.numrips, self.track['vbr']) ! self.vol = "" ! self.volumead = str(self.volumead) ! if (self.volumead is not "0"): ! self.vol = "".join([":vol=", self.volumead]) ! ! # Look for cropping ! sstep = int(self.track['time']) / 31 ! if not sstep: ! sstep = 1 ! cmd = "".join(["mplayer -dvd ", str(self.track['id']), " -vop cropdetect -nosound -vo null -frames 10 -sstep ", str(sstep), " 2>/dev/null"]) ! text = os.popen(cmd).readlines() ! regexp = re.compile('.*-vop crop=(\d*:\d*:\d*:\d*).*') ! crop_options = {} ! common_crop = "" ! cc_hits = 0 ! for line in text: ! if regexp.search(line): ! crop = regexp.search(line).group(1) ! try: ! crop_options[crop] = crop_options[crop] + 1 ! if crop_options[crop] > cc_hits: ! common_crop = crop ! except: ! crop_options[crop] = 1 ! self.track['crop'] = common_crop ! # Clean up output dir in case QuickRip crashed out there ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! lameopts = "".join(["cbr=", str(self.track['abr']), str(self.vol)]) ! if self.config['videocodec']: ! ovc = "xvid" ! ovc_opts_type = "-xvidencopts" ! ovc_opts = "".join(["4mv:me_quality=6:mod_quant:quant_range=1-31/1-31:bitrate=", str(int(self.track['vbr']))]) ! else: ! ovc = "lavc" ! ovc_opts_type = "-lavcopts" ! ovc_opts = "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr']))]) ! vop = "".join(["scale,crop=",self.track['crop']]) ! if int(self.config['deinterlacing']) is not 0: ! vop = "".join([vop, ",", self.dio[self.config['deinterlacing']]]) ! if self.config['passes'] is 1: ! all_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", \ ! "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! all_pass.insert(3, "-aspect") ! all_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! all_pass.insert(3, "-slang") ! all_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string = "" ! for bit in all_pass: ! bit = "".join([" ", bit]) ! string = "".join([string, bit]) ! print all_pass ! print string ! # sys.exit(1) ! self.runPass("audio", all_pass) ! elif not self.config['passes'] or self.config['passes'] is 2: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", "-xy", resolution, \ ! "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass.insert(3, "-aspect") ! video_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass.insert(3, "-slang") ! video_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string1 = "" ! string2 = "" ! for bit in audio_pass: ! bit = "".join([" ", str(bit)]) ! string1 = "".join([string1, bit]) ! for bit in video_pass: ! bit = "".join([" ", str(bit)]) ! string2 = "".join([string2, bit]) ! print string1 ! print string2 ! # sys.exit(1) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass) ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! elif self.config['passes'] is 3: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass1 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=1"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! video_pass2 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=2"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass1.insert(3, "-aspect") ! video_pass1.insert(4, self.aro[self.config['aspectratio']]) ! video_pass2.insert(3, "-aspect") ! video_pass2.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass1.insert(3, "-slang") ! video_pass1.insert(4, self.sLanguage) ! video_pass2.insert(3, "-slang") ! video_pass2.insert(4, self.sLanguage) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass1) ! self.runPass("video2", video_pass2) ! ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! os.chdir(self.cwd) ! self.int_finishRipping() ! def runPass(self, name, command): ! # Nasty GUI-specific code to stop GUI running on to other passes when previous ! # pass was cleanly stopped (without exiting the whole program) ! if self.state is "stopped": ! return ! pipe_perc = re.compile('.*f \((.\d)\%\)*') ! pipe_Trem = re.compile('(?P<int>[0-9]+)min') ! perc = 0 ! Trem = 0 ! self.int_newPass(name) ! self.pipe = popen2.Popen4(command) ! pid = self.pipe.pid ! while 1: ! line = self.pipe.fromchild.read(1000) ! if not line:# == '': ! break ! if pipe_perc.search(line): ! perc = pipe_perc.search(line).group(1) ! perc = re.sub(' ', '', perc) ! if pipe_Trem.search(line): ! Trem = pipe_Trem.search(line).group(0) ! self.int_updateProgress(perc, Trem, name) ! os.waitpid(pid, os.WNOHANG) ! ## INHERIT THE CLASS AND SUBSTITUE THESE CLASS METHODS WITH YOUR ! ## OWN UI HOOKS ! def int_startScanning(self): ! pass ! def int_noTracks(self): ! pass ! def int_dispDVD(self): ! pass ! def int_dispTrack(self, track): ! pass ! def int_finishScanning(self): ! pass ! def int_startRipping(self): ! pass ! def int_newTrack(self, name, number, total, vbr): ! pass ! def int_newPass(self, passtype): ! pass ! def int_updateProgress(self, perc, tpass): ! pass ! def int_finishRipping(self): ! pass --- 14,486 ---- class DVD: ! """Generic DVD functions for QuickRip: ! loadConfig() - load config file ! createConfig - create config file ! calcRate() - calculates a DivX bitrate ! scanDVD() - scans DVD for tracks, builds data structure ! ripDVD() - takes data structure and rips given tracks ! To use, inherit the class and provide the interface functions DVD() calls: ! 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): ! self.cwd = os.getcwd() ! self.numtitles = 0 ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! #self.configfile = os.path.expanduser("~") + "/.quickriprc" ! self.configfile = os.path.join(os.path.expanduser("~"), ".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! def loadConfig(self): ! # Check config file exists ! if not os.path.isfile(self.configfile): ! self.createConfig() ! # Load configuration options from config file ! config = {} ! parser = ConfigParser.ConfigParser() ! parser.readfp(open(self.configfile, 'r')) ! config['mplayer'] = parser.get("paths", "mplayer") ! config['mencoder'] = parser.get("paths", "mencoder") ! config['tcprobe'] = parser.get("paths", "tcprobe") ! config['outputdir'] = parser.get("paths", "outputdir") ! config['deinterlacing'] = parser.get("mencoder", "deinterlacing") ! config['aspectratio'] = parser.get("mencoder", "aspectratio") ! # Upgrade old configs by catching exceptions ! try: ! config['passes'] = int(parser.get("mencoder", "passes")) ! except: ! config['passes'] = 0 ! parser.set("mencoder", "passes", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['pdamode'] = parser.get("mencoder", "pdamode") ! except: ! config['pdamode'] = 0 ! parser.set("mencoder", "pdamode", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['dvd_device'] = parser.get("paths", "dvd_device") ! except: ! config['dvd_device'] = os.path.join("/", "dev", "dvd") ! parser.set("paths", "dvd_device", config['dvd_device']) ! parser.write(open(self.configfile, 'w')) ! try: ! config['videocodec'] = parser.get("mencoder", "videocodec") ! except: ! config['videocodec'] = 0 ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! return (config, parser) ! def createConfig(self): ! # Find the programs mplayer, mencoder and tcprobe ! paths = config.paths ! mplayer, mencoder, tcprobe = "", "", "" ! for path in paths: ! if os.path.isfile(os.path.join(path, "mplayer")): ! mplayer = os.path.join(path, "mplayer") ! if os.path.isfile(os.path.join(path, "mencoder")): ! mencoder = os.path.join(path, "mencoder") ! if os.path.isfile(os.path.join(path, "tcprobe")): ! tcprobe = os.path.join(path, "tcprobe") ! if not mplayer: ! self.int_configError("mplayer") ! if not mencoder: ! self.int_configError("mencoder") ! if not tcprobe: ! self.int_configError("tcprobe") ! # Find home directory ! outdir = os.path.expanduser("~") ! dvd_device = os.path.join("/", "dev", "dvd") ! # Create config ! parser = ConfigParser.ConfigParser() ! parser.add_section("paths") ! parser.add_section("mencoder") ! parser.set("paths", "mplayer", mplayer) ! parser.set("paths", "mencoder", mencoder) ! parser.set("paths", "tcprobe", tcprobe) ! parser.set("paths", "dvd_device", dvd_device) ! parser.set("paths", "outputdir", outdir) ! parser.set("mencoder", "deinterlacing", 0) ! parser.set("mencoder", "aspectratio", 0) ! parser.set("mencoder", "passes", 3) ! parser.set("mencoder", "pdamode", 0) ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! def calcRate(self, length, audiobr, filesize): ! """Calculate bitrate for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - size of resultant file (MB)""" ! try: ! self.filesize = int(filesize) ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.rate = ((self.filesize * 8192) / self.length) - self.audiobr ! self.rate = self.rate * 0.98 # Correction based on addition of credits and usual error ! return self.rate ! except: ! return 1 ! def calcFileSize(self, length, audiobr, bitrate): ! """Calculate vilesize for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - bitrate of track (Kbps)""" ! try: ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.bitrate = int(bitrate) ! self.filesize = ((self.bitrate + self.audiobr) * self.length) / 8192 ! self.filesize = self.filesize * (1 / 0.98) # Correction based on addition of credits and usual error ! return self.filesize ! except: ! return 1 ! def scanDVD(self): ! """Scan DVD drive for titles with mplayer, and chapters and playback time with tcprobe""" ! self.int_startScanning() ! self.tracks = [] ! # Find number of tracks, audio languages and subtitle languages with MPlayer ! self.numtitles = 0 ! cmd_mplayer = "".join([str(self.config['mplayer']), ' -v dvd:// -identify -quiet -nocache 2>/dev/null']) ! text = os.popen(cmd_mplayer).readlines() ! del cmd_mplayer ! regexp_titl = re.compile('There are (\d.*) titles on this DVD') ! regexp_lang = re.compile('\[open\] audio stream:.*language: (\w*) aid.*') ! regexp_subt = re.compile('\[open\] subtitle.*language: (\w*)') ! for line in text: ! if regexp_titl.search(line): ! self.numtitles = regexp_titl.search(line).group(1) ! elif regexp_lang.search(line): ! lang = regexp_lang.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.alangs.append(lang) ! elif regexp_subt.search(line): ! lang = regexp_subt.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.slangs.append(lang) ! self.alangs.sort() ! self.slangs.sort() ! # Warn user of problems scanning drive ! if not self.numtitles: ! self.int_noTracks() ! # Assume DVD is in english if nothing else ! # TODO: add default language to settings ! if not len(self.alangs): ! self.alangs.append("en") ! self.int_dispDVD() ! # Run through tracks looking for playback times, chapters and cropping ! for i in range(int(self.numtitles) + 1): ! if i > 0: ! cmd_tcprobe = "".join([str(self.config['tcprobe']), " -i ", str(self.config['dvd_device']) + " -T ", str(i) + " 2>&1"]) ! text = os.popen(cmd_tcprobe).readlines() ! del cmd_tcprobe ! regexp_error = re.compile('No such file or directory') ! regexp_time = re.compile('.*title playback time: (.*):(.*):(\d*)\.\d* (\d*) sec') ! regexp_chap = re.compile('.*: (\d*) chapter.*') ! #regexp_scale = re.compile('.* (\d*x\d*) video.*') ! time_label = "" ! numchapters = 0 ! # Look for info in output, line by line ! for line in text: ! if regexp_error.search(line): ! self.int_noTracks() ! return ! if regexp_time.search(line): ! hours = regexp_time.search(line).group(1) ! minutes = regexp_time.search(line).group(2) ! seconds = regexp_time.search(line).group(3) ! time = regexp_time.search(line).group(4) ! time_label = "%2s hrs %2s mins %2s secs" % (hours, minutes, seconds) ! elif regexp_chap.search(line): ! numchapters = regexp_chap.search(line).group(1) ! #elif regexp_scale.search(line): ! # scale = regexp_scale.search(line).group(1) ! ! # Clean up title ! if i < 10: title_label = "".join(["0", str(i)]) ! else: title_label = str(i) ! # TODO ! # Find out length of each chapter ! # Set-up new track ! self.track = {} ! self.track['id'] = i ! self.track['name'] = title_label ! self.track['numchapters'] = int(numchapters) ! self.track['time'] = int(time) ! self.track['timelabel'] = time_label ! self.track['size'] = 680 ! self.track['abr'] = 96 ! self.track['abr_id'] = 1 ! self.track['vbr'] = self.calcRate(int(time), 96, 680) ! #self.track['scale'] = scale ! self.track['rip'] = "no" ! self.tracks.append(self.track) ! self.int_dispTrack(self.track) ! self.int_finishScanning() ! def ripDVD(self): ! """Rip the DVD based on the tracks data structure""" ! self.int_startRipping() ! self.state = "ripping" ! try: ! os.chdir(self.outdir) ! except OSError, msg: ! print "Unable to change to directory %s: %s" % (self.outdir, msg) ! # Build list of tracks to rip ! self.torip = [] ! for track in self.tracks: ! if track['rip'] == 'yes': ! self.torip.append(track) ! self.numrips = len(self.torip) ! # Check PDA mode (universal to all ripping methods) ! if int(self.config['pdamode']) == 0: ! resolution = "720" ! else: ! resolution = "320" ! # Run through selected tracks ripping each one ! i = 0 ! for item in self.torip: ! i = i + 1 ! self.track = item ! self.output = os.path.join(self.outdir, "".join([str(self.track['name']), ".avi"])) ! #self.output = re.sub(' ', '\\ ', self.output) # deprecated by making command a list ! self.int_newTrack(self.track['name'], i, self.numrips, self.track['vbr']) ! self.vol = "" ! self.volumead = str(self.volumead) ! if (self.volumead is not "0"): ! self.vol = "".join([":vol=", self.volumead]) ! ! # Look for cropping ! sstep = int(self.track['time']) / 31 ! if not sstep: ! sstep = 1 ! cmd = "".join(["mplayer -dvd ", str(self.track['id']), " -vop cropdetect -nosound -vo null -frames 10 -sstep ", str(sstep), " 2>/dev/null"]) ! text = os.popen(cmd).readlines() ! regexp = re.compile('.*-vop crop=(\d*:\d*:\d*:\d*).*') ! crop_options = {} ! common_crop = "" ! cc_hits = 0 ! for line in text: ! if regexp.search(line): ! crop = regexp.search(line).group(1) ! try: ! crop_options[crop] = crop_options[crop] + 1 ! if crop_options[crop] > cc_hits: ! common_crop = crop ! except: ! crop_options[crop] = 1 ! self.track['crop'] = common_crop ! # Clean up output dir in case QuickRip crashed out there ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! lameopts = "".join(["cbr=", str(self.track['abr']), str(self.vol)]) ! if self.config['videocodec']: ! ovc = "xvid" ! ovc_opts_type = "-xvidencopts" ! ovc_opts = "".join(["4mv:me_quality=6:mod_quant:quant_range=1-31/1-31:bitrate=", str(int(self.track['vbr']))]) ! else: ! ovc = "lavc" ! ovc_opts_type = "-lavcopts" ! ovc_opts = "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr']))]) ! vop = "".join(["scale,crop=",self.track['crop']]) ! if int(self.config['deinterlacing']) is not 0: ! vop = "".join([vop, ",", self.dio[self.config['deinterlacing']]]) ! if self.config['passes'] is 1: ! all_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", \ ! "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! all_pass.insert(3, "-aspect") ! all_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! all_pass.insert(3, "-slang") ! all_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string = "" ! for bit in all_pass: ! bit = "".join([" ", bit]) ! string = "".join([string, bit]) ! print all_pass ! print string ! # sys.exit(1) ! self.runPass("audio", all_pass) ! elif not self.config['passes'] or self.config['passes'] is 2: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", "-xy", resolution, \ ! "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass.insert(3, "-aspect") ! video_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass.insert(3, "-slang") ! video_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string1 = "" ! string2 = "" ! for bit in audio_pass: ! bit = "".join([" ", str(bit)]) ! string1 = "".join([string1, bit]) ! for bit in video_pass: ! bit = "".join([" ", str(bit)]) ! string2 = "".join([string2, bit]) ! print string1 ! print string2 ! # sys.exit(1) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass) ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! elif self.config['passes'] is 3: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass1 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=1"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! video_pass2 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=2"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass1.insert(3, "-aspect") ! video_pass1.insert(4, self.aro[self.config['aspectratio']]) ! video_pass2.insert(3, "-aspect") ! video_pass2.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass1.insert(3, "-slang") ! video_pass1.insert(4, self.sLanguage) ! video_pass2.insert(3, "-slang") ! video_pass2.insert(4, self.sLanguage) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass1) ! self.runPass("video2", video_pass2) ! ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! os.chdir(self.cwd) ! self.int_finishRipping() ! def runPass(self, name, command): ! # Nasty GUI-specific code to stop GUI running on to other passes when previous ! # pass was cleanly stopped (without exiting the whole program) ! if self.state is "stopped": ! return ! pipe_perc = re.compile('.*f \((.\d)\%\)*') ! pipe_Trem = re.compile('(?P<int>[0-9]+)min') ! perc = 0 ! Trem = 0 ! self.int_newPass(name) ! self.pipe = popen2.Popen4(command) ! pid = self.pipe.pid ! while 1: ! line = self.pipe.fromchild.read(1000) ! if not line:# == '': ! break ! if pipe_perc.search(line): ! perc = pipe_perc.search(line).group(1) ! perc = re.sub(' ', '', perc) ! if pipe_Trem.search(line): ! Trem = pipe_Trem.search(line).group(0) ! self.int_updateProgress(perc, Trem, name) ! os.waitpid(pid, os.WNOHANG) ! ## INHERIT THE CLASS AND SUBSTITUE THESE CLASS METHODS WITH YOUR ! ## OWN UI HOOKS ! def int_startScanning(self): ! pass ! def int_noTracks(self): ! pass ! def int_dispDVD(self): ! pass ! def int_dispTrack(self, track): ! pass ! def int_finishScanning(self): ! pass ! def int_startRipping(self): ! pass ! def int_newTrack(self, name, number, total, vbr): ! pass ! def int_newPass(self, passtype): ! pass ! def int_updateProgress(self, perc, tpass): ! pass ! def int_finishRipping(self): ! pass Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** gui.py 31 Jul 2003 17:18:33 -0000 1.19 --- gui.py 31 Jul 2003 18:03:20 -0000 1.20 *************** *** 6,11 **** copyright: (C) 2003, Tom Chance license: GNU General Public License (GPL) (see LICENSE file) ! web: http://quickrip.sf.net ! email: tom...@gm... """ --- 6,11 ---- copyright: (C) 2003, Tom Chance license: GNU General Public License (GPL) (see LICENSE file) ! web: http://quickrip.sf.net ! email: tom...@gm... """ *************** *** 13,30 **** from dvd import * try: ! from qt import * except: ! print """ ! Unable to load the PyQt module! ! Check it's installed properly. ! If you think it is, but you still get this message, please ! see the frequent problems page online at ! http://quickrip.sf.net/fp.shtml ! ! Press Enter for the full Qt error message ! """ ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings --- 13,30 ---- from dvd import * try: ! from qt import * except: ! print """ ! Unable to load the PyQt module! ! Check it's installed properly. ! If you think it is, but you still get this message, please ! see the frequent problems page online at ! http://quickrip.sf.net/fp.shtml ! ! Press Enter for the full Qt error message ! """ ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings *************** *** 44,312 **** class GUI(DVD, MainWindow): ! """GUI-specific functions to add a Qt GUI to the DVD class: ! changeState() - start/stop the ripping process ! int_startScanning() - notify user that the DVD is being scanned ! int_noTracks() - notify user that no tracks were found ! int_dispDVD() - display information about the DVD ! int_dispTrack() - display information about scanned track ! int_finishScanning() - notify user that scanning has finished ! int_startRipping() - notify user that ripping has started ! int_newTrack() - notify that ripping has begun on a new track ! int_newPass() - notify that new ripping pass has begun ! int_updateProgress() - update any ripping progress display being used ! int_finishRipping() - notify user that ripping has finished""" ! def __init__(self, app, parent=None): ! self.app = app ! MainWindow.__init__(self, parent) ! self.setIcon(QPixmap(config.icon)) # set application icon... ! self.DVD_DEVICE = "/dev/dvd" ! self.cwd = os.getcwd() ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! self.configfile = os.path.join(os.path.expanduser("~"),".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! self.outputDir.setText(self.config['outputdir']) ! self.outdir = self.config['outputdir'] ! def int_configError(self, bin): ! self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") ! sys.exit(2) ! def int_startScanning(self): ! print "* Scanning DVD..." ! self.b_ScanDVD.setText("Scanning...") ! self.dvdTracks.clear() ! def int_noTracks(self): ! QMessageBox.warning(self, "QuickRip Error", "QuickRip was unable to find any " ! "DVD tracks.\n\nCheck:\n* Mplayer and Transcode are " ! "installed\n* The program paths are correct in Settings\n" ! "* Mplayer can play DVDs\n* You have a DVD " ! "in your drive", "OK") ! self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): ! #print "Found %s titles" % (self.numtitles) ! #print "Found audio languages %s" % (self.alangs) ! #print "Found subtitle languages %s" % (self.slangs) ! print "Found %s titles\nFound audio languages %s\nFound subtitle languages %s\n" % \ ! (self.numtitles, self.alangs, self.slangs) ! # Add languages to drop-down menus ! for lang in self.alangs: ! self.aLang.insertItem(lang, -1) ! for lang in self.slangs: ! self.subTitles.insertItem(lang, -1) ! def int_dispTrack(self, track): ! self.track = track ! print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = QListViewItem(self.dvdTracks,None) ! item.setText(0, self.track['name']) ! item.setText(1, str(self.track['timelabel'])) ! item.info = self.track ! for i in range(int(self.track['numchapters']) + 1): ! if i > 0: ! if i < 10: i = "0" + str(i) ! chap_label = "Chapter %s" % (i) ! subitem = QListViewItem(item,None) ! subitem.setText(0, self.tr(chap_label)) ! self.app.processEvents() ! def int_finishScanning(self): ! print "* Finished scanning" ! self.b_ScanDVD.setText("Scan DVD") ! def int_startRipping(self): ! print "* Starting ripping" ! def int_newTrack(self, name, number, total, vbr): ! print "*\tRipping track '%s' (%s of %s) at %skbps" % (name, number, total, vbr) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def int_newPass(self, passtype): ! self.passtype = passtype ! if self.passtype is "video1": ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.passtype is "video2": ! self.Dialogue.pm_videoPass1.setProgress(100) ! def int_updateProgress(self, perc, trem, tpass): ! self.percentage = perc ! self.trem = trem ! self.tpass = tpass ! eta = "".join(["ETA: ", str(trem), " (approximately)"]) ! self.Dialogue.l_ETA.setText(eta) ! if self.tpass is "all": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "audio": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "video1": ! self.Dialogue.pm_videoPass1.setProgress(int(perc)) ! elif self.tpass is "video2": ! self.Dialogue.pm_videoPass2.setProgress(int(perc)) ! self.app.processEvents() ! def int_finishRipping(self): ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_videoPass1.setProgress(100) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_videoPass2.setProgress(100) ! print "* Ripping finished" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.l_ETA.setText("ETA: N/A") ! self.state = "stopped" ! os.chdir(self.cwd) ! def selectTrack(self, const, qpoint, col): ! """Select tracks to rip by setting column 2 to 'yes'""" ! # Check the mouse isn't clicking in blank space ! self.track = self.dvdTracks.selectedItem() ! try: ! checker = self.track.text(0) ! del checker ! except: ! return ! # Check if the user has clicked on a title or a chapter ! chap = re.compile('Chapter.*') ! if not chap.search(str(self.track.text(0))): ! # Stop short of tagging for ripping unless "Rip" column is selected ! if col is not 2: ! self.updateTrackDisplay(self.track) ! return ! if self.track.info['rip'] is "yes": ! self.track.setPixmap(2, self.image_blank) ! self.updateTrackRip(self.track, mode="remove") ! else: ! self.track.setPixmap(2, self.image_tick) ! self.updateTrackRip(self.track, mode="add") ! self.checkEnableRip() ! def updateTrackDisplay(self, track): ! self.track = track ! self.track.info['name'] = self.track.text(0) ! if abs(int(str(self.fileSize.cleanText())) - self.track.info['size']) > 1: ! self.fileSize.setValue(self.track.info['size']) ! if abs(self.audioBitRate.currentItem() - self.track.info['abr_id']) > 1: ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.track.info['abr'] = self.audioBitRate.currentText() ! if abs(int(str(self.videoBitRate.cleanText())) - self.track.info['vbr']) > 1: ! self.videoBitRate.setValue(self.track.info['vbr']) ! self.videoBitRateSlider.setValue(self.track.info['vbr']) ! def updateTrackRip(self, track, mode): ! """Update track's rip attribute""" ! if not len(self.tracks): ! return ! # Add/remove "rip" status to/from track ! self.mode = mode ! if self.mode is "remove": ! self.track.info['rip'] = "no" ! elif self.mode is "add": ! self.track.info['rip'] = "yes" ! self.updateTrackDisplay(self.track) ! def newFileSize(self, filesize): ! self.track = self.dvdTracks.selectedItem() ! self.filesize = int(str(self.fileSize.cleanText())) ! self.track.info['size'] = int(self.filesize) ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! #print "new file size, changing video bitrate to %s (size: %s, length %s, abr %s)" % (self.track.info['vbr'], self.track.info['size'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.bitrate = int(str(self.videoBitRate.cleanText())) ! self.track.info['vbr'] = self.bitrate ! self.track.info['size'] = self.calcFileSize(self.track.info['time'], self.track.info['abr'], self.track.info['vbr']) ! #print "new bitrate, changing file size to %s (vbr: %s, length %s, abr %s)" % (self.track.info['size'],self.track.info['vbr'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newAudioBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.audiobitrate = int(str(self.audioBitRate.currentText())) ! print self.audiobitrate ! self.track.info['abr'] = self.audiobitrate ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! self.updateTrackDisplay(self.track) ! def checkEnableRip(self): ! r = str(self.videoBitRate.cleanText()) ! o = str(self.outputDir.text()) ! t = 0 ! for track in self.tracks: ! if track['rip'] is "yes": ! t = 1 ! if len(r) > 0 and len(o) > 0 and t is 1: ! self.b_RipDVD.setEnabled(1) ! else: ! self.b_RipDVD.setEnabled(0) ! def renameTrack(self, item): ! """Set ViewListItem to be renamed""" ! self.item = item ! self.item.setRenameEnabled(0, 1) ! self.item.startRename(0) ! def browseHD(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.outputDir.setText(str(directory)) ! self.outdir = str(directory) ! self.checkEnableRip() ! def openRipDialogue(self): ! try: ! os.chdir(config.qr_dir) ! except OSError, msg: ! print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" ! #import output ! #print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 282, GUI.PY)") ! self.state = "stopped" ! self.Dialogue = dialogueProgress(self) ! self.Dialogue.connect(self.Dialogue.b_changeState,SIGNAL("clicked()"),self.changeState) ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! # Add in progress bars appropriate to number of passes ! l_audiopass = QHBoxLayout... [truncated message content] |
From: <je...@us...> - 2003-07-31 18:12:54
|
Update of /cvsroot/quickrip/quickrip/ui In directory sc8-pr-cvs1:/tmp/cvs-serv7572/ui Modified Files: guimain.ui Log Message: Reduced window size a little. Index: guimain.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/ui/guimain.ui,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** guimain.ui 17 Jul 2003 13:12:14 -0000 1.3 --- guimain.ui 31 Jul 2003 18:10:51 -0000 1.4 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>634</width> ! <height>644</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>507</width> ! <height>562</height> </rect> </property> *************** *** 746,750 **** <images> <image name="image0"> ! <data format="XPM.GZ" length="82294">789ced9d5973f248b3e7efcfa7e838757762a20ed8802126e602f08a176c63e365622e54924abbe40563ec89f9ee53526696b581c17efaeda7fb7557137e7e682b55a5fe95598bf8effffae3f6fcf48ffffaefff789e1933cffcc3748da73ffecb7a89a2b7fffd7ffed7fffd8fffdcdedafea3d968a8cf4ef78fadfffc1ffff19fdcf8c3fce32c89ed0c581e9e15b046f65fca56acb99b6ddf476ec1767983dcc5ed3b1977e9783ed19c6d37ae91f17823d09c6d973672178f3fd09c6d677d6413f79f02371b4dc8afa119f2f39e72f323ff3131eccfde90f1fac22286ed661b19f3c33ccd70be8018f6f704b209fb876f9a21ff3362d85f6e0337b1bc588718b673cc4f13f3c307197775fecf3567e70f2f91f17eb84f8cfb6f6bceb6c71632de9fb7a719f2bb458cc78f91f1fe5853335ccf2386fd830760ba3f63a119ecc140c6fc465362bcdf3bcd90df1e32e6871f6aceb6db73e2ad6cbb784336d11e9294b71a545ebc8f8ce7672d62389e3d22e3f9d93e316c8f0432debfdb2186fcd9a666b8df31b0beff5762d8dfbf44c6e7c37cd70cfb9f13637d3c68ceb67b1132d6a775ab39dbee5c11c3f1a24d0cf7930c90f17e923e315eef4a3394df35311c1fc6c05b783f51473394df8818f637f5f6ad5eb6dd47c6f28fde893b4676bdacfeb77a54feec00b849e76b2263799931313e6f179ab3ed56440cc7c7efc8585ee621311cefe8ed686f0631e43f7c41c6e7c37ed20ce73b26c6fab63443fdb8c05bf8bcc81dcdb07d4e8cf571a619ea7f9f18eec7669ab3fc4597c874ff43627c5ee69ab3fde35b64bc5f6e13c3f600cb6f0bebdf38d09c6df7b781b7d503969d3f3b7ebb49f5653791496fa7c470bc192263f9db33cd50fe8218cb9fce8fe5ed6bc6f6e15d3394970f4ce56d9a9a414f1f88f17979d70cf579440cf7235f91f1f975de34c3f34bd7c3fb8d4e3443fb73470ce7739f91f1790e3e18f2774f8cf66d11c3f1de4c33d417ed8ff72ff688f1f9353567fb73ba7f733babbfe806781bef3f792286e3fd53cd70fc2d311ccfb03eb65bc01694877ebec26dcd50be0d64ac3fb7ab19da8b1630d557f4440cdbdd0532d6877fa119eeff9c189fa7866638df1d31d6ef2332d5c79666b0b72e31ee1f23a31ec4afc468ef63cd909f8018f5e80a781befcf3e21467b3ed00cfed0333194bf3543c6fb8b279a414ff688617f714c0cf5c39f3483fdbc23e3fd8574be2eee3fd40cf54fe737818d1d62d003ff4873a6ef56666f2dfdbc46c79ae1fe16c0fa79bcd60ccf83450cf90b46c878ff16d70cf78fe7277d8b1832d5d79b66b0a73e315e3fd10cf5e3026fa39eb85233e4ff8518f50cafbf8df669879ac19e0e8931ff2f9ac11f3a25467bb941c6fab19e89a17e923d647cbe134e0cdbc55433b4c70931d49781e76fa19ec7079ab3fa8b303f2db41f1611c3fe81a939db5f42f918547fe20619efcf1c11637bf1824cfac089f1fecf91b1fe828418f503ecc5a0fa71fac4680fcfc8581f2e27c6f3ebeda85fa7c8a80721d30cfa981063fde1fd6da33dc527c4d87e3e12c3f99d36700bf317f488d1be5f35437d06c470bcd72286f2b7e6c8f8bc3b3bc4b8bfa519daef0531b6df13cd59fdf978bf2d7cde139b18ede55073b67f70818cf615d3f5d1bed85c73b67f7843dcce22572fabfff6967e7e3d62f4ff7ac8681f62408c7a7c898ce52dee8175fd06c4501ee11332d66f146b86f69c11c3f1ce0332da9f7bac19f4658718f33f046ea13ddad7c4182f1c21637dc417c8e4afbbc4507ee13e3296af47e7c3f20d3ccd59f98a4b6228df4000b7d15efc86e66c7f6611e3fe73e4369e3fd60cfe7a480cfb1b1f0cf693b56f6d83fc13b38b8cf51330cdd09e2193bf219ac858dfc12332f9df77c458de3d62d413b87f83ca3f3634c3f3794f8cfa71a619ea4710637ef476c8af3d42463d613d62f4a72264d487f85233d8cb0131d6f7a366383f6e6fd3f36f12437d38179ab3f2b689b1becc4762a81f696acef637cf917bb09d059ae1791e205b681f2fc4b05d64fad8d9a2fa0ac69ac11f7091e9f98d3483bdc7c054fee60331fa1f67c4509eae8f8ce51dcf3543fd87c4707e798f8ccfb7d342a6f65f33fa87783fed06fa43dbc878bf6c48dcc9ca2bc1eb779ab8dd24c6edbb9ae1793090b1fcd93331ec6fb534c3f3953d2f1d43f757ec2153ff045ccfa0fe8578884cf71b1063fbb4ab19fc9d6d64ea6f7b27c678fe1078ab01f9b16c648cd7ed1be42ededf3530d5b771a119eca18f8cf62d6e91f1f9f746c450dff11498eadbbb47c6fb33cf88f17a9e6668ff2e89e17cf60099faef9a9a215e96c4a8578c188ef7f789e17970c17ed5f307e7134362b49f09721beb03ecd7207b891e91f1f9b4bb9aa1bc2f89c13ed84233b49f2d647c7ec34073b63db92686e3f95833d817966fc7029657c43bdbd9f1609fc64e734764f5913dcf3bdb14cf7baf9a21de7e46267d3b0226ffcf11c468bf7bc8f8fc0667c4d8bf78886ca2fdbd1143fecc5be0ed06b0c0fc917d456d62a83fc341c6fa15c8a4e7e69018f6970364d4f3d84426bd9812a37ddf11a37ff1084cf6e1da9ae1796b20a37d980931b6efc7c83dd42b620bcf8ff9eda01e85a166282f8b18cac7c7fcef34c15e7c4e8cf6111163f95e23b781833dcd993d58d9f3b32374bc3e2746bdef03537db36b64acdf70814cfef5a966d0278718ed67864cfd6d78bded16e4c7b945ee021b503e82ead76820a33d48b03741edabe923b7713bde1f95bf176806ff9f11c3fd1873626caf9e902d7cfea1fc45a78df677818ccf6f00f62476f0f9765e88e17e12ccef0e3ebf91458cf5f5aa39db3fbc42a6f62b26c6ede7c0aa78331659bcd2dd267f3a94c858dea2438cfd413d608a7fe30e31c66f1632b6171147a6feab2b647c9ed9257117eee70558c943c6c629323e5fde1c98fc516f1719ebcb7e26c6786e828cf5e1bd6906fd6f10637c3600ee3471ff1d647c5edd43e01d0bf2971c0077f1f909bb9ab3f2659218f6b79e34437d4c91b1be59488ce7dfd70cf595b5975d41faeabf2153ff6f9f18fb1b7790b1fcdd3d608a97c313cda0e78fc8d4bfb94f8cfe431b199f5f79488cf1d60c19ed2581fb13ad16dc8f8834c3fd8f91f1f965bbc4b0dd9f2363fc6337887badcc5ef07ea8fea27b60aabf586a86fbb922c6fd693bd66fbca519f6e7c4787dbcdf0ed9db9166d0f77364b4b7440077514f9343cdd9fdc95362b8dfc845c6e7dd3f2186fd85410cfbc70fc8a8fffc8c18b6dbafc4505e36eedf43fb930e31966766ffbd16d98bb9858cf5298f81a9fe7ddc4ef1993434833eb489b1bd7801a6f82cd825063d4d1e9051df13898cf1b03d24c6f27488c1bee23b648c8fe32e31dcaf1111c3fd46d7c0aaba617b420cdb05e68fecc57b4246fb300362d48fa666d0fb1931c6df983fb21fafa919fcef7b6238dec1fc933d490ebc83f66d4e90db98df7d60651f597948cc6f17fd8160480cdba36762383e1901f750afb84b0cdbc30364d2234e0cdb65a8d9ccce9fb5773d93ecc9de42a6f6e45d339417e4c7a478d2dc2506fb36de90a9ff7e488cede721329d1fcad3247bf37735437b1e12a37fb2838cfa9758c06d6c8f12b01f93eacf181163fd1f6886f1ab2364acbf785733d4f72d31f6cf81fd9954bfee9666787ef0f81dd4abc02086fb6717c450fe6c80dc034e2e890db07f0fd9c2785233d4a7df22c6fdc1de4daa7f3f2686f3fb67c8e89f8477c4b03f3f27c6fcb9c816b00df6641a4d3c5fa6ef468bfa1bac6d62f477b79069bce38918b60747c02d8ccf4c3cbe45f16a47333c6f0d62b4a71362b81f07cf4ff16870a219c60b7ac4389ef0004cf51b9f0153fd1a26318ea7ec11835e783632d677e86806ffcc2746bdb82706fde41d62a83f49e727fd79d00cf9bf42467b659c188ee778fe6e13386821e3f99373e01eb63f618f18db974b623c1eefcf407d618c18af87f931f0fca6ad39b38f18eac3a4fab73c62d48b6d648c0f639b18f57c024cf19abd0fbc837aed3e226379258666f00f8e89617fe96906fb7b43c6f2b42d62d81e2f88a1bc9c04b88bf691e0f9bbf47cb589a13c44ac39db1eee21f7d09fef1343f972490cfb3b0cd90276f1fea93ea440a6f2bfd00cd77b4736401f833b62ac3f5373b67f708d6cc3fe8c8eb761bb79432cb2e38d4cbf448bea4f4e88d1bfd7dbb1bedf89e17935b690295e3f23c6fe812631ec6f4b60dd1fd0d70cfaf2488cfec71099fa1747c0644fde5833f887981f8affed53e00ec56b47c470ff7e00bcd304765bc874fcbb66f0ffdbc4a8e7db9ac15fd1c743f98787c83ddc7e4f8cfe13960fd96f78ac19ecdf26c6f1285733f417ee1043fd782130d9b7ef6886f3cd88f17cf79aa1bf0acba74bfd6b1362ec4fc3faeae2f3ea7ac4e8df6846fdc1fc76f1fe7cba3ef943747d7c3ecc6762a88f08cbaf87ed5572420cfb8b9018f6f7a6c064ffa1410cc77be7c4b0bfc4f3892d7cfe9f88f1f96a11c3fe0ccf273ac0c929b19459f9a0fd0b4358d9f5b2e75558f43cd870bf96b26fd0a37de036b6b7c11332966ff88c8ce517807d58648f4e4c0ccf8f3b2586fe27c72086e7291a20e3f9852086fc3a0e32f953b89decc73922c6f19c09318e673791d17ebc53cd30dfa0814cede39966887fc7c8d4bfa319eac785fab27a147f3e22b7a13e444b73763f01966faf87f537d19c6db7b1bc4407eadb888961bbff8a6c40fb915c10637bacb7a3fd3ac4707cf4864cfafb440cdb2d3a9f6db6b3fbc3f2550e7bc622d34bb34dfd67de0099fa57ce89717b0798e2f13801dec1feb0780f99e2e75b62289fc0d10ce5a319f2e3e3fe5a4fbac4b03d3e44a6fa959ac1bf6e20e3f5dd4033f847987faadfe85633e87b0b99f499b6637be96279f4f0fa96898cf937707f03f36b2d90dbc0ec1898eac78f88617bd00656cd1dd4ff1b315edf2486e3f9253196df8d66d88ed7333bb05d1e105b509e99ff69eae7dfbd00a6f848ce807730fe74079aa1bfc300a6e7cf3947eec1f5ad5762b89ee9215bb03dda02a6fa70879aa13f8b98faef42cd70bd0532e5774e8cf33947c8f4bcbf6a86f343795a063edffe0331d6dfbee62cbfb2876c00db8fc83672420cf72bc17e2d13f59c0b62d83fc0f2370ddc7e418cdb1bc8d89ef05362d82e5e88e17af618d8da028e32b6dad4df215d628c572e89b1bdf790a9bf220026ff809d10a3bfd602a6fed0d84146ffc514c470bda88f4cfe78ac19ea630b19eb275910437d989218eecf390326fb317ac4b03dc0fbebb581dd5b64bc7e70aa19da07ccafb6171bd8207f2744c6f2f60f80a9fd4e8e88515f0f89b17ede3467eb3be43e72c7ee64f9c1f3913d04985faa7fafa7199e9f2b608bfc8b0e31faeb0131ec2f4c62c88f87f9b5b07d624fc4b03d79d19ce5d7caecdbb2a97f24de47c6fa324f88713cd502a678d99f1283fdb897c8f87c0bc88fddc5f8cd8b91693cada119da1fda9fc6071a9a213f6fc4e8bf40f9d95a6fde3483fd6d23e3f3e27589b17f372486f261af9ab3f2897c64d43bc134c37a1ecc6fcf02b6cf89a1fec31930d99b1b2163f944987fc3c0f998983fc3c6f5176d6081f5652f88e1fcf61eb201f612ec10637bb14d0cc71b0fc4689f7d64b23fb407d386f2096e80c9de02898cfe4e784b0ccf4772470cd7f38f910d7c7e5e89b17c313fea8e337bb51e8961bbc8f4cbee74289ebf05a6fe983842a6f6631799fce13931c473c63d7017cfc76e90d19ee42e31c6032360b22776478ce3630b64ea4f6e22931e8e89a13edc7764b46f2b2486fa48303f06ea1ddf25c6ed33cd59f97827c8347ebd430cfbbb136403edef0ad9c6fc2193bdf8cfc8a887fc8618eda5034cfe8ac38961bb7cd30cfa2290d15e13bc7f0bfda3c8d10cfe45400cfb9b07c0369e9fb591f17cf25a339407ed8ffeb491d9ab6d6b7bb946a6f23a25c6ed7d64ac3f5f6a86febd2b62d83f1a2153fc33d60ced33d88b4df1b585dcc378dfdd45a6feab17629c3f46fbe3f881c79029de7f22c6f1862d62a83feb1098f4c77491db505ed13632da838bf723b6507f1de40eda0bd8936d627b639d69cece170e90511fc436315ccf17c8686fe28018b6bbc43670f84a0cf132077b4f330cfa8bf9b5717f1911cbcc3e44d67ec80ed557b8854ce56711e37cda13cd30bfae0f4cfd1f2ed30ce3813e32c5173631c44fee2932e951846c613cbc0b4ced9183dba9fe458f18ede50619f32fbac4682f0631b66f336003f5cb728871fb1099c62f16c8a81771084cf6e04f90d11e640719f70fdbc026ea7be213c3f32af0fc26d64f70056c617c137489b17e1f89617f1bcbcbea00c703cd997d38981fb207ab470cfb87d7c092fa671c62d8ce7690f1fcd618d9407b82ed92ecc1686b86f96017c8589ebea719fc8f4b64ea0f7bd10cf5d341267f7dac19fc599718e7e3807d49f27f7c5733cce7e2c8949f8166385e2253fcfdae19e2eb0099e2c98666b0bf31318e5f27c0a43731d30cd7db22c6f90f8666885f9e89d1ff9811a3bf3d41a6f11757339c7f1b99dabb57cdd09fb04f8cf3318f9049ffe69aa1be16c4b83e71044ccf833bd30cfb5f10e3f98f91f179719b9a61be489f18c73b3d621c1fa2ebe1fd787dcde00fef1383fdcb0764bc1f8f6b86fb5f10e3f8c316311c6fa17d9b787fd1b966d0ab2931ee4f8cf7e7259aa1ff4e1063ffec2b31b61f7bc478be1364aabf07cd505e2fc4387e75458cf78ff666d2fd1b9aa13df68971beb9a519ec7d9b18e747b589518f28ff545e787d8bda4b5733d8e33531d6ef2e31f69745c4e8efcc88e1fc2e96a745e5eb6986f2ed10a37f7e4e8cfd535d62cc2fda9385e5eb0f35437e2d621cdfa5e3a9bd6d10a3de62fd5b58def18b6688e738313e3f77c418efdf10c3fdfb8f9ac13f392306fde56f9aa1ff1cebc7a6e7f15e33944f428cc73b9aa13cb07e6c7a3eef34c3f13e31f63f84c4d85e08cd901fda9fda434e8cfd573bc4d81fd024c6fcbd6886f3b590b17cfd7362ac0f3a1ecb436279482c0fbe2086ed918d4cfd573362ac4f2c7f89f98f26c4186fc6c498dfb9e6ec78ef1059e278c60d31f687be688678634c8cfd17b7c470fe8b996609fc937ed25f9b38fbb1c49ff43b246efc58e24ffa1dd28f26fea4df23fd68e24ffa3dd28f26fea4df23fd68e24ffa3dd28f26fea4df23fd68e24ffa3dd28f26fe9312177f750ebe91f71f4dfcc7246e728bdb5c72e7afcec99772ffa389ffa0c45dee719f073cfcab73f285bcff68e23f2af188c73c519f07fef857e765c39cff68e23f2cf127a58a894acffc2fcfcb46f9de5013f90b9ff357f577f157e7fc27d527fec6df795fa5011ffed579d928df1b6822dfe57bca27de574fdb013f54ff3ee2a33f2147c77cfeed739ca8cf297fe4677ccccf7f7d1e6bae38e317ff8aebac91934b3ec92c31517faffeeadc6c90ef353591bff2a1b2c072bae6ee2fcecf343befcdb7ce71cbefb2e705d2fd46c7a69f066ff22d65c7577c5bd9f20d6fa996a0b9f2a87676a5e9af2d8b2fde7d87eff0aeb2c41e7f67fcafcecd06f95e4b1319cbd56c39fdc2388d1978ce7df6e59e317ea2143b973f66ae75d41b9f328bd94aebebef729fd94cb2dafe11a5877845f68b9fcb2fdcbdc33cd52ef731ddfed5f9d920e76b682277975a21a45fe48ff039f3f539bf5186454b5c4f1359f0c93d423a6035cf1d8b3ef6f83525f1a5bb7e61314bd8c3871db2471eb0a7bf2e471be6ff534d546dd3a735c47e490d70a770d6cbaf9d85396c56c8dbcb5a47996b59627abe9217cb4785adafbfa224362cb7065b28257c567e2159e1405961c27becedef133f7fa689ca635ad65e15ebe7fdfb79612f8573ca2f9fa75fc8d960ad63eabce065a9a08be82352fa17c7abca0a77330bcc6c90eda11aeeb383cc1e0f57fbb7bf53fa4c13d9d19a4a31fa7e1cad228dfc39f7be7896795113d7f36337b2c46766e48e2cb6eb87df8ffcd74bec989db05376c6c6dc4b7bb3d9b9f60ea1654e54c4b2968ffc7ba44f3571fdfa697f3b2fd7c53afdea794aadf35abd2b6bfa8994ecdc9197c56dbfb276969493c926ec8a5db329bb61b7ec8eddb3066bb22d1eb373b6cd5ada1a3dfef6e7e7e697ddd54a4de4e75fab9daf24d6669d820575be7ca6e279acb58ed9cc129f3f7af6d9a8b885edfcfa5acae5b3cb46ac6770831986210cd3b00cdb9086a3926b78866f04da577c37fe56a3cfab35d18836a91d23fe665eacc2f91ebe7a9ea2251ac95ac76c6a89639deb824fc1fabfbe8e72f5f1603c1a4fcaf69e8d99f162cc8d576361bc292b7c37fac6c0181abbc69eb1affcc66cb4efef1337a7e9134ddcac76bee8d9e1b5e646b11f30faea994a96b8562bbfb125ea5e2656787ed89f30ea942ba3a171648c940e1e1b27ea73aaecefcc181be7ea2fa40be3d298185746eae7fcad1471b5261ad3cd6ae7bb7a60dc142ce8cb3d8a456d65bb6b1d137ef55ed9a4f0fd9f16aff047fec01e8cbb4c0fef8d86d1ccecb0affe5e185bea6faa8bdbeadfe92f47748c3fd547f853ee6f85261add0d75e299b7be9597ddc2b98ebf7c9ebbcdb5b56a892c307a820b260c21d4bf6f2adbb1ed13859e48c1fea47a1a0a8b0fd8b9b00d26a47032fdebd725e10a4ff822f8ebc77b36bcc3159a58ae1dd6e7f77ca83c748b2d69b7c5b75a04bec8d9d09723e7b2258ab52cb1d8c666a934bfafb25dc7a5fc21f7ed5afde89b2611c3ac06b6cfdf45221ec463e617f6d13fd47fc5933116cf62a674d31481f853f2f267a5559a5828e1b44e75cb235ec5828fc5dc287957ccff666ecee84c46f7eb67116f855cade5bdd65862a92faea289ba2f9fe9b6633d9f74490e96c4177cce4c9ce7d5e7b1785736d6576df3876798d7c301bbe2b618aa98c612bb624fec7faf3efe9569a59f58b6b31a6f9ccd4b35f4cd798b7c9cd5e8cd77fa878bfd2a6cad51c3aa258a8352ceca969a9b2f24601c6aadfea2fa240ca57ab52385bcc977b07f709b4f323fd11647a08362248ec58938253f513cab364b8833b5cfb1181b57e25cfc2673d53e4fcb35913d55eaa6c63a2ae3b5df9e41cbdadf1da112c5a763adf1377159b1b44f34919f95b67f6b5d9d98a8f2ad3d837a2a635244d614572a66b6942d2a4f515c8b69aa05e2466be2adb8531ee5bddadec8e26b53340d5f6c7db74efe1569b9268aed4ad9d7f45d977b3f7ec5f8f327397e64b191304bb496cd03e5f6e69658d1f6cf35717be39cb7d8c438543e5fcddc5d6589ef75e333fc4db479829638111db123ba4aef7a866b6c8bbb74469a88c4751647a7fe62d3e44660b24c13d57ea661d8a630cdf4976394b6fed663d02b345196cbde38a8d9ab6489e61af316f80b3fe68bd42f626df5d9a0bf815f15ad8c7584a8b6e3a5bee6d2f3c3237567ae38301deef053fa76734d641b45c9ca0ef2b9b2cc52649b59e2a47a4ed34b7d44f698b5ce6fa69ff5235a666086cafe7ac26423d6342371fbe12b9ab199a47ea2b2c506e8a7fa98e683e19bbff51aabe59aa8e2e472ddd48c7a54e26b7caecd27f399bbfc919ff285392b3e8f380bf180f5598775d69f535d7d3632dbafcca7e605bfc22c58aaf95ac8ad9ea76354661c153551c5f5e52b373628e57969ce644553593a4a97f0a0dc0fc6a274f40e2db1692e94c6a53af766be9b7d33ebcb3407e630eb57c4f8d9dc55db44b69fd645e3c5dc131df3b78e5f56686275a4afa6afb9ece9331c5b13aca4a7bddc358b9a95b3143ee24da65c6ed5f64e586946055bdef73c2cea62699d432ed7e641a1d7fb4068ddab5ae2679a2830be48355d9862c1241baa3bcbfc647ea234766a4a6e42af4e299aafb165b15071494f7984d7f97e547ec1711c993db273f3301b674e75ce34c6e651ba6685f5315ec92573641e9b27c64ce9a76d9e2afd3c33c7e6f9efb2ce66595aa1899588a5dcce65f550f2af28aa312f4aca958b6059a1853527fa8a052b295d67652fbb6815f64d0a5b73bd23a260cdf9f9bd69c4503a6751135f4adbf5d662a46e5ee1fefa1b5516d7e573e3f5737d5e5cd9aa39cde6174e540c7260de28db7e376fa1ff26fb3e610df3cebc4f758edd9987668359ecc26ce6f530fbabecd2dc3216e6b6e199adf4b7227ff55aa33f27add0c451a5ec6a7cff8a965ce3791f4b9698f3064b9a85bde1a2d86e66ebf372c7d895dc1453ae852e59554e13f3fd52c5b1c9aa257ea289dabe4b2b7cb27cf0d1c795182b8e83174a25d76f93f55d27d9ead0014fbdc61df579cfcd398c95af67a3ef77acf4b16f76cd5eaa811637c3f2888bc5ccb66594efe1774ecb3491899a7194352c91e672994ea9cc736d03df2b1ca17db5c2b7053bb1c4277658e8532ee6c9fc98ab5088aeac422d557d91922696eec7d27d87c572a2f63e376ffcae7ce66a69a531b0652b0bece567bb927fc8fbe634b5444b5a4eeaf759aef16c1e5b1ee85f1a375b9c352d4fb8857197a6e58bf9dfe71d39cb35b1a6dc6ae65755b464bfbee6f2f55a1cc3a57526565050ac4e5e13d9678a98b381721c4c117fa97fd42ace31af5a62b93faab45d6b7071ad02f889cce1d5319bda64e9f1513e2e2860215991fac45602f1b0fad886270699bdf5719c6f608c2d561e83b61e8c1beb91bf895fa88dd693f56ccdac176b6efdd2353bcb349137aaa566d4ac42aece0c80efcdabe5f55a3a46c7ce054bcce7e578ad3ad57deaa5781e23fed25ccbb3cfee830d540c32e191a9fc491117addbcacd852e6a9e49dfaeb5fa87e7da19e5cfc08af95ed512959f38608d8f78d87836e6d67b5eff846ba9d85af72be2f7d6405c5b43f16eed5adf9ab1a7ad70df3ab00ead236b641d5b27d6a975f6fd73eafb5fa289bc4e136be6122cb3c4caf1b9beac62eba9fb7d0ef23d1d4a13b56659f5fab2af742777c4476f67a98fd3aee6a73a1fbc7a1f2b532b5752c5dc410e7672eb653f49fa2ec72a0fef1f2d7221257ca254b0ffd147689d1be382fe0d8c0bebdd6c689ddcd2dfbbc235bbdf1911c7fc5d5897d6c4ba5216786d4dd5e744a59b5ff7569a659a286a565d8a4975bfa59658d2d4fc1aa4926fa9fbc2f3ed5c41130b3331543ce98a05f47558fbf92368764cc91fccbe2dc5f895f19152bcbd32159fc8d2ea1bec99f934c2fa389b1ee3635d9cfb9fe43e7dde4ddffd65dd5a772a5ec9fa07ad7bf56958cdb25fa86218d2c72de3dcda267d14b7c6e0bb6bf0ad56f60bec60833bf899aaf4627d63ae4aa11c976822ab8911ea9eab6a0dea3317bfcff79d15c733701e3e6be77d7fd6b1b00752c5d4855e61f33a97fbe23b01d03b2fad56b5b37eb9fc376bddc7b2541e692af515622f56699de22a4bcc8d4ad9dc667cc20e6c6574f831f90e9b998fe6b1790fe326b695fea8b171a5e2e5523f6266774e1a531bd7cc537135eaa32d0de7ebab5fad0bdbb15ddbb3766c5fdba0b6453bb0433bb2bfb96e242bb1657ee2564d99d5cc80a8be2d07bf2fc7ceb9fefd626ff8c79cc67c6fc747fb294aa31bf998b738362ef02d30a5d659f98966d1366bfcf7623cbfc26e2ac796da61d2c4b557ad16df5dc3849db0501c2add3fb41fc42193f6a36a5fe6f6138e971ca7f1b3f16c3fdb33a589a5f9892a7ebe3607f68bf218afcdadfcf7f6dc78b05fed8559b9f315b6d1b4dfc4a5fd6ef7950d9e946c903eaa8db607f6907d5b1997fa898f35655633eb699925563431d79b501a97c1b68e9f142d91de41531ee3cbbf0fa4f87e0a863e4b51138d03bb3017bc7ecde05a9ab85fd7475cb444fab6d43f30526df8a14a968a6fcaa3526bac89b4f7cc771d372b3fd1de3798b856965898a5a85ae57766a90845c5294a173f662d9e9ab17d601fda47f6c83e561a16da27f6a9bd22dab0c7f6b97da1f6bbb427cad2aa5a58d445dfbeb2afed6fbe9f6a992696fb03d7b644ea3311a591d6dc184b31b665b5632c1ff6c206a52be446018b3e04790f454d5456506c290feae655afa76146506d17eca2a74ccf4f2e524ffb46b377902df053b4c5356209fbd6be4bfb114d43b5d1cf061789c5edfbd2bceda638b51be9688ddd24bf316dbfed2df3d0e8d8dba9aed92d65376d653f23bb63efb0a0d622deecaedd935c32d51eb70a7ee12a5b4c7f97fe5bf3e236f113655dab561e13bcd35b8a2bf572b994856888c619f8a8d01f62d11c1da33c772037a7aa14570deb2cb19acaf3606aef63b93596fcc462fe74cef2bef041695cbcb8e2ebd375687c212d7195fa89e6bdfabb672ca46d8666cf8c8a7ea294d249fd6d6b68f6482fc58d752b5de9556d47fa3290a5d51e3262cf329649a683ebd8a0fea8f33dc847f98d75ad4b35b1a617a7d6126febeb89bf14c71e683c36b394424d7cace1cbf7c1e5461fca3d73855ecd429d8ed6b3c4baf597eb4718e5773e95e673889a7b2c8fa19746ff3eab23f92c67300787dd8944bec87956ebafac690e94359ea1fe9dc985ccfa09f8b97c37bbb22f07722812f3cdb0e5ae755cb19d96dc93fb7cce9bf28089b47eec5779288f32df6f031bccd9e2481ecb93cfee66a9256ed29f58a3e6e51afce8e929b5cef95961454dc0d8516962dee6b42696eb2dbf668da7737ecee4a9f9ca8ed88bf6133fb3c49ad951e5353bab9379b0ac04f43de67dd592266e6689cc96672a563e517638556a38962c6b67dbf25c663d45c6abbc909772a262e69ebc42dbbde643399537d296b759ffe39dbcab6a9cbc97af4a5f1ad64436e596dc56ff6ec9f6d7ec106db12377e41763974dc658eadeff56b644daa7e427eee7c79b8a9628f57cb1a225e2778b72bd399fbe27758d55f495d9cbebf7ff6579c8cd68358b3d9574fff988ff1b9ac843c7c8def970e508c7742c6d2753a569ccba766c3972a4e338aef1ea78f62c8da9d277a13bbe1338a113a55a6add3bb19394e28ea975ec3c388fcaae5ba9ff28996cab333d39cfd9e8c9976dd19e38b37cfbb781256e32ee5c699d95b697b4c47959727ceea8627f22c5c256afd03367918e94c675d7982bfdb925e6fb24314f95d5032b532e762b8e89ebbbcf8f2d7e5913f950e9a0d243655373e77589ef3685ef9d85f326ae9d771188c4e95b89f0f5bced13d32f6ba2ed3b037b50b4b9d45695250d9ddd6fd962c77af94affe2267371eade81b62c9e28f6271a41be67bb38de51ef276a4d74ca96283e5d3ff2b9255a957768152dd1e1d61eebc27bb62dd3bc36ab5ea4ee952ab50aa48971de124bf92b5ae29299d40e77f69c7de7c0393416ce911c7d1243287b74467ce2c01ced6718a3c6716adb39714e2b9aa8acaea67fe644c5d523e7eccbb698f5e938e3fa7b5a69891bcc4f649531c6f2bb6c787e3dfad2d22e5a22c3e7879f14624aad89e579f75fd4c4d2592ac714fba74bf39bab735d3fe616d5f7273ae7856bafd2c49ad5413833774729e1050badd34cf73ed7a3967de95ca6eb569c09f53d42ffa373e55c57ec78995d4f9585bace74b3d8b970de917c75367e67fff239db4e55076a2cbde25fa156f0e218d841be67bb38eefc3166521cedc3f3347f859f28e6c5f52bd577b3979ebb92476c562d3baa3f9262e7c238e44a4dacef69577ecf633acfc2b973eeed601d3b049d93b1d3709ae01fc2fcee4c23cf9dad35cf919dc7d9765a9bf6e314f271e46cfc36cd157e62f54d3147953adf29fb57b9e3f3df1734b138a7913ccbf25c9c65b1f3e7bfaf52b544c6cab3ff45693d7ec9124b5be17d00f9f4d1a3559c15a6bfcdbf8b77a526ae7a6f86d371762ab1c6aacf8975e5749d9e73e57283bb0ce677abcfc2356a3571b92e8e5cb1c1752bf990f7ee867322976ba251d5c49af19c62dbf4313fbaac89f99eede248d8c71a94fc3cfc15fd891bfb89b0b6a6649ba5fee4d28c9ad24ce7aa267ecc1a2e3d2978a459e8d92ee5aff856bd15ed186fca47a5730f399b59653fe8a749e65aaeed4a97cbdd6cfe8e6a6c5db76c57765b7267547f2ee5734a19afb637679af9aef57e823adef536b4c4e59a78552e7d5e999f589987a7f7e045ad2cd4456926191e631546ba73e3ce657f35d7ae9a4f691b061ff6ae47daca6bb0ddbaf39885f180a2259aa5b102be629d63711d0b7d6be55b94d57ee28ab75a994faeef0672ec86d615d5b31b49f6e91848164fdb87f245de66eb9de772ab1c83c88e7c75e3e5b664bb6eb2fc1aee83fbe83e2d8f6bec96bbe17b9e57be2bac54fa6665b6382fcf89d2f3618be370ca03ccf5e015e7bdd05c9ca2ede6c69d8befb27bb6f63fae5e7c0ea857bd6889e61ceca0a26b85770494eea3145b17df9198a68f31bfd2169a23b9b69fb8eafd6afc4d59e2cc7d71e7ce36d998fbea2edc3799f6003ea03dd6ea64daffedbebb7d7790fa8cb66bb7cb730b1d57c516d89f58b1ed13ebd8192cb1d3a9337587eeae3354c72d7916942eefb91badaf5ea189f34a1f9bcd62c1b8e91e08ee1e2a3fd22e478196b6c4d2184d71755271b6c1b8d676f5fcc472dc9aef0b2cdacf923116f4577879ee6f610e4ce94c46b12c0a7d32603f731ddb17b7e0b7eb6be2aaf71cba47f665a689a3bc96b92ff6c03d56cdef967b02f665a733a96bfb1add53e7d93d337d83b9e3bc5da9387ba07cc173dbb30fdd0bf5b9741676617cc55511f4323b73afdc17b9e75e677ec3b2f6b9eb4ec5062b5d5669e2fabf9683659aabdbe2180d9be57bb64beba368b4af593c42dbc876f12a1fe31be5df8aa171c3bc25e6df2a55c96fae0d2e9da93462257b9563474bce8afda6ab34b16ebdc1b2e4bcb937eead7b57b2af7bb7e136dd2d773bd3ada9db92f74bf44b699db390c7c642c67254d0acb68cdd8eb8b6fae2c6dd71bbec4db5d6bd6c9f4c633dee3e5bf57ee4545dfbc563f2d1abc64139cdf584712d773c73bdf5852bdf9f5833477155cabfe7e162c5ba91a2267ebcbfa47804ad6329af63c88f3996ea74b76a89f959f3e5d8e7e31d3e6ca7b4ad552a89b3e291a925526c5fda4247e46267d657f790ce1b77982116fcaa3866b0aa7698e3599ebda46f6f6a5d79d279b33b2a76e8b8bee72cd727c93cd73a55fea58e7b3ccff3d3598c66688ceda6c58c2d7368466ed77c779fb2eb8ddcc00b8a3afaf1f1a41c7ba117d99d15f1f5896ca4797212a726c2a8b1b6557ee266236007f97194f29ced1509d7f615dff2908f6d4b5ec23593f6aef9e470cbcaaf0654ffa6f783e4bfcde9112bbfc72137a3be64d3e5f7c9b64b476a4d2cbf2f87c6d7d7fefd904fdeb968be7af1d23670ea25de83f7a85aef7bd556f6568e8b9c58478ed644bbe53d79cfca0e3b699df1b937f35e8ca63737ce8c0bef35ed4b94236fe1bd5987b971eeb6f7eef5333d1db9734fbaaf4a43e7ab621667601da59aacf4b7677edaf7b6fab7076ade16b33c953cef7557fc92c61563f5fc3b20aabd79b5e7f98871f29af8f0e1a395dee3ad8ea0393595df8229af75aed8d5524d445fb5fc5ea0a5b9fe646d9cf92af756d8d78e67789137f08676a0e2e0a5f1036a28d9544b76bc5d6fcfdbf7d4fd7b87ea7394be53c2e87ba3741d8cf5ee1d2b1595dec0e97ee8b177a25ae4d3d41f751fbc33154505de589eafd0c4d447a59867ea5e7eb6ba70f5efb1f0fa370bd5a7429956e7462cad0b1c33e1c5f9f6f9da586f16abf6fa966ae25379cc4f7cfcbe4fbffe7bb4abedaa25e271a5f7f5e8f5ce6b6aa2f78956f0a95cd2e7475aa7e2e8a677e15d7a93b5c68ad33938ae77e55db3c8c3fe61efc6bb350fbd3be1c23c47d54a6f2b3f74e6dd7b0dd50a7388d1159fb9afdebbdd72858adf553cef35bd4adfd0c747c5d78134f4bcc8a9b7edb5bc15232f9ffd6edfbab3a56a561aaddbb6532f4ec11763b3fcbbc22aa3db7549afcb58a689554f91464a2aeb07cbe3ce555fe31a34b11867713ddf6c5d4d5c6d87c2b45edcab55b665fb2a9e49f5a9e3d5adbdcbeb217c46cedceb7a3d3ef7b9cf7cc317a926faa611f89637b386e23a5d13e3ab26d51dcad87794259efaaed250d73b559a7826c7caa6de534df4ce7ccf3a5dd18fd3f15de7d9c7be2195cf319f98877e602e895f3efdddbe357e535725bbba02db5ff3174ee877f5ac420f71710c847fbe2e7effc3e29669a2b2e8f2ba295cebc04bfdd3e5f93e356f4fc423fd729f37de8d5fe9f7a94d9fbc3bd27ef43f1beb53bea2b2968675ba24ce05fbbc72164a9da6ca1e9efc87f47d965ecf7ff49ffc67658f33ffc59ffbafe9ac0b95ef85ff265cffdd79f0fb9eaf3450ba7365e94d77883a78e625fe407d7fe6cee5d87e4ae748d6e7cb1ffaaebfeb1da3ad9e38237be6eff9fbfe41fd6fd67cfefbce356fe52fa7c3baf7e657dfd39db78f9ccda1cf5eec3764fdbc265662db4acabf15a06889794d14bc7c1c8c42f2d3a22596e7fb98154da631a04aff027abdeb68229b99b5f370724ff3e11a7362a6722c1fadcef2b98b72cb38f08fdc27dbf747f6857fcc674a139bf899f927fea9afda137f9cb6d3feb97837b68c0bffc2e9bad76e906adfb28f1cfb97cb35d19f284d7cf070deadda6fe25ff9d7fed41fdb17bc668dc13abf79bfe43d94b5755d38f7324f7198ef6da4dfd52b8e8194c78599b1ba560beb64f2ad73a1ffbaaa6d3027adf276c4ca5870e58a6843e5f744d2fb67d6d144f6c97c52ffc6bffdd4f73bb1aee4bdfa57657e431ab32adbbbf3effd066fb2d86f5a3bfe96bfedb7d88be22e5fa4b6c85f952d3ef96d67cf6ffb2ae6f377fc6eea2f8a73f9e835617c27d5bfbabfeed0ef057cd9fc5d2f71830f4d944c1a01b3bcc0b89805b56b003fd7c46c25c0fe8af2ac5dab98d5d24eed11e92a9ed39c2562ad17fb5858bfac17abfad98b7958ae89cce1e599865944c74b6fd916959967e52b1a013cd765edd32baa5ecb4754f2fce96f6604667e6c65497c9ac8d7d25abc69b64e7e648f02cb3fe48781f29c021938812bdbeec89eb851c0c55be0c92e6f067ef659044110b22bbb1944416c1ea6eb028344da4af7e42a4d4cfdc0e061599fa37b2bc7c163908d4da7fd50c1b3191917c12c7809e65fd5c434862ecf9ccea515be4ecd2ae27d884b69fd6fdae70bfb967cb8bab7cb2f899ecabfce915fc55a9e7345eb9059fa5e88a9c3e19def953e82ca7c9feab308df8bb256e37cb2b21f509e01bfce6fb805af9fb4cde91cb0a1752c1f8285ddcfe645b4d2993bc19be3c886d90ede837e30507affaa6c6d18ec066f999db61c69dc067bc1befabe191cf0a67995da63a02c3038b2b8bda52cf12c1805c772bc5c0fc14ff4c66e1c9c38342e53d4c4be6abd4113953e06a7c159309693e05cdd57ed7b96d7d1c4ac06c5b2369aad88ffcc83d25c9d83bab5c6981397254ac1aec9e6ebc62cebe2f1eafc3ee79c45cabb0dd990994c167d0779cafae2b2fc3e12f65e3a6be5fd08d5f771c27c1dde306ef82d1be9fe48ecdd0fcabf65d0507e307adc6adf35de97205ee5cb6a3df47de7c191d649f0144cec436f476eb9b1aaf943f7c21da7f3a683abe03a980637cace6e952dde05f7d938cc89f320afd3f9a776a4be075d6c044de300deaba3ecf0c2ed065b5ea82c6da91e829f98eaa23d50f638a989e903f5ff63da33e94cd3fde44eba3e3bf545836dabe65710d6d344b4abd7badfeb0b5aab8e514fe43d1cc5d27ef24f7f792a5548a5936fcbd608089e1f7161b3e5bec192f32fe94936a6ca073966c2da537f6b7ed58a05e24d59502e7211859e5a7554fa9ec71b1a632d6ba209fb38fc8a3bacd64faa969cfb5ca335fae3aaf8563e28ff6ba4fcc46c8db21c29fb7b80773dd801df09da41c75f043b41a0746f1674835ec8d37e9c90f9a1badf4168f045a6874a1743119ae97b76cc6e6885762843c79d61dcfc892eba73db0dab7325d23943e027fa76e0befaae698a53e33df4d2e75ef66aee774d4d84641eb807fcace4b1a5bfcff5c99c0b7ec144f9b704be9a9497d950f53c66b1e97e167bfeea643daafb78377a7c6cdcb095bf3c53d1c48d7f95c73d5216b67c4eb5e7b4d27e1bbb251ffdeafb93a68ef2c443df3f0b83405869ffe1220cc308df7d78227918fb0dff318d59524df47a61e233d6081f9ce7f0d1f7d2f93fabf5f0e3e306de7df854b44539721b693fa47d193e87b3cca71c842f66e45f8773ef864775bfe9b48926522abf2f1692f2e12d7baddf52fe7748a5f7e93d7ffc06d1ba297c5d3a3f301d431e6676a86c305cc84a5c93f623876fe17bd8f70ec34138e4b37097ed867bd9bb6ed4319285fb2a8fe827a6f17378101e8647613aef61a1ac2bed2f7cc5bf9fea62781c9ea8bf0fd0779e8e59bb4dd04b7f573628ce0e4f83b13108cfc271ddafee6daa89784c795ce1a3b5fc5bfcdec2bf2219e579641b6b62781e5e2c999375e93ce0bcd7a93d721675ef35b43ae1653809afd479aefd858a9317e19459e18d7d92da8a9f98e7e12de9a1da7617de870dcf7027ee8377e23eb851f6b76177d2319674bcb9a485a7c5185a36c2a62743373dde15b45d8ec3c7700be26fdf75fd8089d334ae0883daf7067e411357fc36cac66b0bffa9a9a2891bbf1ddd326bfb47a6ce349bd77f427d8975fd79eabb4eb8cd9a7ee69186adb06d2a0f39ecf0b967a5f3b4c39db0cbe7ca7f5c64dff722ee9ce27bc1f4271b6bbeb78e3dd73af25c67a4fdc69933f20cef3d1b7799290b4bc7a3772356d55137003f12f431322211999175318b6cfb469a6c50ec4ffd8a26d6f4f352fa74eecfbf4bfa059ad8add344bb1d4967375bcff4e04cad53f774c9dc456589e22e72d258357255fbbcc862e4c03c8f3cebda19383be141e4474114864114b9d1aa183d7d0f58e852bcec46d9bb22da1f1febca1551ec0c56f996aaa54eec9328f16ea387e8317a12a7664fdc14e6e57d4113ebdede84e91745257fff14954b66633fd17f082f684e95b689b6aaf34c8794de34031ebd2c1b6b76c7d19c79d1aba75aa968c1ed7037f30717d15bf49e8e8b38db515f36a281fa0ce97d26f576a83ec7300f47595a52df77685d47bbd19ecad7727f5246fbd1417428f6a223714dbf9710898fb8ef8b9ab86c14f8c74fc4f42b3431cae634c807f74176b23abff286795fcdbe74ec656b9eac8e3d8b8ea313e72eb3c5d33051bee24be04767ecca91f0db0135eba8aa36dd76277e360f47e9e668d97ede891c67fd8a4bc6a9c386b2d2201a1bd7ac69bf1867e6307bbbe399f21bf56f2e7e45132bbf6db2a48feddf39553471633f5169e2917b674da373ef345d2fe20fd379d2399d79b3afc0b793237f681da71f1dc7f8caef9b194e74115d4693e82aba8ea6fe29b3cd7974139d6ff2ce1bb7a1dae5532fd1eb08ebf63b02dd735cc85f749bb2c7d5df57df4dd7457baefa18ca4e67de83bfcb3cf124dcf47db79617dde9f5165fd2c4ea9c16b44463d333fd539359fe05e08d3591c5d1bdd2c251d4f03d7762fbd02f97d3999964eeadf74ef16dd4549f2db791c6bdd1b63d895a51dbe8dbcda8133d2975dc89bad28f7a312face1ffcc16a73153e767abf6950fbe0bfd8ab1e129b7206a407ee443ccd23e4577e2bd7fc4df721c8bd864cd609cbeff3bb61c1d597c4d1397c52c757de7ff9ea9b2066b633fd132ad89d77743a52b9ed2c49d743d5ddeefcafe52bc4adf67ac2cf735ba0d1766375d9792fe9e5f6c472c5b8b9fd3358fcbf13ab6f899cd7a1caf3f8ba5ed66f31795365a472ace492af9c3383a768cd7d875f6628f45343ffe6b9a58f3cc67e9b3794eff3ea962891b6ba2f91afba9df957e1c3b1dbb5d6fcc83625567a0dae7ecf7598cb338908d3854fe26adcd9aba09ccbfcef7d9146dce9f2c9b7b5b88ab27fa9a328e6c57b5e6b3d42f4c8f4d35b19a37d56637947ec6663b4e8297f881c66bbfaa89e97b73aabf16cb265f39d33f31552c71633f317ef4ef3e74c49eac37de91fbdbf42273d770e2a7f8399e3912e65b830dc52fe9bc6b377d07593a8f30749bfe40e9aff00ce50fb6557b3b8c59da1fa87ccfd5f14caa7b1ff31583d0950f5e5f71337b9f4950d1c3577b92aeef57d719bbbbf1dc1ec6aff1026296af6a2224c1c5653a3380f595551ef2bdbfd3ef09ffb9c929afa8da5813839e77f9313f70fd71e08ff1e0f0297eb35fe277e739f5df50b7981bf903e54fc29a94136b541c3b49fdbc34ce4d754d9d43500c54df7793fa82512397bf5375be211ce74f947597f324b0cfe716b4de7d8cfb118bb3df55feba26fea455a9326f71433f91cfe3e167f3033ff93b8b775de90c4237ebe7abfa95afca12476e4eb7f07a05bfd31d46e7cadace6592c6bfb976fc58c5c28d9afde17c33ef2cda2fe727f51db377a704b9719861bc67c0dab46f69e24f5a96e4e9f73491cfdc6ba52932af85e9bf37d04619ef3b695c2b971da3be1f2e3b5e6d93f4c9efefbdbb216a6a8d0fb8fca38ed9b646caf7c43e51ba17dfb5267136a3ea4713ff9c94ceff336eec1b9ad1b9e9fbf8f98b7d624ddc5d1537f7697c373e746f82b7306d3bd7d2c5549f329d93a0777a1cf893798769bf9f8abf6ffcc4ed8547f1117cbc4678e4bef94934c3f93ae5f3ce289faaed9dd5e8f92be9647a7e153fb3e0cdbdf1c27804eb477e34f1cf4e7cc4675ff19fed3193e238e8d923f7d8798e62e7393e8e4fe253ff30788c959e64fd7612b525ff57a6dbd0df1bfaaedd51ff6efad2b3e3befbe84bb9178fd3f9d4d91c44ad97707cfa5df0a654eadc3fb40ec49ebf90260fcd47663917f1457c194fa2cbf8ca79767defd2eec4fdf49cea73ed27f13462eeb57b1dc5d6a9f24bef95ffd7a0bc7ce42f3d7f7c163caa7d8fad97f8349ec437f1ad9df529fe68e2ef9dd255abe93b19b34f133ee67e7c17dfc78df82c9a796134f31df81b37dd9bf82c3e8ab7e2edb815b79db760cb3e893be1bd751befc4ddb897f0847b57f16df892b0709418513a9e3ccbf42c88997fe7df5a2fde5592ce3f7f81f9ed695c5bf8a4df35acb3c44cacc44ea4fa38899b78a693ce60569f349f8dc44f82244c22959f66aae3f089cf92384992076b4f9ddff9b81fbcd31f4dfc5b26dee451f2183c3b73b9f3f1499eccc7e43999252fe9ef540991ccfdc7e43559309f3f5a177c98bcf179f2ce9bc641d8e5b7493f49dfc3384886f6c0bb77de925d738ddf555d3b87ad649e0ca2cb64cf78cc3e5ce56dc5bb3d7f34f1ef9b328d7acb7d1aa5ed0d234a0ed2f9b0fe7372981c2523bee0af56d7eeda37d665721cd87614f692137e28b693d3cdfb99d6ca6345fb96eef9a389ffe0c4e782f1a17f9a9c25e3e43c9886a67f9abea53a5d53c454eb1a483e4b2e5862fd06a3b43f9af8cf4fc6946f0b23b9f41bc924f093abe43a39f179aa89aa0d3f49a672e331f13f23fd68e2bf4be273d522dbc94d78cbe7810c426583b762aa94f1eefbe7fe25f9fbd1c47f9bc49b7ea82cef241c26f7d6251bf0a9d85efd96ef7f69ee7e34f1df2ca56bd3ffd5ebc4d7493f9af8937e8ff4a3893fe9f7484a13ffdffffc8fff0f71fbaab4</data> </image> </images> --- 746,750 ---- <images> <image name="image0"> ! <data format="XPM.GZ" length="82281">789ced9d6953eb3ab7e7dfdf4ff1d4d5bb5b5dba0192905457bf208c6108100843bafa852d4b9e6d2084005dfddd5bf65a4b78484202fb3c679f73d8aa14fb174fb2f4f7d25a1a9cfffeaf7fdd5d9cfdebbffefb3f26cfd6b32ffe253cebe95fffe54ce3f8ed7fff9ffff57fffe33fb736b7feb5d168e8cff6f6bf36fff37ffcc77f72f62ff1af419ac81c9e34b046fe2f632736dcc9b7ef233761bbba41eee0f676ce1d3a9e0f0de7dbad6b643cde0a0ce7db9583dcc1e30f0ce7dbd93bb2c0fd47c01b8d0dc82f330cf979cb78e323ff3131eccf5e91f1fab62086eda2898cf9619e61385f400cfbfb16b280fda357c390ff0931ecaf368137b0bc588b18b673cccf06e687efe4dc31f93f379c9f3fba44c6fbe13e31eebf6938df9e0864bc3f7fcf30e47783188f1f20e3fdb18661b89e470cfb872930dd9f35330c7a60c898df78448cf77b6718f2db41c6fcf043c3f9763925deccb7dbafc802f59064bcd9a0f2e2efc8787eb6450cc7b307643c3fdb2786edb1858cf7efb588217fd2360cf73b0036f7ff420cfb0797c8f87c8837c3b0ff3931d6476a38dfee47c8589fceade17cbb7b450cc7db4d62b89f740719ef277d27c6eb5d1986f2bb2686e3a3187813ef276e1986f2eb13c3fec26cdfece6db7d642cfff88db86de5d7cbeb7fb34be5cf0e8037e87c0d642c2f1113e3f3766138dfee44c4707cf2868ce5250e89e178d76c47bd3162c87ff48c8ccf877c340ce73b26c6fa1686a17e5ce04d7c5e54db306c9f12637d9c1986fadf2786fb91dc709ebff81299eebf478ccfcbd470be7f728b8cf7cb1d62d81e62f96d62fd5b0786f3edc126f0967ec0f2f3e7c76f6d507dc90632d9db11311c2f42642c7f39310ce56f1163f9d3f9b1bc03c3d83ebc1986f2f281a9bc856d18ec694a8ccfcb9b61a8cf2362b81ff5828ccfaffb6a189e5fba1ede6f7c6218da9f3b62389ff7848ccf73f8c190bf7b62d4b72086e3fd8961a82fda1fefdfde23c6e7d7369cefcfe9fec5565e7ff10df016de7ffa480cc707a786e1f85b62389e617d6c35811d280ff37c459b86a17cc7c8587fdeb661682fb680a9bee24762d8eecd90b13e820bc370ffe7c4f83c8d0dc3f9ee88b17e1f90a93e360c83deb68971ff1819ed41f2428c7a1f1886fc04c4688fae80b7f0fee40931eaf9c030f8434fc450fece0419ef2f191a067bb2470cfbdbc7c4503ffcd130e8e70d19ef2fa2f37570ff9e61a87f3abf00b6dac4600f8223c3b97d7772bd35cdf31a1f1b86fb9b019be7f1da303c0f8218f217f691c9be740dc3fde3f9c9bec51c99eaebd530e8e99d18af9f1886fa7181b7d09e78d230e4ff9918ed195e7f0bf52943c3a0a74362acef67c3e00f9d12a35e6e90b17e9c2762a89f740f199fefa44b0cdbed9161688f1362a82f0bcfdf447b9e1c18ceeb2fc6fc34513f2c2286fd43db70bebf82f2b1a8feec1b64bc3fd127c6f6e21919ebcbee12e3fd9f2363fd850931da0fd08b45f5e3be13a31e9e90c97e7789f1fc663bdaaf5364b40711370cf63121c6fac3fbdb423d2527c4d87e3e10c3f9dd267013f317768851df2f86f3fa4a036238dedf2286f277a6c8f8bcbb6d62dc5f1886f67b468cedf7d0705e7f01de6f139ff7d42146bd1c1acef70f2f90515f095d1ff5c5a686f3fda31be2561eacfa79fdb736cdf3eb11a3ffd741267dec10a33dbe44c6f2b6ef814dfd06c4501ed12332d66f1c1b86f69c13c3f16e8a8cfaf38e0d837d691363fe7bc04dd4a3bc26c678e10819eb23b940267fdd2586f28bf691b17c7d3a1f966fe819cecbd7be2486f20d2de016ea25181bcef7678218f79f22b7f0fcb161f0d74362d8dffa60d04fdebeb52cf24fc43632d64fc80d437b864cfe86dd40c6fa0e1f90c9ffbe23c6f2ee10a33d81fbb7a8fc1366189ecf7b62b41f6786a17e2c62cc8fd90ef9957d64b427ac438cfe54848cf621b9340c7a3920c6fa7e300ce7c7ed2d7afe6d62a80ff7c2705ede9218eb4b3c1043fd28db70bebf3847eec276161886e77907d9417d3c13c3763bb78fed4daaaf706018fc0117999edfc830e83d06a6f2172931fa1f67c4509e9e8f8ce59d4c0d43fd87c4707e758f8ccfb7bb854cedbf61f40ff17e5a0df4873691f17e598fb89d97578ad76f6fe0769b18b7ef1a86e7812163f9b32762d8dfd9320ccf57febcb42dd35fb1874cfd13703d8bfa17921e32dd6f408cedd3ae61f0773691a9bfed8d18e3f943e0cd06e4c77190315e9737c81dbcbf6b60aa6febc230e8e11d19f56ddf22e3f3eff789a1be931130d5b77f8f8cf727ce88f17a9e6168ff2e89e17c720799faef1a86215e96c468af38311c1fec13c3f3e0817ef5f307e7b37bc4a89f21720beb03f46b915ee207647c3ee5b66128ef4b62d0079b1986f6730b199fdf28309c6f4faf89e1783e300cfac2f26d3bc0ea8a787b2b3f1ef4696d6f6cdb797de4cff3f616c5f3fe8b6188b79f90c9be1d0193ffe75ac4a8df3d647c7ec33362ec5f3c4416a8bf5762c89fb805de6a00db983fd257dc2486fab31432d6af8d4cf65cf488617fb5838cf63cb191c95e8c8851df77c4e85f3c00933e3cc7303c6f6364d4874888b17d3f46eea2bd2276f0fc98df36daa328340ce52588a17c02ccfff606fa5b5d62d447448ce57b8ddc020ef70ce77a70f2e767db36f1fa9418edfd3b30d537bb46c6fa8d66c8e45f9f1a06fba488513f1364ea6fc3eb6d35213fee2d7207d882f2b1a97ead3132ea4181de6c6a5f858fdcc2ed787f54fe7e6018fc7f4e0cf7634d89b1bd7a4476f0f987f2b7db2dd4df05323ebf21e8c9dec6e7db7d2686fb4931bfdbf8fcc68218ebebc570be7f74854ced574c8cdbcf8175f1e66ce7f14a678bfce948226379db2d62ec0fea0053fc9bb48831be13c8d85e445d64eabfba42c6e7995d1277e07e9e81b579c8d93a45c6e7cb9f02933feaef22637dc927628ce786c8581ffeab61b0ff63628ccf7680db1bb87f1b199f57ef1078db81fca507c01d7c7ea26dc379f932490cfb3b8f86a13e46c858df2c24c6f3ef1b86facadbcb8e4df6357845a6fedf7762ec6f6c2363f97b7bc0142f472786c19e3f2053ffe63e31fa0f4d647c7ed52131c65b1364d44b0af767379b703f766418ee7f808ccf2fdb2586edc11419e31f3926ee3673bde0fd50fdc5f7c0547f89340cf773458cfbd376acdf64c330f8435d62bc3ede6f9bf4766418ecfb3932ea2db5803b684fd343c3f9fda95362b8dfd845c6e73d382186fd6d460cfb272932da7f7e460cdbe50b319497c4fdbba83fa588b13c73fd779ba417b1818cf5a98e81a9fe03dc4ef1996286c13e3489b1bd7806a6f82cdc25067b9aa6c868df53898cf1b0ec1163792a62d05772878cf171b24d0cf76b45c470bff135b0ae6ed89e10c3761bf3477af11f91511f222046fbd1300cf67e428cf137e68ff4e3370c83deee89e17817f34f7a925de06dd4b71822b730bffbc05a1f797928cc6f07fd81b0470cdbe32762383eed0377d15e719718b64707c8a857ab4b0cdb556858e4e7cfdbbbae203dc90d646a4fde0c4379417e04c593629718f46dbd2253ff7d8f18dbcf43643a3f94a720bd05bb86a13d0f89d13f6923a3fd4b05700bdba314f423a8feac3e31d6ff816118bf3a42c6fa4b760d437ddf1263ff1ce84f50fd7a1b86e1f9c1e3b7d15e858c18ee9f5d1043f9b31de42e707a496c81fe3d6407e349c3509fc11631ee0f7a1754ff414c0ce70fce90d13f89ee88617f7e4e8cf973911d6007f424ac0d3c5f6edfad26f537389bc4e8ef6e20d378c723316c0f8f809b189f093cbe49f16acb303c6f6362d4d30931dc8f8be7a778343c310ce3051d621c4f4881a97e933360aa5fcb26c6f1943d62b017be838cf51d29c3e09ff9c4682fee89c17ef21631d49fa2f393fd490d43feaf9051afbc4b0cc7733c7f670338dc42c6f3a7e7c05d6c7fa20e31b62f97c4783cde9f85f6857162bc1ee6c7c2f30bc770ae8f04ea4350fd3b1e31da8b4d648c0f138718edf91098e235b90fbc8df6da7b40c6f24a9961f0278e89617fe51906fdbd2293fd16c4b03d99114379b9097007f591e2f93bf47c3589a13cecd870be3dda43eea23fff4e0ce5cb2531ecef726407d8c3fba7fa50163295ff8561b8de1bb205f631bc23c6fab30de7fb87d7c812f66774bc84ede286d8ce8fb772fb6537a9fed49018fd7bb31debfb8d189e576b0399e2f53362ec1f6810c3fe52029bfe8077c3605f1e88d1ffe82153ff621f98f4e40f0c837f88f9a1f85f9e02b7295e3b2286fb0f02e0ed0d606f0b998e7f330cfe7f9318edf9a661f057ccf150fed1217217b7df13a3ff84e543fa8d8e0d83fe1d621c8f720d437f619b18eac70f8149df81320ce79b10e3f9ee0d437f15964f87fad786c4d89f86f5d5c1e7d5f388d1bf318cf607f3dbc1fb0be8fae40fd1f5f1f9104fc4501f31965f17dbabf48418f6b74362d8df1f0193fe23460cc7fbe7c4b0bfc2f3d99bf8fc3f12e3f3b5450cfb333c9fdd064e4f8995cacb07f56f5bb6935f2f7f5e6d879e0709f7eb687d833dda076e617b1b3e2263f9464fc8587e21e8c3213dba31313c3fde8818fa9f5c460ccf53bc838ce7b72d62c8afab90c99fc2eda41ff78818c77386c4389edd4046fdf8a78661bec11899dac733c310ff0e90a97fc730d48f07f5e57429fe7c406e417dd85b86f3fb09b17cbb5dacbfa1e17cbbc4f2b2db50df564c0cdb8317640bda8ff48218db63b31df5ab88e1f8f81599ecef23316c77e87c52b4f2fbc3f2d50e7bce766e2f458bfacffc1d64ea5f3927c6ed2d608ac79304781bfbc3923d648a9f6f89a17c426518cac730e427c0fd8d3dd92686edc92132d5af340cfef51819afef0586c13fc2fc53fdc6b786c1be6f21937da6edd85e7a581e5dbcbe632363fe2ddcdfc2fc3a33e416303b06a6fa092262d81e3681757307f5ff4a8cd7b789e1787e498ce5776318b6e3f5441bb6ab036207ca33f73f8579febd0b608a8fd404781be34f6fc730f47730607afedc73e42e5cdf792186eb090fd981edf10630d587d7330cfd59c4d47f171a86ebcd9029bf53629ccfd947a6e7fdc5309c1fcad3b1f0f90e5262acbf7dc3797e5507d902960fc812392186fb55a05f47a03de71631ec1f62f90b0bb75f10e3f63132b627fc9418b6dbcfc4703d3900763681e39c9d16f577289718e3954b626cef3d642c2f1500937fc04e88d15fdb02a6fed04421a3ff222c62b85efc8e4cfe786c18ea630319eb279d11437d08490cf7e79e01937eac0e316c0ff1feba2d60ef1619af1f9e1a86f601f36bf4e2005be4ef84c858dec10130b5dfe91131dad74362ac9f57c3f9fa0eb58fdc96ed3c3f783ed24388f9a5faf73b86e1f9b90276c8bf6811a3bf1e10c3feb64d0cf9f131bf0eb64fec9118b6a7cf86f3fc3ab9be1d49fd23c93e32d6973821c6f154014cf172302206fd7897c8f87cdb901fd9c1f8cd8f91693c6d6c18da1fda9fc607c686213fafc4e8bf40f949636f5e0d83fe3691f179f1b789b17f372486f2612f86f3f2897d64b47736370ceb7930bf5d07589e1343fd471360d29b172163f9c4987fcbc2f998983f4be2fa8b26b08df52567c4707eb9876c815ec23631b6179bc470bc9512a33edf91497fa80721a17cc21b60d25b2891d1df896e89e1f948ef88e17ac131b285cfcf0b31962fe647df71ae57e78118b6dbb9fd92ed36c5f3b7c0d41f9344c8d47eec22933f3c258678ceba07eee0f9d80d32ea49ed12633cd007263db13b621c1f9b21537f720399ece18018eac37b43467d3b2131d4478af9b1d0def15d62dc3e319c978f7f824ce3d76d62d8df1b225ba8bf2b6489f94326bd044fc8680ff90d31eaa5054cfe8aea12c376f56a18ec8b858c7a4df1fe1df48f626518fc8b8018f61707c012cfcf9ac8783e756d18ca83f6477fdacaf52aa5d1cb353295d729316e7f47c6fa0ba461e8dfbb2286fde33e32c53f03c3d03e835e24c5d70e7217e37d6f1799faaf9e8971fe18ed8fe3073e47a678ff9118c71b3688a1fe9c4360b23fc2456e4179c59bc8a8070fefc7de44fbab90dba817d09314d8de386786f3f3453bc8681fec4d62b85e6021a3deec0362d8ee114be0e88518e2650e7acf320cf617f32b717f1511ab5c1f76de7ea836d557b4814ce52788713eed8961985ff70e4cfd1f1e370ce3813e32c5170e31c44fde2932d9a308d9c178781798da2317b753fddb1d62d4cb0d32e6dfde2646bd30626cdf26c016da2f4711e3f61e328d5fcc90d15e242130e9211822a31e540b19f78f9ac002ed7bea13c3f36ae3f905d64f7805ec607c136e1363fd3e10c3fe12cbcb6903273b86737db8981fd283d32186fda36b6045fd338a18b6b336329edf19205ba827d8ae480f56d330ccafb840c6f20c3cc3e07f5c22537fd8b361a89f1632f9eb03c3e0cfbac4381f07f4a5c8ff095cc3301fa18b4cf9d9310cc74b648abfdf0c437c1d20533c39360cfa1b10e3f875024cf626e186e17a1bc438ff811986f8e58918fd8f0931fadb43641a7f710dc3f93791a9bd7b310cfd09fbc4381ff30899ecdfd430d4d78c18d727f681e979f0268661ff0b623cff31323e2f5ec330d4cf3b318e777ac4383e44d7c3fbf1df0d833fbc4f0cfa572932dd4fd730dcff8c18c71f3688e17807f52df0fee273c360af46c4b83f31de9f9f1886fe3b8b18fb675f88b1fdd823c6f39d2053fda586a1bc9e8971fcea8a18ef1ff526f0fe7d6618da639f18e79b0bc3a0f74d629c1fd524467b44f9a7f2c2eb3bd45eba86418fd7c458bfbbc4d85f1611a3bf332186f37b589e0e95af6718cab7458cfef93931f64f6d13637e514f0e966fd0330cf915c438be4bc7537b3b26467b8bf5ef607927cf86416f5d627c7eee8831debf2186fb0f1e0c837f72460cf697bf1a86fe73ac1f49cfe3bd61289f84188f5786a13cb07e243d9f7786e1789f18fb1f42626c2f2cc3901fda1fcb37ec1263ff559b18fb031ac498bf67c370be2d642cdfe09c18eb838ec7f250581e0acb83cf88617bec2053ffd58418eb13cb5f61fee32131c69b3131e6776a383fde3f4456389e71438cfda1cf8621de181063ffc52d319cffd2ec0fe7bf7cfe493fe9cf4d9cfd28f127fd0ee947893fe9f7483f4afc49bf47fa51e24ffa3dd28f127fd2ef917e94f8937e8ff4a3c49ff47ba41f25fea4df23fd28f1ef94b8f567e7e01b79ff51e2df26719b0bee70c9d59f9d932fe5fe47897fa3c45dee719f073cfcb373f285bcff28f16f9578c4639ee84fca1ffeecbcac99f31f25fecd127fd45631d1e9894ffeecbcac95ef3595c89ff994bfe8bfb33f3be73f697ee2affc8dbfebb4c37b7f765ed6caf71a4ae4bb7c4ffbc4fbfa693be087faff47bcff07e4e8984fbf7d8e13fd39e50ffc8c0ff8f9afcfe39c2b4ef8c5bfe33a2be4e4920f732526faefd59f9d9b35f2bda212f90bef690556d335777f717e46f9796fbe758e5b7e973f2f90eed73a56b7687ccc1b7c43ebf88a6f6a2ddff02ddd1234961ed5ccaf34fab565f1c5bb6ff136dfd64aec68dbd8fdb373b346be575222e3859aada65f18a73186e7dc675fee19e327da6217f2c7ec958e7ae5232698a36dfdfcbbdc670e936c6eff88b6877845f68b9fcb2fdcbd629e6e97df31ddfed9f95923e72b2891bb0b5508e917f9237cca7c73ce6f94615989abd944167c728f900ed89ce78e451f7bfc9a92f8d25d3fb398252cfdd0217be0017bfcf372b466fe3f55a26e9b3ead21f64b6a80abd2592fbf7616a6d8a494b7d58eb257526276be8a17cbfba5ad2fbfa224d62cb7319b694bf8a4fd4252e18e5661c23becf5af133f7fa644ed312d6aafcaf5f3f6fdbcb0e7d239e597cff35ecad9ce4ac7ccf38217a5925d441f91d2bf395ed52adccd15986b90eda135dc6707b91e0f97fbb7bf53fa4c89ec68454bd1ff7e1cad238de239f7be789669d926aee6c7aea5c427c60a4796dbf5c3ef47feab2576cc4ed8293b6303ee65bdd9ecdc7887d03227fc6d351ff9f7489fdac4d5eba7f9edbc5c97ebf4abe7a9b4ce2bf5aeace82752720a475e96b7fdcada59504e361bb22b76cd46ec86ddb23b76cfc6acc13678ccced926db326af4f8eb1f9f9b5f76574b95c8cfbf563b5f49acc95a2505b5be7ca6f279c44ac7aca7c4a78f9e7dd62f6f61ed5f5f4b857c6eb33eebb0aec52d6659966d09cbb1a4a574722dcff2adc0f88a6fd65f6af479b912ad689ddab1e26fe64594ce977ef53c65255ac94ac7acabc481c975c9a760efbfbe8e0af5915a0fd6a3d6de9335b19eada9f562cdac57adc237ebdddab17ad6aeb567ed6bbf311fedfbebc4cd59fac426ae573b5ff4ecf05a53abdc0f187df54c1525aed4caafad44d3cbc44acf0ffb03469d0a65d4b38eacbeb683c7d689fe9c6afd9d5903eb5cff8574615d5a43ebcacafc9cbf94455cae446bb45eed7cd71e583725057db947b16c5bd9ee4ac7845fbd57362c7dff87c52bfc81a72cb5ee727b786f8dad46aec377fdf7c2dad07f33bbb8a9ffbf95ff76c41fea23fc21f7b74c89db6bda8927bef5adbcec96ce75fce5f3dcad6f5beb4a6481d5b1bab60e0f6c4bffffa6b61ddb3ebbd41369f33fa89e7ab6e03becdc762c6e4b5be5f6ef7d5eb25ddbb37d3bf8f3c77bd6bcc3254aacd60e7be7f7bca73d7451e927f9a8876fb5087c56d0d09723e7aa12ed9594586e63f35499df57db6ee2529e16befd45f5524e760cb31ad83e7fb3133bb51f72bff01dfd43f3d77eb406f6933dd176d3b603fb0fc9cb1f95962a312d97bd6d5a1efbc59ef1813db52ade15f3bf999b333a93b5fdf5b3d8afa55cade4bdce5162a52fae66134d5f3e336dc76a3ee9821c2c882ff894d938cfeb9dc7f69bd6d8bb6e9b3f3cc3a23ddc6157dcb17b3aa611f6aebd67ef7faf3efe9d6969eb5cd5d91c6f9c4d2b35f4cd798b7c90d7e8cd77fa87cbfd2a6ca551c3ba12ed834aceaa4a2dcc17b2611c6aa5fea2f9c966daeacd1d29e40ddec6fec14d3eccfd44c73e023b68f7ed63fbc43e253fd17ed26d96659fe97d8eed8175659fdbbfc95cb5cfd36225b2c75addcc51476dbcf6db336859f3bb235476f9e95869fccdbeac29ed139bc8cf2adbbfb5aece1eeaf29d7b06fd54c6641159c3bed231b3d05ad49ea27d6d8f325b60df189b786bdf698ff25e6f1fe7f1b56d372cdfdef86e9dfc3bd26225da9bb5b29fd3775dedfdf815e3cf9fe4f881c556c284bdb5681e2877d65762cdb67f6e1337d7cef9161b5a87dae79b3377572bf16ddef80c7fb59b3c41250eed96ddb6b7b5bdeb58aeb569df6533d2ecc8becee3e8cc5f6cd85d2b103cb7897a3fc1acec37666c2184a36deb6f3d06bdc426ca6ad95b0773f6aa2851ac306f8167f3b267995fc49afab3467f03bf2aab8cb56cabde8e57fa9a2bcf0f8ff49db9f681505cf153fa767d9bc8d68a92b50e8ab912a212d9e64a1cd6cf29bccc47640f79ebfc2afcbc1f518840845a7f1ddb667dd610917dfbe12b8a5824999fa8b53806fba93fb6482d5ffcd66bac162b51c7c9d5ba9933ea518baff1b9168fe289bbfc819ff29998949f479c8578c0de598bb5569f535d7f3672edd7e653f3925f214a4a152fa5dc9a793a566dc651d926eab8be7ae5f11aa53cadcc99acd954968dd2253ca8f683b1281bbd432536c44cdbb8cccebd8a37f12e26595fa6d811bdbc5f11e367b1abb759f97ec62e5acf62cf6e89df3a7e596213eb237d73fa9aab9e3ec3b1359b57ec69a770cdb2cd2a2885f7798371dbd26def30b397a52b2dee7bee95ed62659d4321d7e2a0d4eb7d601bbb5757e26736d1c6f822b3e9b66dcf98643d7d67b99fcc4fb48d1d09c96de8d5a944f373b46ccf745cd2d11ee175b11f955f701c47660fec5c1ce6e3cc999db3ad8138cad6acb0778c570a49f4c5b138b126da7e3ae254dbcf333110e7bfcb3a9b4569894dac452cd5762eaf878a7f45518db8a858ae4204cb4a2dac189a2b965452b9ced25e76bb64495852da5ae81db14b6a2eceefcd2286ca39cb36b1aa44b3b51ca90bf45d3fbed165715d3d375ebfd0e7c5b556c5289f5f38d431c881b8d1da7e13b7d07f937f9fb0b1b813f7999d6377e2508c996017a251b487f95fad4bb161cdc4a6e5892dd114ad5fbdd6e88f494b6c62bf5676737cff9a2db9c6f33e549458f0062b360b7bc3ed72bb39c9d6e7158e716ab929a7420b5d5155c12616fba5ca639375257e62138dbe2b2b7cf27cf0fec795182f8f83974aa5d06f93f75d27f9ead01d9e798d6dfd792bcc398cb5afe7a0ef77acede3bbd8169ddc067645581d7171b8683aac7a0fbf735aa44466cd194759418934974ba84a9917da06be573ac2f86aa56f4b3a71ac4f7458ea532ee7497ccc552845574ea996eabe48c52656eec7317d87e572a2f6be306ffcae7ae67a696531b0e36805768ab35dc93fe4ef629429d1918ecafc3ec7b59ec4b1e381fdcbe266d1650dc7b3ddd2b84bc3f1ede95fe71d394b5ae77ab9cd995f55b325fbf36bae58afe5315c5a67e204258bd52ada44f699452c68a01a0753c45fe91f15e539e6752556fba32adb8d0d2eaf55003f91295e1fb3999b1c333eca07250b584a4ea43fb193403cac3f8ee5d93bb9dede719c6fc71a38bc3a06eda4d68df3c05fed5f681b9d47e7c99938cfced4f9a56b761629918feba566cd59855c9f1900df8babc5f55a39c6c4ce2525165602f1e395ead4f4a957e2798cf82b732dcf3ebb0fb6a36390218f84f627edb8ac6ea73017ba6cf304e67bb5d53fbcd0ce687f0656cc77ea4ad47ee20e1b7fc4c3d6933575de8af6cf761d1d5b9b7e45fcded9b1af9d9efde6ec3adf9ab16754b8ef1c3887ce91d3778e9d13e7d439fbfe393f55e29c390ef366b52c5262edf8425f56b9f534fd3e07c59e0e6d138dcd72e6db977d6d770a477cf47656fa389d7a7eeaf3c1ebf7b1341522a48af5cb95c8da85f5b29f247397039d87b78f16b994123ed456f0fda38fd039b70625fbb7635d386f626cece486f9deb55db1fd9d1171ccdf8573e90c9d2badc06b67a43f273addfcbab7d22c52a23d67d5a53dacefb75089159b5a5c8354f12d4d5f78b19d2bd9c4d24c0c1d4fbaf60cfa3a9cfde211343ba6e20fe6df5662fcdaf84825de5e9aca4f6465f50df6cc7c1a617d9ccd8cf1b16d9cfb9f143eef7c3b7bf79773ebdce97825ef1f74eef567ec34aa7ea1f617c93e6e58e7ce26d947fbd6daf9ee1a7c67cb693a2dd4601b3f239d9e9d6fcc555945896c4e8c30efb9aad7a03973f9fb62df59793c03e7e1b366d1f7672d077b20754c5dea1516d785dc97df0980de7965b5aa93f7cb15bf59e93e16a5ea4853a5af107bb12aeb149729b1302ae57425e743762099b4f063f3369b8807712cee61dc448aec47d1ad2b1d2f57fa1173dda92ca6b6ae99a7e36ab48f525aeaebab5f9d0ba9a42b3da72d7da341a34519c85046f29beb469629916fcc29b3393320ea6fcbc1efabb173a17fbfdc1bfe31a7b1d8dbf1d17eda95d18d62cc5b1e1bb7f02d3095d659fb89a2accd39fe7b399e5fa29bdab19576986ce2eaab564befae61964c58681f6abb7f2853fb9049f9a0db97a97cc4f192e32c7eb69ee4939c689b58999fa8e3e76bb1239fb5c7782d368adfcba995ca1739136bacc4e70df96a5fca37f9ae357852d1207d741b2d77648f7ddb322e54e243bdcce6ad925ba4c49a4d2cf42654c665b0ade3276525d23b68aa637cc5f78194df4fc1d06729db44eb4096e682cf5f33b8924ddc9fd7475c56227d5be91fe8eb36fc5027a1e39beaa8d40a6b22e59e783371b3f613e5bec5ed6badc4d22c45dd2abf31a123141da768bbf8316bf154c4f2401eca23d997c7da8685f2449eca25d1861cc87379a1f7bb9443adb4ba2d2cdb455f5ec96bf9cdf7532d5262b53f706525529f895519692d8cb194635b36778ce5432f6ca77285664105251f82bc87b24dd42a28b79407f3e655af66c3aca0de2ec8b2a74ccf4f2152cffa46f37790cdf053d6e20ab184bc9577593fa260ba8d7e625d3b115d795f99b7ddb04fe5381bad910df21bb3f65b6e8843ab253733bb26b7b46e9a5a3f7dd9926d16cc55c4abdc961dd9555cb7c75b25bf7099165b8aa96fcd8b5bc74f54f35ab5ea98e09dd9525ea957c8a52a454334cec0fba5fe10417374aceadc81c29caa4a5cd59ba7c47aaace83997b1f8bd558f113cbf933392bfac2079571f1f28aaf4fd7a1f19912f655e6278a7bfd77cf9a294784a223a2b29fa8a45299bfedf44487eca57de3dc2a577975ed285f05aab2da4345ec49c52ac9ede02a1a341f7dbe543da86fac6b5d6813e7f4e2cc55e2edfc7ae295b10751984b586e9d3fd6f015fbe00aa30fd59eb952af66a94efbab2971defacbd5238cea3b9f2af339ac39f7581d43af8cfe7d5647ea494d600e0ebbb313f5aca679adbfb086d8d16a3c43fb77a6662aef27e0e7ea4d6cab77b5a37ada7abe5a8eda758e6bdad9527b6a9f4f79431d302bab1ff9a20ed551eefbada1c18216fbea589d7c7637eb2a716e7fe21c6b5eadc18f9e9e4aeb5c9c1556b609183b6a9b58d49cb189d57a2bae59e3139bf333752a5ed8117b367ee2674a9c333baaba66677912078b4ac0dc63f119a9d8c4f594c81c75a663e513adc391b68603c5f376b6a9ce55de5364bda80b75a9863a66ee287cded535efa991ba518ebacdfb1fefd45dddc6a97bf5a2edcbd819aa86da509bfaff5baaf9351da2165baaadbe18bbac33c632effd6f5525d23e153f71bf38de5456a232f3c5ca4ac4ef66d57a539fbe27758555f4b5d9cbabf7ff65c92dcc6815e59e4aca4331e2ff864de4a1cbf2773e5cb97917b5d1c948db34ee5cbb8eeabbd255ae6bbdb89e9c643155f62e74d777033774a3cc963af76eec2695b863e41cbba9fba075bd95f98f8aaba63ed3a3fb948f9e7c598b72e84ec497dea9bcd6b873ad75d6b6bd624bdc45c7177a0fcafd89140b3b9d52cf9c203b5219d75d61aef4e74a2cf649629e6aab0796a642ec561e1337775f1c5bfcb24de43d6d07b53dd49a9aba2f0b7cb7117cefcedc57fbda7db3033b71df9dc4f6cdbced13e1576da2f4dd1db953d65ca655ada49ebbfb2d2db69ce7aff42fae331767de3bd016c513e5fe442b28f66c97c73be6fb89c626aaaa12ed4fd78f7cae44a7f60eadb21255d7d963dbf09e6dc716d7a2ee459a5ea94aab4079888b4aace4afacc40533a955d7dd73f7dd03f7d09ab947aaff490ca1f5e8f6f9d08539da4f30468de3d48e7be29ed66ca256dd9cfe99131d57f7ddb32f6b31efd37107f3efe92b4a9c373f91d5c618abefb2e1c5f5e80b4bbbac4486cf0f3f29c594c62656e7dd7fd12656ce523ba6dc3f5d99df5c9febfa31b7687e7fa27b5ebaf6329b38677510cecc6d6b4b78c142e734b77b9fdba32d79e95e66eb56dc21f53d42ffa37be55ed774bc48d723ad50d71dad173b97cedb572feedaefec5fac44b76e07e628bde65fa1ade0e531b08362cf7679dcf963cca43cda87e769fc0a3fd19e96d7afd4dfcd5e79ee2a6714756547f38fa4d8b9340eb9d426ceef69d77ecf4336cfc2bd73ef65b08a0ec1cea9d81dbb0df00f617e776e23cfdd8d15cf919fc7dd74b7d6edc729e5e3c86dfe3a25ce7953cc51adcedb55ffaa707cf1fb924d2ccf6924cfb23a176751ecfcf9efabd495c87875f6bf5d598f5f5162652bbc0fa0f43c98e7a73c2bcc7c5b7c17ef529bb8ecbd196ecb6dd7628d659f13e7cadd763bda067659d7e330bf5b7f661e9b6b1317dbc5be67ad71dd5a3ed4bdb7e69cc8c54ab4ea3671ce784eb96dfa981f5db589c59eedf248d8c71a94e23cfc25fd896bfb89b0b6a6a2cd4a7f7265464d65a673dd267ecc1aae3c2978a428f56c57f2577eabde92768c37d483b673694133cbf4837e9ae29ef01c4fba5db59bcfdf713ce5b9555dc9a6ecbafdf9e7d23ea754f172bdb9a3dc779def27e8e33def5729915f554b9fd7e627d6e6e1993d78d95696eaa232930c8f714a23dd8571e7aabf5a6857c563d686c187bd9991b6ea1a6c77de7944693ca0ac4451192be04bd63996d7b1d0b74eb14559ee272e79ab9578f47c2f50032f74aea89ebd48f14fc740f2785a1eaa67759baf779eaa8d6a0ca25aeac58b176b49ba5eb2f81a5eea3d788f8be31ab9e5adf99ee7a56f68aa94bea8cd16e793ca9c28331fb63c0ea73dc0420f5e79de0bcdc5296bb730ee5c7e97dd93b3ff71f5f27340bdea65258a29e8a066d74aef08a8dc4725b62ebf23314b1f637e952d344772653f71d9fbd5f8ab56e2c47bf6a6ee2669cc7bf166deabca7a0053d4e35c3b99f57f7b6fdebbb793f98cd295cdeadc42d7d5b105f627d6b47de21cbb3b0b743a72475ecfdb757bfab805cf82b6cb7bde5aebab97d8c469ad8fcd61b1cdb9ed1d585def50fb914e350a748c122b6334e5d549e5d90683b9da35f313ab716bb12fb0ac9f05632ce8aff0eadcdfd21c98ca9958b92c4a7d32a09fa989edcb5bf0dbd56de2b2f71c7a47f232b789fda22df39ee58e772c5db5e19d80be6436937a6e5fa377ea3e7967c2b7b83728ea4ac7d93bda173c979e3cf42ef4e7d29dc9d2f88aa723e8453af3aebc67b5e75de77ec3a2f679db1bd96bac7459661357ffb51c2cd342dd96c768b44d2cf46c57d647d1685fa37c84d1c866f92a1fe31bd5df8aa171c3a2128b6f95aae5b7d00657ce5419b1529ddab1fd0567c57ed3653671de7a8345c97df56ebc5befaea2af7b6fec35bc0d6f33b75b236f4bdd2fb05fdad6b933756ccd54acfa259bd554b1d7b2af9d77fbc66b7bdbec55b7d69d7c9fdcc67a5defc999ef478ef4b59f7dae1efc7a1c54b0b9be655dabb66fafb6be7069eb3c678ee2b2547ccf43656e42a9a7a26c133fde5f523e82d6b154d73114c71c2b75ba5b576271d67c35f6f978870f6b57b655de09f2f15ec70f25526c5fd9422baa0ab1337bd7f730e1175c3166cff85579cc6059ed30e50bdf59d0b73772aeb433f72a5b3a766879beaf16db27c57dd739d5fea5897b7c7d40368b5184d640361c6e6d889e88bc6df1e63de6d7eb7b811f94ede8c7c7976ae0877e245b4be2eb1335cef2e426ee9c08634d25ae370276501c47a9ced95e92706d5ff92d0fc5d8b6e2255c332977c5a3ea3aa2b81a50ff9fde0f52fcb6608f5855358519f5154d57df27dbac1c696c62f57d3934bebef2ef877cf2ce45f1e2c70bdbc0919ff8a9ffa05bef7bdd5676968e8b9c3847aeb18972cb7ff49fb40e5b599df1a93ff19fad863fb5ceac0bff25eb4b547d7fe6bf3a878571eea6ffe6bfe7f6b4ef4d7de9bd681b3a5d16b3b83bce516693b5fded884ffbde3ef9158c55d74a66a9e279afbae2976c5c39562fbe03a2de9b37f73c1f314ed126a61f3e5ae53ddefa089a5353fb2d98ea5ae79aae16da44f455abef055a98eb4fd6c68917b5b7445f6d9ff991bfe3f764a0e3e085f103da50d2d4966af9bbfe9ebfefebfbf70ff5e7287ba784f5eef7b37530ce9b7facada8f477dced0f7bec9fe816f934f347bdd43fd35154e00fd4f9129b98f9a814f38cbccbcf56177ef22b18f3df2c343f95cab43e376261c231135e9e6f5ff09ec46ab3588dd7b7d0263e56c7fcec8fdff7799fff3dea6ab3ae443caef2be1eb3de79459be87f622bf8482de8f3235ba7e3e8867fe15ffac395c68ab33938ae7fe55fb3c8c7fe61ffc6bf1587fe9dedc23c47dd4a6f6a3f74e2dffb636d6fbb10a36b3ef35efc37b9e5593a7ed7f1bcdff06b7d431f1f1d5f078a997991237fd3dff29b5f55e2eab3a5e6ac345ab56da75e9c922fc626c57785d546b7e725b32e63914dac7b8a3452525b3f581d77aefb1ad76013cb711637f3cd56b589cb7568dbceb377b54c5bd2d7f14c669f5afebcb577457b089fbe3bf5b7fd8e6e91bb010f5860653631b0ad2010fec4e9d9d7d99a98c009a4d75371a0b43f781ab8da86bafea9b689676aa035f596d944ff2cf09cd325fd38adc0759f02ec1bd2f91cf0a138d4975910bf7caac4157e535727a7be023b58f1174ee877f59c520f71790c847fbe2e7eff43718b6ca2567475dd14ae75d0f144e9ead5f93e73de9e884706d53e6fbc9ba0d6ef33377df2ee48f9107c36d6a77d45ad96b173ba20ce057d5eb9336d9d465a0f8f419abdcfd2ef040fc163f0a4f538099e8369f092cdbad0f99e05afb61bbcb969f0eefbda064a6faa95def07a6807cffc24d8d1df9f795335908fd91cc9f9f90a7a811becfac7a8d513b72f27c15eb01f1cccffcd9acf7fdf79ce5bf9abe970de7bf3ebefe92eeaa3a039f4d9cbfd86ecbd68136bb16d2d15df0a505662d1265addea71300ac94fcb4aaccef711359b4c6340b5fe05b2662bd844361173e7e1149ee6c315e6c48cd4403d38adc57317d58675101c798fd20ffaf22238e6136d131bf8990427c169a0db936090b5d3c1b9fd666d5817c185bbed5d7b4166fb167dd420b85c6c1383a1b689a98ff36ef57ec3e02ab80e46c1405ef0396b0c56f9cdfb05efa19c5bd7a5732ff2147bc5de46fa5dbdf21848755c98b1e5b55a5a27536c9d4bfdd775db0673d26a6f47ac8d05d7ae881aaabe2792de3fb38a4d649fcc270d6e82db4f7dbf13e74addebffd5e6376431abd6de5d701f8c7983c541c369071bc166b0c5b2194edb7c966991bf682d3e064d772f68063ae60bdac176e62fdae7eac16fc0f84e66ffe6fdf57a4127e82e9abfeb275ef0611315572ce48e17b2cbe770ee1ac05594c8acca3b02cbe53977ad625e4bedb94764ab784e0b4ac45a2ff7b1b0f7aabd58d6cf5ecec3629bc814afce34cc233a5e79cbb6559b7956bda215c0735db57d6645d54bf5885a9e3ffdcd8cd02e8ead2c884f13f552598b37cad7c9f7653f14c1213f0cb5e714ca5085ae6a7a7d39f4a2a06bbf869edae68dd0cf3fb330084376251b6114c6e2305b171826cad1764f2eb389991f18a68bfa1cbd5b35081fc27c6c3aeb870a9f44645d8493f0399c7ed52666317475e674212df175e6ac22de87b894d6ff667dbeb06fc5879bf776f905d153f5d7398aab58ab73ae681db26e19b3b8b40bef7caff511d4e6fbd49f45f8deaeda6a9c4f56f503aa33e057f90db7f0e593b6399b03d6738e551acee47b3e2f622b9bb913beba4a8d45337c0bdfc31d6def5fb4d67ae16ef89aeb74cb95d66db817eeebef1be1016f88ab4c8fa156607824ba72432bf12cec87c73a6e5e680fc14ff4075e1c9eb8342e53b689efbaf5069ba8ed63781a9e8503350ccff57dcd7dcff26a4accece2a2369a2d89ffc44165aecec1bcb5c698139725da825d93e6e78d59ce8bc7ebf3fbdc731669ef36643d663359f61dd4297bb72fabef23616f95b3d6de8f507f1f27ccd7e163eb86dfb2bee98fc4defdb0fa5b0663ed07a3c7adf75de17d09f68b7a5e6e0f03df4d5de99c848fe1501efa6db5e1c5bae60fbd0b6f90cd9b0eafc2eb7014de689ddd6a2dde85f7f938cc899baaeb6cfea98cf4f76017c761c33a80f7ea681d5e78dbe1861f6aa52db487e027667651ee683d0ee7c4f441e0860f59cfa43bcaf653ed6c7d76e68b869bce9c5f41585589b9ae5ee6fd5e5fb8f45723f513790f47b18975f8f92f4f651652dbc9d7456b04ac6e71c4854d16fb060bcebfa027d91a691fe49859ce9efe3be757ad5860bf6a05152217bbd453ab8f9af0631de32bca6745b7937c1fc5afb4c3b4d2bb12f8b3f734c7d6988fa7e35b956affabaffdc47c8db2ea6bfda5f0ae0719f076d80c5bc12c6c8781b67b93703bec84ddac1f27e241a8ef7727627c96db436d17232bb2b3f7ec88ed48444e2423e54d306efec42e7a53e946f5b912d99c21f0137d19782f812b6cfbd47a8bbcecb9579d39f7bb8612331be71df0b38ac796fd3ed727732ef805b3aabf25f0d5a4bdccb1aee7018b85fb59ecf9ab93f3a0efe3cdeaf08175c396fef24ccd26aefdab3cde9156d8e239d59ebb95f5dbc82df510d4df9f3472b5271ef9c159a445e764fd87b3288c227cf7e189ec4671300e1eb29825b3897e274a02cec651ea3e450f8197cdff596e0f3f3e5ee0df478f652daabe37cefa21e565f4144d729f72277a1651701d4dfd1b1ecdfb4da7f59408a9fabe5848da871772a5df52fe27a4cafbf49e3e7e8368d514bd2c9c1f988d21f7721d6a0d4633558b6bb27ee4e8357a8bdefdc36827eaf149b4cb76a3bdfc5d37fa18c5a3fdcb67f213b3f8393a880ea3a3289bf730d3eacafa0b5ff0efa776313a8e4ef4df14faceb3316baf01f632d855638ab3a3d37060ed4467d160deafee7d4d89b571858fd6f22ff17b0bff8e6455e791ad6d13a3f3e862c19cac4b37c579af23d97767f3de6be8b4a2cb681869db135d07331d27cfa21113d18d3cc9b41224e23cba257ba8b7dd45f7d1d867ded04bfd132ff5a2fcef58b6b231966cbcb9620b4fcb31b41a470d5f466e76bc67d17635881ea20d88bf03d7f3436e9f66714514cc7d6fe01794b8e4b751d65e5bf8774d359bb8f6dbd11d7b6effc8c81de5f3fa4fa82f715e7f9efeae156db246907ba4d156d41413adb7169ffa229ba71db5a36d3ed5fee32cffbe1375dd537c2f98f9e463cdf7ceb1ef3a47beebf68ddf3871fb3ef3dff27197895658361ebd1bf3ba1df502f023c13ec62cb6623b1697cfb1236f94cd76cafda95f51e29c7e5e4a9fcefdf9a7a45f6013b7e7d944d98ca5bb9baf674add9173ea9d2e98bba89568dfc52a8b556357b7cfb33c460ec479ec39d7ee8edb8e0e623f0ee2300ae2c88b96c5e8d97bc02297e2652fcadf15d1fcf838579e15c7eece32df52b7d4893c8913ff364ee387f8d13e151dfba6342fef2badf3825fbce7a5771bfeb3535c2d99b5fdc4208d2e684e95d14453d7796e87b4bd6904ddf879d158b33788a7cc8b5f7cdd4ac533ee44bbb93f388b5fe3b76c5cc4dd8cdfd538ded19f1ebdcf64be0ef5e718e6e168a525f3fb0e9deb7837ded3f95aec4fca783f3e880fedbdf8c8bea6df4b88ad8fb8ef8b3671d128f08f9f88e957d8c4389fd3a0522f55adbcceaffc5ed1579397aeb368cd93d39293f8383e71ef722d9e4689f6159f433f3e6357ae84df0e98b38eaaaee9a6370cf27938da6ef617ede79fa841deafb8609c3a1a6b9506f1c0ba660df96c9d895efe76c733ed379adf5cfc9a12adfaaacb397d6cffe454b3896bfb89da261e7977ce283ef74fb3f522412f9b275db033aff20a7c3bd50f7ace71f631718caffdbe89a5e28bf8321ec657f1753c0a4e9923a6f14d7cbece3b6fbcb16e974ffdc4ac239cb7df11d83dd785fcc5b73977f5df97c0cdd645fbaefe30add3899f06bbccb31f6d377bdfade3c57766bdc5d794589bd3824a64eb9ee9ef9a44f51780d7b6892c8eefb52decc7e3c0f386d2877eb9829d9928eeddfa6f14dfc60dfdd9f0c659dc1b6fca61bc1537ad77d9885bf1a3b68eed785bf97127ee96d6f07fa6c551c2f5f9f9b27d551ab8d0af9830df09dc780cf95169c2b33e456fe8bf7dc4df6a905889cd1ae1207bff77225c13597c4d898b6296797de7ffcc545b83b5b69fe8d8ced07ff7426d573c6d13dbd97abaa2df95ffa57895becf592bf725be8d66623b5b9792fd9e5fe2c43c5f8b5fb06b5e570d56d1e2679af5ba78fd4922a59bcf5fd4b6d139d2714e52cb1fc6d189b25e12d7dd4b3c16d1fcf8af2ab1f6cce7e9b3794eff9c5453e2da3651bc247ee677651fd7c9c66e571bf3a058d5ddd1ed73fefb2cd65912a871126a7f93d6668dbc04e65f17fb6cca9a0b868be6de96e2eaa1b9a64c22e9ead67c92f985d9b1994dace74db7d9636d3f63d14c92f0394969bcf6ab4accde9b53ffb55836fcca99fe8ea9a6c4b5fdc4e421b8fbb02372b8da7847e16fc38fc4aea592c7e42999b812e65b838692e76cdeb597bd832c9b4718ea387c47db5fcb67da1f6ceaf6b697f0ac3f50fb9ecbe399ccee7dcc570c2257a5febbe646fe3e93a0660f5fe4305bdfafaf33f07693a9ec252fc90c6296af2b314b56d7becc6606b077adca43bef757fa3de13f36b9d515556bdbc4b0e35f7ecc0f5c7d1cf8633c387a4c5ee573f2e63e65fe1bda2dee45c18ef627614dca89d32f8f9d647e5e16e766764d9fc3a218687edf4de60bc6e342fe4ef5f97a705c30d4eaaee6c9c23e9f5bb0f5de43f21ef324ff5de5ef29f1272d4ab5798b6bfa897c9af43e9b1ff8c9df49b2eb49772772f37ebeba5ff9a295d8f70a760baf57f23bbd5e7caed576ae922cfe2db4e3c73a161ecfd91fce37f1cfe2fd6a7e32df317f774a501887e9257b16ac4dfb51e21f92d4e9f76c229f78d7daa6c8a22dccfebf866d94c9be9bc5b572d131fafbdea2e3f536499fe2fefe9b17a24d9de3032efee863369dbef63db14f94ee25709d6192cfa8fa51e21f93b2f97fd68dbca1199debbe8f9f3fcb1367e8e... [truncated message content] |
From: <je...@us...> - 2003-07-31 18:12:51
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv7572 Modified Files: guimain.py Log Message: Reduced window size a little. Index: guimain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guimain.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** guimain.py 17 Jul 2003 13:12:14 -0000 1.4 --- guimain.py 31 Jul 2003 18:10:51 -0000 1.5 *************** *** 1,7 **** # -*- coding: utf-8 -*- ! # Form implementation generated from reading ui file 'ui/guimain.ui' # ! # Created: Thu Jul 17 12:24:59 2003 # by: The PyQt User Interface Compiler (pyuic) 3.6 # --- 1,7 ---- # -*- coding: utf-8 -*- [...2541 lines suppressed...] self.connect(self.b_ScanDVD,SIGNAL("clicked()"),self.scanDVD) self.connect(self.b_RipDVD,SIGNAL("clicked()"),self.openRipDialogue) self.connect(self.fileSize,SIGNAL("valueChanged(int)"),self.newFileSize) self.connect(self.audioBitRate,SIGNAL("activated(int)"),self.newAudioBitrate) *************** *** 1553,1558 **** self.connect(self.dvdTracks,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&,int)"),self.renameTrack) self.connect(self.b_Settings,SIGNAL("clicked()"),self.openSettingsDialogue) - self.connect(self.b_Browse,SIGNAL("clicked()"),self.browseHD) self.connect(self.videoBitRate,SIGNAL("valueChanged(int)"),self.newBitrate) self.textLabel1_4_2.setBuddy(self.outputDir) --- 1408,1414 ---- self.connect(self.dvdTracks,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&,int)"),self.renameTrack) self.connect(self.b_Settings,SIGNAL("clicked()"),self.openSettingsDialogue) self.connect(self.videoBitRate,SIGNAL("valueChanged(int)"),self.newBitrate) + self.connect(self.outputDir,SIGNAL("textChanged(const QString&)"),self.checkEnableRip) + self.connect(self.b_Browse,SIGNAL("clicked()"),self.browseHD) self.textLabel1_4_2.setBuddy(self.outputDir) |
From: <je...@us...> - 2003-07-31 17:29:31
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv30188 Modified Files: gui.py Log Message: Fixed some tabulation problems. Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** gui.py 30 Jul 2003 21:37:14 -0000 1.18 --- gui.py 31 Jul 2003 17:18:33 -0000 1.19 *************** *** 309,333 **** if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) --- 309,333 ---- if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) |
From: <je...@us...> - 2003-07-30 21:50:21
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv6391 Modified Files: dvd.py Log Message: Some code cleanup. Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** dvd.py 30 Jul 2003 11:07:10 -0000 1.26 --- dvd.py 30 Jul 2003 21:48:15 -0000 1.27 *************** *** 14,492 **** class DVD: ! """Generic DVD functions for QuickRip: ! loadConfig() - load config file ! createConfig - create config file ! calcRate() - calculates a DivX bitrate ! scanDVD() - scans DVD for tracks, builds data structure ! ripDVD() - takes data structure and rips given tracks ! To use, inherit the class and provide the interface functions DVD() calls: ! 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): ! self.cwd = os.getcwd() ! self.numtitles = 0 ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! #self.configfile = os.path.expanduser("~") + "/.quickriprc" ! self.configfile = os.path.join(os.path.expanduser("~"), ".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! def loadConfig(self): ! # Check config file exists ! if not os.path.isfile(self.configfile): ! self.createConfig() ! # Load configuration options from config file ! config = {} ! parser = ConfigParser.ConfigParser() ! parser.readfp(open(self.configfile, 'r')) ! config['mplayer'] = parser.get("paths", "mplayer") ! config['mencoder'] = parser.get("paths", "mencoder") ! config['tcprobe'] = parser.get("paths", "tcprobe") ! config['outputdir'] = parser.get("paths", "outputdir") ! config['deinterlacing'] = parser.get("mencoder", "deinterlacing") ! config['aspectratio'] = parser.get("mencoder", "aspectratio") ! # Upgrade old configs by catching exceptions ! try: ! config['passes'] = int(parser.get("mencoder", "passes")) ! except: ! config['passes'] = 0 ! parser.set("mencoder", "passes", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['pdamode'] = parser.get("mencoder", "pdamode") ! except: ! config['pdamode'] = 0 ! parser.set("mencoder", "pdamode", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['dvd_device'] = parser.get("paths", "dvd_device") ! except: ! config['dvd_device'] = os.path.join("/", "dev", "dvd") ! parser.set("paths", "dvd_device", config['dvd_device']) ! parser.write(open(self.configfile, 'w')) ! try: ! config['videocodec'] = parser.get("mencoder", "videocodec") ! except: ! config['videocodec'] = 0 ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! return (config, parser) ! def createConfig(self): ! # Find the programs mplayer, mencoder and tcprobe ! #paths = ['/usr/bin/', '/usr/local/bin/', '/opt/bin/', '/sbin/', '/usr/sbin/', '/bin', '/usr/X11R6/lib/X11/bin'] ! paths = config.paths ! mplayer, mencoder, tcprobe = "", "", "" ! for path in paths: ! #if os.path.isfile(path + "mplayer"): ! if os.path.isfile(os.path.join(path, "mplayer")): ! #mplayer = path + "mplayer" ! mplayer = os.path.join(path, "mplayer") ! #if os.path.isfile(path + "mencoder"): ! if os.path.isfile(os.path.join(path, "mencoder")): ! #mencoder = path + "mencoder" ! mencoder = os.path.join(path, "mencoder") ! if os.path.isfile(os.path.join(path, "tcprobe")): ! #tcprobe = path + "tcprobe" ! tcprobe = os.path.join(path, "tcprobe") ! if not mplayer:# == "": ! self.int_configError("mplayer") ! if not mencoder:# == "": ! self.int_configError("mencoder") ! if not tcprobe:# == "": ! self.int_configError("tcprobe") ! # Find home directory ! outdir = os.path.expanduser("~") ! dvd_device = os.path.join("/", "dev", "dvd") ! # Create config ! parser = ConfigParser.ConfigParser() ! parser.add_section("paths") ! parser.add_section("mencoder") ! parser.set("paths", "mplayer", mplayer) ! parser.set("paths", "mencoder", mencoder) ! parser.set("paths", "tcprobe", tcprobe) ! parser.set("paths", "dvd_device", dvd_device) ! parser.set("paths", "outputdir", outdir) ! parser.set("mencoder", "deinterlacing", 0) ! parser.set("mencoder", "aspectratio", 0) ! parser.set("mencoder", "passes", 3) ! parser.set("mencoder", "pdamode", 0) ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! def calcRate(self, length, audiobr, filesize): ! """Calculate bitrate for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - size of resultant file (MB)""" ! try: ! self.filesize = int(filesize) ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.rate = ((self.filesize * 8192) / self.length) - self.audiobr ! self.rate = self.rate * 0.98 # Correction based on addition of credits and usual error ! return self.rate ! except: ! return 1 ! def calcFileSize(self, length, audiobr, bitrate): ! """Calculate vilesize for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - bitrate of track (Kbps)""" ! try: ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.bitrate = int(bitrate) ! self.filesize = ((self.bitrate + self.audiobr) * self.length) / 8192 ! self.filesize = self.filesize * (1 / 0.98) # Correction based on addition of credits and usual error ! return self.filesize ! except: ! return 1 ! def scanDVD(self): ! """Scan DVD drive for titles with mplayer, and chapters and playback time with tcprobe""" ! self.int_startScanning() ! self.tracks = [] ! # Find number of tracks, audio languages and subtitle languages with MPlayer ! self.numtitles = 0 ! cmd_mplayer = "".join([str(self.config['mplayer']), ' -v dvd:// -identify -quiet -nocache 2>/dev/null']) ! text = os.popen(cmd_mplayer).readlines() ! del cmd_mplayer ! regexp_titl = re.compile('There are (\d.*) titles on this DVD') ! regexp_lang = re.compile('\[open\] audio stream:.*language: (\w*) aid.*') ! regexp_subt = re.compile('\[open\] subtitle.*language: (\w*)') ! for line in text: ! if regexp_titl.search(line): ! self.numtitles = regexp_titl.search(line).group(1) ! elif regexp_lang.search(line): ! lang = regexp_lang.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.alangs.append(lang) ! elif regexp_subt.search(line): ! lang = regexp_subt.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.slangs.append(lang) ! self.alangs.sort() ! self.slangs.sort() ! # Warn user of problems scanning drive ! if not self.numtitles:# == 0: ! self.int_noTracks() ! # Assume DVD is in english if nothing else ! # TODO: add default language to settings ! if not len(self.alangs):# == 0: ! self.alangs.append("en") ! self.int_dispDVD() ! # Run through tracks looking for playback times, chapters and cropping ! for i in range(int(self.numtitles) + 1): ! if i > 0: ! cmd_tcprobe = "".join([str(self.config['tcprobe']), " -i ", str(self.config['dvd_device']) + " -T ", str(i) + " 2>&1"]) ! text = os.popen(cmd_tcprobe).readlines() ! del cmd_tcprobe ! regexp_error = re.compile('No such file or directory') ! regexp_time = re.compile('.*title playback time: (.*):(.*):(\d*)\.\d* (\d*) sec') ! regexp_chap = re.compile('.*: (\d*) chapter.*') ! #regexp_scale = re.compile('.* (\d*x\d*) video.*') ! time_label = "" ! numchapters = 0 ! # Look for info in output, line by line ! for line in text: ! if regexp_error.search(line): ! self.int_noTracks() ! return ! if regexp_time.search(line): ! hours = regexp_time.search(line).group(1) ! minutes = regexp_time.search(line).group(2) ! seconds = regexp_time.search(line).group(3) ! time = regexp_time.search(line).group(4) ! time_label = "%2s hrs %2s mins %2s secs" % (hours, minutes, seconds) ! elif regexp_chap.search(line): ! numchapters = regexp_chap.search(line).group(1) ! #elif regexp_scale.search(line): ! # scale = regexp_scale.search(line).group(1) ! ! # Clean up title ! if i < 10: title_label = "".join(["0", str(i)]) ! else: title_label = str(i) ! # TODO ! # Find out length of each chapter ! # Set-up new track ! self.track = {} ! self.track['id'] = i ! self.track['name'] = title_label ! self.track['numchapters'] = int(numchapters) ! self.track['time'] = int(time) ! self.track['timelabel'] = time_label ! self.track['size'] = 680 ! self.track['abr'] = 96 ! self.track['abr_id'] = 1 ! self.track['vbr'] = self.calcRate(int(time), 96, 680) ! #self.track['scale'] = scale ! self.track['rip'] = "no" ! self.tracks.append(self.track) ! self.int_dispTrack(self.track) ! self.int_finishScanning() ! def ripDVD(self): ! """Rip the DVD based on the tracks data structure""" ! self.int_startRipping() ! self.state = "ripping" ! try: ! os.chdir(self.outdir) ! except OSError, msg: ! print "Unable to change to directory %s: %s" % (self.outdir, msg) ! # Build list of tracks to rip ! self.torip = [] ! for track in self.tracks: ! if track['rip'] == 'yes': ! self.torip.append(track) ! self.numrips = len(self.torip) ! # Check PDA mode (universal to all ripping methods) ! if int(self.config['pdamode']) == 0: ! resolution = "720" ! else: ! resolution = "320" ! # Run through selected tracks ripping each one ! i = 0 ! for item in self.torip: ! i = i + 1 ! self.track = item ! self.output = os.path.join(self.outdir, "".join([str(self.track['name']), ".avi"])) ! #self.output = re.sub(' ', '\\ ', self.output) # deprecated by making command a list ! self.int_newTrack(self.track['name'], i, self.numrips, self.track['vbr']) ! self.vol = "" ! self.volumead = str(self.volumead) ! if (self.volumead is not "0"): ! self.vol = "".join([":vol=", self.volumead]) ! ! # Look for cropping ! sstep = int(self.track['time']) / 31 ! if not sstep: ! sstep = 1 ! cmd = "".join(["mplayer -dvd ", str(self.track['id']), " -vop cropdetect -nosound -vo null -frames 10 -sstep ", str(sstep), " 2>/dev/null"]) ! text = os.popen(cmd).readlines() ! regexp = re.compile('.*-vop crop=(\d*:\d*:\d*:\d*).*') ! crop_options = {} ! common_crop = "" ! cc_hits = 0 ! for line in text: ! if regexp.search(line): ! crop = regexp.search(line).group(1) ! try: ! crop_options[crop] = crop_options[crop] + 1 ! if crop_options[crop] > cc_hits: ! common_crop = crop ! except: ! crop_options[crop] = 1 ! self.track['crop'] = common_crop ! # Clean up output dir in case QuickRip crashed out there ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! lameopts = "".join(["cbr=", str(self.track['abr']), str(self.vol)]) ! if self.config['videocodec']: ! ovc = "xvid" ! ovc_opts_type = "-xvidencopts" ! ovc_opts = "".join(["4mv:me_quality=6:mod_quant:quant_range=1-31/1-31:bitrate=", str(int(self.track['vbr']))]) ! else: ! ovc = "lavc" ! ovc_opts_type = "-lavcopts" ! ovc_opts = "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr']))]) ! vop = "".join(["scale,crop=",self.track['crop']]) ! if int(self.config['deinterlacing']) is not 0: ! vop = "".join([vop, ",", self.dio[self.config['deinterlacing']]]) ! if self.config['passes'] is 1: ! all_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", \ ! "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! all_pass.insert(3, "-aspect") ! all_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! all_pass.insert(3, "-slang") ! all_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string = "" ! for bit in all_pass: ! bit = "".join([" ", bit]) ! string = "".join([string, bit]) ! print all_pass ! print string ! # sys.exit(1) ! self.runPass("audio", all_pass) ! elif not self.config['passes'] or self.config['passes'] is 2: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", "-xy", resolution, \ ! "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass.insert(3, "-aspect") ! video_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass.insert(3, "-slang") ! video_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string1 = "" ! string2 = "" ! for bit in audio_pass: ! bit = "".join([" ", str(bit)]) ! string1 = "".join([string1, bit]) ! for bit in video_pass: ! bit = "".join([" ", str(bit)]) ! string2 = "".join([string2, bit]) ! print string1 ! print string2 ! # sys.exit(1) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass) ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! elif self.config['passes'] is 3: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass1 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=1"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! video_pass2 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=2"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass1.insert(3, "-aspect") ! video_pass1.insert(4, self.aro[self.config['aspectratio']]) ! video_pass2.insert(3, "-aspect") ! video_pass2.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass1.insert(3, "-slang") ! video_pass1.insert(4, self.sLanguage) ! video_pass2.insert(3, "-slang") ! video_pass2.insert(4, self.sLanguage) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass1) ! self.runPass("video2", video_pass2) ! ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! os.chdir(self.cwd) ! self.int_finishRipping() ! def runPass(self, name, command): ! # Nasty GUI-specific code to stop GUI running on to other passes when previous ! # pass was cleanly stopped (without exiting the whole program) ! if self.state is "stopped": ! return ! pipe_perc = re.compile('.*f \((.\d)\%\)*') ! pipe_Trem = re.compile('(?P<int>[0-9]+)min') ! perc = 0 ! Trem = 0 ! self.int_newPass(name) ! self.pipe = popen2.Popen4(command) ! pid = self.pipe.pid ! while 1: ! line = self.pipe.fromchild.read(1000) ! if not line:# == '': ! break ! if pipe_perc.search(line): ! perc = pipe_perc.search(line).group(1) ! perc = re.sub(' ', '', perc) ! if pipe_Trem.search(line): ! Trem = pipe_Trem.search(line).group(0) ! self.int_updateProgress(perc, Trem, name) ! os.waitpid(pid, os.WNOHANG) ! ## INHERIT THE CLASS AND SUBSTITUE THESE CLASS METHODS WITH YOUR ! ## OWN UI HOOKS ! def int_startScanning(self): ! pass ! def int_noTracks(self): ! pass ! def int_dispDVD(self): ! pass ! def int_dispTrack(self, track): ! pass ! def int_finishScanning(self): ! pass ! def int_startRipping(self): ! pass ! def int_newTrack(self, name, number, total, vbr): ! pass ! def int_newPass(self, passtype): ! pass ! def int_updateProgress(self, perc, tpass): ! pass ! def int_finishRipping(self): ! pass --- 14,486 ---- class DVD: ! """Generic DVD functions for QuickRip: ! loadConfig() - load config file ! createConfig - create config file ! calcRate() - calculates a DivX bitrate ! scanDVD() - scans DVD for tracks, builds data structure ! ripDVD() - takes data structure and rips given tracks ! To use, inherit the class and provide the interface functions DVD() calls: ! 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): ! self.cwd = os.getcwd() ! self.numtitles = 0 ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! #self.configfile = os.path.expanduser("~") + "/.quickriprc" ! self.configfile = os.path.join(os.path.expanduser("~"), ".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! def loadConfig(self): ! # Check config file exists ! if not os.path.isfile(self.configfile): ! self.createConfig() ! # Load configuration options from config file ! config = {} ! parser = ConfigParser.ConfigParser() ! parser.readfp(open(self.configfile, 'r')) ! config['mplayer'] = parser.get("paths", "mplayer") ! config['mencoder'] = parser.get("paths", "mencoder") ! config['tcprobe'] = parser.get("paths", "tcprobe") ! config['outputdir'] = parser.get("paths", "outputdir") ! config['deinterlacing'] = parser.get("mencoder", "deinterlacing") ! config['aspectratio'] = parser.get("mencoder", "aspectratio") ! # Upgrade old configs by catching exceptions ! try: ! config['passes'] = int(parser.get("mencoder", "passes")) ! except: ! config['passes'] = 0 ! parser.set("mencoder", "passes", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['pdamode'] = parser.get("mencoder", "pdamode") ! except: ! config['pdamode'] = 0 ! parser.set("mencoder", "pdamode", 0) ! parser.write(open(self.configfile, 'w')) ! try: ! config['dvd_device'] = parser.get("paths", "dvd_device") ! except: ! config['dvd_device'] = os.path.join("/", "dev", "dvd") ! parser.set("paths", "dvd_device", config['dvd_device']) ! parser.write(open(self.configfile, 'w')) ! try: ! config['videocodec'] = parser.get("mencoder", "videocodec") ! except: ! config['videocodec'] = 0 ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! return (config, parser) ! def createConfig(self): ! # Find the programs mplayer, mencoder and tcprobe ! paths = config.paths ! mplayer, mencoder, tcprobe = "", "", "" ! for path in paths: ! if os.path.isfile(os.path.join(path, "mplayer")): ! mplayer = os.path.join(path, "mplayer") ! if os.path.isfile(os.path.join(path, "mencoder")): ! mencoder = os.path.join(path, "mencoder") ! if os.path.isfile(os.path.join(path, "tcprobe")): ! tcprobe = os.path.join(path, "tcprobe") ! if not mplayer: ! self.int_configError("mplayer") ! if not mencoder: ! self.int_configError("mencoder") ! if not tcprobe: ! self.int_configError("tcprobe") ! # Find home directory ! outdir = os.path.expanduser("~") ! dvd_device = os.path.join("/", "dev", "dvd") ! # Create config ! parser = ConfigParser.ConfigParser() ! parser.add_section("paths") ! parser.add_section("mencoder") ! parser.set("paths", "mplayer", mplayer) ! parser.set("paths", "mencoder", mencoder) ! parser.set("paths", "tcprobe", tcprobe) ! parser.set("paths", "dvd_device", dvd_device) ! parser.set("paths", "outputdir", outdir) ! parser.set("mencoder", "deinterlacing", 0) ! parser.set("mencoder", "aspectratio", 0) ! parser.set("mencoder", "passes", 3) ! parser.set("mencoder", "pdamode", 0) ! parser.set("mencoder", "videocodec", 0) ! parser.write(open(self.configfile, 'w')) ! def calcRate(self, length, audiobr, filesize): ! """Calculate bitrate for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - size of resultant file (MB)""" ! try: ! self.filesize = int(filesize) ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.rate = ((self.filesize * 8192) / self.length) - self.audiobr ! self.rate = self.rate * 0.98 # Correction based on addition of credits and usual error ! return self.rate ! except: ! return 1 ! def calcFileSize(self, length, audiobr, bitrate): ! """Calculate vilesize for video based on: ! - length of track (seconds) ! - audio bitrate (kbps) ! - bitrate of track (Kbps)""" ! try: ! self.length = int(length) ! self.audiobr = int(audiobr) ! self.bitrate = int(bitrate) ! self.filesize = ((self.bitrate + self.audiobr) * self.length) / 8192 ! self.filesize = self.filesize * (1 / 0.98) # Correction based on addition of credits and usual error ! return self.filesize ! except: ! return 1 ! def scanDVD(self): ! """Scan DVD drive for titles with mplayer, and chapters and playback time with tcprobe""" ! self.int_startScanning() ! self.tracks = [] ! # Find number of tracks, audio languages and subtitle languages with MPlayer ! self.numtitles = 0 ! cmd_mplayer = "".join([str(self.config['mplayer']), ' -v dvd:// -identify -quiet -nocache 2>/dev/null']) ! text = os.popen(cmd_mplayer).readlines() ! del cmd_mplayer ! regexp_titl = re.compile('There are (\d.*) titles on this DVD') ! regexp_lang = re.compile('\[open\] audio stream:.*language: (\w*) aid.*') ! regexp_subt = re.compile('\[open\] subtitle.*language: (\w*)') ! for line in text: ! if regexp_titl.search(line): ! self.numtitles = regexp_titl.search(line).group(1) ! elif regexp_lang.search(line): ! lang = regexp_lang.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.alangs.append(lang) ! elif regexp_subt.search(line): ! lang = regexp_subt.search(line).group(1) ! if lang is 'unknown': ! lang = 'en' ! self.slangs.append(lang) ! self.alangs.sort() ! self.slangs.sort() ! # Warn user of problems scanning drive ! if not self.numtitles: ! self.int_noTracks() ! # Assume DVD is in english if nothing else ! # TODO: add default language to settings ! if not len(self.alangs): ! self.alangs.append("en") ! self.int_dispDVD() ! # Run through tracks looking for playback times, chapters and cropping ! for i in range(int(self.numtitles) + 1): ! if i > 0: ! cmd_tcprobe = "".join([str(self.config['tcprobe']), " -i ", str(self.config['dvd_device']) + " -T ", str(i) + " 2>&1"]) ! text = os.popen(cmd_tcprobe).readlines() ! del cmd_tcprobe ! regexp_error = re.compile('No such file or directory') ! regexp_time = re.compile('.*title playback time: (.*):(.*):(\d*)\.\d* (\d*) sec') ! regexp_chap = re.compile('.*: (\d*) chapter.*') ! #regexp_scale = re.compile('.* (\d*x\d*) video.*') ! time_label = "" ! numchapters = 0 ! # Look for info in output, line by line ! for line in text: ! if regexp_error.search(line): ! self.int_noTracks() ! return ! if regexp_time.search(line): ! hours = regexp_time.search(line).group(1) ! minutes = regexp_time.search(line).group(2) ! seconds = regexp_time.search(line).group(3) ! time = regexp_time.search(line).group(4) ! time_label = "%2s hrs %2s mins %2s secs" % (hours, minutes, seconds) ! elif regexp_chap.search(line): ! numchapters = regexp_chap.search(line).group(1) ! #elif regexp_scale.search(line): ! # scale = regexp_scale.search(line).group(1) ! ! # Clean up title ! if i < 10: title_label = "".join(["0", str(i)]) ! else: title_label = str(i) ! # TODO ! # Find out length of each chapter ! # Set-up new track ! self.track = {} ! self.track['id'] = i ! self.track['name'] = title_label ! self.track['numchapters'] = int(numchapters) ! self.track['time'] = int(time) ! self.track['timelabel'] = time_label ! self.track['size'] = 680 ! self.track['abr'] = 96 ! self.track['abr_id'] = 1 ! self.track['vbr'] = self.calcRate(int(time), 96, 680) ! #self.track['scale'] = scale ! self.track['rip'] = "no" ! self.tracks.append(self.track) ! self.int_dispTrack(self.track) ! self.int_finishScanning() ! def ripDVD(self): ! """Rip the DVD based on the tracks data structure""" ! self.int_startRipping() ! self.state = "ripping" ! try: ! os.chdir(self.outdir) ! except OSError, msg: ! print "Unable to change to directory %s: %s" % (self.outdir, msg) ! # Build list of tracks to rip ! self.torip = [] ! for track in self.tracks: ! if track['rip'] == 'yes': ! self.torip.append(track) ! self.numrips = len(self.torip) ! # Check PDA mode (universal to all ripping methods) ! if int(self.config['pdamode']) == 0: ! resolution = "720" ! else: ! resolution = "320" ! # Run through selected tracks ripping each one ! i = 0 ! for item in self.torip: ! i = i + 1 ! self.track = item ! self.output = os.path.join(self.outdir, "".join([str(self.track['name']), ".avi"])) ! #self.output = re.sub(' ', '\\ ', self.output) # deprecated by making command a list ! self.int_newTrack(self.track['name'], i, self.numrips, self.track['vbr']) ! self.vol = "" ! self.volumead = str(self.volumead) ! if (self.volumead is not "0"): ! self.vol = "".join([":vol=", self.volumead]) ! ! # Look for cropping ! sstep = int(self.track['time']) / 31 ! if not sstep: ! sstep = 1 ! cmd = "".join(["mplayer -dvd ", str(self.track['id']), " -vop cropdetect -nosound -vo null -frames 10 -sstep ", str(sstep), " 2>/dev/null"]) ! text = os.popen(cmd).readlines() ! regexp = re.compile('.*-vop crop=(\d*:\d*:\d*:\d*).*') ! crop_options = {} ! common_crop = "" ! cc_hits = 0 ! for line in text: ! if regexp.search(line): ! crop = regexp.search(line).group(1) ! try: ! crop_options[crop] = crop_options[crop] + 1 ! if crop_options[crop] > cc_hits: ! common_crop = crop ! except: ! crop_options[crop] = 1 ! self.track['crop'] = common_crop ! # Clean up output dir in case QuickRip crashed out there ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! lameopts = "".join(["cbr=", str(self.track['abr']), str(self.vol)]) ! if self.config['videocodec']: ! ovc = "xvid" ! ovc_opts_type = "-xvidencopts" ! ovc_opts = "".join(["4mv:me_quality=6:mod_quant:quant_range=1-31/1-31:bitrate=", str(int(self.track['vbr']))]) ! else: ! ovc = "lavc" ! ovc_opts_type = "-lavcopts" ! ovc_opts = "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr']))]) ! vop = "".join(["scale,crop=",self.track['crop']]) ! if int(self.config['deinterlacing']) is not 0: ! vop = "".join([vop, ",", self.dio[self.config['deinterlacing']]]) ! if self.config['passes'] is 1: ! all_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", \ ! "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! all_pass.insert(3, "-aspect") ! all_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! all_pass.insert(3, "-slang") ! all_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string = "" ! for bit in all_pass: ! bit = "".join([" ", bit]) ! string = "".join([string, bit]) ! print all_pass ! print string ! # sys.exit(1) ! self.runPass("audio", all_pass) ! elif not self.config['passes'] or self.config['passes'] is 2: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, ovc_opts, "-vop", vop, "-zoom", "-xy", resolution, \ ! "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass.insert(3, "-aspect") ! video_pass.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass.insert(3, "-slang") ! video_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string1 = "" ! string2 = "" ! for bit in audio_pass: ! bit = "".join([" ", str(bit)]) ! string1 = "".join([string1, bit]) ! for bit in video_pass: ! bit = "".join([" ", str(bit)]) ! string2 = "".join([string2, bit]) ! print string1 ! print string2 ! # sys.exit(1) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass) ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! elif self.config['passes'] is 3: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-oac", "mp3lame", "-lameopts", lameopts, "-ovc", "frameno", "-o", \ ! "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass1 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=1"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! video_pass2 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, \ ! "-sws", "2", "-oac", "copy", "-ovc", ovc, ovc_opts_type, "".join([ovc_opts, ":vpass=2"]), "-vop", vop, \ ! "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['aspectratio']) is not 0: ! video_pass1.insert(3, "-aspect") ! video_pass1.insert(4, self.aro[self.config['aspectratio']]) ! video_pass2.insert(3, "-aspect") ! video_pass2.insert(4, self.aro[self.config['aspectratio']]) ! if self.sLanguage is not "None": ! video_pass1.insert(3, "-slang") ! video_pass1.insert(4, self.sLanguage) ! video_pass2.insert(3, "-slang") ! video_pass2.insert(4, self.sLanguage) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass1) ! self.runPass("video2", video_pass2) ! ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! os.chdir(self.cwd) ! self.int_finishRipping() ! def runPass(self, name, command): ! # Nasty GUI-specific code to stop GUI running on to other passes when previous ! # pass was cleanly stopped (without exiting the whole program) ! if self.state is "stopped": ! return ! pipe_perc = re.compile('.*f \((.\d)\%\)*') ! pipe_Trem = re.compile('(?P<int>[0-9]+)min') ! perc = 0 ! Trem = 0 ! self.int_newPass(name) ! self.pipe = popen2.Popen4(command) ! pid = self.pipe.pid ! while 1: ! line = self.pipe.fromchild.read(1000) ! if not line:# == '': ! break ! if pipe_perc.search(line): ! perc = pipe_perc.search(line).group(1) ! perc = re.sub(' ', '', perc) ! if pipe_Trem.search(line): ! Trem = pipe_Trem.search(line).group(0) ! self.int_updateProgress(perc, Trem, name) ! os.waitpid(pid, os.WNOHANG) ! ## INHERIT THE CLASS AND SUBSTITUE THESE CLASS METHODS WITH YOUR ! ## OWN UI HOOKS ! def int_startScanning(self): ! pass ! def int_noTracks(self): ! pass ! def int_dispDVD(self): ! pass ! def int_dispTrack(self, track): ! pass ! def int_finishScanning(self): ! pass ! def int_startRipping(self): ! pass ! def int_newTrack(self, name, number, total, vbr): ! pass ! def int_newPass(self, passtype): ! pass ! def int_updateProgress(self, perc, tpass): ! pass ! def int_finishRipping(self): ! pass |
From: <je...@us...> - 2003-07-30 21:39:18
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv4568 Modified Files: gui.py Log Message: Some cleanup here and there. Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** gui.py 30 Jul 2003 11:07:11 -0000 1.17 --- gui.py 30 Jul 2003 21:37:14 -0000 1.18 *************** *** 13,27 **** from dvd import * try: ! from qt import * except: ! print "Couldn't load PyQT module! Check it's installed properly." ! print "If you think it is, but you still get this message, please" ! print "see the frequent problems page online at:" ! print "http://quickrip.sf.net/fp.shtml" ! print "" ! print "Press Enter for the full Qt error message" ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings --- 13,30 ---- from dvd import * try: ! from qt import * except: ! print """ ! Unable to load the PyQt module! ! Check it's installed properly. ! If you think it is, but you still get this message, please ! see the frequent problems page online at ! http://quickrip.sf.net/fp.shtml ! ! Press Enter for the full Qt error message ! """ ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings *************** *** 41,511 **** class GUI(DVD, MainWindow): ! """GUI-specific functions to add a Qt GUI to the DVD class: ! changeState() - start/stop the ripping process ! int_startScanning() - notify user that the DVD is being scanned ! int_noTracks() - notify user that no tracks were found ! int_dispDVD() - display information about the DVD ! int_dispTrack() - display information about scanned track ! int_finishScanning() - notify user that scanning has finished ! int_startRipping() - notify user that ripping has started ! int_newTrack() - notify that ripping has begun on a new track ! int_newPass() - notify that new ripping pass has begun ! int_updateProgress() - update any ripping progress display being used ! int_finishRipping() - notify user that ripping has finished""" ! def __init__(self, app, parent=None): ! self.app = app ! MainWindow.__init__(self, parent) ! self.setIcon(QPixmap(config.icon)) # set application icon... ! self.DVD_DEVICE = "/dev/dvd" ! self.cwd = os.getcwd() ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! self.configfile = os.path.join(os.path.expanduser("~"),".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! self.outputDir.setText(self.config['outputdir']) ! self.outdir = self.config['outputdir'] ! def int_configError(self, bin): ! self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") ! sys.exit(2) ! def int_startScanning(self): ! print "* Scanning DVD..." ! self.b_ScanDVD.setText("Scanning...") ! self.dvdTracks.clear() ! def int_noTracks(self): ! QMessageBox.warning(self, "QuickRip Error", "QuickRip was unable to find any " ! "DVD tracks.\n\nCheck:\n* Mplayer and Transcode are " ! "installed\n* The program paths are correct in Settings\n" ! "* Mplayer can play DVDs\n* You have a DVD " ! "in your drive", "OK") ! self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): ! #print "Found %s titles" % (self.numtitles) ! #print "Found audio languages %s" % (self.alangs) ! #print "Found subtitle languages %s" % (self.slangs) ! print "Found %s titles\nFound audio languages %s\nFound subtitle languages %s\n" % \ ! (self.numtitles, self.alangs, self.slangs) ! # Add languages to drop-down menus ! for lang in self.alangs: ! self.aLang.insertItem(lang, -1) ! for lang in self.slangs: ! self.subTitles.insertItem(lang, -1) ! def int_dispTrack(self, track): ! self.track = track ! print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = QListViewItem(self.dvdTracks,None) ! item.setText(0, self.track['name']) ! item.setText(1, str(self.track['timelabel'])) ! item.info = self.track ! for i in range(int(self.track['numchapters']) + 1): ! if i > 0: ! if i < 10: i = "0" + str(i) ! chap_label = "Chapter %s" % (i) ! subitem = QListViewItem(item,None) ! subitem.setText(0, self.tr(chap_label)) ! self.app.processEvents() ! def int_finishScanning(self): ! print "* Finished scanning" ! self.b_ScanDVD.setText("Scan DVD") ! def int_startRipping(self): ! print "* Starting ripping" ! def int_newTrack(self, name, number, total, vbr): ! print "*\tRipping track '%s' (%s of %s) at %skbps" % (name, number, total, vbr) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def int_newPass(self, passtype): ! self.passtype = passtype ! if self.passtype is "video1": ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.passtype is "video2": ! self.Dialogue.pm_videoPass1.setProgress(100) ! def int_updateProgress(self, perc, trem, tpass): ! self.percentage = perc ! self.trem = trem ! self.tpass = tpass ! eta = "".join(["ETA: ", str(trem), " (approximately)"]) ! self.Dialogue.l_ETA.setText(eta) ! if self.tpass is "all": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "audio": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "video1": ! self.Dialogue.pm_videoPass1.setProgress(int(perc)) ! elif self.tpass is "video2": ! self.Dialogue.pm_videoPass2.setProgress(int(perc)) ! self.app.processEvents() ! def int_finishRipping(self): ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_videoPass1.setProgress(100) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_videoPass2.setProgress(100) ! print "* Ripping finished" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.l_ETA.setText("ETA: N/A") ! self.state = "stopped" ! os.chdir(self.cwd) ! def selectTrack(self, const, qpoint, col): ! """Select tracks to rip by setting column 2 to 'yes'""" ! # Check the mouse isn't clicking in blank space ! self.track = self.dvdTracks.selectedItem() ! try: ! checker = self.track.text(0) ! del checker ! except: ! return ! # Check if the user has clicked on a title or a chapter ! chap = re.compile('Chapter.*') ! if not chap.search(str(self.track.text(0))): ! # Stop short of tagging for ripping unless "Rip" column is selected ! if col is not 2: ! self.updateTrackDisplay(self.track) ! return ! if self.track.info['rip'] is "yes": ! self.track.setPixmap(2, self.image_blank) ! self.updateTrackRip(self.track, mode="remove") ! else: ! self.track.setPixmap(2, self.image_tick) ! self.updateTrackRip(self.track, mode="add") ! self.checkEnableRip() ! def updateTrackDisplay(self, track): ! self.track = track ! self.track.info['name'] = self.track.text(0) ! if abs(int(str(self.fileSize.cleanText())) - self.track.info['size']) > 1: ! self.fileSize.setValue(self.track.info['size']) ! if abs(self.audioBitRate.currentItem() - self.track.info['abr_id']) > 1: ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.track.info['abr'] = self.audioBitRate.currentText() ! if abs(int(str(self.videoBitRate.cleanText())) - self.track.info['vbr']) > 1: ! self.videoBitRate.setValue(self.track.info['vbr']) ! self.videoBitRateSlider.setValue(self.track.info['vbr']) ! def updateTrackRip(self, track, mode): ! """Update track's rip attribute""" ! if not len(self.tracks): ! return ! # Add/remove "rip" status to/from track ! self.mode = mode ! if self.mode is "remove": ! self.track.info['rip'] = "no" ! elif self.mode is "add": ! self.track.info['rip'] = "yes" ! self.updateTrackDisplay(self.track) ! def newFileSize(self, filesize): ! self.track = self.dvdTracks.selectedItem() ! self.filesize = int(str(self.fileSize.cleanText())) ! self.track.info['size'] = int(self.filesize) ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! #print "new file size, changing video bitrate to %s (size: %s, length %s, abr %s)" % (self.track.info['vbr'], self.track.info['size'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.bitrate = int(str(self.videoBitRate.cleanText())) ! self.track.info['vbr'] = self.bitrate ! self.track.info['size'] = self.calcFileSize(self.track.info['time'], self.track.info['abr'], self.track.info['vbr']) ! #print "new bitrate, changing file size to %s (vbr: %s, length %s, abr %s)" % (self.track.info['size'],self.track.info['vbr'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newAudioBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.audiobitrate = int(str(self.audioBitRate.currentText())) ! print self.audiobitrate ! self.track.info['abr'] = self.audiobitrate ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! self.updateTrackDisplay(self.track) ! def checkEnableRip(self): ! r = str(self.videoBitRate.cleanText()) ! o = str(self.outputDir.text()) ! t = 0 ! for track in self.tracks: ! if track['rip'] is "yes": ! t = 1 ! if len(r) > 0 and len(o) > 0 and t is 1: ! self.b_RipDVD.setEnabled(1) ! else: ! self.b_RipDVD.setEnabled(0) ! def renameTrack(self, item): ! """Set ViewListItem to be renamed""" ! self.item = item ! self.item.setRenameEnabled(0, 1) ! self.item.startRename(0) ! def browseHD(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.outputDir.setText(str(directory)) ! self.outdir = str(directory) ! self.checkEnableRip() ! def openRipDialogue(self): ! try: ! os.chdir(config.qr_dir) ! except OSError, msg: ! print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" ! #import output ! #print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 282, GUI.PY)") ! self.state = "stopped" ! self.Dialogue = dialogueProgress(self) ! self.Dialogue.connect(self.Dialogue.b_changeState,SIGNAL("clicked()"),self.changeState) ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! # Add in progress bars appropriate to number of passes ! l_audiopass = QHBoxLayout(None,0,6,"l_audiopass") ! self.Dialogue.textLabel3 = QLabel(self.Dialogue.groupBox3,"textlabel3") ! l_audiopass.addWidget(self.Dialogue.textLabel3) ! self.Dialogue.pm_audioPass = QProgressBar(self.Dialogue.groupBox3,"pm_audioPass") ! self.Dialogue.pm_audioPass.setMinimumSize(QSize(400,0)) ! l_audiopass.addWidget(self.Dialogue.pm_audioPass) ! self.Dialogue.groupBox3Layout.addLayout(l_audiopass,2,0) ! self.Dialogue.textLabel3.setText(self.tr("Progress:")) ! if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) ! if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) ! # if self.config['passes'] is 1: ! # from guiprogressdialogue_1pass import dialogProgress ! # elif self.config['passes'] is 2: ! # from guiprogressdialogue_2pass import dialogProgress ! # elif not self.config['passes'] or self.config['passes'] is 3: ! # from guiprogressdialogue_3pass import dialogProgress ! self.Dialogue.exec_loop() ! def changeState(self): ! """Switch dialogue between stopped and ripping, changing buttons ! and starting/stopping ripping process""" ! if self.state is "stopped": ! self.Dialogue.b_changeState.setText("Stop") ! self.Dialogue.b_closeProgressDialogue.setEnabled(0) ! os.chdir(self.outdir) ! self.volumead = str(self.volume.currentText()) ! self.aLanguage = str(self.aLang.currentText()) ! self.sLanguage = str(self.subTitles.currentText()) ! self.ripDVD() ! elif self.state is "ripping": ! print "* Ripping aborted" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! try: ! pid = self.pipe.pid ! os.kill(pid, 9) ! os.waitpid(pid, os.WNOHANG) ! except: ! pass ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! #elif self.config['passes'] == 0 or self.config['passes'] == 3: ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.state = "stopped" ! os.chdir(self.cwd) ! def openSettingsDialogue(self): ! """Open the settings dialogue box, connecting slots to functions""" ! self.Dialogue = dialogSettings(self) ! # Set-up defauls from config file ! self.Dialogue.mplayer.setText(self.config['mplayer']) ! self.Dialogue.mencoder.setText(self.config['mencoder']) ! self.Dialogue.tcprobe.setText(self.config['tcprobe']) ! self.Dialogue.dvdDevice.setText(self.config['dvd_device']) ! self.Dialogue.outputDir.setText(self.config['outputdir']) ! self.Dialogue.deInterlacing.setCurrentItem(int(self.config['deinterlacing'])) ! self.Dialogue.aspectRatio.setCurrentItem(int(self.config['aspectratio'])) ! self.Dialogue.encoderPasses.setCurrentItem(int(self.config['passes'])) ! self.Dialogue.videoCodec.setCurrentItem(int(self.config['videocodec'])) ! if self.config['pdamode'] == 1: ! self.Dialogue.c_pdamode.setChecked(1) ! # Connect functions ! self.connect(self.Dialogue.b_browseMPlayer,SIGNAL("clicked()"),self.browseMPlayer) ! self.connect(self.Dialogue.b_browseMencoder,SIGNAL("clicked()"),self.browseMencoder) ! self.connect(self.Dialogue.b_browseTcprobe,SIGNAL("clicked()"),self.browseTcprobe) ! self.connect(self.Dialogue.b_browseDVD,SIGNAL("clicked()"),self.browseDVD) ! self.connect(self.Dialogue.b_selectOutputDir,SIGNAL("clicked()"),self.selectOutDir) ! self.connect(self.Dialogue.b_OK,SIGNAL("clicked()"),self.changeSettings) ! self.connect(self.Dialogue.b_Save,SIGNAL("clicked()"),self.saveSettings) ! self.Dialogue.exec_loop() ! def browseMPlayer(self): ! """Launch file dialogue and set path to MPlayer""" ! self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to MPlayer") ! self.Dialogue.mplayer.setText(str(mplayer)) ! def browseMencoder(self): ! """Launch file dialogue and set path to Mencoder""" ! self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Mencoder") ! self.Dialogue.mencoder.setText(str(mencoder)) ! def browseTcprobe(self): ! """Launch file dialogue and set path to Tcprobe""" ! self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Tcprobe") ! self.Dialogue.tcprobe.setText(str(tcprobe)) ! def browseDVD(self): ! """Launch file dialogue and set path to dvd device""" ! try: ! self.path = re.compile('(/.*)/.*').search(self.config['dvd_device']).group(1) ! except: ! self.path = os.path.join("/", "dev", "dvd") ! dvd_device = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to DVD Device") ! self.Dialogue.dvdDevice.setText(str(dvd_device)) ! def selectOutDir(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.Dialogue.outputDir.setText(str(directory)) ! def changeSettings(self): ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.Dialogue.accept() ! def saveSettings(self): ! print "* Saving new settings to ~/.quickriprc" ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.parser.set('paths', 'mplayer', self.config['mplayer']) ! self.parser.set('paths', 'mencoder', self.config['mencoder']) ! self.parser.set('paths', 'tcprobe', self.config['tcprobe']) ! self.parser.set('paths', 'dvd_device', self.config['dvd_device']) ! self.parser.set('paths', 'outputdir', self.config['outputdir']) ! self.parser.set('mencoder', 'deinterlacing', self.config['deinterlacing']) ! self.parser.set('mencoder', 'aspectratio', self.config['aspectratio']) ! self.parser.set('mencoder', 'passes', self.config['passes']) ! self.parser.set('mencoder', 'pdamode', self.config['pdamode']) ! self.parser.set('mencoder', 'videocodec', self.config['videocodec']) ! self.parser.write(open(self.configfile, 'w')) def main(): ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! app = QApplication(sys.argv) ! QObject.connect(app, SIGNAL('lastWindowClosed()'), ! app, SLOT('quit()')) ! win = GUI(app) ! app.setMainWidget(win) ! win.show() ! app.exec_loop() --- 44,514 ---- class GUI(DVD, MainWindow): ! """GUI-specific functions to add a Qt GUI to the DVD class: ! changeState() - start/stop the ripping process ! int_startScanning() - notify user that the DVD is being scanned ! int_noTracks() - notify user that no tracks were found ! int_dispDVD() - display information about the DVD ! int_dispTrack() - display information about scanned track ! int_finishScanning() - notify user that scanning has finished ! int_startRipping() - notify user that ripping has started ! int_newTrack() - notify that ripping has begun on a new track ! int_newPass() - notify that new ripping pass has begun ! int_updateProgress() - update any ripping progress display being used ! int_finishRipping() - notify user that ripping has finished""" ! def __init__(self, app, parent=None): ! self.app = app ! MainWindow.__init__(self, parent) ! self.setIcon(QPixmap(config.icon)) # set application icon... ! self.DVD_DEVICE = "/dev/dvd" ! self.cwd = os.getcwd() ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! self.configfile = os.path.join(os.path.expanduser("~"),".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! self.outputDir.setText(self.config['outputdir']) ! self.outdir = self.config['outputdir'] ! def int_configError(self, bin): ! self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") ! sys.exit(2) ! def int_startScanning(self): ! print "* Scanning DVD..." ! self.b_ScanDVD.setText("Scanning...") ! self.dvdTracks.clear() ! def int_noTracks(self): ! QMessageBox.warning(self, "QuickRip Error", "QuickRip was unable to find any " ! "DVD tracks.\n\nCheck:\n* Mplayer and Transcode are " ! "installed\n* The program paths are correct in Settings\n" ! "* Mplayer can play DVDs\n* You have a DVD " ! "in your drive", "OK") ! self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): ! #print "Found %s titles" % (self.numtitles) ! #print "Found audio languages %s" % (self.alangs) ! #print "Found subtitle languages %s" % (self.slangs) ! print "Found %s titles\nFound audio languages %s\nFound subtitle languages %s\n" % \ ! (self.numtitles, self.alangs, self.slangs) ! # Add languages to drop-down menus ! for lang in self.alangs: ! self.aLang.insertItem(lang, -1) ! for lang in self.slangs: ! self.subTitles.insertItem(lang, -1) ! def int_dispTrack(self, track): ! self.track = track ! print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = QListViewItem(self.dvdTracks,None) ! item.setText(0, self.track['name']) ! item.setText(1, str(self.track['timelabel'])) ! item.info = self.track ! for i in range(int(self.track['numchapters']) + 1): ! if i > 0: ! if i < 10: i = "0" + str(i) ! chap_label = "Chapter %s" % (i) ! subitem = QListViewItem(item,None) ! subitem.setText(0, self.tr(chap_label)) ! self.app.processEvents() ! def int_finishScanning(self): ! print "* Finished scanning" ! self.b_ScanDVD.setText("Scan DVD") ! def int_startRipping(self): ! print "* Starting ripping" ! def int_newTrack(self, name, number, total, vbr): ! print "*\tRipping track '%s' (%s of %s) at %skbps" % (name, number, total, vbr) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def int_newPass(self, passtype): ! self.passtype = passtype ! if self.passtype is "video1": ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.passtype is "video2": ! self.Dialogue.pm_videoPass1.setProgress(100) ! def int_updateProgress(self, perc, trem, tpass): ! self.percentage = perc ! self.trem = trem ! self.tpass = tpass ! eta = "".join(["ETA: ", str(trem), " (approximately)"]) ! self.Dialogue.l_ETA.setText(eta) ! if self.tpass is "all": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "audio": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "video1": ! self.Dialogue.pm_videoPass1.setProgress(int(perc)) ! elif self.tpass is "video2": ! self.Dialogue.pm_videoPass2.setProgress(int(perc)) ! self.app.processEvents() ! def int_finishRipping(self): ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_videoPass1.setProgress(100) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_videoPass2.setProgress(100) ! print "* Ripping finished" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.l_ETA.setText("ETA: N/A") ! self.state = "stopped" ! os.chdir(self.cwd) ! def selectTrack(self, const, qpoint, col): ! """Select tracks to rip by setting column 2 to 'yes'""" ! # Check the mouse isn't clicking in blank space ! self.track = self.dvdTracks.selectedItem() ! try: ! checker = self.track.text(0) ! del checker ! except: ! return ! # Check if the user has clicked on a title or a chapter ! chap = re.compile('Chapter.*') ! if not chap.search(str(self.track.text(0))): ! # Stop short of tagging for ripping unless "Rip" column is selected ! if col is not 2: ! self.updateTrackDisplay(self.track) ! return ! if self.track.info['rip'] is "yes": ! self.track.setPixmap(2, self.image_blank) ! self.updateTrackRip(self.track, mode="remove") ! else: ! self.track.setPixmap(2, self.image_tick) ! self.updateTrackRip(self.track, mode="add") ! self.checkEnableRip() ! def updateTrackDisplay(self, track): ! self.track = track ! self.track.info['name'] = self.track.text(0) ! if abs(int(str(self.fileSize.cleanText())) - self.track.info['size']) > 1: ! self.fileSize.setValue(self.track.info['size']) ! if abs(self.audioBitRate.currentItem() - self.track.info['abr_id']) > 1: ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.track.info['abr'] = self.audioBitRate.currentText() ! if abs(int(str(self.videoBitRate.cleanText())) - self.track.info['vbr']) > 1: ! self.videoBitRate.setValue(self.track.info['vbr']) ! self.videoBitRateSlider.setValue(self.track.info['vbr']) ! def updateTrackRip(self, track, mode): ! """Update track's rip attribute""" ! if not len(self.tracks): ! return ! # Add/remove "rip" status to/from track ! self.mode = mode ! if self.mode is "remove": ! self.track.info['rip'] = "no" ! elif self.mode is "add": ! self.track.info['rip'] = "yes" ! self.updateTrackDisplay(self.track) ! def newFileSize(self, filesize): ! self.track = self.dvdTracks.selectedItem() ! self.filesize = int(str(self.fileSize.cleanText())) ! self.track.info['size'] = int(self.filesize) ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! #print "new file size, changing video bitrate to %s (size: %s, length %s, abr %s)" % (self.track.info['vbr'], self.track.info['size'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.bitrate = int(str(self.videoBitRate.cleanText())) ! self.track.info['vbr'] = self.bitrate ! self.track.info['size'] = self.calcFileSize(self.track.info['time'], self.track.info['abr'], self.track.info['vbr']) ! #print "new bitrate, changing file size to %s (vbr: %s, length %s, abr %s)" % (self.track.info['size'],self.track.info['vbr'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newAudioBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.audiobitrate = int(str(self.audioBitRate.currentText())) ! print self.audiobitrate ! self.track.info['abr'] = self.audiobitrate ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! self.updateTrackDisplay(self.track) ! def checkEnableRip(self): ! r = str(self.videoBitRate.cleanText()) ! o = str(self.outputDir.text()) ! t = 0 ! for track in self.tracks: ! if track['rip'] is "yes": ! t = 1 ! if len(r) > 0 and len(o) > 0 and t is 1: ! self.b_RipDVD.setEnabled(1) ! else: ! self.b_RipDVD.setEnabled(0) ! def renameTrack(self, item): ! """Set ViewListItem to be renamed""" ! self.item = item ! self.item.setRenameEnabled(0, 1) ! self.item.startRename(0) ! def browseHD(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.outputDir.setText(str(directory)) ! self.outdir = str(directory) ! self.checkEnableRip() ! def openRipDialogue(self): ! try: ! os.chdir(config.qr_dir) ! except OSError, msg: ! print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" ! #import output ! #print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 282, GUI.PY)") ! self.state = "stopped" ! self.Dialogue = dialogueProgress(self) ! self.Dialogue.connect(self.Dialogue.b_changeState,SIGNAL("clicked()"),self.changeState) ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! # Add in progress bars appropriate to number of passes ! l_audiopass = QHBoxLayout(None,0,6,"l_audiopass") ! self.Dialogue.textLabel3 = QLabel(self.Dialogue.groupBox3,"textlabel3") ! l_audiopass.addWidget(self.Dialogue.textLabel3) ! self.Dialogue.pm_audioPass = QProgressBar(self.Dialogue.groupBox3,"pm_audioPass") ! self.Dialogue.pm_audioPass.setMinimumSize(QSize(400,0)) ! l_audiopass.addWidget(self.Dialogue.pm_audioPass) ! self.Dialogue.groupBox3Layout.addLayout(l_audiopass,2,0) ! self.Dialogue.textLabel3.setText(self.tr("Progress:")) ! if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) ! if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) ! # if self.config['passes'] is 1: ! # from guiprogressdialogue_1pass import dialogProgress ! # elif self.config['passes'] is 2: ! # from guiprogressdialogue_2pass import dialogProgress ! # elif not self.config['passes'] or self.config['passes'] is 3: ! # from guiprogressdialogue_3pass import dialogProgress ! self.Dialogue.exec_loop() ! def changeState(self): ! """Switch dialogue between stopped and ripping, changing buttons ! and starting/stopping ripping process""" ! if self.state is "stopped": ! self.Dialogue.b_changeState.setText("Stop") ! self.Dialogue.b_closeProgressDialogue.setEnabled(0) ! os.chdir(self.outdir) ! self.volumead = str(self.volume.currentText()) ! self.aLanguage = str(self.aLang.currentText()) ! self.sLanguage = str(self.subTitles.currentText()) ! self.ripDVD() ! elif self.state is "ripping": ! print "* Ripping aborted" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! try: ! pid = self.pipe.pid ! os.kill(pid, 9) ! os.waitpid(pid, os.WNOHANG) ! except: ! pass ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! #elif self.config['passes'] == 0 or self.config['passes'] == 3: ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.state = "stopped" ! os.chdir(self.cwd) ! def openSettingsDialogue(self): ! """Open the settings dialogue box, connecting slots to functions""" ! self.Dialogue = dialogSettings(self) ! # Set-up defauls from config file ! self.Dialogue.mplayer.setText(self.config['mplayer']) ! self.Dialogue.mencoder.setText(self.config['mencoder']) ! self.Dialogue.tcprobe.setText(self.config['tcprobe']) ! self.Dialogue.dvdDevice.setText(self.config['dvd_device']) ! self.Dialogue.outputDir.setText(self.config['outputdir']) ! self.Dialogue.deInterlacing.setCurrentItem(int(self.config['deinterlacing'])) ! self.Dialogue.aspectRatio.setCurrentItem(int(self.config['aspectratio'])) ! self.Dialogue.encoderPasses.setCurrentItem(int(self.config['passes'])) ! self.Dialogue.videoCodec.setCurrentItem(int(self.config['videocodec'])) ! if self.config['pdamode'] == 1: ! self.Dialogue.c_pdamode.setChecked(1) ! # Connect functions ! self.connect(self.Dialogue.b_browseMPlayer,SIGNAL("clicked()"),self.browseMPlayer) ! self.connect(self.Dialogue.b_browseMencoder,SIGNAL("clicked()"),self.browseMencoder) ! self.connect(self.Dialogue.b_browseTcprobe,SIGNAL("clicked()"),self.browseTcprobe) ! self.connect(self.Dialogue.b_browseDVD,SIGNAL("clicked()"),self.browseDVD) ! self.connect(self.Dialogue.b_selectOutputDir,SIGNAL("clicked()"),self.selectOutDir) ! self.connect(self.Dialogue.b_OK,SIGNAL("clicked()"),self.changeSettings) ! self.connect(self.Dialogue.b_Save,SIGNAL("clicked()"),self.saveSettings) ! self.Dialogue.exec_loop() ! def browseMPlayer(self): ! """Launch file dialogue and set path to MPlayer""" ! self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to MPlayer") ! self.Dialogue.mplayer.setText(str(mplayer)) ! def browseMencoder(self): ! """Launch file dialogue and set path to Mencoder""" ! self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Mencoder") ! self.Dialogue.mencoder.setText(str(mencoder)) ! def browseTcprobe(self): ! """Launch file dialogue and set path to Tcprobe""" ! self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Tcprobe") ! self.Dialogue.tcprobe.setText(str(tcprobe)) ! def browseDVD(self): ! """Launch file dialogue and set path to dvd device""" ! try: ! self.path = re.compile('(/.*)/.*').search(self.config['dvd_device']).group(1) ! except: ! self.path = os.path.join("/", "dev", "dvd") ! dvd_device = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to DVD Device") ! self.Dialogue.dvdDevice.setText(str(dvd_device)) ! def selectOutDir(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.Dialogue.outputDir.setText(str(directory)) ! def changeSettings(self): ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.Dialogue.accept() ! def saveSettings(self): ! print "* Saving new settings to ~/.quickriprc" ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.parser.set('paths', 'mplayer', self.config['mplayer']) ! self.parser.set('paths', 'mencoder', self.config['mencoder']) ! self.parser.set('paths', 'tcprobe', self.config['tcprobe']) ! self.parser.set('paths', 'dvd_device', self.config['dvd_device']) ! self.parser.set('paths', 'outputdir', self.config['outputdir']) ! self.parser.set('mencoder', 'deinterlacing', self.config['deinterlacing']) ! self.parser.set('mencoder', 'aspectratio', self.config['aspectratio']) ! self.parser.set('mencoder', 'passes', self.config['passes']) ! self.parser.set('mencoder', 'pdamode', self.config['pdamode']) ! self.parser.set('mencoder', 'videocodec', self.config['videocodec']) ! self.parser.write(open(self.configfile, 'w')) def main(): ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! app = QApplication(sys.argv) ! QObject.connect(app, SIGNAL('lastWindowClosed()'), ! app, SLOT('quit()')) ! win = GUI(app) ! app.setMainWidget(win) ! win.show() ! app.exec_loop() |
From: <je...@us...> - 2003-07-30 15:43:14
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv2331/testing Modified Files: guimain-hig.ui Log Message: Made Track name editable to the right. Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** guimain-hig.ui 30 Jul 2003 12:02:47 -0000 1.5 --- guimain-hig.ui 30 Jul 2003 15:40:33 -0000 1.6 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>570</width> ! <height>542</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>622</width> ! <height>512</height> </rect> </property> *************** *** 25,29 **** <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout91</cstring> </property> <vbox> --- 25,29 ---- <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout10</cstring> </property> <vbox> *************** *** 33,37 **** <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout90</cstring> </property> <hbox> --- 33,37 ---- <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout9</cstring> </property> <hbox> *************** *** 73,141 **** </property> </column> - <item> - <property name="text"> - <string>01</string> - </property> - <property name="text"> - <string>60h 15m 13s</string> - </property> - <property name="text"> - <string></string> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - </item> - <item> - <property name="text"> - <string>02</string> - </property> - <property name="text"> - <string>1h 15m 13s</string> - </property> - <property name="text"> - <string></string> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - <property name="pixmap"> - <pixmap>image1</pixmap> - </property> - </item> - <item> - <property name="text"> - <string>03</string> - </property> - <property name="text"> - <string>6h 1m 1s</string> - </property> - <property name="text"> - <string></string> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - <property name="pixmap"> - <pixmap></pixmap> - </property> - </item> <property name="name"> <cstring>listView1</cstring> </property> <property name="enabled"> ! <bool>true</bool> </property> <property name="defaultRenameAction"> --- 73,81 ---- </property> </column> <property name="name"> <cstring>listView1</cstring> </property> <property name="enabled"> ! <bool>false</bool> </property> <property name="defaultRenameAction"> *************** *** 145,149 **** <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout89</cstring> </property> <grid> --- 85,89 ---- <widget class="QLayoutWidget"> <property name="name"> ! <cstring>layout8</cstring> </property> <grid> *************** *** 151,214 **** <cstring>unnamed</cstring> </property> ! <widget class="Line" row="10" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>line3</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="QComboBox" row="14" column="1"> ! <item> ! <property name="text"> ! <string>64</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>128</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>256</string> ! </property> ! </item> <property name="name"> ! <cstring>comboBox8</cstring> </property> <property name="enabled"> <bool>false</bool> </property> ! <property name="editable"> ! <bool>true</bool> </property> </widget> ! <spacer row="9" column="1"> <property name="name"> ! <cstring>spacer7_4</cstring> </property> ! <property name="orientation"> ! <enum>Vertical</enum> </property> ! <property name="sizeType"> ! <enum>Expanding</enum> </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>22</height> ! </size> </property> ! </spacer> ! <widget class="QLabel" row="13" column="0"> <property name="name"> ! <cstring>textLabel5</cstring> </property> <property name="enabled"> --- 91,142 ---- <cstring>unnamed</cstring> </property> ! <widget class="QSpinBox" row="8" column="2"> <property name="name"> ! <cstring>spinBox3</cstring> </property> ! <property name="enabled"> ! <bool>true</bool> </property> ! <property name="suffix"> ! <string> MB</string> </property> ! <property name="maxValue"> ! <number>4096</number> ! </property> ! <property name="lineStep"> ! <number>5</number> ! </property> ! <property name="value"> ! <number>10</number> </property> </widget> ! <widget class="QLabel" row="14" column="2"> <property name="name"> ! <cstring>textLabel10_2</cstring> </property> <property name="enabled"> <bool>false</bool> </property> ! <property name="text"> ! <string>kbps</string> </property> </widget> ! <widget class="QLabel" row="8" column="0"> <property name="name"> ! <cstring>textLabel2</cstring> </property> ! <property name="enabled"> ! <bool>true</bool> </property> ! <property name="text"> ! <string>&Size:</string> </property> ! <property name="buddy" stdset="0"> ! <cstring>comboBox5</cstring> </property> ! </widget> ! <widget class="QLabel" row="14" column="0"> <property name="name"> ! <cstring>textLabel6</cstring> </property> <property name="enabled"> *************** *** 216,270 **** </property> <property name="text"> ! <string>Au&dio:</string> </property> <property name="buddy" stdset="0"> ! <cstring>comboBox7</cstring> </property> </widget> ! <spacer row="15" column="1"> <property name="name"> ! <cstring>spacer7_3</cstring> ! </property> ! <property name="orientation"> ! <enum>Vertical</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>22</height> ! </size> </property> ! </spacer> ! <widget class="QComboBox" row="8" column="1"> <item> <property name="text"> ! <string>CDROM</string> </property> </item> <item> <property name="text"> ! <string>VCD</string> </property> </item> <item> <property name="text"> ! <string>SVCD</string> </property> </item> <item> <property name="text"> ! <string>PDA</string> </property> </item> <item> <property name="text"> ! <string>Other =></string> </property> </item> <property name="name"> ! <cstring>comboBox5</cstring> </property> <property name="enabled"> --- 144,199 ---- </property> <property name="text"> ! <string>&Video:</string> </property> <property name="buddy" stdset="0"> ! <cstring>comboBox8</cstring> </property> </widget> ! <widget class="QLabel" row="0" column="0"> <property name="name"> ! <cstring>textLabel1</cstring> </property> ! <property name="text"> ! <string><b>Track</b></string> </property> ! </widget> ! <widget class="QComboBox" row="4" column="1" rowspan="1" colspan="2"> <item> <property name="text"> ! <string>English</string> </property> </item> <item> <property name="text"> ! <string>Spanish</string> </property> </item> <item> <property name="text"> ! <string>French</string> </property> </item> + <property name="name"> + <cstring>comboBox5_2</cstring> + </property> + </widget> + <widget class="QComboBox" row="5" column="1" rowspan="1" colspan="2"> <item> <property name="text"> ! <string>English</string> </property> </item> <item> <property name="text"> ! <string>Spanish</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>French</string> </property> </item> <property name="name"> ! <cstring>comboBox6_2</cstring> </property> <property name="enabled"> *************** *** 272,276 **** </property> </widget> ! <spacer row="1" column="1"> <property name="name"> <cstring>spacer7_3_2</cstring> --- 201,205 ---- </property> </widget> ! <spacer row="2" column="1"> <property name="name"> <cstring>spacer7_3_2</cstring> *************** *** 285,303 **** <size> <width>20</width> ! <height>22</height> </size> </property> </spacer> ! <widget class="QLabel" row="6" column="0" rowspan="1" colspan="3"> ! <property name="name"> ! <cstring>textLabel12</cstring> ! </property> ! <property name="text"> ! <string><b>Ripping</b></string> ! </property> ! </widget> ! <widget class="QLabel" row="12" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>textLabel4</cstring> </property> <property name="enabled"> --- 214,224 ---- <size> <width>20</width> ! <height>20</height> </size> </property> </spacer> ! <widget class="QLabel" row="13" column="2"> <property name="name"> ! <cstring>textLabel10</cstring> </property> <property name="enabled"> *************** *** 305,335 **** </property> <property name="text"> ! <string><b>Bitrates</b></string> </property> </widget> ! <widget class="QComboBox" row="4" column="1" rowspan="1" colspan="2"> ! <item> ! <property name="text"> ! <string>English</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Spanish</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>French</string> ! </property> ! </item> <property name="name"> ! <cstring>comboBox6_2</cstring> </property> ! <property name="enabled"> ! <bool>false</bool> </property> </widget> ! <spacer row="5" column="1"> <property name="name"> <cstring>spacer7_5</cstring> --- 226,247 ---- </property> <property name="text"> ! <string>kbps</string> </property> </widget> ! <widget class="Line" row="10" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>line3</cstring> </property> ! <property name="frameShape"> ! <enum>HLine</enum> ! </property> ! <property name="frameShadow"> ! <enum>Sunken</enum> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> </property> </widget> ! <spacer row="6" column="1"> <property name="name"> <cstring>spacer7_5</cstring> *************** *** 344,491 **** <size> <width>20</width> ! <height>23</height> </size> </property> </spacer> ! <widget class="QFrame" row="0" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>frame6</cstring> </property> ! <property name="frameShape"> ! <enum>StyledPanel</enum> </property> ! <property name="frameShadow"> ! <enum>Sunken</enum> </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QLayoutWidget"> - <property name="name"> - <cstring>layout71</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QLabel"> - <property name="name"> - <cstring>pixmapLabel1</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="pixmap"> - <pixmap>image2</pixmap> - </property> - <property name="scaledContents"> - <bool>true</bool> - </property> - </widget> - <widget class="QLabel"> - <property name="name"> - <cstring>textLabel9</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>1</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string><h2>Current track name</h2></string> - </property> - <property name="alignment"> - <set>WordBreak|AlignCenter</set> - </property> - </widget> - </hbox> - </widget> - </hbox> </widget> ! <widget class="QComboBox" row="3" column="1" rowspan="1" colspan="2"> <item> <property name="text"> ! <string>English</string> </property> </item> <item> <property name="text"> ! <string>Spanish</string> </property> </item> <item> <property name="text"> ! <string>French</string> </property> </item> <property name="name"> ! <cstring>comboBox5_2</cstring> ! </property> ! </widget> ! <widget class="QLabel" row="13" column="2"> ! <property name="name"> ! <cstring>textLabel10</cstring> </property> <property name="enabled"> <bool>false</bool> </property> ! <property name="text"> ! <string>kbps</string> </property> </widget> ! <widget class="QSpinBox" row="8" column="2"> <property name="name"> ! <cstring>spinBox3</cstring> </property> <property name="enabled"> ! <bool>true</bool> ! </property> ! <property name="suffix"> ! <string> MB</string> ! </property> ! <property name="maxValue"> ! <number>4096</number> </property> ! <property name="lineStep"> ! <number>5</number> </property> ! <property name="value"> ! <number>10</number> </property> </widget> ! <widget class="QLabel" row="8" column="0"> <property name="name"> ! <cstring>textLabel2</cstring> ! </property> ! <property name="enabled"> ! <bool>true</bool> </property> <property name="text"> ! <string>&Size:</string> </property> <property name="buddy" stdset="0"> ! <cstring>comboBox5</cstring> </property> </widget> ! <widget class="QCheckBox" row="4" column="0"> <property name="name"> ! <cstring>checkBox1</cstring> </property> <property name="text"> ! <string>Sub&titles:</string> </property> </widget> ! <widget class="QLabel" row="14" column="0"> <property name="name"> ! <cstring>textLabel6</cstring> </property> <property name="enabled"> --- 256,383 ---- <size> <width>20</width> ! <height>20</height> </size> </property> </spacer> ! <widget class="QLabel" row="7" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>textLabel12</cstring> </property> ! <property name="text"> ! <string><b>Ripping</b></string> </property> ! </widget> ! <spacer row="15" column="1"> ! <property name="name"> ! <cstring>spacer7_3</cstring> ! </property> ! <property name="orientation"> ! <enum>Vertical</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QCheckBox" row="5" column="0"> ! <property name="name"> ! <cstring>checkBox1</cstring> ! </property> ! <property name="text"> ! <string>Sub&titles:</string> </property> </widget> ! <widget class="QComboBox" row="14" column="1"> <item> <property name="text"> ! <string>64</string> </property> </item> <item> <property name="text"> ! <string>128</string> </property> </item> <item> <property name="text"> ! <string>256</string> </property> </item> <property name="name"> ! <cstring>comboBox8</cstring> </property> <property name="enabled"> <bool>false</bool> </property> ! <property name="editable"> ! <bool>true</bool> </property> </widget> ! <widget class="QComboBox" row="13" column="1"> ! <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>comboBox7</cstring> </property> <property name="enabled"> ! <bool>false</bool> </property> ! <property name="acceptDrops"> ! <bool>false</bool> </property> ! <property name="editable"> ! <bool>true</bool> </property> </widget> ! <widget class="QLabel" row="1" column="0"> <property name="name"> ! <cstring>textLabel3</cstring> </property> <property name="text"> ! <string>&Name:</string> </property> <property name="buddy" stdset="0"> ! <cstring>comboBox7_2</cstring> </property> </widget> ! <widget class="QComboBox" row="1" column="1" rowspan="1" colspan="2"> <property name="name"> ! <cstring>comboBox7_2</cstring> ! </property> ! </widget> ! <widget class="QLabel" row="3" column="0" rowspan="1" colspan="3"> ! <property name="name"> ! <cstring>textLabel1_2</cstring> </property> <property name="text"> ! <string><b>Language</b></string> </property> </widget> ! <widget class="QLabel" row="13" column="0"> <property name="name"> ! <cstring>textLabel5</cstring> </property> <property name="enabled"> *************** *** 493,505 **** </property> <property name="text"> ! <string>&Video:</string> </property> <property name="buddy" stdset="0"> ! <cstring>comboBox8</cstring> </property> </widget> ! <widget class="QLabel" row="14" column="2"> <property name="name"> ! <cstring>textLabel10_2</cstring> </property> <property name="enabled"> --- 385,397 ---- </property> <property name="text"> ! <string>Au&dio:</string> </property> <property name="buddy" stdset="0"> ! <cstring>comboBox7</cstring> </property> </widget> ! <widget class="QLabel" row="12" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>textLabel4</cstring> </property> <property name="enabled"> *************** *** 507,522 **** </property> <property name="text"> ! <string>kbps</string> </property> </widget> ! <widget class="QLabel" row="2" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>textLabel1_2</cstring> </property> <property name="text"> ! <string><b>Language</b></string> </property> </widget> ! <widget class="QLabel" row="3" column="0"> <property name="name"> <cstring>textLabel2_2</cstring> --- 399,414 ---- </property> <property name="text"> ! <string><b>Bitrates</b></string> </property> </widget> ! <widget class="QCheckBox" row="11" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>checkBox2</cstring> </property> <property name="text"> ! <string>Advan&ced</string> </property> </widget> ! <widget class="QLabel" row="4" column="0"> <property name="name"> <cstring>textLabel2_2</cstring> *************** *** 529,574 **** </property> </widget> ! <widget class="QComboBox" row="13" column="1"> <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>comboBox7</cstring> </property> <property name="enabled"> - <bool>false</bool> - </property> - <property name="acceptDrops"> - <bool>false</bool> - </property> - <property name="editable"> <bool>true</bool> </property> </widget> ! <widget class="QCheckBox" row="11" column="0" rowspan="1" colspan="3"> <property name="name"> ! <cstring>checkBox2</cstring> </property> ! <property name="text"> ! <string>Advan&ced options</string> </property> ! </widget> </grid> </widget> --- 421,474 ---- </property> </widget> ! <widget class="QComboBox" row="8" column="1"> <item> <property name="text"> ! <string>CDROM</string> </property> </item> <item> <property name="text"> ! <string>VCD</string> </property> </item> <item> <property name="text"> ! <string>SVCD</string> </property> </item> <item> <property name="text"> ! <string>PDA</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Other =></string> </property> </item> <property name="name"> ! <cstring>comboBox5</cstring> </property> <property name="enabled"> <bool>true</bool> </property> </widget> ! <spacer row="9" column="1"> <property name="name"> ! <cstring>spacer7_4</cstring> </property> ! <property name="orientation"> ! <enum>Vertical</enum> </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>20</width> ! <height>20</height> ! </size> ! </property> ! </spacer> </grid> </widget> *************** *** 596,600 **** </property> <property name="iconSet"> ! <iconset>image3</iconset> </property> <property name="toolTip" stdset="0"> --- 496,500 ---- </property> <property name="iconSet"> ! <iconset>image1</iconset> </property> <property name="toolTip" stdset="0"> *************** *** 632,636 **** </property> <property name="iconSet"> ! <iconset>image4</iconset> </property> <property name="toolTip" stdset="0"> --- 532,536 ---- </property> <property name="iconSet"> ! <iconset>image2</iconset> </property> <property name="toolTip" stdset="0"> *************** *** 651,655 **** </property> <property name="iconSet"> ! <iconset>image5</iconset> </property> <property name="toolTip" stdset="0"> --- 551,555 ---- </property> <property name="iconSet"> ! <iconset>image3</iconset> </property> <property name="toolTip" stdset="0"> *************** *** 690,705 **** </image> <image name="image1"> - <data format="XPM.GZ" length="409">789c65cec10ac2300c06e07b9f2234b7229d431086f8088a47413c842ae8610aba1d86f8eeb689ddd636f490ff2334a90c1c0f3b30957a77d4dd1db81bbdc05cfab61d4ee7ed47e97a0dfeada0d60ba52d38d83f1fd7d093ef71c915224a6c1a89362d2c0da930a4c210c966e62937a6d26c6632c68623f1981862a4d1429262faff9750dc21949a9d8d4db74c34bb2f5ee4edbb513fe16b4c5c</data> - </image> - <image name="image2"> - <data format="XPM.GZ" length="8366">789ce597596f1cbb1185dffd2b04d79b11f04eefdd08f2a05db6164bb625590af250ec45d2689746cb28c87f4fcd290e35fb8c9d9bbc446dc0f89a6c1eb2eab0c8f9e3d3d2cffddda54f7f7c78ec70e7a25c2acff961e953f5747dddfdfb3ffef6cf0f1fe37c49fe85616b29fcf8970f1f0f3a4be5d2deed4ddd034302d4c25f8f6d090ee4019b6dc7612b00b7c0612b6e45e01b70daca5a698ff907386be5ad0ced3a5eeedb2b70216f945330cb9b027c062ee5b1f89ec1559fe9115cf7de80bf821b792a7cffea19ebe3a6c741184401e64fd00b92200e100c63c1a9bcc17ae827380fb220413cdec0569e1ce31d80eba00a305fb3dae350fe02d5bff4acfaa7e0288c8206fd0b70ecf9a4cf21e24ddf1cc7aebdeab3b61bcc2fcce4c1fcedbd67cdc73e38efb36d83ebb00a19f331e0461e30617e514b18eba165701aa5a1ce1ff98d4a79100f13802b61e457aca65c45c8a7c5f851d36746fec42c4da4f1433ce340de28239f712c01d07cc33f711ac711f4e9185cc536d6f5348ecb3806df816b61cc8fe1cfb8911eca2f3d4ec2a415eb7c11ef244ac258f52f1c47b1faef162c7fb1fa6d179c09c36f1c83eba44c107fca7b2cf66912d543fcd3348d138c6faec1599a241adfc033c6b7f04b9aa7a9e32ed8a645023fd11ab84a6da2f1c07ab220ad53f5ebb3e3c631e29ba5599cea7a37c17996a6aa1f8239cb535d1fd69b9519a7aa77e3197a16f9cd6a7903ff31ea816ce73a853f790b1ccb1be4c3d48e436586ff7291cb301f423c72cee51518f9cbeb9c33dd3fdf1ddb0cf136985f911441aefb35761ce5eaf7049c1671aefa5f3c231fd401e7858418e3239f051759aefa9fc16551285bec370e8a3a87be857f392c9a5ce7877ac6b1f4d078603f73c9a2003ef6acf1c7fab86211c078a84fb6c565a1f13f775c17bade1570c095e32b706c6546180ffeb1899519613cec1f2bf660ad1fd87f3617567fc2dfb61046bc18f5438aa9659dcfad67f5c73a38b035a33e58d4c732b40deb7cb1de32296586985fe338649d1ff251a665c4ea0fc4b7cccbd8eafc90dfd2969955bf6e804b0987e653b92ed96abdd9746c1d1f821b61c4db3c3b2e1da33ecbe1e098f63deb79f4e4b852b6886f15f8fe278e5dbb79f1ac7e693bae950df25b85be7ddbb16be73dc78dd5fa128123ff7dc7b16ba755e5aa65117f03bf56719fed8b67ad97f053955481e353c7a132c1af552aac7e427eabac8aace60ff5a0cafbcc4f8e63d77ee938b17a5fc0795b15d2aefebb70dc6f7ff4ace7d791e3549950df2bf61cf7b9d4fb87c6c30ae3bce6cc71a6edb4e959ef23a8975559e5ca74e659ebc537c78532dd7b56ff61bf5755bfdde8f7b56fb78e59d96a7bd367b3e5d8965aefc8b3d69f96e3d231ea935c5f1c33e22fd789caf18667f523f6971cdfb5e3dab3d653ecb73aeab7f391e3a6547fc17f75ecf941b96e29f38e67bdcf607fd649bfddde78567f468e03655ef7acf70b5d5feadbad676d5ff3acfeec3a0eb59dc8b3b6c38f75d66f376dc7916b7ff5acf5fadcb3fa197eaa73b920e8fe78f3acf747f8ab2ee440d7fea82735d769a9f54bc7b3c2eaef77d6f6af8e3365d2f896c27a5eef79d6fedd3e577a7e5c3bceb5dd6a7eab3ad776b3ec59fd9e3a2e5cfbb167b4db6bc7b6d2fba1aea7f6fdef3deb7ed971cc8ee1e7ba11c6f77cef59cf8f55c76e7cbef2acfb03f993cbb7633a745c2a1b9c074dd0675a715c55ba7fb05f9bb0cff6c971edbebff0ace77dee59f717ea7f13f59911cf2669824af70bea5993c90555fd8cf937459354ea0fc4a3691a5b6bbc32c755adebcf1d37b59e476b9e753fad7856bf469ed50fec59fd72d4e706fa7ce859fdb8ec19fd0f3affdde7ff57c3d0b4e7cfd2181a958d35e57c9ddfd2a84c6d1a7366cecd85699b4b7365aecdcd74955fd6b83577e6de3c9847d3314fe6d9bc9857d3356f66d9ac98d5c93abfacb166d665ec8d91675314b7cc67f3c56c8fabfcb2c6ced8f8efcfaed9335fcdfea8ca748dc9d19da9b1610ecc37f3ddfc18fe769ac6b40cced1d83087e6c81c9b9f835f4fd6f05e3cf9658d5e6ebae6d4b46669f8f103139ae837347a11db33f1fb4a4635bc426252994ff65b1abdece7a698ad817fbbd27767548398acce954aaaa8a686ce64873c8fa96cd1f9640da770611ea88d9e631a3d15b34397746576e99a6ee896eee85e76fbe98846871ee8515506359c42879e9cc2440da7f43c58a5e8855ea91cce3c75e96db2062dd30aadfa9e533546eb2fad49743b432a8fb4ae6def1aaeef066dbef7a3ad591a23ebff4c5fcce0b7dbb433498376696fb01a497e67ac64784df45562bc3f14ad03fa36a8e1e6f29d7e0ce78e2c1dd2d1622ae2a5f6d0b77b743caa413f45f964b4365065cee974fa2937b092d64846de2818d308291aad0b145342e9ac9374ba0665948f691452cf465dfec466f669fdaec144db435fdf338f6ab01d59eb86e972b9b042c57628e7cf5c7333acc1677c3ed4a7b7da2e5f2ca620dfb7a91ef4aed4817ad8bbd2e792afa4fa0f69f035df2cb88a5b7a45857b9f5fc577c3fb5ca8e0fb510d93f2c3221afcc81d1e3ee50ff9995f4635f895bb63b1caf86dbec64187977985575d45d62f4b5eeb677228e7eba339e70dde5c24e7fad0d6c0ae8a786bb4b643e3b3dc9a8663b54efbf36e9a03317b3fbfd6f9cbf839088d6d1e3de50ecc03efcebf6d0e6bf01e7fe5fd291a07fc6dec7ed6919c7c1fd4e01f7c384b83f6f9888f27dd4bdc08cf63d1eaf9bccb3ff9844fc5dda7dce280b624f23be34a3d0d3ae190a369f72bcc311edf87bdefe8879c6a5b727a6dc9ffb1ab9b63555f343a92eb84d3591a52b3da9c8dad64f233a6c1879c73319eb7d1b3d61a3b7a662eac3110f3a9776a6db52c15fe659e829c5d3c25f363de9b74f7b156aad91c15b2f3f7cb640d17af5254a2d9115bf4a49fa6019dcad6e2e3f1fb9ff79a491739e727690ca834f6cc9edb8bb15db9496dda94fbc0866d2f56c766ff36b097f6ca5edb1bf1f3ae79915bc7abdc6edb26b5b7f66ef13a36ef378ee8dcdb07fb683bf6c93edb17fb6abbf66d91ea355f63d66ffd5f5398ff9bf33f1b7d318d3fe3f99f68fcebaf1ffe0d02e9c7e9</data> - </image> - <image name="image3"> <data format="XPM.GZ" length="1055">789c55d1cb6ee2301480e13d4f11e11d1a5191c42656358b5e6880164abbaa349a856fe15242b8849650cdbb8f8f8f135a2b42f97edb8923ae3ac1db6c1274ae5a8752944b15a885d8071d7dccf3eacfdfdf5fad768f05f68aed6ffb57abdd0d54302d3606ee85bd27118f122a80064805e57d09fc00b290d124024e1d05e3899b7df4d4c807603feaf790af35790cac3c29f2d951f639f2a5a102a69e1a49804994f4901347698fecf69e3d3972eca9855b3c02f29853e4c051712edde27b4f8d9c01452c7a52034f9e1479745442209f3c8da2c00350c6354ba40c913b4fa6dcdea1a39602b9f534c81ca8a80ab5dbbbf664c87747ad8476ffe0cad32097481d2217404debd90259cfce3d996140ed68b440ee3d0d326be8f62aa0613525d284c83b4f86bc753446206f6a66eec99f9e06b901662c0b915d3b088c2e8eba0929957dfb8f4644a6f57c61be371bf57cb96a1a3e8890c5fb3a3775db4024c56a9d6f2f4d129becaaedeed2f6daa7c3a5d937c2c65d796cdac767e1d3a932fe2ce27c737b2765919fee070f061b1182903425c3e160347e34feccb6da91ee9ec6e7c9b4f90e37f1bc3b4e48fabdd95895b3f4e547b3f1b51c55ed7fd7adff102afcf2</data> </image> ! <image name="image4"> <data format="XPM.GZ" length="1821">789c7dd1594f1b311007f0f77c8a157e43d590bdd7aafac07d07c20d551fbcb6370784331ca1ea77af3d33de42844a10e697f97b3cde5d5a8c2e0ef7a3c5a5ced3544d473ad243f5182d9ae7c964f6f3d78fdf9d85b888dc6f9947c9c2b7ce427f1ae9a877776b3da072105dfc414befa49be84c790b85966996a3a1f44e65aa0bf23e39eb9629fad83b8bb3aaac71ff00adf2bc228fd8923d641b99e1fe57ef3c0979c8d8b2a2fe976855e49417dabb480a2935d60fc9a5d439fac9bb4cabb83668bc4f95cad816e835742d435d9055dc605da065260df7bb25abd89087ec9cfb3db32def6fd05ac59afac7e43aa13aec792b97a77ec2b6a6f7b342ae0bceefb255d360be46bb7e3c4f9f5db0cfd88ae75b66f37cb043d6619ed5d6d81fb6bdebacb6bc5f0773fe85ac13aedf04733d6187f90f5a53ff0bb6e2ba411bad2cdd7f3d98eb0fec70fe15d9f0f3802d6f9deb82f70fd8617fc3b65cef920ddf57003bcc9bb7a6fe2... [truncated message content] |
From: <te...@us...> - 2003-07-30 12:50:54
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv3858/testing Modified Files: guimain-hig-tom.ui Log Message: Please take not of my linedits I used to comment on the design :) Index: guimain-hig-tom.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig-tom.ui,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** guimain-hig-tom.ui 30 Jul 2003 11:07:11 -0000 1.2 --- guimain-hig-tom.ui 30 Jul 2003 12:50:51 -0000 1.3 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>590</width> ! <height>464</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>554</width> ! <height>490</height> </rect> </property> *************** *** 20,24 **** <cstring>unnamed</cstring> </property> ! <widget class="QGroupBox" row="1" column="0"> <property name="name"> <cstring>g_trackSettings</cstring> --- 20,147 ---- <cstring>unnamed</cstring> </property> ! <widget class="QLayoutWidget" row="4" column="0" rowspan="1" colspan="2"> ! <property name="name"> ! <cstring>g_buttons</cstring> ! </property> ! <hbox> ! <property name="name"> ! <cstring>unnamed</cstring> ! </property> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_quit</cstring> ! </property> ! <property name="font"> ! <font> ! <pointsize>11</pointsize> ! </font> ! </property> ! <property name="text"> ! <string>Quit</string> ! </property> ! <property name="iconSet"> ! <iconset>image0</iconset> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Quit the application</string> ! </property> ! </widget> ! <spacer> ! <property name="name"> ! <cstring>spacer2</cstring> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>16</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_configure</cstring> ! </property> ! <property name="font"> ! <font> ! <pointsize>11</pointsize> ! </font> ! </property> ! <property name="text"> ! <string>Configure</string> ! </property> ! <property name="iconSet"> ! <iconset>image1</iconset> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Set your preferences</string> ! </property> ! </widget> ! <spacer> ! <property name="name"> ! <cstring>spacer2_2</cstring> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>29</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_scanDVD</cstring> ! </property> ! <property name="font"> ! <font> ! <pointsize>11</pointsize> ! </font> ! </property> ! <property name="text"> ! <string>Scan DVD</string> ! </property> ! <property name="iconSet"> ! <iconset>image2</iconset> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Scan the DVD for tracks</string> ! </property> ! </widget> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_ripDVD</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="font"> ! <font> ! <pointsize>11</pointsize> ! </font> ! </property> ! <property name="text"> ! <string>Rip DVD</string> ! </property> ! <property name="iconSet"> ! <iconset>image3</iconset> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Rip the DVD!</string> ! </property> ! </widget> ! </hbox> ! </widget> ! <widget class="QGroupBox" row="3" column="0" rowspan="1" colspan="2"> <property name="name"> <cstring>g_trackSettings</cstring> *************** *** 31,35 **** <cstring>unnamed</cstring> </property> ! <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>g_filesize</cstring> --- 154,280 ---- <cstring>unnamed</cstring> </property> ! <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="4"> ! <property name="name"> ! <cstring>layout3</cstring> ! </property> ! <hbox> ! <property name="name"> ! <cstring>unnamed</cstring> ! </property> ! <widget class="QLabel"> ! <property name="name"> ! <cstring>g_trackName</cstring> ! </property> ! <property name="text"> ! <string>Name:</string> ! </property> ! </widget> ! <widget class="QLineEdit"> ! <property name="name"> ! <cstring>trackName</cstring> ! </property> ! </widget> ! </hbox> ! </widget> ! <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="4"> ! <property name="name"> ! <cstring>layout9</cstring> ! </property> ! <hbox> ! <property name="name"> ! <cstring>unnamed</cstring> ! </property> ! <widget class="QLabel"> ! <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="QComboBox"> ! <item> ! <property name="text"> ! <string>English</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>French</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Spanish</string> ! </property> ! </item> ! <property name="name"> ! <cstring>aLang</cstring> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Select language for audio (dialogue)</string> ! </property> ! </widget> ! <widget class="QLabel"> ! <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 language:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>subTitles</cstring> ! </property> ! </widget> ! <widget class="QComboBox"> ! <item> ! <property name="text"> ! <string>None</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>English</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>French</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Spanish</string> ! </property> ! </item> ! <property name="name"> ! <cstring>subTitles</cstring> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Select language for subtitles</string> ! </property> ! </widget> ! </hbox> ! </widget> ! <widget class="QLabel" row="1" column="0"> <property name="name"> <cstring>g_filesize</cstring> *************** *** 50,57 **** </property> </widget> ! <widget class="QSpinBox" row="0" column="1"> <property name="name"> <cstring>fileSize</cstring> </property> <property name="suffix"> <string> MB</string> --- 295,305 ---- </property> </widget> ! <widget class="QSpinBox" row="1" column="1"> <property name="name"> <cstring>fileSize</cstring> </property> + <property name="enabled"> + <bool>false</bool> + </property> <property name="suffix"> <string> MB</string> *************** *** 73,80 **** </property> </widget> ! <widget class="QSpinBox" row="1" column="1"> <property name="name"> <cstring>videoBitRate</cstring> </property> <property name="sizePolicy"> <sizepolicy> --- 321,395 ---- </property> </widget> ! <widget class="QComboBox" row="1" column="2"> ! <item> ! <property name="text"> ! <string>CDROM (640mb)</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>CDROM (700mb)</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>CDROM (800mb)</string> ! </property> ! </item> ! <item> ! <property name="text"> ! <string>Custom</string> ! </property> ! </item> ! <property name="name"> ! <cstring>fileSizePresets</cstring> ! </property> ! <property name="currentItem"> ! <number>1</number> ! </property> ! </widget> ! <spacer row="1" column="3"> ! <property name="name"> ! <cstring>spacer4</cstring> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>90</width> ! <height>21</height> ! </size> ! </property> ! </spacer> ! <widget class="QLabel" row="2" column="0"> ! <property name="name"> ! <cstring>g_bitrate</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 quality:</string> ! </property> ! <property name="buddy" stdset="0"> ! <cstring>videoBitRate</cstring> ! </property> ! </widget> ! <widget class="QSpinBox" row="2" column="1"> <property name="name"> <cstring>videoBitRate</cstring> </property> + <property name="enabled"> + <bool>false</bool> + </property> <property name="sizePolicy"> <sizepolicy> *************** *** 101,124 **** </property> </widget> ! <widget class="QLabel" row="1" column="0"> ! <property name="name"> ! <cstring>g_bitrate</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="2"> <property name="name"> <cstring>g_slider</cstring> --- 416,420 ---- </property> </widget> ! <widget class="QLayoutWidget" row="2" column="2" rowspan="1" colspan="2"> <property name="name"> <cstring>g_slider</cstring> *************** *** 203,222 **** </hbox> </widget> - <widget class="QLabel" row="0" column="2"> - <property name="name"> - <cstring>g_trackName</cstring> - </property> - <property name="text"> - <string>Name:</string> - </property> - </widget> - <widget class="QLineEdit" row="0" column="3"> - <property name="name"> - <cstring>trackName</cstring> - </property> - </widget> </grid> </widget> ! <widget class="QListView" row="0" column="0"> <column> <property name="text"> --- 499,505 ---- </hbox> </widget> </grid> </widget> ! <widget class="QListView" row="0" column="0" rowspan="1" colspan="2"> <column> <property name="text"> *************** *** 281,406 **** </property> </widget> ! <widget class="QLayoutWidget" row="2" column="0"> <property name="name"> ! <cstring>g_buttons</cstring> </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QPushButton"> - <property name="name"> - <cstring>b_quit</cstring> - </property> - <property name="font"> - <font> - <pointsize>12</pointsize> - </font> - </property> - <property name="text"> - <string>Quit</string> - </property> - <property name="iconSet"> - <iconset>image0</iconset> - </property> - <property name="toolTip" stdset="0"> - <string>Quit the application</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>16</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>b_configure</cstring> - </property> - <property name="font"> - <font> - <pointsize>12</pointsize> - </font> - </property> - <property name="text"> - <string>Configure</string> - </property> - <property name="iconSet"> - <iconset>image1</iconset> - </property> - <property name="toolTip" stdset="0"> - <string>Set your preferences</string> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer2_2</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>29</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>b_scanDVD</cstring> - </property> - <property name="font"> - <font> - <pointsize>12</pointsize> - </font> - </property> - <property name="text"> - <string>Scan DVD</string> - </property> - <property name="iconSet"> - <iconset>image2</iconset> - </property> - <property name="toolTip" stdset="0"> - <string>Scan the DVD for tracks</string> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>b_ripDVD</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="font"> - <font> - <pointsize>12</pointsize> - </font> - </property> - <property name="text"> - <string>Rip DVD</string> - </property> - <property name="iconSet"> - <iconset>image3</iconset> - </property> - <property name="toolTip" stdset="0"> - <string>Rip the DVD!</string> - </property> - </widget> - </hbox> </widget> </grid> --- 564,582 ---- </property> </widget> ! <widget class="QLineEdit" row="1" column="0"> <property name="name"> ! <cstring>lineEdit4</cstring> ! </property> ! <property name="text"> ! <string>is it too crowded?</string> ! </property> ! </widget> ! <widget class="QLineEdit" row="2" column="0"> ! <property name="name"> ! <cstring>lineEdit5</cstring> ! </property> ! <property name="text"> ! <string> is it obvious that the file size spinbox & combobox go together?</string> </property> </widget> </grid> |
From: <je...@us...> - 2003-07-30 12:08:03
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv28444 Added Files: camera_test.png Log Message: Added this checkmark icon. --- NEW FILE: camera_test.png --- (This appears to be a binary file; contents omitted.) |
From: <je...@us...> - 2003-07-30 12:04:50
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv27936 Modified Files: guimain-hig.ui Log Message: Removed the `Save to' from main window. Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** guimain-hig.ui 29 Jul 2003 23:24:33 -0000 1.4 --- guimain-hig.ui 30 Jul 2003 12:02:47 -0000 1.5 *************** *** 348,393 **** </property> </spacer> - <widget class="QComboBox" row="7" column="1"> - <item> - <property name="text"> - <string>/home/videos</string> - </property> - </item> - <item> - <property name="text"> - <string>/home/username</string> - </property> - </item> - <item> - <property name="text"> - <string>/tmp</string> - </property> - </item> - <item> - <property name="text"> - <string>/dev/null</string> - </property> - </item> - <property name="name"> - <cstring>comboBox6</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="editable"> - <bool>true</bool> - </property> - </widget> - <widget class="QPushButton" row="7" column="2"> - <property name="name"> - <cstring>pushButton9</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>Browse...</string> - </property> - </widget> <widget class="QFrame" row="0" column="0" rowspan="1" colspan="3"> <property name="name"> --- 348,351 ---- *************** *** 560,577 **** </property> </widget> - <widget class="QLabel" row="7" column="0"> - <property name="name"> - <cstring>textLabel3</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="text"> - <string>S&ave to:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>comboBox6</cstring> - </property> - </widget> <widget class="QLabel" row="3" column="0"> <property name="name"> --- 518,521 ---- *************** *** 749,753 **** </image> <image name="image2"> ! <data format="XPM.GZ" length="11134">789ce558c9721cc90dbdeb2b1493b709474ed7da55e1f0415cc445dc497173f80024aab8ab29b2299174f8df8d06b28b2c34256a64d917b36622f42a2bf321810720b3fff8fdede1d6fadbdfff78733b86f159781b4ee1e6edef747775f5f0f77ffced9f6f7ecbabb7fc5f56676fd3dffef2e6b7edf1dbf07663f4a999005866e006f237c1743ec1ede48f26d89df6c7c14dc79b56c61ffae36ead8ff1cce039c377d0c761a7cf0f1bfd717f69e6dff7ed81d2ac77daada7f68eccf8cd04376d0324cec15bb3df3d830dbfff62c68f221f363aee0cdf95c185d9ef8af11774e328f65f1b7fdbf5cf3a7f808c9f18fb0a83a16faf3becfb33ec1b3ee31f27f14cf3344b75bdf5be3fdd81597f2b626a32c1ab1d9fe8910ecdfa563fef8dfde28f6152b6a5ac87365e17462f377d7b82f10f7e35f135f383d1375d74f617326eec0b8f7ddc58be5563efa6d9ffd0cc07639fc1cef2e7468f467f706cbedf163c1c5483a1e07bb3bed90f1afb70d7d8f7c1f8cbec0fde99f5cd7c5aeeeb9fbc996febc996d90f1a7bee0c9fd10bdafc3c8f7ac6a8e725b39ed58be8a32eeaa4d2ef4d7ef9b4d34b25f69afd37add90f99f9e7c6bea5fe387c34f36d3d917a980dd236ad65fcac3f9f4c3d0153df1a338eda0f064d20c93f1a1bfb168dbfd78d7da61e93c90f6fe2470bc63ea34727f5971a82a0f67c32e39f0d36fa6eacbe0efbeba1f13fcc1b7b1363ef91f1576ee6cbfeda619b91c423187da2b18f423f5e4d63fc7dd1b73764fd7a1c4c3c83c9cfc6e68ba9bff468fc61f40b263fc0f8db07e37f1b1fe37f67fa391a7f87b4bf3f6ff4d7183e34f6855dd39f4cfe05631f1aff6035c179ce0d50ea13d87a68cf37169b7ae54d3f4093cf0d99787cedc7c39bf31acdf7c7c1d43767e247467f41fa7d6802a0f4376ff9e53c0401aaba9471e32f127f37d4d4a4fbf1463fa61f041b2fa9070d366590f3089af360284dfd33fe23735e41939f60f2d19bfae32af3bda93fdee69f197737c61ed36fdd71dfbfced44b6ff488c6ffa136eb8b7fd226a554ce7f7e60d633fe20a30734f5c19bfee16dbdd6fe9bf0a3e375c4e92091fda83fd2413e507dea7da3e41386ea45fd534d316a3daaf98d60d2fd03bf91fa889a2f811fc937afe7619a62d0fadc4cde08d6fdb7fcc8f93a5087e5bc89d28f9234c912b117c59ea448f244eb89d4afa4e437aa5789775225c344e245b2df04f9917e1e74bd26a144ecf512df94ff12e1c7c30e0b7fd0f12ccd12bd9fc8fd67729e560c59c4b9627f3fc57ade7692ffe9901fb197061dd6f3b5d89b56538c52bfb9fbb7aa0f90f9599995a9fa43e667811fd5a3c42b23c6721ec43262ca343ee2ffac9d6214fd72b0db4cfd21f1cb137e23d889def232cf33e5937ccf29c75cfbf56ac421cf05cbfd236f18ebf95aeccb5bfe42b19caf8ab418e47a5e957e5b64459a0b1fee449ce5aa1fe91705ffe5aa1759bf183216bd90aed714a1d0fba0d4430e7f5b289fd85796655ec8fa5eea5b392c8b42d7bfecb09e57e53c5d566519b1d49312cbbad0fb9ef8aba4120bbd8f8bfef83ed3e87d06847f580ef352f7277a1c56c3b2543ea9b7431856a5ee47fc3d0c432875fda6c37abf92fa376cf88dd60fa9ff9c7e4da9f73de99f55ce6fc4fffe21e254318abf2aa61b8a3d20f95441c5af044bfdac9a0a869a6f9b11e350fceb24bff97c9c55aa4fa9577559e795f2551d167f83ecafe6ee5289be82f4b31aea61a57c520fea50d78a49fc0949dd541a4fa96790d66da5f927f50c72fe42f7ffb1eb5faa6fc93720e00565bef4731c40a8f5fe5d44dcd4b2be17bd610214b1dcbf3047b640d6177f63816c81ac27fa430e3768fe0a3f568cf5be20f5046bc67a7e937ac1c50d41edf9d861893f085f48b001c967927885145b107b517111d842b1ef31e214540fa28f50860c34fe520f421572d47e27f1081886a87a94f885c0eed07a9ef7fb972f22c6d8cf444fa165acf57e37e2a0d849bde6621d31241d9678f89d884931294ea6df631b711cf77b1d567df8881bc55eea33a5ddf84ec4713c2c47dca29ec765ff5cfea6f3b7238ee3f0a09806a8bfb7c8f990f229a6b2c3daaf247e5450a2d8cd479c462cf58d4ac6aa27d1230d2943fd3d4ef44bd514071f71aed82f465ca0c4d7497e52cde3aabff588e3b8dfeab0f69fbb884bc5207a249862bc9ee2a0fd5fed43c6d23fe934e2a18ec35a8765dc4bfda0409562977758f57f1171ad184e3bacf542f541d3712ff58bcf93719c449fd476e7e132620c5abf163a2cfac48b88836290f8f2f121e220f9cfed9c22beeeb0ea57ef57293511a71dd67a22f5bac9a6e3612fe236683f94fed7e453ec37153703c561aec3a23727fda529a6e3b4d761ed07a38813c5e1098b1e83e8b529a7e3b8dc611dbfecb0f69371c4a98ebbfd0eebb8ae3f9c8efb8588b3387edb61adc76b1dd67a2cfa6a2a6ef09a1f071d96ef51f96b6ec8aa77f9bda181ee3ea0f19adc0f54cf731dd67ab612f15031c87db6098cb5df1e7458bf6fa638de578e23ae749ca4def27da6d2717fd861d5f366c4f1bee3be7458f36337e2f87b1249bd6c9ae9f77ea3c3f23dec460c71bed49767bf57171dd6f3dd51c4187f8f11fdf16137622f7a6e93e9ef35701f3191e44710fe369d62ca236ee2fcf90ecbb8dbeeb0e68ffebe954d314abcdba24d48cf0bfafb45dd1624f1de1eff779fff5f0eef3c78f4c1936f7ceb4ffca93ff3e7fec25ffe2a0e7fe53ff9517caefd677f13ff7debc7fece7ff9251c5f79bd7bffe01ffd3b3fe7e7fd825ff4effd925fe6f72b7ed57ff8051c6b7edd6ff84dbfe5b7fd8edff57bfea3dff707fed01ff963e619f8c4bbff9023f519af9d9ba760c6d20f7de56b3f72deb9ff84c3c1ccfadde3d00547ae6196d69dfc08873b7567b35af91e07b39cbb0b77e9ae98e5931bbdc6e1aedd6777e36eff1c07b38cdd9dfbe25819eede3d7c8fc33dba771345bab93fcb21b1d977f36ec12dbaf7dfe2700f6ec92df2facb6ec5adfe04c7c463c17d601bc7ea2fcbe1d6dc3ae7d3c86db84db667eb673824fadb6e8757d97d91634f183eba7d87fcedc10cc7a13b72c762ebc0252e7599cb39437667784a57f03ae52c871bba8a476abf095eec99e1d81e83030084e0906f5f0db47002a77ec1cd1b8e6d388373dfc2459f032e8155079f60a40c2f73c46fafe17357b7467003b76ed08f3c8ce18ec7ce0dc717fefa2bdcc343e7d76f72f09e97e011dec11cccc302cf5b74fb9cebcf59b6e03dbf5f82e5270e5881557ef701d69ebe83f56f73c046f7afcd492d862dd866dd3ecddd815d7e7b057bcf383ef29b7d38785e8de0108ebecdf28cefd80f60c03e4e7ade4a21e31b7531e5801286cc5141dd8f1d7ae4e0bece82c8be2fa7718c161e6040828b2907f7b101df79f99e3b531b123cc1533c7b85e3dc8ff0c244e4002fb9a7741cc88ac24f38b27501aff13372afc399ca6514703fcb8163bcc32ff8b5e3987cf3e0ee66543ec247feee1dce542eb38f799ebf00fdceb2818bee06df771c4bfccdb2d96beef77185dfa3ed6c330cab48f801977b31dfc5355cc70d58e93836710bb77bdf4ca23646ae3ab8fb0ac31eb22671dfa5cfb5cb352be5b707b0d1e96a010ff1c88d8daa8e71c07a79f1b4f18c23e1b552ce74eca925c18cdfe74f790e0b6e070bcbe136b1e4ef5ed3d4102bac434fb76e1c5c00bf12f089238440a1b1bec27168fd289c7c9f83679f86b3701e2e9e710cc225e7db42b87ac6c1d5208c6cccc375e0ca078feef4351659e326dc4e7781a330e615ef26ef3b0eae87e12b9f9afabaca786723df847b587e9d039efa57161eb8472c86c7e71c93f35f7817e64c3ccefd6660e58785b0e8ceb847de86f7dfd9c752dcfd7258095c5fc307b7d6dbc79abf0deb6163e67cb6cd31d97cea14612b6c879d6f7048378424ec85497d5d0dfbfa7ecae146e180d7d89df116eb1cc6e1301c85633c0cc761109290862ce4a198e12859256d1806eea5a1263f7dff54dbc9f911c16c1e4ee6410d6342b8e7ffc75cc1a46e52b01cc4cbe2881a6af10b9d4c4f57cf39dcc92497c0d3a9e578f9a199aca173ba20562c5dd1a7e7f5ed79af25f6375dd3e799aaf532c7cd8bf9b847b734d658bfc411ae88bb3c7de10abff72ac357baff86828b3e833dfb70cfe453373d70357b85851e5fcf979739d85fefd89b73f48033396f38e6bf7766f93e079ed102714fa4457acf3a9e3dff755aa325fa81dc7f898359e668856f5c235aa50fb446eb33595980873538800fb4419b3fc7211edbd2db2b6dd30eedd21e9d726fd8e353c7473edd2eb84dfa48fb72c70cf4031efbd61d870ee9888e85674009a594514e059534a48a6a397fe6349e54ee9fe798dc12c25ae379a5aba76aa50fbfa1c685fd1fa9c5dfe7d0c75f36d04c7e4f0bfeb4e172d3344ddb9cfc583ff9518e5ff1fc4f38fef5d737ff06b90355e7</data> </image> <image name="image3"> --- 693,697 ---- </image> <image name="image2"> ! <data format="XPM.GZ" length="8366">789ce597596f1cbb1185dffd2b04d79b11f04eefdd08f2a05db6164bb625590af250ec45d2689746cb28c87f4fcd290e35fb8c9d9bbc446dc0f89a6c1eb2eab0c8f9e3d3d2cffddda54f7f7c78ec70e7a25c2acff961e953f5747dddfdfb3ffef6cf0f1fe37c49fe85616b29fcf8970f1f0f3a4be5d2deed4ddd034302d4c25f8f6d090ee4019b6dc7612b00b7c0612b6e45e01b70daca5a698ff907386be5ad0ced3a5eeedb2b70216f945330cb9b027c062ee5b1f89ec1559fe9115cf7de80bf821b792a7cffea19ebe3a6c741184401e64fd00b92200e100c63c1a9bcc17ae827380fb220413cdec0569e1ce31d80eba00a305fb3dae350fe02d5bff4acfaa7e0288c8206fd0b70ecf9a4cf21e24ddf1cc7aebdeab3b61bcc2fcce4c1fcedbd67cdc73e38efb36d83ebb00a19f331e0461e30617e514b18eba165701aa5a1ce1ff98d4a79100f13802b61e457aca65c45c8a7c5f851d36746fec42c4da4f1433ce340de28239f712c01d07cc33f711ac711f4e9185cc536d6f5348ecb3806df816b61cc8fe1cfb8911eca2f3d4ec2a415eb7c11ef244ac258f52f1c47b1faef162c7fb1fa6d179c09c36f1c83eba44c107fca7b2cf66912d543fcd3348d138c6faec1599a241adfc033c6b7f04b9aa7a9e32ed8a645023fd11ab84a6da2f1c07ab220ad53f5ebb3e3c631e29ba5599cea7a37c17996a6aa1f8239cb535d1fd69b9519a7aa77e3197a16f9cd6a7903ff31ea816ce73a853f790b1ccb1be4c3d48e436586ff7291cb301f423c72cee51518f9cbeb9c33dd3fdf1ddb0cf136985f911441aefb35761ce5eaf7049c1671aefa5f3c231fd401e7858418e3239f051759aefa9fc16551285bec370e8a3a87be857f392c9a5ce7877ac6b1f4d078603f73c9a2003ef6acf1c7fab86211c078a84fb6c565a1f13f775c17bade1570c095e32b706c6546180ffeb1899519613cec1f2bf660ad1fd87f3617567fc2dfb61046bc18f5438aa9659dcfad67f5c73a38b035a33e58d4c732b40deb7cb1de32296586985fe338649d1ff251a665c4ea0fc4b7cccbd8eafc90dfd2969955bf6e804b0987e653b92ed96abdd9746c1d1f821b61c4db3c3b2e1da33ecbe1e098f63deb79f4e4b852b6886f15f8fe278e5dbb79f1ac7e693bae950df25b85be7ddbb16be73dc78dd5fa128123ff7dc7b16ba755e5aa65117f03bf56719fed8b67ad97f053955481e353c7a132c1af552aac7e427eabac8aace60ff5a0cafbcc4f8e63d77ee938b17a5fc0795b15d2aefebb70dc6f7ff4ace7d791e3549950df2bf61cf7b9d4fb87c6c30ae3bce6cc71a6edb4e959ef23a8975559e5ca74e659ebc537c78532dd7b56ff61bf5755bfdde8f7b56fb78e59d96a7bd367b3e5d8965aefc8b3d69f96e3d231ea935c5f1c33e22fd789caf18667f523f6971cdfb5e3dab3d653ecb73aeab7f391e3a6547fc17f75ecf941b96e29f38e67bdcf607fd649bfddde78567f468e03655ef7acf70b5d5feadbad676d5ff3acfeec3a0eb59dc8b3b6c38f75d66f376dc7916b7ff5acf5fadcb3fa197eaa73b920e8fe78f3acf747f8ab2ee440d7fea82735d769a9f54bc7b3c2eaef77d6f6af8e3365d2f896c27a5eef79d6fedd3e577a7e5c3bceb5dd6a7eab3ad776b3ec59fd9e3a2e5cfbb167b4db6bc7b6d2fba1aea7f6fdef3deb7ed971cc8ee1e7ba11c6f77cef59cf8f55c76e7cbef2acfb03f993cbb7633a745c2a1b9c074dd0675a715c55ba7fb05f9bb0cff6c971edbebff0ace77dee59f717ea7f13f59911cf2669824af70bea5993c90555fd8cf937459354ea0fc4a3691a5b6bbc32c755adebcf1d37b59e476b9e753fad7856bf469ed50fec59fd72d4e706fa7ce859fdb8ec19fd0f3affdde7ff57c3d0b4e7cfd2181a958d35e57c9ddfd2a84c6d1a7366cecd85699b4b7365aecdcd74955fd6b83577e6de3c9847d3314fe6d9bc9857d3356f66d9ac98d5c93abfacb166d665ec8d91675314b7cc67f3c56c8fabfcb2c6ced8f8efcfaed9335fcdfea8ca748dc9d19da9b1610ecc37f3ddfc18fe769ac6b40cced1d83087e6c81c9b9f835f4fd6f05e3cf9658d5e6ebae6d4b46669f8f103139ae837347a11db33f1fb4a4635bc426252994ff65b1abdece7a698ad817fbbd27767548398acce954aaaa8a686ce64873c8fa96cd1f9640da770611ea88d9e631a3d15b34397746576e99a6ee896eee85e76fbe98846871ee8515506359c42879e9cc2440da7f43c58a5e8855ea91cce3c75e96db2062dd30aadfa9e533546eb2fad49743b432a8fb4ae6def1aaeef066dbef7a3ad591a23ebff4c5fcce0b7dbb433498376696fb01a497e67ac64784df45562bc3f14ad03fa36a8e1e6f29d7e0ce78e2c1dd2d1622ae2a5f6d0b77b743caa413f45f964b4365065cee974fa2937b092d64846de2818d308291aad0b145342e9ac9374ba0665948f691452cf465dfec466f669fdaec144db435fdf338f6ab01d59eb86e972b9b042c57628e7cf5c7333acc1677c3ed4a7b7da2e5f2ca620dfb7a91ef4aed4817ad8bbd2e792afa4fa0f69f035df2cb88a5b7a45857b9f5fc577c3fb5ca8e0fb510d93f2c3221afcc81d1e3ee50ff9995f4635f895bb63b1caf86dbec64187977985575d45d62f4b5eeb677228e7eba339e70dde5c24e7fad0d6c0ae8a786bb4b643e3b3dc9a8663b54efbf36e9a03317b3fbfd6f9cbf839088d6d1e3de50ecc03efcebf6d0e6bf01e7fe5fd291a07fc6dec7ed6919c7c1fd4e01f7c384b83f6f9888f27dd4bdc08cf63d1eaf9bccb3ff9844fc5dda7dce280b624f23be34a3d0d3ae190a369f72bcc311edf87bdefe8879c6a5b727a6dc9ffb1ab9b63555f343a92eb84d3591a52b3da9c8dad64f233a6c1879c73319eb7d1b3d61a3b7a662eac3110f3a9776a6db52c15fe659e829c5d3c25f363de9b74f7b156aad91c15b2f3f7cb640d17af5254a2d9115bf4a49fa6019dcad6e2e3f1fb9ff79a491739e727690ca834f6cc9edb8bb15db9496dda94fbc0866d2f56c766ff36b097f6ca5edb1bf1f3ae79915bc7abdc6edb26b5b7f66ef13a36ef378ee8dcdb07fb683bf6c93edb17fb6abbf66d91ea355f63d66ffd5f5398ff9bf33f1b7d318d3fe3f99f68fcebaf1ffe0d02e9c7e9</data> </image> <image name="image3"> *************** *** 838,843 **** <tabstop>checkBox1</tabstop> <tabstop>comboBox6_2</tabstop> - <tabstop>comboBox6</tabstop> - <tabstop>pushButton9</tabstop> <tabstop>comboBox5</tabstop> <tabstop>spinBox3</tabstop> --- 782,785 ---- |
From: <te...@us...> - 2003-07-30 11:07:16
|
Update of /cvsroot/quickrip/quickrip/gtk In directory sc8-pr-cvs1:/tmp/cvs-serv18058/gtk Added Files: gtkmain.py gtkprogress.py gtksettings.py Log Message: Various tweaks here and there, and the addition of the Gtk files to CVS --- NEW FILE: gtkmain.py --- #!/usr/bin/python #guimain: #should include the list of tracks once scanned, the #basic settings for each track (bitrate & file size with #indication of quality), and the quit/configure/scan/rip buttons. try: import pygtk pygtk.require("2.0") import gtk, gobject import gtksettings, gtkprogress from gtksettings import * from gtkprogress import * except: print "Couldn't load PyGTK module! Check it's installed properly." print "If you think it is, but you still get this message, please" print "see the frequent problems page online at:" print "http://quickrip.sf.net/fp.shtml" print "" print "Press Enter for the full GTK error message" deleteme = raw_input() del deleteme import pygtk pygtk.require("2.0") import gtk, gobject import gtksettings, gtkprogress from gtksettings import * from gtkprogress import * class GTKMain: def rip(self, widget, data=None): print "Rip" self.dialogProgress.window.show_all() def scan(self, widget, data=None): print "Scan" def configure(self, widget, data=None): self.dialogSettings.window.show_all() print "Configure" def quit(self, widget, data=None): print "quit" gtk.main_quit() return gtk.FALSE def about(self, widget, data=None): print "about" def manual(self, widget, data=None): print "manual" def create_gtk_list(self): scrolled_window = gtk.ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) model = gtk.ListStore(gobject.TYPE_STRING) view = gtk.TreeView(model) scrolled_window.add_with_viewport(view) view.show() cell = gtk.CellRendererText() column1 = gtk.TreeViewColumn() column2 = gtk.TreeViewColumn() column3 = gtk.TreeViewColumn() column1.set_resizable(gtk.TRUE) column2.set_resizable(gtk.TRUE) column3.set_resizable(gtk.TRUE) column1.set_min_width(150) column2.set_min_width(150) column3.set_min_width(50) column1.set_title("Track") column2.set_title("Length") column3.set_title("Rip?") view.append_column(column1) view.append_column(column2) view.append_column(column3) return scrolled_window def build_menus(self): self.menuBar = gtk.MenuBar() self.menuFile = gtk.Menu() self.miFile = gtk.MenuItem("File") self.miFile.set_submenu(self.menuFile) self.menuBar.append(self.miFile) self.miScan = gtk.MenuItem("Scan") self.menuFile.append(self.miScan) self.miRip = gtk.MenuItem("Rip") self.menuFile.append(self.miRip) self.miQuit = gtk.MenuItem("Quit") self.menuFile.append(self.miQuit) self.menuOptions = gtk.Menu() self.miOptions = gtk.MenuItem("Options") self.miOptions.set_submenu(self.menuOptions) self.menuBar.append(self.miOptions) self.miPreferences = gtk.MenuItem("Configure") self.menuOptions.append(self.miPreferences) self.menuHelp = gtk.Menu() self.miHelp = gtk.MenuItem("Help") self.miHelp.set_submenu(self.menuHelp) self.menuBar.append(self.miHelp) self.miManual = gtk.MenuItem("Manual") self.menuHelp.append(self.miManual) self.miAbout = gtk.MenuItem("About") self.menuHelp.append(self.miAbout) self.miQuit.connect_object("activate", self.quit, None) self.miRip.connect_object("activate", self.rip, None) self.miScan.connect_object("activate", self.scan, None) self.miPreferences.connect_object("activate", self.configure, None) self.miAbout.connect_object("activate", self.about, None) self.miManual.connect_object("activate", self.manual, None) def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect("delete_event", self.quit) self.window.set_title("QuickRip") self.window.set_size_request(500, 480) self.dialogSettings = GTKSettings() self.dialogProgress = GTKProgress() self.boxMain = gtk.VBox(gtk.FALSE, 10) self.boxClient = gtk.HBox(gtk.TRUE, 10) self.frameTrackSettings = gtk.Frame("Track Settings") self.tableTrackSettings = gtk.Table(2, 4, gtk.TRUE) self.frameTrackSettings.add(self.tableTrackSettings) audlist = [ "64 kbps", "96 kbps", "112 kbps", "128 kbps", "160 kbps", "192 kbps", "224 kbps", "256 kbps", "320 kbps"] self.comboAudioBitrate = gtk.Combo() self.comboAudioBitrate.set_popdown_strings(audlist) self.tableTrackSettings.attach(gtk.Label("Target File Size:"), 0, 1, 0, 1) self.tableTrackSettings.attach(gtk.Label("Video Bitrate:"), 0, 1, 1, 2) self.tableTrackSettings.attach(gtk.Label("Audio Bitrate:"), 2, 3, 0, 1) self.tableTrackSettings.attach(self.comboAudioBitrate, 3, 4, 0, 1) self.frameOutputSettings = gtk.Frame("Output Settings:") self.tableOutputSettings = gtk.Table(2, 6, gtk.TRUE) self.frameOutputSettings.add(self.tableOutputSettings) vollist = [ "0", "+1", "+2", "+3", "+4", "+5", "+6", "+7", "+8", "+9", "+10" ] self.textOutputFile = gtk.TextView() self.comboLanguage = gtk.Combo() self.comboSubtitles = gtk.Combo() self.comboVolume = gtk.Combo() self.comboVolume.set_popdown_strings(vollist) self.widgetBrowse = gtk.Button("Browse") self.tableOutputSettings.attach(gtk.Label("Language:"), 0, 1, 0, 1) self.tableOutputSettings.attach(self.comboLanguage, 1, 2, 0, 1) self.tableOutputSettings.attach(gtk.Label("Subtitles:"), 2, 3, 0, 1) self.tableOutputSettings.attach(self.comboSubtitles, 3, 4, 0, 1) self.tableOutputSettings.attach(gtk.Label("Volume:"), 4, 5, 0, 1) self.tableOutputSettings.attach(self.comboVolume, 5, 6, 0, 1) self.tableOutputSettings.attach(gtk.Label("Target File:"), 0, 1, 1, 2) self.tableOutputSettings.attach(self.textOutputFile, 1, 5, 1, 2) #, GTK_FILL|GTK_ATTACH, 0) self.tableOutputSettings.attach(self.widgetBrowse, 5, 6, 1, 2) self.tracklist = self.create_gtk_list() self.build_menus() #################### event mapping self.widgetScan = gtk.Button("Scan") self.widgetRip = gtk.Button("Rip") self.widgetRip.connect("clicked", self.rip, None) self.widgetScan.connect("clicked", self.scan, None) self.widgetBrowse.connect("clicked", self.browse, None) ##################### packing and arrangements of widgets self.window.add(self.boxMain) self.boxMain.pack_start(self.menuBar, gtk.FALSE, gtk.FALSE, 0) self.boxMain.pack_start(self.tracklist, gtk.TRUE, gtk.TRUE, 0) self.boxMain.pack_start(self.frameTrackSettings) self.boxMain.pack_start(self.frameOutputSettings) self.boxMain.pack_end(self.boxClient, gtk.TRUE, gtk.TRUE, 0) self.boxClient.pack_start(self.widgetScan, gtk.TRUE, gtk.TRUE, 0) self.boxClient.pack_start(self.widgetRip, gtk.TRUE, gtk.TRUE, 0) ################################# Showing of objects self.window.show_all() def browse(self, widget, data=None): self.filesel = gtk.FileSelection() self.filesel.ok_button.connect("clicked", self.accept) self.filesel.cancel_button.connect("clicked", self.cancel) self.filesel.show() def cancel(self, widget): self.filesel.hide() def accept(self, widget): textbuf = gtk.TextBuffer() textbuf.set_text(self.filesel.get_filename()) self.textOutputFile.set_buffer(textbuf) self.filesel.hide() def main(self): gtk.main() def main(): app = GTKMain() app.main() --- NEW FILE: gtkprogress.py --- #!/usr/bin/python #guiprogress: #an indication of the track being ripped, #what number it is out of all being ripped (e.g. 1 of 5), #the ETA, #the progress on the particular pass, and a #cancel button (that stops the ripping and closes the dialogue) try: import pygtk pygtk.require("2.0") import gtk except: print "Couldn't load PyGTK module! Check it's installed properly." print "If you think it is, but you still get this message, please" print "see the frequent problems page online at:" print "http://quickrip.sf.net/fp.shtml" print "" print "Press Enter for the full GTK error message" deleteme = raw_input() del deleteme import pygtk pygtk.require("2.0") import gtk class GTKProgress: def quit(self, widget, data=None): print "close progress" self.window.hide() return gtk.TRUE def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("Rip in progress . . .") self.window.set_resizable(gtk.FALSE) self.window.set_border_width(5) self.window.set_size_request(300, 100) self.boxMain = gtk.VBox(gtk.FALSE, 0) self.boxClient = gtk.HBox(gtk.FALSE, 0) self.label = gtk.Label("Status, 1/5, etc") self.widgetCancel = gtk.Button("Cancel") self.progressBar = gtk.ProgressBar() self.progressBar.set_text("Some percent") #################### event mapping self.window.connect("delete_event", self.quit) self.widgetCancel.connect("clicked", self.quit, None) ##################### packing and arrangements of widgets self.window.add(self.boxMain) self.boxMain.pack_start(self.progressBar) self.boxMain.pack_end(self.boxClient, gtk.TRUE, gtk.TRUE, 0) self.boxClient.pack_start(self.label, gtk.FALSE, gtk.FALSE, 0) self.boxClient.pack_end(self.widgetCancel, gtk.FALSE, gtk.FALSE, 0) ################################# Showing of objects # self.window.show_all() def main(self): gtk.main() if __name__ == "__main__": app = GTKProgress() app.main() --- NEW FILE: gtksettings.py --- #!/usr/bin/python #guisettings: #should contain all other settings, in sections: #general - audio / language / other #paths - output dir / programs / devices #mencoder - deinterlacing, aspect ratio, etc try: import pygtk pygtk.require("2.0") import gtk except: print "Couldn't load PyGTK module! Check it's installed properly." print "If you think it is, but you still get this message, please" print "see the frequent problems page online at:" print "http://quickrip.sf.net/fp.shtml" print "" print "Press Enter for the full GTK error message" deleteme = raw_input() del deleteme import pygtk pygtk.require("2.0") import gtk class GTKSettings: def quit(self, widget, data=None): print "close settigns" self.window.hide() return gtk.TRUE def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("Preferences") self.window.connect("delete_event", self.quit) self.window.set_size_request(400, 300) # self.window.set_resizable(gtk.TRUE) # self.window.set_border_width(0) self.pageGeneral = gtk.VBox(gtk.FALSE, 0) self.pagePaths = gtk.VBox(gtk.FALSE, 0) self.pageMencoder = gtk.VBox(gtk.FALSE, 0) self.notebook = gtk.Notebook() self.clickGeneral = gtk.Label("General") self.clickPaths = gtk.Label("Paths") self.clickMencoder = gtk.Label("Mencoder") self.notebook.append_page(self.pageGeneral, self.clickGeneral) self.notebook.append_page(self.pagePaths, self.clickPaths) self.notebook.append_page(self.pageMencoder, self.clickMencoder) self.window.add(self.notebook) # self.window.show_all() def main(self): gtk.main() if __name__ == "__main__": app = GTKSettings() app.main() |
From: <te...@us...> - 2003-07-30 11:07:16
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv18058 Modified Files: config.py dvd.py gui.py quickrip.py Log Message: Various tweaks here and there, and the addition of the Gtk files to CVS Index: config.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/config.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** config.py 26 Jul 2003 03:27:53 -0000 1.9 --- config.py 30 Jul 2003 11:07:10 -0000 1.10 *************** *** 14,19 **** app = "QuickRip" author = "Tom Chance <tom...@gm...>" ! version = "0.8cvs" ! date = "2003-07-25" copyright = "(C) 2003 Tom Chance" license = "GNU General Public License (GPL) (see LICENSE file)" --- 14,19 ---- app = "QuickRip" author = "Tom Chance <tom...@gm...>" ! version = "0.8-rc1" ! date = "2003-07-30" copyright = "(C) 2003 Tom Chance" license = "GNU General Public License (GPL) (see LICENSE file)" Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** dvd.py 29 Jul 2003 01:04:18 -0000 1.25 --- dvd.py 30 Jul 2003 11:07:10 -0000 1.26 *************** *** 349,359 **** all_pass.insert(4, self.sLanguage) ! # # Uncomment to test command ! # string = "" ! # for bit in all_pass: ! # bit = "".join([" ", bit]) ! # string = "".join([string, bit]) ! # print all_pass ! # print string # sys.exit(1) --- 349,359 ---- all_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string = "" ! for bit in all_pass: ! bit = "".join([" ", bit]) ! string = "".join([string, bit]) ! print all_pass ! print string # sys.exit(1) *************** *** 377,391 **** video_pass.insert(4, self.sLanguage) ! # # Uncomment to test command ! # string1 = "" ! # string2 = "" ! # for bit in audio_pass: ! # bit = "".join([" ", str(bit)]) ! # string1 = "".join([string1, bit]) ! # for bit in video_pass: ! # bit = "".join([" ", str(bit)]) ! # string2 = "".join([string2, bit]) ! # print string1 ! # print string2 # sys.exit(1) --- 377,391 ---- video_pass.insert(4, self.sLanguage) ! # Uncomment to test command ! string1 = "" ! string2 = "" ! for bit in audio_pass: ! bit = "".join([" ", str(bit)]) ! string1 = "".join([string1, bit]) ! for bit in video_pass: ! bit = "".join([" ", str(bit)]) ! string2 = "".join([string2, bit]) ! print string1 ! print string2 # sys.exit(1) Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** gui.py 26 Jul 2003 03:28:54 -0000 1.16 --- gui.py 30 Jul 2003 11:07:11 -0000 1.17 *************** *** 13,29 **** from dvd import * try: ! from qt import * except: ! print """ ! Couldn't load PyQT module! Check it's installed properly. ! If you think it is, but you still get this message, please ! see the frequent problems page online at: ! http://quickrip.sf.net/fp.shtml ! ! Press Enter for the full Qt error message ! """ ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings --- 13,27 ---- from dvd import * try: ! from qt import * except: ! print "Couldn't load PyQT module! Check it's installed properly." ! print "If you think it is, but you still get this message, please" ! print "see the frequent problems page online at:" ! print "http://quickrip.sf.net/fp.shtml" ! print "" ! print "Press Enter for the full Qt error message" ! deleteme = raw_input() ! del deleteme ! import qt from guimain import MainWindow from guisettings import dialogSettings *************** *** 43,513 **** class GUI(DVD, MainWindow): ! """GUI-specific functions to add a Qt GUI to the DVD class: ! changeState() - start/stop the ripping process ! int_startScanning() - notify user that the DVD is being scanned ! int_noTracks() - notify user that no tracks were found ! int_dispDVD() - display information about the DVD ! int_dispTrack() - display information about scanned track ! int_finishScanning() - notify user that scanning has finished ! int_startRipping() - notify user that ripping has started ! int_newTrack() - notify that ripping has begun on a new track ! int_newPass() - notify that new ripping pass has begun ! int_updateProgress() - update any ripping progress display being used ! int_finishRipping() - notify user that ripping has finished""" ! def __init__(self, app, parent=None): ! self.app = app ! MainWindow.__init__(self, parent) ! self.setIcon(QPixmap(config.icon)) # set application icon... ! self.DVD_DEVICE = "/dev/dvd" ! self.cwd = os.getcwd() ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! self.configfile = os.path.join(os.path.expanduser("~"),".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! self.outputDir.setText(self.config['outputdir']) ! self.outdir = self.config['outputdir'] ! def int_configError(self, bin): ! self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") ! sys.exit(2) ! def int_startScanning(self): ! print "* Scanning DVD..." ! self.b_ScanDVD.setText("Scanning...") ! self.dvdTracks.clear() ! def int_noTracks(self): ! QMessageBox.warning(self, "QuickRip Error", "QuickRip was unable to find any " ! "DVD tracks.\n\nCheck:\n* Mplayer and Transcode are " ! "installed\n* The program paths are correct in Settings\n" ! "* Mplayer can play DVDs\n* You have a DVD " ! "in your drive", "OK") ! self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): ! #print "Found %s titles" % (self.numtitles) ! #print "Found audio languages %s" % (self.alangs) ! #print "Found subtitle languages %s" % (self.slangs) ! print "Found %s titles\nFound audio languages %s\nFound subtitle languages %s\n" % \ ! (self.numtitles, self.alangs, self.slangs) ! # Add languages to drop-down menus ! for lang in self.alangs: ! self.aLang.insertItem(lang, -1) ! for lang in self.slangs: ! self.subTitles.insertItem(lang, -1) ! def int_dispTrack(self, track): ! self.track = track ! print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = QListViewItem(self.dvdTracks,None) ! item.setText(0, self.track['name']) ! item.setText(1, str(self.track['timelabel'])) ! item.info = self.track ! for i in range(int(self.track['numchapters']) + 1): ! if i > 0: ! if i < 10: i = "0" + str(i) ! chap_label = "Chapter %s" % (i) ! subitem = QListViewItem(item,None) ! subitem.setText(0, self.tr(chap_label)) ! self.app.processEvents() ! def int_finishScanning(self): ! print "* Finished scanning" ! self.b_ScanDVD.setText("Scan DVD") ! def int_startRipping(self): ! print "* Starting ripping" ! def int_newTrack(self, name, number, total, vbr): ! print "*\tRipping track '%s' (%s of %s) at %skbps" % (name, number, total, vbr) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def int_newPass(self, passtype): ! self.passtype = passtype ! if self.passtype is "video1": ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.passtype is "video2": ! self.Dialogue.pm_videoPass1.setProgress(100) ! def int_updateProgress(self, perc, trem, tpass): ! self.percentage = perc ! self.trem = trem ! self.tpass = tpass ! eta = "".join(["ETA: ", str(trem), " (approximately)"]) ! self.Dialogue.l_ETA.setText(eta) ! if self.tpass is "all": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "audio": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "video1": ! self.Dialogue.pm_videoPass1.setProgress(int(perc)) ! elif self.tpass is "video2": ! self.Dialogue.pm_videoPass2.setProgress(int(perc)) ! self.app.processEvents() ! def int_finishRipping(self): ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_videoPass1.setProgress(100) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_videoPass2.setProgress(100) ! print "* Ripping finished" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.l_ETA.setText("ETA: N/A") ! self.state = "stopped" ! os.chdir(self.cwd) ! def selectTrack(self, const, qpoint, col): ! """Select tracks to rip by setting column 2 to 'yes'""" ! # Check the mouse isn't clicking in blank space ! self.track = self.dvdTracks.selectedItem() ! try: ! checker = self.track.text(0) ! del checker ! except: ! return ! # Check if the user has clicked on a title or a chapter ! chap = re.compile('Chapter.*') ! if not chap.search(str(self.track.text(0))): ! # Stop short of tagging for ripping unless "Rip" column is selected ! if col is not 2: ! self.updateTrackDisplay(self.track) ! return ! if self.track.info['rip'] is "yes": ! self.track.setPixmap(2, self.image_blank) ! self.updateTrackRip(self.track, mode="remove") ! else: ! self.track.setPixmap(2, self.image_tick) ! self.updateTrackRip(self.track, mode="add") ! self.checkEnableRip() ! def updateTrackDisplay(self, track): ! self.track = track ! self.track.info['name'] = self.track.text(0) ! if abs(int(str(self.fileSize.cleanText())) - self.track.info['size']) > 1: ! self.fileSize.setValue(self.track.info['size']) ! if abs(self.audioBitRate.currentItem() - self.track.info['abr_id']) > 1: ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.track.info['abr'] = self.audioBitRate.currentText() ! if abs(int(str(self.videoBitRate.cleanText())) - self.track.info['vbr']) > 1: ! self.videoBitRate.setValue(self.track.info['vbr']) ! self.videoBitRateSlider.setValue(self.track.info['vbr']) ! def updateTrackRip(self, track, mode): ! """Update track's rip attribute""" ! if not len(self.tracks): ! return ! # Add/remove "rip" status to/from track ! self.mode = mode ! if self.mode is "remove": ! self.track.info['rip'] = "no" ! elif self.mode is "add": ! self.track.info['rip'] = "yes" ! self.updateTrackDisplay(self.track) ! def newFileSize(self, filesize): ! self.track = self.dvdTracks.selectedItem() ! self.filesize = int(str(self.fileSize.cleanText())) ! self.track.info['size'] = int(self.filesize) ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! #print "new file size, changing video bitrate to %s (size: %s, length %s, abr %s)" % (self.track.info['vbr'], self.track.info['size'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.bitrate = int(str(self.videoBitRate.cleanText())) ! self.track.info['vbr'] = self.bitrate ! self.track.info['size'] = self.calcFileSize(self.track.info['time'], self.track.info['abr'], self.track.info['vbr']) ! #print "new bitrate, changing file size to %s (vbr: %s, length %s, abr %s)" % (self.track.info['size'],self.track.info['vbr'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newAudioBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.audiobitrate = int(str(self.audioBitRate.currentText())) ! print self.audiobitrate ! self.track.info['abr'] = self.audiobitrate ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! self.updateTrackDisplay(self.track) ! def checkEnableRip(self): ! r = str(self.videoBitRate.cleanText()) ! o = str(self.outputDir.text()) ! t = 0 ! for track in self.tracks: ! if track['rip'] is "yes": ! t = 1 ! if len(r) > 0 and len(o) > 0 and t is 1: ! self.b_RipDVD.setEnabled(1) ! else: ! self.b_RipDVD.setEnabled(0) ! def renameTrack(self, item): ! """Set ViewListItem to be renamed""" ! self.item = item ! self.item.setRenameEnabled(0, 1) ! self.item.startRename(0) ! def browseHD(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.outputDir.setText(str(directory)) ! self.outdir = str(directory) ! self.checkEnableRip() ! def openRipDialogue(self): ! #try: ! # os.chdir(config.qr_dir) ! #except OSError, msg: ! # print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" ! import output ! print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 282, GUI.PY)") ! self.state = "stopped" ! self.Dialogue = dialogueProgress(self) ! self.Dialogue.connect(self.Dialogue.b_changeState,SIGNAL("clicked()"),self.changeState) ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! # Add in progress bars appropriate to number of passes ! l_audiopass = QHBoxLayout(None,0,6,"l_audiopass") ! self.Dialogue.textLabel3 = QLabel(self.Dialogue.groupBox3,"textlabel3") ! l_audiopass.addWidget(self.Dialogue.textLabel3) ! self.Dialogue.pm_audioPass = QProgressBar(self.Dialogue.groupBox3,"pm_audioPass") ! self.Dialogue.pm_audioPass.setMinimumSize(QSize(400,0)) ! l_audiopass.addWidget(self.Dialogue.pm_audioPass) ! self.Dialogue.groupBox3Layout.addLayout(l_audiopass,2,0) ! self.Dialogue.textLabel3.setText(self.tr("Progress:")) ! if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) ! if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) ! # if self.config['passes'] is 1: ! # from guiprogressdialogue_1pass import dialogProgress ! # elif self.config['passes'] is 2: ! # from guiprogressdialogue_2pass import dialogProgress ! # elif not self.config['passes'] or self.config['passes'] is 3: ! # from guiprogressdialogue_3pass import dialogProgress ! self.Dialogue.exec_loop() ! def changeState(self): ! """Switch dialogue between stopped and ripping, changing buttons ! and starting/stopping ripping process""" ! if self.state is "stopped": ! self.Dialogue.b_changeState.setText("Stop") ! self.Dialogue.b_closeProgressDialogue.setEnabled(0) ! os.chdir(self.outdir) ! self.volumead = str(self.volume.currentText()) ! self.aLanguage = str(self.aLang.currentText()) ! self.sLanguage = str(self.subTitles.currentText()) ! self.ripDVD() ! elif self.state is "ripping": ! print "* Ripping aborted" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! try: ! pid = self.pipe.pid ! os.kill(pid, 9) ! os.waitpid(pid, os.WNOHANG) ! except: ! pass ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! #elif self.config['passes'] == 0 or self.config['passes'] == 3: ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.state = "stopped" ! os.chdir(self.cwd) ! def openSettingsDialogue(self): ! """Open the settings dialogue box, connecting slots to functions""" ! self.Dialogue = dialogSettings(self) ! # Set-up defauls from config file ! self.Dialogue.mplayer.setText(self.config['mplayer']) ! self.Dialogue.mencoder.setText(self.config['mencoder']) ! self.Dialogue.tcprobe.setText(self.config['tcprobe']) ! self.Dialogue.dvdDevice.setText(self.config['dvd_device']) ! self.Dialogue.outputDir.setText(self.config['outputdir']) ! self.Dialogue.deInterlacing.setCurrentItem(int(self.config['deinterlacing'])) ! self.Dialogue.aspectRatio.setCurrentItem(int(self.config['aspectratio'])) ! self.Dialogue.encoderPasses.setCurrentItem(int(self.config['passes'])) ! self.Dialogue.videoCodec.setCurrentItem(int(self.config['videocodec'])) ! if self.config['pdamode'] == 1: ! self.Dialogue.c_pdamode.setChecked(1) ! # Connect functions ! self.connect(self.Dialogue.b_browseMPlayer,SIGNAL("clicked()"),self.browseMPlayer) ! self.connect(self.Dialogue.b_browseMencoder,SIGNAL("clicked()"),self.browseMencoder) ! self.connect(self.Dialogue.b_browseTcprobe,SIGNAL("clicked()"),self.browseTcprobe) ! self.connect(self.Dialogue.b_browseDVD,SIGNAL("clicked()"),self.browseDVD) ! self.connect(self.Dialogue.b_selectOutputDir,SIGNAL("clicked()"),self.selectOutDir) ! self.connect(self.Dialogue.b_OK,SIGNAL("clicked()"),self.changeSettings) ! self.connect(self.Dialogue.b_Save,SIGNAL("clicked()"),self.saveSettings) ! self.Dialogue.exec_loop() ! def browseMPlayer(self): ! """Launch file dialogue and set path to MPlayer""" ! self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to MPlayer") ! self.Dialogue.mplayer.setText(str(mplayer)) ! def browseMencoder(self): ! """Launch file dialogue and set path to Mencoder""" ! self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Mencoder") ! self.Dialogue.mencoder.setText(str(mencoder)) ! def browseTcprobe(self): ! """Launch file dialogue and set path to Tcprobe""" ! self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Tcprobe") ! self.Dialogue.tcprobe.setText(str(tcprobe)) ! def browseDVD(self): ! """Launch file dialogue and set path to dvd device""" ! try: ! self.path = re.compile('(/.*)/.*').search(self.config['dvd_device']).group(1) ! except: ! self.path = os.path.join("/", "dev", "dvd") ! dvd_device = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to DVD Device") ! self.Dialogue.dvdDevice.setText(str(dvd_device)) ! def selectOutDir(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.Dialogue.outputDir.setText(str(directory)) ! def changeSettings(self): ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.Dialogue.accept() ! def saveSettings(self): ! print "* Saving new settings to ~/.quickriprc" ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.parser.set('paths', 'mplayer', self.config['mplayer']) ! self.parser.set('paths', 'mencoder', self.config['mencoder']) ! self.parser.set('paths', 'tcprobe', self.config['tcprobe']) ! self.parser.set('paths', 'dvd_device', self.config['dvd_device']) ! self.parser.set('paths', 'outputdir', self.config['outputdir']) ! self.parser.set('mencoder', 'deinterlacing', self.config['deinterlacing']) ! self.parser.set('mencoder', 'aspectratio', self.config['aspectratio']) ! self.parser.set('mencoder', 'passes', self.config['passes']) ! self.parser.set('mencoder', 'pdamode', self.config['pdamode']) ! self.parser.set('mencoder', 'videocodec', self.config['videocodec']) ! self.parser.write(open(self.configfile, 'w')) def main(): ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! app = QApplication(sys.argv) ! QObject.connect(app, SIGNAL('lastWindowClosed()'), ! app, SLOT('quit()')) ! win = GUI(app) ! app.setMainWidget(win) ! win.show() ! app.exec_loop() --- 41,511 ---- class GUI(DVD, MainWindow): ! """GUI-specific functions to add a Qt GUI to the DVD class: ! changeState() - start/stop the ripping process ! int_startScanning() - notify user that the DVD is being scanned ! int_noTracks() - notify user that no tracks were found ! int_dispDVD() - display information about the DVD ! int_dispTrack() - display information about scanned track ! int_finishScanning() - notify user that scanning has finished ! int_startRipping() - notify user that ripping has started ! int_newTrack() - notify that ripping has begun on a new track ! int_newPass() - notify that new ripping pass has begun ! int_updateProgress() - update any ripping progress display being used ! int_finishRipping() - notify user that ripping has finished""" ! def __init__(self, app, parent=None): ! self.app = app ! MainWindow.__init__(self, parent) ! self.setIcon(QPixmap(config.icon)) # set application icon... ! self.DVD_DEVICE = "/dev/dvd" ! self.cwd = os.getcwd() ! self.alangs = [] ! self.slangs = [] ! self.tracks = [] ! self.dio = {0 : 'None', 1: 'dint', 2: 'il', 3: 'lavcdeint', 4: 'pp=lb'} ! self.aro = {0: 'Default', 1: '4:3', 2: '16:9', 3: '2.35:1'} ! self.configfile = os.path.join(os.path.expanduser("~"),".quickriprc") ! (self.config, self.parser) = self.loadConfig() ! self.outputDir.setText(self.config['outputdir']) ! self.outdir = self.config['outputdir'] ! def int_configError(self, bin): ! self.errormsg = "QuickRip was unable to find " + bin + " on your system.\nCheck it is installed then retry" ! QMessageBox.critical(self, "QuickRip Error", self.errormsg, "OK") ! sys.exit(2) ! def int_startScanning(self): ! print "* Scanning DVD..." ! self.b_ScanDVD.setText("Scanning...") ! self.dvdTracks.clear() ! def int_noTracks(self): ! QMessageBox.warning(self, "QuickRip Error", "QuickRip was unable to find any " ! "DVD tracks.\n\nCheck:\n* Mplayer and Transcode are " ! "installed\n* The program paths are correct in Settings\n" ! "* Mplayer can play DVDs\n* You have a DVD " ! "in your drive", "OK") ! self.b_ScanDVD.setText("Scan DVD") ! def int_dispDVD(self): ! #print "Found %s titles" % (self.numtitles) ! #print "Found audio languages %s" % (self.alangs) ! #print "Found subtitle languages %s" % (self.slangs) ! print "Found %s titles\nFound audio languages %s\nFound subtitle languages %s\n" % \ ! (self.numtitles, self.alangs, self.slangs) ! # Add languages to drop-down menus ! for lang in self.alangs: ! self.aLang.insertItem(lang, -1) ! for lang in self.slangs: ! self.subTitles.insertItem(lang, -1) ! def int_dispTrack(self, track): ! self.track = track ! print "Track %2s: %2s" % (self.track['id'], self.track['timelabel']) ! item = QListViewItem(self.dvdTracks,None) ! item.setText(0, self.track['name']) ! item.setText(1, str(self.track['timelabel'])) ! item.info = self.track ! for i in range(int(self.track['numchapters']) + 1): ! if i > 0: ! if i < 10: i = "0" + str(i) ! chap_label = "Chapter %s" % (i) ! subitem = QListViewItem(item,None) ! subitem.setText(0, self.tr(chap_label)) ! self.app.processEvents() ! def int_finishScanning(self): ! print "* Finished scanning" ! self.b_ScanDVD.setText("Scan DVD") ! def int_startRipping(self): ! print "* Starting ripping" ! def int_newTrack(self, name, number, total, vbr): ! print "*\tRipping track '%s' (%s of %s) at %skbps" % (name, number, total, vbr) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("".join(["Ripping ", str(name), " (", str(number), " of ", str(total), ")"])) ! def int_newPass(self, passtype): ! self.passtype = passtype ! if self.passtype is "video1": ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.passtype is "video2": ! self.Dialogue.pm_videoPass1.setProgress(100) ! def int_updateProgress(self, perc, trem, tpass): ! self.percentage = perc ! self.trem = trem ! self.tpass = tpass ! eta = "".join(["ETA: ", str(trem), " (approximately)"]) ! self.Dialogue.l_ETA.setText(eta) ! if self.tpass is "all": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "audio": ! self.Dialogue.pm_audioPass.setProgress(int(perc)) ! elif self.tpass is "video1": ! self.Dialogue.pm_videoPass1.setProgress(int(perc)) ! elif self.tpass is "video2": ! self.Dialogue.pm_videoPass2.setProgress(int(perc)) ! self.app.processEvents() ! def int_finishRipping(self): ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(100) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_videoPass1.setProgress(100) ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_videoPass2.setProgress(100) ! print "* Ripping finished" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.l_ETA.setText("ETA: N/A") ! self.state = "stopped" ! os.chdir(self.cwd) ! def selectTrack(self, const, qpoint, col): ! """Select tracks to rip by setting column 2 to 'yes'""" ! # Check the mouse isn't clicking in blank space ! self.track = self.dvdTracks.selectedItem() ! try: ! checker = self.track.text(0) ! del checker ! except: ! return ! # Check if the user has clicked on a title or a chapter ! chap = re.compile('Chapter.*') ! if not chap.search(str(self.track.text(0))): ! # Stop short of tagging for ripping unless "Rip" column is selected ! if col is not 2: ! self.updateTrackDisplay(self.track) ! return ! if self.track.info['rip'] is "yes": ! self.track.setPixmap(2, self.image_blank) ! self.updateTrackRip(self.track, mode="remove") ! else: ! self.track.setPixmap(2, self.image_tick) ! self.updateTrackRip(self.track, mode="add") ! self.checkEnableRip() ! def updateTrackDisplay(self, track): ! self.track = track ! self.track.info['name'] = self.track.text(0) ! if abs(int(str(self.fileSize.cleanText())) - self.track.info['size']) > 1: ! self.fileSize.setValue(self.track.info['size']) ! if abs(self.audioBitRate.currentItem() - self.track.info['abr_id']) > 1: ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.track.info['abr'] = self.audioBitRate.currentText() ! if abs(int(str(self.videoBitRate.cleanText())) - self.track.info['vbr']) > 1: ! self.videoBitRate.setValue(self.track.info['vbr']) ! self.videoBitRateSlider.setValue(self.track.info['vbr']) ! def updateTrackRip(self, track, mode): ! """Update track's rip attribute""" ! if not len(self.tracks): ! return ! # Add/remove "rip" status to/from track ! self.mode = mode ! if self.mode is "remove": ! self.track.info['rip'] = "no" ! elif self.mode is "add": ! self.track.info['rip'] = "yes" ! self.updateTrackDisplay(self.track) ! def newFileSize(self, filesize): ! self.track = self.dvdTracks.selectedItem() ! self.filesize = int(str(self.fileSize.cleanText())) ! self.track.info['size'] = int(self.filesize) ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! #print "new file size, changing video bitrate to %s (size: %s, length %s, abr %s)" % (self.track.info['vbr'], self.track.info['size'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.bitrate = int(str(self.videoBitRate.cleanText())) ! self.track.info['vbr'] = self.bitrate ! self.track.info['size'] = self.calcFileSize(self.track.info['time'], self.track.info['abr'], self.track.info['vbr']) ! #print "new bitrate, changing file size to %s (vbr: %s, length %s, abr %s)" % (self.track.info['size'],self.track.info['vbr'], self.track.info['time'], self.track.info['abr']) ! self.updateTrackDisplay(self.track) ! def newAudioBitrate(self, bitrate): ! self.track = self.dvdTracks.selectedItem() ! self.audiobitrate = int(str(self.audioBitRate.currentText())) ! print self.audiobitrate ! self.track.info['abr'] = self.audiobitrate ! self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) ! self.updateTrackDisplay(self.track) ! def checkEnableRip(self): ! r = str(self.videoBitRate.cleanText()) ! o = str(self.outputDir.text()) ! t = 0 ! for track in self.tracks: ! if track['rip'] is "yes": ! t = 1 ! if len(r) > 0 and len(o) > 0 and t is 1: ! self.b_RipDVD.setEnabled(1) ! else: ! self.b_RipDVD.setEnabled(0) ! def renameTrack(self, item): ! """Set ViewListItem to be renamed""" ! self.item = item ! self.item.setRenameEnabled(0, 1) ! self.item.startRename(0) ! def browseHD(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.outputDir.setText(str(directory)) ! self.outdir = str(directory) ! self.checkEnableRip() ! def openRipDialogue(self): ! try: ! os.chdir(config.qr_dir) ! except OSError, msg: ! print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" ! #import output ! #print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 282, GUI.PY)") ! self.state = "stopped" ! self.Dialogue = dialogueProgress(self) ! self.Dialogue.connect(self.Dialogue.b_changeState,SIGNAL("clicked()"),self.changeState) ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! # Add in progress bars appropriate to number of passes ! l_audiopass = QHBoxLayout(None,0,6,"l_audiopass") ! self.Dialogue.textLabel3 = QLabel(self.Dialogue.groupBox3,"textlabel3") ! l_audiopass.addWidget(self.Dialogue.textLabel3) ! self.Dialogue.pm_audioPass = QProgressBar(self.Dialogue.groupBox3,"pm_audioPass") ! self.Dialogue.pm_audioPass.setMinimumSize(QSize(400,0)) ! l_audiopass.addWidget(self.Dialogue.pm_audioPass) ! self.Dialogue.groupBox3Layout.addLayout(l_audiopass,2,0) ! self.Dialogue.textLabel3.setText(self.tr("Progress:")) ! if self.config['passes'] is 2 or self.config['passes'] is 3: ! l_videopass1 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel4 = QLabel(self.Dialogue.groupBox3,"textlabel4") ! l_videopass1.addWidget(self.Dialogue.textLabel4) ! self.Dialogue.pm_videoPass1 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass1") ! self.Dialogue.pm_videoPass1.setMinimumSize(QSize(400,0)) ! l_videopass1.addWidget(self.Dialogue.pm_videoPass1) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass1,3,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass:")) ! if self.config['passes'] is 3: ! l_videopass2 = QHBoxLayout(None,0,6,"l_videopass1") ! self.Dialogue.textLabel5 = QLabel(self.Dialogue.groupBox3,"textlabel5") ! l_videopass2.addWidget(self.Dialogue.textLabel5) ! self.Dialogue.pm_videoPass2 = QProgressBar(self.Dialogue.groupBox3,"pm_videoPass2") ! self.Dialogue.pm_videoPass2.setMinimumSize(QSize(400,0)) ! l_videopass2.addWidget(self.Dialogue.pm_videoPass2) ! self.Dialogue.groupBox3Layout.addLayout(l_videopass2,4,0) ! self.Dialogue.textLabel3.setText(self.tr("Audio pass:")) ! self.Dialogue.textLabel4.setText(self.tr("Video pass 1:")) ! self.Dialogue.textLabel5.setText(self.tr("Video pass 2:")) ! # if self.config['passes'] is 1: ! # from guiprogressdialogue_1pass import dialogProgress ! # elif self.config['passes'] is 2: ! # from guiprogressdialogue_2pass import dialogProgress ! # elif not self.config['passes'] or self.config['passes'] is 3: ! # from guiprogressdialogue_3pass import dialogProgress ! self.Dialogue.exec_loop() ! def changeState(self): ! """Switch dialogue between stopped and ripping, changing buttons ! and starting/stopping ripping process""" ! if self.state is "stopped": ! self.Dialogue.b_changeState.setText("Stop") ! self.Dialogue.b_closeProgressDialogue.setEnabled(0) ! os.chdir(self.outdir) ! self.volumead = str(self.volume.currentText()) ! self.aLanguage = str(self.aLang.currentText()) ! self.sLanguage = str(self.subTitles.currentText()) ! self.ripDVD() ! elif self.state is "ripping": ! print "* Ripping aborted" ! self.Dialogue.rippingXofY.setText("Waiting to start...") ! try: ! pid = self.pipe.pid ! os.kill(pid, 9) ! os.waitpid(pid, os.WNOHANG) ! except: ! pass ! os.popen("rm divx2pass.log 2>/dev/null") ! os.popen("rm " + self.outdir + "frameno.avi 2>/dev/null") ! self.Dialogue.b_changeState.setText("Start") ! self.Dialogue.b_closeProgressDialogue.setEnabled(1) ! if self.config['passes'] is 1: ! self.Dialogue.pm_audioPass.setProgress(-1) ! elif self.config['passes'] is 2: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! #elif self.config['passes'] == 0 or self.config['passes'] == 3: ! elif not self.config['passes'] or self.config['passes'] is 3: ! self.Dialogue.pm_audioPass.setProgress(-1) ! self.Dialogue.pm_videoPass1.setProgress(-1) ! self.Dialogue.pm_videoPass2.setProgress(-1) ! self.state = "stopped" ! os.chdir(self.cwd) ! def openSettingsDialogue(self): ! """Open the settings dialogue box, connecting slots to functions""" ! self.Dialogue = dialogSettings(self) ! # Set-up defauls from config file ! self.Dialogue.mplayer.setText(self.config['mplayer']) ! self.Dialogue.mencoder.setText(self.config['mencoder']) ! self.Dialogue.tcprobe.setText(self.config['tcprobe']) ! self.Dialogue.dvdDevice.setText(self.config['dvd_device']) ! self.Dialogue.outputDir.setText(self.config['outputdir']) ! self.Dialogue.deInterlacing.setCurrentItem(int(self.config['deinterlacing'])) ! self.Dialogue.aspectRatio.setCurrentItem(int(self.config['aspectratio'])) ! self.Dialogue.encoderPasses.setCurrentItem(int(self.config['passes'])) ! self.Dialogue.videoCodec.setCurrentItem(int(self.config['videocodec'])) ! if self.config['pdamode'] == 1: ! self.Dialogue.c_pdamode.setChecked(1) ! # Connect functions ! self.connect(self.Dialogue.b_browseMPlayer,SIGNAL("clicked()"),self.browseMPlayer) ! self.connect(self.Dialogue.b_browseMencoder,SIGNAL("clicked()"),self.browseMencoder) ! self.connect(self.Dialogue.b_browseTcprobe,SIGNAL("clicked()"),self.browseTcprobe) ! self.connect(self.Dialogue.b_browseDVD,SIGNAL("clicked()"),self.browseDVD) ! self.connect(self.Dialogue.b_selectOutputDir,SIGNAL("clicked()"),self.selectOutDir) ! self.connect(self.Dialogue.b_OK,SIGNAL("clicked()"),self.changeSettings) ! self.connect(self.Dialogue.b_Save,SIGNAL("clicked()"),self.saveSettings) ! self.Dialogue.exec_loop() ! def browseMPlayer(self): ! """Launch file dialogue and set path to MPlayer""" ! self.path = re.compile('(/.*)/.*').search(self.config['mplayer']).group(1) ! mplayer = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to MPlayer") ! self.Dialogue.mplayer.setText(str(mplayer)) ! def browseMencoder(self): ! """Launch file dialogue and set path to Mencoder""" ! self.path = re.compile('(/.*)/.*').search(self.config['mencoder']).group(1) ! mencoder = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Mencoder") ! self.Dialogue.mencoder.setText(str(mencoder)) ! def browseTcprobe(self): ! """Launch file dialogue and set path to Tcprobe""" ! self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to Tcprobe") ! self.Dialogue.tcprobe.setText(str(tcprobe)) ! def browseDVD(self): ! """Launch file dialogue and set path to dvd device""" ! try: ! self.path = re.compile('(/.*)/.*').search(self.config['dvd_device']).group(1) ! except: ! self.path = os.path.join("/", "dev", "dvd") ! dvd_device = QFileDialog.getOpenFileName( ! self.path, \ ! "*", \ ! self, \ ! "open file dialog", \ ! "Choose path to DVD Device") ! self.Dialogue.dvdDevice.setText(str(dvd_device)) ! def selectOutDir(self): ! """Launch file dialogue and set output directory""" ! directory = QFileDialog.getExistingDirectory(self.config['outputdir'], \ ! self, \ ! "get existing directory", \ ! "Choose a directory", \ ! 1 ) ! self.Dialogue.outputDir.setText(str(directory)) ! def changeSettings(self): ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.Dialogue.accept() ! def saveSettings(self): ! print "* Saving new settings to ~/.quickriprc" ! self.config['mplayer'] = self.Dialogue.mplayer.text() ! self.config['mencoder'] = self.Dialogue.mencoder.text() ! self.config['tcprobe'] = self.Dialogue.tcprobe.text() ! self.config['dvd_device'] = self.Dialogue.dvdDevice.text() ! self.config['outputdir'] = self.Dialogue.outputDir.text() ! self.config['deinterlacing'] = self.Dialogue.deInterlacing.currentItem() ! self.config['aspectratio'] = self.Dialogue.aspectRatio.currentItem() ! self.config['passes'] = self.Dialogue.encoderPasses.currentItem() ! self.config['videocodec'] = self.Dialogue.videoCodec.currentItem() ! if self.Dialogue.c_pdamode.isChecked(): ! self.config['pdamode'] = 1 ! else: ! self.config['pdamode'] = 0 ! self.parser.set('paths', 'mplayer', self.config['mplayer']) ! self.parser.set('paths', 'mencoder', self.config['mencoder']) ! self.parser.set('paths', 'tcprobe', self.config['tcprobe']) ! self.parser.set('paths', 'dvd_device', self.config['dvd_device']) ! self.parser.set('paths', 'outputdir', self.config['outputdir']) ! self.parser.set('mencoder', 'deinterlacing', self.config['deinterlacing']) ! self.parser.set('mencoder', 'aspectratio', self.config['aspectratio']) ! self.parser.set('mencoder', 'passes', self.config['passes']) ! self.parser.set('mencoder', 'pdamode', self.config['pdamode']) ! self.parser.set('mencoder', 'videocodec', self.config['videocodec']) ! self.parser.write(open(self.configfile, 'w')) def main(): ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! app = QApplication(sys.argv) ! QObject.connect(app, SIGNAL('lastWindowClosed()'), ! app, SLOT('quit()')) ! win = GUI(app) ! app.setMainWidget(win) ! win.show() ! app.exec_loop() Index: quickrip.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/quickrip.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** quickrip.py 9 May 2003 15:49:37 -0000 1.7 --- quickrip.py 30 Jul 2003 11:07:11 -0000 1.8 *************** *** 39,43 **** def main(argv): try: ! opts, args = getopt.getopt(argv, "hca", ["help", "cli", "autoresize"]) except getopt.GetoptError: usage() --- 39,43 ---- def main(argv): try: ! opts, args = getopt.getopt(argv, "hgca", ["help", "gtk", "cli", "autoresize"]) except getopt.GetoptError: usage() *************** *** 47,50 **** --- 47,54 ---- usage() sys.exit() + elif opt in ("-g", "--gtk"): + sys.path.append("gtk") + import gtkmain + gtkmain.main() elif opt in ("-c", "--cli"): import cli |
From: <te...@us...> - 2003-07-30 11:07:16
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv18058/testing Modified Files: guimain-hig-tom.ui Log Message: Various tweaks here and there, and the addition of the Gtk files to CVS Index: guimain-hig-tom.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig-tom.ui,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** guimain-hig-tom.ui 29 Jul 2003 01:24:07 -0000 1.1 --- guimain-hig-tom.ui 30 Jul 2003 11:07:11 -0000 1.2 *************** *** 1,7 **** <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> ! <class>Form1</class> <widget class="QDialog"> <property name="name"> ! <cstring>Form1</cstring> </property> <property name="geometry"> --- 1,7 ---- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> ! <class>MainWindow</class> <widget class="QDialog"> <property name="name"> ! <cstring>MainWindow</cstring> </property> <property name="geometry"> *************** *** 14,18 **** </property> <property name="caption"> ! <string>Form1</string> </property> <grid> --- 14,18 ---- </property> <property name="caption"> ! <string>QuickRip</string> </property> <grid> *************** *** 22,26 **** <widget class="QGroupBox" row="1" column="0"> <property name="name"> ! <cstring>groupBox1</cstring> </property> <property name="title"> --- 22,26 ---- <widget class="QGroupBox" row="1" column="0"> <property name="name"> ! <cstring>g_trackSettings</cstring> </property> <property name="title"> *************** *** 33,37 **** <widget class="QLabel" row="0" column="0"> <property name="name"> ! <cstring>textLabel1_4</cstring> </property> <property name="sizePolicy"> --- 33,37 ---- <widget class="QLabel" row="0" column="0"> <property name="name"> ! <cstring>g_filesize</cstring> </property> <property name="sizePolicy"> *************** *** 103,107 **** <widget class="QLabel" row="1" column="0"> <property name="name"> ! <cstring>textLabel4_2</cstring> </property> <property name="sizePolicy"> --- 103,107 ---- <widget class="QLabel" row="1" column="0"> <property name="name"> ! <cstring>g_bitrate</cstring> </property> <property name="sizePolicy"> *************** *** 120,126 **** </property> </widget> ! <widget class="QLayoutWidget" row="1" column="2"> <property name="name"> ! <cstring>layout12</cstring> </property> <hbox> --- 120,126 ---- </property> </widget> ! <widget class="QLayoutWidget" row="1" column="2" rowspan="1" colspan="2"> <property name="name"> ! <cstring>g_slider</cstring> </property> <hbox> *************** *** 130,134 **** <widget class="QLabel"> <property name="name"> ! <cstring>textLabel3_3_2</cstring> </property> <property name="sizePolicy"> --- 130,134 ---- <widget class="QLabel"> <property name="name"> ! <cstring>g_low</cstring> </property> <property name="sizePolicy"> *************** *** 184,188 **** <widget class="QLabel"> <property name="name"> ! <cstring>textLabel3_3_2_2</cstring> </property> <property name="sizePolicy"> --- 184,188 ---- <widget class="QLabel"> <property name="name"> ! <cstring>g_high</cstring> </property> <property name="sizePolicy"> *************** *** 205,212 **** <widget class="QLabel" row="0" column="2"> <property name="name"> ! <cstring>textLabel1</cstring> </property> <property name="text"> ! <string>maybe something else here</string> </property> </widget> --- 205,217 ---- <widget class="QLabel" row="0" column="2"> <property name="name"> ! <cstring>g_trackName</cstring> </property> <property name="text"> ! <string>Name:</string> ! </property> ! </widget> ! <widget class="QLineEdit" row="0" column="3"> ! <property name="name"> ! <cstring>trackName</cstring> </property> </widget> *************** *** 270,274 **** </column> <property name="name"> ! <cstring>listView1</cstring> </property> <property name="enabled"> --- 275,279 ---- </column> <property name="name"> ! <cstring>dvdTracks</cstring> </property> <property name="enabled"> *************** *** 278,282 **** <widget class="QLayoutWidget" row="2" column="0"> <property name="name"> ! <cstring>layout27</cstring> </property> <hbox> --- 283,287 ---- <widget class="QLayoutWidget" row="2" column="0"> <property name="name"> ! <cstring>g_buttons</cstring> </property> <hbox> *************** *** 286,295 **** <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton3</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> - <bold>1</bold> </font> </property> --- 291,299 ---- <widget class="QPushButton"> <property name="name"> ! <cstring>b_quit</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> </font> </property> *************** *** 323,336 **** <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton1</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> - <bold>1</bold> </font> </property> <property name="text"> ! <string>Preferences</string> </property> <property name="iconSet"> --- 327,339 ---- <widget class="QPushButton"> <property name="name"> ! <cstring>b_configure</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> </font> </property> <property name="text"> ! <string>Configure</string> </property> <property name="iconSet"> *************** *** 360,369 **** <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton4</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> - <bold>1</bold> </font> </property> --- 363,371 ---- <widget class="QPushButton"> <property name="name"> ! <cstring>b_scanDVD</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> </font> </property> *************** *** 380,384 **** <widget class="QPushButton"> <property name="name"> ! <cstring>pushButton2</cstring> </property> <property name="enabled"> --- 382,386 ---- <widget class="QPushButton"> <property name="name"> ! <cstring>b_ripDVD</cstring> </property> <property name="enabled"> *************** *** 388,392 **** <font> <pointsize>12</pointsize> - <bold>1</bold> </font> </property> --- 390,393 ---- *************** *** 419,422 **** --- 420,431 ---- </image> </images> + <connections> + <connection> + <sender>b_quit</sender> + <signal>clicked()</signal> + <receiver>MainWindow</receiver> + <slot>accept()</slot> + </connection> + </connections> <layoutdefaults spacing="6" margin="11"/> </UI> |
From: <te...@us...> - 2003-07-30 10:37:15
|
Update of /cvsroot/quickrip/quickrip/gtk In directory sc8-pr-cvs1:/tmp/cvs-serv13301/gtk Log Message: Directory /cvsroot/quickrip/quickrip/gtk added to the repository |
From: <je...@us...> - 2003-07-29 23:26:37
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv3558 Modified Files: guimain-hig.ui guisettings-hig.ui Log Message: Arranged guisettings layout better. guimain now `looks better' (``eye candy''). Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** guimain-hig.ui 29 Jul 2003 22:22:21 -0000 1.3 --- guimain-hig.ui 29 Jul 2003 23:24:33 -0000 1.4 *************** *** 10,14 **** <y>0</y> <width>570</width> ! <height>519</height> </rect> </property> --- 10,14 ---- <y>0</y> <width>570</width> ! <height>542</height> </rect> [...1147 lines suppressed...] </connection> </connections> <tabstops> <tabstop>pushButton4</tabstop> <tabstop>pushButton2</tabstop> <tabstop>pushButton1</tabstop> <tabstop>pushButton3</tabstop> + <tabstop>listView1</tabstop> + <tabstop>comboBox5_2</tabstop> + <tabstop>checkBox1</tabstop> + <tabstop>comboBox6_2</tabstop> + <tabstop>comboBox6</tabstop> + <tabstop>pushButton9</tabstop> + <tabstop>comboBox5</tabstop> + <tabstop>spinBox3</tabstop> + <tabstop>checkBox2</tabstop> + <tabstop>comboBox7</tabstop> + <tabstop>comboBox8</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> Index: guisettings-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guisettings-hig.ui,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** guisettings-hig.ui 29 Jul 2003 01:04:18 -0000 1.1 --- guisettings-hig.ui 29 Jul 2003 23:24:34 -0000 1.2 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>766</width> ! <height>475</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>757</width> [...3474 lines suppressed...] </grid> *************** *** 2128,2131 **** --- 1455,1470 ---- <receiver>prefsWidgetStack</receiver> <slot>raiseWidget(int)</slot> + </connection> + <connection> + <sender>videoBitRateSlider_4_2_2</sender> + <signal>sliderMoved(int)</signal> + <receiver>videoBitRate_4</receiver> + <slot>setValue(int)</slot> + </connection> + <connection> + <sender>videoBitRate_4</sender> + <signal>valueChanged(int)</signal> + <receiver>videoBitRateSlider_4_2_2</receiver> + <slot>setValue(int)</slot> </connection> </connections> |
From: <je...@us...> - 2003-07-29 22:24:26
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv24075/testing Modified Files: guimain-hig.ui Log Message: A better guimain. Took the idea of removing the logo from Tom's guimain. Feedback is requested. Initially, all controls but `Preferences', `Scan DVD', and `Quit', are disabled. A successful DVD scan enables the QListView at the lefthand side. Once the user chooses a track to rip (say he chooses track #2), the righthand side part of the GUI (everything below `Current track name') will be enabled (yeah, all but the `Advanced options' part). The user can rename track names. When there's at least ONE track to rip, the `Rip DVD' (shall we rename it to just `Rip'?) will be enabled. When the user presses `Rip DVD' (given everything is in a `safe state'), the ripping process starts WITHOUT asking the user again for input. The ripping progress dialog shall have only one button: `Cancel Rip' (or `Cancel'?). Shall we make this progress dialog modal? Alright, again, please feed back... [I've always strived to follow the GNOME HIG, which promote, among others, simplicity. Also, I'm always imagining my mother using QuickRip... ;-)] Feed back! ;-) Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** guimain-hig.ui 29 Jul 2003 01:24:07 -0000 1.2 --- guimain-hig.ui 29 Jul 2003 22:22:21 -0000 1.3 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>613</width> ! <height>549</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>570</width> [...1122 lines suppressed...] + </connection> + <connection> + <sender>checkBox2</sender> + <signal>toggled(bool)</signal> + <receiver>comboBox8</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>checkBox2</sender> + <signal>toggled(bool)</signal> + <receiver>textLabel11</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>comboBox5</sender> + <signal>activated(int)</signal> + <receiver>spinBox3</receiver> + <slot>setValue(int)</slot> </connection> </connections> |