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: <te...@us...> - 2003-07-29 01:26:20
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv14662/testing Modified Files: guimain-hig.ui Added Files: guimain-hig-tom.ui Log Message: Committing my amended version --- NEW FILE: guimain-hig-tom.ui --- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>Form1</class> <widget class="QDialog"> <property name="name"> <cstring>Form1</cstring> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>590</width> <height>464</height> </rect> </property> <property name="caption"> <string>Form1</string> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QGroupBox" row="1" column="0"> <property name="name"> <cstring>groupBox1</cstring> </property> <property name="title"> <string>T&rack Settings</string> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>textLabel1_4</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&Target file size:</string> </property> <property name="buddy" stdset="0"> <cstring>fileSize</cstring> </property> </widget> <widget class="QSpinBox" row="0" column="1"> <property name="name"> <cstring>fileSize</cstring> </property> <property name="suffix"> <string> MB</string> </property> <property name="maxValue"> <number>5000</number> </property> <property name="minValue"> <number>1</number> </property> <property name="lineStep"> <number>5</number> </property> <property name="value"> <number>680</number> </property> <property name="toolTip" stdset="0"> <string></string> </property> </widget> <widget class="QSpinBox" row="1" column="1"> <property name="name"> <cstring>videoBitRate</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>1</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="suffix"> <string> kbps</string> </property> <property name="maxValue"> <number>10000</number> </property> <property name="minValue"> <number>100</number> </property> <property name="lineStep"> <number>5</number> </property> <property name="value"> <number>700</number> </property> </widget> <widget class="QLabel" row="1" column="0"> <property name="name"> <cstring>textLabel4_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>5</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&Video bitrate:</string> </property> <property name="buddy" stdset="0"> <cstring>videoBitRate</cstring> </property> </widget> <widget class="QLayoutWidget" row="1" column="2"> <property name="name"> <cstring>layout12</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel"> <property name="name"> <cstring>textLabel3_3_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>L&ow</string> </property> <property name="buddy" stdset="0"> <cstring>videoBitRate</cstring> </property> </widget> <widget class="QSlider"> <property name="name"> <cstring>videoBitRateSlider</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="minValue"> <number>300</number> </property> <property name="maxValue"> <number>2000</number> </property> <property name="lineStep"> <number>50</number> </property> <property name="pageStep"> <number>50</number> </property> <property name="value"> <number>700</number> </property> <property name="orientation"> <enum>Horizontal</enum> </property> <property name="tickmarks"> <enum>NoMarks</enum> </property> <property name="tickInterval"> <number>200</number> </property> <property name="toolTip" stdset="0"> <string>Indicates the quality of the video (bitrate)</string> </property> </widget> <widget class="QLabel"> <property name="name"> <cstring>textLabel3_3_2_2</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>&High</string> </property> <property name="buddy" stdset="0"> <cstring>videoBitRateSlider</cstring> </property> </widget> </hbox> </widget> <widget class="QLabel" row="0" column="2"> <property name="name"> <cstring>textLabel1</cstring> </property> <property name="text"> <string>maybe something else here</string> </property> </widget> </grid> </widget> <widget class="QListView" row="0" column="0"> <column> <property name="text"> <string>Track</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Duration</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Audio</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Subtitles</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Rip?</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <property name="name"> <cstring>listView1</cstring> </property> <property name="enabled"> <bool>false</bool> </property> </widget> <widget class="QLayoutWidget" row="2" column="0"> <property name="name"> <cstring>layout27</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QPushButton"> <property name="name"> <cstring>pushButton3</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> <bold>1</bold> </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>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"> <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>pushButton4</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> <bold>1</bold> </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>pushButton2</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="font"> <font> <pointsize>12</pointsize> <bold>1</bold> </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> </widget> <images> <image name="image0"> <data format="XPM.GZ" length="1917">789c5dd5d96eda401406e0fb3c05cab98baa13dbd8c656d58b84ec2b900da87a318c6db60059205bd577eff19cdf56d54c50f8fc9f593cb626bb3b8d7ee7b2b1b3bbf5ba36eba96dd8897969ec649bc5e2f3e7af1fbfb7b6fdb821bf89df08b6bf6d6d77d70ddbb85a2df3123c16506a7dcff39c4d691356a6291c22a7da89cb2d9c209fd47639b7608bfa55655feb3d75e0c1b77008bfd6d6f1ce9d6d90c0056c03adcfd54d0fcee010b67012a4cee566d0286c5a8c775019f9481d7a4ddf79e39c451ef2373845fe0e67f0873af69b5aff55da46711a6a7e58db38dfc319f2bdda9acfd42d1fde8723f8a272e41e36cfe1143e8533d877ceeafa47b8ca17b575fca53af1e1151cc1c3cab1f67f8253e4bdca9a53565bf36738438ef5a43ef21b38823f4bcbf6fbada6f3195ce5319c226fc3999ab8f6c8e591daf86a1a574eb4ff0b1ca1ffa432f2d03997f9b43fa9ebfe57b5359fc346cd099ca7a1cb97ea51a0e6291cc377a5f3d818f85a5dd5535edbba7c00c76a5aa8ad316af7bee7b90dd4dc87e3918eff50ba886d3eca9c4fd459001fc1b18d9c2f9d0bb1cbc9c079e6722ad4790ccf6aebf9d481f33c760ed44500376b6b7d0ac770173685d61fc3f2a38721131b1eb19596b9964b2be4ef9827ddb59e79924d79c6737ee4052fa5ada43df133bff02b4ff4dc948a356ff88ddff9833fa57df19ef4d9975e6dd677f140fa6f243fe4233e463b91d1e67cca677caee7135fc818872ebbe42bbee68e7ceb724fea6ef816358f324a39c61ddff303f7a5cf40f4c0431907e79eacd47763dccb2a3a1cb8599a72a5f74fcd52d679cca15b6720ed54aef4e54ac431b7feabd99759ca9aa5cc52d624725f5a93cb6e2cddbd5cc82c81cc32945952b91213637fca9abdf25e88f8948cacb5472391918a88f45d2b644f679495f72ed7731e50e1be138d694253ace7c9ed694fc6c01ed24c2a98e652a3e38ce5b9ccddbd0ce951767050ae43c698d342ae8ef5ff943cb9b6ecc48d7ccee46edb6e1d132a9f86a115de8d893cd773be654f5a4b9acc40539af29856f26efcf9bef517d333b338</data> </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="1115">789c5dd24b6fe2301007f03b9f22c23754d1c47934d16a0fa5a5055a287d6aa5550f8eed04308f349016badaefbe991987ddae93437eff8927d628a71de7c774ec744e5bdb9dd8cda52367a2743aaa5aad0e3f5fbfff6ab5bdc8a9efd075bcf649abdd75a433d9ac353cb3fa99b9b880d7c8d8956e0cfc047aae1778581d23e3fa425e1c892f0b4b497c077297bbc40a99f098e3de17a0eff92e4f801299f8d2c713de03032f087caca64811c40156b7c090876e208097c0484449887c6a1871e08da522ee8067fe59489c21d39ab8f7d132213e5b2ae20898c8248c7d601f288244c5297045145e12003f905284c489a5200e8069907281bc42aa54100f4019a65a48e002a9a448b1da03aa506aa23952013744c5896f48dd706f1911870d65082c2c057109d451c3d25213b323b1554ed49ca891baa1b28c88734ba1b0d503308bb426de21b38c2bfc45d79611f1dc5210a70d7504bcb5cc88ddffd63f1913a964ec6ba6749667b33ab519d4e78bc5c22c574dc666eb3adb14c59b29b70c33b62b156caede3ff69b0366ec3337c5397660cb9ebac0ecb2e8155b86df2e16aac2acbf37571455a529af315bedcd8032530e47d4efa6de5b31765ba7f3525036cecda6980cf2bb6e777a6fcfc766a5e919631ee8f0f6cc8fba1816baff65066cfc347a7ec109fc9d0183d5cceaf7b7d61f382f000b</data> </image> </images> <layoutdefaults spacing="6" margin="11"/> </UI> Index: guimain-hig.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/testing/guimain-hig.ui,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** guimain-hig.ui 29 Jul 2003 01:04:18 -0000 1.1 --- guimain-hig.ui 29 Jul 2003 01:24:07 -0000 1.2 *************** *** 9,13 **** <x>0</x> <y>0</y> ! <width>570</width> <height>549</height> </rect> --- 9,13 ---- <x>0</x> <y>0</y> ! <width>613</width> <height>549</height> </rect> *************** *** 332,336 **** </property> <property name="text"> ! <string>Preferences</string> </property> <property name="iconSet"> --- 332,336 ---- </property> <property name="text"> ! <string>Configure</string> </property> <property name="iconSet"> *************** *** 429,445 **** <images> <image name="image0"> ! <data format="XPM.GZ" length="2061">789c7dd5db52e3381006e07b9e2245df515b3df149b66b6b2fe67c84813932b3b5173a9904480224213053fbeedbfe5b3150b3bb1129f84abf65b92599477ba3e3c3fdd1dea39de5caaea67ee427f66ab417d6b3d9ed9f7ffdf17367373323f969c7a37cf7b79ddda3d5c88f0e16f3d8834940637ce00067835fc379dfe031eca539f84defacce4c56f6265c9f35599b197805dbadf93deca435e8f7709466d16fe14eace33feb9d97799e75f053b89556e17a86ad34988f61b7ede78fc936d7f9dcf42ecaa2c803fa71ff2216bed0fed3de655d5685decfc1ae6c4b7dfea3de5559e5650bdfc29558e77fd8db78632b5c4f6b38186b32f437709484d6f747efdad4a5a9e129dcd4c6607c3a83dbba36189f16b0ad1b83fad0068eb5373adfba77dbb465a3f5b986dbb66af4f996bdedb80d8d47fe135cb45da3d7676a49e8fc2e6063a5a0f073d8d9bad5f14ee0609b56e75ff476b5145cafff0a3bd758ec0f7ed5dbe72e58add7391cbd75ba5e33b81b7c3658f7cf8764977cd03b8cbd77b83fe1fa906dcd657274d86ffc05ce7d48ce93b7fddf07ebfacee1c277c99bc13a7fd433989039ade7cbe43c19f50f4d289c9eb7cf701b2aa7f57e01dbc126d978d48f2e6137b883832c1ff6135d25b75ed707e72d447101b783b5feefe02ed8e475b24bc6fe8a63b1d6ff1b9c05af26ac57cc43f05aff2a397aad3fce4b2cc4da7f3358d703fb2596a1f35aef095cc5b1d7fabe1dacfb3dc275cc93b11f63230756df0fdd60adf7e3e432f9096c63e5f5bcc764a326bc6fa28f4dd0fd8a7ac618dba0e7f534d9aa09fb415e4f3ee8fb0ef397c35304dd0f58afce7655d0fbefc3b16b83be0fa65b475d4fbc7f3bf9c4525fceffdf7ecd30b165c79e03d37f6622777cc213f94e254ff7336af97dca677cce339ef3822fee672431e54bfc75c54b5ef19aaf79c3377ccba41949fc103f4e233ee1a7fc8c9ff30b7ec9aff8b5fe9fe137fc56c67ec7fb77f795b6e003c9bf4f9943e93f90efd1f659905bf307c97c4c994ffc99bff0d7078963fec6df6506e394c9249373f1205372c5866b9db3b8c1bd5ae27e1e949264c991df66285094392fa9a313196d421364a6747a571f499dd139cf692633c87943f3fb55bdab212de882d7744957dcd1f2dfd754522b5ad3356de8663bc2af6b9a2af7a01f99bf7fdff9070eb8ec87</data> </image> <image name="image1"> ! <data format="XPM.GZ" length="8366">789ce597596f1cbb1185dffd2b04d79b11f04eefdd08f2a05db6164bb625590af250ec45d2689746cb28c87f4fcd290e35fb8c9d9bbc446dc0f89a6c1eb2eab0c8f9e3d3d2cffddda54f7f7c78ec70e7a25c2acff961e953f5747dddfdfb3ffef6cf0f1fe37c49fe85616b29fcf8970f1f0f3a4be5d2deed4ddd034302d4c25f8f6d090ee4019b6dc7612b00b7c0612b6e45e01b70daca5a698ff907386be5ad0ced3a5eeedb2b70216f945330cb9b027c062ee5b1f89ec1559fe9115cf7de80bf821b792a7cffea19ebe3a6c741184401e64fd00b92200e100c63c1a9bcc17ae827380fb220413cdec0569e1ce31d80eba00a305fb3dae350fe02d5bff4acfaa7e0288c8206fd0b70ecf9a4cf21e24ddf1cc7aebdeab3b61bcc2fcce4c1fcedbd67cdc73e38efb36d83ebb00a19f331e0461e30617e514b18eba165701aa5a1ce1ff98d4a79100f13802b61e457aca65c45c8a7c5f851d36746fec42c4da4f1433ce340de28239f712c01d07cc33f711ac711f4e9185cc536d6f5348ecb3806df816b61cc8fe1cfb8911eca2f3d4ec2a415eb7c11ef244ac258f52f1c47b1faef162c7fb1fa6d179c09c36f1c83eba44c107fca7b2cf66912d543fcd3348d138c6faec1599a241adfc033c6b7f04b9aa7a9e32ed8a645023fd11ab84a6da2f1c07ab220ad53f5ebb3e3c631e29ba5599cea7a37c17996a6aa1f8239cb535d1fd69b9519a7aa77e3197a16f9cd6a7903ff31ea816ce73a853f790b1ccb1be4c3d48e436586ff7291cb301f423c72cee51518f9cbeb9c33dd3fdf1ddb0cf136985f911441aefb35761ce5eaf7049c1671aefa5f3c231fd401e7858418e3239f051759aefa9fc16551285bec370e8a3a87be857f392c9a5ce7877ac6b1f4d078603f73c9a2003ef6acf1c7fab86211c078a84fb6c565a1f13f775c17bade1570c095e32b706c6546180ffeb1899519613cec1f2bf660ad1fd87f3617567fc2dfb61046bc18f5438aa9659dcfad67f5c73a38b035a33e58d4c732b40deb7cb1de32296586985fe338649d1ff251a665c4ea0fc4b7cccbd8eafc90dfd2969955bf6e804b0987e653b92ed96abdd9746c1d1f821b61c4db3c3b2e1da33ecbe1e098f63deb79f4e4b852b6886f15f8fe278e5dbb79f1ac7e693bae950df25b85be7ddbb16be73dc78dd5fa128123ff7dc7b16ba755e5aa65117f03bf56719fed8b67ad97f053955481e353c7a132c1af552aac7e427eabac8aace60ff5a0cafbcc4f8e63d77ee938b17a5fc0795b15d2aefebb70dc6f7ff4ace7d791e3549950df2bf61cf7b9d4fb87c6c30ae3bce6cc71a6edb4e959ef23a8975559e5ca74e659ebc537c78532dd7b56ff61bf5755bfdde8f7b56fb78e59d96a7bd367b3e5d8965aefc8b3d69f96e3d231ea935c5f1c33e22fd789caf18667f523f6971cdfb5e3dab3d653ecb73aeab7f391e3a6547fc17f75ecf941b96e29f38e67bdcf607fd649bfddde78567f468e03655ef7acf70b5d5feadbad676d5ff3acfeec3a0eb59dc8b3b6c38f75d66f376dc7916b7ff5acf5fadcb3fa197eaa73b920e8fe78f3acf747f8ab2ee440d7fea82735d769a9f54bc7b3c2eaef77d6f6af8e3365d2f896c27a5eef79d6fedd3e577a7e5c3bceb5dd6a7eab3ad776b3ec59fd9e3a2e5cfbb167b4db6bc7b6d2fba1aea7f6fdef3deb7ed971cc8ee1e7ba11c6f77cef59cf8f55c76e7cbef2acfb03f993cbb7633a745c2a1b9c074dd0675a715c55ba7fb05f9bb0cff6c971edbebff0ace77dee59f717ea7f13f59911cf2669824af70bea5993c90555fd8cf937459354ea0fc4a3691a5b6bbc32c755adebcf1d37b59e476b9e753fad7856bf469ed50fec59fd72d4e706fa7ce859fdb8ec19fd0f3affdde7ff57c3d0b4e7cfd2181a958d35e57c9ddfd2a84c6d1a7366cecd85699b4b7365aecdcd74955fd6b83577e6de3c9847d3314fe6d9bc9857d3356f66d9ac98d5c93abfacb166d665ec8d91675314b7cc67f3c56c8fabfcb2c6ced8f8efcfaed9335fcdfea8ca748dc9d19da9b1610ecc37f3ddfc18fe769ac6b40cced1d83087e6c81c9b9f835f4fd6f05e3cf9658d5e6ebae6d4b46669f8f103139ae837347a11db33f1fb4a4635bc426252994ff65b1abdece7a698ad817fbbd27767548398acce954aaaa8a686ce64873c8fa96cd1f9640da770611ea88d9e631a3d15b34397746576e99a6ee896eee85e76fbe98846871ee8515506359c42879e9cc2440da7f43c58a5e8855ea91cce3c75e96db2062dd30aadfa9e533546eb2fad49743b432a8fb4ae6def1aaeef066dbef7a3ad591a23ebff4c5fcce0b7dbb433498376696fb01a497e67ac64784df45562bc3f14ad03fa36a8e1e6f29d7e0ce78e2c1dd2d1622ae2a5f6d0b77b743caa413f45f964b4365065cee974fa2937b092d64846de2818d308291aad0b145342e9ac9374ba0665948f691452cf465dfec466f669fdaec144db435fdf338f6ab01d59eb86e972b9b042c57628e7cf5c7333acc1677c3ed4a7b7da2e5f2ca620dfb7a91ef4aed4817ad8bbd2e792afa4fa0f69f035df2cb88a5b7a45857b9f5fc577c3fb5ca8e0fb510d93f2c3221afcc81d1e3ee50ff9995f4635f895bb63b1caf86dbec64187977985575d45d62f4b5eeb677228e7eba339e70dde5c24e7fad0d6c0ae8a786bb4b643e3b3dc9a8663b54efbf36e9a03317b3fbfd6f9cbf839088d6d1e3de50ecc03efcebf6d0e6bf01e7fe5fd291a07fc6dec7ed6919c7c1fd4e01f7c384b83f6f9888f27dd4bdc08cf63d1eaf9bccb3ff9844fc5dda7dce280b624f23be34a3d0d3ae190a369f72bcc311edf87bdefe8879c6a5b727a6dc9ffb1ab9b63555f343a92eb84d3591a52b3da9c8dad64f233a6c1879c73319eb7d1b3d61a3b7a662eac3110f3a9776a6db52c15fe659e829c5d3c25f363de9b74f7b156aad91c15b2f3f7cb640d17af5254a2d9115bf4a49fa6019dcad6e2e3f1fb9ff79a491739e727690ca834f6cc9edb8bb15db9496dda94fbc0866d2f56c766ff36b097f6ca5edb1bf1f3ae79915bc7abdc6edb26b5b7f66ef13a36ef378ee8dcdb07fb683bf6c93edb17fb6abbf66d91ea355f63d66ffd5f5398ff9bf33f1b7d318d3fe3f99f68fcebaf1ffe0d02e9c7e9</data> </image> <image name="image2"> ! <data format="XPM.GZ" length="1885">789c75d4c94e1c311006e03b4f31c2371415bdd0ddb6a21c202c098435614b948397360c30ac4358a2bc7baafff2344bc81402bef1afb6cbf6cceccce0606b7d30333b7533b6e3a11ff8637b3d9809b7a3d1c38f9f1f7e4f4de7f5807f1a3328a6df4d4d6f8f077eb07171de7620cb50a52e75a5e1b673652bdb18f873e7baa91b5d775604dbda6ac9d770a883f6f061e7266f721d913f81cba63439c637e0aaa90c16a3301f3fbe36253c82f9652a58c1a671a68187b063cbfc39ec1b9f9cc16dd31a8b7c8063efe3de0ef9ef9d75a6b3e40817ba30d81fe5e1726252c9a5417f6460ad6b8b7e681336da58f4431a76da59ec1f5570d4d1cafece753695a9accc770673c3569e7f005b639d3c7f1f8e263a398fa3ce36b7b993fef7603e4027fdac27d70ee7a31cacad7601e35f606b9d93f93ec18edf103770b4d14b3f1f3bbb8c3d07af885d2656a770ee722fe787fd74852b9271df5ce52a2febbd876b577bd98f35980f38b98479033dce8f0ad838e3a5bf5fb077decbfddbedec739f05b96f57c979f225dcf82a603d749bdc245fc0fcc020eb5be82df39f27fbe465985f293fee2de3b8cf3e862cc8fab03f21e377c437e27e1c9f97c0ab6b33781ed641b772fe4bc92619f725987e7c983c19c77d0f2eb856ee1f3e0f21f47e4c0ec9b84f2186d84a3fb8ff6dd6fb4ecc25fe06e75c725eb85f6dc125fe0a975c725e3b70c525fd6ec39a4beee3166c5b1ba5ff5538b4214a3f8b9d63ce25e7f500175ce26bb8e4aae5cb4e8ad4a426ef48bdc858725c9e02b5d4fe2713397544c734a4133a7d4a3dcfa4d419274674fe32f37c059c52fc8c0bbaa4ab492a65ae2729feff86c674cb895fff64eeba1412172971ff2af3408f348fc4429ff8f82ab3484be865b94facd0a71799489f69f5d93ad638f185d6694352d23b77bc495bb44d3bf495be717a97f6689f0ee8b04ba54cb72f967f7fa78c72fe5b50c98939aaa8a6f6690f534e2ae3f91a4e68328a5eeef3535a296595e38457e1ad4c4ab52aaa2375ac866f6752ea449daa33359afef37eea2f9ee6cca8</data> </image> <image name="image3"> ! <data format="XPM.GZ" length="2558">789c7d95476f1c471085effc150bd58d304a333b19860f0c12c59ca3e14347c65d663108feefee7955bb2229436c82e4b7af7abac2ebe1e7d9c1d1d6fa60f6f3ccfd83793877037766ee06b3fe71347af9fb9fbf7ecc7ccaeb41ff3dcc07c34f7fcc7cda7e18b8c1c6f538f4404b0928c317f85bcfc36618ca0ebc09b64555097fedb9688b58c79e79088e65d114d05dcf6555daa605432f5dd5b6169c817d55b7727e0e0e95eb4a3c0fcfaff2aa693df417e5aeadc137e050575d0edeebb92e6ad3213f6ec169bbabc0cf3d374d9b59e4c3a6e736eb8a807c791b6cbadcca7e123659141de77585c97c035e0497c647c967035c75cea1b97c266c5249d04fc0adc99d03df83adcda3c4a3bf26b35544fd740cce8df38867f4c794267a9cc799b035d18071be69ad93fdbc05366e18311f8a606bbdea857290fa08fd30ce655acf2ed8dba197fc4e845daef9ed4f59e6df81a3ad253fba5036017e62f8c166364699d783b02ba3cce70a9cbb42f9085c581fd06f9a137695d6fb055cb94cfacb8d7215a5bf6370e35aad2780dbc492ffa972273aef803b67f4fc126c12cb7ef8c1da894eb7c2bed3fa312feb9c8de20f0ff6ae0bf02f4bbdc1a95ff8b06797b92688df4e95bb28f7ef55d8373a3f3ccf0d7dab7c072e7d1ee5feac816b5fcaf9b4a5acfb19f3778d8b01fda30361affe60ccdbb569bfdc0fd497b2af54afc0c6d7a2d325d8ba10a49f23b04bf9c9fe5ab9d3792c2b3bcd9fc1d1278b80adf244c7fdf17962e8bc241c4ad5afc1c330c9df2a4ff27d51ae351ef7db173e483e8cfa7d999e2ff35905573e6a3e8fe0da7bf503de87be09b9d60f7ffad6eb7d22f8d177deeabce1379fdcaf7edf51d6fc08f34fd199f899cec12e14324f9e70d47ae07fefd37ec9ef5979325fe94748fd90fb86f9f89874a9177e097950bfd213b80c46f53d65ab8cfa439558cec3fb2ed489a53ef83351a60cff059f58fcbf008eb1d0fcf0be48eaa4feefe074fbf53e3f294ffc8df741529519fe4964b43f2365abf1f3ca13ff609eb19bc6af8393fd5517f669c9fd5998b29c77a13c895f0187a97eaf1cb5fef9298b2ef5c5c97e5e518e9acf78ca51fe19ff7ebd8f6162f3bb18b6ecd873e0c8a77cf67f317cce177cc9573ce2715ad77cf331866ff92e29f7fcc08ffc1d514ffcfc21e6059f8ff995e7d2cf795ee045fec25fdfc52cf1375ee695b456798dd7798337798bb7dfc558dee15ddee37d3ee0433ee2633ee18c731ebe3babe0922baeb9e1963b62223264c9fd8c214f81229dd2199dd3055dd2158d684cd774f326e696eee89e1e52b6637aa4beb2157aa2677a79db1f7aa5399aa785a48e6851aaa42ff4f5cd7396e81b2de3f3155aa5355ac7df1b3feb4a11fddaa42dec9fa76dda4911bbb4f74b4cbff6e9800ee9888ee984b25f67dac7e0774ec30f73fff7cf99ff00e63c733a</data> </image> <image name="image4"> ! <data format="XPM.GZ" length="2942">789c3d96c95224390c86ef3c4545ebd631a1cecdb9c4c41c8066df1be80626e6e0b4d35040155014343031ef3e2afda2020ef5a594b2f45b96f3dbd7d1c5f1c1e8ebb795e7b99f8fc328dcf8d9e86b7c994cdefffee7af7f57bee4f568f15fb951f1e58f952f27f351181d3e4c8705f0bd007529cf32b7603f36cec1ec17ecb34ff613e322cbd57ebc64d81f94f3bcc94ab5d392db0553a55c08c3df1b77603a5f72a37c60dc679dc6c3fa55eeb3a0bcbae4a8fe5bca2e8fb0d38771cab45e3ffde43c53fb0c5ce4c677ca4d51e62a1679e32a473d1fc64daef570a1dc167d8efc6e957d31141a8f554f1f241cf866c91a9fef8cab42f524b764d8af978cf593b12bb03f517928db02eb0fca49ecb57230feb49f2cb8cfca5424e55e39afb212f9ad2b17e560f59d2ab7ae28a0f777e3b240ff6c2877ae2dd10f67cabd1b4add3fde540e2e94c847f7a78f755622feee824356f795d6479a6f28ea58c17fcf78a8d03fbaffa16cf2caab5dfb2554f23eeadb07cb86f5ea3f37ae2aed0f3e307695e64f8db26bea4af5a064dc38e8a1fd1c6a590ff51f1a770efb7165dcbb4ab9546ee47dd81f8d3bd8fdfd92d1ff37c6b2a4fa67c60398e0df4a3cc47f320ec63f968cf767c683835eafe03677aa17b171e1500ff4e9c4aefad1bab1ab711ec6c6758dfd7d56f6e28ffdbb5c32f47d356e109f768cdb1ae7e9d1b8aba1cf6f63efb01f3f978cfdd8560e121ffdf662ecac9edad8fcb9538eb21ee2bf290f6d02d32fe5d4f6b5beefd16fa9930e533b195735fa295f70cc84a1e793715363dee8798f79e76af4dbbb71dfa05eedff5874b1413f6b3db1ecf206f9ec19770df6efc878b0f7b59e5809438f33b0cf1be8adfa46d795884fa7c69ffe05d8172df4783776f0f7bd718df549cf4f6cbad4a01fdec03e433c7f6bec5acdcfd39231bf4be3da58fb25b6521ff45935ee1be80d7d3b9fc3df27e3b6557faffd1abdef5ae8ade72ff6520ffcefc0723d605eeafc8c41ecd8af0de3d0e13caf81655cc05fef83187b5150e3e93c1d7219e7883f18bb0efda67a0d85efe14f17e0be849db51f8752f2819e97c6ae43fd3acf07278cfbc8581a187ae87c1eba9079e8afe76308c1f5b81f74fe0e31343dfa03f90da1ee918fce939405914859efe79487d4e33c6a7da91046ff68fea98c598ff3a3e72f35b10ab85ff4be4e6d6c02f4d47993ba3844cc07edd7e4638ac84fe7610a4315b1ffad721c9a087d74dea634a401f62958ae67f4efcb92a1df9a716efc605c0cc867d7d80d9867adb15c796acf8c53c279feb564adf764cec49e7b0e1c79e0c4d77cc363bee53bbee7c9c95cdf21b14ef9811ff98967fccc737ee157fecd6ffcce1fbcaa3e9ed7789dbff3066ff2166ff30eeff21eeff3011ff2111fe3eee51f7cca677cce3ff997fd5df0255f71c639a31f039712e35c6d153baeb9915f2d77c444040da3e4b1b988413d058a3450a26ba11b1ad32ddde13b806774bf88211e136e68ba58851ec4eb919e68866f09a9655b9e3cd384e634a517f178a5dff2e48ddee903df1f52ed8e3c59158f442fb4261eebf45d9e6cd0266da9cf0dbfd0f6a2164a7c251e0fe2b143bbe2b347fb74a03e63516c6f510b1dca2a47742c1e27423fe894cee85c7d6ee927ef93ea221e17744957f22ba39c0a2a49ef3b72545323b57474f4a921b5e2d179f6f2dda571ee7dcf8b5598c63ef8e807c9e3940a9ffcb5bff163f599c8ce1d712e9ade8a1eef52cb3e9df95b7fe7effdc44fad3756f9980bf2744733faa02d3aa073aafc831ffba9f4c67f7faefc0f95079040</data> </image> </images> --- 429,445 ---- <images> <image name="image0"> ! <data format="XPM.GZ" length="1115">789c5dd24b6fe2301007f03b9f22c23754d1c47934d16a0fa5a5055a287d6aa5550f8eed04308f349016badaefbe991987ddae93437eff8927d628a71de7c774ec744e5bdb9dd8cda52367a2743aaa5aad0e3f5fbfff6ab5bdc8a9efd075bcf649abdd75a433d9ac353cb3fa99b9b880d7c8d8956e0cfc047aae1778581d23e3fa425e1c892f0b4b497c077297bbc40a99f098e3de17a0eff92e4f801299f8d2c713de03032f087caca64811c40156b7c090876e208097c0484449887c6a1871e08da522ee8067fe59489c21d39ab8f7d132213e5b2ae20898c8248c7d601f288244c5297045145e12003f905284c489a5200e8069907281bc42aa54100f4019a65a48e002a9a448b1da03aa506aa23952013744c5896f48dd706f1911870d65082c2c057109d451c3d25213b323b1554ed49ca891baa1b28c88734ba1b0d503308bb426de21b38c2bfc45d79611f1dc5210a70d7504bcb5cc88ddffd63f1913a964ec6ba6749667b33ab519d4e78bc5c22c574dc666eb3adb14c59b29b70c33b62b156caede3ff69b0366ec3337c5397660cb9ebac0ecb2e8155b86df2e16aac2acbf37571455a529af315bedcd8032530e47d4efa6de5b31765ba7f3525036cecda6980cf2bb6e777a6fcfc766a5e919631ee8f0f6cc8fba1816baff65066cfc347a7ec109fc9d0183d5cceaf7b7d61f382f000b</data> </image> <image name="image1"> ! <data format="XPM.GZ" length="6237">789ce5975973db361080dffd2b34c69ba7b391289222a7d3871c8ee3c4b71dc74ea70f100f5d912d4af4a54eff7b178b25cd5bb49bf6a5862799cf383e62012cc1373b9dab93c3cece9bad552ce389d7f1c672d9d9f1efe6f3a7dffff8edcfad6dd3e9e0af33e818dbbf6c6d9fc61daf73747b1328008120baf4437cc36c6a16536687eb3d6227a9870133d78bdb941daa97cc1eb3abb8d7558578c86c3277899d84c51d3316e209b3a719ee151b5da3cbfc2161438ff78dd9e47a3f61ae7f47eca66c327b864bdc53dcefa57caab96f32ef12bb7dafdf23b6149b3d64aa179e66b3ab19de339bccdf89a5e998d45fcc993d667a5ecbb0bacc90b2a4fe97cc966641eb6749cbb768b1a1afd836529e6bb62d4bb75f12cb84e18cd9653e563ce8dbbeadfb9f681e589a45483c44d6ed0f995dcd62c5ec0ffac423c54e7fe073fb40b3d3e37ac16c698603e2a1e30e86c4b4bf5cd3ed39bafe89d9623e22f61216e39475ffafccae66112996a6eb73bdad59f65c93ea67c49e94ccc3943d6a4ffb7368ca80f987e6a1a159c4ccb6a4fef089d84f58507bcf1a4aa9fb9f3307cca166cf60be22f63d7ba8c77b6496cc2be68099d6d7b7525ea4ec13c79a7d83f9237190f28cd966be48d8b38847cc92d9600e98f7150776ca6f53d6e34d35070633ad571004b6661124ec537f219925b78f12e67a9a5f68270c13e680d9d11c1acc9f53d6f9f00b7118dacc6b6619d8c47bcc21f343cabafd75c261a893edbf5bfebf0e1075e5673972a34a1882b7d9f32a870f01843082314c600a33f80173b8a9b7bcd8710b0b8868e4052c6185ffc6648be00eeeab3d2f763ce0984b782c95059a26f0546579b1635d317e5262788bf37b57b4d43baaa3dbe878c4198e308eeff37deb1c752bb8c1a1ca0cd7c6cff6ae76a47bf1c32b1c8f389758efb33a473afe2e7c8487573996b82eb7cf33293a52c313ce78047baf72a8d59fe89ddce0f8842b1763db75c5de1df1b3aa73b18f4545665511afbb6a47c6b0a096250759d6f019bee0c8077088e580f6525c3a2f63cc3564c93ad870941a2a1ddcf63897a78e2b2c5338a9719c62249f5bd73a4af9f72cf364c91e3ed775cf0e6efb081799765193a360fb8a6b938f5654e9b8c42866b3d1a869268539499c493e934de05bd6c1cf7285332cee8f095cb7b48c0ad11ac3f792a38be39573aacadcbdfab75cc661941cf392e310675b345c6094874d6fd24647bfe4084b915aa0d56c7e5b37c42a02abe428ee3e1527bbb5615058f31538e0161cb2b0a7e81c096869104214f66e8c2c0a8e7b9c5b613584c4ecdbce71593ae92331cc9ff36a07fea59543781883e25a8e855f72481194623516de6607f6bec64c1971464e22354d5672c39aef8bb0cd9ab3291b8729dec10ab9bde694ab7bce869b66c6b1ae9a45de2146a533b8c49d35ce67d8168e4572c22b1c938a5ca2da1f641d625a97bfd8816f7331cb3e4f2127ae4ad1a2798b1f784eee551173bcdd4658d665133996782a16f919e773bbb8a93887aadf0ca318e12cd54df7825b94dff56bca3da1b86d726059e4de514da5ecb886bd244a757751aadb158bd20e6ee9c83c69ed9d9ad734aa3827e5322adfef9e47c9ffa5f2ee734eebb6c1b1f9bc543b32964d7369f9a66f70a88845b89bcaf7bfe7bd16b579cf5739329639ddff66157b59edbd31fe6fb6cb63cddf066249cfabce440c0bfef6c393826772de3e8f6dfac6c1e28b9588d1a24e608c37e53371d7267b6d76347debbfccb0f99bf39f8ddecef133ca7fe2f8ebd7adbf018e622c71</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> <image name="image4"> ! <data format="XPM.GZ" length="1917">789c5dd5d96eda401406e0fb3c05cab98baa13dbd8c656d58b84ec2b900da87a318c6db60059205bd577eff19cdf56d54c50f8fc9f593cb626bb3b8d7ee7b2b1b3bbf5ba36eba96dd8897969ec649bc5e2f3e7af1fbfb7b6fdb821bf89df08b6bf6d6d77d70ddbb85a2df3123c16506a7dcff39c4d691356a6291c22a7da89cb2d9c209fd47639b7608bfa55655feb3d75e0c1b77008bfd6d6f1ce9d6d90c0056c03adcfd54d0fcee010b67012a4cee566d0286c5a8c775019f9481d7a4ddf79e39c451ef2373845fe0e67f0873af69b5aff55da46711a6a7e58db38dfc319f2bdda9acfd42d1fde8723f8a272e41e36cfe1143e8533d877ceeafa47b8ca17b575fca53af1e1151cc1c3cab1f67f8253e4bdca9a53565bf36738438ef5a43ef21b38823f4bcbf6fbada6f3195ce5319c226fc3999ab8f6c8e591daf86a1a574eb4ff0b1ca1ffa432f2d03997f9b43fa9ebfe57b5359fc346cd099ca7a1cb97ea51a0e6291cc377a5f3d818f85a5dd5535edbba7c00c76a5aa8ad316af7bee7b90dd4dc87e3918eff50ba886d3eca9c4fd459001fc1b18d9c2f9d0bb1cbc9c079e6722ad4790ccf6aebf9d481f33c760ed44500376b6b7d0ac770173685d61fc3f2a38721131b1eb19596b9964b2be4ef9827ddb59e79924d79c6737ee4052fa5ada43df133bff02b4ff4dc948a356ff88ddff9833fa57df19ef4d9975e6dd677f140fa6f243fe4233e463b91d1e67cca677caee7135fc818872ebbe42bbee68e7ceb724fea6ef816358f324a39c61ddff303f7a5cf40f4c0431907e79eacd47763dccb2a3a1cb8599a72a5f74fcd52d679cca15b6720ed54aef4e54ac431b7feabd99759ca9aa5cc52d624725f5a93cb6e2cddbd5cc82c81cc32945952b91213637fca9abdf25e88f8948cacb5472391918a88f45d2b644f679495f72ed7731e50e1be138d694253ace7c9ed694fc6c01ed24c2a98e652a3e38ce5b9ccddbd0ce951767050ae43c698d342ae8ef5ff943cb9b6ecc48d7ccee46edb6e1d132a9f86a115de8d893cd773be654f5a4b9acc40539af29856f26efcf9bef517d333b338</data> </image> </images> |
From: <te...@us...> - 2003-07-29 01:12:01
|
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv6969/testing Log Message: Directory /cvsroot/quickrip/quickrip/testing added to the repository |
Update of /cvsroot/quickrip/quickrip/testing In directory sc8-pr-cvs1:/tmp/cvs-serv11539/testing Added Files: 16x16-quickrip.png 32x32-quickrip.png 48x48-quickrip.png 64x64-quickrip.png cancel.png cdrom_unmount.png configure.png exit.png fileclose.png filenew.png folder.png guimain-hig.ui guiprogressdialogue-hig.ui guisettings-hig.ui help.png ok.png quickrip.xpm Log Message: Commiting Jesir's new Qt UI design (jesir cannot get CVS to tunnel through his firewall at the moment) --- NEW FILE: 16x16-quickrip.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: 32x32-quickrip.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: 48x48-quickrip.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: 64x64-quickrip.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: cancel.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: cdrom_unmount.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: configure.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: exit.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: fileclose.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: filenew.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: folder.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: guimain-hig.ui --- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>mainForm</class> <widget class="QDialog"> <property name="name"> <cstring>mainForm</cstring> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>570</width> <height>549</height> </rect> </property> <property name="caption"> <string>QuickRip</string> </property> <property name="icon"> <pixmap>image0</pixmap> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLayoutWidget" row="0" column="0"> <property name="name"> <cstring>layout40</cstring> </property> <vbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLayoutWidget"> <property name="name"> <cstring>layout39</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLayoutWidget"> <property name="name"> <cstring>layout33</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QLabel"> <property name="name"> <cstring>pixmapLabel1</cstring> </property> <property name="pixmap"> <pixmap>image1</pixmap> </property> <property name="scaledContents"> <bool>true</bool> </property> </widget> <widget class="QLabel"> <property name="name"> <cstring>textLabel1</cstring> </property> <property name="text"> <string><h1>QuickRip</h1></string> </property> </widget> </hbox> </widget> <spacer> <property name="name"> <cstring>spacer45</cstring> </property> <property name="orientation"> <enum>Horizontal</enum> </property> <property name="sizeType"> <enum>Expanding</enum> </property> <property name="sizeHint"> <size> <width>78</width> <height>20</height> </size> </property> </spacer> <widget class="QLayoutWidget"> <property name="name"> <cstring>layout31</cstring> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QPushButton" row="1" column="2"> <property name="name"> <cstring>pushButton9</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Browse...</string> </property> </widget> <widget class="QSpinBox" row="0" column="2"> <property name="name"> <cstring>spinBox3</cstring> </property> <property name="enabled"> <bool>false</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="QComboBox" row="0" column="1"> <item> <property name="text"> <string>CDROM (680 MB)</string> </property> </item> <item> <property name="text"> <string>CDROM (700 MB)</string> </property> </item> <item> <property name="text"> <string>----------</string> </property> </item> <item> <property name="text"> <string>VCD (680 MB)</string> </property> </item> <item> <property name="text"> <string>VCD (700 MB)</string> </property> </item> <item> <property name="text"> <string>----------</string> </property> </item> <item> <property name="text"> <string>SVCD (680 MB)</string> </property> </item> <item> <property name="text"> <string>SVCD (700 MB)</string> </property> </item> <item> <property name="text"> <string>----------</string> </property> </item> <item> <property name="text"> <string>PDA (64 MB)</string> </property> </item> <item> <property name="text"> <string>PDA (128 MB)</string> </property> </item> <item> <property name="text"> <string>PDA (256 MB)</string> </property> </item> <item> <property name="text"> <string>----------</string> </property> </item> <item> <property name="text"> <string>Custom =></string> </property> </item> <property name="name"> <cstring>comboBox5</cstring> </property> <property name="enabled"> <bool>false</bool> </property> </widget> <widget class="QLabel" row="1" column="0"> <property name="name"> <cstring>textLabel3</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Sa&ve to:</string> </property> <property name="buddy" stdset="0"> <cstring>comboBox6</cstring> </property> </widget> <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>textLabel2</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="text"> <string>Ri&p for:</string> </property> <property name="buddy" stdset="0"> <cstring>comboBox5</cstring> </property> </widget> <widget class="QComboBox" row="1" column="1"> <item> <property name="text"> <string>/home/videos</string> </property> </item> <property name="name"> <cstring>comboBox6</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="editable"> <bool>true</bool> </property> </widget> </grid> </widget> </hbox> </widget> <widget class="QListView"> <column> <property name="text"> <string>Track</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Duration</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Audio</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Subtitles</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <column> <property name="text"> <string>Rip?</string> </property> <property name="clickable"> <bool>true</bool> </property> <property name="resizable"> <bool>true</bool> </property> </column> <property name="name"> <cstring>listView1</cstring> </property> <property name="enabled"> <bool>false</bool> </property> </widget> <widget class="QLayoutWidget"> <property name="name"> <cstring>layout67</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <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"> <iconset>image2</iconset> </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>109</width> <height>20</height> </size> </property> </spacer> <widget class="QPushButton"> <property name="name"> <cstring>pushButton4</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> <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>pushButton3</cstring> </property> <property name="font"> <font> <pointsize>12</pointsize> <bold>1</bold> </font> </property> <property name="text"> <string>Quit</string> </property> <property name="iconSet"> <iconset>image4</iconset> </property> <property name="toolTip" stdset="0"> <string>Quit the application</string> </property> </widget> <widget class="QPushButton"> <property name="name"> <cstring>pushButton2</cstring> </property> <property name="enabled"> <bool>false</bool> </property> <property name="font"> <font> <pointsize>12</pointsize> <bold>1</bold> </font> </property> <property name="text"> <string>Rip DVD</string> </property> <property name="iconSet"> <iconset>image0</iconset> </property> <property name="toolTip" stdset="0"> <string>Rip the DVD!</string> </property> </widget> </hbox> </widget> </vbox> </widget> </grid> </widget> <images> <image name="image0"> <data format="XPM.GZ" length="2061">789c7dd5db52e3381006e07b9e2245df515b3df149b66b6b2fe67c84813932b3b5173a9904480224213053fbeedbfe5b3150b3bb1129f84abf65b92599477ba3e3c3fdd1dea39de5caaea67ee427f66ab417d6b3d9ed9f7ffdf17367373323f969c7a37cf7b79ddda3d5c88f0e16f3d8834940637ce00067835fc379dfe031eca539f84defacce4c56f6265c9f35599b197805dbadf93deca435e8f7709466d16fe14eace33feb9d97799e75f053b89556e17a86ad34988f61b7ede78fc936d7f9dcf42ecaa2c803fa71ff2216bed0fed3de655d5685decfc1ae6c4b7dfea3de5559e5650bdfc29558e77fd8db78632b5c4f6b38186b32f437709484d6f747efdad4a5a9e129dcd4c6607c3a83dbba36189f16b0ad1b83fad0068eb5373adfba77dbb465a3f5b986dbb66af4f996bdedb80d8d47fe135cb45da3d7676a49e8fc2e6063a5a0f073d8d9bad5f14ee0609b56e75ff476b5145cafff0a3bd758ec0f7ed5dbe72e58add7391cbd75ba5e33b81b7c3658f7cf8764977cd03b8cbd77b83fe1fa906dcd657274d86ffc05ce7d48ce93b7fddf07ebfacee1c277c99bc13a7fd433989039ade7cbe43c19f50f4d289c9eb7cf701b2aa7f57e01dbc126d978d48f2e6137b883832c1ff6135d25b75ed707e72d447101b783b5feefe02ed8e475b24bc6fe8a63b1d6ff1b9c05af26ac57cc43f05aff2a397aad3fce4b2cc4da7f3358d703fb2596a1f35aef095cc5b1d7fabe1dacfb3dc275cc93b11f63230756df0fdd60adf7e3e432f9096c63e5f5bcc764a326bc6fa28f4dd0fd8a7ac618dba0e7f534d9aa09fb415e4f3ee8fb0ef397c35304dd0f58afce7655d0fbefc3b16b83be0fa65b475d4fbc7f3bf9c4525fceffdf7ecd30b165c79e03d37f6622777cc213f94e254ff7336af97dca677cce339ef3822fee672431e54bfc75c54b5ef19aaf79c3377ccba41949fc103f4e233ee1a7fc8c9ff30b7ec9aff8b5fe9fe137fc56c67ec7fb77f795b6e003c9bf4f9943e93f90efd1f659905bf307c97c4c994ffc99bff0d7078963fec6df6506e394c9249373f1205372c5866b9db3b8c1bd5ae27e1e949264c991df66285094392fa9a313196d421364a6747a571f499dd139cf692633c87943f3fb55bdab212de882d7744957dcd1f2dfd754522b5ad3356de8663bc2af6b9a2af7a01f99bf7fdff9070eb8ec87</data> </image> <image name="image1"> <data format="XPM.GZ" length="8366">789ce597596f1cbb1185dffd2b04d79b11f04eefdd08f2a05db6164bb625590af250ec45d2689746cb28c87f4fcd290e35fb8c9d9bbc446dc0f89a6c1eb2eab0c8f9e3d3d2cffddda54f7f7c78ec70e7a25c2acff961e953f5747dddfdfb3ffef6cf0f1fe37c49fe85616b29fcf8970f1f0f3a4be5d2deed4ddd034302d4c25f8f6d090ee4019b6dc7612b00b7c0612b6e45e01b70daca5a698ff907386be5ad0ced3a5eeedb2b70216f945330cb9b027c062ee5b1f89ec1559fe9115cf7de80bf821b792a7cffea19ebe3a6c741184401e64fd00b92200e100c63c1a9bcc17ae827380fb220413cdec0569e1ce31d80eba00a305fb3dae350fe02d5bff4acfaa7e0288c8206fd0b70ecf9a4cf21e24ddf1cc7aebdeab3b61bcc2fcce4c1fcedbd67cdc73e38efb36d83ebb00a19f331e0461e30617e514b18eba165701aa5a1ce1ff98d4a79100f13802b61e457aca65c45c8a7c5f851d36746fec42c4da4f1433ce340de28239f712c01d07cc33f711ac711f4e9185cc536d6f5348ecb3806df816b61cc8fe1cfb8911eca2f3d4ec2a415eb7c11ef244ac258f52f1c47b1faef162c7fb1fa6d179c09c36f1c83eba44c107fca7b2cf66912d543fcd3348d138c6faec1599a241adfc033c6b7f04b9aa7a9e32ed8a645023fd11ab84a6da2f1c07ab220ad53f5ebb3e3c631e29ba5599cea7a37c17996a6aa1f8239cb535d1fd69b9519a7aa77e3197a16f9cd6a7903ff31ea816ce73a853f790b1ccb1be4c3d48e436586ff7291cb301f423c72cee51518f9cbeb9c33dd3fdf1ddb0cf136985f911441aefb35761ce5eaf7049c1671aefa5f3c231fd401e7858418e3239f051759aefa9fc16551285bec370e8a3a87be857f392c9a5ce7877ac6b1f4d078603f73c9a2003ef6acf1c7fab86211c078a84fb6c565a1f13f775c17bade1570c095e32b706c6546180ffeb1899519613cec1f2bf660ad1fd87f3617567fc2dfb61046bc18f5438aa9659dcfad67f5c73a38b035a33e58d4c732b40deb7cb1de32296586985fe338649d1ff251a665c4ea0fc4b7cccbd8eafc90dfd2969955bf6e804b0987e653b92ed96abdd9746c1d1f821b61c4db3c3b2e1da33ecbe1e098f63deb79f4e4b852b6886f15f8fe278e5dbb79f1ac7e693bae950df25b85be7ddbb16be73dc78dd5fa128123ff7dc7b16ba755e5aa65117f03bf56719fed8b67ad97f053955481e353c7a132c1af552aac7e427eabac8aace60ff5a0cafbcc4f8e63d77ee938b17a5fc0795b15d2aefebb70dc6f7ff4ace7d791e3549950df2bf61cf7b9d4fb87c6c30ae3bce6cc71a6edb4e959ef23a8975559e5ca74e659ebc537c78532dd7b56ff61bf5755bfdde8f7b56fb78e59d96a7bd367b3e5d8965aefc8b3d69f96e3d231ea935c5f1c33e22fd789caf18667f523f6971cdfb5e3dab3d653ecb73aeab7f391e3a6547fc17f75ecf941b96e29f38e67bdcf607fd649bfddde78567f468e03655ef7acf70b5d5feadbad676d5ff3acfeec3a0eb59dc8b3b6c38f75d66f376dc7916b7ff5acf5fadcb3fa197eaa73b920e8fe78f3acf747f8ab2ee440d7fea82735d769a9f54bc7b3c2eaef77d6f6af8e3365d2f896c27a5eef79d6fedd3e577a7e5c3bceb5dd6a7eab3ad776b3ec59fd9e3a2e5cfbb167b4db6bc7b6d2fba1aea7f6fdef3deb7ed971cc8ee1e7ba11c6f77cef59cf8f55c76e7cbef2acfb03f993cbb7633a745c2a1b9c074dd0675a715c55ba7fb05f9bb0cff6c971edbebff0ace77dee59f717ea7f13f59911cf2669824af70bea5993c90555fd8cf937459354ea0fc4a3691a5b6bbc32c755adebcf1d37b59e476b9e753fad7856bf469ed50fec59fd72d4e706fa7ce859fdb8ec19fd0f3affdde7ff57c3d0b4e7cfd2181a958d35e57c9ddfd2a84c6d1a7366cecd85699b4b7365aecdcd74955fd6b83577e6de3c9847d3314fe6d9bc9857d3356f66d9ac98d5c93abfacb166d665ec8d91675314b7cc67f3c56c8fabfcb2c6ced8f8efcfaed9335fcdfea8ca748dc9d19da9b1610ecc37f3ddfc18fe769ac6b40cced1d83087e6c81c9b9f835f4fd6f05e3cf9658d5e6ebae6d4b46669f8f103139ae837347a11db33f1fb4a4635bc426252994ff65b1abdece7a698ad817fbbd27767548398acce954aaaa8a686ce64873c8fa96cd1f9640da770611ea88d9e631a3d15b34397746576e99a6ee896eee85e76fbe98846871ee8515506359c42879e9cc2440da7f43c58a5e8855ea91cce3c75e96db2062dd30aadfa9e533546eb2fad49743b432a8fb4ae6def1aaeef066dbef7a3ad591a23ebff4c5fcce0b7dbb433498376696fb01a497e67ac64784df45562bc3f14ad03fa36a8e1e6f29d7e0ce78e2c1dd2d1622ae2a5f6d0b77b743caa413f45f964b4365065cee974fa2937b092d64846de2818d308291aad0b145342e9ac9374ba0665948f691452cf465dfec466f669fdaec144db435fdf338f6ab01d59eb86e972b9b042c57628e7cf5c7333acc1677c3ed4a7b7da2e5f2ca620dfb7a91ef4aed4817ad8bbd2e792afa4fa0f69f035df2cb88a5b7a45857b9f5fc577c3fb5ca8e0fb510d93f2c3221afcc81d1e3ee50ff9995f4635f895bb63b1caf86dbec64187977985575d45d62f4b5eeb677228e7eba339e70dde5c24e7fad0d6c0ae8a786bb4b643e3b3dc9a8663b54efbf36e9a03317b3fbfd6f9cbf839088d6d1e3de50ecc03efcebf6d0e6bf01e7fe5fd291a07fc6dec7ed6919c7c1fd4e01f7c384b83f6f9888f27dd4bdc08cf63d1eaf9bccb3ff9844fc5dda7dce280b624f23be34a3d0d3ae190a369f72bcc311edf87bdefe8879c6a5b727a6dc9ffb1ab9b63555f343a92eb84d3591a52b3da9c8dad64f233a6c1879c73319eb7d1b3d61a3b7a662eac3110f3a9776a6db52c15fe659e829c5d3c25f363de9b74f7b156aad91c15b2f3f7cb640d17af5254a2d9115bf4a49fa6019dcad6e2e3f1fb9ff79a491739e727690ca834f6cc9edb8bb15db9496dda94fbc0866d2f56c766ff36b097f6ca5edb1bf1f3ae79915bc7abdc6edb26b5b7f66ef13a36ef378ee8dcdb07fb683bf6c93edb17fb6abbf66d91ea355f63d66ffd5f5398ff9bf33f1b7d318d3fe3f99f68fcebaf1ffe0d02e9c7e9</data> </image> <image name="image2"> <data format="XPM.GZ" length="1885">789c75d4c94e1c311006e03b4f31c2371415bdd0ddb6a21c202c098435614b948397360c30ac4358a2bc7baafff2344bc81402bef1afb6cbf6cceccce0606b7d30333b7533b6e3a11ff8637b3d9809b7a3d1c38f9f1f7e4f4de7f5807f1a3328a6df4d4d6f8f077eb07171de7620cb50a52e75a5e1b673652bdb18f873e7baa91b5d775604dbda6ac9d770a883f6f061e7266f721d913f81cba63439c637e0aaa90c16a3301f3fbe36253c82f9652a58c1a671a68187b063cbfc39ec1b9f9cc16dd31a8b7c8063efe3de0ef9ef9d75a6b3e40817ba30d81fe5e1726252c9a5417f6460ad6b8b7e681336da58f4431a76da59ec1f5570d4d1cafece753695a9accc770673c3569e7f005b639d3c7f1f8e263a398fa3ce36b7b993fef7603e4027fdac27d70ee7a31cacad7601e35f606b9d93f93ec18edf103770b4d14b3f1f3bbb8c3d07af885d2656a770ee722fe787fd74852b9271df5ce52a2febbd876b577bd98f35980f38b98479033dce8f0ad838e3a5bf5fb077decbfddbedec739f05b96f57c979f225dcf82a603d749bdc245fc0fcc020eb5be82df39f27fbe465985f293fee2de3b8cf3e862cc8fab03f21e377c437e27e1c9f97c0ab6b33781ed641b772fe4bc92619f725987e7c983c19c77d0f2eb856ee1f3e0f21f47e4c0ec9b84f2186d84a3fb8ff6dd6fb4ecc25fe06e75c725eb85f6dc125fe0a975c725e3b70c525fd6ec39a4beee3166c5b1ba5ff5538b4214a3f8b9d63ce25e7f500175ce26bb8e4aae5cb4e8ad4a426ef48bdc858725c9e02b5d4fe2713397544c734a4133a7d4a3dcfa4d419274674fe32f37c059c52fc8c0bbaa4ab492a65ae2729feff86c674cb895fff64eeba1412172971ff2af3408f348fc4429ff8f82ab3484be865b94facd0a71799489f69f5d93ad638f185d6694352d23b77bc495bb44d3bf495be717a97f6689f0ee8b04ba54cb72f967f7fa78c72fe5b50c98939aaa8a6f6690f534e2ae3f91a4e68328a5eeef3535a296595e38457e1ad4c4ab52aaa2375ac866f6752ea449daa33359afef37eea2f9ee6cca8</data> </image> <image name="image3"> <data format="XPM.GZ" length="2558">789c7d95476f1c471085effc150bd58d304a333b19860f0c12c59ca3e14347c65d663108feefee7955bb2229436c82e4b7af7abac2ebe1e7d9c1d1d6fa60f6f3ccfd83793877037766ee06b3fe71347af9fb9fbf7ecc7ccaeb41ff3dcc07c34f7fcc7cda7e18b8c1c6f538f4404b0928c317f85bcfc36618ca0ebc09b64555097fedb9688b58c79e79088e65d114d05dcf6555daa605432f5dd5b6169c817d55b7727e0e0e95eb4a3c0fcfaff2aa693df417e5aeadc137e050575d0edeebb92e6ad3213f6ec169bbabc0cf3d374d9b59e4c3a6e736eb8a807c791b6cbadcca7e123659141de77585c97c035e0497c647c967035c75cea1b97c266c5249d04fc0adc99d03df83adcda3c4a3bf26b35544fd740cce8df38867f4c794267a9cc799b035d18071be69ad93fdbc05366e18311f8a606bbdea857290fa08fd30ce655acf2ed8dba197fc4e845daef9ed4f59e6df81a3ad253fba5036017e62f8c166364699d783b02ba3cce70a9cbb42f9085c581fd06f9a137695d6fb055cb94cfacb8d7215a5bf6370e35aad2780dbc492ffa972273aef803b67f4fc126c12cb7ef8c1da894eb7c2bed3fa312feb9c8de20f0ff6ae0bf02f4bbdc1a95ff8b06797b92688df4e95bb28f7ef55d8373a3f3ccf0d7dab7c072e7d1ee5feac816b5fcaf9b4a5acfb19f3778d8b01fda30361affe60ccdbb569bfdc0fd497b2af54afc0c6d7a2d325d8ba10a49f23b04bf9c9fe5ab9d3792c2b3bcd9fc1d1278b80adf244c7fdf17962e8bc241c4ad5afc1c330c9df2a4ff27d51ae351ef7db173e483e8cfa7d999e2ff35905573e6a3e8fe0da7bf503de87be09b9d60f7ffad6eb7d22f8d177deeabce1379fdcaf7edf51d6fc08f34fd199f899cec12e14324f9e70d47ae07fefd37ec9ef5979325fe94748fd90fb86f9f89874a9177e097950bfd213b80c46f53d65ab8cfa439558cec3fb2ed489a53ef83351a60cff059f58fcbf008eb1d0fcf0be48eaa4feefe074fbf53e3f294ffc8df741529519fe4964b43f2365abf1f3ca13ff609eb19bc6af8393fd5517f669c9fd5998b29c77a13c895f0187a97eaf1cb5fef9298b2ef5c5c97e5e518e9acf78ca51fe19ff7ebd8f6162f3bb18b6ecd873e0c8a77cf67f317cce177cc9573ce2715ad77cf331866ff92e29f7fcc08ffc1d514ffcfc21e6059f8ff995e7d2cf795ee045fec25fdfc52cf1375ee695b456798dd7798337798bb7dfc558dee15ddee37d3ee0433ee2633ee18c731ebe3babe0922baeb9e1963b62223264c9fd8c214f81229dd2199dd3055dd2158d684cd774f326e696eee89e1e52b6637aa4beb2157aa2677a79db1f7aa5399aa785a48e6851aaa42ff4f5cd7396e81b2de3f3155aa5355ac7df1b3feb4a11fddaa42dec9fa76dda4911bbb4f74b4cbff6e9800ee9888ee984b25f67dac7e0774ec30f73fff7cf99ff00e63c733a</data> </image> <image name="image4"> <data format="XPM.GZ" length="2942">789c3d96c95224390c86ef3c4545ebd631a1cecdb9c4c41c8066df1be80626e6e0b4d35040155014343031ef3e2afda2020ef5a594b2f45b96f3dbd7d1c5f1c1e8ebb795e7b99f8fc328dcf8d9e86b7c994cdefffee7af7f57bee4f568f15fb951f1e58f952f27f351181d3e4c8705f0bd007529cf32b7603f36cec1ec17ecb34ff613e322cbd57ebc64d81f94f3bcc94ab5d392db0553a55c08c3df1b77603a5f72a37c60dc679dc6c3fa55eeb3a0bcbae4a8fe5bca2e8fb0d38771cab45e3ffde43c53fb0c5ce4c677ca4d51e62a1679e32a473d1fc64daef570a1dc167d8efc6e957d31141a8f554f1f241cf866c91a9fef8cab42f524b764d8af978cf593b12bb03f517928db02eb0fca49ecb57230feb49f2cb8cfca5424e55e39afb212f9ad2b17e560f59d2ab7ae28a0f777e3b240ff6c2877ae2dd10f67cabd1b4add3fde540e2e94c847f7a78f755622feee824356f795d6479a6f28ea58c17fcf78a8d03fbaffa16cf2caab5dfb2554f23eeadb07cb86f5ea3f37ae2aed0f3e307695e64f8db26bea4af5a064dc38e8a1fd1c6a590ff51f1a770efb7165dcbb4ab9546ee47dd81f8d3bd8fdfd92d1ff37c6b2a4fa67c60398e0df4a3cc47f320ec63f968cf767c683835eafe03677aa17b171e1500ff4e9c4aefad1bab1ab711ec6c6758dfd7d56f6e28ffdbb5c32f47d356e109f768cdb1ae7e9d1b8aba1cf6f63efb01f3f978cfdd8560e121ffdf662ecac9edad8fcb9538eb21ee2bf290f6d02d32fe5d4f6b5beefd16fa9930e533b195735fa295f70cc84a1e793715363dee8798f79e76af4dbbb71dfa05eedff5874b1413f6b3db1ecf206f9ec19770df6efc878b0f7b59e5809438f33b0cf1be8adfa46d795884fa7c69ffe05d8172df4783776f0f7bd718df549cf4f6cbad4a01fdec03e433c7f6bec5acdcfd39231bf4be3da58fb25b6521ff45935ee1be80d7d3b9fc3df27e3b6557faffd1abdef5ae8ade72ff6520ffcefc0723d605eeafc8c41ecd8af0de3d0e13caf81655cc05fef83187b5150e3e93c1d7219e7883f18bb0efda67a0d85efe14f17e0be849db51f8752f2819e97c6ae43fd3acf07278cfbc8581a187ae87c1eba9079e8afe76308c1f5b81f74fe0e31343dfa03f90da1ee918fce939405914859efe79487d4e33c6a7da91046ff68fea98c598ff3a3e72f35b10ab85ff4be4e6d6c02f4d47993ba3844cc07edd7e4638ac84fe7610a4315b1ffad721c9a087d74dea634a401f62958ae67f4efcb92a1df9a716efc605c0cc867d7d80d9867adb15c796acf8c53c279feb564adf764cec49e7b0e1c79e0c4d77cc363bee53bbee7c9c95cdf21b14ef9811ff98967fccc737ee157fecd6ffcce1fbcaa3e9ed7789dbff3066ff2166ff30eeff21eeff3011ff2111fe3eee51f7cca677cce3ff997fd5df0255f71c639a31f039712e35c6d153baeb9915f2d77c444040da3e4b1b988413d058a3450a26ba11b1ad32ddde13b806774bf88211e136e68ba58851ec4eb919e68866f09a9655b9e3cd384e634a517f178a5dff2e48ddee903df1f52ed8e3c59158f442fb4261eebf45d9e6cd0266da9cf0dbfd0f6a2164a7c251e0fe2b143bbe2b347fb74a03e63516c6f510b1dca2a47742c1e27423fe894cee85c7d6ee927ef93ea221e17744957f22ba39c0a2a49ef3b72545323b57474f4a921b5e2d179f6f2dda571ee7dcf8b5598c63ef8e807c9e3940a9ffcb5bff163f599c8ce1d712e9ade8a1eef52cb3e9df95b7fe7effdc44fad3756f9980bf2744733faa02d3aa073aafc831ffba9f4c67f7faefc0f95079040</data> </image> </images> <connections> <connection> <sender>pushButton3</sender> <signal>clicked()</signal> <receiver>mainForm</receiver> <slot>close()</slot> </connection> </connections> <tabstops> <tabstop>listView1</tabstop> <tabstop>pushButton4</tabstop> <tabstop>pushButton2</tabstop> <tabstop>comboBox5</tabstop> <tabstop>spinBox3</tabstop> <tabstop>comboBox6</tabstop> <tabstop>pushButton9</tabstop> <tabstop>pushButton1</tabstop> <tabstop>pushButton3</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> </UI> --- NEW FILE: guiprogressdialogue-hig.ui --- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>dialogueProgress</class> <widget class="QDialog"> <property name="name"> <cstring>dialogueProgress</cstring> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>567</width> <height>153</height> </rect> </property> <property name="caption"> <string>QuickRip: Ripping Progress</string> </property> <property name="icon"> <pixmap>image0</pixmap> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <widget class="QFrame" row="0" column="0"> <property name="name"> <cstring>frame13</cstring> </property> <property name="frameShape"> <enum>NoFrame</enum> </property> <property name="frameShadow"> <enum>Raised</enum> </property> <grid> <property name="name"> <cstring>unnamed</cstring> </property> <property name="margin"> <number>0</number> </property> <property name="spacing"> <number>0</number> </property> <widget class="QLabel" row="0" column="0"> <property name="name"> <cstring>rippingXofY</cstring> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>7</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> <string>Ripping Track x of y</string> </property> </widget> <spacer row="2" column="0"> <property name="name"> <cstring>spacer9</cstring> </property> <property name="orientation"> <enum>Vertical</enum> </property> <property name="sizeType"> <enum>Expanding</enum> </property> <property name="sizeHint"> <size> <width>21</width> <height>65</height> </size> </property> </spacer> <widget class="QLabel" row="1" column="0"> <property name="name"> <cstring>l_ETA</cstring> </property> <property name="text"> <string>ETA: N/A</string> </property> </widget> <widget class="QLayoutWidget" row="3" column="0"> <property name="name"> <cstring>layout72</cstring> </property> <hbox> <property name="name"> <cstring>unnamed</cstring> </property> <spacer> <property name="name"> <cstring>spacer1_3_2</cstring> </property> <property name="orientation"> <enum>Horizontal</enum> </property> <property name="sizeType"> <enum>Expanding</enum> </property> <property name="sizeHint"> <size> <width>449</width> <height>31</height> </size> </property> </spacer> <widget class="QPushButton"> <property name="name"> <cstring>b_closeProgressDialogue_2</cstring> </property> <property name="enabled"> <bool>true</bool> </property> <property name="sizePolicy"> <sizepolicy> <hsizetype>0</hsizetype> <vsizetype>0</vsizetype> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="focusPolicy"> <enum>NoFocus</enum> </property> <property name="text"> <string>Cancel</string> </property> <property name="on"> <bool>false</bool> </property> <property name="default"> <bool>true</bool> </property> <property name="iconSet"> <iconset>image1</iconset> </property> <property name="toolTip" stdset="0"> <string></string> </property> </widget> </hbox> </widget> </grid> </widget> </grid> </widget> <images> <image name="image0"> <data format="XPM.GZ" length="950">789c5dd24d8f9b301006e07b7e058a6f51d505635850d5c36eb2df6ad5e34aab1e8c6de298000909bb0955ff7b3d33b0edd6c981e71d8f1939b95804cf3fbe058b8bd9e1288f1b15282bbb60a1fbba3ebffcfcfa6b368fd2c07fe33c88e69f66f3cf810abeb78d8167e69f59880b788dcc421566c03760144622c2ea0a99f90f528e54116e3e0079c8436287cc79c671f313308ee290e74085cc6315e348774011091163b5404a9109acee80094f42218167602ad33c413e4c4c39700fbc8c2f1362892c3c71f3e3c89c3800739527590cdc02a590512e8047a49209f176a4242e818528b8445e21752189af409514462ae006a9952cb06a813a5186e8dea9810d5173628f343a25de4f5409b01d298915d0a4da10cd3bb1f786683851238d4989eb9152636f0d2ccbd277034f234b93e2bfe8bff54fc664a118fb9869ed0f2e7d3a66505fdb8d75d576ca5859fbac69abc6991dc38ced8d86e6ee70ec9b57ccd89b71ed094f6095d5f833b2736bdb1dc377b75677980dbdbba2a8ab9cb9c66cdbbb2565d6f4039db7f7bd1d6370e4da48ca5637ae696f97c60f74ba1be763a5b1d65957d3f0d3ccbaba6ff5f0e10ed8ea61787cc21bf87b070cd67457bfbfccfe00d518daf7</data> </image> <image name="image1"> <data format="XPM.GZ" length="2478">789c7d95c96ee3480c86ef790a23bc0503764925a94a18ccc1599cd58e9dcdee6ecc416b9c38ceeaac8d79f7a1485a4ee7d0553190cf6271fb59f2b78dce64d8ef6c7c5b7b5a648baba2534cb3c7ce46f93c9fbffffcf79f5f6beb41d269fee813aeffb5b63e5a748acee0eeb66a00c7046078350c17cc41cb7d66dbf2a0e1206c79c81cb5ccfe02b7643c642e5abe5476c6b1fda4615bb6e7f798abd6de371cadf2f9606ee323e71b252d3f307b9bda94ed8f1a8e43131acb7cce6c978cec2f8ea33412fb51c3696c221331ef379cb5f9c069c3b931de64cc67cc01d523bcabbc7c7eccbcead73bb36d9f9f3047c439e773206c031bf073ae274f4d623c3fbf178eaa88f58369c38535b149980f9597f68eb934852998397e1927b498b91f651954a1e4d76db88e6902383ed6cc89cb1de7079c5fbdeac78cb96e795359cf434f79d9cf4be5d8c4cc6fca89e6ffa8bc9c8f27e5d4883ea85c9a92f94a98c249fc6be524107fb5b20fa41f5de534107f957216881e37ca5520f763221cda50e627538e42ae0753e5249478a0ec43899728e7a1e87b246c632bf52f94132b7ac4cacbf9dd16a6f6c97cff50a60498cf945d24e74f85a9bdd28f52398845cfefcab498fbca492ce787ca2ee6fee3beb28fa59e3de53c967a7685932a917e45c22e70126f4b397492afeaed68316bbf5ceab85ed4797199633df05559e70f77944bc7faa3ce9bb75eeeb3eae3232ff376afecbcc453bd3d2de65c39f5125ffbe5332ff10be5dccbfc6b7c5f78b94f2fcaa5977c9e9569330f84697c453fd53bcd53f1a7f5a545cafe40f3a17194fea9fe99cda4be3be52893f9d3fb91d1620e946933ebfdc86d2ee76f95a35cceeb7da3f64a7f8c3215ccacf729cf72f13f572e73b97faa2fbd5ea43e7d1f144121f91f2b8785e8aff7abb085dc27f547ee44df13e5aa94790a85abb0e2f3a0fda5d79fe8abf5d4a69679573deaa096f78fea57db5aea1f2947b5d46f954930b6d7fed6452dfa4e9569c98fe79ff7671b04cc30c7024bacb0c6cbaf3638a5efaff01a67788373bcc53bbcc7872f368ff8840bf2f28c2f64fd8a6fb4dff16365835d7abe895bb88d3bd8c35d8ad7c33ddcc7033c6c6d8ec8431f0714f11887643bc2133cc5333cc70b1cabcd04bfe30ffa18b20a30448b11c698a043dfda74310504800c729c4201255450c3254c57367005d730a37d0373b8853bb8679ac1c3279b4778a26f16f00c2f94db26f97a8537fae61d3e5a9b2e6cc28ce26dc176731e17b0033dfa6f17f6da7c0e619f7df73446b30fe0108ea0bfb4214f0338fef4bcd96481e366aff482218ce0044e759fc1395c3416bf6b0a63ea98970d13f1f15577ca6bfcfb564dfffb7bed7f5e6938c3</data> </image> </images> <connections> <connection> <sender>b_closeProgressDialogue_2</sender> <signal>clicked()</signal> <receiver>dialogueProgress</receiver> <slot>reject()</slot> </connection> </connections> <layoutdefaults spacing="6" margin="11"/> </UI> --- NEW FILE: guisettings-hig.ui --- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>qr_prefs</class> <widget class="QDialog"> <property name="name"> <cstring>qr_prefs</cstring> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>766</width> <height>475</height> </rect> </property> <property name="caption"> <string>QuickRip: Preferences</string> </property> <property name="icon"> <pixmap>image0</pixmap> [...2099 lines suppressed...] <connection> <sender>buttonOk</sender> <signal>clicked()</signal> <receiver>qr_prefs</receiver> <slot>accept()</slot> </connection> <connection> <sender>listBox</sender> <signal>highlighted(int)</signal> <receiver>prefsWidgetStack</receiver> <slot>raiseWidget(int)</slot> </connection> </connections> <tabstops> <tabstop>listBox</tabstop> <tabstop>buttonOk</tabstop> <tabstop>buttonHelp</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> </UI> --- NEW FILE: help.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: ok.png --- (This appears to be a binary file; contents omitted.) --- NEW FILE: quickrip.xpm --- /* XPM */ static char *quickrip[] = { /* columns rows colors chars-per-pixel */ "16 16 42 1", " c #000000", ". c #0c0c0b", "X c #171614", "o c #191916", "O c #1d1d19", "+ c #24221f", "@ c #2a2925", "# c #34332d", "$ c #3e3c36", "% c #47453f", "& c #4b4942", "* c #545249", "= c #6c6a5f", "- c #6d6b60", "; c #767467", ": c #787669", "> c #7c7a6d", ", c #989485", "< c #a19e8d", "1 c #a4a191", "2 c #aba796", "3 c #ada897", "4 c #b7b2a0", "5 c #bbb8a4", "6 c #c2bdaa", "7 c #cecab5", "8 c #d0ccb7", "9 c #d2ceb8", "0 c #d6d1bc", "q c #d9d4be", "w c #dad6c0", "e c #ded9c3", "r c #e1ddc6", "t c #e4dfc8", "y c #e5e0c9", "u c #e9e4cc", "i c #ede9d0", "p c #f1ecd4", "a c #f9f4db", "s c #fef9df", "d c #fefce2", "f c None", /* pixels */ "ffffffffffffffff", "fffffff O&$ fff", "fffffffuuttt: f", "fff ffi8789r1 f", "ff :affi0er09t* ", "f ;tufffu@+2q06 ", " Xt9edfff r8uO", " =e8e* ffff e8u@", " ,q95 ffff @r9t.", " 1q94 ffff 8tq, ", " ;e8e@ dfffitO ", " oy90e34taffd% f", "f :t88989aff ff", "ff :urweu,ffffff", "fff o-,># fffff", "ffff fffffff" }; |
From: <te...@us...> - 2003-07-29 01:04:21
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv11539 Modified Files: dvd.py Log Message: Commiting Jesir's new Qt UI design (jesir cannot get CVS to tunnel through his firewall at the moment) Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** dvd.py 24 Jul 2003 14:13:26 -0000 1.24 --- dvd.py 29 Jul 2003 01:04:18 -0000 1.25 *************** *** 354,357 **** --- 354,358 ---- # bit = "".join([" ", bit]) # string = "".join([string, bit]) + # print all_pass # print string # sys.exit(1) |
From: <je...@us...> - 2003-07-26 07:23:22
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv18090 Modified Files: gui.py Log Message: Minor cleanup in print statement. Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** gui.py 24 Jul 2003 14:13:26 -0000 1.15 --- gui.py 26 Jul 2003 03:28:54 -0000 1.16 *************** *** 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,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 *************** *** 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() --- 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() |
From: <je...@us...> - 2003-07-26 04:42:54
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv17949 Modified Files: config.py Log Message: Added 25/07/2003 as date. Index: config.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/config.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** config.py 17 Jul 2003 10:41:22 -0000 1.8 --- config.py 26 Jul 2003 03:27:53 -0000 1.9 *************** *** 15,19 **** author = "Tom Chance <tom...@gm...>" version = "0.8cvs" ! date = "2003-06-13" copyright = "(C) 2003 Tom Chance" license = "GNU General Public License (GPL) (see LICENSE file)" --- 15,19 ---- 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)" |
From: <te...@us...> - 2003-07-24 14:13:33
|
Update of /cvsroot/quickrip/quickrip/ui In directory sc8-pr-cvs1:/tmp/cvs-serv18096/ui Modified Files: guisettings.ui Log Message: Added option of video codec, to choose between DivX and XviD, as requested: https://sourceforge.net/tracker/index.php?func=detail&aid=754961&group_id=79718&atid=557565 Index: guisettings.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/ui/guisettings.ui,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** guisettings.ui 17 Jul 2003 13:12:14 -0000 1.6 --- guisettings.ui 24 Jul 2003 14:13:26 -0000 1.7 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>521</width> ! <height>408</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>519</width> ! <height>436</height> </rect> </property> *************** *** 31,106 **** <cstring>unnamed</cstring> </property> - <widget class="QLayoutWidget" row="2" column="0"> - <property name="name"> - <cstring>layout2</cstring> - </property> - <hbox> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QPushButton"> - <property name="name"> - <cstring>b_Save</cstring> - </property> - <property name="text"> - <string>&Save settings</string> - <comment>g</comment> - </property> - <property name="accel"> - <string>Alt+S</string> - </property> - <property name="iconSet"> - <iconset>image1</iconset> - </property> - </widget> - <spacer> - <property name="name"> - <cstring>spacer5</cstring> - </property> - <property name="orientation"> - <enum>Horizontal</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>170</width> - <height>20</height> - </size> - </property> - </spacer> - <widget class="QPushButton"> - <property name="name"> - <cstring>b_OK</cstring> - </property> - <property name="text"> - <string>&OK</string> - <comment>g</comment> - </property> - <property name="accel"> - <string>Alt+O</string> - </property> - <property name="iconSet"> - <iconset>image2</iconset> - </property> - </widget> - <widget class="QPushButton"> - <property name="name"> - <cstring>b_Cancel</cstring> - </property> - <property name="text"> - <string>&Cancel</string> - <comment>g</comment> - </property> - <property name="accel"> - <string>Alt+C</string> - </property> - <property name="iconSet"> - <iconset>image3</iconset> - </property> - </widget> - </hbox> - </widget> <widget class="QGroupBox" row="0" column="0"> <property name="name"> --- 31,34 ---- *************** *** 406,452 **** </property> </widget> - <widget class="QComboBox" row="0" column="3"> - <item> - <property name="text"> - <string>Default</string> - </property> - </item> - <item> - <property name="text"> - <string>4:3</string> - </property> - </item> - <item> - <property name="text"> - <string>16:9</string> - </property> - </item> - <item> - <property name="text"> - <string>2.35:1</string> - </property> - </item> - <property name="name"> - <cstring>aspectRatio</cstring> - </property> - <property name="toolTip" stdset="0"> - <string>Aspect ratio of video</string> - </property> - <property name="whatsThis" stdset="0"> - <string>The aspect ratio of the video. Change if the output appears stretched. - DVDs have aspect ratios printed on their cases.</string> - </property> - </widget> - <widget class="QCheckBox" row="1" column="2"> - <property name="name"> - <cstring>c_pdamode</cstring> - </property> - <property name="text"> - <string>&PDA mode</string> - </property> - <property name="accel"> - <string>Alt+P</string> - </property> - </widget> <widget class="QLabel" row="0" column="0"> <property name="name"> --- 334,337 ---- *************** *** 523,526 **** --- 408,422 ---- </property> </widget> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>c_pdamode</cstring> + </property> + <property name="text"> + <string>&PDA mode</string> + </property> + <property name="accel"> + <string>Alt+P</string> + </property> + </widget> <widget class="QComboBox" row="1" column="1"> <item> *************** *** 556,560 **** --- 452,590 ---- </property> </widget> + <widget class="QLabel" row="1" column="2"> + <property name="name"> + <cstring>textLabel1_2</cstring> + </property> + <property name="text"> + <string>Video codec:</string> + </property> + </widget> + <widget class="QComboBox" row="0" column="3"> + <item> + <property name="text"> + <string>Default</string> + </property> + </item> + <item> + <property name="text"> + <string>4:3</string> + </property> + </item> + <item> + <property name="text"> + <string>16:9</string> + </property> + </item> + <item> + <property name="text"> + <string>2.35:1</string> + </property> + </item> + <property name="name"> + <cstring>aspectRatio</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Aspect ratio of video</string> + </property> + <property name="whatsThis" stdset="0"> + <string>The aspect ratio of the video. Change if the output appears stretched. + DVDs have aspect ratios printed on their cases.</string> + </property> + </widget> + <widget class="QComboBox" row="1" column="3"> + <item> + <property name="text"> + <string>DivX</string> + </property> + </item> + <item> + <property name="text"> + <string>XviD</string> + </property> + </item> + <property name="name"> + <cstring>videoCodec</cstring> + </property> + <property name="toolTip" stdset="0"> + <string>Aspect ratio of video</string> + </property> + <property name="whatsThis" stdset="0"> + <string>The aspect ratio of the video. Change if the output appears stretched. + DVDs have aspect ratios printed on their cases.</string> + </property> + </widget> </grid> + </widget> + <widget class="QLayoutWidget" row="2" column="0"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_Save</cstring> + </property> + <property name="text"> + <string>&Save settings</string> + <comment>g</comment> + </property> + <property name="accel"> + <string>Alt+S</string> + </property> + <property name="iconSet"> + <iconset>image1</iconset> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>170</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_OK</cstring> + </property> + <property name="text"> + <string>&OK</string> + <comment>g</comment> + </property> + <property name="accel"> + <string>Alt+O</string> + </property> + <property name="iconSet"> + <iconset>image2</iconset> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>b_Cancel</cstring> + </property> + <property name="text"> + <string>&Cancel</string> + <comment>g</comment> + </property> + <property name="accel"> + <string>Alt+C</string> + </property> + <property name="iconSet"> + <iconset>image3</iconset> + </property> + </widget> + </hbox> </widget> </grid> |
From: <te...@us...> - 2003-07-24 14:13:30
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv18096 Modified Files: cli.py dvd.py gui.py guisettings.py Log Message: Added option of video codec, to choose between DivX and XviD, as requested: https://sourceforge.net/tracker/index.php?func=detail&aid=754961&group_id=79718&atid=557565 Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli.py,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** cli.py 17 Jul 2003 13:12:14 -0000 1.14 --- cli.py 24 Jul 2003 14:13:26 -0000 1.15 *************** *** 75,78 **** --- 75,82 ---- aspectratio = self.aro[int(self.config['aspectratio'])] passes = self.config['passes'] + if self.config['videocodec'] == 1: + codec = "XviD" + else: + codec = "DivX" if self.config['pdamode'] == 1: pda = "yes" *************** *** 95,99 **** print "(a) Aspect ration:\t%s" % (aspectratio) print "(p) Mencoder passes:\t%s" % (passes) ! print "(h) PDA mode:\t%s" % (pda) print "" print "(s) Save settings to config file" --- 99,104 ---- print "(a) Aspect ration:\t%s" % (aspectratio) print "(p) Mencoder passes:\t%s" % (passes) ! print "(h) PDA mode:\t\t%s" % (pda) ! print "(c) Video codec:\t%s" % (codec) print "" print "(s) Save settings to config file" *************** *** 258,261 **** --- 263,268 ---- elif choice == 'h': self.changePDAMode() + elif choice == 'c': + self.changeVideoCodec() elif choice == 's': self.saveSettings() *************** *** 332,336 **** self.config['passes'] = choice self.main("settings") ! def changePDAMode(self): print output.bold("\nPDA Mode: (yes/no):") --- 339,343 ---- self.config['passes'] = choice self.main("settings") ! def changePDAMode(self): print output.bold("\nPDA Mode: (yes/no):") *************** *** 348,352 **** self.config['pdamode'] = 0 self.main("settings") ! def saveSettings(self): --- 355,372 ---- self.config['pdamode'] = 0 self.main("settings") ! ! def changeVideoCodec(self): ! print output.bold("\nVideo Codec: (0 = DivX, 1 = XviD):") ! try: ! choice = raw_input("> ") ! except KeyboardInterrupt: ! print output.bold("\n\nExiting...") ! sys.exit(2) ! if choice not in ['0', '1']: ! print output.bold("Invalid option!") ! self.changeVideoCodec() ! self.config['videocodec'] = int(choice) ! self.main("settings") ! def saveSettings(self): *************** *** 357,364 **** --- 377,386 ---- self.parser.set('paths', 'tcprobe', self.config['tcprobe']) self.parser.set('paths', 'outputdir', self.config['outputdir']) + self.parser.set('paths', 'dvd_device', self.config['dvd_device']) 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')) print "* Completed" Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** dvd.py 17 Jul 2003 13:12:14 -0000 1.23 --- dvd.py 24 Jul 2003 14:13:26 -0000 1.24 *************** *** 78,81 **** --- 78,87 ---- 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) *************** *** 122,125 **** --- 128,132 ---- parser.set("mencoder", "passes", 3) parser.set("mencoder", "pdamode", 0) + parser.set("mencoder", "videocodec", 0) parser.write(open(self.configfile, 'w')) *************** *** 316,322 **** lameopts = "".join(["cbr=", str(self.track['abr']), str(self.vol)]) ! ovc = "lavc" ! ovc_opts = "-lavcopts" ! lavcopts = "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr']))]) vop = "".join(["scale,crop=",self.track['crop']]) --- 323,334 ---- 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']]) *************** *** 326,330 **** 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, lavcopts, "-vop", vop, "-zoom", \ "-xy", resolution, "-o", self.output, "2>/dev/null"] --- 338,342 ---- 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"] *************** *** 345,365 **** # sys.exit(1) - # Uncomment to test command - #string = "" - #for bit in all_pass: - #bit = "".join([" ", bit]) - #string = "".join([string, bit]) - #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", 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, lavcopts, "-vop", vop, "-zoom", "-xy", resolution, \ "-o", self.output, "2>/dev/null"] --- 357,369 ---- # 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"] *************** *** 394,406 **** 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", 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, "".join([lavcopts, ":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, "".join([lavcopts, ":vpass=2"]), "-vop", vop, \ "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] --- 398,410 ---- 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"] Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** gui.py 17 Jul 2003 13:12:14 -0000 1.14 --- gui.py 24 Jul 2003 14:13:26 -0000 1.15 *************** *** 26,29 **** --- 26,30 ---- from guimain import MainWindow from guisettings import dialogSettings + from guiprogressdialogue import dialogueProgress # QuickRip global configuration. *************** *** 39,44 **** - - class GUI(DVD, MainWindow): """GUI-specific functions to add a Qt GUI to the DVD class: --- 40,43 ---- *************** *** 134,139 **** self.Dialogue.pm_videoPass1.setProgress(-1) self.Dialogue.pm_videoPass2.setProgress(-1) ! self.Dialogue.rippingXofY.setText("Ripping " + name + " (" + str(number) + " of " + str(total) + ")") ! def int_newPass(self, passtype): self.passtype = passtype --- 133,138 ---- 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 *************** *** 205,208 **** --- 204,208 ---- 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']) *************** *** 286,292 **** # print "\n***Unable to change to directory", qr_dir, "\n(", msg, ")\n" import output ! print output.bold("DEVELOPER: UNCOMMENT THE CHDIR CODE! (LINE 284, GUI.PY)") ! ! from guiprogressdialogue import dialogueProgress self.state = "stopped" --- 286,290 ---- # 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" *************** *** 353,357 **** self.ripDVD() elif self.state is "ripping": ! print "* Ripping finished" self.Dialogue.rippingXofY.setText("Waiting to start...") try: --- 351,355 ---- self.ripDVD() elif self.state is "ripping": ! print "* Ripping aborted" self.Dialogue.rippingXofY.setText("Waiting to start...") try: *************** *** 390,393 **** --- 388,392 ---- 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) *************** *** 467,470 **** --- 466,470 ---- 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 *************** *** 483,486 **** --- 483,487 ---- 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 *************** *** 496,499 **** --- 497,501 ---- 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')) Index: guisettings.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guisettings.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** guisettings.py 17 Jul 2003 10:41:22 -0000 1.7 --- guisettings.py 24 Jul 2003 14:13:26 -0000 1.8 *************** *** 3,7 **** # Form implementation generated from reading ui file 'ui/guisettings.ui' # ! # Created: Thu Jul 17 11:16:50 2003 # by: The PyQt User Interface Compiler (pyuic) 3.6 # --- 3,7 ---- # Form implementation generated from reading ui file 'ui/guisettings.ui' # ! # Created: Thu Jul 24 12:57:03 2003 # by: The PyQt User Interface Compiler (pyuic) 3.6 # *************** *** 305,326 **** dialogSettingsLayout = QGridLayout(self,1,1,12,6,"dialogSettingsLayout") - layout2 = QHBoxLayout(None,0,6,"layout2") - - self.b_Save = QPushButton(self,"b_Save") - self.b_Save.setIconSet(QIconSet(self.image1)) - layout2.addWidget(self.b_Save) - spacer = QSpacerItem(170,20,QSizePolicy.Expanding,QSizePolicy.Minimum) - layout2.addItem(spacer) - - self.b_OK = QPushButton(self,"b_OK") - self.b_OK.setIconSet(QIconSet(self.image2)) - layout2.addWidget(self.b_OK) - - self.b_Cancel = QPushButton(self,"b_Cancel") - self.b_Cancel.setIconSet(QIconSet(self.image3)) - layout2.addWidget(self.b_Cancel) - - dialogSettingsLayout.addLayout(layout2,2,0) - self.groupBox1 = QGroupBox(self,"groupBox1") self.groupBox1.setSizePolicy(QSizePolicy(5,1,0,0,self.groupBox1.sizePolicy().hasHeightForWidth())) --- 305,308 ---- *************** *** 414,425 **** groupBox2Layout.addWidget(self.l_aspectRatio,0,2) - self.aspectRatio = QComboBox(0,self.groupBox2,"aspectRatio") - - groupBox2Layout.addWidget(self.aspectRatio,0,3) - - self.c_pdamode = QCheckBox(self.groupBox2,"c_pdamode") - - groupBox2Layout.addWidget(self.c_pdamode,1,2) - self.l_deinterlacing = QLabel(self.groupBox2,"l_deinterlacing") self.l_deinterlacing.setSizePolicy(QSizePolicy(5,0,0,0,self.l_deinterlacing.sizePolicy().hasHeightForWidth())) --- 396,399 ---- *************** *** 436,439 **** --- 410,417 ---- groupBox2Layout.addWidget(self.l_Passes,1,0) + self.c_pdamode = QCheckBox(self.groupBox2,"c_pdamode") + + groupBox2Layout.addWidget(self.c_pdamode,2,0) + self.encoderPasses = QComboBox(0,self.groupBox2,"encoderPasses") self.encoderPasses.setSizePolicy(QSizePolicy(1,0,0,0,self.encoderPasses.sizePolicy().hasHeightForWidth())) *************** *** 441,449 **** groupBox2Layout.addWidget(self.encoderPasses,1,1) dialogSettingsLayout.addWidget(self.groupBox2,1,0) self.languageChange() ! self.resize(QSize(521,408).expandedTo(self.minimumSizeHint())) self.clearWState(Qt.WState_Polished) --- 419,457 ---- groupBox2Layout.addWidget(self.encoderPasses,1,1) + self.textLabel1_2 = QLabel(self.groupBox2,"textLabel1_2") + + groupBox2Layout.addWidget(self.textLabel1_2,1,2) + + self.aspectRatio = QComboBox(0,self.groupBox2,"aspectRatio") + + groupBox2Layout.addWidget(self.aspectRatio,0,3) + + self.videoCodec = QComboBox(0,self.groupBox2,"videoCodec") + + groupBox2Layout.addWidget(self.videoCodec,1,3) + dialogSettingsLayout.addWidget(self.groupBox2,1,0) + layout2 = QHBoxLayout(None,0,6,"layout2") + + self.b_Save = QPushButton(self,"b_Save") + self.b_Save.setIconSet(QIconSet(self.image1)) + layout2.addWidget(self.b_Save) + spacer = QSpacerItem(170,20,QSizePolicy.Expanding,QSizePolicy.Minimum) + layout2.addItem(spacer) + + self.b_OK = QPushButton(self,"b_OK") + self.b_OK.setIconSet(QIconSet(self.image2)) + layout2.addWidget(self.b_OK) + + self.b_Cancel = QPushButton(self,"b_Cancel") + self.b_Cancel.setIconSet(QIconSet(self.image3)) + layout2.addWidget(self.b_Cancel) + + dialogSettingsLayout.addLayout(layout2,2,0) + self.languageChange() ! self.resize(QSize(519,436).expandedTo(self.minimumSizeHint())) self.clearWState(Qt.WState_Polished) *************** *** 461,470 **** def languageChange(self): self.setCaption(self.tr("Configuration - QuickRip")) - self.b_Save.setText(self.tr("&Save settings","g")) - self.b_Save.setAccel(self.tr("Alt+S")) - self.b_OK.setText(self.tr("&OK","g")) - self.b_OK.setAccel(self.tr("Alt+O")) - self.b_Cancel.setText(self.tr("&Cancel","g")) - self.b_Cancel.setAccel(self.tr("Alt+C")) self.groupBox1.setTitle(self.tr("&Paths")) self.l_tcprobe.setText(self.tr("&Tcprobe:")) --- 469,472 ---- *************** *** 505,518 **** self.groupBox2.setTitle(self.tr("Me&ncoder Options")) self.l_aspectRatio.setText(self.tr("As&pect ratio:")) - self.aspectRatio.clear() - self.aspectRatio.insertItem(self.tr("Default")) - self.aspectRatio.insertItem(self.tr("4:3")) - self.aspectRatio.insertItem(self.tr("16:9")) - self.aspectRatio.insertItem(self.tr("2.35:1")) - QToolTip.add(self.aspectRatio,self.tr("Aspect ratio of video")) - QWhatsThis.add(self.aspectRatio,self.tr("The aspect ratio of the video. Change if the output appears stretched. \n" - "DVDs have aspect ratios printed on their cases.")) - self.c_pdamode.setText(self.tr("&PDA mode")) - self.c_pdamode.setAccel(self.tr("Alt+P")) self.l_deinterlacing.setText(self.tr("&De-Interlacing:")) self.deInterlacing.clear() --- 507,510 ---- *************** *** 525,528 **** --- 517,522 ---- QWhatsThis.add(self.deInterlacing,self.tr("De-Interlacing options. For more information on de-interlacing consult the QuickRip and Mplayer documentation.")) self.l_Passes.setText(self.tr("&Encoder passes:")) + self.c_pdamode.setText(self.tr("&PDA mode")) + self.c_pdamode.setAccel(self.tr("Alt+P")) self.encoderPasses.clear() self.encoderPasses.insertItem(self.tr("Default")) *************** *** 530,532 **** --- 524,547 ---- self.encoderPasses.insertItem(self.tr("Two Pass")) self.encoderPasses.insertItem(self.tr("Three Pass")) + self.textLabel1_2.setText(self.tr("Video codec:")) + self.aspectRatio.clear() + self.aspectRatio.insertItem(self.tr("Default")) + self.aspectRatio.insertItem(self.tr("4:3")) + self.aspectRatio.insertItem(self.tr("16:9")) + self.aspectRatio.insertItem(self.tr("2.35:1")) + QToolTip.add(self.aspectRatio,self.tr("Aspect ratio of video")) + QWhatsThis.add(self.aspectRatio,self.tr("The aspect ratio of the video. Change if the output appears stretched. \n" + "DVDs have aspect ratios printed on their cases.")) + self.videoCodec.clear() + self.videoCodec.insertItem(self.tr("DivX")) + self.videoCodec.insertItem(self.tr("XviD")) + QToolTip.add(self.videoCodec,self.tr("Aspect ratio of video")) + QWhatsThis.add(self.videoCodec,self.tr("The aspect ratio of the video. Change if the output appears stretched. \n" + "DVDs have aspect ratios printed on their cases.")) + self.b_Save.setText(self.tr("&Save settings","g")) + self.b_Save.setAccel(self.tr("Alt+S")) + self.b_OK.setText(self.tr("&OK","g")) + self.b_OK.setAccel(self.tr("Alt+O")) + self.b_Cancel.setText(self.tr("&Cancel","g")) + self.b_Cancel.setAccel(self.tr("Alt+C")) |
From: <te...@us...> - 2003-07-22 17:12:59
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv30795 Modified Files: install.sh Added Files: quickrip.1.gz Log Message: Added online manual page for QuickRip, for those who might look for help with "man quickrip". --- NEW FILE: quickrip.1.gz --- (This appears to be a binary file; contents omitted.) Index: install.sh =================================================================== RCS file: /cvsroot/quickrip/quickrip/install.sh,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** install.sh 11 May 2003 21:44:25 -0000 1.3 --- install.sh 22 Jul 2003 17:12:56 -0000 1.4 *************** *** 50,54 **** echo Changing to root to install files ! su -c "mkdir -p /usr/share/quickrip && cp *.py README LICENSE quickriprc /usr/share/quickrip && chmod a+x /usr/share/quickrip/quickrip.py && ln -sf /usr/share/quickrip/quickrip.py /usr/bin/quickrip" echo --- 50,54 ---- echo Changing to root to install files ! su -c "mkdir -p /usr/share/quickrip && cp *.py README LICENSE quickriprc /usr/share/quickrip && chmod a+x /usr/share/quickrip/quickrip.py && ln -sf /usr/share/quickrip/quickrip.py /usr/bin/quickrip && cp quickrip.1.gz /usr/man/man1" echo *************** *** 56,58 **** echo If you have any problems using QuickRip, please echo contact me and I\'ll see if I can help. Feel free ! echo to use the icons provided in the "icons" directory. --- 56,58 ---- echo If you have any problems using QuickRip, please echo contact me and I\'ll see if I can help. Feel free ! echo to use the icons provided in the "icons" directory. \ No newline at end of file |
From: <te...@us...> - 2003-07-17 13:12:22
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv370 Modified Files: cli.py dvd.py gui.py guimain.py Log Message: Cleaned up DVD ripping code, especially DVD.ripDVD() method. All QuickRip functions should now be working with the new features (ETA, new GUI, select dvd device, select bitrate) Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** cli.py 17 Jul 2003 10:41:22 -0000 1.13 --- cli.py 17 Jul 2003 13:12:14 -0000 1.14 *************** *** 500,511 **** 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 ! Found audio languages %s ! Found subtitle languages %s ! """ % (self.numtitles, self.alangs, self.slangs) def int_dispTrack(self, track): --- 500,506 ---- def int_dispDVD(self): ! print "Found %s titles" % (self.numtitles) ! print "Found audio languages %s" % (self.alangs) ! print "Found subtitle languages %s" % (self.slangs) def int_dispTrack(self, track): *************** *** 544,548 **** self.n = 0 ! def int_updateProgress(self, perc, tpass): for opt in sys.argv: if opt in ['-a', '--autoresize']: --- 539,543 ---- self.n = 0 ! def int_updateProgress(self, perc, trem, tpass): for opt in sys.argv: if opt in ['-a', '--autoresize']: Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** dvd.py 17 Jul 2003 10:41:22 -0000 1.22 --- dvd.py 17 Jul 2003 13:12:14 -0000 1.23 *************** *** 199,203 **** for i in range(int(self.numtitles) + 1): if i > 0: ! cmd_tcprobe = "".join([str(self.config['tcprobe']), " -i ", self.config['dvd_device'] + " -T ", str(i) + " 2>&1"]) text = os.popen(cmd_tcprobe).readlines() del cmd_tcprobe --- 199,203 ---- 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 *************** *** 269,273 **** self.torip.append(track) self.numrips = len(self.torip) ! # Check PDA mode (universal to all ripping methods) if int(self.config['pdamode']) == 0: --- 269,273 ---- self.torip.append(track) self.numrips = len(self.torip) ! # Check PDA mode (universal to all ripping methods) if int(self.config['pdamode']) == 0: *************** *** 312,349 **** self.track['crop'] = common_crop - pipe_perc = re.compile('.*f \((.\d)\%\)*') - pipe_Trem = re.compile('(?P<int>[0-9]+)min') - perc = 0 - Trem = 0 - # Clean up output dir in case QuickRip crashed out there os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) ! if self.config['passes'] is 1: ! all_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, "-oac", "mp3lame", "-lameopts", "cbr=" + str(self.track['abr']) + str(self.vol), "-ovc", "lavc", "-lavcopts", "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr']))]), "-vop", "".join(["scale,crop=", self.track['crop']]), "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['deinterlacing']) is 1: ! all_pass[14] = "".join([all_pass[14], ",dint"]) ! if int(self.config['deinterlacing']) is 2: ! all_pass[14] = "".join([all_pass[14], ",il"]) ! if int(self.config['deinterlacing']) is 3: ! all_pass[14] = "".join([all_pass[14], ",lavcdeint"]) ! if int(self.config['deinterlacing']) is 4: ! all_pass[14] = "".join([all_pass[14], ",pp=lb"]) ! if int(self.config['aspectratio']) is 1: ! all_pass.insert(3, "-aspect") ! all_pass.insert(4, "4:3") ! if int(self.config['aspectratio']) is 2: ! all_pass.insert(3, "-aspect") ! all_pass.insert(4, "16:9") ! if int(self.config['aspectratio']) is 3: all_pass.insert(3, "-aspect") ! all_pass.insert(4, "2.35") if self.sLanguage is not "None": all_pass.insert(3, "-slang") all_pass.insert(4, self.sLanguage) ! # Uncomment to test command #string = "" --- 312,348 ---- 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)]) ! ovc = "lavc" ! ovc_opts = "-lavcopts" ! lavcopts = "".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, lavcopts, "-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 string ! # sys.exit(1) ! # Uncomment to test command #string = "" *************** *** 354,402 **** #sys.exit(1) ! self.int_newPass("audio") ! self.pipe = popen2.Popen4(all_pass) ! 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, "audio") ! os.waitpid(pid, os.WNOHANG) 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", "".join(["cbr=", str(self.track['abr']), str(self.vol)]), "-ovc", "frameno", "-o", "".join([self.outdir, "frameno.avi"]), "2>/dev/null"] ! video_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-sws", "2", "-oac", "copy", "-ovc", "lavc", "-lavcopts", "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr']))]), "-vop", "".join(["scale,crop=", self.track['crop']]), "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! ! if int(self.config['deinterlacing']) is 1: ! video_pass[12] = "".join([video_pass[12], ",dint"]) ! if int(self.config['deinterlacing']) is 2: ! video_pass[12] = "".join([video_pass[12], ",il"]) ! if int(self.config['deinterlacing']) is 3: ! video_pass[12] = "".join([video_pass[12], ",lavcdeint"]) ! if int(self.config['deinterlacing']) is 4: ! video_pass[12] = "".join([video_pass[12], ",pp=lb"]) ! if int(self.config['aspectratio']) is 1: ! video_pass.insert(3, "-aspect") ! video_pass.insert(4, "4:3") ! if int(self.config['aspectratio']) is 2: ! video_pass.insert(3, "-aspect") ! video_pass.insert(4, "16:9") ! if int(self.config['aspectratio']) is 3: video_pass.insert(3, "-aspect") ! video_pass.insert(4, "2.35") if self.sLanguage is not "None": - audio_pass.insert(3, "-slang") - audio_pass.insert(4, self.sLanguage) video_pass.insert(3, "-slang") video_pass.insert(4, self.sLanguage) ! ! # # Uncomment to test command # string1 = "" --- 353,375 ---- #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", 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, lavcopts, "-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 = "" *************** *** 412,450 **** # sys.exit(1) ! self.int_newPass("audio") ! self.pipe = popen2.Popen4(audio_pass) ! 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, "audio") ! os.waitpid(pid, os.WNOHANG) ! ! # 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 ! ! perc = 0 ! self.int_newPass("video1") ! self.pipe = popen2.Popen4(video_pass) ! pid = self.pipe.pid ! while 1: ! line = self.pipe.fromchild.readline() ! 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, "video1") ! os.waitpid(pid, os.WNOHANG) os.popen("rm divx2pass.log 2>/dev/null") --- 385,390 ---- # sys.exit(1) ! self.runPass("audio", audio_pass) ! self.runPass("video1", video_pass) os.popen("rm divx2pass.log 2>/dev/null") *************** *** 453,493 **** elif self.config['passes'] is 3: ! audio_pass = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-alang", self.aLanguage, "-oac", "mp3lame", "-lameopts", "cbr=" + str(self.track['abr']) + str(self.vol), "-ovc", "frameno", "-o", self.outdir + "frameno.avi", "2>/dev/null"] ! video_pass1 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-sws", "2", "-oac", "copy", "-ovc", "lavc", "-lavcopts", "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr'])), ":vpass=1"]), "-vop", "".join(["scale,crop=", self.track['crop']]), "-zoom", "-xy", resolution, "-o", "/dev/null", "2>/dev/null"] ! video_pass2 = [str(self.config['mencoder']), "-dvd", str(self.track['id']), "-sws", "2", "-oac", "copy", "-ovc", "lavc", "-lavcopts", "".join(["vcodec=mpeg4:vhq:vbitrate=", str(int(self.track['vbr'])), ":vpass=2"]), "-vop", "".join(["scale,crop=", self.track['crop']]), "-zoom", "-xy", resolution, "-o", self.output, "2>/dev/null"] ! if int(self.config['deinterlacing']) is 1: ! video_pass1[12] = "".join([video_pass1[12], ",dint"]) ! video_pass2[12] = "".join([video_pass2[12], ",dint"]) ! if int(self.config['deinterlacing']) is 2: ! video_pass1[12] = "".join([video_pass1[12], ",il"]) ! video_pass2[12] = "".join([video_pass2[12], ",il"]) ! if int(self.config['deinterlacing']) is 3: ! video_pass1[12] = "".join([video_pass1[12], ",lavcdeint"]) ! video_pass2[12] = "".join([video_pass2[12], ",lavcdeint"]) ! if int(self.config['deinterlacing']) is 4: ! video_pass1[12] = "".join([video_pass1[12], ",pp=lb"]) ! video_pass2[12] = "".join([video_pass2[12], ",pp=lb"]) ! if int(self.config['aspectratio']) is 1: ! video_pass1.insert(3, "-aspect") ! video_pass1.insert(4, "4:3") ! video_pass2.insert(3, "-aspect") ! video_pass2.insert(4, "4:3") ! if int(self.config['aspectratio']) is 2: ! video_pass1.insert(3, "-aspect") ! video_pass1.insert(4, "16:9") ! video_pass2.insert(3, "-aspect") ! video_pass2.insert(4, "16:9") ! if int(self.config['aspectratio']) is 3: video_pass1.insert(3, "-aspect") ! video_pass1.insert(4, "2.35") video_pass2.insert(3, "-aspect") ! video_pass2.insert(4, "2.35") if self.sLanguage is not "None": - audio_pass.insert(3, "-slang") - audio_pass.insert(4, self.sLanguage) video_pass1.insert(3, "-slang") video_pass1.insert(4, self.sLanguage) --- 393,415 ---- 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", 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, "".join([lavcopts, ":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, "".join([lavcopts, ":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) *************** *** 495,558 **** video_pass2.insert(4, self.sLanguage) ! # Uncomment to check the commands look valid ! #print audio_pass ! #print video_pass1 ! #self.int_finishRipping() ! ! self.int_newPass("audio") ! self.pipe = popen2.Popen4(audio_pass) ! 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, "audio") ! os.waitpid(pid, os.WNOHANG) ! ! # 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 ! ! perc = 0 ! self.int_newPass("video1") ! self.pipe = popen2.Popen4(video_pass1) ! pid = self.pipe.pid ! while 1: ! line = self.pipe.fromchild.readline() ! 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, "video1") ! os.waitpid(pid, os.WNOHANG) ! ! # 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 ! ! perc = 0 ! self.int_newPass("video2") ! self.pipe = popen2.Popen4(video_pass2) ! while 1: ! line = self.pipe.fromchild.readline() ! 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, "video2") ! os.popen("rm divx2pass.log 2>/dev/null") os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) --- 417,424 ---- 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"])) *************** *** 562,594 **** ! ## 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 --- 428,487 ---- ! 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.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** gui.py 17 Jul 2003 10:41:22 -0000 1.13 --- gui.py 17 Jul 2003 13:12:14 -0000 1.14 *************** *** 64,67 **** --- 64,69 ---- 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() *************** *** 120,124 **** def int_startRipping(self): print "* Starting ripping" - self.openRipDialogue() def int_newTrack(self, name, number, total, vbr): --- 122,125 ---- *************** *** 147,151 **** self.trem = trem self.tpass = tpass ! self.Dialogue.ETA.setText(str(trem)) if self.tpass is "all": self.Dialogue.pm_audioPass.setProgress(int(perc)) --- 148,153 ---- 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)) *************** *** 171,174 **** --- 173,177 ---- 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) Index: guimain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guimain.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** guimain.py 16 Jul 2003 13:23:20 -0000 1.3 --- guimain.py 17 Jul 2003 13:12:14 -0000 1.4 *************** *** 3,7 **** # Form implementation generated from reading ui file 'ui/guimain.ui' # ! # Created: Fri Jul 11 16:29:54 2003 # by: The PyQt User Interface Compiler (pyuic) 3.6 # --- 3,7 ---- # 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 [...2423 lines suppressed...] self.connect(self.outputDir,SIGNAL("textChanged(const QString&)"),self.checkEnableRip) self.connect(self.fileSize,SIGNAL("valueChanged(int)"),self.newFileSize) *************** *** 1673,1679 **** print "MainWindow.scanDVD(): Not implemented yet" - def ripDVD(self): - print "MainWindow.ripDVD(): Not implemented yet" - def checkEnableRip(self,a0): print "MainWindow.checkEnableRip(const QString&): Not implemented yet" --- 1631,1634 ---- *************** *** 1705,1706 **** --- 1660,1664 ---- def newAudioBitrate(self): print "MainWindow.newAudioBitrate(): Not implemented yet" + + def openRipDialogue(self): + print "MainWindow.openRipDialogue(): Not implemented yet" |
From: <te...@us...> - 2003-07-17 13:12:21
|
Update of /cvsroot/quickrip/quickrip/ui In directory sc8-pr-cvs1:/tmp/cvs-serv370/ui Modified Files: guimain.ui guisettings.ui Log Message: Cleaned up DVD ripping code, especially DVD.ripDVD() method. All QuickRip functions should now be working with the new features (ETA, new GUI, select dvd device, select bitrate) Index: guimain.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/ui/guimain.ui,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** guimain.ui 14 Jul 2003 17:28:45 -0000 1.2 --- guimain.ui 17 Jul 2003 13:12:14 -0000 1.3 *************** *** 746,750 **** <images> <image name="image0"> ! <data format="XPM.GZ" length="82646">789cedbd5973eb38b3ae79bf7fc5171b773b3a706c4bb2a538d117923ccaf328db1d7d4110e03c48b664cbeee8ff7e4066264c52942cd9abaa5655b9102aaf479c4020f1221300a9fff53fffb9bf38fdcffffcafff7a9e5813dffe8fed594ffff91f398de3b7ffe7fffdbfffbffffaefc656e33f9b1b1bffd9ccfeb7f5dfffd77ffd37b7fe63ffe72c4d540eac08130d6c23ff2f633936dcceb7ef233761bbb381dcc6eded9cdb743cbf369c6fb786c878bc151bceb73b3e721b8f3f309c6f677d641bf77f04dedcd884fc4ac3909ff78c373ff29f12c3feac8b8cd7170e316cb7dbc8981f161886f345c4b0bf4fdb6dd83f3a370cf99f12c3fece0ef02696176b13c376ae90313fbc9773dbe4ffca707efe680719ef8787c4b87fcb70be3d7945c6fbf3cf0c437e9bc478fc2532de1f6b1886eb05c4b07fb80b4cf767bd1b067bb09131bf8920c6fb7d309c6f4f9f91313ffcd070be5dd1f9db5bf976d145b6d11e46196f6d5079f12e329e9f6d13c3f1ec0919cfcf0e89617b4cdbf1fe7d9b18f2a71cc370bf97c0e6fedf8861ffa0818cedc3ee1986fdaf88b13ec686e1fa5364ac4fb96138dfee3e10c3f1628718ee271d22e3fda477c478bd0f86f2bb2586e3a35de02dbc9f24360ce577420cfbdb1dc39d7c7b888ce51f5f126fe7cac578ce1d2a7f7604bc49e76b226379d923626c6fb786f3edd26c87e3936b642c2f7b400cc7bbfb86c1de2431e43f3a46c6f6a15e0cc3f94e89b1be63c3503f11f016b617971986ed3d62ac8f0bc350ffe7c4703fca369ce72fee20d3fdef13637b9919cef74f5d64bc5fee10c3f6b08b8cf56f1d1986ed583e0dddc0f2f3e7e76b6c527da91632e9ed03311c6f27c858fe6a6618ca5f1163f94f90b1bc033a1ecb5bf60d43793d015379dbca30e8e93e31b6979e61a8cf6362b81f87b663fb75f70c43fb8d88e17cf19661e87f3688e17cde1b32b6e7f0c070be7f2c89d1be3d6238deef1986f2b191f1fe059d8fdaef93e17c7f3e266ee4f597e0f10dbcfff494188e0f1e0cc3f1f7c4703cc3f26d3481656eff0dd3be62cf30946f0319ebcf5786a1bf0881a9bee22362d8eeed21637d045b86e1feaf88b13d99ed787e458cf53b45c6fa881cc3f9fe21e507cbdf7942463d482e88d1de2f0d437e6262d463286fdd7ee0fcea8218ed796018fca15762287f498cf7970ac3a027c7c4b0bf382586fae1cf86a13d9f21e3fd456d62dcbf6f18ea1fcbbf61035b1d62d083e0d6b095e737bf5ed3b4d778d330dc5f1fd8b4c7a16168afcfc490bff00119ef5f0ac370ff17c8686ff10899eaebca30d8d321315e7f6c18ea27046ea09e781f0cf97f23463d3b4746fb54a961d0af1b62ccffcc30d8e70e31da8b838cf5235f88a17ed247646cdfe98418b68b7bc3d01f8f88a1be2c2ccf26ea79b26138afbfb8898cf6c31262d83f1c1bcef777727fb16951fd890764bc3ffb8418fb8b3764d2078b18ef9f2363fd857d62283f6f0b98eac73d20467b9821637d789218fd831362d4af0b64d283d430e8e38018ebef1119ed29d926c6fef39918ceefe1fd34c9be6362b4ef63c3509ffbc4707c2088a1fc25965f13dbbb6711c3fe7e6438df1e0c88b1ffbe359cd75fe023637b4fdf89d15e0686f3fdc31632da573a2686fdd9ab61b027ca9fddcafd3f3fafcfd69669bf3131dabb858cf6217689518fef90b1bcc526b0a9df5d62288fe81019eb37de350cfdb92086e3dd2932da9f776518ea3b21c6fc1f0137d11ed50331c60bc7c8581f2943267bef1343f945787f54be7e8318dbdfabe1bc7cc50d31946f38026ea1bd8496e17c7f268971ff01720bf7ef19cef7e73131ec6f2586c17e727b6859e49f48868cf513268661bb0d4cfe866820637d877bc8e47f6f11a33f40c7e3f915949745e59f4c0c43fbf589513f6e0d43fd4862cccf85e13cbfea0c99c63b1831d857dc47467d482dc3d01fdd13637d9f1886f3837d582d6aff3362a80ff7ce705ede0af34ff5653f1343fd38aee17c7ffb0ab903db596418da33de6f4ba27dbc10c3769ef7f7db5b269e3e40a6f8f91998e2dfe40e19db9b9b12a37e1e1806ff9d21d378d01e31c69b03e0ad0d881fa5878cf1a4da406e038b7360b2afb06118fc970019efc74e0de7db13cc1fd98bfd448cfe528318f51d8f27fb48ce0d833e8c88e1fc0e1d4fe5d346467b4f1362f467f17cad0dd083c845c6fa617bc470ffe925f0f6266eb78971fb836168bf581edb682f6c428ce5bd6338df9ee4f1e2b645f19ebf6718ea93b693fd3f02937fe03ac4683f77c8585ee116318e3f0d916dcc4fcf30d837d4bfd613bc9f6d64ac5febda30d47f1f19db9fc0fc913fe5d3fed87fa70a98ead76f2363fdd917c478bdd0707e3e77480ce753fbc858dfb16318e2799f18e367418cfec01531b4570fea4beb039c4fec11a3bfbf83dc427b03fbb2c83ee24364d20f6118fcf95b621cbf79370cc7637eb7515fa2aee17cfb4811c3f1fcdc30e80bd6ffb60476ee89771a79f99f01ef6cee883c3fb97fbad3207d884f89b13df781c9bed81019ed293a43267f6fcb30f42f1131daeb1b328dffcc801b4dc89f0890b1be938818eacbdd2486fd2d1f19eb5720537f63ef11c3f1ce0132f637c90b32e9c33d31daf70631fa3f783cd987171806bdc5f224fbb0c7c4e87fdc207750df5ac812cf7f0dbc8dfa13f50c83fdb8c470ff0196cfce26d84be011a37d24c4b0bf8df7b7d3020e6f0ce7f620a03e05f987d11419eb4bb489b13f80eb0b8ae7d21131c6230e32f62f718a4ce3315bc8a83fec8618f26341fd09539fafc4b81d8f273d70ae80a9ffb7317fbafc617b0b19cbdf7f360cf99f12833d583362ec9f8825b67fa80fb1dd42fbbb46a6f6cb8177b07dbb5d62c87fda41c6f61b4f88b1bede0ce7fb47b43ff55729316ec7fbd3cd0dea33f78fda0dea2f8263641aefdc25c6fa90c8583f1e1e4ff161b46918faa737641acf3b24c6fe4b20a33e38a7c4185f10a33d8d1ce06613ed31256ee7e5113591b1fdb37d62d86e9d2393be1f1806ff908eb7a17c7cbc7ff2cf7dcc0fd9877a25c6f8f60e19ebdf3f300ce5d92046bdc2f2d8dec4f136858cfae0617e7724e43fc5f26d637b8d63c3797e99430cfbcba9e17c7bcc90d1be181ddfc2f36f18ceb7db70ffa6bddb2d64ac0f07f227a8fe421b19fb5b471986f69312637f02f623289e08af89d1bf3f4646fd4fbbc818bfa90362681f698f18db8f878cf15cfa448cf6901acef74f2ce0d6066e1f1b86f2c0eb51fd2550de82ea2f79330cf67e478cf1cb0b32d66f1a1986fd2d62b4472c9f6db2b753c3d09fdc20a3bdd9b7c03b58df29d8a768a39ea75b86f3edce2531dac70c19f526b827c6f6661363791d2163ffc3cf8861bbea12779a394f803b983f272486ed71de7f749a646f6a1b19ed2d38310c7a3a05a678c3de2786fec4ea22d378f421316c77cf90a9bf62c0648fc18561b0df03621c6f8d9051dfd237e016f63f02f343f5efbf23637ddb3131ea41cb30dcdf0b318e177064b487e083217edb2486e33d818cf6e148e01db457764d0ce5cf76915bc02361d8ceebbb878cf51f2a62d82eb07cb57de4f6e660fedbe88f8457c4b03d1e10c3f5d2267007f58bfbc4b03d1a22a3bd0a8b18b63b23c3797e82dcbe3b36c5a7729b18e39b16328de74f88617b780fdc44ffdec6e39b14efb40d43fcd12446fbba340cfdfb2b32e9e5866168cf3631ea1f94a74df56d9d10a3bd9c1a8678f50119eb3b191a06fb7824c6f1ca1930d983cf0d833fde2086fae33bc450bef12d32ea599812a3bfc690d13ee2376489eb111e89617be401b7e9fcd07e6daaefe09518eb178fefa03f14dbc4b03fbf2086fd199ebf83d75360dfb685d74bf2fec66a923dc88818f5a4854cf1c78c18dbf726b0890f9f80a9bc93363095b7a58871bee78018dabb1f2363f9462f86c1df8e88e17867804cfeebcc308ca75e1243fb52f7c8682fe936701bdb5be81986f63d22b6a03de2f9a8ffe02e316c7725720778c4803bd83fc409315ccfbe2186fdc367608bf4c92286ed1cf7b7f07ab66b38cfaf95eb9965537d394362f4d7f688b17e7b8673fbb59ac814ef5d10c3f1568318f6573eb08927f70d83be3c13a3bf728f4cf367783db21fffde30e8c33632da8382f2d7ed19fdfd6362b87f1fcacbb46fb56b18fcd13631ea4d6c18faa71d62e8cf8209319c3fc2fcedb4703e6f400cf6ebbd22a33da62f86c1df392586fd9dd8308c4f3062d463da1fed55b9c4b0bf8be5dbc6fbf51264b4cf749718f5e616b983fec51e31ec3f0a88d1bea686419f1e90a9ffda2186fd456238dfdfc3fc933d3b0e32d9efb561c81fda9b65617c2388d1fea5e17cffb083ac607fd62386edf623b1c88ff7f3fc8a26d9b36a00ebf8393fde3d016e617f19ee23637d4647c8581fe123b0e93f9e88c1fe5d458cf1ec3532c53b0d62ec3f4364bc9ebd458cf36b9218ee27a5fd313fd18661c8cf3931ce47b8c438df678ec7786f024cf6148c0cc3f12fc478fc9661b0df33641a0fbc2786f85fed21e3fdb937c4a8bf747eeacf07c01d6c7f629b18ee3fbc4546fb6186b1be9bc0641fd18818da83ff400cfb3b17c0620bfbdb3e31da5f8318f66702791beba34dec6ce7f77b856c0999e73fef5f84a4f117ff1899e2e56b628cd7a1be25c55709e457927d2487c438ded541c6f38d3c626c2f5362c8af0a0ce7f94b70bba9ef5b629c0fe4c4b83f9e9feadbbf330cf1ae42a6fe796818c643697fac6f0fefbf43fabd490ce52f1de40e5cdf7a44c6fccb2eb085f953b85d6cc3f1d68818b607587ec242fdb38861fff4ca30e8894f0cc7c717c8a4371362cccf0db1ddcaef0ff7b7b78093dcbe74f746f77f0f4cfeaf3303a6f130ef8818fdbf3130d557b2894ce59d18063db82586ebcb77c3509f2e32e5676418fac790188e773830d557220d43ffdd4626bd1b2253fef07c16b6efe08d18cbef8818aee70ae416b09a225bc8cf86f3e3d92930d547f0420cfb473eb07677a0be6f88b1fff288e1787e450cc7076dc3b0fd18791bcbe78458e61ce7fa654b8a879d8818fde11b629c8fa5ed14cfa6c0a4dfec8c18fdb76d62d0bb04ea57b7579c6f94c470bdf80a99c6678e0cc3f8284326fbb94626ffd930948fed11a33d41f99af6ec0d0c833fcf88617fff0499ece5c930ccdf6d13c3feee2e32b59777625c3f7b874ce3d37dc3707f603f92ec25c0fb21ff216d10a37e0f88617fd52786fa75a0fea5d892f9f312ae056c63ffc06d62383e9c215bb8fd9218b647585f36f64ffc9418b68b5762b8bec2fccb2d6099979f6c51bc9c3c22537b3e23c6f93cdc9ffce7608718f5e70119eb471c03933fe0bf20933d0586419fb690a9fd770c437ebac4383fe420931eed1b86fab380c99e02dc9fe2e7b8478c7a302386f2f15ac8989f70d330f45fefc458de82188f7791317ffc8818ebe3c630d8830f6c61f9f26d6081f5a57a86f3fda31019f5846f11c3fed693e17cfff01c19ed29bc0326fb8ab0bcc89e02d730b457062cd1ff097d62f41fde88b13d2862c88f7f858cfd2d7b2686ede985e13cbf02ee4f6d533c04e5af683c20d94746fb7107c8e48f9f10433c68e1f16d8cc7d80332da9373448cf3438fc8345eb4410cdb6da87fd5c1fc840299f4e90019f333e2c4d8bfa6c858ff11e69fea7fe41263ffb14b0cfba7e7c42af727bd6764bcbee4c4b07f3246b670bd0c5edf52c023094cf6a4b03c8485feee2e31e667488cf90f90d17e5c9b18b63b74bc82fc4ab00f65a33dc77bc80ada6704f6a6c89ec20932fa67b12086fc8e7c62385f80f993d8ff8b3762bc1ed68f2e01f01fe9fc985f2befafd436d95b2a9169befa9c18edf10699c6a353c3d09fdd11c3fef10632c5331dc3d0ff6f0153bc2537813b38fee01d23d37cc92b31aecfa2fd717ec3c7fb21fdb226c450de92ce87f9114d62ec7f6f81c9beec8018edef11d942fbc7fbb314dab30d2cb07f9297c4d0fea32b601be327d12286f3072132d6b73822c6eb9f215bc0d12931c45b29e65fa27f17bf1a86fc24c470bc8de757787db6838cd7731e0ce7f6e25f20533c07f5a74c7dbbc858bf96438ceb5dcf0c433cd507a6fed35386613eea1999c6bf3c6288f7bc1b64d2433a1fc5fbfbc034bfe08e91c97e1831da5b1399fa634e8cfbdbc4389f718c4cf16b408cdb317fa477e10932de4f82fb93fd78602f4a6ca17f90226fe37a26dc9ffce974cf30f427efc816d457d846267f3f2286fae54f86f3fdd521b0dc024e6e89c1be38e65fe1f9f900198f77c6c4b0bfc8dbbbb34df56bed18ceeb37da46c6f2089e0cc37a810d64ac5faf6b18ca9bce4ff1c1b561e82faf80c9ff1697c8587f490399ec754a8ce325afc016fa57e12131fadf783f549fdeae61f09f86c4f87c1ce697f423d903a6fa0e9ac858df2e47c6fded436228dff81c59e17ceb13316e3f03a6f84c8d9049fff1fc54bf690b19db3f7b23c6fa27c6eb3b966127bf7f064cf6a02c62cc0f5ecfa1f1239718b6332c1f07af27b1fe1cbc9e97ebbde398f1933132d69f1713e3f300905f87ea3f181b86fac4fdc99f09ce0c83fd04c8e4af1f1a86f1ef0499fcf3b661e8df9e81a9fd271f0ce7df26c6f5358e61580f3044a6f1a581618827ee8971fd751f99faa79e61684ffbc4b85ef80499f4e7dd30ecff488cf63b01267bf53a8621fe3825c6f36379923dfb4786a17e66c4e09f385d64ccbfef1a86f2a4eb637ee31dc3f976be490cf6a8c0de1c9bf4f4d530b4f77b62d85f9e23637ebd17c390df3131d8af3c24c6e3e97c947fdf30d4d78818ebcb6cc7f558fbc4d09e039b18daa3fb4e0cedc11e1a86eb1363f9f823c3507e09313e5fb5438ceb215c626cef33c3d0be411f1d49e539360ce573438ce34defc498df17c3905fb41789e51d9c1b86f6e111e37ae69018fde52631faf38c18fd9b3b62b89e8bf62c497fcf0c43fd3c11e37a8f0631eafd0631fadf3d62b85edc320cfda3d91fed11db8ba4f6b66318ee778b18fdc53d62381ff389b1fc1e8015b5c76dc3501fefc438de6218f3e71163fe500f15d6479410e3fa5e458cfec52531da4bd3309c0ff5506179870131c6df9bc4e8ff7689f17c2f86f3f339587e0acb2f748871ff96e17c7f8ef6eae0fdb9783e87fc29da8eed39e1c450bffc95188ef7b17c1dac5f3526c6eb0bc3b03f968f5624882f5ac460afe19161682f1bc4385eba4f0cd70bccfe70bdcb896107f827fda4bf3671f663893fe97748dcfab1c49ff43ba41f4dfc49bf47fad1c49ff47ba41f4dfc49bf47fad1c49ff47ba41f4dfc49bf47fad1c49ff47ba41f4dfce7242eb8fd57e7e11bb9ffd1c47f4ce2922bee70977b7f754ebe94fb1f4dfc0725eef380873ce2f15f9d932fe4fd4713ff5189273ce523fd19f3a7bf3a2f6be6fc4713ff61893f6b551ce934e1d3bf3a2f6be57b4d4de42ffc95cfb46ffcb7bacb7f53e26ffc9d7775eaf1fe5f9d97b5f2bd8626f25dbea77de27dddda0ef8a1fef7111ffc01393ae6afdf3ec7896e2ba7fc899ff1737ef1ebf35873c529bffc33aeb3424eaef8756e8923fdf7e6afcecd1af95e5113b50ef6b50556d32df77f717eeef2f30ebf758e7bfe90b717488f6b1dab5b01dfd0cabfa9edf8866f695b1ef2066ff2d6d2a3b6f32bddfddab2f8e2ddeff036eff02ee3fc9db1bf3a376be47b254d6456a166abe917c6694ce039f7bf3e12a1f5f0a0983fb6d2189bb6be3b2699d25a5f7f97fb4c3187b9b5c74ee98aec2f1f3f613e0b74bfdcc574ff57e767f5b48a26727fa11542fa45fe08172c34e7fc4619962d71354d64d127f708e980d5b43b967cecf16b4ae24b77dd64291bb1f1871db2271eb1e7bf2e476be6ff534dd47dd3a735c47e495e58d9e2afbe7816974d4b797b59e9287b254bccce57f162f9a0b475f62b4a62cd3b7e63ef5a0927da2f242bec692b1c31ceba7f9fc8f2334de4ad85fd55b97e7abfa0445f4ae7aced09573a4fc9a365bb2b1db3b7aa25f28a3f823e22a53f395ee51b6c3fb7c0dc06d901aae1213bcaed71b0dcbffd9dd2679ac88e57548a93efc7d13ad2289e73ef8b6711654d5ccd8f5dcb12b53f5b38b2dcaf1f72b1caf5be9fd8293b63e7ec825df2201bcd6657c63b849e79a42396bfd13cf4a79ab87adafe765e6ecb75fad5f3547ae7eb958e59cd4fa4e4148ebc296ffb95b5b3a09c24bb65776cc8eed9037b641b6c936db1066bf2945db116db36d618f08d3f3e37bfecae966a22bff85aed7c25b11dd62e5950fbcb672a9f47ae74cc7a9638f9e8f5746f50d6cbceafafa58f6471766231cbb284655bd95bfd1ccbb53ccbd729b0422bb262e32bbe5bc91f99935f9d966ba295ae533bd6e89b7951a5f38dbf7a9eb2255a2b9d676d4b3c37b92ef914ec0ff513ad27ebd99a68db9b5a2fd6ab35b3deac77ababadb067f5ad5d6bcfdab70eac43ed37e6b37d7f9fb8394b9f68e27ae98b9e1d5e4b5847a53afd728bae58e24afeebda96684699982ce5fae48fa82553467debd83ad13a786a9de9cfb9b6bf0bebd2bad27f215d5b37d6ad75670df92f1de7fd33d2324db4eed7ab9defea81f550b2a0b5e6464af754d256b6bfd231f157ef9595bcdbea18cfaf4bfc898fd9d8dac8f570d3dab21ab91df6f5df6baba9ff66bad8d2ffdeb676acb6f587fa087fc8fd2dd144c1d7d489096f7c2b2fbba5731d7ff93c258b5e4d5be72d914582094b08610bc9a2722bc9b763df274a762ffea0c899f785c37bec4ab83a4b9ef073fdebd7251188504422feebe77bd6bcc3259a58ad1dd6e78fbcaf3d74551927f9a8876ff9c87c5ab0a12f47ce554b14e92ac794fbd83c55d6f7cd6d3771291f17be5d691c7ddd2446b0aa811df27731164fe239f70bfbe81f9abf62625d8aa978d1baa9442cfe307dfe23d2324d2c957056a766fe40bc89777e2e6656d556c36fe6e6cc5c8b7ffd2ca25bcad54ade6b8d255662ee394d3463f996e93b56f34917e460417cc105b3719d5797a7a2a76dacaffbe60fcfb0a887bbec8e3b624fc7348ed81707e21bedf9cf4e4bfdc4aa9dd578e3ecb55243df9c5de2e7798d3e7c677cb83caec26e563a66ce12c5512567d554582f2460c64f7d3dcfc2d6aa573b53c85f781bc7075bfc3af7135d710c3a284ec4a93813e7e4278a29ef734f5ce87d4ec5a57527aec4f59f35d2feddb45813d9f35cddd494d4dc7cedb76797d8ce777b38312be568a5384adcacab89fcacb2fd5bf31942c73da276e453b7ca94149135c49d8e991d6d8bda531443719f698178309af82836b447b9a9b76fe5f1b5120d2b12cdefd6c99f91166ba268cd957dcdd87575f4e357cc3f7f92e327965a6326c5f6a275a0dc59df12e7b4fd734ddc5a3be70d766b0db4cf57b376575be27bddfc0cf3c50e1fa1255e8bb6e8d8dc3ab59915582db191ada714a918e67174e62f366ccb8a6d916962be9f6db9f9afc638b6abb5f5b79e835ea2894eb5ecada39abd2a9668af10b1f1263fe62dadb982ed5cae3527c16fca56c6da42cef73e95b1e64a9fc9137d67be38b27de6f353fa767d4d64d65ae5fc52ca95b283f2f6dc12afe7cf6987998fc89ef2deb96b47f938a263c776a2159109c54e58c34ec5e387af688fec71e627eafe790bf4537f94fd6445f66f3dd2bd5813759c5c2dfd9ad98ab9f89a4a70624fb9cf9ff8296fd92fe5f688ab100f589fb5597bf535d5f36d23b7fdd76a5be725bfc22ef914f65b29b7669d8e35a89eb7ac897c6eb480bdad51caaf953593739aaa5b744f6b5f541d076349367b8796d8b0dfb5c6653ad7b57b76df7ec9c632ed5d7b2f1f57c4f8d9ded7db64be9fd145ebd53e106dfbb78e5f96686232577635ab57ab9e3ec3193f21cadf8bc23af68a6615c61af880bf304b48ddf7de667a59bad2e2b1e77e59172bcf3914726d1f9546bd0f84d1cb794bfc4c13055a62a6e9428977e6b03d7d6779abe0275a63ef6c8f4bdecc4ba33b77f68a2d8b77de665c7b84b7c571547ec9235ceff5c4aeec413ecf9ce99cb22eede3ec9915d6c778a590ec13fbd43eb35eb47ebaf6b9d6cf0bfbd2befa5d9eb359949668e25cc452ede7f27aa8f85714d5d8d715e5ba291c531a0bb66fcd154b5652be8e7db7d00eb3ab96d601b151696ba14f12a5d6555cdf2b6ee7ce59d6c497ca7693bf72a46e6344fdf18dcefb82b9aae29857b64ad87ec8d7175eeb18e4c87ed4b6ddb33760fc26ff7ec4b6ec4d7b2bd339b6610fec0693ecda6e16f530ffabedd26e59eff6b615da3b76dbeefcea678dfe98b444134fe6caaec6f79fd312b42bdd2f97be9785f1c18a66e1fca828f79b535e1a33e2b53d732115e2ed8a55194de4a2382e559e9b9cb7c44f34d1d877e5099f3c1f7cf071256695e7c14b765b50c57cec7a943f1ddad3ffd61aa93fef853587a9f6f55cf4fd4eb53ef675d761651a28859d54675ca46db7a5acdec3ef9c1669226fd6cca3ac6089b496cbae3cfb62175609f2d2aad40f5fadf46de95a52cde5a5928a63cae53cd9662ea41c5dc9d248c0bc2f52d144afbc559a15e5e572a2febeb06e7c6e9e70beb4324f527abca7fbe72e2faf77cdffda0f99254a5f0699df27436b6a9fca08f42f8b9ba5600d1989a034efd290b198fd7dde91b358136bcaad66d5d79c96e07a83ca3329a57a2dcfe1d2732632292956bba889ec534bfcb0816a1c4c117f657c5495d798cf5b62753caab2dd6870f95905f01399cb57c8716ed1662e929f9714b094a4d64a39964f100feb8f6b856237b7b73ecef3ed5a97d2aece41cb67eb414ef886f8c6987b35c9a97c91af7226dfe4fb2fb5c4459ab8315f6ad6c3fc7ef32b03e07b7bb8b85e2bc798d8b9648985b91abed2130cb26bf62fc73618f157d65a9e7d761f6c57c720b73cb1a76c224665eb9685bb296b9e8d16badad33fbcd0cf687f06e696f9bc256a3fb1c7b63ee2616b6acd64bfa87f2290bbac61c615f17bb92786725ff4e481fc2571b33c9203792c4fe4a93c93e7f242fec228689126ce8f5ad4af6a59648973c717d613947b4f33ee73541ce9d09a68344bbab575b8af75a770c4c76867658cd399cfcffc7af0f9fb589a0a632d15f5cb5b10eb149e97fd2499bbbcd27978ffe8914b69c4afb50af63fc608e5b57559d2bf5deb5af6ed86d1c9a6f93ed056cabe33238ef9bb91b7f24e0ee5bd7cd056f8a0ff9ecbc75f375abe4813454def226ee7f75b6889154d2d3e8354f12d3f3cae423f57d2c4d24a0c1d4ffae21dc63ae451f108e6d75922e85725c69f9b1fa9c4db4b53b945569ebe41aff4d308eb23194fcebec3b5ffa3c2a7cb3bd9bbbfe486dcd49a988f0fca2dfd69c866d52fd43133e963cbba92dba48fe2d1dafdee33f87247b665076c5071f8c873fdff99fa45ef9958a889de7c99d5b5abf91ac4e32be389a5b1b39bd2365c87cf768abe3f6b2b9c6fd031756954d82e9469f99d00c612cb232e4e3e2e57fca6a6a75add12ab334d95b1421c1de52baf326685c8490965f36b76a4b29f39848fc3db6c6a3fdba7f616cc9b285779da4fbcd3f172651c31b73b3f8ba9ad210b745c8dfaa87ccbfffad3aff246052a5491e22a261b2cd862a25235525f7ed2a350970b34513dd59459cd7ab7f9b7e5d45b72717cbf3c1afeb1a6b138daf1d17f6afd2b9da918f396e7c605da6ea577d6a5649715b1666c83aff894e9fc739b957e9834b1ee2d42f5672c690a6faa67168b81d6fd819a880173d454f72fafea05e74b4eb3f8d99aaa5735d39a58599fa8e3e7a1bdabdeb4c738b45bc5efd5bbf5a4baaa67afb1ba84b7545fdca85db5a7e2ac4faeda616e8bba8f56fbeac0fef63b81166a629d25d6d5e0024bacc69aac30ba5a9997414be427654ba477d054e7f88aef0329bf9f82612c57d644eb4895a287fa670657d2c4fdba31e28a25a21752191f38d17df8a14e4ac73715bfa76ebea09ad491dd3371b3f613d5c01262a82db1b44a51f7ca7d267584b2abe3145658b5786e8fd4b13a51a7ea4c9d6b0d4bd585ba544bdeb1a1aed58dbad5fbdd29ed17ce6b6145176375af1ed4979ff6c0ba5ca089d5f1c0952d11e71e78b332d35ab8ef726ccb6ae7583eec85ed56ae50984f292b2f790f654dd45650ee290fea569dada661563cdf2fa8b2478c5e5f7154281b1bcddf4136c54fd91657886ad5a6ca7cc3d0b6751f3db52c31964255e264ed1f9eab66e6a1ab16f98d59ffadb6ed81d5563b99aea9b6b69b8eb69f53873b8c4575d7722c4738b623f5de3cdb7fb10d166d519f4f39df7ace781d3fd1a9793fc8dc9ca019e9a958626184d529c5c234cfc007a5f110456b74ca4ffce95458535589abfa7596389faaeb606aef63b13556fcc472fe4cce6e4ab65f9e172f3ff1f5a907c75b8e27ee323fd1ded27f0fac77c7b71369d969d94f740227ccfc6db92f2dd24bf120379cc8896b6c277152a73242ec8cd9c479729e331d5cc5063f3efa7c1367ea7c6365e9424dacceb32eb2c4fbfa7ae22fe5b907bbb0c2b9dc3b7f3cc3571c832bcc3e5447e64aef562cd5e9c96a9658f7fce5ea1146f59d4f95239b35f7589943afcefe7d5647ceab338335386c438c9d37e7dde9ea5aefb186bdabadf102f5efc2e93bf97c15bf70f62473f69d03e7508cedaee53a47f26cce76dacec039d691e58b73c2bdac7e54d73975ce72df6f0d1b2cd862d73977befcded4b5c6136bd4bc5a831f233d154d2cd45ee50961d474ad89459b339a58adb7e2336bfc55087ee65cda6fec98bd183ff1334bac79eeb4facccef2641f2d2a01738fc5965cd1c4f52c9129e74ac7ca67da0eefb51a5ecb61decf769c1b27f7a0ac37e7d6b973863a2eb11c1c57701e78df7974361cdfd9ccc71f379cad798d731a4e4feb4b53de392d67dbd9d1ff6e3b9dafd921d8a2cb5de6aeb56eb3508e6bccb1d4bdffad6a89b44fc54fdc2fce37952dd135b554b6446a11d57a733f5da5bfc253f47377b2c6f85f968782c76ccfeacecc8a11ff373491c7aecadff970e73aaeeb7a6427ba7f6dcba17c707d79e6066ee846d69b1bab59165365ef427713377547ee38d352b9e53eb9cfe5b8439ebb1377eabe68bb6ee7fee3d0e9385df7d59db993efd8a21aba6fee976601d79a779eb301aded152d71bb0b8e2f8c5497c7132916565669644e918e54e67557582bfdb925da73e3bc95675f3e4bc57655f2faccdd17e7b1bfac89bcaf7550eba1b6a99edbaff7dd329f2ffbdedd75f7c4d0dd17b118bb07f2494466ddf6991d553551ebd7a1da2fdb5c66abda928edcc1776cd1c946bbbf30beb8ce5a9cba77a02d8a272a516d5c7c6b5579bea3de4f349ae8552d517c3abff4b925ca5ef598b225bab63cb438bc675b3af6bd3ddf43181fa1d22b90261667b9976be2827754b8b67bec9eb8a7ee99f5ee9e3bdde53144668fee845fbb17f91aed29ce51c33cb5eb5eba57554d74266a5833567d2f4fd5997bfd555b84311df7e60b96b8c6fa4436a7bad577d9f0e2f3e8a5d22eaa42d91219ae46e127a598d2686275ddfd1735b17296b963caa3829599fdf9b5ae1f6b8bca471a3bba2d5d7b99261eccdf41eedd4c785b2be11d8be5455ebf9feb515bddb9c3ecb915f79ec61e61fcd17d7092aa1d2fb26b7dada10addc7f562e7d2794f9d9ebbf6fbf216afd97637e76af3bce6f8aa7f45e369e5f1c883e2284e79def963cea43cdb87e76ffd0a3f51cccacfafccbf9bbdd2ee9a154b9c8fdf92e54796e621976a62fd48bbf67b9e78830b77cb6da864153b049d739edca6db02ff10d677e71a79e56eaf760ef42177dcf6bae338a5e33bdeda6f4e58e227cebf2966ee4d35ac53f5af0a2559fcbed40395d7349267595d8bb32876fefcf755e62d9159b9c6146df366a92556e61fe07d00c5f431a2555e1566be2df6154b3571d97b333ce659d55863a90ddccba1273cdb7df0a465790ad677ebcfbbe7d469e2125d3cf3dcd5af3b9f0fa7e1adb94677b1265af3cff6d5cc2d96fba6c2fae8aa26360b672ebfb7c6cc9914d7e12f194ffcf439e3aa25c2b33515dbac8c279757d4b0caacdebc267eac1aaeb4142c7ffba678f795fc95dfaa57b3ead3e4eac5996a9d9b7cd8cc32fb213f4d5ba3ef055ee849e7285fbfe37a911757ed4a751c294feacfa57dcec0795a6e6fee63e6bb2ef013f4f1de9aef485aa28937d5d2e773e79e5b8767f6e0e53507a5baa8ac24c36364b9a63fe69dabfe6ac14aec49de87e51fd6ab5f1546732ad5f3d84b2cd1aedc275ff29c63f93916fa56962296a57ee292f71cda132ff546ded87b9243aa67ef592bdf277320104fab13e7cdd9cc9f779e39dbd518c4e54ecf9b2cb625157ad3c5d7f05ebc576fb638ae516def6dbd087ae9bbc22ac99e7bc2974f2b6ba2cc7ad8f23c9cf6000b116f79dd0badc529db6e61deb9f29b44d2c40afcb5dc0e6854bd6c89f60cec604ed74a334695fba8f8db6cee79ab8f39bff2f7a63514c70e966ae2b2f7ab3996b6c477afebf5bc3ed998b7ebed79fb4e5bf78013b0c77a9dccc6bfbd03efd0cb74d156a1ea54d716ba913c35e38915db96f7eec43dacb753ed073e7a03efd83dd231d2a2b630f44ebcd3c57756636d8b3551cc8db1392c15824bef4c58deb9f6239d6a14280b365ade523a73795ce6bcd676cdfac46adc5a1c0b2cdbcf8239161c85e6d5773095e6eb2b67aabc5782cdbde559cc4c6c5f4eb84262754d5cf69e43ef42dde59a7859d432afabf6bd2b153adbde35da57b67eba76acd1bb7167dead1d59c2bb2bda95b6a17ded0b0e55a44ebc7bfd79707755697ec57bd4d6bbc0cebc0d6fd319785b99dfb04853b5bfda10ebbc9d608926aefe6b3958a685f1def21c8dd6c4c21a96caf351a84de5278a3fd66c57dfcff331bf51fdad189a372c5a62f1ad5273f92d3c095d3e935589fc5c3177ecc982b3a29a2ed3c4bae70d16d48e70f7bca6d7f2b62bf6b5e3b5bd8ecf7d96e9963cf72da7b140bfb4d6b9bbceb9f5ee3c39dda266f9c279f26d3194bbe2c197be625da7e73bd93ea0b1beebbd69cdacb7ef8eb7e97bced4f797c43cdc0faca1cbfc70b5e70b97be3fb1668de2b224ca6b3e8bf5561aa9286be2c7fb4bca47d0732cd5e7188a738e953add9db7c4e2aaf96aecf3f10e1fd6a96cabbc13e4e3bd8e1f9648b17d650bda553176667d7d0f537ec97c26c43bbf29cf192cab1de6fa911fd78fede9ef867ee2ee393a76d03a99fae9627dd27b8ee445fee4091eeb8ffda76c15a39d5897aa256dab69efd9a9afec9e37cbaf77ea8dfce7b28e7e7cfcc41bfb137fead4ace3fe68034e33cb93fbeccee6238c1a6b5be627ce29c1d27450f4aeea56952d4838c76295dea55c8c6d2b5ec22d73d4a19dcd83b8c5a701f5bf67f396585cc3c5aaeb8b0ad7a8d874f57db2db95238d2656578ad0fcfacabf1ff2c93a59fbcd7f59d4076a7b7af567fe9beebd779c81ef2c9b17d17e5fc735e7516dffddef6a3bec6475c685dff3fb56c3dfb52eac6b7f2f1b4b74bafebe7f208f0bf3dc1dffd03fcafeed68bfd54ffc818e787acb6216f7d0ede4fee7d077ec4f7ffb6ef96f0fd4bc2d6671aac480ab3ef16bd64cdc94be2dbc03627e34aff63c1f314e5113c71f3e5ae53ddefa085a5333f75b30d5679de7ec6aa1266264567d2fd0c25c7fb25ac07e73068bed4bf780be3ff58ffd1395e8387861fc801a4a36d576b97fea9ff9e7fec5e5c4bfd49fec9d3b7dabef5fe7cfc1f4fd1b79af6dedd8131f7aecdfea1ef92ef347bd177fe86d6acdbc776e966862e6a362cca3fffdf0d9d385cb7f8fa56e45cec2549a0f9e5f1bb1b02eb04fe7a527a48bcff6d92b9de7e3fd200b35f1b93ae7278c1d9467b745c53ee6df25499a587d5f8f79de79454df4978c26e6e7b9cb9f2c5ea2753a8e6ef98ffe86bfb9ca5c71be0627f2b7fc064bfc265cc36ff9dbf6c0df1101ac73d4bd34d37ee8bbdff63bba17762146d73cf407fea16a7bae3fd096d80b78c0165f53c7d72347d1ba48791e648fbb2e991ffbec77fb565d2d55f3a4d1dcbb311724d4d2b22fc6a6c57785cdcd6ed725f32cfd224d9cf71469a664eef9c1ca2facd53c4b710b9a38f7e626b4c4553571b91d0a2567dec632dbd2316a2bd3a740066a993e99cfa9db0b9cc0e5af8117f8411084992606911507b1df93fb62983d13132441ea0d9ca740c7edfe5d30d61a3af2efb4260ebdb1f6090e334df487c193bc58acc32ed7c7cd826768473a9f77fcda1e04ba2c1758da67bfdbb7c26feaf2cc5ee722c060c1ef13ccd930d6ba2cff2e50690e840f3f3dcffe4774be4813b54557751a15497b7ba551cbea7a1f3eff7e5d3c32a85a22ae9d08566b879f3c85a4a6c1ecb3e799fc576d2d1d1d8fd4c6b9f86ce8d0ddd55ee2b9b68759f016bc07ddc00d7a413fd8d5f6b817ec0707c16170147475be07c1b1088213771a9cfa4f5a0313afe77575ac3c001dd4baf81a9ce9ef87fafbb17ac9d648d6e72b380fc6c1857f03b6aab5f344cd82cbe02ab8aeffcd9acf7fdfb9e6adfcd57458f7defcf9f77417eda36073382a531e3764fda226cec5b673a9f85680b225163551587347e6f1333f2d5b6275bd8f3da7c934073437bed0c42bada0896c6ad7bca5b7d49a6f3e5f1323cf9d6b672a3bf5f175d6af3adbd65170eb699b0eeed46d30e4536d875df8e87fdf070f816e11c146d64f079ba26735adeb60cb13de9637ca7570d1671c34166b62d0d49a38cd3c4e885fe45dd00ab6839d6043ddf29adf0e58e537efebdf43595fd7a5732ff214fbacb032867e57af3c07529d17669fd46ce9399962ef5c1abf9ed7365893565d1f517e5626dfa39a708cb0fa9e487affcc2a9ac83ef9a598a01d7cba963f5bf3e03474743db7be218b59551cf2908556d0656928140fed50868abdf017fb2e74325b0c335bec879e7b1c7abaa39e84411866fea2b872a601f7de4107b5fed5fcf5066114c68bd6ef6aad1e153471e8a8309151a8ef39acfd7dc7cf35311f91d95f529eb5cf2a6649d6ffc695ee47b5067d5822f673e53116d6afeac5b271f6721e166b22737975de2eb71c7e55fe56ccad81ac5ed18aa15dcf691fad8afb740df8e7bfb11a96e65616c4a753a7577e162fb7c17cbd6bf814dcf0c3f099b7c249380d5f9c8e77a986de73188b6ef8ea6afb0c67d92774c2b7f09ddda956d80d7bf6207b2e30ec3bbed7d57df3124dccfcc07077d198a3f65fc7e15e98af0bcfc6a1c2033bb5aec3c3f0281c7c5513b318baba72ba9096f83a354f11ef435c4acfff6663beb06fc587ab593fbae8dd75d55fe7283ec55a5d7345cf21eb9ef195dfb936bcf37d6e8c606ebdcf7c5b84ef45b57de0b859d50fa8ae805fe537dcc2e3e57d73a687ee913b7126e189dacbd74568fd71bae1a91b3a4dbb1d9e85e7e14578196a0cafc2ebf014c77002eb31bc096fc34c13ef82aefb9edbe35004e1bd146a5b5be245f8103e7ae3c57a087ea27fef4dc20db7b056a8a089471efa89993e869be156d870866153df57edaafb553431dfcf5bd447b32547d94795b53a0775cf1ae3157c36d20a764b365f376759178fcfafef736f59a2bddb98ed319b3965dfc1b9647d71537d1f09eb55ce7a563de7fcfb3861bd0e7bb31ef83d33efafa0f7ff8495b170f6a6fd606c497adf15dedd21de9cb7e57a183cbb533790f7e17eb8a34e02e56c7b135df327debd7797ad9b0edb6127e2110bba91153a9188ec6cce43debb53e7215b7faa4611ea622423651dc17b75b41d5efb2a72fc89b6b4c53e62ee2766baa8f6b53d3ed6c4f4a3406ba2f61387ee63ae9f2c7b3e9b0bbf15b9b2e67e57d344b4abb7badfeb8b96ce2af217fe0847b1a935e09ffe925cb687d6c98d45cf0808ab38e3c2a68b7d8305e75f30cb6bdd6b1fe4987bf250ffad990f6091e86a0b2a8cf588d248adf634a7faf821f5ce554dccc6197993f9fc467f9a2be5b4e9bd2d5b8be81d688beaead8f5cc69c033ca9a4ef3b1bf4c1b13de8efc2808065118bee9d8e43d8aa238ca9e21388dd2606addb3dd68143ab91e6a5d8cc6d153f69e1dc9a2e768124da317ef3d8f9b97f889a08b5e4f85d16b8d9f38403f3156893f08c6b612e7562f9a65eddead892c56d54448f69177c6cf2a1e5bf6fb5c9facb9e097dcabfe96c0571317ec4dd7f3394bede0b3d8f35727993de1d5138c9f5b0f6ce9bb37aa9ab8feef6e7917dac216af2f88dc76366ea3da3ab278aec635f23cd23161f41e3c46dd70a4988e915b512feae3bb0fcf1d19edea38a697c72cb32c868ef6029f6d45fbee2c3a089eb2f53f9fe8a1f97823bf1d1dfa83e2f59daed7cec621d55d74140db4bf390ccea2633b0db6a313bfc593badf745a47132955df170b49fbf04afdd6bff8f167265e1d0b5f6bad5e96a2d385eb03b339e4a3dc0eb5fe4567c53536a66fbc8bcea38be8d2bf8caea26b3e8d6ed87e749bbfeb268b67eea33b2ec84fcce2e76818dd470fd1a3b6ab7d6d61836c3e455bd060a91ee2df6823ca6cf205c6ceb3396baf037a195c384d8ab323ed275abb51236ad6fdeadeba9a88c7d4bca9047bcbbfcdfbc5ffe8a475f39b9a18b5a2ed056bb21edc29ac4bcc9e377177ebde6b283bd14ed48e3a979398070357fb89316332b654fe9c6030b3af62417ac85bb11dcb58f9bef7e8bdf8b7de8bf79cff6d3b3c9b63d116997d8a5a58e260ec3463275b13911defb9f9f6dc8f8c0e6217e2ef60eca56122ceb3b822ead6be37f02b9ab8f8b751e6c6e1fead694e136b756059924eddf848b65e3a5fd77f4f638975e379fabb4eecb146904773b11f07c1bbb6b790bffaf93aed388a63fe1abef156fe7d12a7d11bbc17ece393cf35efc8337f244ffc913b41bfb1ebbdbb13dff70fb37917ef5d5bd8bbb6b9e37834afa3ba8fef99f87b1c8fe3a7f839cef233551b8ecb76cbe3a95fd1c49a715e4a5f7e3fcf3f2d7d5f13e3b84e1355277e7107f9f34c13f7515e78370bd62e6a4b141bf16b366f12cf74ffdccac70edfb416ea38c83df4ac6818bfc7ddb81775e3bef7bc2c46cfde0396db57a683632f7fd6307bf71d7de4d073e35d7dce65bee53898a98b782fde8f0fe2c3f8489c4b4b3c94d6e57d4113f9e2f983edf5cef4cf4d71753dddda7e62f0166dd39a2a63131d5de7c7990e69bde98471bcf0d93cef2e3e65417ce6b7745eceb913dde4fe602bbe882fb37911af1f5fe93ef55a7f6ee87d26f576a83f67b00e475bda6bfdd8a17c886f631da12cf127937818dfc70fe2207e1443fabd84f8e923eefba2262e9a05fe5bfc2ed79f917e8526c61b591d3b13efc5853a1ffa27455f4dddb9fea2679e6447cde2cd782b6ee4b6d88cf6b4af7819cee216bb7303f8ed80f9e7a86a6cbae33d0699afb8a975f374d17edaa78471c505f3d4b1d2563a8ab7ad216ba837ebc2decbdfee78a1fd46f39b8b5fd1c4b9df365930c6f66f4e739ab8b69fa835f1c1d3fd73bce3df65cf8b04e7794cf0a133fbea1e7c3ba71b9ccbb3ec63e29858fb7d33cb8fdb7127e1094bac44040f4cd9b3c48e77d679e78dd78e5ef5f55fe939c25abb3f01dd73236f37fb9bc8cc9ff4dd4466e388d973d1fe487f7c6da7effe2cb860819888207bdfad8c1233c7f6354dac59d30296f8addf7dff2725bbfaf4c4da9ac8d2c4d15a789ab8c193f7a86d6b508e5fa381bcf75afe21c6b79b89e77513df6b67716f12a861122691d557ad248e8fe2cd2449d264948c93a7e233fc9fd9a13c4f9e1dfef1fc4bddc799046318574c263a341a272ec4dbce2479cec614bd47ff10e3efdc5f4ca6c90b6b848decfddfc9abfbf1becd2f69e2a298a56eecfcdf99e69ec15adb4f948ebcf38fbc27ad2b4fbeafb88e55bb45bf2bd71d88578d4e02ebfd07898cce24cb9e4bc97ecf2f99c5a3fc59fc82aef9da6256b1c5cf6c569f07f2f59ebca9305fbf38f607f244c739cf144f57e7659277eb2de9bac7498f25b43efe6b9a58d3e6f3f4d93aa77f4f9ab3c4b535d17e4bfa99df957d5c3f9bbb5d6dce836255f750f7cff9efb35817c9aed34cf63cf36c56b68607d65f17c76cca36173417adbd2dc5d54373cd24d957a1eecd07995f981d9b69e25cbebabaef6e6bfd3cb0dbc96178941cd17ced5735317b6fcefcafc5b29a5fb1fa77a6394b5cdb4f4c0621ffd011355c6dbea3f0b7e34fed7dcb4f8e9393e4d40d60bd35d8507296adbbf6729df45fbd27afa3f9c8737d5ffb831ddddf6a2bcac60383dae7f98b31baf35c58af388ab43fe91f69eee46bc5cb7e6d76fd811a66cff76b9f71ec1d27e7ea20b9482e2166f9aa26421296b8c95606b0beb6ca43bef777fa3de13f36b9d57590ebcfb1c4fe46617de0caf3c01ff3c1d16172a5de926b7796f96fa85bcfde7370a6fd497826e55e9ee23861ae57995fa7fd521de77add58e973b81403d58fdd64be60e216f277a7cf7702c7054d6dddd53cb9709cd6c55cebbdd7e4261e25b97e7d5d137fd2b234b76e714d3f918be4eed3f581cbffbe27432f740fa3d77c9c2ff9f023c16fcbc607f3e7eb3f746b8cdf935fa7fd506f10ef24cff18ef6f946f07e08ecc7cffc2c3aea55fd543cdfbb3f4cee2bfee17be63be6f69c14e66106c98305cfa67d4b137fd2a2e45c7e4f13f9d4dbd29a9294b470bc963626c9a33bd55a982c3c66acf5abbb705b623e85fdfd43ef093575de075cb6befb2c09e4a9f63d694c14ef2518cbbb247f63c38f26fe31295bff673da80d5ad169af3923cf5fd485bcf38e751c7c44f3bbc9a6d70c4fa3d77c3e77055dccf589f4705c9807fe64dd6136ee173c79cd60e63bd143b2051fbf133d78fbc12c3e86f53a73e77d37f994fadf553dcfe37cd0c9ecfc3a7e6e84a75ed39f244d787ee44713ffe8c4077cfa15ff595d33479c46b13af3aedc59bcebce9256b29dec0437e15ed2f660dc2e416d29fe4dbcdcd7cbfdbd413076b8feb717a47e9cdc78af41ea0c924eb69e3a5f83f8a197f9f1d977e1a9bc4b79702307e22018382e8fed6726ddbb94a5562ae24e6abb332ff5371c9edc64e7f4e35406b354c5236fcbdb8a77e585f64bdbc90de5af98cfecfc493bdcd3fb5ec959b2938ad4495d759397d38f26fed629ebd599cf45f6c9deb2917decc3347b215390b4e3637f121f0723f89b865e3369275b6994c66992a6ee5ee4a88b74144bb9918ed3a7f4399da4137f2b75a3e3741a3da62ffab861ae5fefde486b140f3a72a6b7bfeab6f302ebdbb3b8b6f4c9bedb9097e92c7d4bdfd3aefef4d27eba6bfbfc35fbcdd53c9f1be95eba9f1ea4875e33cb53a67dd92769a747e9203d9687fafc1edccbc79b437e34f1ef99f80b4fd293f0c0edb9ece3939edacfe9597a9e5e64bf5325647a19f4d2abf49a85fc49def07e7ac35fd3dba06b1dc531bf4fefd2a177a5f6d37bb5efb7ddbdf4c1aef93dbc2fe7b0915ea643ada18fd673fe99e8bc2df945821f4dfcfba64ca3482f418b2adb37ac34ddccd7c3eea65b69236d864ee8a62d47a80d799b6e87cf6a1427e90e3f14adb4bdfe38d32a399cd7be85fbfe68e23f38712104ef070f6967c4472ce2d153f090bda53a7ba688c9f43dd4bdedc86223f5c5dfdafba579fdd1c47f7cb2eef996b04722b44676381bc9914a77022fd3442e9c8b91e35c7eff1adf4f3f9af86f495ce81ef97de4c682bf8693f05ddba027ee991cfd266b4a7f34f1df93782b98ea3e7927ba1e05f296edf23bd1fafc09f43f2d773f9af82f4be28d8b3ffb39f155d28f26fea4df23fd68e24ffa3d92d6c4ffff7fffd7ff01c9aacba0</data> </image> </images> --- 746,750 ---- <images> <image name="image0"> ! <data format="XPM.GZ" length="82294">789ced9d5973f248b3e7efcfa7e838757762a20ed8802126e602f08a176c63e365622e54924abbe40563ec89f9ee53526696b581c17efaeda7fb7557137e7e682b55a5fe95598bf8effffae3f6fcf48ffffaefff789e1933cffcc3748da73ffecb7a89a2b7fffd7ffed7fffd8fffdcdedafea3d968a8cf4ef78fadfffc1ffff19fdcf8c3fce32c89ed0c581e9e15b046f65fca56acb99b6ddf476ec1767983dcc5ed3b1977e9783ed19c6d37ae91f17823d09c6d973672178f3fd09c6d677d6413f79f02371b4dc8afa119f2f39e72f323ff3131eccfde90f1fac22286ed661b19f3c33ccd70be8018f6f704b209fb876f9a21ff3362d85f6e0337b1bc588718b673cc4f13f3c307197775fecf3567e70f2f91f17eb84f8cfb6f6bceb6c71632de9fb7a719f2bb458cc78f91f1fe5853335ccf2386fd830760ba3f63a119ecc140c6fc465362bcdf3bcd90df1e32e6871f6aceb6db73e2ad6cbb784336d11e9294b71a545ebc8f8ce7672d62389e3d22e3f9d93e316c8f0432debfdb2186fcd9a666b8df31b0beff5762d8dfbf44c6e7c37cd70cfb9f13637d3c68ceb67b1132d6a775ab39dbee5c11c3f1a24d0cf7930c90f17e923e315eef4a3394df35311c1fc6c05b783f51473394df8818f637f5f6ad5eb6dd47c6f28fde893b4676bdacfeb77a54feec00b849e76b2263799931313e6f179ab3ed56440cc7c7efc8585ee621311cefe8ed686f0631e43f7c41c6e7c37ed20ce73b26c6fab63443fdb8c05bf8bcc81dcdb07d4e8cf571a619ea7f9f18eec7669ab3fc4597c874ff43627c5ee69ab3fde35b64bc5f6e13c3f600cb6f0bebdf38d09c6df7b781b7d503969d3f3b7ebb49f5653791496fa7c470bc192263f9db33cd50fe8218cb9fce8fe5ed6bc6f6e15d3394970f4ce56d9a9a414f1f88f17979d70cf579440cf7235f91f1f975de34c3f34bd7c3fb8d4e3443fb73470ce7739f91f1790e3e18f2774f8cf66d11c3f1de4c33d417ed8ff72ff688f1f9353567fb73ba7f733babbfe806781bef3f792286e3fd53cd70fc2d311ccfb03eb65bc01694877ebec26dcd50be0d64ac3fb7ab19da8b1630d557f4440cdbdd0532d6877fa119eeff9c189fa7866638df1d31d6ef2332d5c79666b0b72e31ee1f23a31ec4afc468ef63cd909f8018f5e80a781befcf3e21467b3ed00cfed0333194bf3543c6fb8b279a414ff688617f714c0cf5c39f3483fdbc23e3fd8574be2eee3fd40cf54fe737818d1d62d003ff4873a6ef56666f2dfdbc46c79ae1fe16c0fa79bcd60ccf83450cf90b46c878ff16d70cf78fe7277d8b1832d5d79b66b0a73e315e3fd10cf5e3026fa39eb85233e4ff8518f50cafbf8df669879ac19e0e8931ff2f9ac11f3a25467bb941c6fab19e89a17e923d647cbe134e0cdbc55433b4c70931d49781e76fa19ec7079ab3fa8b303f2db41f1611c3fe81a939db5f42f918547fe20619efcf1c11637bf1824cfac089f1fecf91b1fe828418f503ecc5a0fa71fac4680fcfc8581f2e27c6f3ebeda85fa7c8a80721d30cfa981063fde1fd6da33dc527c4d87e3e12c3f99d36700bf317f488d1be5f35437d06c470bcd72286f2b7e6c8f8bc3b3bc4b8bfa519daef0531b6df13cd59fdf978bf2d7cde139b18ede55073b67f70818cf615d3f5d1bed85c73b67f7843dcce22572fabfff6967e7e3d62f4ff7ac8681f62408c7a7c898ce52dee8175fd06c4501ee11332d66f146b86f69c11c3f1ce0332da9f7bac19f4658718f33f046ea13ddad7c4182f1c21637dc417c8e4afbbc4507ee13e3296af47e7c3f20d3ccd59f98a4b6228df4000b7d15efc86e66c7f6611e3fe73e4369e3fd60cfe7a480cfb1b1f0cf693b56f6d83fc13b38b8cf51330cdd09e2193bf219ac858dfc12332f9df77c458de3d62d413b87f83ca3f3634c3f3794f8cfa71a619ea4710637ef476c8af3d42463d613d62f4a72264d487f85233d8cb0131d6f7a366383f6e6fd3f36f12437d38179ab3f2b689b1becc4762a81f696acef637cf917bb09d059ae1791e205b681f2fc4b05d64fad8d9a2fa0ac69ac11f7091e9f98d3483bdc7c054fee60331fa1f67c4509eae8f8ce51dcf3543fd87c4707e798f8ccfb7d342a6f65f33fa87783fed06fa43dbc878bf6c48dcc9ca2bc1eb779ab8dd24c6edbb9ae1793090b1fcd93331ec6fb534c3f3953d2f1d43f757ec2153ff045ccfa0fe8578884cf71b1063fbb4ab19fc9d6d64ea6f7b27c678fe1078ab01f9b16c648cd7ed1be42ededf3530d5b771a119eca18f8cf62d6e91f1f9f746c450dff11498eadbbb47c6fb33cf88f17a9e6668ff2e89e17cf60099faef9a9a215e96c4a8578c188ef7f789e17970c17ed5f307e7134362b49f09721beb03ecd7207b891e91f1f9b4bb9aa1bc2f89c13ed84233b49f2d647c7ec34073b63db92686e3f95833d817966fc7029657c43bdbd9f1609fc64e734764f5913dcf3bdb14cf7baf9a21de7e46267d3b0226ffcf11c468bf7bc8f8fc0667c4d8bf78886ca2fdbd1143fecc5be0ed06b0c0fc917d456d62a83fc341c6fa15c8a4e7e69018f6970364d4f3d84426bd9812a37ddf11a37ff1084cf6e1da9ae1796b20a37d980931b6efc7c83dd42b620bcf8ff9eda01e85a166282f8b18cac7c7fcef34c15e7c4e8cf6111163f95e23b781833dcd993d58d9f3b32374bc3e2746bdef03537db36b64acdf70814cfef5a966d0278718ed67864cfd6d78bded16e4c7b945ee021b503e82ead76820a33d48b03741edabe923b7713bde1f95bf176806ff9f11c3fd1873626caf9e902d7cfea1fc45a78df677818ccf6f00f62476f0f9765e88e17e12ccef0e3ebf91458cf5f5aa39db3fbc42a6f62b26c6ede7c0aa78331659bcd2dd267f3a94c858dea2438cfd413d608a7fe30e31c66f1632b6171147a6feab2b647c9ed9257117eee70558c943c6c629323e5fde1c98fc516f1719ebcb7e26c6786e828cf5e1bd6906fd6f10637c3600ee3471ff1d647c5edd43e01d0bf2971c0077f1f909bb9ab3f2659218f6b79e34437d4c91b1be59488ce7dfd70cf595b5975d41faeabf2153ff6f9f18fb1b7790b1fcdd3d608a97c313cda0e78fc8d4bfb94f8cfe431b199f5f79488cf1d60c19ed2581fb13ad16dc8f8834c3fd8f91f1f965bbc4b0dd9f2363fc6337887badcc5ef07ea8fea27b60aabf586a86fbb922c6fd693bd66fbca519f6e7c4787dbcdf0ed9db9166d0f77364b4b7440077514f9343cdd9fdc95362b8dfc845c6e7dd3f2186fd85410cfbc70fc8a8fffc8c18b6dbafc4505e36eedf43fb930e31966766ffbd16d98bb9858cf5298f81a9fe7ddc4ef1993434833eb489b1bd7801a6f82cd825063d4d1e9051df13898cf1b03d24c6f27488c1bee23b648c8fe32e31dcaf1111c3fd46d7c0aaba617b420cdb05e68fecc57b4246fb300362d48fa666d0fb1931c6df983fb21fafa919fcef7b6238dec1fc933d490ebc83f66d4e90db98df7d60651f597948cc6f17fd8160480cdba36762383e1901f750afb84b0cdbc30364d2234e0cdb65a8d9ccce9fb5773d93ecc9de42a6f6e45d339417e4c7a478d2dc2506fb36de90a9ff7e488cede721329d1fcad3247bf37735437b1e12a37fb2838cfa9758c06d6c8f12b01f93eacf181163fd1f6886f1ab2364acbf785733d4f72d31f6cf81fd9954bfee9666787ef0f81dd4abc02086fb6717c450fe6c80dc034e2e890db07f0fd9c2785233d4a7df22c6fdc1de4daa7f3f2686f3fb67c8e89f8477c4b03f3f27c6fcb9c816b00df6641a4d3c5fa6ef468bfa1bac6d62f477b79069bce38918b60747c02d8ccf4c3cbe45f16a47333c6f0d62b4a71362b81f07cf4ff16870a219c60b7ac4389ef0004cf51b9f0153fd1a26318ea7ec11835e783632d677e86806ffcc2746bdb82706fde41d62a83f49e727fd79d00cf9bf42467b659c188ee778fe6e13386821e3f99373e01eb63f618f18db974b623c1eefcf407d618c18af87f931f0fca6ad39b38f18eac3a4fab73c62d48b6d648c0f639b18f57c024cf19abd0fbc837aed3e226379258666f00f8e89617fe96906fb7b43c6f2b42d62d81e2f88a1bc9c04b88bf691e0f9bbf47cb589a13c44ac39db1eee21f7d09fef1343f972490cfb3b0cd90276f1fea93ea440a6f2bfd00cd77b4736401f833b62ac3f5373b67f708d6cc3fe8c8eb761bb79432cb2e38d4cbf448bea4f4e88d1bfd7dbb1bedf89e17935b690295e3f23c6fe812631ec6f4b60dd1fd0d70cfaf2488cfec71099fa1747c0644fde5833f887981f8affed53e00ec56b47c470ff7e00bcd304765bc874fcbb66f0ffdbc4a8e7db9ac15fd1c743f98787c83ddc7e4f8cfe13960fd96f78ac19ecdf26c6f1285733f417ee1043fd782130d9b7ef6886f3cd88f17cf79aa1bf0acba74bfd6b1362ec4fc3faeae2f3ea7ac4e8df6846fdc1fc76f1fe7cba3ef943747d7c3ecc6762a88f08cbaf87ed5572420cfb8b9018f6f7a6c064ffa1410cc77be7c4b0bfc4f3892d7cfe9f88f1f96a11c3fe0ccf273ac0c929b19459f9a0fd0b4358d9f5b2e75558f43cd870bf96b26fd0a37de036b6b7c11332966ff88c8ce517807d58648f4e4c0ccf8f3b2586fe27c72086e7291a20e3f9852086fc3a0e32f953b89decc73922c6f19c09318e673791d17ebc53cd30dfa0814cede39966887fc7c8d4bfa319eac785fab27a147f3e22b7a13e444b73763f01966faf87f537d19c6db7b1bc4407eadb888961bbff8a6c40fb915c10637bacb7a3fd3ac4707cf4864cfafb440cdb2d3a9f6db6b3fbc3f2550e7bc622d34bb34dfd67de0099fa57ce89717b0798e2f13801dec1feb0780f99e2e75b62289fc0d10ce5a319f2e3e3fe5a4fbac4b03d3e44a6fa959ac1bf6e20e3f5dd4033f847987faadfe85633e87b0b99f499b6637be96279f4f0fa96898cf937707f03f36b2d90dbc0ec1898eac78f88617bd00656cd1dd4ff1b315edf2486e3f9253196df8d66d88ed7333bb05d1e105b509e99ff69eae7dfbd00a6f848ce807730fe74079aa1bfc300a6e7cf3947eec1f5ad5762b89ee9215bb03dda02a6fa70879aa13f8b98faef42cd70bd0532e5774e8cf33947c8f4bcbf6a86f343795a063edffe0331d6dfbee62cbfb2876c00db8fc83672420cf72bc17e2d13f59c0b62d83fc0f2370ddc7e418cdb1bc8d89ef05362d82e5e88e17af618d8da028e32b6dad4df215d628c572e89b1bdf790a9bf220026ff809d10a3bfd602a6fed0d84146ffc514c470bda88f4cfe78ac19ea630b19eb275910437d989218eecf390326fb317ac4b03dc0fbebb581dd5b64bc7e70aa19da07ccafb6171bd8207f2744c6f2f60f80a9fd4e8e88515f0f89b17ede3467eb3be43e72c7ee64f9c1f3913d04985faa7fafa7199e9f2b608bfc8b0e31faeb0131ec2f4c62c88f87f9b5b07d624fc4b03d79d19ce5d7caecdbb2a97f24de47c6fa324f88713cd502a678d99f1283fdb897c8f87c0bc88fddc5f8cd8b91693cada119da1fda9fc6071a9a213f6fc4e8bf40f9d95a6fde3483fd6d23e3f3e27589b17f372486f261af9ab3f2897c64d43bc134c37a1ecc6fcf02b6cf89a1fec31930d99b1b2163f944987fc3c0f998983fc3c6f5176d6081f5652f88e1fcf61eb201f612ec10637bb14d0cc71b0fc4689f7d64b23fb407d386f2096e80c9de02898cfe4e784b0ccf4772470cd7f38f910d7c7e5e89b17c313fea8e337bb51e8961bbc8f4cbee74289ebf05a6fe983842a6f6631799fce13931c473c63d7017cfc76e90d19ee42e31c6032360b22776478ce3630b64ea4f6e22931e8e89a13edc7764b46f2b2486fa48303f06ea1ddf25c6ed33cd59f97827c8347ebd430cfbbb136403edef0ad9c6fc2193bdf8cfc8a887fc8618eda5034cfe8ac38961bb7cd30cfa2290d15e13bc7f0bfda3c8d10cfe45400cfb9b07c0369e9fb591f17cf25a339407ed8ffeb491d9ab6d6b7bb946a6f23a25c6ed7d64ac3f5f6a86febd2b62d83f1a2153fc33d60ced33d88b4df1b585dcc378dfdd45a6feab17629c3f46fbe3f881c79029de7f22c6f1862d62a83feb1098f4c77491db505ed13632da838bf723b6507f1de40eda0bd8936d627b639d69cece170e90511fc436315ccf17c8686fe28018b6bbc43670f84a0cf132077b4f330cfa8bf9b5717f1911cbcc3e44d67ec80ed557b8854ce56711e37cda13cd30bfae0f4cfd1f2ed30ce3813e32c5173631c44fee2932e951846c613cbc0b4ced9183dba9fe458f18ede50619f32fbac4682f0631b66f336003f5cb728871fb1099c62f16c8a81771084cf6e04f90d11e640719f70fdbc026ea7be213c3f32af0fc26d64f70056c617c137489b17e1f89617f1bcbcbea00c703cd997d38981fb207ab470cfb87d7c092fa671c62d8ce7690f1fcd618d9407b82ed92ecc1686b86f96017c8589ebea719fc8f4b64ea0f7bd10cf5d341267f7dac19fc599718e7e3807d49f27f7c5733cce7e2c8949f8166385e2253fcfdae19e2eb0099e2c98666b0bf31318e5f27c0a43731d30cd7db22c6f90f8666885f9e89d1ff9811a3bf3d41a6f11757339c7f1b99dabb57cdd09fb04f8cf3318f9049ffe69aa1be16c4b83e71044ccf833bd30cfb5f10e3f98f91f179719b9a61be489f18c73b3d621c1fa2ebe1fd787dcde00fef1383fdcb0764bc1f8f6b86fb5f10e3f8c316311c6fa17d9b787fd1b966d0ab2931ee4f8cf7e7259aa1ff4e1063ffec2b31b61f7bc478be1364aabf07cd505e2fc4387e75458cf78ff666d2fd1b9aa13df68971beb9a519ec7d9b18e747b589518f28ff545e787d8bda4b5733d8e33531d6ef2e31f69745c4e8efcc88e1fc2e96a745e5eb6986f2ed10a37f7e4e8cfd535d62cc2fda9385e5eb0f35437e2d621cdfa5e3a9bd6d10a3de62fd5b58def18b6688e738313e3f77c418efdf10c3fdfb8f9ac13f392306fde56f9aa1ff1cebc7a6e7f15e33944f428cc73b9aa13cb07e6c7a3eef34c3f13e31f63f84c4d85e08cd901fda9fda434e8cfd573bc4d81fd024c6fcbd6886f3b590b17cfd7362ac0f3a1ecb436279482c0fbe2086ed918d4cfd573362ac4f2c7f89f98f26c4186fc6c498dfb9e6ec78ef1059e278c60d31f687be688678634c8cfd17b7c470fe8b996609fc937ed25f9b38fbb1c49ff43b246efc58e24ffa1dd28f26fea4df23fd68e24ffa3dd28f26fea4df23fd68e24ffa3dd28f26fea4df23fd68e24ffa3dd28f26fe9312177f750ebe91f71f4dfcc7246e728bdb5c72e7afcec99772ffa389ffa0c45dee719f073cfcab73f285bcff68e23f2af188c73c519f07fef857e765c39cff68e23f2cf127a58a894acffc2fcfcb46f9de5013f90b9ff357f577f157e7fc27d527fec6df795fa5011ffed579d928df1b6822dfe57bca27de574fdb013f54ff3ee2a33f2147c77cfeed739ca8cf297fe4677ccccf7f7d1e6bae38e317ff8aebac91934b3ec92c31517faffeeadc6c90ef353591bff2a1b2c072bae6ee2fcecf343befcdb7ce71cbefb2e705d2fd46c7a69f066ff22d65c7577c5bd9f20d6fa996a0b9f2a87676a5e9af2d8b2fde7d87eff0aeb2c41e7f67fcafcecd06f95e4b1319cbd56c39fdc2388d1978ce7df6e59e317ea2143b973f66ae75d41b9f328bd94aebebef729fd94cb2dafe11a5877845f68b9fcb2fdcbdc33cd52ef731ddfed5f9d920e76b682277975a21a45fe48ff039f3f539bf5186454b5c4f1359f0c93d423a6035cf1d8b3ef6f83525f1a5bb7e61314bd8c3871db2471eb0a7bf2e471be6ff534d546dd3a735c47e490d70a770d6cbaf9d85396c56c8dbcb5a47996b59627abe9217cb4785adafbfa224362cb7065b28257c567e2159e1405961c27becedef133f7fa689ca635ad65e15ebe7fdfb79612f8573ca2f9fa75fc8d960ad63eabce065a9a08be82352fa17c7abca0a77330bcc6c90eda11aeeb383cc1e0f57fbb7bf53fa4c13d9d19a4a31fa7e1cad228dfc39f7be7896795113d7f36337b2c46766e48e2cb6eb87df8ffcd74bec989db05376c6c6dc4b7bb3d9b9f60ea1654e54c4b2968ffc7ba44f3571fdfa697f3b2fd7c53afdea794aadf35abd2b6bfa8994ecdc9197c56dbfb276969493c926ec8a5db329bb61b7ec8eddb3066bb22d1eb373b6cd5ada1a3dfef6e7e7e697ddd54a4de4e75fab9daf24d6669d820575be7ca6e279acb58ed9cc129f3f7af6d9a8b885edfcfa5acae5b3cb46ac6770831986210cd3b00cdb9086a3926b78866f04da577c37fe56a3cfab35d18836a91d23fe665eacc2f91ebe7a9ea2251ac95ac76c6a89639deb824fc1fabfbe8e72f5f1603c1a4fcaf69e8d99f162cc8d576361bc292b7c37fac6c0181abbc69eb1affcc66cb4efef1337a7e9134ddcac76bee8d9e1b5e646b11f30faea994a96b8562bbfb125ea5e2656787ed89f30ea942ba3a171648c940e1e1b27ea73aaecefcc181be7ea2fa40be3d298185746eae7fcad1471b5261ad3cd6ae7bb7a60dc142ce8cb3d8a456d65bb6b1d137ef55ed9a4f0fd9f16aff047fec01e8cbb4c0fef8d86d1ccecb0affe5e185bea6faa8bdbeadfe92f47748c3fd547f853ee6f85261add0d75e299b7be9597ddc2b98ebf7c9ebbcdb5b56a892c307a820b260c21d4bf6f2adbb1ed13859e48c1fea47a1a0a8b0fd8b9b00d26a47032fdebd725e10a4ff822f8ebc77b36bcc3159a58ae1dd6e7f77ca83c748b2d69b7c5b75a04bec8d9d09723e7b2258ab52cb1d8c666a934bfafb25dc7a5fc21f7ed5afde89b2611c3ac06b6cfdf45221ec463e617f6d13fd47fc5933116cf62a674d31481f853f2f267a5559a5828e1b44e75cb235ec5828fc5dc287957ccff666ecee84c46f7eb67116f855cade5bdd65862a92faea289ba2f9fe9b6633d9f74490e96c4177cce4c9ce7d5e7b1785736d6576df3876798d7c301bbe2b618aa98c612bb624fec7faf3efe9569a59f58b6b31a6f9ccd4b35f4cd798b7c9cd5e8cd77fa878bfd2a6cad51c3aa258a8352ceca969a9b2f24601c6aadfea2fa240ca57ab52385bcc977b07f709b4f323fd11647a08362248ec58938253f513cab364b8833b5cfb1181b57e25cfc2673d53e4fcb35913d55eaa6c63a2ae3b5df9e41cbdadf1da112c5a763adf1377159b1b44f34919f95b67f6b5d9d98a8f2ad3d837a2a635244d614572a66b6942d2a4f515c8b69aa05e2466be2adb8531ee5bddadec8e26b53340d5f6c7db74efe1569b9268aed4ad9d7f45d977b3f7ec5f8f327397e64b191304bb496cd03e5f6e69658d1f6cf35717be39cb7d8c438543e5fcddc5d6589ef75e333fc4db479829638111db123ba4aef7a866b6c8bbb74469a88c4751647a7fe62d3e44660b24c13d57ea661d8a630cdf4976394b6fed663d02b345196cbde38a8d9ab6489e61af316f80b3fe68bd42f626df5d9a0bf815f15ad8c7584a8b6e3a5bee6d2f3c3237567ae38301deef053fa76734d641b45c9ca0ef2b9b2cc52649b59e2a47a4ed34b7d44f698b5ce6fa69ff5235a666086cafe7ac26423d6342371fbe12b9ab199a47ea2b2c506e8a7fa98e683e19bbff51aabe59aa8e2e472ddd48c7a54e26b7caecd27f399bbfc919ff285392b3e8f380bf180f5598775d69f535d7d3632dbafcca7e605bfc22c58aaf95ac8ad9ea76354661c153551c5f5e52b373628e57969ce644553593a4a97f0a0dc0fc6a274f40e2db1692e94c6a53af766be9b7d33ebcb3407e630eb57c4f8d9dc55db44b69fd645e3c5dc131df3b78e5f56686275a4afa6afb9ece9331c5b13aca4a7bddc358b9a95b3143ee24da65c6ed5f64e586946055bdef73c2cea62699d432ed7e641a1d7fb4068ddab5ae2679a2830be48355d9862c1241baa3bcbfc647ea234766a4a6e42af4e299aafb165b15071494f7984d7f97e547ec1711c993db273f3301b674e75ce34c6e651ba6685f5315ec92573641e9b27c64ce9a76d9e2afd3c33c7e6f9efb2ce66595aa1899588a5dcce65f550f2af28aa312f4aca958b6059a1853527fa8a052b295d67652fbb6815f64d0a5b73bd23a260cdf9f9bd69c4503a6751135f4adbf5d662a46e5ee1fefa1b5516d7e573e3f5737d5e5cd9aa39cde6174e540c7260de28db7e376fa1ff26fb3e610df3cebc4f758edd9987668359ecc26ce6f530fbabecd2dc3216e6b6e199adf4b7227ff55aa33f27add0c451a5ec6a7cff8a965ce3791f4b9698f3064b9a85bde1a2d86e66ebf372c7d895dc1453ae852e59554e13f3fd52c5b1c9aa257ea289dabe4b2b7cb27cf0d1c795182b8e83174a25d76f93f55d27d9ead0014fbdc61df579cfcd398c95af67a3ef77acf4b16f76cd5eaa811637c3f2888bc5ccb66594efe1774ecb3491899a7194352c91e672994ea9cc736d03df2b1ca17db5c2b7053bb1c4277658e8532ee6c9fc98ab5088aeac422d557d91922696eec7d27d87c572a2f63e376ffcae7ce66a69a531b0652b0bece567bb927fc8fbe634b5444b5a4eeaf759aef16c1e5b1ee85f1a375b9c352d4fb8857197a6e58bf9dfe71d39cb35b1a6dc6ae65755b464bfbee6f2f55a1cc3a57526565050ac4e5e13d9678a98b381721c4c117fa97fd42ace31af5a62b93faab45d6b7071ad02f889cce1d5319bda64e9f1513e2e2860215991fac45602f1b0fad886270699bdf5719c6f608c2d561e83b61e8c1beb91bf895fa88dd693f56ccdac176b6efdd2353bcb349137aaa566d4ac42aece0c80efcdabe5f55a3a46c7ce054bcce7e578ad3ad57deaa5781e23fed25ccbb3cfee830d540c32e191a9fc491117addbcacd852e6a9e49dfaeb5fa87e7da19e5cfc08af95ed512959f38608d8f78d87836e6d67b5eff846ba9d85af72be2f7d6405c5b43f16eed5adf9ab1a7ad70df3ab00ead236b641d5b27d6a975f6fd73eafb5fa289bc4e136be6122cb3c4caf1b9beac62eba9fb7d0ef23d1d4a13b56659f5fab2af742777c4476f67a98fd3aee6a73a1fbc7a1f2b532b5752c5dc410e7672eb653f49fa2ec72a0fef1f2d7221257ca254b0ffd147689d1be382fe0d8c0bebdd6c689ddcd2dfbbc235bbdf1911c7fc5d5897d6c4ba5216786d4dd5e744a59b5ff7569a659a286a565d8a4975bfa59658d2d4fc1aa4926fa9fbc2f3ed5c41130b3331543ce98a05f47558fbf92368764cc91fccbe2dc5f895f19152bcbd32159fc8d2ea1bec99f934c2fa389b1ee3635d9cfb9fe43e7dde4ddffd65dd5a772a5ec9fa07ad7bf56958cdb25fa86218d2c72de3dcda267d14b7c6e0bb6bf0ad56f60bec60833bf899aaf4627d63ae4aa11c976822ab8911ea9eab6a0dea3317bfcff79d15c733701e3e6be77d7fd6b1b00752c5d4855e61f33a97fbe23b01d03b2fad56b5b37eb9fc376bddc7b2541e692af515622f56699de22a4bcc8d4ad9dc667cc20e6c6574f831f90e9b998fe6b1790fe326b695fea8b171a5e2e5523f6266774e1a531bd7cc537135eaa32d0de7ebab5fad0bdbb15ddbb3766c5fdba0b6453bb0433bb2bfb96e242bb1657ee2564d99d5cc80a8be2d07bf2fc7ceb9fefd626ff8c79cc67c6fc747fb294aa31bf998b738362ef02d30a5d659f98966d1366bfcf7623cbfc26e2ac796da61d2c4b557ad16df5dc3849db0501c2add3fb41fc42193f6a36a5fe6f6138e971ca7f1b3f16c3fdb33a589a5f9892a7ebe3607f68bf218afcdadfcf7f6dc78b05fed8559b9f315b6d1b4dfc4a5fd6ef7950d9e946c903eaa8db607f6907d5b1997fa898f35655633eb699925563431d79b501a97c1b68e9f142d91de41531ee3cbbf0fa4f87e0a863e4b51138d03bb3017bc7ecde05a9ab85fd7475cb444fab6d43f30526df8a14a968a6fcaa3526bac89b4f7cc771d372b3fd1de3798b856965898a5a85ae57766a90845c5294a173f662d9e9ab17d601fda47f6c83e561a16da27f6a9bd22dab0c7f6b97da1f6bbb427cad2aa5a58d445dfbeb2afed6fbe9f6a992696fb03d7b644ea3311a591d6dc184b31b665b5632c1ff6c206a52be446018b3e04790f454d5456506c290feae655afa76146506d17eca2a74ccf4f2e524ffb46b377902df053b4c5356209fbd6be4bfb114d43b5d1cf061789c5edfbd2bceda638b51be9688ddd24bf316dbfed2df3d0e8d8dba9aed92d65376d653f23bb63efb0a0d622deecaedd935c32d51eb70a7ee12a5b4c7f97fe5bf3e236f113655dab561e13bcd35b8a2bf572b994856888c619f8a8d01f62d11c1da33c772037a7aa14570deb2cb19acaf3606aef63b93596fcc462fe74cef2bef041695cbcb8e2ebd375687c212d7195fa89e6bdfabb672ca46d8666cf8c8a7ea294d249fd6d6b68f6482fc58d752b5de9556d47fa3290a5d51e3262cf329649a683ebd8a0fea8f33dc847f98d75ad4b35b1a617a7d6126febeb89bf14c71e683c36b394424d7cace1cbf7c1e5461fca3d73855ecd429d8ed6b3c4baf597eb4718e5773e95e673889a7b2c8fa19746ff3eab23f92c67300787dd8944bec87956ebafac690e94359ea1fe9dc985ccfa09f8b97c37bbb22f07722812f3cdb0e5ae755cb19d96dc93fb7cce9bf28089b47eec5779288f32df6f031bccd9e2481ecb93cfee66a9256ed29f58a3e6e51afce8e929b5cef95961454dc0d8516962dee6b42696eb2dbf668da7737ecee4a9f9ca8ed88bf6133fb3c49ad951e5353bab9379b0ac04f43de67dd592266e6689cc96672a563e517638556a38962c6b67dbf25c663d45c6abbc909772a262e69ebc42dbbde643399537d296b759ffe39dbcab6a9cbc97af4a5f1ad64436e596dc56ff6ec9f6d7ec106db12377e41763974dc658eadeff56b644daa7e427eee7c79b8a9628f57cb1a225e2778b72bd399fbe27758d55f495d9cbebf7ff6579c8cd68358b3d9574fff988ff1b9ac843c7c8def970e508c7742c6d2753a569ccba766c3972a4e338aef1ea78f62c8da9d277a13bbe1338a113a55a6add3bb19394e28ea975ec3c388fcaae5ba9ff28996cab333d39cfd9e8c9976dd19e38b37cfbb781256e32ee5c699d95b697b4c47959727ceea8627f22c5c256afd03367918e94c675d7982bfdb925e6fb24314f95d5032b532e762b8e89ebbbcf8f2d7e5913f950e9a0d243655373e77589ef3685ef9d85f326ae9d771188c4e95b89f0f5bced13d32f6ba2ed3b037b50b4b9d45695250d9ddd6fd962c77af94affe2267371eade81b62c9e28f6271a41be67bb38de51ef276a4d74ca96283e5d3ff2b9255a957768152dd1e1d61eebc27bb62dd3bc36ab5ea4ee952ab50aa48971de124bf92b5ae29299d40e77f69c7de7c0393416ce911c7d1243287b74467ce2c01ced6718a3c6716adb39714e2b9aa8acaea67fe644c5d523e7eccbb698f5e938e3fa7b5a69891bcc4f649531c6f2bb6c787e3dfad2d22e5a22c3e7879f14624aad89e579f75fd4c4d2592ac714fba74bf39bab735d3fe616d5f7273ae7856bafd2c49ad5413833774729e1050badd34cf73ed7a3967de95ca6eb569c09f53d42ffa373e55c57ec78995d4f9585bace74b3d8b970de917c75367e67fff239db4e55076a2cbde25fa156f0e218d841be67bb38eefc3166521cedc3f3347f859f28e6c5f52bd577b3979ebb92476c562d3baa3f9262e7c238e44a4dacef69577ecf633acfc2b973eeed601d3b049d93b1d3709ae01fc2fcee4c23cf9dad35cf919dc7d9765a9bf6e314f271e46cfc36cd157e62f54d3147953adf29fb57b9e3f3df1734b138a7913ccbf25c9c65b1f3e7bfaf52b544c6cab3ff45693d7ec9124b5be17d00f9f4d1a3559c15a6bfcdbf8b77a526ae7a6f86d371762ab1c6aacf8975e5749d9e73e57283bb0ce677abcfc2356a3571b92e8e5cb1c1752bf990f7ee867322976ba251d5c49af19c62dbf4313fbaac89f99eede248d8c71a94fc3cfc15fd891bfb89b0b6a6649ba5fee4d28c9ad24ce7aa267ecc1a2e3d2978a459e8d92ee5aff856bd15ed186fca47a5730f399b59653fe8a749e65aaeed4a97cbdd6cfe8e6a6c5db76c57765b7267547f2ee5734a19afb637679af9aef57e823adef536b4c4e59a78552e7d5e999f589987a7f7e045ad2cd4456926191e631546ba73e3ce657f35d7ae9a4f691b061ff6ae47daca6bb0ddbaf39885f180a2259aa5b102be629d63711d0b7d6be55b94d57ee28ab75a994faeef0672ec86d615d5b31b49f6e91848164fdb87f245de66eb9de772ab1c83c88e7c75e3e5b664bb6eb2fc1aee83fbe83e2d8f6bec96bbe17b9e57be2bac54fa6665b6382fcf89d2f3618be370ca03ccf5e015e7bdd05c9ca2ede6c69d8befb27bb6f63fae5e7c0ea857bd6889e61ceca0a26b85770494eea3145b17df9198a68f31bfd2169a23b9b69fb8eafd6afc4d59e2cc7d71e7ce36d998fbea2edc3799f6003ea03dd6ea64daffedbebb7d7790fa8cb66bb7cb730b1d57c516d89f58b1ed13ebd8192cb1d3a9337587eeae3354c72d7916942eefb91badaf5ea189f34a1f9bcd62c1b8e91e08ee1e2a3fd22e478196b6c4d2184d71755271b6c1b8d676f5fcc472dc9aef0b2cdacf923116f4577879ee6f610e4ce94c46b12c0a7d32603f731ddb17b7e0b7eb6be2aaf71cba47f665a689a3bc96b92ff6c03d56cdef967b02f665a733a96bfb1add53e7d93d337d83b9e3bc5da9387ba07cc173dbb30fdd0bf5b9741676617cc55511f4323b73afdc17b9e75e677ec3b2f6b9eb4ec5062b5d5669e2fabf9683659aabdbe2180d9be57bb64beba368b4af593c42dbc876f12a1fe31be5df8aa171c3bc25e6df2a55c96fae0d2e9da93462257b9563474bce8afda6ab34b16ebdc1b2e4bcb937eead7b57b2af7bb7e136dd2d773bd3ada9db92f74bf44b699db390c7c642c67254d0acb68cdd8eb8b6fae2c6dd71bbec4db5d6bd6c9f4c633dee3e5bf57ee4545dfbc563f2d1abc64139cdf584712d773c73bdf5852bdf9f5833477155cabfe7e162c5ba91a2267ebcbfa47804ad6329af63c88f3996ea74b76a89f959f3e5d8e7e31d3e6ca7b4ad552a89b3e291a925526c5fda4247e46267d657f790ce1b77982116fcaa3866b0aa7698e3599ebda46f6f6a5d79d279b33b2a76e8b8bee72cd727c93cd73a55fea58e7b3ccff3d3598c66688ceda6c58c2d7368466ed77c779fb2eb8ddcc00b8a3afaf1f1a41c7ba117d99d15f1f5896ca4797212a726c2a8b1b6557ee266236007f97194f29ced1509d7f615dff2908f6d4b5ec23593f6aef9e470cbcaaf0654ffa6f783e4bfcde9112bbfc72137a3be64d3e5f7c9b64b476a4d2cbf2f87c6d7d7fefd904fdeb968be7af1d23670ea25de83f7a85aef7bd556f6568e8b9c58478ed644bbe53d79cfca0e3b699df1b937f35e8ca63737ce8c0bef35ed4b94236fe1bd5987b971eeb6f7eef5333d1db9734fbaaf4a43e7ab621667601da59aacf4b7677edaf7b6fab7076ade16b33c953cef7557fc92c61563f5fc3b20aabd79b5e7f98871f29af8f0e1a395dee3ad8ea0393595df8229af75aed8d5524d445fb5fc5ea0a5b9fe646d9cf92af756d8d78e67789137f08676a0e2e0a5f1036a28d9544b76bc5d6fcfdbf7d4fd7b87ea7394be53c2e87ba3741d8cf5ee1d2b1595dec0e97ee8b177a25ae4d3d41f751fbc33154505de589eafd0c4d447a59867ea5e7eb6ba70f5efb1f0fa370bd5a7429956e7462cad0b1c33e1c5f9f6f9da586f16abf6fa966ae25379cc4f7cfcbe4fbffe7bb4abedaa25e271a5f7f5e8f5ce6b6aa2f78956f0a95cd2e7475aa7e2e8a677e15d7a93b5c68ad33938ae77e55db3c8c3fe61efc6bb350fbd3be1c23c47d54a6f2b3f74e6dd7b0dd50a7388d1159fb9afdebbdd72858adf553cef35bd4adfd0c747c5d78134f4bcc8a9b7edb5bc15232f9ffd6edfbab3a56a561aaddbb6532f4ec11763b3fcbbc22aa3db7549afcb58a689554f91464a2aeb07cbe3ce555fe31a34b11867713ddf6c5d4d5c6d87c2b45edcab55b665fb2a9e49f5a9e3d5adbdcbeb217c46cedceb7a3d3ef7b9cf7cc317a926faa611f89637b386e23a5d13e3ab26d51dcad87794259efaaed250d73b559a7826c7caa6de534df4ce7ccf3a5dd18fd3f15de7d9c7be2195cf319f98877e602e895f3efdddbe357e535725bbba02db5ff3174ee877f5ac420f71710c847fbe2e7effc3e29669a2b2e8f2ba295cebc04bfdd3e5f93e356f4fc423fd729f37de8d5fe9f7a94d9fbc3bd27ef43f1beb53bea2b2968675ba24ce05fbbc72164a9da6ca1e9efc87f47d965ecf7ff49ffc67658f33ffc59ffbafe9ac0b95ef85ff265cffdd79f0fb9eaf3450ba7365e94d77883a78e625fe407d7fe6cee5d87e4ae748d6e7cb1ffaaebfeb1da3ad9e38237be6eff9fbfe41fd6fd67cfefbce356fe52fa7c3baf7e657dfd39db78f9ccda1cf5eec3764fdbc265662db4acabf15a06889794d14bc7c1c8c42f2d3a22596e7fb98154da631a04aff027abdeb68229b99b5f370724ff3e11a7362a6722c1fadcef2b98b72cb38f08fdc27dbf747f6857fcc674a139bf899f927fea9afda137f9cb6d3feb97837b68c0bffc2e9bad76e906adfb28f1cfb97cb35d19f284d7cf070deadda6fe25ff9d7fed41fdb17bc668dc13abf79bfe43d94b5755d38f7324f7198ef6da4dfd52b8e8194c78599b1ba560beb64f2ad73a1ffbaaa6d3027adf276c4ca5870e58a6843e5f744d2fb67d6d144f6c97c52ffc6bffdd4f73bb1aee4bdfa57657e431ab32adbbbf3effd066fb2d86f5a3bfe96bfedb7d88be22e5fa4b6c85f952d3ef96d67cf6ffb2ae6f377fc6eea2f8a73f9e835617c27d5bfbabfeed0ef057cd9fc5d2f71830f4d944c1a01b3bcc0b89805b56b003fd7c46c25c0fe8af2ac5dab98d5d24eed11e92a9ed39c2562ad17fb5858bfac17abfad98b7958ae89cce1e599865944c74b6fd916959967e52b1a013cd765edd32baa5ecb4754f2fce96f6604667e6c65497c9ac8d7d25abc69b64e7e648f02cb3fe48781f29c021938812bdbeec89eb851c0c55be0c92e6f067ef659044110b22bbb1944416c1ea6eb028344da4af7e42a4d4cfdc0e061599fa37b2bc7c163908d4da7fd50c1b3191917c12c7809e65fd5c434862ecf9ccea515be4ecd2ae27d884b69fd6fdae70bfb967cb8bab7cb2f899ecabfce915fc55a9e7345eb9059fa5e88a9c3e19def953e82ca7c9feab308df8bb256e37cb2b21f509e01bfce6fb805af9fb4cde91cb0a1752c1f8285ddcfe645b4d2993bc19be3c886d90ede837e30507affaa6c6d18ec066f999db61c69dc067bc1befabe191cf0a67995da63a02c3038b2b8bda52cf12c1805c772bc5c0fc14ff4c66e1c9c38342e53d4c4be6abd4113953e06a7c159309693e05cdd57ed7b96d7d1c4ac06c5b2369aad88ffcc83d25c9d83bab5c6981397254ac1aec9e6ebc62cebe2f1eafc3ee79c45cabb0dd990994c167d0779cafae2b2fc3e12f65e3a6be5fd08d5f771c27c1dde306ef82d1be9fe48ecdd0fcabf65d0507e307adc6adf35de97205ee5cb6a3df47de7c191d649f0144cec436f476eb9b1aaf943f7c21da7f3a683abe03a980637cace6e952dde05f7d938cc89f320afd3f9a776a4be075d6c044de300deaba3ecf0c2ed065b5ea82c6da91e829f98eaa23d50f638a989e903f5ff63da33e94cd3fde44eba3e3bf545836dabe65710d6d344b4abd7badfeb0b5aab8e514fe43d1cc5d27ef24f7f792a5548a5936fcbd608089e1f7161b3e5bec192f32fe94936a6ca073966c2da537f6b7ed58a05e24d59502e7211859e5a7554fa9ec71b1a632d6ba209fb38fc8a3bacd64faa969cfb5ca335fae3aaf8563e28ff6ba4fcc46c8db21c29fb7b80773dd801df09da41c75f043b41a0746f1674835ec8d37e9c90f9a1badf4168f045a6874a1743119ae97b76cc6e6885762843c79d61dcfc892eba73db0dab7325d23943e027fa76e0befaae698a53e33df4d2e75ef66aee774d4d84641eb807fcace4b1a5bfcff5c99c0b7ec144f9b704be9a9497d950f53c66b1e97e167bfeea643daafb78377a7c6cdcb095bf3c53d1c48d7f95c73d5216b67c4eb5e7b4d27e1bbb251ffdeafb93a68ef2c443df3f0b83405869ffe1220cc308df7d78227918fb0dff318d59524df47a61e233d6081f9ce7f0d1f7d2f93fabf5f0e3e306de7df854b44539721b693fa47d193e87b3cca71c842f66e45f8773ef864775bfe9b48926522abf2f1692f2e12d7baddf52fe7748a5f7e93d7ffc06d1ba297c5d3a3f301d431e6676a86c305cc84a5c93f623876fe17bd8f70ec34138e4b37097ed867bd9bb6ed4319285fb2a8fe827a6f17378101e8647613aef61a1ac2bed2f7cc5bf9fea62781c9ea8bf0fd0779e8e59bb4dd04b7f573628ce0e4f83b13108cfc271ddafee6daa89784c795ce1a3b5fc5bfcdec2bf2219e579641b6b62781e5e2c999375e93ce0bcd7a93d721675ef35b43ae1653809afd479aefd858a9317e19459e18d7d92da8a9f98e7e12de9a1da7617de870dcf7027ee8377e23eb851f6b76177d2319674bcb9a485a7c5185a36c2a62743373dde15b45d8ec3c7700be26fdf75fd8089d334ae0883daf7067e411357fc36cac66b0bffa9a9a2891bbf1ddd326bfb47a6ce349bd77f427d8975fd79eabb4eb8cd9a7ee69186adb06d2a0f39ecf0b967a5f3b4c39db0cbe7ca7f5c64dff722ee9ce27bc1f4271b6bbeb78e3dd73af25c67a4fdc69933f20cef3d1b7799290b4bc7a3772356d55137003f12f431322211999175318b6cfb469a6c50ec4ffd8a26d6f4f352fa74eecfbf4bfa059ad8add344bb1d4967375bcff4e04cad53f774c9dc456589e22e72d258357255fbbcc862e4c03c8f3cebda19383be141e4474114864114b9d1aa183d7d0f58e852bcec46d9bb22da1f1febca1551ec0c56f996aaa54eec9328f16ea387e8317a12a7664fdc14e6e57d4113ebdede84e91745257fff14954b66633fd17f082f684e95b689b6aaf34c8794de34031ebd2c1b6b76c7d19c79d1aba75aa968c1ed7037f30717d15bf49e8e8b38db515f36a281fa0ce97d26f576a83ec7300f47595a52df77685d47bbd19ecad7727f5246fbd1417428f6a223714dbf9710898fb8ef8b9ab86c14f8c74fc4f42b3431cae634c807f74176b23abff286795fcdbe74ec656b9eac8e3d8b8ea313e72eb3c5d33051bee24be04767ecca91f0db0135eba8aa36dd76277e360f47e9e668d97ede891c67fd8a4bc6a9c386b2d2201a1bd7ac69bf1867e6307bbbe399f21bf56f2e7e45132bbf6db2a48feddf39553471633f5169e2917b674da373ef345d2fe20fd379d2399d79b3afc0b793237f681da71f1dc7f8caef9b194e74115d4693e82aba8ea6fe29b3cd7974139d6ff2ce1bb7a1dae5532fd1eb08ebf63b02dd735cc85f749bb2c7d5df57df4dd7457baefa18ca4e67de83bfcb3cf124dcf47db79617dde9f5165fd2c4ea9c16b44463d333fd539359fe05e08d3591c5d1bdd2c251d4f03d7762fbd02f97d3999964eeadf74ef16dd4549f2db791c6bdd1b63d895a51dbe8dbcda8133d2975dc89bad28f7a312face1ffcc16a73153e767abf6950fbe0bfd8ab1e129b7206a407ee443ccd23e4577e2bd7fc4df721c8bd864cd609cbeff3bb61c1d597c4d1397c52c757de7ff9ea9b2066b633fd132ad89d77743a52b9ed2c49d743d5ddeefcafe52bc4adf67ac2cf735ba0d1766375d9792fe9e5f6c472c5b8b9fd3358fcbf13ab6f899cd7a1caf3f8ba5ed66f31795365a472ace492af9c3383a768cd7d875f6628f45343ffe6b9a58f3cc67e9b3794eff3ea962891b6ba2f91afba9df957e1c3b1dbb5d6fcc83625567a0dae7ecf7598cb338908d3854fe26adcd9aba09ccbfcef7d9146dce9f2c9b7b5b88ab27fa9a328e6c57b5e6b3d42f4c8f4d35b19a37d56637947ec6663b4e8297f881c66bbfaa89e97b73aabf16cb265f39d33f31552c71633f317ef4ef3e74c49eac37de91fbdbf42273d770e2a7f8399e3912e65b830dc52fe9bc6b377d07593a8f30749bfe40e9aff00ce50fb6557b3b8c59da1fa87ccfd5f14caa7b1ff31583d0950f5e5f71337b9f4950d1c3577b92aeef57d719bbbbf1dc1ec6aff1026296af6a2224c1c5653a3380f595551ef2bdbfd3ef09ffb9c929afa8da5813839e77f9313f70fd71e08ff1e0f0297eb35fe277e739f5df50b7981bf903e54fc29a94136b541c3b49fdbc34ce4d754d9d43500c54df7793fa82512397bf5375be211ce74f947597f324b0cfe716b4de7d8cfb118bb3df55feba26fea455a9326f71433f91cfe3e167f3033ff93b8b775de90c4237ebe7abfa95afca12476e4eb7f07a05bfd31d46e7cadace6592c6bfb976fc58c5c28d9afde17c33ef2cda2fe727f51db3... [truncated message content] |
From: <te...@us...> - 2003-07-17 10:41:29
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv11672 Modified Files: cli.py gui.py guisettings.py dvd.py config.py Log Message: Added ability to set DVD device in settings dialogue/screen, and removed from config.py Also put in ability to change video bitrate directly in CLI Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** cli.py 16 Jul 2003 13:23:49 -0000 1.12 --- cli.py 17 Jul 2003 10:41:22 -0000 1.13 *************** *** 88,91 **** --- 88,92 ---- print "(e) Mencoder:\t%s" % (self.config['mencoder']) print "(t) Tcprobe:\t%s" % (self.config['tcprobe']) + print "(v) DVD Device\t%s" % (self.config['dvd_device']) print "(o) Default output dir:\t%s" % (self.config['outputdir']) print "" *************** *** 105,109 **** print " Length: \t\t%s" % (track['timelabel']) print "(s) File size: \t%sMB" % (track['size']) ! print " Video bitrate: \t%skbps" % (track['vbr']) print "(a) Audio bitrate: \t%skbps" % (track['abr']) print "(r) Rip track? \t%s" % (track['rip']) --- 106,110 ---- print " Length: \t\t%s" % (track['timelabel']) print "(s) File size: \t%sMB" % (track['size']) ! print "(v) Video bitrate: \t%skbps" % (track['vbr']) print "(a) Audio bitrate: \t%skbps" % (track['abr']) print "(r) Rip track? \t%s" % (track['rip']) *************** *** 163,167 **** self.askTrack() self.main("track", track) ! def changeDir(self): #print "" --- 164,168 ---- self.askTrack() self.main("track", track) ! def changeDir(self): #print "" *************** *** 245,248 **** --- 246,251 ---- elif choice == 't': self.changePath("tcprobe") + elif choice == 'v': + self.changePath("dvd_device") elif choice == 'o': self.changePath("outputdir") *************** *** 383,386 **** --- 386,391 ---- elif choice == 's': self.changeSize(track) + elif choice == 'v': + self.changeVBR(track) elif choice == 'a': self.changeABR(track) *************** *** 421,424 **** --- 426,446 ---- self.main("track", track) + def changeVBR(self, track): + #print "" + print output.bold("\nEnter new video bitrate (kbps):") + try: + vbr = raw_input("> ") + except KeyboardInterrupt: + print output.bold("\n\nExiting...") + sys.exit(2) + try: + vbr = int(vbr) + except: + print output.bold("Invalid bitrate!") + self.changeVBR(track) + track['vbr'] = vbr + track['size'] = int(self.calcFileSize(track['time'], track['abr'], track['vbr'])) + self.main("track", track) + def changeABR(self, track): #print "" *************** *** 439,443 **** track['abr'] = abr track['vbr'] = self.calcRate(track['time'], abr, track['size']) ! self.main("track", track) def changeRip(self, track): --- 461,465 ---- track['abr'] = abr track['vbr'] = self.calcRate(track['time'], abr, track['size']) ! self.main("track", track) def changeRip(self, track): Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** gui.py 16 Jul 2003 18:44:31 -0000 1.12 --- gui.py 17 Jul 2003 10:41:22 -0000 1.13 *************** *** 382,385 **** --- 382,386 ---- 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'])) *************** *** 392,395 **** --- 393,397 ---- 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) *************** *** 422,426 **** """Launch file dialogue and set path to Tcprobe""" self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! mplayer = QFileDialog.getOpenFileName( self.path, \ "*", \ --- 424,428 ---- """Launch file dialogue and set path to Tcprobe""" self.path = re.compile('(/.*)/.*').search(self.config['tcprobe']).group(1) ! tcprobe = QFileDialog.getOpenFileName( self.path, \ "*", \ *************** *** 430,433 **** --- 432,449 ---- 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""" *************** *** 443,446 **** --- 459,463 ---- 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() *************** *** 458,461 **** --- 475,479 ---- 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() *************** *** 469,472 **** --- 487,491 ---- 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']) Index: guisettings.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guisettings.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** guisettings.py 14 Jul 2003 17:46:26 -0000 1.6 --- guisettings.py 17 Jul 2003 10:41:22 -0000 1.7 *************** *** 3,7 **** # Form implementation generated from reading ui file 'ui/guisettings.ui' # ! # Created: Fri Jul 11 14:26:00 2003 # by: The PyQt User Interface Compiler (pyuic) 3.6 # --- 3,7 ---- # Form implementation generated from reading ui file 'ui/guisettings.ui' # ! # Created: Thu Jul 17 11:16:50 2003 # by: The PyQt User Interface Compiler (pyuic) 3.6 # *************** *** 293,299 **** self.image0 = QPixmap(image0_data) ! image1 = QPixmap(image1_data) ! image2 = QPixmap(image2_data) ! image3 = QPixmap(image3_data) if not name: --- 293,299 ---- self.image0 = QPixmap(image0_data) ! self.image1 = QPixmap(image1_data) ! self.image2 = QPixmap(image2_data) ! self.image3 = QPixmap(image3_data) if not name: *************** *** 305,354 **** dialogSettingsLayout = QGridLayout(self,1,1,12,6,"dialogSettingsLayout") - self.groupBox2 = QGroupBox(self,"groupBox2") - self.groupBox2.setSizePolicy(QSizePolicy(5,1,0,0,self.groupBox2.sizePolicy().hasHeightForWidth())) - self.groupBox2.setColumnLayout(0,Qt.Vertical) - self.groupBox2.layout().setSpacing(6) - self.groupBox2.layout().setMargin(12) - groupBox2Layout = QGridLayout(self.groupBox2.layout()) - groupBox2Layout.setAlignment(Qt.AlignTop) - - self.l_aspectRatio = QLabel(self.groupBox2,"l_aspectRatio") - self.l_aspectRatio.setSizePolicy(QSizePolicy(5,0,0,0,self.l_aspectRatio.sizePolicy().hasHeightForWidth())) - - groupBox2Layout.addWidget(self.l_aspectRatio,0,2) - - self.aspectRatio = QComboBox(0,self.groupBox2,"aspectRatio") - - groupBox2Layout.addWidget(self.aspectRatio,0,3) - - self.c_pdamode = QCheckBox(self.groupBox2,"c_pdamode") - - groupBox2Layout.addWidget(self.c_pdamode,1,2) - - self.l_deinterlacing = QLabel(self.groupBox2,"l_deinterlacing") - self.l_deinterlacing.setSizePolicy(QSizePolicy(5,0,0,0,self.l_deinterlacing.sizePolicy().hasHeightForWidth())) - - groupBox2Layout.addWidget(self.l_deinterlacing,0,0) - - self.deInterlacing = QComboBox(0,self.groupBox2,"deInterlacing") - - groupBox2Layout.addWidget(self.deInterlacing,0,1) - - self.l_Passes = QLabel(self.groupBox2,"l_Passes") - self.l_Passes.setSizePolicy(QSizePolicy(1,0,0,0,self.l_Passes.sizePolicy().hasHeightForWidth())) - - groupBox2Layout.addWidget(self.l_Passes,1,0) - - self.encoderPasses = QComboBox(0,self.groupBox2,"encoderPasses") - self.encoderPasses.setSizePolicy(QSizePolicy(1,0,0,0,self.encoderPasses.sizePolicy().hasHeightForWidth())) - - groupBox2Layout.addWidget(self.encoderPasses,1,1) - - dialogSettingsLayout.addWidget(self.groupBox2,1,0) - layout2 = QHBoxLayout(None,0,6,"layout2") self.b_Save = QPushButton(self,"b_Save") ! self.b_Save.setIconSet(QIconSet(image1)) layout2.addWidget(self.b_Save) spacer = QSpacerItem(170,20,QSizePolicy.Expanding,QSizePolicy.Minimum) --- 305,312 ---- dialogSettingsLayout = QGridLayout(self,1,1,12,6,"dialogSettingsLayout") layout2 = QHBoxLayout(None,0,6,"layout2") self.b_Save = QPushButton(self,"b_Save") ! self.b_Save.setIconSet(QIconSet(self.image1)) layout2.addWidget(self.b_Save) spacer = QSpacerItem(170,20,QSizePolicy.Expanding,QSizePolicy.Minimum) *************** *** 356,364 **** self.b_OK = QPushButton(self,"b_OK") ! self.b_OK.setIconSet(QIconSet(image2)) layout2.addWidget(self.b_OK) self.b_Cancel = QPushButton(self,"b_Cancel") ! self.b_Cancel.setIconSet(QIconSet(image3)) layout2.addWidget(self.b_Cancel) --- 314,322 ---- self.b_OK = QPushButton(self,"b_OK") ! self.b_OK.setIconSet(QIconSet(self.image2)) layout2.addWidget(self.b_OK) self.b_Cancel = QPushButton(self,"b_Cancel") ! self.b_Cancel.setIconSet(QIconSet(self.image3)) layout2.addWidget(self.b_Cancel) *************** *** 387,411 **** groupBox1Layout.addWidget(self.l_mplayer,0,0) ! self.mplayer = QLineEdit(self.groupBox1,"mplayer") ! self.mplayer.setSizePolicy(QSizePolicy(3,0,0,0,self.mplayer.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.mplayer,0,1) ! self.l_outputDir = QLabel(self.groupBox1,"l_outputDir") ! self.l_outputDir.setSizePolicy(QSizePolicy(5,0,0,0,self.l_outputDir.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addMultiCellWidget(self.l_outputDir,3,3,0,2) ! self.b_browseMencoder = QPushButton(self.groupBox1,"b_browseMencoder") ! groupBox1Layout.addWidget(self.b_browseMencoder,1,2) ! self.b_browseTcprobe = QPushButton(self.groupBox1,"b_browseTcprobe") ! groupBox1Layout.addWidget(self.b_browseTcprobe,2,2) ! self.b_selectOutputDir = QPushButton(self.groupBox1,"b_selectOutputDir") ! groupBox1Layout.addWidget(self.b_selectOutputDir,4,2) self.mencoder = QLineEdit(self.groupBox1,"mencoder") --- 345,369 ---- groupBox1Layout.addWidget(self.l_mplayer,0,0) ! self.l_mencoder = QLabel(self.groupBox1,"l_mencoder") ! self.l_mencoder.setSizePolicy(QSizePolicy(0,0,0,0,self.l_mencoder.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.l_mencoder,1,0) ! self.outputDir = QLineEdit(self.groupBox1,"outputDir") ! groupBox1Layout.addMultiCellWidget(self.outputDir,5,5,0,1) ! self.b_selectOutputDir = QPushButton(self.groupBox1,"b_selectOutputDir") ! groupBox1Layout.addWidget(self.b_selectOutputDir,5,2) ! self.l_outputDir = QLabel(self.groupBox1,"l_outputDir") ! self.l_outputDir.setSizePolicy(QSizePolicy(5,0,0,0,self.l_outputDir.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addMultiCellWidget(self.l_outputDir,4,4,0,2) ! self.textLabel1 = QLabel(self.groupBox1,"textLabel1") ! groupBox1Layout.addWidget(self.textLabel1,3,0) self.mencoder = QLineEdit(self.groupBox1,"mencoder") *************** *** 414,421 **** groupBox1Layout.addWidget(self.mencoder,1,1) ! self.l_mencoder = QLabel(self.groupBox1,"l_mencoder") ! self.l_mencoder.setSizePolicy(QSizePolicy(0,0,0,0,self.l_mencoder.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.l_mencoder,1,0) self.tcprobe = QLineEdit(self.groupBox1,"tcprobe") --- 372,379 ---- groupBox1Layout.addWidget(self.mencoder,1,1) ! self.mplayer = QLineEdit(self.groupBox1,"mplayer") ! self.mplayer.setSizePolicy(QSizePolicy(3,0,0,0,self.mplayer.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.mplayer,0,1) self.tcprobe = QLineEdit(self.groupBox1,"tcprobe") *************** *** 424,451 **** groupBox1Layout.addWidget(self.tcprobe,2,1) ! self.outputDir = QLineEdit(self.groupBox1,"outputDir") ! groupBox1Layout.addMultiCellWidget(self.outputDir,4,4,0,1) dialogSettingsLayout.addWidget(self.groupBox1,0,0) self.languageChange() ! self.resize(QSize(537,360).expandedTo(self.minimumSizeHint())) self.clearWState(Qt.WState_Polished) self.connect(self.b_Cancel,SIGNAL("clicked()"),self,SLOT("accept()")) - self.l_aspectRatio.setBuddy(self.aspectRatio) - self.l_deinterlacing.setBuddy(self.deInterlacing) - self.l_Passes.setBuddy(self.encoderPasses) self.l_tcprobe.setBuddy(self.tcprobe) self.l_mplayer.setBuddy(self.mplayer) - self.l_outputDir.setBuddy(self.outputDir) self.l_mencoder.setBuddy(self.mencoder) def languageChange(self): self.setCaption(self.tr("Configuration - QuickRip")) self.groupBox2.setTitle(self.tr("Me&ncoder Options")) self.l_aspectRatio.setText(self.tr("As&pect ratio:")) --- 382,506 ---- groupBox1Layout.addWidget(self.tcprobe,2,1) ! self.dvdDevice = QLineEdit(self.groupBox1,"dvdDevice") ! self.dvdDevice.setSizePolicy(QSizePolicy(3,0,0,0,self.dvdDevice.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.dvdDevice,3,1) ! ! self.b_browseMencoder = QPushButton(self.groupBox1,"b_browseMencoder") ! ! groupBox1Layout.addWidget(self.b_browseMencoder,1,2) ! ! self.b_browseTcprobe = QPushButton(self.groupBox1,"b_browseTcprobe") ! ! groupBox1Layout.addWidget(self.b_browseTcprobe,2,2) ! ! self.b_browseDVD = QPushButton(self.groupBox1,"b_browseDVD") ! ! groupBox1Layout.addWidget(self.b_browseDVD,3,2) dialogSettingsLayout.addWidget(self.groupBox1,0,0) + self.groupBox2 = QGroupBox(self,"groupBox2") + self.groupBox2.setSizePolicy(QSizePolicy(5,1,0,0,self.groupBox2.sizePolicy().hasHeightForWidth())) + self.groupBox2.setColumnLayout(0,Qt.Vertical) + self.groupBox2.layout().setSpacing(6) + self.groupBox2.layout().setMargin(12) + groupBox2Layout = QGridLayout(self.groupBox2.layout()) + groupBox2Layout.setAlignment(Qt.AlignTop) + + self.l_aspectRatio = QLabel(self.groupBox2,"l_aspectRatio") + self.l_aspectRatio.setSizePolicy(QSizePolicy(5,0,0,0,self.l_aspectRatio.sizePolicy().hasHeightForWidth())) + + groupBox2Layout.addWidget(self.l_aspectRatio,0,2) + + self.aspectRatio = QComboBox(0,self.groupBox2,"aspectRatio") + + groupBox2Layout.addWidget(self.aspectRatio,0,3) + + self.c_pdamode = QCheckBox(self.groupBox2,"c_pdamode") + + groupBox2Layout.addWidget(self.c_pdamode,1,2) + + self.l_deinterlacing = QLabel(self.groupBox2,"l_deinterlacing") + self.l_deinterlacing.setSizePolicy(QSizePolicy(5,0,0,0,self.l_deinterlacing.sizePolicy().hasHeightForWidth())) + + groupBox2Layout.addWidget(self.l_deinterlacing,0,0) + + self.deInterlacing = QComboBox(0,self.groupBox2,"deInterlacing") + + groupBox2Layout.addWidget(self.deInterlacing,0,1) + + self.l_Passes = QLabel(self.groupBox2,"l_Passes") + self.l_Passes.setSizePolicy(QSizePolicy(1,0,0,0,self.l_Passes.sizePolicy().hasHeightForWidth())) + + groupBox2Layout.addWidget(self.l_Passes,1,0) + + self.encoderPasses = QComboBox(0,self.groupBox2,"encoderPasses") + self.encoderPasses.setSizePolicy(QSizePolicy(1,0,0,0,self.encoderPasses.sizePolicy().hasHeightForWidth())) + + groupBox2Layout.addWidget(self.encoderPasses,1,1) + + dialogSettingsLayout.addWidget(self.groupBox2,1,0) + self.languageChange() ! self.resize(QSize(521,408).expandedTo(self.minimumSizeHint())) self.clearWState(Qt.WState_Polished) self.connect(self.b_Cancel,SIGNAL("clicked()"),self,SLOT("accept()")) self.l_tcprobe.setBuddy(self.tcprobe) self.l_mplayer.setBuddy(self.mplayer) self.l_mencoder.setBuddy(self.mencoder) + self.l_outputDir.setBuddy(self.outputDir) + self.l_aspectRatio.setBuddy(self.aspectRatio) + self.l_deinterlacing.setBuddy(self.deInterlacing) + self.l_Passes.setBuddy(self.encoderPasses) def languageChange(self): self.setCaption(self.tr("Configuration - QuickRip")) + self.b_Save.setText(self.tr("&Save settings","g")) + self.b_Save.setAccel(self.tr("Alt+S")) + self.b_OK.setText(self.tr("&OK","g")) + self.b_OK.setAccel(self.tr("Alt+O")) + self.b_Cancel.setText(self.tr("&Cancel","g")) + self.b_Cancel.setAccel(self.tr("Alt+C")) + self.groupBox1.setTitle(self.tr("&Paths")) + self.l_tcprobe.setText(self.tr("&Tcprobe:")) + self.b_browseMPlayer.setText(self.tr("&Browse")) + self.b_browseMPlayer.setAccel(self.tr("Alt+B")) + self.l_mplayer.setText(self.tr("&MPlayer:")) + self.l_mencoder.setText(self.tr("Mencode&r:")) + QToolTip.add(self.outputDir,self.tr("Directory where QuickRip saves files")) + QWhatsThis.add(self.outputDir,self.tr("The default directory where\n" + "QuickRip should save ripped\n" + "DVD files")) + self.b_selectOutputDir.setText(self.tr("Brow&se")) + self.b_selectOutputDir.setAccel(self.tr("Alt+S")) + self.l_outputDir.setText(self.tr("&Default output directory:")) + self.textLabel1.setText(self.tr("DVD device:")) + self.mencoder.setText(QString.null) + QToolTip.add(self.mencoder,self.tr("Path to mencoder binary")) + QWhatsThis.add(self.mencoder,self.tr("The path to <tt>mencoder</tt> binary\n" + "(e.g. <tt>/usr/bin/mencoder</tt>)")) + self.mplayer.setText(QString.null) + QToolTip.add(self.mplayer,self.tr("Path to mplayer binary")) + QWhatsThis.add(self.mplayer,self.tr("The path to <tt>mplayer</tt> binary\n" + "(e.g. <tt>/usr/bin/mplayer</tt>)")) + self.tcprobe.setText(QString.null) + QToolTip.add(self.tcprobe,self.tr("Path to tcprobe binary")) + QWhatsThis.add(self.tcprobe,self.tr("The path to the <tt>tcprobe</tt> binary\n" + "(e.g. <tt>/usr/bin/tcprobe</tt>)")) + self.dvdDevice.setText(QString.null) + QToolTip.add(self.dvdDevice,self.tr("Path to tcprobe binary")) + QWhatsThis.add(self.dvdDevice,self.tr("The path to the <tt>tcprobe</tt> binary\n" + "(e.g. <tt>/usr/bin/tcprobe</tt>)")) + self.b_browseMencoder.setText(self.tr("B&rowse")) + self.b_browseMencoder.setAccel(self.tr("Alt+R")) + self.b_browseTcprobe.setText(self.tr("Bro&wse")) + self.b_browseTcprobe.setAccel(self.tr("Alt+W")) + self.b_browseDVD.setText(self.tr("Bro&wse")) + self.b_browseDVD.setAccel(self.tr("Alt+W")) self.groupBox2.setTitle(self.tr("Me&ncoder Options")) self.l_aspectRatio.setText(self.tr("As&pect ratio:")) *************** *** 475,512 **** self.encoderPasses.insertItem(self.tr("Two Pass")) self.encoderPasses.insertItem(self.tr("Three Pass")) - self.b_Save.setText(self.tr("&Save settings","g")) - self.b_Save.setAccel(self.tr("Alt+S")) - self.b_OK.setText(self.tr("&OK","g")) - self.b_OK.setAccel(self.tr("Alt+O")) - self.b_Cancel.setText(self.tr("&Cancel","g")) - self.b_Cancel.setAccel(self.tr("Alt+C")) - self.groupBox1.setTitle(self.tr("&Paths")) - self.l_tcprobe.setText(self.tr("&Tcprobe:")) - self.b_browseMPlayer.setText(self.tr("&Browse")) - self.b_browseMPlayer.setAccel(self.tr("Alt+B")) - self.l_mplayer.setText(self.tr("&MPlayer:")) - self.mplayer.setText(QString.null) - QToolTip.add(self.mplayer,self.tr("Path to mplayer binary")) - QWhatsThis.add(self.mplayer,self.tr("The path to <tt>mplayer</tt> binary\n" - "(e.g. <tt>/usr/bin/mplayer</tt>)")) - self.l_outputDir.setText(self.tr("&Default output directory:")) - self.b_browseMencoder.setText(self.tr("B&rowse")) - self.b_browseMencoder.setAccel(self.tr("Alt+R")) - self.b_browseTcprobe.setText(self.tr("Bro&wse")) - self.b_browseTcprobe.setAccel(self.tr("Alt+W")) - self.b_selectOutputDir.setText(self.tr("Brow&se")) - self.b_selectOutputDir.setAccel(self.tr("Alt+S")) - self.mencoder.setText(QString.null) - QToolTip.add(self.mencoder,self.tr("Path to mencoder binary")) - QWhatsThis.add(self.mencoder,self.tr("The path to <tt>mencoder</tt> binary\n" - "(e.g. <tt>/usr/bin/mencoder</tt>)")) - self.l_mencoder.setText(self.tr("Mencode&r:")) - self.tcprobe.setText(QString.null) - QToolTip.add(self.tcprobe,self.tr("Path to tcprobe binary")) - QWhatsThis.add(self.tcprobe,self.tr("The path to the <tt>tcprobe</tt> binary\n" - "(e.g. <tt>/usr/bin/tcprobe</tt>)")) - QToolTip.add(self.outputDir,self.tr("Directory where QuickRip saves files")) - QWhatsThis.add(self.outputDir,self.tr("The default directory where\n" - "QuickRip should save ripped\n" - "DVD files")) --- 530,532 ---- Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** dvd.py 14 Jul 2003 17:43:13 -0000 1.21 --- dvd.py 17 Jul 2003 10:41:22 -0000 1.22 *************** *** 72,75 **** --- 72,81 ---- 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')) return (config, parser) *************** *** 97,102 **** --- 103,111 ---- if not tcprobe:# == "": self.int_configError("tcprobe") + # Find home directory outdir = os.path.expanduser("~") + dvd_device = os.path.join("/", "dev", "dvd") + # Create config *************** *** 107,110 **** --- 116,120 ---- 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) *************** *** 189,193 **** for i in range(int(self.numtitles) + 1): if i > 0: ! cmd_tcprobe = "".join([str(self.config['tcprobe']), " -i ", config.dvd_device + " -T ", str(i) + " 2>&1"]) text = os.popen(cmd_tcprobe).readlines() del cmd_tcprobe --- 199,203 ---- for i in range(int(self.numtitles) + 1): if i > 0: ! cmd_tcprobe = "".join([str(self.config['tcprobe']), " -i ", self.config['dvd_device'] + " -T ", str(i) + " 2>&1"]) text = os.popen(cmd_tcprobe).readlines() del cmd_tcprobe Index: config.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/config.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** config.py 17 Jul 2003 10:08:57 -0000 1.7 --- config.py 17 Jul 2003 10:41:22 -0000 1.8 *************** *** 18,22 **** copyright = "(C) 2003 Tom Chance" license = "GNU General Public License (GPL) (see LICENSE file)" - dvd_device = os.path.join("/", "dev", "dvd") paths = os.environ['PATH'].split(":") #paths = ['/bin', '/usr/bin/', '/usr/local/bin/', '/opt/bin/', '/sbin/', '/usr/sbin/', '/usr/X11R6/lib/X11/bin'] --- 18,21 ---- |
From: <te...@us...> - 2003-07-17 10:09:00
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv5221 Modified Files: config.py Log Message: Make paths object scan $PATH to get a fuller picture Index: config.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/config.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** config.py 15 Jun 2003 20:18:35 -0000 1.6 --- config.py 17 Jul 2003 10:08:57 -0000 1.7 *************** *** 19,23 **** license = "GNU General Public License (GPL) (see LICENSE file)" dvd_device = os.path.join("/", "dev", "dvd") ! paths = ['/bin', '/usr/bin/', '/usr/local/bin/', '/opt/bin/', '/sbin/', '/usr/sbin/', '/usr/X11R6/lib/X11/bin'] icon = os.path.join("icons", "quickrip.xpm") qr_dir = "/usr/share/quickrip" --- 19,24 ---- license = "GNU General Public License (GPL) (see LICENSE file)" dvd_device = os.path.join("/", "dev", "dvd") ! paths = os.environ['PATH'].split(":") ! #paths = ['/bin', '/usr/bin/', '/usr/local/bin/', '/opt/bin/', '/sbin/', '/usr/sbin/', '/usr/X11R6/lib/X11/bin'] icon = os.path.join("icons", "quickrip.xpm") qr_dir = "/usr/share/quickrip" |
From: <te...@us...> - 2003-07-16 18:44:35
|
Update of /cvsroot/quickrip/quickrip/ui In directory sc8-pr-cvs1:/tmp/cvs-serv24612/ui Modified Files: guiprogressdialogue.ui Log Message: Consolidated progress dialogues into one UI file, with an empty space for progress bars. These are then put in as appropriate in GUI.py (in GUI.openRipDialogue) Index: guiprogressdialogue.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/ui/guiprogressdialogue.ui,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** guiprogressdialogue.ui 29 Apr 2003 11:13:37 -0000 1.1.1.1 --- guiprogressdialogue.ui 16 Jul 2003 18:44:31 -0000 1.2 *************** *** 1,7 **** <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> ! <class>dialogProgress</class> <widget class="QDialog"> <property name="name"> ! <cstring>dialogProgress</cstring> </property> <property name="geometry"> --- 1,7 ---- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> ! <class>dialogueProgress</class> <widget class="QDialog"> <property name="name"> ! <cstring>dialogueProgress</cstring> </property> <property name="geometry"> *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>600</width> ! <height>244</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>567</width> ! <height>201</height> </rect> </property> *************** *** 16,189 **** <string>Ripping Progress</string> </property> ! <widget class="QLayoutWidget"> ! <property name="name"> ! <cstring>l_audiopass</cstring> ! </property> ! <property name="geometry"> ! <rect> ! <x>20</x> ! <y>50</y> ! <width>560</width> ! <height>40</height> ! </rect> ! </property> ! <hbox> ! <property name="name"> ! <cstring>unnamed</cstring> ! </property> ! <widget class="QLabel"> ! <property name="name"> ! <cstring>textLabel3</cstring> ! </property> ! <property name="text"> ! <string>Audio pass:</string> ! </property> ! </widget> ! <widget class="QProgressBar"> ! <property name="name"> ! <cstring>pm_audioPass</cstring> ! </property> ! </widget> ! </hbox> ! </widget> ! <widget class="QLayoutWidget"> <property name="name"> ! <cstring>l_videopass1</cstring> ! </property> ! <property name="geometry"> ! <rect> ! <x>20</x> ! <y>100</y> ! <width>560</width> ! <height>40</height> ! </rect> </property> ! <hbox> <property name="name"> ! <cstring>unnamed</cstring> </property> ! <widget class="QLabel"> ! <property name="name"> ! <cstring>textLabel4</cstring> ! </property> ! <property name="text"> ! <string>Video pass 1:</string> ! </property> ! </widget> ! <widget class="QProgressBar"> ! <property name="name"> ! <cstring>pm_videoPass1</cstring> ! </property> ! </widget> ! </hbox> ! </widget> ! <widget class="QLayoutWidget"> ! <property name="name"> ! <cstring>l_videopass2</cstring> ! </property> ! <property name="geometry"> ! <rect> ! <x>20</x> ! <y>150</y> ! <width>560</width> ! <height>40</height> ! </rect> ! </property> ! <hbox> ! <property name="name"> ! <cstring>unnamed</cstring> </property> ! <widget class="QLabel"> ! <property name="name"> ! <cstring>textLabel4_2</cstring> ! </property> ! <property name="text"> ! <string>Video pass 2:</string> ! </property> ! </widget> ! <widget class="QProgressBar"> <property name="name"> ! <cstring>pm_videoPass2</cstring> </property> ! </widget> ! </hbox> ! </widget> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_closeProgressDialogue</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="geometry"> ! <rect> ! <x>300</x> ! <y>200</y> ! <width>90</width> ! <height>31</height> ! </rect> ! </property> ! <property name="text"> ! <string>Close</string> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Close window when finished</string> ! </property> ! </widget> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_changeState</cstring> ! </property> ! <property name="geometry"> ! <rect> ! <x>190</x> ! <y>200</y> ! <width>90</width> ! <height>31</height> ! </rect> ! </property> ! <property name="text"> ! <string>Start</string> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Stop the ripping process</string> ! </property> ! </widget> ! <widget class="QLabel"> ! <property name="name"> ! <cstring>rippingXofY</cstring> ! </property> ! <property name="geometry"> ! <rect> ! <x>210</x> ! <y>0</y> ! <width>170</width> ! <height>41</height> ! </rect> ! </property> ! <property name="sizePolicy"> ! <sizepolicy> ! <hsizetype>7</hsizetype> ! <vsizetype>5</vsizetype> ! <horstretch>0</horstretch> ! <verstretch>0</verstretch> ! </sizepolicy> ! </property> ! <property name="text"> ! <string>Ripping Track x of y</string> ! </property> ! </widget> </widget> <connections> <connection> <sender>b_closeProgressDialogue</sender> <signal>clicked()</signal> ! <receiver>dialogProgress</receiver> <slot>accept()</slot> </connection> </connections> - <slots> - <slot>closeWin()</slot> - </slots> <layoutdefaults spacing="6" margin="11"/> </UI> --- 16,197 ---- <string>Ripping Progress</string> </property> ! <property name="icon"> ! <pixmap>image0</pixmap> ! </property> ! <grid> <property name="name"> ! <cstring>unnamed</cstring> </property> ! <widget class="QGroupBox" row="0" column="0"> <property name="name"> ! <cstring>groupBox3</cstring> </property> ! <property name="title"> ! <string>Ripping Progress</string> </property> ! <grid> <property name="name"> ! <cstring>unnamed</cstring> </property> ! <widget class="QLabel" row="0" column="0"> ! <property name="name"> ! <cstring>rippingXofY</cstring> ! </property> ! <property name="sizePolicy"> ! <sizepolicy> ! <hsizetype>7</hsizetype> ! <vsizetype>0</vsizetype> ! <horstretch>0</horstretch> ! <verstretch>0</verstretch> ! </sizepolicy> ! </property> ! <property name="text"> ! <string>Ripping Track x of y</string> ! </property> ! </widget> ! <widget class="QLabel" row="1" column="0"> ! <property name="name"> ! <cstring>l_ETA</cstring> ! </property> ! <property name="text"> ! <string>ETA: N/A</string> ! </property> ! </widget> ! <spacer row="4" column="0"> ! <property name="name"> ! <cstring>spacer9</cstring> ! </property> ! <property name="orientation"> ! <enum>Vertical</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>21</width> ! <height>20</height> ! </size> ! </property> ! </spacer> ! <widget class="QLayoutWidget" row="5" column="0"> ! <property name="name"> ! <cstring>layout8</cstring> ! </property> ! <hbox> ! <property name="name"> ! <cstring>unnamed</cstring> ! </property> ! <spacer> ! <property name="name"> ! <cstring>spacer1_3</cstring> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>31</width> ! <height>31</height> ! </size> ! </property> ! </spacer> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_changeState</cstring> ! </property> ! <property name="sizePolicy"> ! <sizepolicy> ! <hsizetype>0</hsizetype> ! <vsizetype>0</vsizetype> ! <horstretch>0</horstretch> ! <verstretch>0</verstretch> ! </sizepolicy> ! </property> ! <property name="text"> ! <string>Start</string> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Stop the ripping process</string> ! </property> ! </widget> ! <spacer> ! <property name="name"> ! <cstring>spacer1</cstring> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>31</width> ! <height>31</height> ! </size> ! </property> ! </spacer> ! <widget class="QPushButton"> ! <property name="name"> ! <cstring>b_closeProgressDialogue</cstring> ! </property> ! <property name="enabled"> ! <bool>false</bool> ! </property> ! <property name="sizePolicy"> ! <sizepolicy> ! <hsizetype>0</hsizetype> ! <vsizetype>0</vsizetype> ! <horstretch>0</horstretch> ! <verstretch>0</verstretch> ! </sizepolicy> ! </property> ! <property name="text"> ! <string>Close</string> ! </property> ! <property name="toolTip" stdset="0"> ! <string>Close window when finished</string> ! </property> ! </widget> ! <spacer> ! <property name="name"> ! <cstring>spacer1_2</cstring> ! </property> ! <property name="orientation"> ! <enum>Horizontal</enum> ! </property> ! <property name="sizeType"> ! <enum>Expanding</enum> ! </property> ! <property name="sizeHint"> ! <size> ! <width>31</width> ! <height>31</height> ! </size> ! </property> ! </spacer> ! </hbox> ! </widget> ! </grid> ! </widget> ! </grid> </widget> + <images> + <image name="image0"> + <data format="XPM.GZ" length="950">789c5dd24d8f9b301006e07b7e058a6f51d505635850d5c36eb2df6ad5e34aab1e8c6de298000909bb0955ff7b3d33b0edd6c981e71d8f1939b95804cf3fbe058b8bd9e1288f1b15282bbb60a1fbba3ebffcfcfa6b368fd2c07fe33c88e69f66f3cf810abeb78d8167e69f59880b788dcc421566c03760144622c2ea0a99f90f528e54116e3e0079c8436287cc79c671f313308ee290e74085cc6315e348774011091163b5404a9109acee80094f42218167602ad33c413e4c4c39700fbc8c2f1362892c3c71f3e3c89c3800739527590cdc02a590512e8047a49209f176a4242e818528b8445e21752189af409514462ae006a9952cb06a813a5186e8dea9810d5173628f343a25de4f5409b01d298915d0a4da10cd3bb1f786683851238d4989eb9152636f0d2ccbd277034f234b93e2bfe8bff54fc664a118fb9869ed0f2e7d3a66505fdb8d75d576ca5859fbac69abc6991dc38ced8d86e6ee70ec9b57ccd89b71ed094f6095d5f833b2736bdb1dc377b75677980dbdbba2a8ab9cb9c66cdbbb2565d6f4039db7f7bd1d6370e4da48ca5637ae696f97c60f74ba1be763a5b1d65957d3f0d3ccbaba6ff5f0e10ed8ea61787cc21bf87b070cd67457bfbfccfe00d518daf7</data> + </image> + </images> <connections> <connection> <sender>b_closeProgressDialogue</sender> <signal>clicked()</signal> ! <receiver>dialogueProgress</receiver> <slot>accept()</slot> </connection> </connections> <layoutdefaults spacing="6" margin="11"/> </UI> |
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv24612 Modified Files: gui.py Added Files: guiprogressdialogue.py Removed Files: guiprogressdialogue_1pass.py guiprogressdialogue_2pass.py guiprogressdialogue_3pass.py Log Message: Consolidated progress dialogues into one UI file, with an empty space for progress bars. These are then put in as appropriate in GUI.py (in GUI.openRipDialogue) Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** gui.py 14 Jul 2003 18:28:43 -0000 1.11 --- gui.py 16 Jul 2003 18:44:31 -0000 1.12 *************** *** 1,3 **** ! #!/usr/bin/env python """ --- 1,3 ---- ! #!/usr/bin/env python """ *************** *** 120,123 **** --- 120,124 ---- def int_startRipping(self): print "* Starting ripping" + self.openRipDialogue() def int_newTrack(self, name, number, total, vbr): *************** *** 277,299 **** def openRipDialogue(self): ! #qr_dir = "/usr/share/quickrip" ! try: ! os.chdir(config.qr_dir) ! except OSError, msg: ! print "\n***Unable to change to directory %s\n(%s)\n" % (qr_dir, msg) - 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.state = "stopped" ! self.Dialogue = dialogProgress(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...") ! os.chdir(self.outdir) self.Dialogue.exec_loop() --- 278,339 ---- 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 284, GUI.PY)") ! ! from guiprogressdialogue import dialogueProgress 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() --- guiprogressdialogue_1pass.py DELETED --- --- guiprogressdialogue_2pass.py DELETED --- --- guiprogressdialogue_3pass.py DELETED --- |
From: <te...@us...> - 2003-07-16 13:23:51
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv27327 Modified Files: cli.py Log Message: Minor bugfix Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** cli.py 11 Jul 2003 10:37:21 -0000 1.11 --- cli.py 16 Jul 2003 13:23:49 -0000 1.12 *************** *** 10,17 **** """ try: ! import sys, os, re, output, monkye from dvd import * except ImportError, desc: ! print "Enable to load module (", desc, ")" raise SystemExit --- 10,17 ---- """ try: ! import sys, os, re, output from dvd import * except ImportError, desc: ! print "Unable to load module (", desc, ")" raise SystemExit |
From: <te...@us...> - 2003-07-16 13:23:23
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv27138 Modified Files: guimain.py Log Message: BUGFIX: Removed the line containing 'self.clearWState(Qt.WState_Polished)' Index: guimain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guimain.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** guimain.py 14 Jul 2003 18:25:27 -0000 1.2 --- guimain.py 16 Jul 2003 13:23:20 -0000 1.3 *************** *** 1586,1590 **** self.resize(QSize(634,644).expandedTo(self.minimumSizeHint())) - self.clearWState(Qt.WState_Polished) self.connect(self.b_ScanDVD,SIGNAL("clicked()"),self.scanDVD) --- 1586,1589 ---- |
From: <te...@us...> - 2003-07-14 18:28:46
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv2404 Modified Files: gui.py Log Message: Merged in lots of changes to link up new UI files (see guimain.py-1.2 and guisettings.py-1.5 changelogs for details) plus some other small changes here and there to clean things up. Index: gui.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/gui.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** gui.py 6 Jun 2003 18:07:30 -0000 1.10 --- gui.py 14 Jul 2003 18:28:43 -0000 1.11 *************** *** 1,3 **** ! #!/usr/bin/env python """ --- 1,3 ---- ! #!/usr/bin/env python """ *************** *** 133,137 **** self.Dialogue.pm_videoPass2.setProgress(-1) self.Dialogue.rippingXofY.setText("Ripping " + name + " (" + str(number) + " of " + str(total) + ")") ! def int_newPass(self, passtype): self.passtype = passtype --- 133,137 ---- self.Dialogue.pm_videoPass2.setProgress(-1) self.Dialogue.rippingXofY.setText("Ripping " + name + " (" + str(number) + " of " + str(total) + ")") ! def int_newPass(self, passtype): self.passtype = passtype *************** *** 142,148 **** ! def int_updateProgress(self, perc, tpass): self.percentage = perc self.tpass = tpass if self.tpass is "all": self.Dialogue.pm_audioPass.setProgress(int(perc)) --- 142,150 ---- ! def int_updateProgress(self, perc, trem, tpass): self.percentage = perc + self.trem = trem self.tpass = tpass + self.Dialogue.ETA.setText(str(trem)) if self.tpass is "all": self.Dialogue.pm_audioPass.setProgress(int(perc)) *************** *** 172,215 **** - def updateTrack(self, track, mode = "none"): - """Update track's attributes from GUI""" - if not len(self.tracks):# == 0: - return - - # Get track - self.track = track - try: - checker = self.track.info['vbr'] - del checker - except: - self.track = self.dvdTracks.selectedItem() - - if not self.track: - 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.track.info['size'] = str(self.fileSize.text()) - if self.track.info['size'] is "0": - self.track.info['size'] = "1" - self.track.info['abr_id'] = self.audioBitRate.currentItem() - self.track.info['abr'] = str(self.audioBitRate.text(self.track.info['abr_id'])) - - self.track.info['vbr'] = self.calcRate(self.track.info['time'], self.track.info['abr'], self.track.info['size']) - - self.updateTrackDisplay(self.item) - - 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.item = self.dvdTracks.selectedItem() try: ! checker = self.item.text(0) del checker except: --- 174,183 ---- 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: *************** *** 218,261 **** # Check if the user has clicked on a title or a chapter chap = re.compile('Chapter.*') ! if not chap.search(str(self.item.text(0))): ! # Stop short of tagging for ripping unless "Rip?" column is selected if col is not 2: ! self.item.vbr = self.calcRate(self.item.info['time'], self.item.info['abr'], self.item.info['size']) ! self.updateTrackDisplay(self.item) return ! ! if self.item.info['rip'] is "yes": ! self.item.setPixmap(2, self.image_blank) ! self.updateTrack(self.item, mode="remove") else: ! self.item.setPixmap(2, self.image_tick) ! self.updateTrack(self.item, mode="add") ! ! ! # If the selected item is a title, recurse through chapters ! # and (de)select all of them ! # if chap.search(str(self.item.text(0))): ! # pass ! # else: ! # child = self.item.firstChild() ! # for i in range(self.item.numchapters): ! # if str(self.item.text(2)) == "yes": ! # child.setText(2, self.tr("yes")) ! # else: ! # child.setText(2, self.tr("")) ! # child = child.nextSibling() ! ! self.checkEnableRip() def updateTrackDisplay(self, track): self.track = track ! self.track.info['name'] = str(self.track.text(0)) ! self.trackLabel.setText("Settings for track: " + self.track.info['name']) ! self.fileSize.setText(str(self.track.info['size'])) ! self.audioBitRate.setCurrentItem(self.track.info['abr_id']) ! self.videoBitRate.setText(str(int(self.track.info['vbr']))) def renameTrack(self, item): --- 186,260 ---- # 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 ! 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): *************** *** 277,292 **** self.checkEnableRip() - def checkEnableRip(self): - r = str(self.videoBitRate.text()) - 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 openRipDialogue(self): #qr_dir = "/usr/share/quickrip" --- 276,279 ---- *************** *** 349,352 **** --- 336,340 ---- def openSettingsDialogue(self): + """Open the settings dialogue box, connecting slots to functions""" self.Dialogue = dialogSettings(self) # Set-up defauls from config file *************** *** 361,368 **** --- 349,392 ---- 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_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) + mplayer = QFileDialog.getOpenFileName( + self.path, \ + "*", \ + self, \ + "open file dialog", \ + "Choose path to Tcprobe") + self.Dialogue.tcprobe.setText(str(tcprobe)) def selectOutDir(self): |
From: <te...@us...> - 2003-07-14 18:25:30
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv1408 Modified Files: guimain.py Log Message: Merged old ui file with changes from patch #757343 UI now more compliant with KDE and GNOME HIGs Changes include: - Bitrate and file size now spinboxes - "Settings" button now reads "Congigure..." - New bitrate quality indicator Index: guimain.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guimain.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** guimain.py 29 Apr 2003 11:13:32 -0000 1.1.1.1 --- guimain.py 14 Jul 2003 18:25:27 -0000 1.2 *************** *** 1,6 **** # Form implementation generated from reading ui file 'ui/guimain.ui' # ! # Created: Mon Apr 14 23:54:29 2003 ! # by: The PyQt User Interface Compiler (pyuic) # # WARNING! All changes made in this file will be lost! --- 1,8 ---- + # -*- coding: utf-8 -*- + # Form implementation generated from reading ui file 'ui/guimain.ui' [...3023 lines suppressed...] def selectTrack(self): print "MainWindow.selectTrack(): Not implemented yet" ! def renameTrack(self): ! print "MainWindow.renameTrack(): Not implemented yet" def openSettingsDialogue(self): print "MainWindow.openSettingsDialogue(): Not implemented yet" + + def browseHD(self): + print "MainWindow.browseHD(): Not implemented yet" + + def newBitrate(self): + print "MainWindow.newBitrate(): Not implemented yet" + + def newFileSize(self): + print "MainWindow.newFileSize(): Not implemented yet" + + def newAudioBitrate(self): + print "MainWindow.newAudioBitrate(): Not implemented yet" |
From: <te...@us...> - 2003-07-14 17:46:29
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv22987 Modified Files: guisettings.py Log Message: Merged UI file with changes from patch #757343 Changed include: - Paths now have browse buttons - Widget containers neater Index: guisettings.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/guisettings.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** guisettings.py 6 Jun 2003 18:07:30 -0000 1.5 --- guisettings.py 14 Jul 2003 17:46:26 -0000 1.6 *************** *** 1,6 **** # Form implementation generated from reading ui file 'ui/guisettings.ui' # ! # Created: Fri Jun 6 18:19:02 2003 ! # by: The PyQt User Interface Compiler (pyuic) # # WARNING! All changes made in this file will be lost! --- 1,8 ---- + # -*- coding: utf-8 -*- + # Form implementation generated from reading ui file 'ui/guisettings.ui' # ! # Created: Fri Jul 11 14:26:00 2003 ! # by: The PyQt User Interface Compiler (pyuic) 3.6 # # WARNING! All changes made in this file will be lost! *************** *** 290,294 **** QDialog.__init__(self,parent,name,modal,fl) ! image0 = QPixmap(image0_data) image1 = QPixmap(image1_data) image2 = QPixmap(image2_data) --- 292,296 ---- QDialog.__init__(self,parent,name,modal,fl) ! self.image0 = QPixmap(image0_data) image1 = QPixmap(image1_data) image2 = QPixmap(image2_data) *************** *** 299,476 **** self.setSizePolicy(QSizePolicy(5,5,0,0,self.sizePolicy().hasHeightForWidth())) ! self.setIcon(image0) ! dialogSettingsLayout = QGridLayout(self,1,1,11,6,"dialogSettingsLayout") ! self.widgetStack1 = QWidgetStack(self,"widgetStack1") ! self.widgetStack1.setSizePolicy(QSizePolicy(5,5,0,0,self.widgetStack1.sizePolicy().hasHeightForWidth())) ! self.page = QWidget(self.widgetStack1,"page") ! pageLayout = QGridLayout(self.page,1,1,11,6,"pageLayout") ! self.l_programpaths = QLabel(self.page,"l_programpaths") ! self.l_programpaths.setSizePolicy(QSizePolicy(0,0,0,0,self.l_programpaths.sizePolicy().hasHeightForWidth())) ! pageLayout.addWidget(self.l_programpaths,0,0) ! layout5 = QGridLayout(None,1,1,0,6,"layout5") ! self.tcprobe = QLineEdit(self.page,"tcprobe") ! self.tcprobe.setSizePolicy(QSizePolicy(5,0,0,0,self.tcprobe.sizePolicy().hasHeightForWidth())) ! layout5.addWidget(self.tcprobe,2,1) ! self.mencoder = QLineEdit(self.page,"mencoder") ! self.mencoder.setSizePolicy(QSizePolicy(5,0,0,0,self.mencoder.sizePolicy().hasHeightForWidth())) ! layout5.addWidget(self.mencoder,1,1) ! self.l_mplayer = QLabel(self.page,"l_mplayer") ! self.l_mplayer.setSizePolicy(QSizePolicy(0,0,0,0,self.l_mplayer.sizePolicy().hasHeightForWidth())) ! layout5.addWidget(self.l_mplayer,0,0) ! self.mplayer = QLineEdit(self.page,"mplayer") ! self.mplayer.setSizePolicy(QSizePolicy(5,0,0,0,self.mplayer.sizePolicy().hasHeightForWidth())) ! layout5.addWidget(self.mplayer,0,1) ! self.l_tcprobe = QLabel(self.page,"l_tcprobe") ! self.l_tcprobe.setSizePolicy(QSizePolicy(0,0,0,0,self.l_tcprobe.sizePolicy().hasHeightForWidth())) ! layout5.addWidget(self.l_tcprobe,2,0) ! self.l_mencoder = QLabel(self.page,"l_mencoder") ! self.l_mencoder.setSizePolicy(QSizePolicy(0,0,0,0,self.l_mencoder.sizePolicy().hasHeightForWidth())) ! layout5.addWidget(self.l_mencoder,1,0) ! pageLayout.addMultiCellLayout(layout5,1,1,0,1) ! self.l_outputDir = QLabel(self.page,"l_outputDir") ! self.l_outputDir.setSizePolicy(QSizePolicy(5,0,0,0,self.l_outputDir.sizePolicy().hasHeightForWidth())) ! pageLayout.addMultiCellWidget(self.l_outputDir,2,2,0,1) ! layout6 = QHBoxLayout(None,0,6,"layout6") ! self.outputDir = QLineEdit(self.page,"outputDir") ! layout6.addWidget(self.outputDir) ! self.b_selectOutputDir = QPushButton(self.page,"b_selectOutputDir") ! layout6.addWidget(self.b_selectOutputDir) ! pageLayout.addMultiCellLayout(layout6,3,3,0,1) ! self.textLabel2 = QLabel(self.page,"textLabel2") ! self.textLabel2.setSizePolicy(QSizePolicy(0,0,0,0,self.textLabel2.sizePolicy().hasHeightForWidth())) ! self.textLabel2.setMinimumSize(QSize(200,0)) ! pageLayout.addWidget(self.textLabel2,4,0) ! layout7 = QHBoxLayout(None,0,6,"layout7") ! self.b_Save = QPushButton(self.page,"b_Save") ! self.b_Save.setIconSet(QIconSet(image1)) ! layout7.addWidget(self.b_Save) ! spacer = QSpacerItem(101,31,QSizePolicy.Expanding,QSizePolicy.Minimum) ! layout7.addItem(spacer) ! self.b_OK = QPushButton(self.page,"b_OK") ! self.b_OK.setIconSet(QIconSet(image2)) ! layout7.addWidget(self.b_OK) ! self.b_Cancel = QPushButton(self.page,"b_Cancel") ! self.b_Cancel.setIconSet(QIconSet(image3)) ! layout7.addWidget(self.b_Cancel) ! pageLayout.addMultiCellLayout(layout7,8,8,0,1) ! layout4 = QHBoxLayout(None,0,6,"layout4") ! self.l_deinterlacing = QLabel(self.page,"l_deinterlacing") ! self.l_deinterlacing.setSizePolicy(QSizePolicy(5,0,0,0,self.l_deinterlacing.sizePolicy().hasHeightForWidth())) ! layout4.addWidget(self.l_deinterlacing) ! self.deInterlacing = QComboBox(0,self.page,"deInterlacing") ! layout4.addWidget(self.deInterlacing) ! spacer_2 = QSpacerItem(31,21,QSizePolicy.Expanding,QSizePolicy.Minimum) ! layout4.addItem(spacer_2) ! self.l_aspectRatio = QLabel(self.page,"l_aspectRatio") ! self.l_aspectRatio.setSizePolicy(QSizePolicy(5,0,0,0,self.l_aspectRatio.sizePolicy().hasHeightForWidth())) ! layout4.addWidget(self.l_aspectRatio) ! self.aspectRatio = QComboBox(0,self.page,"aspectRatio") ! layout4.addWidget(self.aspectRatio) ! pageLayout.addMultiCellLayout(layout4,5,5,0,1) ! spacer_3 = QSpacerItem(60,20,QSizePolicy.Minimum,QSizePolicy.Fixed) ! pageLayout.addItem(spacer_3,7,1) ! layout6_2 = QHBoxLayout(None,0,6,"layout6_2") ! self.l_Passes = QLabel(self.page,"l_Passes") ! self.l_Passes.setSizePolicy(QSizePolicy(1,0,0,0,self.l_Passes.sizePolicy().hasHeightForWidth())) ! layout6_2.addWidget(self.l_Passes) ! self.encoderPasses = QComboBox(0,self.page,"encoderPasses") ! self.encoderPasses.setSizePolicy(QSizePolicy(1,0,0,0,self.encoderPasses.sizePolicy().hasHeightForWidth())) ! layout6_2.addWidget(self.encoderPasses) ! spacer_4 = QSpacerItem(20,21,QSizePolicy.Expanding,QSizePolicy.Minimum) ! layout6_2.addItem(spacer_4) ! self.c_pdamode = QCheckBox(self.page,"c_pdamode") ! layout6_2.addWidget(self.c_pdamode) ! pageLayout.addMultiCellLayout(layout6_2,6,6,0,1) ! self.widgetStack1.addWidget(self.page,0) ! dialogSettingsLayout.addWidget(self.widgetStack1,0,0) self.languageChange() ! self.resize(QSize(496,377).expandedTo(self.minimumSizeHint())) self.connect(self.b_Cancel,SIGNAL("clicked()"),self,SLOT("accept()")) def languageChange(self): ! self.setCaption(self.tr("QuickRip Settings")) ! self.l_programpaths.setText(self.tr("<b>Paths:</b>")) ! self.tcprobe.setText(QString.null) ! QToolTip.add(self.tcprobe,self.tr("Path to tcprobe binary")) ! QWhatsThis.add(self.tcprobe,self.tr("The path to the <tt>tcprobe</tt> binary\n" ! "(e.g. <tt>/usr/bin/tcprobe</tt>)")) ! self.mencoder.setText(QString.null) ! QToolTip.add(self.mencoder,self.tr("Path to mencoder binary")) ! QWhatsThis.add(self.mencoder,self.tr("The path to <tt>mencoder</tt> binary\n" ! "(e.g. <tt>/usr/bin/mencoder</tt>)")) ! self.l_mplayer.setText(self.tr("MPlayer:")) ! self.mplayer.setText(QString.null) ! QToolTip.add(self.mplayer,self.tr("Path to mplayer binary")) ! QWhatsThis.add(self.mplayer,self.tr("The path to <tt>mplayer</tt> binary\n" ! "(e.g. <tt>/usr/bin/mplayer</tt>)")) ! self.l_tcprobe.setText(self.tr("Tcprobe:")) ! self.l_mencoder.setText(self.tr("Mencoder:")) ! self.l_outputDir.setText(self.tr("Default output directory:")) ! QToolTip.add(self.outputDir,self.tr("Directory where QuickRip saves files")) ! QWhatsThis.add(self.outputDir,self.tr("The default directory where\n" ! "QuickRip should save ripped\n" ! "DVD files")) ! self.b_selectOutputDir.setText(self.tr("Browse")) ! self.textLabel2.setText(self.tr("<b>Customise Mencoder:</b>")) ! self.b_Save.setText(self.tr("Save settings","g")) ! self.b_OK.setText(self.tr("OK","g")) ! self.b_Cancel.setText(self.tr("Cancel","g")) ! self.l_deinterlacing.setText(self.tr("De-Interlacing:")) ! self.deInterlacing.clear() ! self.deInterlacing.insertItem(self.tr("None")) ! self.deInterlacing.insertItem(self.tr("-vop dint")) ! self.deInterlacing.insertItem(self.tr("-vop il")) ! self.deInterlacing.insertItem(self.tr("-vop lavcdeint")) ! self.deInterlacing.insertItem(self.tr("-vop pp=lb")) ! QToolTip.add(self.deInterlacing,self.tr("De-Interlacing options. See documentation.")) ! QWhatsThis.add(self.deInterlacing,self.tr("De-Interlacing options. For more information on de-interlacing consult the QuickRip and Mplayer documentation.")) ! self.l_aspectRatio.setText(self.tr("Aspect Ratio:")) self.aspectRatio.clear() self.aspectRatio.insertItem(self.tr("Default")) --- 301,453 ---- self.setSizePolicy(QSizePolicy(5,5,0,0,self.sizePolicy().hasHeightForWidth())) ! self.setIcon(self.image0) ! dialogSettingsLayout = QGridLayout(self,1,1,12,6,"dialogSettingsLayout") ! self.groupBox2 = QGroupBox(self,"groupBox2") ! self.groupBox2.setSizePolicy(QSizePolicy(5,1,0,0,self.groupBox2.sizePolicy().hasHeightForWidth())) ! self.groupBox2.setColumnLayout(0,Qt.Vertical) ! self.groupBox2.layout().setSpacing(6) ! self.groupBox2.layout().setMargin(12) ! groupBox2Layout = QGridLayout(self.groupBox2.layout()) ! groupBox2Layout.setAlignment(Qt.AlignTop) ! self.l_aspectRatio = QLabel(self.groupBox2,"l_aspectRatio") ! self.l_aspectRatio.setSizePolicy(QSizePolicy(5,0,0,0,self.l_aspectRatio.sizePolicy().hasHeightForWidth())) ! groupBox2Layout.addWidget(self.l_aspectRatio,0,2) ! self.aspectRatio = QComboBox(0,self.groupBox2,"aspectRatio") ! groupBox2Layout.addWidget(self.aspectRatio,0,3) ! self.c_pdamode = QCheckBox(self.groupBox2,"c_pdamode") ! groupBox2Layout.addWidget(self.c_pdamode,1,2) ! self.l_deinterlacing = QLabel(self.groupBox2,"l_deinterlacing") ! self.l_deinterlacing.setSizePolicy(QSizePolicy(5,0,0,0,self.l_deinterlacing.sizePolicy().hasHeightForWidth())) ! groupBox2Layout.addWidget(self.l_deinterlacing,0,0) ! self.deInterlacing = QComboBox(0,self.groupBox2,"deInterlacing") ! groupBox2Layout.addWidget(self.deInterlacing,0,1) ! self.l_Passes = QLabel(self.groupBox2,"l_Passes") ! self.l_Passes.setSizePolicy(QSizePolicy(1,0,0,0,self.l_Passes.sizePolicy().hasHeightForWidth())) ! groupBox2Layout.addWidget(self.l_Passes,1,0) ! self.encoderPasses = QComboBox(0,self.groupBox2,"encoderPasses") ! self.encoderPasses.setSizePolicy(QSizePolicy(1,0,0,0,self.encoderPasses.sizePolicy().hasHeightForWidth())) ! groupBox2Layout.addWidget(self.encoderPasses,1,1) ! dialogSettingsLayout.addWidget(self.groupBox2,1,0) ! layout2 = QHBoxLayout(None,0,6,"layout2") ! self.b_Save = QPushButton(self,"b_Save") ! self.b_Save.setIconSet(QIconSet(image1)) ! layout2.addWidget(self.b_Save) ! spacer = QSpacerItem(170,20,QSizePolicy.Expanding,QSizePolicy.Minimum) ! layout2.addItem(spacer) ! self.b_OK = QPushButton(self,"b_OK") ! self.b_OK.setIconSet(QIconSet(image2)) ! layout2.addWidget(self.b_OK) ! self.b_Cancel = QPushButton(self,"b_Cancel") ! self.b_Cancel.setIconSet(QIconSet(image3)) ! layout2.addWidget(self.b_Cancel) ! dialogSettingsLayout.addLayout(layout2,2,0) ! self.groupBox1 = QGroupBox(self,"groupBox1") ! self.groupBox1.setSizePolicy(QSizePolicy(5,1,0,0,self.groupBox1.sizePolicy().hasHeightForWidth())) ! self.groupBox1.setColumnLayout(0,Qt.Vertical) ! self.groupBox1.layout().setSpacing(6) ! self.groupBox1.layout().setMargin(12) ! groupBox1Layout = QGridLayout(self.groupBox1.layout()) ! groupBox1Layout.setAlignment(Qt.AlignTop) ! self.l_tcprobe = QLabel(self.groupBox1,"l_tcprobe") ! self.l_tcprobe.setSizePolicy(QSizePolicy(0,0,0,0,self.l_tcprobe.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.l_tcprobe,2,0) ! self.b_browseMPlayer = QPushButton(self.groupBox1,"b_browseMPlayer") ! groupBox1Layout.addWidget(self.b_browseMPlayer,0,2) ! self.l_mplayer = QLabel(self.groupBox1,"l_mplayer") ! self.l_mplayer.setSizePolicy(QSizePolicy(0,0,0,0,self.l_mplayer.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.l_mplayer,0,0) ! self.mplayer = QLineEdit(self.groupBox1,"mplayer") ! self.mplayer.setSizePolicy(QSizePolicy(3,0,0,0,self.mplayer.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.mplayer,0,1) ! self.l_outputDir = QLabel(self.groupBox1,"l_outputDir") ! self.l_outputDir.setSizePolicy(QSizePolicy(5,0,0,0,self.l_outputDir.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addMultiCellWidget(self.l_outputDir,3,3,0,2) ! self.b_browseMencoder = QPushButton(self.groupBox1,"b_browseMencoder") ! groupBox1Layout.addWidget(self.b_browseMencoder,1,2) ! self.b_browseTcprobe = QPushButton(self.groupBox1,"b_browseTcprobe") ! groupBox1Layout.addWidget(self.b_browseTcprobe,2,2) ! self.b_selectOutputDir = QPushButton(self.groupBox1,"b_selectOutputDir") ! groupBox1Layout.addWidget(self.b_selectOutputDir,4,2) ! self.mencoder = QLineEdit(self.groupBox1,"mencoder") ! self.mencoder.setSizePolicy(QSizePolicy(3,0,0,0,self.mencoder.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.mencoder,1,1) ! self.l_mencoder = QLabel(self.groupBox1,"l_mencoder") ! self.l_mencoder.setSizePolicy(QSizePolicy(0,0,0,0,self.l_mencoder.sizePolicy().hasHeightForWidth())) ! groupBox1Layout.addWidget(self.l_mencoder,1,0) ! self.tcprobe = QLineEdit(self.groupBox1,"tcprobe") ! self.tcprobe.setSizePolicy(QSizePolicy(3,0,0,0,self.tcprobe.sizePolicy().hasHeightForWidth())) ! ! groupBox1Layout.addWidget(self.tcprobe,2,1) ! ! self.outputDir = QLineEdit(self.groupBox1,"outputDir") ! ! groupBox1Layout.addMultiCellWidget(self.outputDir,4,4,0,1) ! ! dialogSettingsLayout.addWidget(self.groupBox1,0,0) self.languageChange() ! self.resize(QSize(537,360).expandedTo(self.minimumSizeHint())) ! self.clearWState(Qt.WState_Polished) self.connect(self.b_Cancel,SIGNAL("clicked()"),self,SLOT("accept()")) + self.l_aspectRatio.setBuddy(self.aspectRatio) + self.l_deinterlacing.setBuddy(self.deInterlacing) + self.l_Passes.setBuddy(self.encoderPasses) + self.l_tcprobe.setBuddy(self.tcprobe) + self.l_mplayer.setBuddy(self.mplayer) + self.l_outputDir.setBuddy(self.outputDir) + self.l_mencoder.setBuddy(self.mencoder) + + def languageChange(self): ! self.setCaption(self.tr("Configuration - QuickRip")) ! self.groupBox2.setTitle(self.tr("Me&ncoder Options")) ! self.l_aspectRatio.setText(self.tr("As&pect ratio:")) self.aspectRatio.clear() self.aspectRatio.insertItem(self.tr("Default")) *************** *** 481,489 **** QWhatsThis.add(self.aspectRatio,self.tr("The aspect ratio of the video. Change if the output appears stretched. \n" "DVDs have aspect ratios printed on their cases.")) ! self.l_Passes.setText(self.tr("Encoder passes:")) self.encoderPasses.clear() self.encoderPasses.insertItem(self.tr("Default")) ! self.encoderPasses.insertItem(self.tr("One pass")) ! self.encoderPasses.insertItem(self.tr("Two pass")) ! self.encoderPasses.insertItem(self.tr("Three pass")) ! self.c_pdamode.setText(self.tr("PDA Mode")) --- 458,512 ---- QWhatsThis.add(self.aspectRatio,self.tr("The aspect ratio of the video. Change if the output appears stretched. \n" "DVDs have aspect ratios printed on their cases.")) ! self.c_pdamode.setText(self.tr("&PDA mode")) ! self.c_pdamode.setAccel(self.tr("Alt+P")) ! self.l_deinterlacing.setText(self.tr("&De-Interlacing:")) ! self.deInterlacing.clear() ! self.deInterlacing.insertItem(self.tr("None")) ! self.deInterlacing.insertItem(self.tr("-vop dint")) ! self.deInterlacing.insertItem(self.tr("-vop il")) ! self.deInterlacing.insertItem(self.tr("-vop lavcdeint")) ! self.deInterlacing.insertItem(self.tr("-vop pp=lb")) ! QToolTip.add(self.deInterlacing,self.tr("De-Interlacing options. See documentation.")) ! QWhatsThis.add(self.deInterlacing,self.tr("De-Interlacing options. For more information on de-interlacing consult the QuickRip and Mplayer documentation.")) ! self.l_Passes.setText(self.tr("&Encoder passes:")) self.encoderPasses.clear() self.encoderPasses.insertItem(self.tr("Default")) ! self.encoderPasses.insertItem(self.tr("One Pass")) ! self.encoderPasses.insertItem(self.tr("Two Pass")) ! self.encoderPasses.insertItem(self.tr("Three Pass")) ! self.b_Save.setText(self.tr("&Save settings","g")) ! self.b_Save.setAccel(self.tr("Alt+S")) ! self.b_OK.setText(self.tr("&OK","g")) ! self.b_OK.setAccel(self.tr("Alt+O")) ! self.b_Cancel.setText(self.tr("&Cancel","g")) ! self.b_Cancel.setAccel(self.tr("Alt+C")) ! self.groupBox1.setTitle(self.tr("&Paths")) ! self.l_tcprobe.setText(self.tr("&Tcprobe:")) ! self.b_browseMPlayer.setText(self.tr("&Browse")) ! self.b_browseMPlayer.setAccel(self.tr("Alt+B")) ! self.l_mplayer.setText(self.tr("&MPlayer:")) ! self.mplayer.setText(QString.null) ! QToolTip.add(self.mplayer,self.tr("Path to mplayer binary")) ! QWhatsThis.add(self.mplayer,self.tr("The path to <tt>mplayer</tt> binary\n" ! "(e.g. <tt>/usr/bin/mplayer</tt>)")) ! self.l_outputDir.setText(self.tr("&Default output directory:")) ! self.b_browseMencoder.setText(self.tr("B&rowse")) ! self.b_browseMencoder.setAccel(self.tr("Alt+R")) ! self.b_browseTcprobe.setText(self.tr("Bro&wse")) ! self.b_browseTcprobe.setAccel(self.tr("Alt+W")) ! self.b_selectOutputDir.setText(self.tr("Brow&se")) ! self.b_selectOutputDir.setAccel(self.tr("Alt+S")) ! self.mencoder.setText(QString.null) ! QToolTip.add(self.mencoder,self.tr("Path to mencoder binary")) ! QWhatsThis.add(self.mencoder,self.tr("The path to <tt>mencoder</tt> binary\n" ! "(e.g. <tt>/usr/bin/mencoder</tt>)")) ! self.l_mencoder.setText(self.tr("Mencode&r:")) ! self.tcprobe.setText(QString.null) ! QToolTip.add(self.tcprobe,self.tr("Path to tcprobe binary")) ! QWhatsThis.add(self.tcprobe,self.tr("The path to the <tt>tcprobe</tt> binary\n" ! "(e.g. <tt>/usr/bin/tcprobe</tt>)")) ! QToolTip.add(self.outputDir,self.tr("Directory where QuickRip saves files")) ! QWhatsThis.add(self.outputDir,self.tr("The default directory where\n" ! "QuickRip should save ripped\n" ! "DVD files")) ! |
From: <te...@us...> - 2003-07-14 17:43:16
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv22584 Modified Files: dvd.py Log Message: Added method calcFileSize, which calculates the new file size (for when the user directly changes the bitrate). Probably other minor changes while I was tweaking the code :) Index: dvd.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/dvd.py,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** dvd.py 26 Jun 2003 03:22:10 -0000 1.20 --- dvd.py 14 Jul 2003 17:43:13 -0000 1.21 *************** *** 125,134 **** self.length = int(length) self.audiobr = int(audiobr) ! self.rate = ((((self.filesize*1024*8)/1000)*1024)-(self.audiobr*self.length))/(self.length); ! self.rate = self.rate * 0.96 # Correction based on addition of credits and usual error return self.rate except: return 1 def scanDVD(self): """Scan DVD drive for titles with mplayer, and chapters and playback time with tcprobe""" --- 125,149 ---- 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""" *************** *** 288,293 **** pipe_perc = re.compile('.*f \((.\d)\%\)*') perc = 0 ! # Clean up output dir in case QuickRip crashed out there os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) --- 303,310 ---- pipe_perc = re.compile('.*f \((.\d)\%\)*') + pipe_Trem = re.compile('(?P<int>[0-9]+)min') perc = 0 ! Trem = 0 ! # Clean up output dir in case QuickRip crashed out there os.popen("".join(["rm ", self.outdir, "frameno.avi 2>/dev/null"])) *************** *** 337,341 **** perc = pipe_perc.search(line).group(1) perc = re.sub(' ', '', perc) ! self.int_updateProgress(perc, "audio") os.waitpid(pid, os.WNOHANG) --- 354,360 ---- 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, "audio") os.waitpid(pid, os.WNOHANG) *************** *** 393,397 **** perc = pipe_perc.search(line).group(1) perc = re.sub(' ', '', perc) ! self.int_updateProgress(perc, "audio") os.waitpid(pid, os.WNOHANG) --- 412,418 ---- 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, "audio") os.waitpid(pid, os.WNOHANG) *************** *** 412,416 **** perc = pipe_perc.search(line).group(1) perc = re.sub(' ', '', perc) ! self.int_updateProgress(perc, "video1") os.waitpid(pid, os.WNOHANG) --- 433,439 ---- 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, "video1") os.waitpid(pid, os.WNOHANG) *************** *** 477,481 **** perc = pipe_perc.search(line).group(1) perc = re.sub(' ', '', perc) ! self.int_updateProgress(perc, "audio") os.waitpid(pid, os.WNOHANG) --- 500,506 ---- 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, "audio") os.waitpid(pid, os.WNOHANG) *************** *** 496,500 **** perc = pipe_perc.search(line).group(1) perc = re.sub(' ', '', perc) ! self.int_updateProgress(perc, "video1") os.waitpid(pid, os.WNOHANG) --- 521,527 ---- 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, "video1") os.waitpid(pid, os.WNOHANG) *************** *** 514,518 **** perc = pipe_perc.search(line).group(1) perc = re.sub(' ', '', perc) ! self.int_updateProgress(perc, "video2") os.popen("rm divx2pass.log 2>/dev/null") --- 541,547 ---- 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, "video2") os.popen("rm divx2pass.log 2>/dev/null") |
From: <te...@us...> - 2003-07-14 17:30:32
|
Update of /cvsroot/quickrip/quickrip/ui In directory sc8-pr-cvs1:/tmp/cvs-serv20150/ui Modified Files: guisettings.ui Log Message: Merged UI file with changes from patch #757343 Changed include: - Paths now have browse buttons - Widget containers neater Index: guisettings.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/ui/guisettings.ui,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** guisettings.ui 6 Jun 2003 18:07:30 -0000 1.4 --- guisettings.ui 14 Jul 2003 17:30:28 -0000 1.5 *************** *** 9,14 **** <x>0</x> <y>0</y> ! <width>496</width> ! <height>377</height> </rect> </property> --- 9,14 ---- <x>0</x> <y>0</y> ! <width>537</width> [...1039 lines suppressed...] ! <property name="whatsThis" stdset="0"> ! <string>The default directory where ! QuickRip should save ripped ! DVD files</string> ! </property> ! </widget> ! </grid> </widget> </grid> *************** *** 593,596 **** </connection> </connections> ! <layoutdefaults spacing="6" margin="11"/> </UI> --- 540,543 ---- </connection> </connections> ! <layoutdefaults spacing="6" margin="12"/> </UI> |
From: <te...@us...> - 2003-07-14 17:28:48
|
Update of /cvsroot/quickrip/quickrip/ui In directory sc8-pr-cvs1:/tmp/cvs-serv19629/ui Modified Files: guimain.ui Log Message: Merged old ui file with changes from patch #757343 UI now more compliant with KDE and GNOME HIGs Changes include: - Bitrate and file size now spinboxes - "Settings" button now reads "Congigure..." - New bitrate quality indicator Index: guimain.ui =================================================================== RCS file: /cvsroot/quickrip/quickrip/ui/guimain.ui,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** guimain.ui 29 Apr 2003 11:13:37 -0000 1.1.1.1 --- guimain.ui 14 Jul 2003 17:28:45 -0000 1.2 *************** *** 1,5 **** <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>MainWindow</class> ! <widget class="QDialog"> <property name="name"> <cstring>MainWindow</cstring> --- 1,5 ---- <!DOCTYPE UI><UI version="3.1" stdsetdef="1"> <class>MainWindow</class> ! <widget class="QMainWindow"> <property name="name"> [...1622 lines suppressed...] <receiver>MainWindow</receiver> ! <slot>newBitrate()</slot> </connection> </connections> <slots> <slot>scanDVD()</slot> <slot>ripDVD()</slot> + <slot>checkEnableRip( const QString & )</slot> <slot>checkEnableRip()</slot> <slot>updateTrack()</slot> + <slot>selectTrack()</slot> + <slot>renameTrack()</slot> <slot>openSettingsDialogue()</slot> + <slot>browseHD()</slot> + <slot>newBitrate()</slot> + <slot>newFileSize()</slot> + <slot>newAudioBitrate()</slot> </slots> ! <layoutdefaults spacing="6" margin="12"/> </UI> |
From: <te...@us...> - 2003-07-11 10:37:24
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv24220 Modified Files: cli.py Log Message: Put the output code back in (it makes the text much nicer :) Index: cli.py =================================================================== RCS file: /cvsroot/quickrip/quickrip/cli.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** cli.py 21 Jun 2003 16:24:10 -0000 1.10 --- cli.py 11 Jul 2003 10:37:21 -0000 1.11 *************** *** 10,19 **** """ try: ! import sys, os, re ! except ImportError: ! print "Unable to import any of sys, os, re modules" ! raise SystemExit ! ! from dvd import * # QuickRip global configuration. [...1118 lines suppressed...] ! sys.stdout.flush() ! sys.stdout.write("\b" * (7+n)) ! def int_finishRipping(self): ! #print "" ! print "\n* Ripping finished\nPress enter to return to main menu" ! try: ! null = raw_input() ! del null ! except KeyboardInterrupt: ! print "\n\nExiting..." ! sys.exit(2) ! self.main("toplevel") def main(): ! #print "QuickRip v0.6, (C) Tom Chance, 2003" ! print "%s v%s, %s\n" % (__app__, __version__, __copyright__) ! cli = CLI() ! cli.main() |
From: <te...@us...> - 2003-07-11 10:35:55
|
Update of /cvsroot/quickrip/quickrip In directory sc8-pr-cvs1:/tmp/cvs-serv23736 Modified Files: README Log Message: Added a LICENSE clause to explain the new copyright/license stuff now that Gentoo's output module has been added to the codebase. Index: README =================================================================== RCS file: /cvsroot/quickrip/quickrip/README,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** README 13 Jun 2003 20:20:40 -0000 1.3 --- README 11 Jul 2003 10:35:52 -0000 1.4 *************** *** 2,9 **** --- 2,12 ---- ------------------- + http://quickrip.sf.net/ + 1. PREAMBLE 2. INSTALLATION 3. HOW TO USE 4. FEEDBACK + 5. LICENSE 1. PREAMBLE *************** *** 82,84 **** found on the QuickRip web page: ! http://quickrip.sf.net/ \ No newline at end of file --- 85,103 ---- found on the QuickRip web page: ! http://quickrip.sf.net/ ! ! ! ! 5. LICENSE: ! ----------- ! All code in QuickRip is copyrighted by Tom Chance, 2003, and released under the ! GNU General Public License v2, included in this package as the file "LICENSE", ! except for 'output.py', which is copyright Daniel Robbins, Gentoo Technologies ! Inc., 1998-2003, and which is also released under the GNU General Public License ! v2. ! ! As such, under the terms of the GPL, you are free to copy, modify and redistribute ! QuickRip as you like, so long as the code remains under the GPL, and is released to ! the public under these same terms. Copyright always remains with Tom Chance. Please ! notify Tom Chance of any forks you make (visit the QuickRip homepage for contact ! details). |