Sync to trunk

This commit is contained in:
John Schember 2009-06-03 07:43:00 -04:00
commit f2403514e4
50 changed files with 1484 additions and 921 deletions

View File

@ -93,6 +93,8 @@ def freeze():
'dateutil', 'dns', 'email'] 'dateutil', 'dns', 'email']
includes += ['calibre.web.feeds.recipes.'+r for r in recipe_modules] includes += ['calibre.web.feeds.recipes.'+r for r in recipe_modules]
includes += [x.split('/')[-1].rpartition('.')[0] for x in \
glob.glob('src/calibre/gui2/convert/*.py')]
LOADER = '/tmp/loader.py' LOADER = '/tmp/loader.py'
open(LOADER, 'wb').write('# This script is never actually used.\nimport sys') open(LOADER, 'wb').write('# This script is never actually used.\nimport sys')

View File

@ -254,8 +254,6 @@ _check_symlinks_prescript()
os.link(os.path.expanduser('~/pdftohtml/pdftohtml'), os.path.join(frameworks_dir, 'pdftohtml')) os.link(os.path.expanduser('~/pdftohtml/pdftohtml'), os.path.join(frameworks_dir, 'pdftohtml'))
os.link(os.path.expanduser('~/pdftohtml/libpoppler.4.dylib'), os.link(os.path.expanduser('~/pdftohtml/libpoppler.4.dylib'),
os.path.join(frameworks_dir, 'libpoppler.4.dylib')) os.path.join(frameworks_dir, 'libpoppler.4.dylib'))
print 'Adding plugins'
module_dir = os.path.join(resource_dir, 'lib', 'python2.6', 'lib-dynload')
print 'Adding fontconfig' print 'Adding fontconfig'
for f in glob.glob(os.path.expanduser('~/fontconfig-bundled/*')): for f in glob.glob(os.path.expanduser('~/fontconfig-bundled/*')):
dest = os.path.join(frameworks_dir, os.path.basename(f)) dest = os.path.join(frameworks_dir, os.path.basename(f))
@ -347,7 +345,7 @@ def main():
'PyQt4.QtSvg', 'PyQt4.QtWebKit', 'commands', 'PyQt4.QtSvg', 'PyQt4.QtWebKit', 'commands',
'mechanize', 'ClientForm', 'usbobserver', 'mechanize', 'ClientForm', 'usbobserver',
'genshi', 'calibre.web.feeds.recipes.*', 'genshi', 'calibre.web.feeds.recipes.*',
'calibre.ebooks.lrf.any.*', 'calibre.ebooks.lrf.feeds.*', 'calibre.gui2.convert.*',
'keyword', 'codeop', 'pydoc', 'readline', 'keyword', 'codeop', 'pydoc', 'readline',
'BeautifulSoup', 'calibre.ebooks.lrf.fonts.prs500.*', 'BeautifulSoup', 'calibre.ebooks.lrf.fonts.prs500.*',
'dateutil', 'email.iterators', 'dateutil', 'email.iterators',

View File

@ -50,6 +50,12 @@ DefaultDirectoryLocation
DefaultLanguage DefaultLanguage
English English
DefaultToSystemLanguage
Yes
EnableResponseFiles
Yes
Ext Ext
{} {}
@ -138,7 +144,7 @@ ProjectID
DA98A0C6-9102-73EC-2516-B147E972D3F7 DA98A0C6-9102-73EC-2516-B147E972D3F7
ProjectVersion ProjectVersion
1.2.7.0 1.2.13.1
SaveOnlyToplevelDirs SaveOnlyToplevelDirs
No No
@ -206,85 +212,130 @@ test
{Testing Switch Yes No {} {run uninstaller without uninstalling any files}} {Testing Switch Yes No {} {run uninstaller without uninstalling any files}}
} }
FileGroup ::BEF8D398-58BA-1F66-39D6-D4A63D5BEEF9 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows TarArchive ZipArchive} -name {Program Files} -parent FileGroups FileGroup ::BEF8D398-58BA-1F66-39D6-D4A63D5BEEF9 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows TarArchive ZipArchive FreeBSD-5-x86 FreeBSD-6-x86 FreeBSD-7-x86 Linux-x86_64 Solaris-x86} -name {Program Files} -parent FileGroups
File ::8E5D85A4-7608-47A1-CF7C-309060D5FF40 -filemethod {Always overwrite files} -type dir -directory <%InstallDir%> -name /home/kovid/work/calibre/build/py2exe -parent BEF8D398-58BA-1F66-39D6-D4A63D5BEEF9 File ::8E5D85A4-7608-47A1-CF7C-309060D5FF40 -filemethod {Always overwrite files} -type dir -directory <%InstallDir%> -name /home/kovid/work/calibre/build/py2exe -parent BEF8D398-58BA-1F66-39D6-D4A63D5BEEF9
File ::FC870EE7-667B-481F-113B-B4504DFCCFA5 -type dir -name bin -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::FC870EE7-667B-481F-113B-B4504DFCCFA5 -type dir -name bin -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::377C588B-B324-CA09-ED49-4DB5F82A15ED -type dir -name etc -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::377C588B-B324-CA09-ED49-4DB5F82A15ED -type dir -name etc -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::55DE4B9F-0881-FF51-E2BA-EC72B5D3425C -type dir -name fonts -parent 377C588B-B324-CA09-ED49-4DB5F82A15ED
File ::A27B68D9-43A6-B994-3091-E829AFBA340D -type dir -name conf.d -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::974ADD48-88E5-BC7A-1963-928A245F133A -type dir -name conf.avail -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::5E5273D8-3423-8DC8-83C4-BE000069A803 -name fonts.dtd -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::32D7DBE0-E0B1-5BDD-66C5-2A13D8BC8F90 -name fonts.conf -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::B95D03D4-EA59-F00E-59E1-BA05758879DA -type dir -name imageformats -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::B95D03D4-EA59-F00E-59E1-BA05758879DA -type dir -name imageformats -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A624029D-AE0F-49A5-4DAC-7720CDCAB271 -name qmng4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::C53E8AB9-30FC-730C-3DA3-851C9B4838A1 -name qmng4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::36ADF34E-46AD-663F-6C3A-D45E971CB722 -name qmng4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::A1EEB0BC-ADA2-86C8-631B-E88FE03328EA -name qico4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::516069B4-FC33-F267-8C4B-95475515A853 -name qico4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::129AE39B-995D-9BE2-3FB4-69F129C4E86E -name qico4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::113DBCCE-B6CA-2742-35DB-6FB53EE75919 -name qico4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::CC7FFFF8-5DA6-3CCB-540C-A24B528B3DD6 -name qjpeg4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::9C5B362E-D06B-D92F-6B39-F9F2B5BE9E17 -name qjpeg4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::0FF52CC9-3920-A82E-0657-5B2A31CD1457 -name qjpeg4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::9DD8CFAE-2E69-CACA-B451-16683C0F168D -name qjpeg4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::5E16CADD-7269-4247-B35C-046D5B67E298 -name qtiff4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::633981BF-9A0C-589D-25D3-50866757C3B8 -name qmng4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::DB93E311-ECDF-21E0-8C5D-0B2EDAE6C424 -name qgif4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::48E4C188-4ABF-4CCD-C410-7936B4898DDF -name qsvg4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::BFF82F4E-0F3C-8F6E-381C-CCF91E220226 -name qgif4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::3FAEE4BA-C005-E833-8BE4-EC8EF7BDAF1B -name qgif4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::4AB682B9-C811-C68A-0100-5B32E0127093 -name qgif4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::6EBEF5E4-1FA0-B14A-736F-DD1068874D19 -name qtiff4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::8B2F7092-5B97-9DA8-90CD-46D191B49C28 -name qtiff4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::9D014D0C-E6F4-A713-7CE9-CD71AFCEBC61 -name qtiff4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::5EA8BF5D-76A7-023E-CF87-ED92DBCA527D -name qsvg4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::A5298D0E-A211-EB2E-6892-7045D04B264E -name qsvg4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::8A138EC0-728A-A421-A723-DE84F8DDE3EA -name qsvg4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::5EF561A9-E70B-8F01-A852-C36D28D1FA14 -type dir -name codecs -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::5EF561A9-E70B-8F01-A852-C36D28D1FA14 -type dir -name codecs -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D60D391E-2AA1-900B-DB5A-348EFC529375 -name qkrcodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::4B320138-FB4B-DBD2-81BC-9D1413CF7ED6 -name qkrcodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::38BE74BB-3CFA-7131-0467-BB1C4AE76512 -name qkrcodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::49F00491-8056-0B75-7FC5-87761A3C6161 -name qcncodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::CE567CBA-06A4-6D8E-E389-560CAC84E168 -name qcncodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::2546B812-DBD7-3EDF-5CB2-B5F6B62639AB -name qcncodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::12148DF6-6953-C6D3-6CDA-0ACED6F7D7FA -name qjpcodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::E4C54E9A-D1E4-DCC9-C43E-FC3A5FD7F8C7 -name qcncodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::1A86AC76-87FD-5EA9-0F23-2F21CA22F0CE -name qjpcodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::FEB0CF93-169B-D996-2363-3AE057322EA6 -name qjpcodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::0C8E6656-F734-B2B5-F0F7-6F5BDB5C6885 -name qjpcodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::F95B9748-FC4E-4AF3-C037-8493AD7BE0DA -name qtwcodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::2C3B2B03-3911-E7A8-035A-33E25A510F27 -name qtwcodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::BD1A8C7A-D485-9272-4B9A-05EE511A59CF -name qtwcodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::7EC5EFFB-7AA7-AEB1-46AD-4234DEE6A377 -name qtwcodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::CEE6F2FE-EEBA-8973-AAA5-DCAAAD279B72 -name qkrcodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::48EA1D8C-F4C8-3D34-229D-B501057802F3 -type dir -name driver -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::48EA1D8C-F4C8-3D34-229D-B501057802F3 -type dir -name driver -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::596DAFDA-23D2-26B3-1535-3D4BF36C9AD9 -name libusb0.dll -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::E6B997AB-A35F-1142-14AB-6B9513D98C40 -name libusb0.sys -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::20557983-9D6C-4AB5-D2DF-BE418BEE6BA3 -name libusb0_x64.dll -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::CFCED8FB-FE60-07EC-690D-4C47C2C786F6 -name libusb0_x64.sys -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::6D2B03D1-8449-045C-298A-9E65C168F64A -name prs500_x64.cat -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::8147A9D4-D17C-55EB-CAA5-CC0C04EDC0D2 -name prs500.cat -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::1085BEED-C76A-5FF4-209A-E03CFB697462 -name prs500.inf -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::0AC00D67-8452-CABB-6843-FE6A464E9AE9 -type dir -name plugins -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0AC00D67-8452-CABB-6843-FE6A464E9AE9 -type dir -name plugins -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::540FEFD3-9B1B-00E6-B8A5-EA8EB959428E -name podofo.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::87BCFAF5-FAEB-219C-BA28-1DFD1B2A7743 -name podofo.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::0C77BC18-CE53-35EF-A667-C25B81C43E64 -name pictureflow.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::9F15B633-412B-51ED-2B7D-4EB0A0847740 -name winutil.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::9E3D908E-B119-30AE-391D-D16CA6BEE7AC -name msdes.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::F1D1D581-9194-D12F-6139-F920EEC1B14E -name winutil.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::A94E4D31-5F8C-A363-AE61-A8F2E3A7B756 -name lzx.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::34C430AE-BC1B-8352-1713-50C89C176C77 -name lzx.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::2C88788E-B9FB-729D-442B-600ED97096A0 -name cPalmdoc.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::8A15A76F-105D-3B6C-6E54-A01F8EA16CE3 -name cPalmdoc.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::26503DDE-8C5F-102F-B689-C6A17B2D6C93 -name msdes.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::01034EB7-C79C-42B9-6FF0-E06C72EF2623 -type dir -name iconengines -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::01034EB7-C79C-42B9-6FF0-E06C72EF2623 -type dir -name iconengines -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8ADB07A0-6B9E-8F53-34DF-2035C7C343F1 -name qsvgicon4.dll -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::41F512E3-9F39-68C6-BB7F-58F572755D35 -name qsvgicon4.exp -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::7EE2621C-0EAE-B516-505A-6CE11A8F8951 -name qsvgicon4.lib -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::99A56CA8-60A5-CC90-1F6F-0A393722F9D2 -name qsvgicon4.dll.manifest -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::7FC7557D-E1AF-082B-7286-24939CD5EE76 -name IM_MOD_RL_sfw_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::7FC7557D-E1AF-082B-7286-24939CD5EE76 -name IM_MOD_RL_sfw_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EF383C5E-5939-F73E-5F9C-26009B469ADA -name feeds2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::71A18B69-E38B-AB9F-3B81-BECFD4454D38 -name PyQt4.QtNetwork.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::71A18B69-E38B-AB9F-3B81-BECFD4454D38 -name PyQt4.QtNetwork.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E1BF1A4F-2942-73DB-1770-1ECB02CA9799 -name comic2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EEC00227-DED5-B9BF-A36D-24239AEDE932 -name rtf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F6C99732-1835-1C2A-02F9-F2BB631BEC81 -name dde.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::F6C99732-1835-1C2A-02F9-F2BB631BEC81 -name dde.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3334C5D8-8513-326D-A96C-C86D1C325EBB -name pdf2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::20079501-EBD5-FEFD-8E49-2CF6A63E83E0 -name IM_MOD_RL_rle_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::20079501-EBD5-FEFD-8E49-2CF6A63E83E0 -name IM_MOD_RL_rle_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D98A0557-D988-24A1-9F32-67F3E9A5A123 -name opf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::470243F6-C8E4-DB45-678F-6A314747097E -name sqlite3.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::470243F6-C8E4-DB45-678F-6A314747097E -name sqlite3.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4AA221F6-EBE3-997E-AECF-DD8E03265385 -name html2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0213D597-D9C7-F155-EE44-1BD9E19520E3 -name IM_MOD_RL_tiff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0213D597-D9C7-F155-EE44-1BD9E19520E3 -name IM_MOD_RL_tiff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F782E3D0-C2CA-481C-70C4-2257FEF52EAF -name CORE_RL_libxml_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::F782E3D0-C2CA-481C-70C4-2257FEF52EAF -name CORE_RL_libxml_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::414CB1DC-A13E-CE54-60A9-157381D4DDC4 -name oeb2lit.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9306B7C1-11DE-7B54-1AFB-67AFF82B8013 -name _sqlite3.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::9306B7C1-11DE-7B54-1AFB-67AFF82B8013 -name _sqlite3.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4D6B4FC9-F900-E0AD-5258-8918CBFEB9AD -name lrs2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4D6B4FC9-F900-E0AD-5258-8918CBFEB9AD -name lrs2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::05329209-3CCE-90C0-FFEA-BECEBA6A6AB4 -name lit2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A2AF7001-960E-F5EA-AA09-025E35FD09BC -name IM_MOD_RL_sun_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A2AF7001-960E-F5EA-AA09-025E35FD09BC -name IM_MOD_RL_sun_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C472ABCF-2160-C218-41CA-0DDE625AAEC6 -name IM_MOD_RL_msl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C472ABCF-2160-C218-41CA-0DDE625AAEC6 -name IM_MOD_RL_msl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DC7D8C3A-81C2-7FC5-4AC0-8CDC4069FC97 -name IM_MOD_RL_jp2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::DC7D8C3A-81C2-7FC5-4AC0-8CDC4069FC97 -name IM_MOD_RL_jp2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::555AF3FA-9A08-CCFF-4028-3F8891A6D212 -name CORE_RL_ttf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::555AF3FA-9A08-CCFF-4028-3F8891A6D212 -name CORE_RL_ttf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::92F06FE6-C2C5-FF23-0A9B-884AB21D8221 -name PIL._imagingft.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::92F06FE6-C2C5-FF23-0A9B-884AB21D8221 -name PIL._imagingft.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DA2ABF54-3BC2-87E4-BA86-24C8B2915AC0 -name txt2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C3B86C9F-1A59-9573-DCA2-A2747E7C3B4F -name odt2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::ED8542BE-DDE4-72B2-B05A-A09D00818994 -name web2disk.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::ED8542BE-DDE4-72B2-B05A-A09D00818994 -name web2disk.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A2154B84-F146-FD50-1DA9-1DB374A5439E -name IM_MOD_RL_exr_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A2154B84-F146-FD50-1DA9-1DB374A5439E -name IM_MOD_RL_exr_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A442B5C3-724F-6542-816D-30C3D3EDD1E3 -name CORE_RL_Magick++_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A442B5C3-724F-6542-816D-30C3D3EDD1E3 -name CORE_RL_Magick++_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A18318B3-88EF-11EB-4E14-B02CBD4F0E5E -name calibre-parallel.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A18318B3-88EF-11EB-4E14-B02CBD4F0E5E -name calibre-parallel.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E26C9A86-F12B-7F1E-F2E8-8A42C0436321 -name IM_MOD_RL_dib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::E26C9A86-F12B-7F1E-F2E8-8A42C0436321 -name IM_MOD_RL_dib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2E94EBE2-F588-C484-009C-48C0DA7D1932 -name IM_MOD_RL_preview_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::2E94EBE2-F588-C484-009C-48C0DA7D1932 -name IM_MOD_RL_preview_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9D75046B-57DC-872C-39F1-4C6E44337227 -name html2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7294280B-8324-B1A0-A054-92F330874F48 -name numpy.fft.fftpack_lite.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::7294280B-8324-B1A0-A054-92F330874F48 -name numpy.fft.fftpack_lite.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5322B2EC-82CF-9446-964E-38CB7C688C1B -name oeb2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::74DC3F8D-5C56-8FB8-F59A-0C4C5ECB70A0 -name CORE_RL_magick_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::74DC3F8D-5C56-8FB8-F59A-0C4C5ECB70A0 -name CORE_RL_magick_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1638722F-A861-F762-1514-5649B2AD08FF -name IM_MOD_RL_svg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::1638722F-A861-F762-1514-5649B2AD08FF -name IM_MOD_RL_svg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D345F98D-EDB4-53D0-95A6-82968E47E080 -name IM_MOD_RL_mpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D345F98D-EDB4-53D0-95A6-82968E47E080 -name IM_MOD_RL_mpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::91CA5392-5F4E-12F7-C670-939B1500616B -name ebook-viewer.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::91CA5392-5F4E-12F7-C670-939B1500616B -name ebook-viewer.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4706580D-D101-13EA-DED0-2593D7FBADE8 -name LICENSE -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4706580D-D101-13EA-DED0-2593D7FBADE8 -name LICENSE -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::63F996B0-07D9-EA5B-2176-F02D9851EAE4 -name feeds2disk.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::89CAC9B2-DA65-DBF2-6295-757553882213 -name numpy.core.umath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::89CAC9B2-DA65-DBF2-6295-757553882213 -name numpy.core.umath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2F90282D-B59F-B6BA-090B-45858AF7F3B2 -name IM_MOD_RL_clipboard_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::2F90282D-B59F-B6BA-090B-45858AF7F3B2 -name IM_MOD_RL_clipboard_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B512D139-B295-D7C3-F0B4-43775849CF58 -name numpy.core._sort.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::B512D139-B295-D7C3-F0B4-43775849CF58 -name numpy.core._sort.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A999B024-1024-E709-07C1-22BA67A850BB -name feeds2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A2C063AC-2F12-9260-501A-0E8BD0B8A932 -name calibre.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A2C063AC-2F12-9260-501A-0E8BD0B8A932 -name calibre.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::439B6D05-7DE6-061D-4BCC-3F04F4FA2FA2 -name IM_MOD_RL_png_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::439B6D05-7DE6-061D-4BCC-3F04F4FA2FA2 -name IM_MOD_RL_png_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BA464D11-BBCE-DEDA-C354-0C7BE60FAA05 -name IM_MOD_RL_braille_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::BA464D11-BBCE-DEDA-C354-0C7BE60FAA05 -name IM_MOD_RL_braille_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8F9FF823-AF6D-A288-8AE6-7D74F55DCE29 -name CORE_RL_bzlib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::8F9FF823-AF6D-A288-8AE6-7D74F55DCE29 -name CORE_RL_bzlib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::ABAEA510-B003-29CB-6ADE-F6E1826DD501 -name web2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::57A3F5D5-BFC8-CB38-5A57-548EE0DB033B -name QtNetwork4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::57A3F5D5-BFC8-CB38-5A57-548EE0DB033B -name QtNetwork4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4DB7E8DE-905A-822A-AF14-17BD5ACEF915 -name IM_MOD_RL_wmf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4DB7E8DE-905A-822A-AF14-17BD5ACEF915 -name IM_MOD_RL_wmf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::559057ED-0FEA-62A1-68C2-023116B5636C -name win32ui.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::559057ED-0FEA-62A1-68C2-023116B5636C -name win32ui.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::83F3AC3F-A485-B791-D4F0-6E67135FF19D -name IM_MOD_RL_txt_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::83F3AC3F-A485-B791-D4F0-6E67135FF19D -name IM_MOD_RL_txt_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::FABA7768-743B-08F7-B871-ED5E9082DF38 -name win32gui.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::FABA7768-743B-08F7-B871-ED5E9082DF38 -name win32gui.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A8D10C63-CDFB-0809-CA84-4CB7A0A451FC -name fb2-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C49805D2-C0B8-01C4-DF6F-674D9C0BFD15 -name IM_MOD_RL_viff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C49805D2-C0B8-01C4-DF6F-674D9C0BFD15 -name IM_MOD_RL_viff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1B9F2F00-20A5-B207-5A80-8F75470286AD -name txt2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::826F1915-9F97-59DD-6637-3EEC0744A79C -name IM_MOD_RL_ps2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::826F1915-9F97-59DD-6637-3EEC0744A79C -name IM_MOD_RL_ps2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::519A6618-8A1F-93A5-93B4-6EEF5A4A3DE9 -name comic2pdf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A5F23791-BCDC-A997-4941-5D1F2F227E6D -name type.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A5F23791-BCDC-A997-4941-5D1F2F227E6D -name type.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0A1C107A-C0AA-3ED6-4F37-A6894386DCBE -name IM_MOD_RL_ps3_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0A1C107A-C0AA-3ED6-4F37-A6894386DCBE -name IM_MOD_RL_ps3_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EEBA64E7-6509-EBAF-3E23-1A203216F39A -name epub2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2655F4FC-F682-46D8-B75C-6AF322323EF5 -name IM_MOD_RL_dot_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::2655F4FC-F682-46D8-B75C-6AF322323EF5 -name IM_MOD_RL_dot_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::176456BB-237C-9EBE-60E1-D8F78AAFFEC8 -name IM_MOD_RL_xwd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::176456BB-237C-9EBE-60E1-D8F78AAFFEC8 -name IM_MOD_RL_xwd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9AE8498B-C89C-8B12-B8A1-35E1B6650469 -name lxml.objectify.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::9AE8498B-C89C-8B12-B8A1-35E1B6650469 -name lxml.objectify.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EA37C1C2-57BB-4E7A-C004-0010D79142C2 -name IM_MOD_RL_fits_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::EA37C1C2-57BB-4E7A-C004-0010D79142C2 -name IM_MOD_RL_fits_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::05F5C10D-6988-F1F4-A486-86C96DB20302 -name pywintypes26.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::05F5C10D-6988-F1F4-A486-86C96DB20302 -name pywintypes26.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0137A2B1-EB94-EB26-7295-0C7CD941A1DF -name IM_MOD_RL_histogram_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0137A2B1-EB94-EB26-7295-0C7CD941A1DF -name IM_MOD_RL_histogram_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7F199A1F-4FA4-2ABA-DED3-36ECF3C089CA -name epub2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CF6398D8-2140-53CF-1DA6-421A82E92621 -name any2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8DFA6C69-360D-FA63-7FF9-860E3DB00B19 -name any2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5BB7579D-9183-412C-81F8-B411B07C57B3 -name IM_MOD_RL_pnm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::5BB7579D-9183-412C-81F8-B411B07C57B3 -name IM_MOD_RL_pnm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::97B8BB83-7772-D87B-C8D1-5215E324AF2C -name library.ico -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::97B8BB83-7772-D87B-C8D1-5215E324AF2C -name library.ico -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DF1361A2-2580-EFBF-65D2-156AD9919DE1 -name library.zip -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::DF1361A2-2580-EFBF-65D2-156AD9919DE1 -name library.zip -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -293,7 +344,6 @@ File ::E658FBE0-5860-D041-12D3-76ADD18F804B -name servicemanager.pyd -parent 8E5
File ::C98A6FC4-E341-7FD4-005C-DA2B384E11D8 -name win32api.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C98A6FC4-E341-7FD4-005C-DA2B384E11D8 -name win32api.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::ADA36EEA-7DE1-447C-B1AB-A4908E65E2CD -name IM_MOD_RL_ipl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::ADA36EEA-7DE1-447C-B1AB-A4908E65E2CD -name IM_MOD_RL_ipl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::53C2EC15-850F-8F49-6425-C228FB6E6D0E -name libfontconfig-1.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::53C2EC15-850F-8F49-6425-C228FB6E6D0E -name libfontconfig-1.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2BCD9281-2CBC-CF0D-0E12-2CE11F6ED758 -name comic2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EDE6F457-C83F-C5FA-9AF4-38FDFF17D929 -name PIL._imagingtk.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::EDE6F457-C83F-C5FA-9AF4-38FDFF17D929 -name PIL._imagingtk.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::09D0906E-3611-3DB7-32CF-A140585694A7 -name win32pdh.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::09D0906E-3611-3DB7-32CF-A140585694A7 -name win32pdh.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4C84F0DC-7157-0C90-2062-180139B03E25 -name IM_MOD_RL_rgb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4C84F0DC-7157-0C90-2062-180139B03E25 -name IM_MOD_RL_rgb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -302,71 +352,48 @@ File ::69072379-7D16-B9F7-9F39-3E6403C48267 -name IM_MOD_RL_xbm_.dll -parent 8E5
File ::FBD11D98-D1E7-5DD9-BF02-01CE92518859 -name IM_MOD_RL_otb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::FBD11D98-D1E7-5DD9-BF02-01CE92518859 -name IM_MOD_RL_otb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8D0CFD32-2B7F-2BB3-8FA0-760A8DB24B52 -name win32service.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::8D0CFD32-2B7F-2BB3-8FA0-760A8DB24B52 -name win32service.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C7F9AB12-AAF7-2954-3DB6-F2C84F41655B -name win32clipboard.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C7F9AB12-AAF7-2954-3DB6-F2C84F41655B -name win32clipboard.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::76676624-68A9-D9D9-6EC7-40CF201520A4 -name pdfreflow.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::62CD997A-A5C7-D71B-A8F7-54567B36A071 -name msvcp90.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::62CD997A-A5C7-D71B-A8F7-54567B36A071 -name msvcp90.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7D76BBE6-FD20-1290-4DBA-93D14FC45B81 -name sip.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::7D76BBE6-FD20-1290-4DBA-93D14FC45B81 -name sip.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::17D27485-128E-E247-14CE-9C3B6988E182 -name pdfreflow.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BF2007D6-5AFE-6D04-4DB0-36A3644D988D -name pdf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D4354621-69ED-DFCB-068A-0812DB1C09C3 -name IM_MOD_RL_avi_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D4354621-69ED-DFCB-068A-0812DB1C09C3 -name IM_MOD_RL_avi_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::109FBE61-82CD-D5AB-AA9D-F9D52947DD22 -name rtf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9BA20E46-014F-DA6A-DEF3-D78E2AEFDD47 -name odt-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EAFAC6D5-A7E8-1843-6D98-6663D899BB11 -name PyQt4.QtCore.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::EAFAC6D5-A7E8-1843-6D98-6663D899BB11 -name PyQt4.QtCore.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::155505A4-F0D8-05B2-10AD-149E178976A4 -name calibredb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::155505A4-F0D8-05B2-10AD-149E178976A4 -name calibredb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::39D5114E-1E70-5402-7E19-D86490678506 -name CORE_RL_lcms_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::39D5114E-1E70-5402-7E19-D86490678506 -name CORE_RL_lcms_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::75C3F298-B07C-DA98-38B2-40FFD39C32ED -name oeb2lit.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::388E0308-35A8-69B9-6837-383FD72E99E9 -name IM_MOD_RL_xpm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::388E0308-35A8-69B9-6837-383FD72E99E9 -name IM_MOD_RL_xpm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3DB88954-1B0D-FDBC-CE29-EFCC01D4121E -name epub-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::43C0DE14-A935-2139-6690-256C49C461C4 -name IM_MOD_RL_xcf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::43C0DE14-A935-2139-6690-256C49C461C4 -name IM_MOD_RL_xcf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E185A35A-93DB-61BB-E7EE-2C2222FD4939 -name win32security.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::E185A35A-93DB-61BB-E7EE-2C2222FD4939 -name win32security.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::498CCC26-383A-87CA-30C0-626D52555B37 -name librarything.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::498CCC26-383A-87CA-30C0-626D52555B37 -name librarything.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::404A98F1-84FD-B6D0-B130-354EECD9253C -name IM_MOD_RL_emf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::404A98F1-84FD-B6D0-B130-354EECD9253C -name IM_MOD_RL_emf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::17034C34-403E-B405-99C1-F80B7F00E27C -name log.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::17034C34-403E-B405-99C1-F80B7F00E27C -name log.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::34E63A2C-65C5-0A84-ACF1-BD6A844D4579 -name pythoncom26.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::34E63A2C-65C5-0A84-ACF1-BD6A844D4579 -name pythoncom26.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CE737360-1B73-DEC3-E511-3FAEC61F5292 -name epub-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2F20484B-53B8-B08E-B691-C5B2D49A9CB4 -name QtWebKit4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::2F20484B-53B8-B08E-B691-C5B2D49A9CB4 -name QtWebKit4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8AF134C8-9189-3F9A-A081-9143FFD44C45 -name freetype6.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::8AF134C8-9189-3F9A-A081-9143FFD44C45 -name freetype6.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E8A4442D-D0D3-31CD-997A-3CEB641CF5B7 -name IM_MOD_RL_mtv_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::E8A4442D-D0D3-31CD-997A-3CEB641CF5B7 -name IM_MOD_RL_mtv_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::56B7883F-B4FE-BE25-BCBA-4AF17CC84C93 -name fb22lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0CA87D0B-5A04-1439-AEE8-C97072D47BA7 -name CORE_RL_tiff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0CA87D0B-5A04-1439-AEE8-C97072D47BA7 -name CORE_RL_tiff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AC24F520-88D4-D1CF-5797-27C715CE8ACA -name pyexpat.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::AC24F520-88D4-D1CF-5797-27C715CE8ACA -name pyexpat.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::16848F38-71CD-55B8-4D96-1537F6773744 -name IM_MOD_RL_dps_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::16848F38-71CD-55B8-4D96-1537F6773744 -name IM_MOD_RL_dps_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::33A46CC5-BAC4-5863-C83D-303DCCA0CAA1 -name tk85.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::33A46CC5-BAC4-5863-C83D-303DCCA0CAA1 -name tk85.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::39E11D64-CC0C-E565-B3CC-882A5AA9F4AF -name html2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::81116DD3-1715-AA87-472F-544FC616EDAF -name IM_MOD_RL_dcm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::81116DD3-1715-AA87-472F-544FC616EDAF -name IM_MOD_RL_dcm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A6EF7DB0-FC94-8794-1F15-394432CD283D -name imp-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::335A4CFB-5C2D-44E4-C438-7018E8244C3D -name ebook-viewer.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::335A4CFB-5C2D-44E4-C438-7018E8244C3D -name ebook-viewer.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::62A16C3B-ED9C-5187-2807-58857DF3A990 -name calibre-debug.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::62A16C3B-ED9C-5187-2807-58857DF3A990 -name calibre-debug.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2B8B1DCD-AA68-7612-80A5-C20CAAF06019 -name any2lit.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::55ECA7B7-279A-F51D-81C2-C8DC44CF0E22 -name select.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::55ECA7B7-279A-F51D-81C2-C8DC44CF0E22 -name select.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A6AF5ECC-A981-4CBD-DBEE-303A9340C603 -name IM_MOD_RL_xps_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A6AF5ECC-A981-4CBD-DBEE-303A9340C603 -name IM_MOD_RL_xps_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5BCBF71F-18E7-5C52-E3F5-7D7F3028AD46 -name locale.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::5BCBF71F-18E7-5C52-E3F5-7D7F3028AD46 -name locale.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2EDE0641-B5DF-220F-9FF3-486E5A081EFC -name rb-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5C9FA94C-B8B0-A94B-548D-1D24FDEA5770 -name CORE_RL_wand_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::5C9FA94C-B8B0-A94B-548D-1D24FDEA5770 -name CORE_RL_wand_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E39E60BE-DE77-AB8C-42C6-5A7D7DC073E3 -name IM_MOD_RL_ttf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::E39E60BE-DE77-AB8C-42C6-5A7D7DC073E3 -name IM_MOD_RL_ttf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8F1AF028-E819-4ED6-8B69-704183C3BD1D -name pdf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D8F566FB-93DA-3128-5DBD-DF1068B3E3ED -name IM_MOD_RL_dpx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D8F566FB-93DA-3128-5DBD-DF1068B3E3ED -name IM_MOD_RL_dpx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::FFE5F178-A1A4-3691-9C88-E5109D144437 -name IM_MOD_RL_jpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::FFE5F178-A1A4-3691-9C88-E5109D144437 -name IM_MOD_RL_jpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0C9C97F6-5622-D4B5-E7CD-B4E5E9A8634C -name odt-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C05AD359-A7A5-9760-A4C8-310074353C89 -name feeds2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::03665A74-B895-EB3D-EBA0-2D2B6D26DDDA -name PIL._imagingmath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::03665A74-B895-EB3D-EBA0-2D2B6D26DDDA -name PIL._imagingmath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::81AED538-B97F-6272-5C6E-9B27D7285B35 -name IM_MOD_RL_fax_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::81AED538-B97F-6272-5C6E-9B27D7285B35 -name IM_MOD_RL_fax_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BDCCAEC0-4847-B8D8-50B1-1B434B73A01F -name IM_MOD_RL_avs_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::BDCCAEC0-4847-B8D8-50B1-1B434B73A01F -name IM_MOD_RL_avs_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::727B9BD6-B55E-386E-D3B9-D99D0D9ADBB1 -name QtGui4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::727B9BD6-B55E-386E-D3B9-D99D0D9ADBB1 -name QtGui4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1C7421A2-1BA7-7807-EB41-67578E0302E8 -name IM_MOD_RL_mvg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::1C7421A2-1BA7-7807-EB41-67578E0302E8 -name IM_MOD_RL_mvg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C3466B70-23C3-31C9-3B4F-1B3B56E4D013 -name markdown-calibre.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C3466B70-23C3-31C9-3B4F-1B3B56E4D013 -name markdown-calibre.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A190F216-F7F7-A425-5F9D-F6B5C35D3A8F -name lrf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6ED1C675-C4D5-6BFF-7C8A-9AB4BF39D00C -name _hashlib.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::6ED1C675-C4D5-6BFF-7C8A-9AB4BF39D00C -name _hashlib.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::21F7F333-3063-71E3-85F5-5C88584B15CC -name IM_MOD_RL_tga_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::21F7F333-3063-71E3-85F5-5C88584B15CC -name IM_MOD_RL_tga_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::738CADE4-6C0A-5155-A1BE-8F789C1D92E7 -name feeds2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::26741B21-C241-E100-8BB1-8B679BC3E662 -name configure.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::26741B21-C241-E100-8BB1-8B679BC3E662 -name configure.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7D491E89-C6D3-1E6E-F4BD-8E55260FE33E -name libexpat.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::7D491E89-C6D3-1E6E-F4BD-8E55260FE33E -name libexpat.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A4910EB3-0F1C-F6F0-CD2D-16A64BBAA92B -name calibre-fontconfig.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8711327A-716D-B162-6AC6-2FB4AD071266 -name fb22lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::476CB977-5155-D56F-26CA-EB243AEBBA99 -name unrar.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::476CB977-5155-D56F-26CA-EB243AEBBA99 -name unrar.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2DA1CC8D-AF5C-3B03-2060-301DFE0356CC -name mobi2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2E2A9EDA-5386-444E-8479-557386794552 -name IM_MOD_RL_uil_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::2E2A9EDA-5386-444E-8479-557386794552 -name IM_MOD_RL_uil_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4530C4C8-BCFA-E461-5F72-0EF5B553C7F5 -name pdf2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::29582E09-00E0-B2F9-475C-8C6D2E4BF7E8 -name any2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D3301E15-1B1A-E2AB-1B04-30A601B3FB44 -name IM_MOD_RL_cut_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D3301E15-1B1A-E2AB-1B04-30A601B3FB44 -name IM_MOD_RL_cut_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::181B28B9-CF13-0C28-8380-B39DF6E7397D -name markdown-calibre.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::181B28B9-CF13-0C28-8380-B39DF6E7397D -name markdown-calibre.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BC1D2D23-48ED-ECFF-2180-37C83554FDED -name Xext.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::BC1D2D23-48ED-ECFF-2180-37C83554FDED -name Xext.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -379,7 +406,6 @@ File ::DE476170-B65E-B429-A23C-F822E4190FFC -name IM_MOD_RL_thumbnail_.dll -pare
File ::31E46936-560D-1E88-8FC1-F8E590D2FD02 -name IM_MOD_RL_mpc_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::31E46936-560D-1E88-8FC1-F8E590D2FD02 -name IM_MOD_RL_mpc_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0C04692E-5DCF-864F-6640-2FF5BF12BA91 -name IM_MOD_RL_cmyk_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0C04692E-5DCF-864F-6640-2FF5BF12BA91 -name IM_MOD_RL_cmyk_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A620FEB9-39FE-B102-6963-FEDA25EBF2F1 -name IM_MOD_RL_pcd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A620FEB9-39FE-B102-6963-FEDA25EBF2F1 -name IM_MOD_RL_pcd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0A4D27B3-157D-357A-6A86-32D8EB5B30D7 -name lit2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::80D1F9CA-D7DA-578E-CE25-4E0EE988D280 -name IM_MOD_RL_sct_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::80D1F9CA-D7DA-578E-CE25-4E0EE988D280 -name IM_MOD_RL_sct_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C85307C1-5F11-01EF-2193-95F37CB49822 -name IM_MOD_RL_pict_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C85307C1-5F11-01EF-2193-95F37CB49822 -name IM_MOD_RL_pict_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3ECF2FC0-91AA-9573-42B3-4BD784FA5BC9 -name IM_MOD_RL_gradient_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::3ECF2FC0-91AA-9573-42B3-4BD784FA5BC9 -name IM_MOD_RL_gradient_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -389,46 +415,29 @@ File ::CBF83E89-39E0-D7C3-7902-A4A0ADCDEF48 -name IM_MOD_RL_jbig_.dll -parent 8E
File ::FFF32C7F-BB57-4BB3-A52D-4E4F3496B967 -name calibre-debug.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::FFF32C7F-BB57-4BB3-A52D-4E4F3496B967 -name calibre-debug.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::80A3C65A-553D-EA27-FAED-4F831578F4F8 -name magic.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::80A3C65A-553D-EA27-FAED-4F831578F4F8 -name magic.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E2DF0DC3-3372-3CDF-5177-5B3F3BF84E66 -name IM_MOD_RL_mat_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::E2DF0DC3-3372-3CDF-5177-5B3F3BF84E66 -name IM_MOD_RL_mat_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::955B176E-5F6A-FFFA-9387-893E38C23E33 -name prs500.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4D938678-59AF-F5F6-697B-E3A5BE76B43B -name QtXml4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4D938678-59AF-F5F6-697B-E3A5BE76B43B -name QtXml4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::FCAEFF6A-1E96-FA23-C8AC-0F5F3297B14A -name rtf2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0A5A70A8-39EC-B733-E807-9C358E5EA7A3 -name IM_MOD_RL_meta_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0A5A70A8-39EC-B733-E807-9C358E5EA7A3 -name IM_MOD_RL_meta_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E6419523-253A-3052-B9B4-0EA792EF4A64 -name pdftohtml.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::E6419523-253A-3052-B9B4-0EA792EF4A64 -name pdftohtml.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EF062C24-09D8-1DC8-891A-F9563BBA57C2 -name IM_MOD_RL_gray_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::EF062C24-09D8-1DC8-891A-F9563BBA57C2 -name IM_MOD_RL_gray_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E1D4796B-733B-F45A-2ECC-D498A1AC4EAD -name opf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0E21E0B1-C2D4-3F6D-E788-9EEB821128C3 -name web2disk.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0E21E0B1-C2D4-3F6D-E788-9EEB821128C3 -name web2disk.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::12DE2886-5926-F8AD-77C4-EAAC5DD9413C -name rtf2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E96D95C6-2D53-A67B-C704-06BD213BBC86 -name mobi-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A4D76085-EFC7-A237-7BB7-AA8A33BFB849 -name html2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::27127583-9DC6-4397-3E86-052A515ED051 -name lrfviewer.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::27127583-9DC6-4397-3E86-052A515ED051 -name lrfviewer.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7229472A-2A5A-2685-0223-2DF2CED0C9D4 -name comic2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::396B4F78-FB45-C0B2-ACB3-97769CF5CD5D -name msvcr90.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::396B4F78-FB45-C0B2-ACB3-97769CF5CD5D -name msvcr90.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1DE767EE-4891-4E54-422D-67A4DFF8C3B5 -name lrfviewer.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::1DE767EE-4891-4E54-422D-67A4DFF8C3B5 -name lrfviewer.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AFFEC28A-615C-E3E6-0026-CCE2594A6D25 -name calibre-server.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::AFFEC28A-615C-E3E6-0026-CCE2594A6D25 -name calibre-server.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2C64F86B-9366-B52D-F7B2-5BBD51F6982A -name IM_MOD_RL_pwp_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::2C64F86B-9366-B52D-F7B2-5BBD51F6982A -name IM_MOD_RL_pwp_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::187D965E-40CE-18AB-5684-18C31A7FD8D4 -name any2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F4B2EF9C-EB18-B865-6E99-75CFB9B60D87 -name IM_MOD_RL_dds_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::F4B2EF9C-EB18-B865-6E99-75CFB9B60D87 -name IM_MOD_RL_dds_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9D0CC46C-E254-7F11-4B64-A6E8E16CF6FB -name mobi2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::72769321-EF4D-C796-5E76-3D5807772233 -name any2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::38770D87-6CA9-9E3E-FBA1-A8CCFCD88FB5 -name IM_MOD_RL_fpx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::38770D87-6CA9-9E3E-FBA1-A8CCFCD88FB5 -name IM_MOD_RL_fpx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A31CA43B-4456-BB26-A8EE-73C4C4B1F6FC -name pdftrim.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BE2D7BC3-D294-AF3F-65E7-3B372DEFDE36 -name PIL._imaging.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::BE2D7BC3-D294-AF3F-65E7-3B372DEFDE36 -name PIL._imaging.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::200B9AEC-809F-75B7-DC12-A51BFC2A6F93 -name PyQt4.QtSvg.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::200B9AEC-809F-75B7-DC12-A51BFC2A6F93 -name PyQt4.QtSvg.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3A424677-A66A-CAA0-4FD2-4FE8086DBBA6 -name comic2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::52132A31-D3AE-C617-7568-BF2AF46B5D74 -name IM_MOD_RL_pcl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::52132A31-D3AE-C617-7568-BF2AF46B5D74 -name IM_MOD_RL_pcl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F94472C3-C8D0-950F-5ED9-1611D1CE30E5 -name IM_MOD_RL_inline_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::F94472C3-C8D0-950F-5ED9-1611D1CE30E5 -name IM_MOD_RL_inline_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::794E99A2-79AB-BABB-97A1-9E3482002EA8 -name imp-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::055ADB4B-20C5-E071-442F-4DA0A8D6F3C5 -name english.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::055ADB4B-20C5-E071-442F-4DA0A8D6F3C5 -name english.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DE4F9AD0-3D79-865A-2DD9-4A4CB6886AFC -name lit-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B10B6B91-0C03-642D-90D8-37B607B164AD -name IM_MOD_RL_wpg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::B10B6B91-0C03-642D-90D8-37B607B164AD -name IM_MOD_RL_wpg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BFBB144B-1794-8304-9772-F103A42F2CA4 -name IM_MOD_RL_pdb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::BFBB144B-1794-8304-9772-F103A42F2CA4 -name IM_MOD_RL_pdb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EAED9280-84D7-9768-9F89-CEC61CE549DF -name mobi-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2FE2FF56-5CF5-15B7-2BD8-32100DF421DC -name _ssl.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::2FE2FF56-5CF5-15B7-2BD8-32100DF421DC -name _ssl.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AE47BDA8-A1E5-2E84-28D7-DF8A84B18202 -name Microsoft.VC90.CRT.manifest -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::AE47BDA8-A1E5-2E84-28D7-DF8A84B18202 -name Microsoft.VC90.CRT.manifest -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A6B1C213-DC68-B7C3-8EDE-806286829899 -name w9xpopen.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A6B1C213-DC68-B7C3-8EDE-806286829899 -name w9xpopen.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D3E03CFA-4AF0-93FB-E04B-B282926099E0 -name IM_MOD_RL_label_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D3E03CFA-4AF0-93FB-E04B-B282926099E0 -name IM_MOD_RL_label_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6F40E97B-430C-08FE-30CA-9E6622EE29EB -name feeds2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::345C74B8-B45D-A370-27F3-78CEA9EAB1E1 -name prs500.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::662783C0-3826-9869-8EB8-326B363D3686 -name IM_MOD_RL_clip_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::662783C0-3826-9869-8EB8-326B363D3686 -name IM_MOD_RL_clip_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::442D92A7-97B1-74BC-F150-A9992A925356 -name numpy.core.multiarray.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::442D92A7-97B1-74BC-F150-A9992A925356 -name numpy.core.multiarray.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::54991918-D11F-EEAD-F7E3-0EE28F22249E -name IM_MOD_RL_pix_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::54991918-D11F-EEAD-F7E3-0EE28F22249E -name IM_MOD_RL_pix_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -440,41 +449,26 @@ File ::5CB76241-5682-AE44-82D3-A6C8C66B88D6 -name IM_MOD_RL_bmp_.dll -parent 8E5
File ::A843E4DA-8671-C4F7-BA61-998AA1D278C8 -name numpy.linalg.lapack_lite.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A843E4DA-8671-C4F7-BA61-998AA1D278C8 -name numpy.linalg.lapack_lite.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::908EA762-5568-17BE-D77D-5DE5551895D0 -name IM_MOD_RL_raw_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::908EA762-5568-17BE-D77D-5DE5551895D0 -name IM_MOD_RL_raw_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CC186E15-8751-A4AA-B2A7-D2E522F1F9DF -name lrf2lrs.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::CC186E15-8751-A4AA-B2A7-D2E522F1F9DF -name lrf2lrs.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::36135E27-30B6-A0E9-5423-FDDFBCBD4FA2 -name feeds2disk.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A99CACD7-FE57-8A5E-BAA1-2D8B41925593 -name IM_MOD_RL_cip_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A99CACD7-FE57-8A5E-BAA1-2D8B41925593 -name IM_MOD_RL_cip_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::782BE25A-B08E-D914-73F5-D92430823BE1 -name mobi2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C4649D7A-9312-8984-E7CD-A0AB794C5A8E -name IM_MOD_RL_pdf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C4649D7A-9312-8984-E7CD-A0AB794C5A8E -name IM_MOD_RL_pdf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B50467F0-07D0-B634-EB43-C4B721798A84 -name analyze.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::B50467F0-07D0-B634-EB43-C4B721798A84 -name analyze.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5531BA1B-8FDA-01B2-7DEE-6E9A116F7AB3 -name lrf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::47658BFB-7389-6866-359E-7517C18E768D -name IM_MOD_RL_mpr_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::47658BFB-7389-6866-359E-7517C18E768D -name IM_MOD_RL_mpr_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::673BD772-ACE7-1695-EAAC-EDD1A3EA0425 -name pdftrim.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3F6735E8-D4E6-A6F9-C9F8-4219E6BBC827 -name CORE_RL_jpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::3F6735E8-D4E6-A6F9-C9F8-4219E6BBC827 -name CORE_RL_jpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::918BE500-1E97-90C0-3FB3-4056FE8D0E15 -name IM_MOD_RL_wbmp_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::918BE500-1E97-90C0-3FB3-4056FE8D0E15 -name IM_MOD_RL_wbmp_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D59F7D54-24A7-774D-79EB-423A64E8CB21 -name IM_MOD_RL_stegano_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D59F7D54-24A7-774D-79EB-423A64E8CB21 -name IM_MOD_RL_stegano_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BB8BCD59-9EBA-3D9B-D802-79D9C384AADB -name fb2-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::17F9A868-E52D-F961-9DB7-8AC69BA702EA -name CORE_RL_jp2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::17F9A868-E52D-F961-9DB7-8AC69BA702EA -name CORE_RL_jp2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2ABAD420-B987-612E-C654-10BDB18DE638 -name html2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::81715796-F363-675F-998E-EEEF890009A2 -name calibre-fontconfig.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5CA62422-C207-8C9C-79EB-45260E3DB37B -name odt2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::878003DC-9B1D-7C58-29F8-14D4565ABA64 -name IM_MOD_RL_yuv_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::878003DC-9B1D-7C58-29F8-14D4565ABA64 -name IM_MOD_RL_yuv_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::602B3244-CF6C-F934-E86C-8161800DB150 -name coder.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::602B3244-CF6C-F934-E86C-8161800DB150 -name coder.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C23261F0-19EA-2216-A8D6-45FCC4ECBECE -name win32file.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::C23261F0-19EA-2216-A8D6-45FCC4ECBECE -name win32file.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::100103F9-C269-9B03-A133-7D046DCC5B30 -name IM_MOD_RL_null_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::100103F9-C269-9B03-A133-7D046DCC5B30 -name IM_MOD_RL_null_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D0461A63-6890-CC43-23D1-48E938BF1E6D -name oeb2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F3996144-7BA7-6038-FBB2-C210721BD20E -name lit-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9BEE3580-3674-F4AE-C1F3-B8623E0E4FC8 -name IM_MOD_RL_pattern_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::9BEE3580-3674-F4AE-C1F3-B8623E0E4FC8 -name IM_MOD_RL_pattern_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AC4AE65E-78A4-28C0-1C1B-B99239D0A0EC -name rb-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C025F962-60EE-E4EF-6428-93755DD24F7D -name web2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6A41C4F0-802D-9999-2F7D-AF86466BC420 -name feeds2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::58F70BF7-491E-38D1-B836-1BBF340AA602 -name IM_MOD_RL_plasma_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::58F70BF7-491E-38D1-B836-1BBF340AA602 -name IM_MOD_RL_plasma_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4B6C22CD-D139-FCAB-45FB-E9B7DADFFFED -name win32process.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4B6C22CD-D139-FCAB-45FB-E9B7DADFFFED -name win32process.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4F391A40-8D34-DFEA-2CEB-97A45FF5D234 -name lit2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9698339D-6A1E-7CBC-A772-C9C4B10418BC -name librarything.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::9698339D-6A1E-7CBC-A772-C9C4B10418BC -name librarything.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A3F1DC1C-BEF6-CB6B-F7AC-39F34F4DFABD -name IM_MOD_RL_pcx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::A3F1DC1C-BEF6-CB6B-F7AC-39F34F4DFABD -name IM_MOD_RL_pcx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BE44B72D-2ED1-4983-F652-DE8814401946 -name CORE_RL_xlib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::BE44B72D-2ED1-4983-F652-DE8814401946 -name CORE_RL_xlib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EC5B5C55-8347-0A8C-E9B5-28E45680E2F2 -name IM_MOD_RL_caption_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::EC5B5C55-8347-0A8C-E9B5-28E45680E2F2 -name IM_MOD_RL_caption_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::519BA66E-0CD3-00EA-0932-8D225C4C7EC8 -name calibredb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::519BA66E-0CD3-00EA-0932-8D225C4C7EC8 -name calibredb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EF7BD102-32B6-EEAB-1C3F-AC4059EFEB1E -name comic2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B7E13F99-C8D3-F2FB-1E5F-E8530A77BB71 -name IM_MOD_RL_url_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::B7E13F99-C8D3-F2FB-1E5F-E8530A77BB71 -name IM_MOD_RL_url_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D0762C72-29E8-85CC-8550-6AC9E9AE39E9 -name _win32sysloader.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D0762C72-29E8-85CC-8550-6AC9E9AE39E9 -name _win32sysloader.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4921649D-06BD-A568-3879-BD2D94423FCB -name pdftohtml.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4921649D-06BD-A568-3879-BD2D94423FCB -name pdftohtml.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -499,10 +493,8 @@ File ::80EC4265-6F3B-7F74-F995-4FA85E87A877 -name IM_MOD_RL_vicar_.dll -parent 8
File ::4CDC2DC5-5A3D-B773-A338-3E12E8C5BB9D -name IM_MOD_RL_psd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4CDC2DC5-5A3D-B773-A338-3E12E8C5BB9D -name IM_MOD_RL_psd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4AF4C7B2-8926-4581-2896-C6436460C81F -name IM_MOD_RL_uyvy_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4AF4C7B2-8926-4581-2896-C6436460C81F -name IM_MOD_RL_uyvy_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BF71D048-1137-4453-960C-9267CB790EAD -name IM_MOD_RL_art_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::BF71D048-1137-4453-960C-9267CB790EAD -name IM_MOD_RL_art_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1BB40D21-9061-9B38-E653-26D808F7DEEA -name html2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D9B6371C-332C-45FB-DAEE-1A247130F704 -name calibre-customize.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::D9B6371C-332C-45FB-DAEE-1A247130F704 -name calibre-customize.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::605E727F-DE13-27FE-75C0-34567C468B18 -name calibre-parallel.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::605E727F-DE13-27FE-75C0-34567C468B18 -name calibre-parallel.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::61F250E4-BAA0-5AF3-F597-E53ADEC19877 -name comic2pdf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::37306B68-BABB-418C-A2CA-BAF4E439D3F1 -name viewer.ico -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::37306B68-BABB-418C-A2CA-BAF4E439D3F1 -name viewer.ico -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6092C5A2-8740-2769-DB77-E0B664CD19EC -name PyQt4.QtWebKit.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::6092C5A2-8740-2769-DB77-E0B664CD19EC -name PyQt4.QtWebKit.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::73C82473-A35A-23B8-067C-AA3120D1CEE2 -name win32pipe.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::73C82473-A35A-23B8-067C-AA3120D1CEE2 -name win32pipe.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -521,14 +513,9 @@ File ::29022F2B-4E69-8624-2B2C-98A40E12DC0A -name calibre-server.exe -parent 8E5
File ::7592A236-4835-6A9D-56B1-78985267D9AD -name win32console.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::7592A236-4835-6A9D-56B1-78985267D9AD -name win32console.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::05F4A6BD-A7C3-5108-4708-1524EB0628D9 -name calibre.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::05F4A6BD-A7C3-5108-4708-1524EB0628D9 -name calibre.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DEB8E703-365E-A7BB-2315-6306B2E5C978 -name win32evtlog.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::DEB8E703-365E-A7BB-2315-6306B2E5C978 -name win32evtlog.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6C90CF50-4894-7672-BB1B-F7EE5EB631E3 -name lit2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AB44B44C-E258-A5AB-9511-8D0FBB456EE8 -name IM_MOD_RL_gif_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::AB44B44C-E258-A5AB-9511-8D0FBB456EE8 -name IM_MOD_RL_gif_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5D5F2AAD-6668-5E14-B84C-5D80C4CCC968 -name calibre-customize.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::5D5F2AAD-6668-5E14-B84C-5D80C4CCC968 -name calibre-customize.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5A0DA3BB-2659-F5AA-A305-C4810FA28D89 -name mobi2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9A0C05D0-26E3-72C5-1F04-76F76ABB180F -name numpy.core.scalarmath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::9A0C05D0-26E3-72C5-1F04-76F76ABB180F -name numpy.core.scalarmath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::42616D6D-2797-559B-7E96-2685599993DF -name any2lit.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CB47F917-A45E-B7DE-645C-CA33F005D1BD -name any2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::16AF75CF-CA5E-F533-6C28-7CF167B1215C -name comic2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0888A744-B049-01E8-6AC8-ECC3EE2CEFE6 -name IM_MOD_RL_sgi_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::0888A744-B049-01E8-6AC8-ECC3EE2CEFE6 -name IM_MOD_RL_sgi_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4AEEBBED-E749-15A9-E1F7-9F6BE2A2C3D0 -name _socket.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::4AEEBBED-E749-15A9-E1F7-9F6BE2A2C3D0 -name _socket.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::35B19292-0C50-4AEE-0A79-B2F3BC34B529 -name w9xpopen.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::35B19292-0C50-4AEE-0A79-B2F3BC34B529 -name w9xpopen.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -544,8 +531,27 @@ File ::6F5D62F3-5E63-0753-364C-01CAAF1002E0 -name IM_MOD_RL_magick_.dll -parent
File ::9FDAC308-5D4F-A865-A09A-9FBF48162A47 -name IM_MOD_RL_djvu_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::9FDAC308-5D4F-A865-A09A-9FBF48162A47 -name IM_MOD_RL_djvu_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5D748040-5973-EFF1-41FC-B424636C642E -name fetch-ebook-metadata.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::5D748040-5973-EFF1-41FC-B424636C642E -name fetch-ebook-metadata.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8B8655B8-3823-AA02-1CDA-02F5AD4677C0 -name fetch-ebook-metadata.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40 File ::8B8655B8-3823-AA02-1CDA-02F5AD4677C0 -name fetch-ebook-metadata.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
Component ::F6829AB7-9F66-4CEE-CA0E-21F54C6D3609 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows} -name Main -parent Components File ::8FC3D58A-F3FA-A2D1-711F-F4C3128620CE -name podofo.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
SetupType ::D9ADE41C-B744-690C-2CED-CF826BF03D2E -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows} -name Typical -parent SetupTypes File ::88034147-A376-B759-D48C-5F17A47E8CC3 -name ebook-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6E6F2A97-6614-F2A6-1751-95C099B909FD -name pdfmanipulate.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AC456A9A-6653-5852-D1F7-B04E2C1AA481 -name isbndb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::94580010-4CE4-8EC0-3834-9A2BCCB28C70 -name isbndb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BA087530-7CF4-5460-C9AA-DE4A796C9AEB -name pdfmanipulate.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6AF80BFC-A813-074D-897A-856744A91949 -name ebook-convert.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F8C59A30-9E90-0861-5604-95E7C69C3C80 -name ebook-convert.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9389D511-7BF3-4D72-C78E-4F98DCE8F723 -name calibre-smtp.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::36E9023D-CCBC-9C59-CDA3-71A4D3203B25 -name ebook-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B757AEB8-74A7-1EA8-AC7C-C2B5F690B539 -name ebook-device.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CD137106-C058-6035-57F3-420F9540386E -name _multiprocessing.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7930C2FB-1C6F-3CFB-D8C6-BC677D96045F -name zlib1.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7FDFCBEF-0687-FDA5-F5B7-632966E87BD3 -name calibre-complete.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0450D3E0-07EB-F81F-DA39-038494E4C8FE -name win32com.shell.shell.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8D7A36A6-4517-E995-E989-2E522E7A1438 -name calibre-smtp.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9E4E5E8F-30C0-E631-9516-2AE01A5CA0E9 -name ebook-device.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7BE6B538-70D5-A7EB-5F91-E14CE57B394B -name calibre-complete.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F54BC3BB-5F21-3D81-043E-603D53754CFC -name pdftohtml.exe.manifest -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
Component ::F6829AB7-9F66-4CEE-CA0E-21F54C6D3609 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows FreeBSD-5-x86 FreeBSD-6-x86 FreeBSD-7-x86 Linux-x86_64 Solaris-x86} -name Main -parent Components
SetupType ::D9ADE41C-B744-690C-2CED-CF826BF03D2E -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows FreeBSD-5-x86 FreeBSD-6-x86 FreeBSD-7-x86 Linux-x86_64 Solaris-x86} -name Typical -parent SetupTypes
InstallComponent 3EA07B17-04D8-6508-B535-96CC7173B49A -setup Install -type pane -conditions D7F585DB-0DEC-A94E-DAB0-94D558D82764 -title {Welcome Screen} -component Welcome -command insert -active Yes -parent StandardInstall InstallComponent 3EA07B17-04D8-6508-B535-96CC7173B49A -setup Install -type pane -conditions D7F585DB-0DEC-A94E-DAB0-94D558D82764 -title {Welcome Screen} -component Welcome -command insert -active Yes -parent StandardInstall
Condition D7F585DB-0DEC-A94E-DAB0-94D558D82764 -active Yes -parent 3EA07B17-04D8-6508-B535-96CC7173B49A -title {Execute Script Condition} -component ExecuteScriptCondition -TreeObject::id D7F585DB-0DEC-A94E-DAB0-94D558D82764 Condition D7F585DB-0DEC-A94E-DAB0-94D558D82764 -active Yes -parent 3EA07B17-04D8-6508-B535-96CC7173B49A -title {Execute Script Condition} -component ExecuteScriptCondition -TreeObject::id D7F585DB-0DEC-A94E-DAB0-94D558D82764
@ -1871,6 +1877,168 @@ No
FreeBSD-4-x86,RootInstallDir FreeBSD-4-x86,RootInstallDir
/usr/local/<%ShortAppName%> /usr/local/<%ShortAppName%>
FreeBSD-5-x86,Active
No
FreeBSD-5-x86,BuildSeparateArchives
No
FreeBSD-5-x86,DefaultDirectoryPermission
0755
FreeBSD-5-x86,DefaultFilePermission
0755
FreeBSD-5-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
FreeBSD-5-x86,FallBackToConsole
Yes
FreeBSD-5-x86,InstallDir
<%Home%>/<%ShortAppName%>
FreeBSD-5-x86,InstallMode
Standard
FreeBSD-5-x86,InstallType
Typical
FreeBSD-5-x86,ProgramExecutable
{}
FreeBSD-5-x86,ProgramFolderAllUsers
No
FreeBSD-5-x86,ProgramFolderName
<%AppName%>
FreeBSD-5-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
FreeBSD-5-x86,ProgramName
{}
FreeBSD-5-x86,ProgramReadme
<%InstallDir%>/README.txt
FreeBSD-5-x86,PromptForRoot
Yes
FreeBSD-5-x86,RequireRoot
No
FreeBSD-5-x86,RootInstallDir
/usr/local/<%ShortAppName%>
FreeBSD-6-x86,Active
No
FreeBSD-6-x86,BuildSeparateArchives
No
FreeBSD-6-x86,DefaultDirectoryPermission
0755
FreeBSD-6-x86,DefaultFilePermission
0755
FreeBSD-6-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
FreeBSD-6-x86,FallBackToConsole
Yes
FreeBSD-6-x86,InstallDir
<%Home%>/<%ShortAppName%>
FreeBSD-6-x86,InstallMode
Standard
FreeBSD-6-x86,InstallType
Typical
FreeBSD-6-x86,ProgramExecutable
{}
FreeBSD-6-x86,ProgramFolderAllUsers
No
FreeBSD-6-x86,ProgramFolderName
<%AppName%>
FreeBSD-6-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
FreeBSD-6-x86,ProgramName
{}
FreeBSD-6-x86,ProgramReadme
<%InstallDir%>/README.txt
FreeBSD-6-x86,PromptForRoot
Yes
FreeBSD-6-x86,RequireRoot
No
FreeBSD-6-x86,RootInstallDir
/usr/local/<%ShortAppName%>
FreeBSD-7-x86,Active
No
FreeBSD-7-x86,BuildSeparateArchives
No
FreeBSD-7-x86,DefaultDirectoryPermission
0755
FreeBSD-7-x86,DefaultFilePermission
0755
FreeBSD-7-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
FreeBSD-7-x86,FallBackToConsole
Yes
FreeBSD-7-x86,InstallDir
<%Home%>/<%ShortAppName%>
FreeBSD-7-x86,InstallMode
Standard
FreeBSD-7-x86,InstallType
Typical
FreeBSD-7-x86,ProgramExecutable
{}
FreeBSD-7-x86,ProgramFolderAllUsers
No
FreeBSD-7-x86,ProgramFolderName
<%AppName%>
FreeBSD-7-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
FreeBSD-7-x86,ProgramName
{}
FreeBSD-7-x86,ProgramReadme
<%InstallDir%>/README.txt
FreeBSD-7-x86,PromptForRoot
Yes
FreeBSD-7-x86,RequireRoot
No
FreeBSD-7-x86,RootInstallDir
/usr/local/<%ShortAppName%>
FreeBSD-x86,Active FreeBSD-x86,Active
No No
@ -2033,6 +2201,60 @@ Yes
Linux-x86,RootInstallDir Linux-x86,RootInstallDir
/opt/<%ShortAppName%> /opt/<%ShortAppName%>
Linux-x86_64,Active
No
Linux-x86_64,BuildSeparateArchives
No
Linux-x86_64,DefaultDirectoryPermission
0755
Linux-x86_64,DefaultFilePermission
0755
Linux-x86_64,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
Linux-x86_64,FallBackToConsole
Yes
Linux-x86_64,InstallDir
<%Home%>/<%ShortAppName%>
Linux-x86_64,InstallMode
Standard
Linux-x86_64,InstallType
Typical
Linux-x86_64,ProgramExecutable
{}
Linux-x86_64,ProgramFolderAllUsers
No
Linux-x86_64,ProgramFolderName
<%AppName%>
Linux-x86_64,ProgramLicense
<%InstallDir%>/LICENSE.txt
Linux-x86_64,ProgramName
{}
Linux-x86_64,ProgramReadme
<%InstallDir%>/README.txt
Linux-x86_64,PromptForRoot
Yes
Linux-x86_64,RequireRoot
No
Linux-x86_64,RootInstallDir
/usr/local/<%ShortAppName%>
Solaris-sparc,Active Solaris-sparc,Active
No No
@ -2087,6 +2309,60 @@ No
Solaris-sparc,RootInstallDir Solaris-sparc,RootInstallDir
/usr/local/<%ShortAppName%> /usr/local/<%ShortAppName%>
Solaris-x86,Active
No
Solaris-x86,BuildSeparateArchives
No
Solaris-x86,DefaultDirectoryPermission
0755
Solaris-x86,DefaultFilePermission
0755
Solaris-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
Solaris-x86,FallBackToConsole
Yes
Solaris-x86,InstallDir
<%Home%>/<%ShortAppName%>
Solaris-x86,InstallMode
Standard
Solaris-x86,InstallType
Typical
Solaris-x86,ProgramExecutable
{}
Solaris-x86,ProgramFolderAllUsers
No
Solaris-x86,ProgramFolderName
<%AppName%>
Solaris-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
Solaris-x86,ProgramName
{}
Solaris-x86,ProgramReadme
<%InstallDir%>/README.txt
Solaris-x86,PromptForRoot
Yes
Solaris-x86,RequireRoot
No
Solaris-x86,RootInstallDir
/usr/local/<%ShortAppName%>
TarArchive,Active TarArchive,Active
No No

View File

@ -175,6 +175,7 @@ def main(args=sys.argv):
'BeautifulSoup', 'pyreadline', 'BeautifulSoup', 'pyreadline',
'pydoc', 'IPython.Extensions.*', 'pydoc', 'IPython.Extensions.*',
'calibre.web.feeds.recipes.*', 'calibre.web.feeds.recipes.*',
'calibre.gui2.convert.*',
'calibre.ebooks.lrf.fonts.prs500.*', 'calibre.ebooks.lrf.fonts.prs500.*',
'PyQt4.QtWebKit', 'PyQt4.QtNetwork', 'PyQt4.QtWebKit', 'PyQt4.QtNetwork',
], ],

View File

@ -53,7 +53,7 @@ if __name__ == '__main__':
tag_release, upload_demo, build_linux, build_windows, \ tag_release, upload_demo, build_linux, build_windows, \
build_osx, upload_installers, upload_user_manual, \ build_osx, upload_installers, upload_user_manual, \
upload_to_pypi, stage3, stage2, stage1, upload, \ upload_to_pypi, stage3, stage2, stage1, upload, \
upload_rss upload_rss, betas
entry_points['console_scripts'].append( entry_points['console_scripts'].append(
'calibre_postinstall = calibre.linux:post_install') 'calibre_postinstall = calibre.linux:post_install')
@ -76,8 +76,21 @@ if __name__ == '__main__':
print 'WARNING: PoDoFo not found on your system. Various PDF related', print 'WARNING: PoDoFo not found on your system. Various PDF related',
print 'functionality will not work.' print 'functionality will not work.'
fc_inc = '/usr/include/fontconfig' if islinux else \
r'C:\cygwin\home\kovid\fontconfig\include\fontconfig' if iswindows else \
'/Users/kovid/fontconfig/include/fontconfig'
fc_lib = '/usr/lib' if islinux else \
r'C:\cygwin\home\kovid\fontconfig\lib' if iswindows else \
'/Users/kovid/fontconfig/lib'
ext_modules = optional + [ ext_modules = optional + [
Extension('calibre.plugins.fontconfig',
sources = ['src/calibre/utils/fonts/fontconfig.c'],
include_dirs = [os.environ.get('FC_INC_DIR', fc_inc)],
libraries=['fontconfig'],
library_dirs=[os.environ.get('FC_LIB_DIR', fc_lib)]),
Extension('calibre.plugins.lzx', Extension('calibre.plugins.lzx',
sources=['src/calibre/utils/lzx/lzxmodule.c', sources=['src/calibre/utils/lzx/lzxmodule.c',
'src/calibre/utils/lzx/compressor.c', 'src/calibre/utils/lzx/compressor.c',
@ -199,6 +212,7 @@ if __name__ == '__main__':
'stage2' : stage2, 'stage2' : stage2,
'stage1' : stage1, 'stage1' : stage1,
'publish' : upload, 'publish' : upload,
'betas' : betas,
}, },
) )

View File

@ -284,39 +284,7 @@ def launch(path_or_url):
path_or_url = 'file:'+path_or_url path_or_url = 'file:'+path_or_url
QDesktopServices.openUrl(QUrl(path_or_url)) QDesktopServices.openUrl(QUrl(path_or_url))
def relpath(target, base=os.curdir): relpath = os.path.relpath
"""
Return a relative path to the target from either the current dir or an optional base dir.
Base can be a directory specified either as absolute or relative to current dir.
"""
#if not os.path.exists(target):
# raise OSError, 'Target does not exist: '+target
if target == base:
raise ValueError('target and base are both: %s'%target)
if not os.path.isdir(base):
raise OSError, 'Base is not a directory or does not exist: '+base
base_list = (os.path.abspath(base)).split(os.sep)
target_list = (os.path.abspath(target)).split(os.sep)
# On the windows platform the target may be on a completely different drive from the base.
if iswindows and base_list[0].upper() != target_list[0].upper():
raise OSError, 'Target is on a different drive to base. Target: '+repr(target)+', base: '+repr(base)
# Starting from the filepath root, work out how much of the filepath is
# shared by base and target.
for i in range(min(len(base_list), len(target_list))):
if base_list[i] != target_list[i]: break
else:
# If we broke out of the loop, i is pointing to the first differing path elements.
# If we didn't break out of the loop, i is pointing to identical path elements.
# Increment i so that in all cases it points to the first differing path elements.
i+=1
rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:]
return os.path.join(*rel_list)
_spat = re.compile(r'^the\s+|^a\s+|^an\s+', re.IGNORECASE) _spat = re.compile(r'^the\s+|^a\s+|^an\s+', re.IGNORECASE)
def english_sort(x, y): def english_sort(x, y):
''' '''

View File

@ -59,7 +59,8 @@ if plugins is None:
plugin_path = getattr(pkg_resources, 'resource_filename')('calibre', 'plugins') plugin_path = getattr(pkg_resources, 'resource_filename')('calibre', 'plugins')
sys.path.insert(0, plugin_path) sys.path.insert(0, plugin_path)
for plugin in ['pictureflow', 'lzx', 'msdes', 'podofo', 'cPalmdoc'] + \ for plugin in ['pictureflow', 'lzx', 'msdes', 'podofo', 'cPalmdoc',
'fontconfig'] + \
(['winutil'] if iswindows else []) + \ (['winutil'] if iswindows else []) + \
(['usbobserver'] if isosx else []): (['usbobserver'] if isosx else []):
try: try:

View File

@ -235,7 +235,22 @@ class KindleOutput(OutputProfile):
def tags_to_string(cls, tags): def tags_to_string(cls, tags):
return 'ttt '.join(tags)+'ttt ' return 'ttt '.join(tags)+'ttt '
class KindleDXOutput(OutputProfile):
name = 'Kindle DX'
short_name = 'kindle_dx'
description = _('This profile is intended for the Amazon Kindle DX.')
# Screen size is a best guess
screen_size = (1200, 824)
dpi = 150.0
comic_screen_size = (1180, 800)
@classmethod
def tags_to_string(cls, tags):
return 'ttt '.join(tags)+'ttt '
output_profiles = [OutputProfile, SonyReaderOutput, MSReaderOutput, output_profiles = [OutputProfile, SonyReaderOutput, MSReaderOutput,
MobipocketOutput, HanlinV3Output, CybookG3Output, KindleOutput, MobipocketOutput, HanlinV3Output, CybookG3Output, KindleOutput,
SonyReaderLandscapeOutput] SonyReaderLandscapeOutput, KindleDXOutput]

View File

@ -85,7 +85,7 @@ class USBMS(CLI, Device):
elif on_card == 'cardb' and not self._card_b_prefix: elif on_card == 'cardb' and not self._card_b_prefix:
raise ValueError(_('The reader has no storage card in this slot.')) raise ValueError(_('The reader has no storage card in this slot.'))
elif on_card and on_card not in ('carda', 'cardb'): elif on_card and on_card not in ('carda', 'cardb'):
raise DeviceError(_('Selected slot: %s is not supported.' % on_card)) raise DeviceError(_('Selected slot: %s is not supported.') % on_card)
if on_card == 'carda': if on_card == 'carda':
path = os.path.join(self._card_a_prefix, self.EBOOK_DIR_CARD_A) path = os.path.join(self._card_a_prefix, self.EBOOK_DIR_CARD_A)

View File

@ -7,6 +7,15 @@ __docformat__ = 'restructuredtext en'
Command line interface to conversion sub-system Command line interface to conversion sub-system
''' '''
import sys, os
from optparse import OptionGroup, Option
from calibre.utils.config import OptionParser
from calibre.utils.logging import Log
from calibre.constants import preferred_encoding
from calibre.customize.conversion import OptionRecommendation
USAGE = '%prog ' + _('''\ USAGE = '%prog ' + _('''\
input_file output_file [options] input_file output_file [options]
@ -33,14 +42,6 @@ option.
For full documentation of the conversion system see For full documentation of the conversion system see
''') + 'http://calibre.kovidgoyal.net/user_manual/conversion.html' ''') + 'http://calibre.kovidgoyal.net/user_manual/conversion.html'
import sys, os
from optparse import OptionGroup, Option
from calibre.utils.config import OptionParser
from calibre.utils.logging import Log
from calibre.constants import preferred_encoding
from calibre.customize.conversion import OptionRecommendation
def print_help(parser, log): def print_help(parser, log):
help = parser.format_help().encode(preferred_encoding, 'replace') help = parser.format_help().encode(preferred_encoding, 'replace')
log(help) log(help)

View File

@ -3,7 +3,7 @@ __license__ = 'GPL 3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import os, re import os, re, sys
from calibre.customize.conversion import OptionRecommendation, DummyReporter from calibre.customize.conversion import OptionRecommendation, DummyReporter
from calibre.customize.ui import input_profiles, output_profiles, \ from calibre.customize.ui import input_profiles, output_profiles, \
@ -551,6 +551,13 @@ OptionRecommendation(name='list_recipes',
self.read_user_metadata() self.read_user_metadata()
def flush(self):
try:
sys.stdout.flush()
sys.stderr.flush()
except:
pass
def run(self): def run(self):
''' '''
Run the conversion pipeline Run the conversion pipeline
@ -566,11 +573,13 @@ OptionRecommendation(name='list_recipes',
self.log('\t'+title) self.log('\t'+title)
self.log('%d recipes available'%len(titles)) self.log('%d recipes available'%len(titles))
raise SystemExit(0) raise SystemExit(0)
self.flush()
# Run any preprocess plugins # Run any preprocess plugins
from calibre.customize.ui import run_plugins_on_preprocess from calibre.customize.ui import run_plugins_on_preprocess
self.input = run_plugins_on_preprocess(self.input) self.input = run_plugins_on_preprocess(self.input)
self.flush()
# Create an OEBBook from the input file. The input plugin does all the # Create an OEBBook from the input file. The input plugin does all the
# heavy lifting. # heavy lifting.
accelerators = {} accelerators = {}
@ -595,11 +604,13 @@ OptionRecommendation(name='list_recipes',
self.oeb = create_oebbook(self.log, self.oeb, self.opts, self.oeb = create_oebbook(self.log, self.oeb, self.opts,
self.input_plugin) self.input_plugin)
pr = CompositeProgressReporter(0.34, 0.67, self.ui_reporter) pr = CompositeProgressReporter(0.34, 0.67, self.ui_reporter)
self.flush()
pr(0., _('Running transforms on ebook...')) pr(0., _('Running transforms on ebook...'))
from calibre.ebooks.oeb.transforms.guide import Clean from calibre.ebooks.oeb.transforms.guide import Clean
Clean()(self.oeb, self.opts) Clean()(self.oeb, self.opts)
pr(0.1) pr(0.1)
self.flush()
self.opts.source = self.opts.input_profile self.opts.source = self.opts.input_profile
self.opts.dest = self.opts.output_profile self.opts.dest = self.opts.output_profile
@ -608,10 +619,12 @@ OptionRecommendation(name='list_recipes',
MergeMetadata()(self.oeb, self.user_metadata, MergeMetadata()(self.oeb, self.user_metadata,
self.opts.prefer_metadata_cover) self.opts.prefer_metadata_cover)
pr(0.2) pr(0.2)
self.flush()
from calibre.ebooks.oeb.transforms.structure import DetectStructure from calibre.ebooks.oeb.transforms.structure import DetectStructure
DetectStructure()(self.oeb, self.opts) DetectStructure()(self.oeb, self.opts)
pr(0.35) pr(0.35)
self.flush()
from calibre.ebooks.oeb.transforms.flatcss import CSSFlattener from calibre.ebooks.oeb.transforms.flatcss import CSSFlattener
fbase = self.opts.base_font_size fbase = self.opts.base_font_size
@ -626,6 +639,7 @@ OptionRecommendation(name='list_recipes',
from calibre.ebooks.oeb.transforms.jacket import Jacket from calibre.ebooks.oeb.transforms.jacket import Jacket
Jacket()(self.oeb, self.opts, self.user_metadata) Jacket()(self.oeb, self.opts, self.user_metadata)
pr(0.4) pr(0.4)
self.flush()
if self.opts.extra_css and os.path.exists(self.opts.extra_css): if self.opts.extra_css and os.path.exists(self.opts.extra_css):
self.opts.extra_css = open(self.opts.extra_css, 'rb').read() self.opts.extra_css = open(self.opts.extra_css, 'rb').read()
@ -651,6 +665,7 @@ OptionRecommendation(name='list_recipes',
from calibre.ebooks.oeb.transforms.linearize_tables import LinearizeTables from calibre.ebooks.oeb.transforms.linearize_tables import LinearizeTables
LinearizeTables()(self.oeb, self.opts) LinearizeTables()(self.oeb, self.opts)
pr(0.9) pr(0.9)
self.flush()
from calibre.ebooks.oeb.transforms.trimmanifest import ManifestTrimmer from calibre.ebooks.oeb.transforms.trimmanifest import ManifestTrimmer
@ -660,6 +675,7 @@ OptionRecommendation(name='list_recipes',
self.oeb.toc.rationalize_play_orders() self.oeb.toc.rationalize_play_orders()
pr(1.) pr(1.)
self.flush()
self.log.info('Creating %s...'%self.output_plugin.name) self.log.info('Creating %s...'%self.output_plugin.name)
our = CompositeProgressReporter(0.67, 1., self.ui_reporter) our = CompositeProgressReporter(0.67, 1., self.ui_reporter)
@ -669,6 +685,7 @@ OptionRecommendation(name='list_recipes',
self.opts, self.log) self.opts, self.log)
self.ui_reporter(1.) self.ui_reporter(1.)
self.log(self.output_fmt.upper(), 'output written to', self.output) self.log(self.output_fmt.upper(), 'output written to', self.output)
self.flush()
def create_oebbook(log, path_or_stream, opts, input_plugin, reader=None, def create_oebbook(log, path_or_stream, opts, input_plugin, reader=None,
encoding='utf-8'): encoding='utf-8'):

View File

@ -35,7 +35,8 @@ class PRS500_PROFILE(object):
name = 'prs500' name = 'prs500'
def find_custom_fonts(options, logger): def find_custom_fonts(options, logger):
from calibre.utils.fontconfig import files_for_family from calibre.utils.fonts import fontconfig
files_for_family = fontconfig.files_for_family
fonts = {'serif' : None, 'sans' : None, 'mono' : None} fonts = {'serif' : None, 'sans' : None, 'mono' : None}
def family(cmd): def family(cmd):
return cmd.split(',')[-1].strip() return cmd.split(',')[-1].strip()

View File

@ -15,7 +15,6 @@ from lxml import etree
from dateutil import parser from dateutil import parser
from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.chardet import xml_to_unicode
from calibre import relpath
from calibre.constants import __appname__, __version__ from calibre.constants import __appname__, __version__
from calibre.ebooks.metadata.toc import TOC from calibre.ebooks.metadata.toc import TOC
from calibre.ebooks.metadata import MetaInformation, string_to_authors from calibre.ebooks.metadata import MetaInformation, string_to_authors
@ -86,8 +85,8 @@ class Resource(object):
if self.path == basedir: if self.path == basedir:
return ''+frag return ''+frag
try: try:
rpath = relpath(self.path, basedir) rpath = os.path.relpath(self.path, basedir)
except OSError: # On windows path and basedir could be on different drives except ValueError: # On windows path and basedir could be on different drives
rpath = self.path rpath = self.path
if isinstance(rpath, unicode): if isinstance(rpath, unicode):
rpath = rpath.encode('utf-8') rpath = rpath.encode('utf-8')
@ -560,7 +559,7 @@ class OPF(object):
has_path = True has_path = True
break break
if not has_path: if not has_path:
href = relpath(path, self.base_dir).replace(os.sep, '/') href = os.path.relpath(path, self.base_dir).replace(os.sep, '/')
item = self.create_manifest_item(href, media_type) item = self.create_manifest_item(href, media_type)
manifest = self.manifest_ppath(self.root)[0] manifest = self.manifest_ppath(self.root)[0]
manifest.append(item) manifest.append(item)

View File

@ -53,8 +53,9 @@ class Progress(object):
class ReadMetadata(Thread): class ReadMetadata(Thread):
def __init__(self, tasks, result_queue): def __init__(self, tasks, result_queue, spare_server=None):
self.tasks, self.result_queue = tasks, result_queue self.tasks, self.result_queue = tasks, result_queue
self.spare_server = spare_server
self.canceled = False self.canceled = False
Thread.__init__(self) Thread.__init__(self)
self.daemon = True self.daemon = True
@ -67,7 +68,7 @@ class ReadMetadata(Thread):
for b in t: for b in t:
ids.add(b[0]) ids.add(b[0])
progress = Progress(self.result_queue, self.tdir) progress = Progress(self.result_queue, self.tdir)
server = Server() server = Server() if self.spare_server is None else self.spare_server
for i, task in enumerate(self.tasks): for i, task in enumerate(self.tasks):
job = ParallelJob('read_metadata', job = ParallelJob('read_metadata',
'Read metadata (%d of %d)'%(i, len(self.tasks)), 'Read metadata (%d of %d)'%(i, len(self.tasks)),
@ -110,20 +111,20 @@ class ReadMetadata(Thread):
os.remove(job.log_path) os.remove(job.log_path)
def read_metadata(paths, result_queue, chunk=50): def read_metadata(paths, result_queue, chunk=50, spare_server=None):
tasks = [] tasks = []
pos = 0 pos = 0
while pos < len(paths): while pos < len(paths):
tasks.append(paths[pos:pos+chunk]) tasks.append(paths[pos:pos+chunk])
pos += chunk pos += chunk
t = ReadMetadata(tasks, result_queue) t = ReadMetadata(tasks, result_queue, spare_server=spare_server)
t.start() t.start()
return t return t
class SaveWorker(Thread): class SaveWorker(Thread):
def __init__(self, result_queue, db, ids, path, by_author=False, def __init__(self, result_queue, db, ids, path, by_author=False,
single_dir=False, single_format=None): single_dir=False, single_format=None, spare_server=None):
Thread.__init__(self) Thread.__init__(self)
self.daemon = True self.daemon = True
self.path, self.by_author = path, by_author self.path, self.by_author = path, by_author
@ -133,10 +134,11 @@ class SaveWorker(Thread):
self.canceled = False self.canceled = False
self.result_queue = result_queue self.result_queue = result_queue
self.error = None self.error = None
self.spare_server = spare_server
self.start() self.start()
def run(self): def run(self):
server = Server() server = Server() if self.spare_server is None else self.spare_server
ids = set(self.ids) ids = set(self.ids)
tasks = server.split(list(ids)) tasks = server.split(list(ids))
jobs = set([]) jobs = set([])

View File

@ -29,6 +29,8 @@ from calibre.ebooks.oeb.base import prefixname
from calibre.ebooks.oeb.base import urlnormalize from calibre.ebooks.oeb.base import urlnormalize
from calibre.ebooks.compression.palmdoc import compress_doc from calibre.ebooks.compression.palmdoc import compress_doc
INDEXING = True
# TODO: # TODO:
# - Optionally rasterize tables # - Optionally rasterize tables
@ -65,7 +67,9 @@ TAGX = {
'subchapter' : 'subchapter' :
'\x00\x00\x00\x01\x01\x01\x01\x00\x02\x01\x02\x00\x03\x01\x04\x00\x04\x01\x08\x00\x05\x01\x10\x00\x15\x01\x10\x00\x16\x01\x20\x00\x17\x01\x40\x00\x00\x00\x00\x01', '\x00\x00\x00\x01\x01\x01\x01\x00\x02\x01\x02\x00\x03\x01\x04\x00\x04\x01\x08\x00\x05\x01\x10\x00\x15\x01\x10\x00\x16\x01\x20\x00\x17\x01\x40\x00\x00\x00\x00\x01',
'periodical' : 'periodical' :
'\x00\x00\x00\x02\x01\x01\x01\x00\x02\x01\x02\x00\x03\x01\x04\x00\x04\x01\x08\x00\x05\x01\x10\x00\x15\x01\x20\x00\x16\x01\x40\x00\x17\x01\x80\x00\x00\x00\x00\x01\x45\x01\x01\x00\x46\x01\x02\x00\x47\x01\x04\x00\x00\x00\x00\x01' '\x00\x00\x00\x02\x01\x01\x01\x00\x02\x01\x02\x00\x03\x01\x04\x00\x04\x01\x08\x00\x05\x01\x10\x00\x15\x01\x20\x00\x16\x01\x40\x00\x17\x01\x80\x00\x00\x00\x00\x01\x45\x01\x01\x00\x46\x01\x02\x00\x47\x01\x04\x00\x00\x00\x00\x01',
'secondary_book':'\x00\x00\x00\x01\x01\x01\x01\x00\x00\x00\x00\x01',
'secondary_periodical':'\x00\x00\x00\x01\x01\x01\x01\x00\x0b\x03\x02\x00\x00\x00\x00\x01'
} }
INDXT = { INDXT = {
@ -99,8 +103,7 @@ def decint(value, direction):
def align_block(raw, multiple=4, pad='\0'): def align_block(raw, multiple=4, pad='\0'):
l = len(raw) extra = len(raw) % multiple
extra = l % multiple
if extra == 0: return raw if extra == 0: return raw
return raw + pad*(multiple - extra) return raw + pad*(multiple - extra)
@ -355,8 +358,11 @@ class MobiWriter(object):
def _generate_content(self): def _generate_content(self):
self._map_image_names() self._map_image_names()
self._generate_text() self._generate_text()
if not self.opts.no_mobi_index: if INDEXING and not self.opts.no_mobi_index:
try:
self._generate_index() self._generate_index()
except:
self._oeb.log.exception('Failed to generate index')
self._generate_images() self._generate_images()
def _map_image_names(self): def _map_image_names(self):
@ -406,6 +412,7 @@ class MobiWriter(object):
self._content_length = len(text) self._content_length = len(text)
self._text_length = len(text) self._text_length = len(text)
text = StringIO(text) text = StringIO(text)
buf = []
nrecords = 0 nrecords = 0
offset = 0 offset = 0
if self._compression != UNCOMPRESSED: if self._compression != UNCOMPRESSED:
@ -435,9 +442,16 @@ class MobiWriter(object):
lsize += 1 lsize += 1
record.write(size) record.write(size)
self._records.append(record.getvalue()) self._records.append(record.getvalue())
buf.append(self._records[-1])
nrecords += 1 nrecords += 1
offset += RECORD_SIZE offset += RECORD_SIZE
data, overlap = self._read_text_record(text) data, overlap = self._read_text_record(text)
if INDEXING:
extra = sum(map(len, buf))%4
if extra == 0:
extra = 4
self._records.append('\0'*(4-extra))
nrecords += 1
self._text_nrecords = nrecords self._text_nrecords = nrecords
def _generate_indxt(self, ctoc): def _generate_indxt(self, ctoc):
@ -448,7 +462,7 @@ class MobiWriter(object):
indices.write('IDXT') indices.write('IDXT')
c = 0 c = 0
last_index = last_name = None last_name = None
def add_node(node, offset, length, count): def add_node(node, offset, length, count):
if self.opts.verbose > 2: if self.opts.verbose > 2:
@ -487,21 +501,23 @@ class MobiWriter(object):
length = self._content_length - offset length = self._content_length - offset
add_node(child, offset, length, c) add_node(child, offset, length, c)
last_index = c
ctoc_offset = self._ctoc_map[child] ctoc_offset = self._ctoc_map[child]
last_name = "%4d"%c last_name = "%4d"%c
c += 1 c += 1
return align_block(indxt.getvalue()), c, \ return align_block(indxt.getvalue()), c, \
align_block(indices.getvalue()), last_index, last_name align_block(indices.getvalue()), last_name
def _generate_index(self): def _generate_index(self):
self._oeb.log('Generating index...') self._oeb.log('Generating index...')
self._primary_index_record = None self._primary_index_record = None
ctoc = self._generate_ctoc() ctoc = self._generate_ctoc()
indxt, indxt_count, indices, last_index, last_name = \ indxt, indxt_count, indices, last_name = \
self._generate_indxt(ctoc) self._generate_indxt(ctoc)
if last_name is None:
self._oeb.log.warn('Input document has no TOC. No index generated.')
return
indx1 = StringIO() indx1 = StringIO()
indx1.write('INDX'+pack('>I', 0xc0)) # header length indx1.write('INDX'+pack('>I', 0xc0)) # header length
@ -529,7 +545,7 @@ class MobiWriter(object):
indx1.write(indices) indx1.write(indices)
indx1 = indx1.getvalue() indx1 = indx1.getvalue()
idxt0 = chr(len(last_name)) + last_name + pack('>H', last_index) idxt0 = chr(len(last_name)) + last_name + pack('>H', indxt_count)
idxt0 = align_block(idxt0) idxt0 = align_block(idxt0)
indx0 = StringIO() indx0 = StringIO()
@ -597,16 +613,61 @@ class MobiWriter(object):
indx0 = indx0.getvalue() indx0 = indx0.getvalue()
self._primary_index_record = len(self._records) self._primary_index_record = len(self._records)
self._records.extend([indx0, indx1, ctoc])
# Write secondary index records
tagx = TAGX['secondary_'+\
('periodical' if self.opts.mobi_periodical else 'book')]
tagx_len = 8 + len(tagx)
indx0 = StringIO()
indx0.write('INDX'+pack('>I', 0xc0)+'\0'*8)
indx0.write(pack('>I', 0x02))
indx0.write(pack('>I', 0xc0+tagx_len+4))
indx0.write(pack('>I', 1))
indx0.write(pack('>I', 65001))
indx0.write('\xff'*4)
indx0.write(pack('>I', 1))
indx0.write('\0'*4)
indx0.write('\0'*136)
indx0.write(pack('>I', 0xc0))
indx0.write('\0'*8)
indx0.write('TAGX'+pack('>I', tagx_len)+tagx)
if self.opts.mobi_periodical:
raise NotImplementedError
else:
indx0.write('\0'*3 + '\x01' + 'IDXT' + '\0\xd4\0\0')
indx1 = StringIO()
indx1.write('INDX' + pack('>I', 0xc0) + '\0'*4)
indx1.write(pack('>I', 1))
extra = 0xf0 if self.opts.mobi_periodical else 4
indx1.write('\0'*4 + pack('>I', 0xc0+extra))
num = 4 if self.opts.mobi_periodical else 1
indx1.write(pack('>I', num))
indx1.write('\xff'*8)
indx1.write('\0'*(0xc0-indx1.tell()))
if self.opts.mobi_periodical:
raise NotImplementedError
else:
indx1.write('\0\x01\x80\0')
indx1.write('IDXT')
if self.opts.mobi_periodical:
raise NotImplementedError
else:
indx1.write('\0\xc0\0\0')
indx0, indx1 = indx0.getvalue(), indx1.getvalue()
self._records.extend((indx0, indx1))
if self.opts.verbose > 3: if self.opts.verbose > 3:
from tempfile import mkdtemp from tempfile import mkdtemp
import os import os
t = mkdtemp() t = mkdtemp()
open(os.path.join(t, 'indx0.bin'), 'wb').write(indx0) for i, n in enumerate(['sindx1', 'sindx0', 'ctoc', 'indx0', 'indx1']):
open(os.path.join(t, 'indx1.bin'), 'wb').write(indx1) open(os.path.join(t, n+'.bin'), 'wb').write(self._records[-(i+1)])
open(os.path.join(t, 'ctoc.bin'), 'wb').write(ctoc)
self._oeb.log.debug('Index records dumped to', t) self._oeb.log.debug('Index records dumped to', t)
self._records.extend([indx0, indx1, ctoc])
def _generate_ctoc(self): def _generate_ctoc(self):
if self.opts.mobi_periodical: if self.opts.mobi_periodical:
@ -617,8 +678,8 @@ class MobiWriter(object):
self._last_toc_entry = None self._last_toc_entry = None
ctoc = StringIO() ctoc = StringIO()
def add_node(node, cls): def add_node(node, cls, title=None):
t = node.title t = node.title if title is None else title
if t and t.strip(): if t and t.strip():
t = t.strip() t = t.strip()
if not isinstance(t, unicode): if not isinstance(t, unicode):
@ -629,8 +690,10 @@ class MobiWriter(object):
self._ctoc_name_map[node] = t self._ctoc_name_map[node] = t
ctoc.write(decint(len(t), DECINT_FORWARD)+t) ctoc.write(decint(len(t), DECINT_FORWARD)+t)
first = True
for child in toc.iter(): for child in toc.iter():
add_node(child, 'chapter') add_node(child, 'chapter')#, title='Title Page' if first else None)
first = False
return align_block(ctoc.getvalue()) return align_block(ctoc.getvalue())
@ -666,12 +729,13 @@ class MobiWriter(object):
metadata = self._oeb.metadata metadata = self._oeb.metadata
exth = self._build_exth() exth = self._build_exth()
last_content_record = len(self._records) - 1 last_content_record = len(self._records) - 1
if INDEXING:
self._generate_end_records() self._generate_end_records()
record0 = StringIO() record0 = StringIO()
# The PalmDOC Header # The PalmDOC Header
record0.write(pack('>HHIHHHH', self._compression, 0, record0.write(pack('>HHIHHHH', self._compression, 0,
self._text_length, self._text_length,
self._text_nrecords, RECORD_SIZE, 0, 0)) # 0 - 15 (0x0 - 0xf) self._text_nrecords-1, RECORD_SIZE, 0, 0)) # 0 - 15 (0x0 - 0xf)
uid = random.randint(0, 0xffffffff) uid = random.randint(0, 0xffffffff)
title = str(metadata.title[0]) title = str(metadata.title[0])
# The MOBI Header # The MOBI Header
@ -697,8 +761,8 @@ class MobiWriter(object):
record0.write('\xff' * 8) record0.write('\xff' * 8)
# 0x20 - 0x23 : Secondary index record # 0x20 - 0x23 : Secondary index record
# TODO: implement record0.write(pack('>I', 0xffffffff if self._primary_index_record is
record0.write('\xff' * 4) None else self._primary_index_record+3))
# 0x24 - 0x3f : Unknown # 0x24 - 0x3f : Unknown
record0.write('\xff' * 28) record0.write('\xff' * 28)
@ -827,6 +891,11 @@ class MobiWriter(object):
if index is not None: if index is not None:
exth.write(pack('>III', 0xca, 0x0c, index - 1)) exth.write(pack('>III', 0xca, 0x0c, index - 1))
nrecs += 1 nrecs += 1
if INDEXING:
# Write unknown EXTH records as 0s
for code, size in [(204,4), (205,4), (206,4), (207,4), (300,40)]:
exth.write(pack('>II', code, 8+size)+'\0'*size)
nrecs += 1
exth = exth.getvalue() exth = exth.getvalue()
trail = len(exth) % 4 trail = len(exth) % 4
pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte
@ -849,7 +918,7 @@ class MobiWriter(object):
def _write_header(self): def _write_header(self):
title = str(self._oeb.metadata.title[0]) title = str(self._oeb.metadata.title[0])
title = re.sub('[^-A-Za-z0-9]+', '_', title)[:32] title = re.sub('[^-A-Za-z0-9]+', '_', title)[:31]
title = title + ('\0' * (32 - len(title))) title = title + ('\0' * (32 - len(title)))
now = int(time.time()) now = int(time.time())
nrecords = len(self._records) nrecords = len(self._records)
@ -866,4 +935,3 @@ class MobiWriter(object):
self._write(record) self._write(record)

View File

@ -11,7 +11,12 @@ __docformat__ = 'restructuredtext en'
import struct import struct
import zlib import zlib
try:
from PIL import Image
Image
except ImportError:
import Image import Image
import cStringIO import cStringIO
from calibre.ebooks.pdb.formatwriter import FormatWriter from calibre.ebooks.pdb.formatwriter import FormatWriter

View File

@ -6,7 +6,12 @@ __docformat__ = 'restructuredtext en'
import os import os
try:
from PIL import Image
Image
except ImportError:
import Image import Image
import cStringIO import cStringIO
from calibre.customize.conversion import OutputFormatPlugin from calibre.customize.conversion import OutputFormatPlugin

View File

@ -1,4 +1,3 @@
import os.path
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
__license__ = 'GPL 3' __license__ = 'GPL 3'
@ -9,7 +8,12 @@ import os
import struct import struct
import zlib import zlib
try:
from PIL import Image
Image
except ImportError:
import Image import Image
import cStringIO import cStringIO
from calibre.ebooks.rb.rbml import RBMLizer from calibre.ebooks.rb.rbml import RBMLizer

View File

@ -11,7 +11,12 @@ Transform OEB content into RTF markup
import os import os
import re import re
try:
from PIL import Image
Image
except ImportError:
import Image import Image
import cStringIO import cStringIO
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, \ from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, \

View File

@ -23,7 +23,11 @@ class TXTInput(InputFormatPlugin):
ienc = options.input_encoding ienc = options.input_encoding
txt = stream.read().decode(ienc) txt = stream.read().decode(ienc)
try:
html = txt_to_markdown(txt) html = txt_to_markdown(txt)
except RuntimeError:
raise ValueError('This txt file has malformed markup, it cannot be'
'converted by calibre. See http://daringfireball.net/projects/markdown/syntax')
with open('index.html', 'wb') as index: with open('index.html', 'wb') as index:
index.write(html.encode('utf-8')) index.write(html.encode('utf-8'))

View File

@ -39,9 +39,10 @@ class RecursiveFind(QThread):
class Adder(QObject): class Adder(QObject):
def __init__(self, parent, db, callback): def __init__(self, parent, db, callback, spare_server=None):
QObject.__init__(self, parent) QObject.__init__(self, parent)
self.pd = ProgressDialog(_('Adding...'), parent=parent) self.pd = ProgressDialog(_('Adding...'), parent=parent)
self.spare_server = spare_server
self.db = db self.db = db
self.pd.setModal(True) self.pd.setModal(True)
self.pd.show() self.pd.show()
@ -79,7 +80,8 @@ class Adder(QObject):
tasks.append((i, b)) tasks.append((i, b))
self.ids[i] = b self.ids[i] = b
self.nmap[i] = os.path.basename(b[0]) self.nmap[i] = os.path.basename(b[0])
self.worker = read_metadata(tasks, self.rq) self.worker = read_metadata(tasks, self.rq,
spare_server=self.spare_server)
self.pd.set_min(0) self.pd.set_min(0)
self.pd.set_max(len(self.ids)) self.pd.set_max(len(self.ids))
self.pd.value = 0 self.pd.value = 0
@ -165,9 +167,11 @@ class Adder(QObject):
class Saver(QObject): class Saver(QObject):
def __init__(self, parent, db, callback, rows, path, def __init__(self, parent, db, callback, rows, path,
by_author=False, single_dir=False, single_format=None): by_author=False, single_dir=False, single_format=None,
spare_server=None):
QObject.__init__(self, parent) QObject.__init__(self, parent)
self.pd = ProgressDialog(_('Saving...'), parent=parent) self.pd = ProgressDialog(_('Saving...'), parent=parent)
self.spare_server = spare_server
self.db = db self.db = db
self.pd.setModal(True) self.pd.setModal(True)
self.pd.show() self.pd.show()
@ -183,7 +187,7 @@ class Saver(QObject):
from calibre.ebooks.metadata.worker import SaveWorker from calibre.ebooks.metadata.worker import SaveWorker
self.worker = SaveWorker(self.rq, db, self.ids, path, by_author, self.worker = SaveWorker(self.rq, db, self.ids, path, by_author,
single_dir, single_format) single_dir, single_format, spare_server=self.spare_server)
self.connect(self.pd, SIGNAL('canceled()'), self.canceled) self.connect(self.pd, SIGNAL('canceled()'), self.canceled)
self.timer = QTimer(self) self.timer = QTimer(self)
self.connect(self.timer, SIGNAL('timeout()'), self.update) self.connect(self.timer, SIGNAL('timeout()'), self.update)

View File

@ -13,6 +13,7 @@ from calibre.gui2.convert import Widget
class PluginWidget(Widget, Ui_Form): class PluginWidget(Widget, Ui_Form):
TITLE = _('Comic Input') TITLE = _('Comic Input')
HELP = _('Options specific to')+' comic '+_('input')
def __init__(self, parent, get_option, get_help, db=None, book_id=None): def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'comic_input', Widget.__init__(self, parent, 'comic_input',

View File

@ -13,6 +13,7 @@ from calibre.gui2.convert import Widget
class PluginWidget(Widget, Ui_Form): class PluginWidget(Widget, Ui_Form):
TITLE = _('EPUB Output') TITLE = _('EPUB Output')
HELP = _('Options specific to')+' EPUB '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None): def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'epub_output', Widget.__init__(self, parent, 'epub_output',

View File

@ -16,6 +16,7 @@ font_family_model = None
class PluginWidget(Widget, Ui_Form): class PluginWidget(Widget, Ui_Form):
TITLE = _('LRF Output') TITLE = _('LRF Output')
HELP = _('Options specific to')+' LRF '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None): def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'lrf_output', Widget.__init__(self, parent, 'lrf_output',

View File

@ -13,6 +13,8 @@ from calibre.gui2.convert import Widget
class PluginWidget(Widget, Ui_Form): class PluginWidget(Widget, Ui_Form):
TITLE = _('MOBI Output') TITLE = _('MOBI Output')
HELP = _('Options specific to')+' MOBI '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None): def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'mobi_output', Widget.__init__(self, parent, 'mobi_output',

View File

@ -49,6 +49,12 @@ class PageSetupWidget(Widget, Ui_Form):
x.setMouseTracking(True) x.setMouseTracking(True)
self.connect(x, SIGNAL('entered(QModelIndex)'), self.show_desc) self.connect(x, SIGNAL('entered(QModelIndex)'), self.show_desc)
self.initialize_options(get_option, get_help, db, book_id) self.initialize_options(get_option, get_help, db, book_id)
it = unicode(self.opt_input_profile.toolTip())
self.opt_input_profile.setToolTip('<p>'+it.replace('t.','t.\n<br>'))
it = unicode(self.opt_output_profile.toolTip())
self.opt_output_profile.setToolTip('<p>'+it.replace('t.','ce.\n<br>'))
def show_desc(self, index): def show_desc(self, index):
desc = index.model().data(index, Qt.StatusTipRole).toString() desc = index.model().data(index, Qt.StatusTipRole).toString()

View File

@ -14,6 +14,7 @@ format_model = None
class PluginWidget(Widget, Ui_Form): class PluginWidget(Widget, Ui_Form):
TITLE = _('PDB Output') TITLE = _('PDB Output')
HELP = _('Options specific to')+' PDB '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None): def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'pdb_output', ['format']) Widget.__init__(self, parent, 'pdb_output', ['format'])

View File

@ -15,6 +15,7 @@ orientation_model = None
class PluginWidget(Widget, Ui_Form): class PluginWidget(Widget, Ui_Form):
TITLE = _('PDF Output') TITLE = _('PDF Output')
HELP = _('Options specific to')+' PDF '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None): def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'pdf_output', ['paper_size', 'orientation']) Widget.__init__(self, parent, 'pdf_output', ['paper_size', 'orientation'])

View File

@ -14,6 +14,7 @@ newline_model = None
class PluginWidget(Widget, Ui_Form): class PluginWidget(Widget, Ui_Form):
TITLE = _('TXT Output') TITLE = _('TXT Output')
HELP = _('Options specific to')+' TXT '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None): def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'txt_output', ['newline']) Widget.__init__(self, parent, 'txt_output', ['newline'])

View File

@ -38,7 +38,7 @@ class Wizard(QDialog):
def __init__(self, parent=None): def __init__(self, parent=None):
QDialog.__init__(self, parent) QDialog.__init__(self, parent)
self.resize(400, 300) self.resize(440, 480)
self.verticalLayout = QVBoxLayout(self) self.verticalLayout = QVBoxLayout(self)
self.widget = WizardWidget(self) self.widget = WizardWidget(self)
self.verticalLayout.addWidget(self.widget) self.verticalLayout.addWidget(self.widget)

View File

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>Form</class> <class>Form</class>
<widget class="QWidget" name="Form"> <widget class="QWidget" name="Form">
@ -12,8 +13,8 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout" > <layout class="QVBoxLayout" name="verticalLayout">
<item row="0" column="0" colspan="2" > <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Match HTML &amp;tags with tag name:</string> <string>Match HTML &amp;tags with tag name:</string>
@ -23,7 +24,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0" > <item>
<widget class="QComboBox" name="tag"> <widget class="QComboBox" name="tag">
<property name="editable"> <property name="editable">
<bool>true</bool> <bool>true</bool>
@ -90,7 +91,7 @@
</item> </item>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="2" > <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string>Having the &amp;attribute:</string> <string>Having the &amp;attribute:</string>
@ -100,10 +101,10 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0" colspan="2" > <item>
<widget class="QLineEdit" name="attribute"/> <widget class="QLineEdit" name="attribute"/>
</item> </item>
<item row="4" column="0" > <item>
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
<string>With &amp;value:</string> <string>With &amp;value:</string>
@ -113,20 +114,20 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0" > <item>
<widget class="QLineEdit" name="value" />
</item>
<item row="5" column="1" >
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>(A regular expression)</string> <string>(A regular expression)</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0" colspan="2" > <item>
<widget class="QLineEdit" name="value"/>
</item>
<item>
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
<string>&lt;p>For example, to match all h2 tags that have class="chapter", set tag to &lt;i>h2&lt;/i>, attribute to &lt;i>class&lt;/i> and value to &lt;i>chapter&lt;/i>.&lt;/p>&lt;p>Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.&lt;/p>&lt;p>To learn more advanced usage of XPath see the &lt;a href="http://calibre.kovidgoyal.net/user_manual/xpath.html">XPath Tutorial&lt;/a>.</string> <string>&lt;p&gt;For example, to match all h2 tags that have class=&quot;chapter&quot;, set tag to &lt;i&gt;h2&lt;/i&gt;, attribute to &lt;i&gt;class&lt;/i&gt; and value to &lt;i&gt;chapter&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.&lt;/p&gt;&lt;p&gt;To learn more advanced usage of XPath see the &lt;a href=&quot;http://calibre.kovidgoyal.net/user_manual/xpath.html&quot;&gt;XPath Tutorial&lt;/a&gt;.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@ -136,6 +137,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>

View File

@ -59,7 +59,6 @@ class ConfigTabs(QTabWidget):
fromlist=[1]) fromlist=[1])
pw = input_widget.PluginWidget pw = input_widget.PluginWidget
pw.ICON = ':/images/forward.svg' pw.ICON = ':/images/forward.svg'
pw.HELP = _('Options specific to the input format.')
self.widgets.append(widget_factory(pw)) self.widgets.append(widget_factory(pw))
except ImportError: except ImportError:
continue continue
@ -71,14 +70,15 @@ class ConfigTabs(QTabWidget):
fromlist=[1]) fromlist=[1])
pw = output_widget.PluginWidget pw = output_widget.PluginWidget
pw.ICON = ':/images/forward.svg' pw.ICON = ':/images/forward.svg'
pw.HELP = _('Options specific to the input format.')
self.widgets.append(widget_factory(pw)) self.widgets.append(widget_factory(pw))
except ImportError: except ImportError:
continue continue
for widget in self.widgets: for i, widget in enumerate(self.widgets):
self.addTab(widget, widget.TITLE.replace('\n', ' ').replace('&', self.addTab(widget, widget.TITLE.replace('\n', ' ').replace('&',
'&&')) '&&'))
self.setTabToolTip(i, widget.HELP if widget.HELP else widget.TITLE)
self.setUsesScrollButtons(True)
def commit(self): def commit(self):
for widget in self.widgets: for widget in self.widgets:

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>738</width> <width>767</width>
<height>575</height> <height>575</height>
</rect> </rect>
</property> </property>

View File

@ -9,8 +9,8 @@
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="250" width="150"
height="525" height="350"
id="svg2347" id="svg2347"
sodipodi:version="0.32" sodipodi:version="0.32"
inkscape:version="0.46" inkscape:version="0.46"
@ -1149,7 +1149,7 @@
<g <g
inkscape:label="Layer 1" inkscape:label="Layer 1"
id="g3155" id="g3155"
transform="matrix(1.9160726,0,0,4.0935085,4.833863,-12.457556)"> transform="matrix(1.2103698,0,0,2.7823904,-2.5000367,-12.695448)">
<path <path
sodipodi:nodetypes="ccssssssscsssssssc" sodipodi:nodetypes="ccssssssscsssssssc"
id="path1931" id="path1931"

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View File

@ -18,6 +18,7 @@ from calibre import __version__, __appname__, sanitize_file_name, \
iswindows, isosx, prints, patheq iswindows, isosx, prints, patheq
from calibre.ptempfile import PersistentTemporaryFile from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.config import prefs, dynamic from calibre.utils.config import prefs, dynamic
from calibre.utils.ipc.server import Server
from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \ from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \
initialize_file_icon_provider, question_dialog,\ initialize_file_icon_provider, question_dialog,\
pixmap_to_data, choose_dir, ORG_NAME, \ pixmap_to_data, choose_dir, ORG_NAME, \
@ -104,10 +105,12 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
def __init__(self, listener, opts, actions, parent=None): def __init__(self, listener, opts, actions, parent=None):
self.preferences_action, self.quit_action = actions self.preferences_action, self.quit_action = actions
self.spare_servers = []
MainWindow.__init__(self, opts, parent) MainWindow.__init__(self, opts, parent)
# Initialize fontconfig in a separate thread as this can be a lengthy # Initialize fontconfig in a separate thread as this can be a lengthy
# process if run for the first time on this machine # process if run for the first time on this machine
self.fc = __import__('calibre.utils.fontconfig', fromlist=1) from calibre.utils.fonts import fontconfig
self.fc = fontconfig
self.listener = Listener(listener) self.listener = Listener(listener)
self.check_messages_timer = QTimer() self.check_messages_timer = QTimer()
self.connect(self.check_messages_timer, SIGNAL('timeout()'), self.connect(self.check_messages_timer, SIGNAL('timeout()'),
@ -459,6 +462,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.setMaximumHeight(max_available_height()) self.setMaximumHeight(max_available_height())
####################### Start spare job server ########################
QTimer.singleShot(1000, self.add_spare_server)
####################### Setup device detection ######################## ####################### Setup device detection ########################
self.device_manager = DeviceManager(Dispatcher(self.device_detected), self.device_manager = DeviceManager(Dispatcher(self.device_detected),
@ -489,7 +494,16 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.connect(self.action_sync, SIGNAL('triggered(bool)'), self.connect(self.action_sync, SIGNAL('triggered(bool)'),
self._sync_menu.trigger_default) self._sync_menu.trigger_default)
def add_spare_server(self, *args):
self.spare_servers.append(Server())
@property
def spare_server(self):
try:
QTimer.singleShot(1000, self.add_spare_server)
return self.spare_servers.pop()
except:
pass
def no_op(self, *args): def no_op(self, *args):
pass pass
@ -729,7 +743,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
from calibre.gui2.add import Adder from calibre.gui2.add import Adder
self._adder = Adder(self, self._adder = Adder(self,
self.library_view.model().db, self.library_view.model().db,
Dispatcher(self._files_added)) Dispatcher(self._files_added), spare_server=self.spare_server)
self._adder.add_recursive(root, single) self._adder.add_recursive(root, single)
def add_recursive_single(self, checked): def add_recursive_single(self, checked):
@ -792,7 +806,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.__adder_func = partial(self._files_added, on_card=on_card) self.__adder_func = partial(self._files_added, on_card=on_card)
self._adder = Adder(self, self._adder = Adder(self,
None if to_device else self.library_view.model().db, None if to_device else self.library_view.model().db,
Dispatcher(self.__adder_func)) Dispatcher(self.__adder_func), spare_server=self.spare_server)
self._adder.add(paths) self._adder.add(paths)
def _files_added(self, paths=[], names=[], infos=[], on_card=None): def _files_added(self, paths=[], names=[], infos=[], on_card=None):
@ -985,7 +999,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
Dispatcher(self._books_saved), rows, path, Dispatcher(self._books_saved), rows, path,
by_author=self.library_view.model().by_author, by_author=self.library_view.model().by_author,
single_dir=single_dir, single_dir=single_dir,
single_format=single_format) single_format=single_format,
spare_server=self.spare_server)
else: else:
paths = self.current_view().model().paths(rows) paths = self.current_view().model().paths(rows)
@ -1617,6 +1632,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.check_messages_timer.stop() self.check_messages_timer.stop()
self.listener.close() self.listener.close()
self.job_manager.server.close() self.job_manager.server.close()
while self.spare_servers:
self.spare_servers.pop().close()
self.device_manager.keep_going = False self.device_manager.keep_going = False
self.cover_cache.stop() self.cover_cache.stop()
self.hide() self.hide()
@ -1735,6 +1752,11 @@ def run_gui(opts, args, actions, listener, app):
if getattr(main, 'restart_after_quit', False): if getattr(main, 'restart_after_quit', False):
e = sys.executable if getattr(sys, 'froze', False) else sys.argv[0] e = sys.executable if getattr(sys, 'froze', False) else sys.argv[0]
print 'Restarting with:', e, sys.argv print 'Restarting with:', e, sys.argv
if hasattr(sys, 'frameworks_dir'):
app = os.path.dirname(os.path.dirname(sys.frameworks_dir))
import subprocess
subprocess.Popen('sleep 3s; open '+app, shell=True)
else:
os.execvp(e, sys.argv) os.execvp(e, sys.argv)
else: else:
if iswindows: if iswindows:
@ -1829,7 +1851,9 @@ if __name__ == '__main__':
logfile = os.path.join(os.path.expanduser('~'), 'calibre.log') logfile = os.path.join(os.path.expanduser('~'), 'calibre.log')
if os.path.exists(logfile): if os.path.exists(logfile):
log = open(logfile).read().decode('utf-8', 'ignore') log = open(logfile).read().decode('utf-8', 'ignore')
d = QErrorMessage(('<b>Error:</b>%s<br><b>Traceback:</b><br>' d = QErrorMessage()
'%s<b>Log:</b><br>%s')%(unicode(err), unicode(tb), log)) d.showMessage(('<b>Error:</b>%s<br><b>Traceback:</b><br>'
d.exec_() '%s<b>Log:</b><br>%s')%(unicode(err),
unicode(tb).replace('\n', '<br>'),
log.replace('\n', '<br>')))

View File

@ -543,8 +543,9 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
if isinstance(worker.exception, DRMError): if isinstance(worker.exception, DRMError):
error_dialog(self, _('DRM Error'), _('<p>This book is protected by <a href="%s">DRM</a>')%'http://wiki.mobileread.com/wiki/DRM').exec_() error_dialog(self, _('DRM Error'), _('<p>This book is protected by <a href="%s">DRM</a>')%'http://wiki.mobileread.com/wiki/DRM').exec_()
else: else:
r = getattr(worker.exception, 'reason', worker.exception)
error_dialog(self, _('Could not open ebook'), error_dialog(self, _('Could not open ebook'),
unicode(worker.exception.reason), det_msg=worker.traceback, show=True) unicode(r), det_msg=worker.traceback, show=True)
self.close_progress_indicator() self.close_progress_indicator()
else: else:
self.metadata.show_opf(self.iterator.opf) self.metadata.show_opf(self.iterator.opf)

View File

@ -16,7 +16,7 @@ from calibre.gui2 import human_readable, NONE, TableView, \
from calibre.gui2.dialogs.job_view_ui import Ui_Dialog from calibre.gui2.dialogs.job_view_ui import Ui_Dialog
from calibre.gui2.filename_pattern_ui import Ui_Form from calibre.gui2.filename_pattern_ui import Ui_Form
from calibre import fit_image from calibre import fit_image
from calibre.utils.fontconfig import find_font_families from calibre.utils.fonts import fontconfig
from calibre.ebooks.metadata.meta import metadata_from_filename from calibre.ebooks.metadata.meta import metadata_from_filename
from calibre.utils.config import prefs from calibre.utils.config import prefs
@ -293,7 +293,7 @@ class FontFamilyModel(QAbstractListModel):
def __init__(self, *args): def __init__(self, *args):
QAbstractListModel.__init__(self, *args) QAbstractListModel.__init__(self, *args)
try: try:
self.families = find_font_families() self.families = fontconfig.find_font_families()
except: except:
self.families = [] self.families = []
print 'WARNING: Could not load fonts' print 'WARNING: Could not load fonts'

View File

@ -23,6 +23,7 @@ from calibre.gui2.wizard.library_ui import Ui_WizardPage as LibraryUI
from calibre.gui2.wizard.finish_ui import Ui_WizardPage as FinishUI from calibre.gui2.wizard.finish_ui import Ui_WizardPage as FinishUI
from calibre.gui2.wizard.kindle_ui import Ui_WizardPage as KindleUI from calibre.gui2.wizard.kindle_ui import Ui_WizardPage as KindleUI
from calibre.gui2.wizard.stanza_ui import Ui_WizardPage as StanzaUI from calibre.gui2.wizard.stanza_ui import Ui_WizardPage as StanzaUI
from calibre.gui2 import min_available_height, available_width
from calibre.utils.config import dynamic, prefs from calibre.utils.config import dynamic, prefs
from calibre.gui2 import NONE, choose_dir, error_dialog from calibre.gui2 import NONE, choose_dir, error_dialog
@ -62,6 +63,13 @@ class Kindle(Device):
manufacturer = 'Amazon' manufacturer = 'Amazon'
id = 'kindle' id = 'kindle'
class KindleDX(Kindle):
output_profile = 'kindle_dx'
output_format = 'MOBI'
name = 'Kindle DX'
id = 'kindledx'
class Sony500(Device): class Sony500(Device):
output_profile = 'sony' output_profile = 'sony'
@ -306,7 +314,7 @@ class DevicePage(QWizardPage, DeviceUI):
def nextId(self): def nextId(self):
idx = list(self.device_view.selectionModel().selectedIndexes())[0] idx = list(self.device_view.selectionModel().selectedIndexes())[0]
dev = self.dev_model.data(idx, Qt.UserRole) dev = self.dev_model.data(idx, Qt.UserRole)
if dev is Kindle: if dev in (Kindle, KindleDX):
return KindlePage.ID return KindlePage.ID
if dev is iPhone: if dev is iPhone:
return StanzaPage.ID return StanzaPage.ID
@ -483,6 +491,15 @@ class Wizard(QWizard):
self.setPage(self.stanza_page.ID, self.stanza_page) self.setPage(self.stanza_page.ID, self.stanza_page)
self.device_extra_page = None self.device_extra_page = None
nh, nw = min_available_height()-75, available_width()-30
if nh < 0:
nh = 580
if nw < 0:
nw = 400
nh = min(400, nh)
nw = min(580, nw)
self.resize(nw, nh)
def accept(self): def accept(self):
self.device_page.commit() self.device_page.commit()

View File

@ -27,7 +27,6 @@ entry_points = {
'librarything = calibre.ebooks.metadata.library_thing:main', 'librarything = calibre.ebooks.metadata.library_thing:main',
'calibre-debug = calibre.debug:main', 'calibre-debug = calibre.debug:main',
'calibredb = calibre.library.cli:main', 'calibredb = calibre.library.cli:main',
'calibre-fontconfig = calibre.utils.fontconfig:main',
'calibre-parallel = calibre.utils.ipc.worker:main', 'calibre-parallel = calibre.utils.ipc.worker:main',
'calibre-customize = calibre.customize.ui:main', 'calibre-customize = calibre.customize.ui:main',
'calibre-complete = calibre.utils.complete:main', 'calibre-complete = calibre.utils.complete:main',

View File

@ -4,9 +4,9 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.5.14\n" "Project-Id-Version: calibre 0.6.0b1\n"
"POT-Creation-Date: 2009-05-31 09:36+PDT\n" "POT-Creation-Date: 2009-06-02 08:53+PDT\n"
"PO-Revision-Date: 2009-05-31 09:36+PDT\n" "PO-Revision-Date: 2009-06-02 08:53+PDT\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n" "Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -48,7 +48,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/mobi.py:153 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/mobi.py:153
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:333 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:333
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:448 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:448
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:866 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:865
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:58 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:58
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/topaz.py:29 #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/topaz.py:29
@ -57,8 +57,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:149 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:149
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:520 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:531
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:704 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:715
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:44 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:44
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:46 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:46
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:791 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:791
@ -66,8 +66,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:162 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:162
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:165 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:165
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:82 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:82
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:96 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:101
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:97 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:102
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:28 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:28
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:26 #: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:26
@ -261,31 +261,35 @@ msgstr ""
msgid "This profile is intended for the SONY PRS line. The 500/505/700 etc, in landscape mode. Mainly useful for comics." msgid "This profile is intended for the SONY PRS line. The 500/505/700 etc, in landscape mode. Mainly useful for comics."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:30 #: /home/kovid/work/calibre/src/calibre/customize/profiles.py:242
msgid "This profile is intended for the Amazon Kindle DX."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:29
msgid "Installed plugins" msgid "Installed plugins"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:31 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:30
msgid "Mapping for filetype plugins" msgid "Mapping for filetype plugins"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:32 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:31
msgid "Local plugin customization" msgid "Local plugin customization"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:32
msgid "Disabled plugins" msgid "Disabled plugins"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:75 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:74
msgid "No valid plugin found in " msgid "No valid plugin found in "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:215 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:214
msgid "Initialization of plugin %s failed with traceback:" msgid "Initialization of plugin %s failed with traceback:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:333 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:332
msgid "" msgid ""
" %prog options\n" " %prog options\n"
"\n" "\n"
@ -293,27 +297,27 @@ msgid ""
" " " "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:339 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:338
msgid "Add a plugin by specifying the path to the zip file containing it." msgid "Add a plugin by specifying the path to the zip file containing it."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:341 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:340
msgid "Remove a custom plugin by name. Has no effect on builtin plugins" msgid "Remove a custom plugin by name. Has no effect on builtin plugins"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:343 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:342
msgid "Customize plugin. Specify name of plugin and customization string separated by a comma." msgid "Customize plugin. Specify name of plugin and customization string separated by a comma."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:345 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:344
msgid "List all installed plugins" msgid "List all installed plugins"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:347 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:346
msgid "Enable the named plugin" msgid "Enable the named plugin"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:349 #: /home/kovid/work/calibre/src/calibre/customize/ui.py:348
msgid "Disable the named plugin" msgid "Disable the named plugin"
msgstr "" msgstr ""
@ -446,7 +450,6 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:110 #: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:110
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:84 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:84
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:86 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:86
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:88
msgid "The reader has no storage card in this slot." msgid "The reader has no storage card in this slot."
msgstr "" msgstr ""
@ -489,6 +492,10 @@ msgstr ""
msgid "Communicate with an eBook reader." msgid "Communicate with an eBook reader."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:88
msgid "Selected slot: %s is not supported."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:173 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:173
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:181 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:181
msgid "Adding books to device metadata listing..." msgid "Adding books to device metadata listing..."
@ -563,7 +570,7 @@ msgstr ""
msgid "Page" msgid "Page"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:10 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:19
msgid "" msgid ""
"input_file output_file [options]\n" "input_file output_file [options]\n"
"\n" "\n"
@ -578,43 +585,43 @@ msgid ""
"For full documentation of the conversion system see\n" "For full documentation of the conversion system see\n"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:86 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:87
msgid "INPUT OPTIONS" msgid "INPUT OPTIONS"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:87 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:88
msgid "Options to control the processing of the input %s file" msgid "Options to control the processing of the input %s file"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:93 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:94
msgid "OUTPUT OPTIONS" msgid "OUTPUT OPTIONS"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:94 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:95
msgid "Options to control the processing of the output %s" msgid "Options to control the processing of the output %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:108 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:109
msgid "Options to control the look and feel of the output" msgid "Options to control the look and feel of the output"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:122 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:123
msgid "Control auto-detection of document structure." msgid "Control auto-detection of document structure."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:132 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:133
msgid "Control the automatic generation of a Table of Contents. By default, if the source file has a Table of Contents, it will be used in preference to the automatically generated one." msgid "Control the automatic generation of a Table of Contents. By default, if the source file has a Table of Contents, it will be used in preference to the automatically generated one."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:142 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:143
msgid "Options to set metadata in the output" msgid "Options to set metadata in the output"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:145 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:146
msgid "Options to help with debugging the conversion" msgid "Options to help with debugging the conversion"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:219 #: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:220
msgid "Output saved to" msgid "Output saved to"
msgstr "" msgstr ""
@ -1805,6 +1812,20 @@ msgstr ""
msgid "Comic Input" msgid "Comic Input"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16
msgid "input"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17
msgid "Options specific to"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:76
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:38 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:38
#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:85
@ -1818,7 +1839,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:61 #: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:61
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:31 #: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:31
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_edit_ui.py:41 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_edit_ui.py:41
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:65 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:53 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:53
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96 #: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96
@ -1884,6 +1905,15 @@ msgstr ""
msgid "EPUB Output" msgid "EPUB Output"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17
msgid "output"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:39 #: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:39
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:513 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:513
msgid "Do not &split on page breaks" msgid "Do not &split on page breaks"
@ -2295,8 +2325,6 @@ msgid "Convert"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:162 #: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:162
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:62
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:74
msgid "Options specific to the input format." msgid "Options specific to the input format."
msgstr "" msgstr ""
@ -2455,71 +2483,71 @@ msgstr ""
msgid "Use a wizard to help construct the XPath expression" msgid "Use a wizard to help construct the XPath expression"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:66 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:68
msgid "Match HTML &tags with tag name:" msgid "Match HTML &tags with tag name:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:69
msgid "*" msgid "*"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:68 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:70
msgid "a" msgid "a"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:69 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:71
msgid "br" msgid "br"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:70 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72
msgid "div" msgid "div"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:71 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:73
msgid "h1" msgid "h1"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:74
msgid "h2" msgid "h2"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:73 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:75
msgid "h3" msgid "h3"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:74 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:76
msgid "h4" msgid "h4"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:75 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:77
msgid "h5" msgid "h5"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:76 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:78
msgid "h6" msgid "h6"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:77 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79
msgid "hr" msgid "hr"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:78 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80
msgid "span" msgid "span"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81
msgid "Having the &attribute:" msgid "Having the &attribute:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:82
msgid "With &value:" msgid "With &value:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:83
msgid "(A regular expression)" msgid "(A regular expression)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:82 #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:84
msgid "<p>For example, to match all h2 tags that have class=\"chapter\", set tag to <i>h2</i>, attribute to <i>class</i> and value to <i>chapter</i>.</p><p>Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.</p><p>To learn more advanced usage of XPath see the <a href=\"http://calibre.kovidgoyal.net/user_manual/xpath.html\">XPath Tutorial</a>." msgid "<p>For example, to match all h2 tags that have class=\"chapter\", set tag to <i>h2</i>, attribute to <i>class</i> and value to <i>chapter</i>.</p><p>Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.</p><p>To learn more advanced usage of XPath see the <a href=\"http://calibre.kovidgoyal.net/user_manual/xpath.html\">XPath Tutorial</a>."
msgstr "" msgstr ""
@ -2882,12 +2910,12 @@ msgid "Access log:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:607 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:607
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:513 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:514
msgid "Failed to start content server" msgid "Failed to start content server"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:631 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:631
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:423 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:431
msgid "Select location for books" msgid "Select location for books"
msgstr "" msgstr ""
@ -4379,137 +4407,137 @@ msgstr ""
msgid "Save single format to disk..." msgid "Save single format to disk..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:135
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:911 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:912
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:49 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:49
msgid "Error" msgid "Error"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:136
msgid "Error communicating with device" msgid "Error communicating with device"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:149 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:150
msgid "&Restore" msgid "&Restore"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:152
msgid "&Donate to support calibre" msgid "&Donate to support calibre"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:157
msgid "&Restart" msgid "&Restart"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:182 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:183
msgid "<p>For help visit <a href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>" msgid "<p>For help visit <a href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:185 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:186
msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>" msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:205 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:206
msgid "Edit metadata individually" msgid "Edit metadata individually"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:208
msgid "Edit metadata in bulk" msgid "Edit metadata in bulk"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:209 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:210
msgid "Download metadata and covers" msgid "Download metadata and covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:210 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:211
msgid "Download only metadata" msgid "Download only metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:211 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:212
msgid "Download only covers" msgid "Download only covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:214 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:215
msgid "Add books from a single directory" msgid "Add books from a single directory"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:215 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:216
msgid "Add books from directories, including sub-directories (One book per directory, assumes every ebook file is the same book in a different format)" msgid "Add books from directories, including sub-directories (One book per directory, assumes every ebook file is the same book in a different format)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:218 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:219
msgid "Add books from directories, including sub directories (Multiple books per directory, assumes every ebook file is a different book)" msgid "Add books from directories, including sub directories (Multiple books per directory, assumes every ebook file is a different book)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:254 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:255
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:357 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:357
msgid "Save to disk" msgid "Save to disk"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:255 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:256
msgid "Save to disk in a single directory" msgid "Save to disk in a single directory"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:256 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:257
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1388 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1389
msgid "Save only %s format to disk" msgid "Save only %s format to disk"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:264 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:265
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:363 #: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:363
msgid "View" msgid "View"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:265 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:266
msgid "View specific format" msgid "View specific format"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:292
msgid "Convert individually" msgid "Convert individually"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:292 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:293
msgid "Bulk convert" msgid "Bulk convert"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:304
msgid "Run welcome wizard" msgid "Run welcome wizard"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:335 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:336
msgid "Similar books..." msgid "Similar books..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:392 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:393
msgid "Bad database location" msgid "Bad database location"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:395 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:396
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1516 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1517
msgid "Choose a location for your ebook library." msgid "Choose a location for your ebook library."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:556 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:557
msgid "Browse by covers" msgid "Browse by covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:657 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:658
msgid "Device: " msgid "Device: "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:659 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:660
msgid " detected." msgid " detected."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:681 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:682
msgid "Connected " msgid "Connected "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:693 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:694
msgid "Device database corrupted" msgid "Device database corrupted"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:695
msgid "" msgid ""
"\n" "\n"
" <p>The database of books on the reader is corrupted. Try the following:\n" " <p>The database of books on the reader is corrupted. Try the following:\n"
@ -4520,286 +4548,286 @@ msgid ""
" " " "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:761 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:762
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:804 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:805
msgid "Uploading books to device." msgid "Uploading books to device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:769 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:770
msgid "Books" msgid "Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:770 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:771
msgid "EPUB Books" msgid "EPUB Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:772
msgid "LRF Books" msgid "LRF Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:773
msgid "HTML Books" msgid "HTML Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:773 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:774
msgid "LIT Books" msgid "LIT Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:774 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:775
msgid "MOBI Books" msgid "MOBI Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:775 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:776
msgid "Text books" msgid "Text books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:776 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:777
msgid "PDF Books" msgid "PDF Books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:777 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:778
msgid "Comics" msgid "Comics"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:778 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:779
msgid "Archives" msgid "Archives"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:825 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:826
msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?" msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:843
msgid "Deleting books from device." msgid "Deleting books from device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:874
msgid "Cannot download metadata" msgid "Cannot download metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:874 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:875
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:924 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:925
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:951 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:952
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:977
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1106 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1107
msgid "No books selected" msgid "No books selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:883 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:884
msgid "covers" msgid "covers"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:883 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:884
msgid "metadata" msgid "metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:886
msgid "Downloading %s for %d book(s)" msgid "Downloading %s for %d book(s)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:906 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:907
msgid "Failed to download some metadata" msgid "Failed to download some metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:907 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:908
msgid "Failed to download metadata for the following:" msgid "Failed to download metadata for the following:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:910 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:911
msgid "Failed to download metadata:" msgid "Failed to download metadata:"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:924
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:950 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:951
msgid "Cannot edit metadata" msgid "Cannot edit metadata"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:975 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:976
msgid "Cannot save to disk" msgid "Cannot save to disk"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:978 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:979
msgid "Choose destination directory" msgid "Choose destination directory"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1000 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001
msgid "Error while saving" msgid "Error while saving"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1002
msgid "There was an error while saving." msgid "There was an error while saving."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1005
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007
msgid "Could not save some books" msgid "Could not save some books"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1008
msgid "as the %s format is not available for them." msgid "as the %s format is not available for them."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1008 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1009
msgid "Click the show details button to see which ones." msgid "Click the show details button to see which ones."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1027 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1028
msgid "Fetching news from " msgid "Fetching news from "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1040 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1041
msgid " fetched." msgid " fetched."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1105 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1106
msgid "Cannot convert" msgid "Cannot convert"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1282 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1283
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1301 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1302
msgid "No book selected" msgid "No book selected"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1282 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1283
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1331 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1332
msgid "Cannot view" msgid "Cannot view"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1288 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1289
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1336 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1337
msgid "Choose the format to view" msgid "Choose the format to view"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1300 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1301
msgid "Cannot open folder" msgid "Cannot open folder"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1332 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1333
msgid "%s has no available formats." msgid "%s has no available formats."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1373 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1374
msgid "Cannot configure" msgid "Cannot configure"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1374 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1375
msgid "Cannot configure while there are running jobs." msgid "Cannot configure while there are running jobs."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1417 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1418
msgid "No detailed info available" msgid "No detailed info available"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1418 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1419
msgid "No detailed information is available for books on the device." msgid "No detailed information is available for books on the device."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1466 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1467
msgid "Error talking to device" msgid "Error talking to device"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1467 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1468
msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot." msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1484 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1485
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1499 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1500
msgid "Conversion Error" msgid "Conversion Error"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1485 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1486
msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using 3rd party tools." msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using 3rd party tools."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1500 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1501
msgid "<b>Failed</b>" msgid "<b>Failed</b>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1525 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1526
msgid "Invalid library location" msgid "Invalid library location"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1526 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1527
msgid "Could not access %s. Using %s as the library." msgid "Could not access %s. Using %s as the library."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1574 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1575
msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development." msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1598 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1599
msgid "There are active jobs. Are you sure you want to quit?" msgid "There are active jobs. Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1601 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1602
msgid "" msgid ""
" is communicating with the device!<br>\n" " is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n" " Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?" " Are you sure you want to quit?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1605 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1606
msgid "WARNING: Active jobs" msgid "WARNING: Active jobs"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1654 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1655
msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray." msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1673 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1674
msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>" msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1681 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1682
msgid "Update available" msgid "Update available"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1682 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1683
msgid "%s has been updated to version %s. See the <a href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. Visit the download page?" msgid "%s has been updated to version %s. See the <a href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. Visit the download page?"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1700 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1701
msgid "Use the library located at the specified path." msgid "Use the library located at the specified path."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1702 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1703
msgid "Start minimized to system tray." msgid "Start minimized to system tray."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1704 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1705
msgid "Log debugging information to console" msgid "Log debugging information to console"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1747 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1753
msgid "If you are sure it is not running" msgid "If you are sure it is not running"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1749 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1755
msgid "Cannot Start " msgid "Cannot Start "
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1750 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1756
msgid "%s is already running." msgid "%s is already running."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1753 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1759
msgid "may be running in the system tray, in the" msgid "may be running in the system tray, in the"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1755 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1761
msgid "upper right region of the screen." msgid "upper right region of the screen."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1757 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1763
msgid "lower right region of the screen." msgid "lower right region of the screen."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1760 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1766
msgid "try rebooting your computer." msgid "try rebooting your computer."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1762 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1768
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1782 #: /home/kovid/work/calibre/src/calibre/gui2/main.py:1788
msgid "try deleting the file" msgid "try deleting the file"
msgstr "" msgstr ""
@ -5122,7 +5150,7 @@ msgid "Options to customize the ebook viewer"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:629 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:630
msgid "Remember last used window size" msgid "Remember last used window size"
msgstr "" msgstr ""
@ -5227,19 +5255,19 @@ msgstr ""
msgid "DRM Error" msgid "DRM Error"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:546 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:547
msgid "Could not open ebook" msgid "Could not open ebook"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:619 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:620
msgid "Options to control the ebook viewer" msgid "Options to control the ebook viewer"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:626 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:627
msgid "If specified, viewer window will try to come to the front when started." msgid "If specified, viewer window will try to come to the front when started."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:635 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:636
msgid "" msgid ""
"%prog [options] file\n" "%prog [options] file\n"
"\n" "\n"
@ -5350,39 +5378,39 @@ msgstr ""
msgid "Click to see the list of books on storage card B in your reader" msgid "Click to see the list of books on storage card B in your reader"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:36 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:36
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:119 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:37
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:120 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:127
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:128
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:325 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:333
msgid "Moving library..." msgid "Moving library..."
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:341 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:349
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:342 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:350
msgid "Failed to move library" msgid "Failed to move library"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:351 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:359
msgid "Copied" msgid "Copied"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:395 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:403
msgid "Invalid database" msgid "Invalid database"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:396 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:404
msgid "<p>An invalid library already exists at %s, delete it before trying to move the existing library.<br>Error: %s" msgid "<p>An invalid library already exists at %s, delete it before trying to move the existing library.<br>Error: %s"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:407 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:415
msgid "Could not move library" msgid "Could not move library"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:466 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:474
msgid "welcome wizard" msgid "welcome wizard"
msgstr "" msgstr ""
@ -5863,10 +5891,6 @@ msgstr ""
msgid "The priority of worker processes" msgid "The priority of worker processes"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:180
msgid "Could not initialize the fontconfig library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:39 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:39
msgid "Waiting..." msgid "Waiting..."
msgstr "" msgstr ""

View File

@ -1,400 +0,0 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
'''
:mod:`fontconfig` -- Query system fonts
=============================================
.. module:: fontconfig
:platform: Unix, Windows, OS X
:synopsis: Query system fonts
.. moduleauthor:: Kovid Goyal <kovid@kovidgoyal.net>
A ctypes based wrapper around the `fontconfig <http://fontconfig.org>`_ library.
It can be used to find all fonts available on the system as well as the closest
match to a given font specification. The main functions in this module are:
.. autofunction:: find_font_families
.. autofunction:: files_for_family
.. autofunction:: match
'''
import sys, os, locale, codecs, subprocess, re
from ctypes import cdll, c_void_p, Structure, c_int, POINTER, c_ubyte, c_char, util, \
pointer, byref, create_string_buffer, Union, c_char_p, c_double
try:
preferred_encoding = locale.getpreferredencoding()
codecs.lookup(preferred_encoding)
except:
preferred_encoding = 'utf-8'
iswindows = 'win32' in sys.platform or 'win64' in sys.platform
isosx = 'darwin' in sys.platform
isbsd = 'bsd' in sys.platform
DISABLED = False
#if isosx:
# libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('c'))
# size = ctypes.c_uint(0)
# ok = libc.sysctlbyname("hw.cpu64bit_capable", None, byref(size), None, 0)
# if ok != 0:
# is64bit = False
# else:
# buf = ctypes.c_char_p("\0" * size.value)
# ok = libc.sysctlbyname("hw.cpu64bit_capable", buf, byref(size), None, 0)
# if ok != 0:
# is64bit = False
# else:
# is64bit = '1' in buf.value
# DISABLED = is64bit
def load_library():
if isosx:
lib = os.path.join(getattr(sys, 'frameworks_dir'), 'libfontconfig.1.dylib') \
if hasattr(sys, 'frameworks_dir') else util.find_library('fontconfig')
return cdll.LoadLibrary(lib)
elif iswindows:
return cdll.LoadLibrary('libfontconfig-1')
elif isbsd:
raw = subprocess.Popen('pkg-config --libs-only-L fontconfig'.split(),
stdout=subprocess.PIPE).stdout.read().strip()
match = re.search(r'-L([^\s,]+)', raw)
if not match:
return cdll.LoadLibrary('libfontconfig.so')
return cdll.LoadLibrary(match.group(1)+'/libfontconfig.so')
else:
try:
return cdll.LoadLibrary(util.find_library('fontconfig'))
except:
try:
return cdll.LoadLibrary('libfontconfig.so')
except:
return cdll.LoadLibrary('libfontconfig.so.1')
class FcPattern(Structure):
_fields_ = [
('num', c_int),
('size', c_int),
('elts_offset', c_void_p),
('ref', c_int)
]
class FcFontSet(Structure):
_fields_ = [
('nfont', c_int),
('sfont', c_int),
('fonts', POINTER(POINTER(FcPattern)))
]
(
FcTypeVoid,
FcTypeInteger,
FcTypeDouble,
FcTypeString,
FcTypeBool,
FcTypeMatrix,
FcTypeCharSet,
FcTypeFTFace,
FcTypeLangSet
) = map(c_int, range(9))
(FcMatchPattern, FcMatchFont, FcMatchScan) = map(c_int, range(3))
(
FcResultMatch, FcResultNoMatch, FcResultTypeMismatch, FcResultNoId,
FcResultOutOfMemory
) = map(c_int, range(5))
FcFalse, FcTrue = c_int(0), c_int(1)
class _FcValue(Union):
_fields_ = [
('s', c_char_p),
('i', c_int),
('b', c_int),
('d', c_double),
]
class FcValue(Structure):
_fields_ = [
('type', c_int),
('u', _FcValue)
]
class FcObjectSet(Structure): pass
lib = load_library()
lib.FcPatternBuild.restype = POINTER(FcPattern)
lib.FcPatternCreate.restype = c_void_p
lib.FcObjectSetCreate.restype = POINTER(FcObjectSet)
lib.FcFontSetDestroy.argtypes = [POINTER(FcFontSet)]
lib.FcFontList.restype = POINTER(FcFontSet)
lib.FcNameUnparse.argtypes = [POINTER(FcPattern)]
lib.FcNameUnparse.restype = POINTER(c_ubyte)
lib.FcPatternGetString.argtypes = [POINTER(FcPattern), POINTER(c_char), c_int, c_void_p]
lib.FcPatternGetString.restype = c_int
lib.FcPatternAdd.argtypes = [c_void_p, POINTER(c_char), FcValue, c_int]
lib.FcPatternGetInteger.argtypes = [POINTER(FcPattern), POINTER(c_char), c_int, POINTER(c_int)]
lib.FcPatternGetInteger.restype = c_int
lib.FcNameParse.argtypes = [c_char_p]
lib.FcNameParse.restype = POINTER(FcPattern)
lib.FcDefaultSubstitute.argtypes = [POINTER(FcPattern)]
lib.FcConfigSubstitute.argtypes = [c_void_p, POINTER(FcPattern), c_int]
lib.FcFontSetCreate.restype = POINTER(FcFontSet)
lib.FcFontMatch.argtypes = [c_void_p, POINTER(FcPattern), POINTER(c_int)]
lib.FcFontMatch.restype = POINTER(FcPattern)
lib.FcFontSetAdd.argtypes = [POINTER(FcFontSet), POINTER(FcPattern)]
lib.FcFontSort.argtypes = [c_void_p, POINTER(FcPattern), c_int, c_void_p, POINTER(c_int)]
lib.FcFontSort.restype = POINTER(FcFontSet)
lib.FcFontRenderPrepare.argtypes = [c_void_p, POINTER(FcPattern), POINTER(FcPattern)]
lib.FcFontRenderPrepare.restype = POINTER(FcPattern)
lib.FcConfigCreate.restype = c_void_p
lib.FcConfigSetCurrent.argtypes = [c_void_p]
lib.FcConfigSetCurrent.restype = c_int
lib.FcConfigParseAndLoad.argtypes = [c_void_p, POINTER(c_char), c_int]
lib.FcConfigParseAndLoad.restype = c_int
lib.FcConfigBuildFonts.argtypes = [c_void_p]
lib.FcConfigBuildFonts.restype = c_int
_init_error = None
_initialized = False
from threading import Thread
class FontScanner(Thread):
def run(self):
# Initialize the fontconfig library. This has to be done manually
# for the OS X bundle as it may have its own private fontconfig.
if getattr(sys, 'frameworks_dir', False):# and not os.path.exists('/usr/X11/lib/libfontconfig.1.dylib'):
config_dir = os.path.join(os.path.dirname(getattr(sys, 'frameworks_dir')), 'Resources', 'fonts')
if isinstance(config_dir, unicode):
config_dir = config_dir.encode(sys.getfilesystemencoding())
config = lib.FcConfigCreate()
if not lib.FcConfigParseAndLoad(config, os.path.join(config_dir, 'fonts.conf'), 1):
_init_error = 'Could not parse the fontconfig configuration'
return
if not lib.FcConfigBuildFonts(config):
_init_error = 'Could not build fonts'
return
if not lib.FcConfigSetCurrent(config):
_init_error = 'Could not set font config'
return
elif not lib.FcInit():
_init_error = _('Could not initialize the fontconfig library')
return
global _initialized
_initialized = True
if not DISABLED:
_scanner = FontScanner()
_scanner.start()
def join():
_scanner.join(120)
if _scanner.isAlive():
raise RuntimeError('Scanning for system fonts seems to have hung. Try again in a little while.')
if _init_error is not None:
raise RuntimeError(_init_error)
def find_font_families(allowed_extensions=['ttf', 'otf']):
'''
Return an alphabetically sorted list of font families available on the system.
`allowed_extensions`: A list of allowed extensions for font file types. Defaults to
`['ttf', 'otf']`. If it is empty, it is ignored.
'''
if DISABLED:
return []
join()
allowed_extensions = [i.lower() for i in allowed_extensions]
empty_pattern = lib.FcPatternCreate()
oset = lib.FcObjectSetCreate()
if not lib.FcObjectSetAdd(oset, 'file'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'family'):
raise RuntimeError('Allocation failure')
fs = lib.FcFontList(0, empty_pattern, oset)
font_set = fs.contents
file = pointer(create_string_buffer(chr(0), 5000))
family = pointer(create_string_buffer(chr(0), 200))
font_families = []
for i in range(font_set.nfont):
pat = font_set.fonts[i]
if lib.FcPatternGetString(pat, 'file', 0, byref(file)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
path = str(file.contents.value)
ext = os.path.splitext(path)[1]
if ext:
ext = ext[1:].lower()
if (not allowed_extensions) or (allowed_extensions and ext in allowed_extensions):
if lib.FcPatternGetString(pat, 'family', 0, byref(family)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
font_families.append(str(family.contents.value))
lib.FcObjectSetDestroy(oset)
lib.FcPatternDestroy(empty_pattern)
lib.FcFontSetDestroy(fs)
font_families = list(set(font_families))
font_families.sort()
return font_families
def files_for_family(family, normalize=True):
'''
Find all the variants in the font family `family`.
Returns a dictionary of tuples. Each tuple is of the form (Full font name, path to font file).
The keys of the dictionary depend on `normalize`. If `normalize` is `False`,
they are a tuple (slant, weight) otherwise they are strings from the set
`('normal', 'bold', 'italic', 'bi', 'light', 'li')`
'''
if DISABLED:
return {}
join()
if isinstance(family, unicode):
family = family.encode(preferred_encoding)
family_pattern = lib.FcPatternBuild(0, 'family', FcTypeString, family, None)
if not family_pattern:
raise RuntimeError('Allocation failure')
#lib.FcPatternPrint(family_pattern)
oset = lib.FcObjectSetCreate()
if not lib.FcObjectSetAdd(oset, 'file'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'weight'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'fullname'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'slant'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'style'):
raise RuntimeError('Allocation failure')
fonts = {}
fs = lib.FcFontList(0, family_pattern, oset)
font_set = fs.contents
file = pointer(create_string_buffer(5000))
full_name = pointer(create_string_buffer(200))
weight = c_int(0)
slant = c_int(0)
fname = ''
for i in range(font_set.nfont):
pat = font_set.fonts[i]
#lib.FcPatternPrint(pat)
pat = font_set.fonts[i]
if lib.FcPatternGetString(pat, 'file', 0, byref(file)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetInteger(pat, 'weight', 0, byref(weight)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetString(pat, 'fullname', 0, byref(full_name)) != FcResultMatch.value:
if lib.FcPatternGetString(pat, 'fullname', 0, byref(full_name)) == FcResultNoMatch.value:
if lib.FcPatternGetString(pat, 'style', 0, byref(full_name)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
fname = family + ' ' + full_name.contents.value
else:
raise RuntimeError('Error processing pattern')
else:
fname = full_name.contents.value
if lib.FcPatternGetInteger(pat, 'slant', 0, byref(slant)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
style = (slant.value, weight.value)
if normalize:
italic = slant.value > 0
normal = weight.value == 80
bold = weight.value > 80
if italic:
style = 'italic' if normal else 'bi' if bold else 'li'
else:
style = 'normal' if normal else 'bold' if bold else 'light'
fonts[style] = (file.contents.value, fname)
lib.FcObjectSetDestroy(oset)
lib.FcPatternDestroy(family_pattern)
if not iswindows:
lib.FcFontSetDestroy(fs)
return fonts
def match(name, sort=False, verbose=False):
'''
Find the system font that most closely matches `name`, where `name` is a specification
of the form::
familyname-<pointsize>:<property1=value1>:<property2=value2>...
For example, `verdana:weight=bold:slant=italic`
Returns a list of dictionaries. Each dictionary has the keys: 'weight', 'slant', 'family', 'file'
`sort`: If `True` return a sorted list of matching fonts, where the sort id in order of
decreasing closeness of matching.
`verbose`: If `True` print debugging information to stdout
'''
if DISABLED:
return []
join()
if isinstance(name, unicode):
name = name.encode(preferred_encoding)
pat = lib.FcNameParse(name)
if not pat:
raise ValueError('Could not parse font name')
if verbose:
print 'Searching for pattern'
lib.FcPatternPrint(pat)
if not lib.FcConfigSubstitute(0, pat, FcMatchPattern):
raise RuntimeError('Allocation failure')
lib.FcDefaultSubstitute(pat)
fs = lib.FcFontSetCreate()
result = c_int(0)
matches = []
if sort:
font_patterns = lib.FcFontSort(0, pat, FcFalse, 0, byref(result))
if not font_patterns:
raise RuntimeError('Allocation failed')
fps = font_patterns.contents
for j in range(fps.nfont):
fpat = fps.fonts[j]
fp = lib.FcFontRenderPrepare(0, pat, fpat)
if fp:
lib.FcFontSetAdd(fs, fp)
lib.FcFontSetDestroy(font_patterns)
else:
match_pat = lib.FcFontMatch(0, pat, byref(result))
if pat:
lib.FcFontSetAdd(fs, match_pat)
if result.value != FcResultMatch.value:
lib.FcPatternDestroy(pat)
return matches
font_set = fs.contents
file = pointer(create_string_buffer(chr(0), 5000))
family = pointer(create_string_buffer(chr(0), 200))
weight = c_int(0)
slant = c_int(0)
for j in range(font_set.nfont):
fpat = font_set.fonts[j]
#lib.FcPatternPrint(fpat)
if lib.FcPatternGetString(fpat, 'file', 0, byref(file)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetString(fpat, 'family', 0, byref(family)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetInteger(fpat, 'weight', 0, byref(weight)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetInteger(fpat, 'slant', 0, byref(slant)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
matches.append({
'file' : file.contents.value,
'family' : family.contents.value,
'weight' : weight.value,
'slant' : slant.value,
}
)
lib.FcPatternDestroy(pat)
lib.FcFontSetDestroy(fs)
return matches
def main(args=sys.argv):
print find_font_families()
if len(args) > 1:
print
print files_for_family(args[1])
print
print match(args[1], verbose=True)
return 0
if __name__ == '__main__':
sys.exit(main())

View File

@ -0,0 +1,150 @@
#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import os, sys
from threading import Thread
from calibre.constants import plugins
_fc, _fc_err = plugins['fontconfig']
if _fc is None:
raise RuntimeError('Failed to load fontconfig with error:'+_fc_err)
class FontConfig(Thread):
def __init__(self):
Thread.__init__(self)
self.daemon = True
self.failed = False
def run(self):
config = None
if getattr(sys, 'frameworks_dir', False):
config_dir = os.path.join(os.path.dirname(
getattr(sys, 'frameworks_dir')), 'Resources', 'fonts')
if isinstance(config_dir, unicode):
config_dir = config_dir.encode(sys.getfilesystemencoding())
config = os.path.join(config_dir, 'fonts.conf')
try:
_fc.initialize(config)
except:
import traceback
traceback.print_exc()
self.failed = True
def wait(self):
self.join()
if self.failed:
raise RuntimeError('Failed to initialize fontconfig')
def find_font_families(self, allowed_extensions=['ttf', 'otf']):
'''
Return an alphabetically sorted list of font families available on the system.
`allowed_extensions`: A list of allowed extensions for font file types. Defaults to
`['ttf', 'otf']`. If it is empty, it is ignored.
'''
self.wait()
ans = _fc.find_font_families([bytes('.'+x) for x in allowed_extensions])
ans = sorted(set(ans), cmp=lambda x,y:cmp(x.lower(), y.lower()))
ans2 = []
for x in ans:
try:
ans2.append(x.decode('utf-8'))
except UnicodeDecodeError:
continue
return ans2
def files_for_family(self, family, normalize=True):
'''
Find all the variants in the font family `family`.
Returns a dictionary of tuples. Each tuple is of the form (Full font name, path to font file).
The keys of the dictionary depend on `normalize`. If `normalize` is `False`,
they are a tuple (slant, weight) otherwise they are strings from the set
`('normal', 'bold', 'italic', 'bi', 'light', 'li')`
'''
self.wait()
if isinstance(family, unicode):
family = family.encode('utf-8')
fonts = {}
ofamily = str(family).decode('utf-8')
for fullname, path, style, nfamily, weight, slant in \
_fc.files_for_family(str(family)):
style = (slant, weight)
if normalize:
italic = slant > 0
normal = weight == 80
bold = weight > 80
if italic:
style = 'italic' if normal else 'bi' if bold else 'li'
else:
style = 'normal' if normal else 'bold' if bold else 'light'
try:
fullname, path = fullname.decode('utf-8'), path.decode('utf-8')
nfamily = nfamily.decode('utf-8')
except UnicodeDecodeError:
continue
if style in fonts:
if nfamily.lower().strip() == ofamily.lower().strip() \
and 'Condensed' not in fullname and 'ExtraLight' not in fullname:
fonts[style] = (path, fullname)
else:
fonts[style] = (path, fullname)
return fonts
def match(self, name, all=False, verbose=False):
'''
Find the system font that most closely matches `name`, where `name` is a specification
of the form::
familyname-<pointsize>:<property1=value1>:<property2=value2>...
For example, `verdana:weight=bold:slant=italic`
Returns a list of dictionaries, or a single dictionary.
Each dictionary has the keys:
'weight', 'slant', 'family', 'file', 'fullname', 'style'
`all`: If `True` return a sorted list of matching fonts, where the sort
is in order of decreasing closeness of matching. If `False` only the
best match is returned. '''
self.wait()
if isinstance(name, unicode):
name = name.encode('utf-8')
fonts = []
for fullname, path, style, family, weight, slant in \
_fc.match(str(name), bool(all), bool(verbose)):
try:
fullname = fullname.decode('utf-8')
path = path.decode('utf-8')
style = style.decode('utf-8')
family = family.decode('utf-8')
fonts.append({
'fullname' : fullname,
'path' : path,
'style' : style,
'family' : family,
'weight' : weight,
'slant' : slant
})
except UnicodeDecodeError:
continue
return fonts if all else (fonts[0] if fonts else None)
fontconfig = FontConfig()
fontconfig.start()
def test():
from pprint import pprint;
pprint(fontconfig.find_font_families());
pprint(fontconfig.files_for_family('liberation serif'));
pprint(fontconfig.match('liberation serif:slant=italic:weight=bold', verbose=True))
if __name__ == '__main__':
test()

View File

@ -0,0 +1,331 @@
/*
:mod:`fontconfig` -- Pythonic interface to fontconfig
=====================================================
.. module:: fontconfig
:platform: All
:synopsis: Pythonic interface to the fontconfig library
.. moduleauthor:: Kovid Goyal <kovid@kovidgoyal.net> Copyright 2009
*/
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stdio.h>
#include <string.h>
#include <fontconfig.h>
static PyObject *
fontconfig_initialize(PyObject *self, PyObject *args) {
char *path;
FcBool ok;
FcConfig *config;
PyThreadState *_save;
if (!PyArg_ParseTuple(args, "z", &path))
return NULL;
if (path == NULL) {
_save = PyEval_SaveThread();
ok = FcInit();
PyEval_RestoreThread(_save);
} else {
config = FcConfigCreate();
if (config == NULL) return PyErr_NoMemory();
_save = PyEval_SaveThread();
ok = FcConfigParseAndLoad(config, path, FcTrue);
if (ok) ok = FcConfigBuildFonts(config);
if (ok) ok = FcConfigSetCurrent(config);
PyEval_RestoreThread(_save);
if (!ok) return PyErr_NoMemory();
ok = 1;
}
if (ok) Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
static
fontconfig_cleanup_find(FcPattern *p, FcObjectSet *oset, FcFontSet *fs) {
if (p != NULL) FcPatternDestroy(p);
if (oset != NULL) FcObjectSetDestroy(oset);
if (fs != NULL) FcFontSetDestroy(fs);
}
static PyObject *
fontconfig_find_font_families(PyObject *self, PyObject *args) {
int i;
size_t flen;
char *ext;
Py_ssize_t l, j, extlen;
FcBool ok;
FcPattern *pat, *temp;
FcObjectSet *oset;
FcFontSet *fs;
FcValue v, w;
PyObject *ans, *exts, *t;
ans = PyList_New(0);
fs = NULL; oset = NULL; pat = NULL;
if (ans == NULL) return PyErr_NoMemory();
if (!PyArg_ParseTuple(args, "O", &exts))
return NULL;
if (!PySequence_Check(exts)) {
PyErr_SetString(PyExc_ValueError, "Must pass sequence of extensions");
return NULL;
}
l = PySequence_Size(exts);
pat = FcPatternCreate();
if (pat == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
oset = FcObjectSetCreate();
if (oset == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FILE)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FAMILY)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
fs = FcFontList(FcConfigGetCurrent(), pat, oset);
if (fs == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
for (i = 0; i < fs->nfont; i++) {
temp = fs->fonts[i];
if (temp == NULL) continue;
if (FcPatternGet(temp, FC_FILE, 0, &v) != FcResultMatch) continue;
if (v.type == FcTypeString) {
flen = strlen((char *)v.u.s);
ok = FcFalse;
if (l == 0) ok = FcTrue;
for ( j = 0; j < l && !ok; j++) {
ext = PyBytes_AS_STRING(PySequence_ITEM(exts, j));
extlen = PyBytes_GET_SIZE(PySequence_ITEM(exts, j));
ok = flen > extlen && extlen > 0 &&
PyOS_strnicmp(ext, v.u.s + (flen - extlen), extlen) == 0;
}
if (ok) {
if (FcPatternGet(temp, FC_FAMILY, 0, &w) != FcResultMatch) continue;
if (w.type != FcTypeString) continue;
t = PyString_FromString(w.u.s);
if (t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (PyList_Append(ans, t) != 0)
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
}
}
fontconfig_cleanup_find(pat, oset, fs);
Py_INCREF(ans);
return ans;
}
static PyObject *
fontconfig_files_for_family(PyObject *self, PyObject *args) {
char *family; int i;
FcPattern *pat, *tp;
FcObjectSet *oset;
FcFontSet *fs;
FcValue file, weight, fullname, style, slant, family2;
PyObject *ans, *temp, *t;
if (!PyArg_ParseTuple(args, "s", &family))
return NULL;
ans = PyList_New(0);
if (ans == NULL) return PyErr_NoMemory();
fs = NULL; oset = NULL; pat = NULL;
pat = FcPatternBuild(0, FC_FAMILY, FcTypeString, family, (char *) 0);
if (pat == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
oset = FcObjectSetCreate();
if (oset == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FILE)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_STYLE)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_SLANT)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_WEIGHT)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FAMILY)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, "fullname")) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
fs = FcFontList(FcConfigGetCurrent(), pat, oset);
if (fs == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
for (i = 0; i < fs->nfont; i++) {
tp = fs->fonts[i];
if (tp == NULL) continue;
if (FcPatternGet(tp, FC_FILE, 0, &file) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_STYLE, 0, &style) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_WEIGHT, 0, &weight) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_SLANT, 0, &slant) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_FAMILY, 0, &family2) != FcResultMatch) continue;
if (FcPatternGet(tp, "fullname", 0, &fullname) != FcResultMatch) continue;
temp = PyTuple_New(6);
if(temp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
t = PyBytes_FromString(fullname.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 0, t);
t = PyBytes_FromString(file.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 1, t);
t = PyBytes_FromString(style.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 2, t);
t = PyBytes_FromString(family2.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 3, t);
t = PyInt_FromLong((long)weight.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 4, t);
t = PyInt_FromLong((long)slant.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 5, t);
if (PyList_Append(ans, temp) != 0)
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
fontconfig_cleanup_find(pat, oset, fs);
Py_INCREF(ans);
return ans;
}
static PyObject *
fontconfig_match(PyObject *self, PyObject *args) {
char *namespec; int i;
FcPattern *pat, *tp;
FcObjectSet *oset;
FcFontSet *fs, *fs2;
FcValue file, weight, fullname, style, slant, family;
FcResult res;
PyObject *ans, *temp, *t, *all, *verbose;
if (!PyArg_ParseTuple(args, "sOO", &namespec, &all, &verbose))
return NULL;
ans = PyList_New(0);
if (ans == NULL) return PyErr_NoMemory();
fs = NULL; oset = NULL; pat = NULL; fs2 = NULL;
pat = FcNameParse(namespec);
if (pat == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (PyObject_IsTrue(verbose)) FcPatternPrint(pat);
if (!FcConfigSubstitute(FcConfigGetCurrent(), pat, FcMatchPattern))
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
FcDefaultSubstitute(pat);
fs = FcFontSetCreate();
if (fs == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (PyObject_IsTrue(all)) {
fs2 = FcFontSort(FcConfigGetCurrent(), pat, FcTrue, NULL, &res);
if (fs2 == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
for (i = 0; i < fs2->nfont; i++) {
tp = fs2->fonts[i];
if (tp == NULL) continue;
tp = FcFontRenderPrepare(FcConfigGetCurrent(), pat, tp);
if (tp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcFontSetAdd(fs, tp))
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
if (fs2 != NULL) FcFontSetDestroy(fs2);
} else {
tp = FcFontMatch(FcConfigGetCurrent(), pat, &res);
if (tp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcFontSetAdd(fs, tp))
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
for (i = 0; i < fs->nfont; i++) {
tp = fs->fonts[i];
if (tp == NULL) continue;
if (FcPatternGet(tp, FC_FILE, 0, &file) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_STYLE, 0, &style) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_WEIGHT, 0, &weight) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_SLANT, 0, &slant) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_FAMILY, 0, &family) != FcResultMatch) continue;
if (FcPatternGet(tp, "fullname", 0, &fullname) != FcResultMatch) continue;
temp = PyTuple_New(6);
if(temp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
t = PyBytes_FromString(fullname.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 0, t);
t = PyBytes_FromString(file.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 1, t);
t = PyBytes_FromString(style.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 2, t);
t = PyBytes_FromString(family.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 3, t);
t = PyInt_FromLong((long)weight.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 4, t);
t = PyInt_FromLong((long)slant.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 5, t);
if (PyList_Append(ans, temp) != 0)
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
fontconfig_cleanup_find(pat, oset, fs);
Py_INCREF(ans);
return ans;
}
static
PyMethodDef fontconfig_methods[] = {
{"initialize", fontconfig_initialize, METH_VARARGS,
"initialize(path_to_config_file)\n\n"
"Initialize the library. If path to config file is specified it is used instead of the "
"default configuration. Returns True iff the initialization succeeded."
},
{"find_font_families", fontconfig_find_font_families, METH_VARARGS,
"find_font_families(allowed_extensions)\n\n"
"Find all font families on the system for fonts of the specified types. If no "
"types are specified all font families are returned."
},
{"files_for_family", fontconfig_files_for_family, METH_VARARGS,
"files_for_family(family, normalize)\n\n"
"Find all the variants in the font family `family`. "
"Returns a list of tuples. Each tuple is of the form "
"(fullname, path, style, family, weight, slant). "
},
{"match", fontconfig_match, METH_VARARGS,
"match(namespec,all,verbose)\n\n"
"Find all system fonts that match namespec, in decreasing order "
"of closeness. "
"Returns a list of tuples. Each tuple is of the form "
"(fullname, path, style, family, weight, slant). "
},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initfontconfig(void) {
PyObject *m;
m = Py_InitModule3(
"fontconfig", fontconfig_methods,
"Find fonts."
);
if (m == NULL) return;
}

View File

@ -101,6 +101,10 @@ class Worker(object):
contents = os.path.join(self.osx_contents_dir, 'console.app', 'Contents') contents = os.path.join(self.osx_contents_dir, 'console.app', 'Contents')
resources = os.path.join(contents, 'Resources') resources = os.path.join(contents, 'Resources')
fd = os.path.join(contents, 'Frameworks') fd = os.path.join(contents, 'Frameworks')
sp = os.path.join(resources, 'lib', 'python'+sys.version[:3], 'site-packages.zip')
self.osx_prefix = 'import sys; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd
self.osx_prefix += 'sys.path.insert(0, %s); '%repr(sp)
self._env['PYTHONHOME'] = resources self._env['PYTHONHOME'] = resources
self._env['MAGICK_HOME'] = os.path.join(fd, 'ImageMagick') self._env['MAGICK_HOME'] = os.path.join(fd, 'ImageMagick')
self._env['DYLD_LIBRARY_PATH'] = os.path.join(fd, 'ImageMagick', 'lib') self._env['DYLD_LIBRARY_PATH'] = os.path.join(fd, 'ImageMagick', 'lib')
@ -124,7 +128,7 @@ class Worker(object):
priority = prefs['worker_process_priority'] priority = prefs['worker_process_priority']
cmd = [exe] cmd = [exe]
if isosx: if isosx:
cmd += ['-c', 'from calibre.utils.worker import main; main()'] cmd += ['-c', self.osx_prefix + 'from calibre.utils.ipc.worker import main; main()']
args = { args = {
'env' : env, 'env' : env,
'cwd' : _cwd, 'cwd' : _cwd,

View File

@ -32,8 +32,6 @@ class ClimateProgress(BasicNewsRecipe):
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
remove_tags = [dict(name='a', attrs={'rel':'bookmark'})]
feeds = [(u'Posts', u'http://feeds.feedburner.com/climateprogress/lCrX')] feeds = [(u'Posts', u'http://feeds.feedburner.com/climateprogress/lCrX')]
def preprocess_html(self, soup): def preprocess_html(self, soup):

View File

@ -8,46 +8,37 @@ globeandmail.com
''' '''
from calibre.web.feeds.news import BasicNewsRecipe from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
class GlobeAndMail(BasicNewsRecipe): class GlobeAndMail(BasicNewsRecipe):
title = 'Globe and Mail' title = 'Globe and Mail'
__author__ = 'Kovid Goyal' __author__ = 'Kovid Goyal'
language = _('English') language = _('English')
oldest_article = 2.0
no_stylesheets = True
description = 'Canada\'s national newspaper' description = 'Canada\'s national newspaper'
keep_only_tags = [dict(id='content')] remove_tags_before = dict(id="article-top")
remove_tags = [dict(attrs={'class':'nav'}), dict(id=['related', 'TPphoto', 'secondaryNav', 'articleBottomToolsHolder'])] remove_tags = [
{'id':['util', 'article-tabs', 'comments', 'article-relations',
'gallery-controls', 'video', 'galleryLoading']},
]
remove_tags_after = dict(id='article-content')
def parse_index(self): feeds = [
src = self.browser.open('http://www.theglobeandmail.com/frontpage/').read() ('Latest headlines', 'http://www.theglobeandmail.com/?service=rss'),
soup = BeautifulSoup(src) ('Top stories', 'http://www.theglobeandmail.com/?service=rss&feed=topstories'),
('National', 'http://www.theglobeandmail.com/news/national/?service=rss'),
feeds = [] ('Politics', 'http://www.theglobeandmail.com/news/politics/?service=rss'),
articles = [] ('World', 'http://www.theglobeandmail.com/news/world/?service=rss'),
feed = 'Front Page' ('Business', 'http://www.theglobeandmail.com/report-on-business/?service=rss'),
for tag in soup.findAll(['h3', 'h4']): ('Opinions', 'http://www.theglobeandmail.com/news/opinions/?service=rss'),
if tag.name == 'h3': ('Columnists', 'http://www.theglobeandmail.com/news/opinions/columnists/?service=rss'),
a = tag.find('a', href=True) ('Globe Investor', 'http://www.theglobeandmail.com/globe-investor/?service=rss'),
if a is not None: ('Sports', 'http://www.theglobeandmail.com/sports/?service=rss'),
href = 'http://www.theglobeandmail.com' + a['href'].strip() ('Technology', 'http://www.theglobeandmail.com/news/technology/?service=rss'),
text = a.find(text=True) ('Arts', 'http://www.theglobeandmail.com/news/arts/?service=rss'),
if text: ('Life', 'http://www.theglobeandmail.com/life/?service=rss'),
text = text.strip() ('Blogs', 'http://www.theglobeandmail.com/blogs/?service=rss'),
desc = '' ('Real Estate', 'http://www.theglobeandmail.com/real-estate/?service=rss'),
summary = tag.findNextSiblings('p', attrs={'class':'summary'}, limit=1) ('Auto', 'http://www.theglobeandmail.com/auto/?service=rss'),
if summary: ]
desc = self.tag_to_string(summary[0], False)
articles.append({
'title': text,
'url' : href,
'desc' : desc,
'date' : '',
})
elif tag.name == 'h4':
if articles:
feeds.append((feed, articles))
articles = []
feed = self.tag_to_string(tag, False)
return feeds

View File

@ -18,7 +18,7 @@ class SanFranciscoChronicle(BasicNewsRecipe):
no_stylesheets = True no_stylesheets = True
use_embedded_content = False use_embedded_content = False
keep_only_tags = [dict(name='td' , attrs={'class':'column1 w627'})] remove_tags_before = {'class':'articleheadings'}
remove_tags_after = dict(name='div', attrs={'id':'articlecontent' }) remove_tags_after = dict(name='div', attrs={'id':'articlecontent' })
remove_tags = [ remove_tags = [
dict(name='div', attrs={'class':'tools tools_top'}) dict(name='div', attrs={'class':'tools tools_top'})

3
todo
View File

@ -1,9 +1,6 @@
* Refactor web.fetch.simple to use per connection timeouts via the timeout kwarg for mechanize.open * Refactor web.fetch.simple to use per connection timeouts via the timeout kwarg for mechanize.open
* Rationalize books table. Add a pubdate column, remove the uri column (and associated support in add_books) and convert series_index to a float.
- test adding/recusrsize adding and adding of duplicates
* Testing framework * Testing framework
* MOBI navigation indexing support * MOBI navigation indexing support

View File

@ -707,6 +707,15 @@ class stage1(OptionlessCommand):
('upload_demo', None), ('upload_demo', None),
] ]
class betas(OptionlessCommand):
description = 'Build an upload beta builds to the servers'
sub_commands = [ ('update', None), ('stage2', None) ]
def run(self):
OptionlessCommand.run(self)
check_call('scp dist/* divok:'+BETAS, shell=True)
class upload(OptionlessCommand): class upload(OptionlessCommand):
description = 'Build and upload calibre to the servers' description = 'Build and upload calibre to the servers'