libre.patch 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. --- calibre-3.46.0.orig/manual/conversion.rst 2019-07-18 22:19:21.000000000 -0500
  2. +++ calibre-3.46.0/manual/conversion.rst 2019-08-26 01:03:19.365098742 -0500
  3. @@ -747,7 +747,7 @@
  4. Comic book collections
  5. ~~~~~~~~~~~~~~~~~~~~~~~~~
  6. -A comic book collection is a .cbc file. A .cbc file is a ZIP file that contains other CBZ/CBR files. In addition the
  7. +A comic book collection is a .cbc file. A .cbc file is a ZIP file that contains other CBZ files. In addition the
  8. .cbc file must contain a simple text file called comics.txt, encoded in UTF-8. The comics.txt file must contain
  9. a list of the comics files inside the .cbc file, in the form filename:title, as shown below::
  10. --- calibre-3.46.0.orig/manual/faq.rst 2019-07-18 22:19:21.000000000 -0500
  11. +++ calibre-3.46.0/manual/faq.rst 2019-08-26 01:07:40.285096018 -0500
  12. @@ -18,7 +18,7 @@
  13. calibre supports the conversion of many input formats to many output formats.
  14. It can convert every input format in the following list, to every output format.
  15. -*Input Formats:* AZW, AZW3, AZW4, CBZ, CBR, CBC, CHM, DJVU, DOCX, EPUB, FB2, FBZ, HTML, HTMLZ, LIT, LRF, MOBI, ODT, PDF, PRC, PDB, PML, RB, RTF, SNB, TCR, TXT, TXTZ
  16. +*Input Formats:* AZW, AZW3, AZW4, CBZ, CBC, CHM, DJVU, DOCX, EPUB, FB2, FBZ, HTML, HTMLZ, LIT, LRF, MOBI, ODT, PDF, PRC, PDB, PML, RB, RTF, SNB, TCR, TXT, TXTZ
  17. *Output Formats:* AZW3, EPUB, DOCX, FB2, HTMLZ, OEB, LIT, LRF, MOBI, PDB, PMLZ, RB, PDF, RTF, SNB, TCR, TXT, TXTZ, ZIP
  18. --- calibre-3.46.0.orig/manual/gui.rst 2019-07-18 22:19:21.000000000 -0500
  19. +++ calibre-3.46.0/manual/gui.rst 2019-08-26 01:09:15.315095026 -0500
  20. @@ -51,7 +51,7 @@
  21. 3. **Add books from directories, including sub-directories (Multiple books per directory, assumes every e-book file is a different book)**: Allows you to choose a directory. The directory and all its sub-directories are scanned recursively and any e-books found are added to the library. calibre assumes that each directory contains many books. All e-book files with the same name in a directory are assumed to be the same book in different formats. E-books with different names are added as different books.
  22. - 4. **Add multiple books from archive (ZIP/RAR)**: Allows you to add multiple e-books that are stored inside the selected ZIP or RAR files. It is a convenient shortcut that avoids having to first unzip the archive and then add the books via one of the above two options.
  23. + 4. **Add multiple books from archive (ZIP)**: Allows you to add multiple e-books that are stored inside the selected ZIP files. It is a convenient shortcut that avoids having to first unzip the archive and then add the books via one of the above two options.
  24. 5. **Add empty book (Book Entry with no formats)**: Allows you to create a blank book record. This can be used to then manually fill out the information about a book that you may not have yet in your collection.
  25. --- calibre-3.46.0.orig/resources/mime.types 2019-07-18 22:19:21.000000000 -0500
  26. +++ calibre-3.46.0/resources/mime.types 2019-08-26 01:12:33.905092952 -0500
  27. @@ -138,7 +138,6 @@
  28. application/prs.nprend
  29. application/prs.plucker
  30. application/qsig
  31. -application/rar rar
  32. application/rdf+xml rdf
  33. application/reginfo+xml rif
  34. application/relax-ng-compact-syntax rnc
  35. @@ -849,7 +848,6 @@
  36. application/x-pkcs7-crl crl
  37. application/x-python-code pyc pyo
  38. application/x-quicktimeplayer qtl
  39. -application/x-rar-compressed rar
  40. application/x-redhat-package-manager rpm
  41. application/x-sh sh
  42. application/x-shar shar
  43. @@ -1372,7 +1370,6 @@
  44. application/x-kindle-application azw2
  45. application/x-mobi8-ebook azw3
  46. application/x-cbz cbz
  47. -application/x-cbr cbr
  48. application/x-cb7 cb7
  49. application/x-cbc cbc
  50. application/x-koboreader-ebook kobo
  51. --- calibre-3.46.0.orig/setup/resources.py 2019-07-18 22:19:21.000000000 -0500
  52. +++ calibre-3.46.0/setup/resources.py 2019-08-26 16:14:52.537133971 -0500
  53. @@ -348,7 +348,7 @@
  54. log = Log()
  55. # log.outputs = []
  56. for inf in supported_input_formats():
  57. - if inf in ('zip', 'rar', 'oebzip'):
  58. + if inf in ('zip', 'oebzip'):
  59. continue
  60. for ouf in available_output_formats():
  61. of = ouf if ouf == 'oeb' else 'dummy.'+ouf
  62. --- calibre-3.46.0.orig/src/calibre/customize/builtins.py 2019-07-18 22:19:21.000000000 -0500
  63. +++ calibre-3.46.0/src/calibre/customize/builtins.py 2019-08-26 16:19:10.547135583 -0500
  64. @@ -133,7 +133,7 @@
  65. class ComicMetadataReader(MetadataReaderPlugin):
  66. name = 'Read comic metadata'
  67. - file_types = {'cbr', 'cbz'}
  68. + file_types = {'cbz'}
  69. description = _('Extract cover from comic files')
  70. def customization_help(self, gui=False):
  71. @@ -144,19 +144,14 @@
  72. pos = stream.tell()
  73. id_ = stream.read(3)
  74. stream.seek(pos)
  75. - if id_ == b'Rar':
  76. - ftype = 'cbr'
  77. - elif id_.startswith(b'PK'):
  78. + if id_.startswith(b'PK'):
  79. ftype = 'cbz'
  80. - if ftype == 'cbr':
  81. - from calibre.utils.unrar import extract_cover_image
  82. - else:
  83. - from calibre.libunzip import extract_cover_image
  84. + from calibre.libunzip import extract_cover_image
  85. from calibre.ebooks.metadata import MetaInformation
  86. ret = extract_cover_image(stream)
  87. mi = MetaInformation(None, None)
  88. stream.seek(0)
  89. - if ftype in {'cbr', 'cbz'}:
  90. + if ftype in {'cbz'}:
  91. series_index = self.site_customization
  92. if series_index not in {'volume', 'issue'}:
  93. series_index = 'volume'
  94. @@ -355,17 +350,6 @@
  95. return get_metadata(stream)
  96. -class RARMetadataReader(MetadataReaderPlugin):
  97. -
  98. - name = 'Read RAR metadata'
  99. - file_types = {'rar'}
  100. - description = _('Read metadata from e-books in RAR archives')
  101. -
  102. - def get_metadata(self, stream, ftype):
  103. - from calibre.ebooks.metadata.rar import get_metadata
  104. - return get_metadata(stream)
  105. -
  106. -
  107. class RBMetadataReader(MetadataReaderPlugin):
  108. name = 'Read RB metadata'
  109. --- calibre-3.46.0.orig/src/calibre/customize/ui.py 2019-07-18 22:19:21.000000000 -0500
  110. +++ calibre-3.46.0/src/calibre/customize/ui.py 2019-08-26 16:22:32.957136847 -0500
  111. @@ -538,7 +538,7 @@
  112. if not is_disabled(plugin):
  113. for format in plugin.file_types:
  114. formats.add(format)
  115. - formats.add('zip'), formats.add('rar')
  116. + formats.add('zip')
  117. return formats
  118. --- calibre-3.46.0.orig/src/calibre/devices/kobo/driver.py 2019-07-18 22:19:21.000000000 -0500
  119. +++ calibre-3.46.0/src/calibre/devices/kobo/driver.py 2019-08-26 16:24:06.647137432 -0500
  120. @@ -92,7 +92,7 @@
  121. book_class = Book
  122. # Ordered list of supported formats
  123. - FORMATS = ['kepub', 'epub', 'pdf', 'txt', 'cbz', 'cbr']
  124. + FORMATS = ['kepub', 'epub', 'pdf', 'txt', 'cbz']
  125. CAN_SET_METADATA = ['collections']
  126. VENDOR_ID = [0x2237]
  127. --- calibre-3.46.0.orig/src/calibre/devices/misc.py 2019-07-18 22:19:21.000000000 -0500
  128. +++ calibre-3.46.0/src/calibre/devices/misc.py 2019-08-26 16:25:22.907137908 -0500
  129. @@ -448,7 +448,7 @@
  130. EBOOK_DIR_MAIN = 'Documents'
  131. SCAN_FROM_ROOT = True
  132. - VENDOR_NAME = ['ROCKCHIP', 'CBR']
  133. + VENDOR_NAME = ['ROCKCHIP']
  134. WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['RK28_SDK_DEMO', 'EINK_EBOOK_READE']
  135. SUPPORTS_SUB_DIRS = True
  136. --- calibre-3.46.0.orig/src/calibre/devices/mtp/filesystem_cache.py 2019-07-18 22:19:21.000000000 -0500
  137. +++ calibre-3.46.0/src/calibre/devices/mtp/filesystem_cache.py 2019-08-26 16:26:18.837138258 -0500
  138. @@ -17,7 +17,7 @@
  139. from calibre.utils.icu import sort_key, lower
  140. from calibre.ebooks import BOOK_EXTENSIONS
  141. -bexts = frozenset(BOOK_EXTENSIONS) - {'mbp', 'tan', 'rar', 'zip', 'xml'}
  142. +bexts = frozenset(BOOK_EXTENSIONS) - {'mbp', 'tan', 'zip', 'xml'}
  143. class FileOrFolder(object):
  144. --- calibre-3.46.0.orig/src/calibre/ebooks/comic/__init__.py 2019-07-18 22:19:21.000000000 -0500
  145. +++ calibre-3.46.0/src/calibre/ebooks/comic/__init__.py 2019-08-26 16:28:07.637138937 -0500
  146. @@ -6,7 +6,7 @@
  147. __docformat__ = 'restructuredtext en'
  148. '''
  149. -Convert CBR/CBZ files to LRF.
  150. +Convert CBZ files to LRF.
  151. '''
  152. import sys
  153. --- calibre-3.46.0.orig/src/calibre/ebooks/conversion/plugins/comic_input.py 2019-07-18 22:19:21.000000000 -0500
  154. +++ calibre-3.46.0/src/calibre/ebooks/conversion/plugins/comic_input.py 2019-08-26 16:30:49.127139946 -0500
  155. @@ -20,8 +20,8 @@
  156. name = 'Comic Input'
  157. author = 'Kovid Goyal'
  158. - description = 'Optimize comic files (.cbz, .cbr, .cbc) for viewing on portable devices'
  159. - file_types = {'cbz', 'cbr', 'cbc'}
  160. + description = 'Optimize comic files (.cbz, .cbc) for viewing on portable devices'
  161. + file_types = {'cbz', 'cbc'}
  162. is_image_collection = True
  163. commit_name = 'comic_input'
  164. core_usage = -1
  165. --- calibre-3.46.0.orig/src/calibre/ebooks/conversion/plumber.py 2019-07-18 22:19:21.000000000 -0500
  166. +++ calibre-3.46.0/src/calibre/ebooks/conversion/plumber.py 2019-08-26 16:32:33.387140597 -0500
  167. @@ -46,7 +46,7 @@
  168. def supported_input_formats():
  169. fmts = available_input_formats()
  170. - for x in ('zip', 'rar', 'oebzip'):
  171. + for x in ('zip', 'oebzip'):
  172. fmts.add(x)
  173. return fmts
  174. @@ -67,7 +67,7 @@
  175. self.global_reporter(global_frac, msg)
  176. -ARCHIVE_FMTS = ('zip', 'rar', 'oebzip')
  177. +ARCHIVE_FMTS = ('zip', 'oebzip')
  178. class Plumber(object):
  179. --- calibre-3.46.0.orig/src/calibre/ebooks/__init__.py 2019-07-18 22:19:21.000000000 -0500
  180. +++ calibre-3.46.0/src/calibre/ebooks/__init__.py 2019-08-26 16:33:48.557141066 -0500
  181. @@ -33,9 +33,9 @@
  182. pass
  183. -BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'txtz', 'text', 'htm', 'xhtm',
  184. +BOOK_EXTENSIONS = ['lrf', 'zip', 'rtf', 'lit', 'txt', 'txtz', 'text', 'htm', 'xhtm',
  185. 'html', 'htmlz', 'xhtml', 'pdf', 'pdb', 'updb', 'pdr', 'prc', 'mobi', 'azw', 'doc',
  186. - 'epub', 'fb2', 'fbz', 'djv', 'djvu', 'lrx', 'cbr', 'cbz', 'cbc', 'oebzip',
  187. + 'epub', 'fb2', 'fbz', 'djv', 'djvu', 'lrx', 'cbz', 'cbc', 'oebzip',
  188. 'rb', 'imp', 'odt', 'chm', 'tpz', 'azw1', 'pml', 'pmlz', 'mbp', 'tan', 'snb',
  189. 'xps', 'oxps', 'azw4', 'book', 'zbf', 'pobi', 'docx', 'docm', 'md',
  190. 'textile', 'markdown', 'ibook', 'ibooks', 'iba', 'azw3', 'ps', 'kepub', 'kfx']
  191. --- calibre-3.46.0.orig/src/calibre/ebooks/metadata/archive.py 2019-07-18 22:19:21.000000000 -0500
  192. +++ calibre-3.46.0/src/calibre/ebooks/metadata/archive.py 2019-08-26 16:47:19.547146131 -0500
  193. @@ -30,8 +30,6 @@
  194. ans = None
  195. if id_ == stringFileHeader:
  196. ans = 'zip'
  197. - elif id_.startswith(b'Rar'):
  198. - ans = 'rar'
  199. try:
  200. stream.seek(pos)
  201. except Exception:
  202. @@ -43,24 +41,16 @@
  203. name = 'Archive Extract'
  204. author = 'Kovid Goyal'
  205. description = _('Extract common e-book formats from archive files '
  206. - '(ZIP/RAR). Also try to autodetect if they are actually '
  207. - 'CBZ/CBR files.')
  208. - file_types = {'zip', 'rar'}
  209. + '(ZIP). Also try to autodetect if they are actually '
  210. + 'CBZ files.')
  211. + file_types = set(['zip'])
  212. supported_platforms = ['windows', 'osx', 'linux']
  213. on_import = True
  214. def run(self, archive):
  215. from calibre.utils.zipfile import ZipFile
  216. - is_rar = archive.lower().endswith('.rar')
  217. - if is_rar:
  218. - from calibre.utils.unrar import extract_member, names
  219. - else:
  220. - zf = ZipFile(archive, 'r')
  221. -
  222. - if is_rar:
  223. - fnames = list(names(archive))
  224. - else:
  225. - fnames = zf.namelist()
  226. + zf = ZipFile(archive, 'r')
  227. + fnames = zf.namelist()
  228. def fname_ok(fname):
  229. bn = os.path.basename(fname).lower()
  230. @@ -76,7 +66,7 @@
  231. fnames = list(filter(fname_ok, fnames))
  232. if is_comic(fnames):
  233. - ext = '.cbr' if is_rar else '.cbz'
  234. + ext = '.cbz'
  235. of = self.temporary_file('_archive_extract'+ext)
  236. with open(archive, 'rb') as f:
  237. of.write(f.read())
  238. @@ -93,11 +83,7 @@
  239. of = self.temporary_file('_archive_extract.'+ext)
  240. with closing(of):
  241. - if is_rar:
  242. - data = extract_member(archive, match=None, name=fname)[1]
  243. - of.write(data)
  244. - else:
  245. - of.write(zf.read(fname))
  246. + of.write(zf.read(fname))
  247. return of.name
  248. @@ -168,8 +154,5 @@
  249. from calibre.utils.zipfile import ZipFile
  250. zf = ZipFile(stream)
  251. comment = zf.comment
  252. - elif stream_type == 'cbr':
  253. - from calibre.utils.unrar import comment as get_comment
  254. - comment = get_comment(stream)
  255. return parse_comic_comment(comment or b'{}', series_index=series_index)
  256. --- calibre-3.46.0.orig/src/calibre/ebooks/oeb/iterator/book.py 2019-07-18 22:19:21.000000000 -0500
  257. +++ calibre-3.46.0/src/calibre/ebooks/oeb/iterator/book.py 2019-08-26 16:48:49.227146691 -0500
  258. @@ -160,7 +160,7 @@
  259. else:
  260. ordered = [i for i in self.opf.spine if i.is_linear] + \
  261. [i for i in self.opf.spine if not i.is_linear]
  262. - is_comic = input_fmt.lower() in {'cbc', 'cbz', 'cbr', 'cb7'}
  263. + is_comic = input_fmt.lower() in {'cbc', 'cbz', 'cb7'}
  264. for i in ordered:
  265. spath = i.path
  266. mt = None
  267. --- calibre-3.46.0.orig/src/calibre/gui2/actions/add.py 2019-07-18 22:19:21.000000000 -0500
  268. +++ calibre-3.46.0/src/calibre/gui2/actions/add.py 2019-08-26 17:12:43.337155648 -0500
  269. @@ -37,8 +37,8 @@
  270. (_('HTML books'), ['htm', 'html', 'xhtm', 'xhtml']),
  271. (_('LIT books'), ['lit']),
  272. (_('Text books'), ['txt', 'text', 'rtf', 'md', 'markdown', 'textile', 'txtz']),
  273. - (_('Comics'), ['cbz', 'cbr', 'cbc']),
  274. - (_('Archives'), ['zip', 'rar']),
  275. + (_('Comics'), ['cbz', 'cbc']),
  276. + (_('Archives'), ['zip']),
  277. (_('Wordprocessor files'), ['odt', 'doc', 'docx']),
  278. ]
  279. @@ -65,7 +65,7 @@
  280. 'sub-directories (Multiple books per directory, assumes every '
  281. 'e-book file is a different book)')).triggered.connect(
  282. self.add_recursive_multiple)
  283. - arm = self.add_archive_menu = self.add_menu.addMenu(_('Add multiple books from archive (ZIP/RAR)'))
  284. + arm = self.add_archive_menu = self.add_menu.addMenu(_('Add multiple books from archive (ZIP)'))
  285. connect_lambda(self.create_menu_action(
  286. arm, 'recursive-single-archive', _('One book per directory in the archive')).triggered,
  287. self, lambda self: self.add_archive(True))
  288. @@ -247,7 +247,7 @@
  289. def add_archive(self, single):
  290. paths = choose_files(
  291. self.gui, 'recursive-archive-add', _('Choose archive file'),
  292. - filters=[(_('Archives'), ('zip', 'rar'))], all_files=False, select_only_single_file=False)
  293. + filters=[(_('Archives'), ('zip'))], all_files=False, select_only_single_file=False)
  294. if paths:
  295. self.do_add_recursive(paths, single, list_of_archives=True)
  296. --- calibre-3.46.0.orig/src/calibre/gui2/actions/preferences.py 2019-07-18 22:19:21.000000000 -0500
  297. +++ calibre-3.46.0/src/calibre/gui2/actions/preferences.py 2019-08-26 17:14:54.687156468 -0500
  298. @@ -29,8 +29,6 @@
  299. pm.addAction(QIcon(I('config.png')), _('Preferences'), self.do_config)
  300. cm('welcome wizard', _('Run Welcome &wizard'),
  301. icon='wizard.png', triggered=self.gui.run_wizard)
  302. - cm('plugin updater', _('Get plugins to enhance calibre'),
  303. - icon='plugins/plugin_updater.png', triggered=self.get_plugins)
  304. if not DEBUG:
  305. pm.addSeparator()
  306. cm('restart', _('Restart in debug mode'), icon='debug.png',
  307. --- calibre-3.46.0.orig/src/calibre/gui2/add.py 2019-07-18 22:19:21.000000000 -0500
  308. +++ calibre-3.46.0/src/calibre/gui2/add.py 2019-08-26 17:16:14.817156968 -0500
  309. @@ -167,9 +167,6 @@
  310. prints('Corrupt ZIP file, trying to use local headers')
  311. from calibre.utils.localunzip import extractall
  312. extractall(source, tdir)
  313. - elif source.lower().endswith('.rar'):
  314. - from calibre.utils.unrar import extract
  315. - extract(source, tdir)
  316. return tdir
  317. try:
  318. --- calibre-3.46.0.orig/src/calibre/gui2/__init__.py 2019-07-18 22:19:21.000000000 -0500
  319. +++ calibre-3.46.0/src/calibre/gui2/__init__.py 2019-08-26 17:20:41.207158632 -0500
  320. @@ -206,8 +206,6 @@
  321. help=_('Confirm before deleting'))
  322. c.add_opt('main_window_geometry', default=None,
  323. help=_('Main window geometry'))
  324. - c.add_opt('new_version_notification', default=True,
  325. - help=_('Notify when a new version is available'))
  326. c.add_opt('use_roman_numerals_for_series_number', default=True,
  327. help=_('Use Roman numerals for series number'))
  328. c.add_opt('sort_tags_by', default='name',
  329. --- calibre-3.46.0.orig/src/calibre/gui2/preferences/behavior.py 2019-07-18 22:19:21.000000000 -0500
  330. +++ calibre-3.46.0/src/calibre/gui2/preferences/behavior.py 2019-08-26 17:21:59.877159123 -0500
  331. @@ -41,7 +41,6 @@
  332. r('network_timeout', prefs)
  333. - r('new_version_notification', config)
  334. r('upload_news_to_device', config)
  335. r('delete_news_from_library_on_upload', config)
  336. @@ -141,7 +140,7 @@
  337. input_map = prefs['input_format_order']
  338. all_formats = set()
  339. self.opt_input_order.clear()
  340. - for fmt in all_input_formats().union({'ZIP', 'RAR'}):
  341. + for fmt in all_input_formats().union({'ZIP'}):
  342. all_formats.add(fmt.upper())
  343. for format in input_map + list(all_formats.difference(input_map)):
  344. item = QListWidgetItem(format, self.opt_input_order)
  345. --- calibre-3.46.0.orig/src/calibre/gui2/preferences/behavior.ui 2019-07-18 22:19:21.000000000 -0500
  346. +++ calibre-3.46.0/src/calibre/gui2/preferences/behavior.ui 2019-08-26 17:23:20.187159625 -0500
  347. @@ -16,13 +16,6 @@
  348. <layout class="QHBoxLayout" name="horizontalLayout">
  349. <item>
  350. <layout class="QFormLayout" name="formLayout">
  351. - <item row="0" column="0" colspan="2">
  352. - <widget class="QCheckBox" name="opt_new_version_notification">
  353. - <property name="text">
  354. - <string>Notify when a &amp;new version is available</string>
  355. - </property>
  356. - </widget>
  357. - </item>
  358. <item row="3" column="0" colspan="2">
  359. <widget class="QCheckBox" name="opt_upload_news_to_device">
  360. <property name="text">
  361. --- calibre-3.46.0.orig/src/calibre/gui2/update.py 2019-07-18 22:19:21.000000000 -0500
  362. +++ calibre-3.46.0/src/calibre/gui2/update.py 2019-08-26 17:30:02.797162139 -0500
  363. @@ -7,15 +7,13 @@ import re, ssl, json
  364. from threading import Thread, Event
  365. from PyQt5.Qt import (QObject, pyqtSignal, Qt, QUrl, QDialog, QGridLayout,
  366. - QLabel, QCheckBox, QDialogButtonBox, QIcon)
  367. + QLabel, QCheckBox, QIcon)
  368. -from calibre.constants import (__appname__, __version__, iswindows, isosx,
  369. +from calibre.constants import (__appname__, iswindows, isosx,
  370. isportable, is64bit, numeric_version)
  371. from calibre import prints, as_unicode
  372. -from calibre.utils.config import prefs
  373. from calibre.utils.localization import localize_website_link
  374. -from calibre.utils.https import get_https_resource_securely
  375. -from calibre.gui2 import config, dynamic, open_url
  376. +from calibre.gui2 import dynamic, open_url
  377. from calibre.gui2.dialogs.plugin_updater import get_plugin_updates_available
  378. from calibre.utils.serialize import msgpack_dumps, msgpack_loads
  379. from polyglot.binary import as_hex_unicode, from_hex_bytes
  380. @@ -35,35 +33,7 @@ def get_download_url():
  381. def get_newest_version():
  382. - try:
  383. - icon_theme_name = json.loads(I('icon-theme.json', data=True))['name']
  384. - except Exception:
  385. - icon_theme_name = ''
  386. - headers={
  387. - 'CALIBRE-VERSION':__version__,
  388. - 'CALIBRE-OS': ('win' if iswindows else 'osx' if isosx else 'oth'),
  389. - 'CALIBRE-INSTALL-UUID': prefs['installation_uuid'],
  390. - 'CALIBRE-ICON-THEME': icon_theme_name,
  391. - }
  392. - try:
  393. - version = get_https_resource_securely(URL, headers=headers)
  394. - except ssl.SSLError as err:
  395. - if getattr(err, 'reason', None) != 'CERTIFICATE_VERIFY_FAILED':
  396. - raise
  397. - # certificate verification failed, since the version check contains no
  398. - # critical information, ignore and proceed
  399. - # We have to do this as if the calibre CA certificate ever
  400. - # needs to be revoked, then we wont be able to do version checks
  401. - version = get_https_resource_securely(URL, headers=headers, cacerts=None)
  402. - try:
  403. - version = version.decode('utf-8').strip()
  404. - except UnicodeDecodeError:
  405. - version = ''
  406. - ans = NO_CALIBRE_UPDATE
  407. - m = re.match(unicode_type(r'(\d+)\.(\d+).(\d+)$'), version)
  408. - if m is not None:
  409. - ans = tuple(map(int, (m.group(1), m.group(2), m.group(3))))
  410. - return ans
  411. + return NO_CALIBRE_UPDATE
  412. class Signal(QObject):
  413. @@ -85,12 +55,6 @@ class CheckForUpdates(Thread):
  414. while not self.shutdown_event.is_set():
  415. calibre_update_version = NO_CALIBRE_UPDATE
  416. plugins_update_found = 0
  417. - try:
  418. - version = get_newest_version()
  419. - if version[:2] > numeric_version[:2]:
  420. - calibre_update_version = version
  421. - except Exception as e:
  422. - prints('Failed to check for calibre update:', as_unicode(e))
  423. try:
  424. update_plugins = get_plugin_updates_available(raise_error=True)
  425. if update_plugins is not None:
  426. @@ -150,11 +114,6 @@ class UpdateNotification(QDialog):
  427. self.setWindowIcon(QIcon(I('lt.png')))
  428. self.l.addWidget(self.logo, 0, 0)
  429. self.l.addWidget(self.label, 0, 1)
  430. - self.cb = QCheckBox(
  431. - _('Show this notification for future updates'), self)
  432. - self.l.addWidget(self.cb, 1, 0, 1, -1)
  433. - self.cb.setChecked(config.get('new_version_notification'))
  434. - self.cb.stateChanged.connect(self.show_future)
  435. self.bb = QDialogButtonBox(self)
  436. b = self.bb.addButton(_('&Get update'), self.bb.AcceptRole)
  437. b.setDefault(True)
  438. @@ -182,9 +141,6 @@ class UpdateNotification(QDialog):
  439. if gui is not None:
  440. gui.quit(restart=True)
  441. - def show_future(self, *args):
  442. - config.set('new_version_notification', bool(self.cb.isChecked()))
  443. -
  444. def accept(self):
  445. open_url(QUrl(get_download_url()))
  446. @@ -232,7 +188,7 @@ class UpdateMixin(object):
  447. self.status_bar.update_label.setVisible(True)
  448. if has_calibre_update:
  449. - if (force or (config.get('new_version_notification') and not is_version_notified(calibre_version))):
  450. + if force:
  451. if not no_show_popup:
  452. self._update_notification__ = UpdateNotification(calibre_version,
  453. number_of_plugin_updates, parent=self)
  454. --- calibre-3.46.0.orig/src/calibre/__init__.py 2019-07-18 22:19:21.000000000 -0500
  455. +++ calibre-3.46.0/src/calibre/__init__.py 2019-08-26 17:31:50.377162811 -0500
  456. @@ -254,10 +254,7 @@
  457. # First use the file header to identify its type
  458. with open(path, 'rb') as f:
  459. id_ = f.read(3)
  460. - if id_ == b'Rar':
  461. - from calibre.utils.unrar import extract as rarextract
  462. - extractor = rarextract
  463. - elif id_.startswith(b'PK'):
  464. + if id_.startswith(b'PK'):
  465. from calibre.libunzip import extract as zipextract
  466. extractor = zipextract
  467. if extractor is None:
  468. @@ -266,9 +263,6 @@
  469. if ext in ['zip', 'cbz', 'epub', 'oebzip']:
  470. from calibre.libunzip import extract as zipextract
  471. extractor = zipextract
  472. - elif ext in ['cbr', 'rar']:
  473. - from calibre.utils.unrar import extract as rarextract
  474. - extractor = rarextract
  475. if extractor is None:
  476. raise Exception('Unknown archive type')
  477. extractor(path, dir)
  478. --- calibre-3.46.0.orig/src/calibre/linux.py 2019-07-18 22:19:21.000000000 -0500
  479. +++ calibre-3.46.0/src/calibre/linux.py 2019-08-26 17:33:01.557163256 -0500
  480. @@ -338,7 +338,7 @@
  481. ):
  482. for fmt in fmts:
  483. is_input = group_title == input_group
  484. - if is_input and fmt in {'rar', 'zip', 'oebzip'}:
  485. + if is_input and fmt in {'zip', 'oebzip'}:
  486. continue
  487. p = (get_parser(input_fmt=fmt) if is_input
  488. else get_parser(output_fmt=fmt))
  489. --- calibre-3.46.0.orig/src/calibre/srv/render_book.py 2019-07-18 22:19:21.000000000 -0500
  490. +++ calibre-3.46.0/src/calibre/srv/render_book.py 2019-08-26 17:33:53.057163577 -0500
  491. @@ -190,7 +190,7 @@
  492. 'spine':spine,
  493. 'link_uid': uuid4(),
  494. 'book_hash': book_hash,
  495. - 'is_comic': input_fmt.lower() in {'cbc', 'cbz', 'cbr', 'cb7'},
  496. + 'is_comic': input_fmt.lower() in {'cbc', 'cbz', 'cb7'},
  497. 'raster_cover_name': raster_cover_name,
  498. 'title_page_name': titlepage_name,
  499. 'has_maths': False,
  500. --- calibre-3.46.0.orig/src/calibre/srv/tests/loop.py 2019-07-18 22:19:21.000000000 -0500
  501. +++ calibre-3.46.0/src/calibre/srv/tests/loop.py 2019-08-26 17:35:18.047164108 -0500
  502. @@ -110,27 +110,6 @@
  503. with TestServer(lambda data:(data.path[0] + data.read()), listen_on='1.1.1.1', fallback_to_detected_interface=True, specialize=specialize) as server:
  504. self.assertNotEqual('1.1.1.1', server.address[0])
  505. - @skipIf(is_ci, 'Continuous Integration servers do not support BonJour')
  506. - def test_bonjour(self):
  507. - 'Test advertising via BonJour'
  508. - from calibre.srv.bonjour import BonJour
  509. - if ispy3:
  510. - from zeroconf import Zeroconf
  511. - else:
  512. - from calibre.utils.Zeroconf import Zeroconf
  513. - b = BonJour(wait_for_stop=False)
  514. - with TestServer(lambda data:(data.path[0] + data.read()), plugins=(b,), shutdown_timeout=5) as server:
  515. - self.assertTrue(b.started.wait(5), 'BonJour not started')
  516. - self.ae(b.advertised_port, server.address[1])
  517. - service = b.services[0]
  518. - self.ae(service.type, '_calibre._tcp.local.')
  519. - r = Zeroconf()
  520. - info = r.get_service_info(service.type, service.name)
  521. - self.assertIsNotNone(info)
  522. - self.ae(info.text, b'\npath=/opds')
  523. -
  524. - self.assertTrue(b.stopped.wait(5), 'BonJour not stopped')
  525. -
  526. def test_dual_stack(self):
  527. from calibre.srv.loop import IPPROTO_IPV6
  528. with TestServer(lambda data:(data.path[0] + data.read().decode('utf-8')), listen_on='::') as server:
  529. --- calibre-3.46.0.orig/src/calibre/test_build.py 2019-07-18 22:19:21.000000000 -0500
  530. +++ calibre-3.46.0/src/calibre/test_build.py 2019-08-26 17:36:49.697164680 -0500
  531. @@ -236,10 +236,6 @@
  532. from calibre.gui2.win_file_dialogs import test
  533. test()
  534. - def test_unrar(self):
  535. - from calibre.utils.unrar import test_basic
  536. - test_basic()
  537. -
  538. @unittest.skipUnless(iswindows, 'WPD is windows only')
  539. def test_wpd(self):
  540. wpd = plugins['wpd'][0]
  541. --- calibre-3.46.0.orig/src/calibre/utils/file_type_icons.py 2019-07-18 22:19:21.000000000 -0500
  542. +++ calibre-3.46.0/src/calibre/utils/file_type_icons.py 2019-08-26 17:40:50.577166185 -0500
  543. @@ -15,7 +15,6 @@
  544. 'png' : 'png',
  545. 'bmp' : 'bmp',
  546. 'cbz' : 'cbz',
  547. - 'cbr' : 'cbr',
  548. 'svg' : 'svg',
  549. 'html' : 'html',
  550. 'htmlz' : 'html',
  551. @@ -27,7 +26,6 @@
  552. 'lrx' : 'lrx',
  553. 'pdf' : 'pdf',
  554. 'pdr' : 'zero',
  555. - 'rar' : 'rar',
  556. 'zip' : 'zip',
  557. 'txt' : 'txt',
  558. 'text' : 'txt',
  559. --- calibre-3.46.0.orig/src/calibre/utils/search_query_parser_test.py 2019-07-18 22:19:21.000000000 -0500
  560. +++ calibre-3.46.0/src/calibre/utils/search_query_parser_test.py 2019-08-26 17:48:14.897168960 -0500
  561. @@ -30,16 +30,16 @@
  562. u'Tor Books',
  563. u'lrf'],
  564. 8: [u'Stalky and Co.', u'Rudyard Kipling', u'manybooks.net', u'lrf'],
  565. - 9: [u'A Game of Thrones', u'George R. R. Martin', None, u'lrf,rar'],
  566. - 10: [u'A Clash of Kings', u'George R. R. Martin', None, u'lrf,rar'],
  567. - 11: [u'A Storm of Swords', u'George R. R. Martin', None, u'lrf,rar'],
  568. + 9: [u'A Game of Thrones', u'George R. R. Martin', None, u'lrf'],
  569. + 10: [u'A Clash of Kings', u'George R. R. Martin', None, u'lrf'],
  570. + 11: [u'A Storm of Swords', u'George R. R. Martin', None, u'lrf'],
  571. 12: [u'Biggles - Pioneer Air Fighter', u'W. E. Johns', None, u'lrf,rtf'],
  572. 13: [u'Biggles of the Camel Squadron',
  573. u'W. E. Johns',
  574. u'London:Thames, (1977)',
  575. u'lrf,rtf'],
  576. - 14: [u'A Feast for Crows', u'George R. R. Martin', None, u'lrf,rar'],
  577. - 15: [u'Cryptonomicon', u'Neal Stephenson', None, u'lrf,rar'],
  578. + 14: [u'A Feast for Crows', u'George R. R. Martin', None, u'lrf'],
  579. + 15: [u'Cryptonomicon', u'Neal Stephenson', None, u'lrf'],
  580. 16: [u'Quicksilver', u'Neal Stephenson', None, u'lrf,zip'],
  581. 17: [u'The Comedies of William Shakespeare',
  582. u'William Shakespeare',
  583. @@ -54,15 +54,15 @@
  584. None,
  585. u'lrf'],
  586. 20: [u'An Ideal Husband', u'Oscar Wilde', u'manybooks.net', u'lrf'],
  587. - 21: [u'Flight of the Nighthawks', u'Raymond E. Feist', None, u'lrf,rar'],
  588. - 22: [u'Into a Dark Realm', u'Raymond E. Feist', None, u'lrf,rar'],
  589. - 23: [u'The Sundering', u'Walter Jon Williams', None, u'lrf,rar'],
  590. - 24: [u'The Praxis', u'Walter Jon Williams', None, u'lrf,rar'],
  591. - 25: [u'Conventions of War', u'Walter Jon Williams', None, u'lrf,rar'],
  592. - 26: [u'Banewreaker', u'Jacqueline Carey', None, u'lrf,rar'],
  593. - 27: [u'Godslayer', u'Jacqueline Carey', None, u'lrf,rar'],
  594. - 28: [u"Kushiel's Scion", u'Jacqueline Carey', None, u'lrf,rar'],
  595. - 29: [u'Underworld', u'Don DeLillo', None, u'lrf,rar'],
  596. + 21: [u'Flight of the Nighthawks', u'Raymond E. Feist', None, u'lrf'],
  597. + 22: [u'Into a Dark Realm', u'Raymond E. Feist', None, u'lrf'],
  598. + 23: [u'The Sundering', u'Walter Jon Williams', None, u'lrf'],
  599. + 24: [u'The Praxis', u'Walter Jon Williams', None, u'lrf'],
  600. + 25: [u'Conventions of War', u'Walter Jon Williams', None, u'lrf'],
  601. + 26: [u'Banewreaker', u'Jacqueline Carey', None, u'lrf'],
  602. + 27: [u'Godslayer', u'Jacqueline Carey', None, u'lrf'],
  603. + 28: [u"Kushiel's Scion", u'Jacqueline Carey', None, u'lrf'],
  604. + 29: [u'Underworld', u'Don DeLillo', None, u'lrf'],
  605. 30: [u'Genghis Khan and The Making of the Modern World',
  606. u'Jack Weatherford Orc',
  607. u'Three Rivers Press',
  608. @@ -73,9 +73,9 @@
  609. u'lrf,zip'],
  610. 32: [u'The Killer Angels', u'Michael Shaara', None, u'html,lrf'],
  611. 33: [u'Band Of Brothers', u'Stephen E Ambrose', None, u'lrf,txt'],
  612. - 34: [u'The Gates of Rome', u'Conn Iggulden', None, u'lrf,rar'],
  613. + 34: [u'The Gates of Rome', u'Conn Iggulden', None, u'lrf'],
  614. 35: [u'The Death of Kings', u'Conn Iggulden', u'Bantam Dell', u'lit,lrf'],
  615. - 36: [u'The Field of Swords', u'Conn Iggulden', None, u'lrf,rar'],
  616. + 36: [u'The Field of Swords', u'Conn Iggulden', None, u'lrf'],
  617. 37: [u'Masterman Ready', u'Marryat, Captain Frederick', None, u'lrf'],
  618. 38: [u'With the Lightnings',
  619. u'David Drake',
  620. @@ -88,16 +88,16 @@
  621. 40: [u'The Far Side of The Stars',
  622. u'David Drake',
  623. u'Baen Publishing Enterprises',
  624. - u'lrf,rar'],
  625. + u'lrf'],
  626. 41: [u'The Way to Glory',
  627. u'David Drake',
  628. u'Baen Publishing Enterprises',
  629. - u'lrf,rar'],
  630. - 42: [u'Some Golden Harbor', u'David Drake', u'Baen Books', u'lrf,rar'],
  631. + u'lrf'],
  632. + 42: [u'Some Golden Harbor', u'David Drake', u'Baen Books', u'lrf'],
  633. 43: [u'Harry Potter And The Half-Blood Prince',
  634. u'J. K. Rowling',
  635. None,
  636. - u'lrf,rar'],
  637. + u'lrf'],
  638. 44: [u'Harry Potter and the Order of the Phoenix',
  639. u'J. K. Rowling',
  640. None,
  641. @@ -106,12 +106,12 @@
  642. 46: [u'The Stars at War II',
  643. u'Steve White',
  644. u'Baen Publishing Enterprises',
  645. - u'lrf,rar'],
  646. - 47: [u'Exodus', u'Steve White,Shirley Meier', u'Baen Books', u'lrf,rar'],
  647. + u'lrf'],
  648. + 47: [u'Exodus', u'Steve White,Shirley Meier', u'Baen Books', u'lrf'],
  649. 48: [u'Harry Potter and the Goblet of Fire',
  650. u'J. K. Rowling',
  651. None,
  652. - u'lrf,rar'],
  653. + u'lrf'],
  654. 49: [u'Harry Potter and the Prisoner of Azkaban',
  655. u'J. K. Rowling',
  656. None,
  657. @@ -124,20 +124,20 @@
  658. u'J.K. Rowling',
  659. None,
  660. u'lit,lrf,pdf'],
  661. - 52: [u"His Majesty's Dragon", u'Naomi Novik', None, u'lrf,rar'],
  662. + 52: [u"His Majesty's Dragon", u'Naomi Novik', None, u'lrf'],
  663. 53: [u'Throne of Jade', u'Naomi Novik', u'Del Rey', u'lit,lrf'],
  664. - 54: [u'Black Powder War', u'Naomi Novik', u'Del Rey', u'lrf,rar'],
  665. + 54: [u'Black Powder War', u'Naomi Novik', u'Del Rey', u'lrf'],
  666. 55: [u'War and Peace', u'Leo Tolstoy', u'gutenberg.org', u'lrf,txt'],
  667. 56: [u'Anna Karenina', u'Leo Tolstoy', u'gutenberg.org', u'lrf,txt'],
  668. 57: [u'A Shorter History of Rome',
  669. u'Eugene Lawrence,Sir William Smith',
  670. u'gutenberg.org',
  671. u'lrf,zip'],
  672. - 58: [u'The Name of the Rose', u'Umberto Eco', None, u'lrf,rar'],
  673. + 58: [u'The Name of the Rose', u'Umberto Eco', None, u'lrf'],
  674. 71: [u"Wind Rider's Oath", u'David Weber', u'Baen', u'lrf'],
  675. 74: [u'Rally Cry', u'William R Forstchen', None, u'htm,lrf'],
  676. - 86: [u'Empire of Ivory', u'Naomi Novik', None, u'lrf,rar'],
  677. - 87: [u"Renegade's Magic", u'Robin Hobb', None, u'lrf,rar'],
  678. + 86: [u'Empire of Ivory', u'Naomi Novik', None, u'lrf'],
  679. + 87: [u"Renegade's Magic", u'Robin Hobb', None, u'lrf'],
  680. 89: [u'Master and commander',
  681. u"Patrick O'Brian",
  682. u'Fontana,\n1971',
  683. @@ -145,7 +145,7 @@
  684. 91: [u'A Companion to Wolves',
  685. u'Sarah Monette,Elizabeth Beär',
  686. None,
  687. - u'lrf,rar'],
  688. + u'lrf'],
  689. 92: [u'The Lions of al-Rassan', u'Guy Gavriel Kay', u'Eos', u'lit,lrf'],
  690. 93: [u'Gardens of the Moon', u'Steven Erikson', u'Tor Fantasy', u'lit,lrf'],
  691. 95: [u'The Master and Margarita',
  692. @@ -169,7 +169,7 @@
  693. 144: [u'Atonement',
  694. u'Ian McEwan',
  695. u'New York : Nan A. Talese/Doubleday, 2002.',
  696. - u'lrf,rar'],
  697. + u'lrf'],
  698. 146: [u'1632', u'Eric Flint', u'Baen Books', u'lit,lrf'],
  699. 147: [u'1633', u'David Weber,Eric Flint,Dru Blair', u'Baen', u'lit,lrf'],
  700. 148: [u'1634: The Baltic War',
  701. @@ -222,7 +222,7 @@
  702. 253: [u"Hunter's Run",
  703. u'George R. R. Martin,Gardner Dozois,Daniel Abraham',
  704. u'Eos',
  705. - u'lrf,rar'],
  706. + u'lrf'],
  707. 257: [u'Knife of Dreams', u'Robert Jordan', None, u'lit,lrf'],
  708. 258: [u'Saturday',
  709. u'Ian McEwan',
  710. @@ -242,7 +242,7 @@
  711. u'New York : Random House, 2005.',
  712. u'lit,lrf'],
  713. 269: [u'Reap the Whirlwind', u'David Mack', u'Star Trek', u'lit,lrf'],
  714. - 272: [u'Mistborn', u'Brandon Sanderson', u'Tor Fantasy', u'lrf,rar'],
  715. + 272: [u'Mistborn', u'Brandon Sanderson', u'Tor Fantasy', u'lrf'],
  716. 273: [u'The Thousandfold Thought',
  717. u'R. Scott Bakker',
  718. u'Overlook TP',
  719. @@ -250,17 +250,17 @@
  720. 276: [u'Elantris',
  721. u'Brandon Sanderson',
  722. u'New York : Tor, 2005.',
  723. - u'lrf,rar'],
  724. + u'lrf'],
  725. 291: [u'Sundiver',
  726. u'David Brin',
  727. u'New York : Bantam Books, 1995.',
  728. u'lit,lrf'],
  729. - 299: [u'Imperium', u'Robert Harris', u'Arrow', u'lrf,rar'],
  730. + 299: [u'Imperium', u'Robert Harris', u'Arrow', u'lrf'],
  731. 300: [u'Startide Rising', u'David Brin', u'Bantam', u'htm,lrf'],
  732. 301: [u'The Uplift War', u'David Brin', u'Spectra', u'lit,lrf'],
  733. - 304: [u'Brightness Reef', u'David Brin', u'Orbit', u'lrf,rar'],
  734. + 304: [u'Brightness Reef', u'David Brin', u'Orbit', u'lrf'],
  735. 305: [u"Infinity's Shore", u'David Brin', u'Spectra', u'txt'],
  736. - 306: [u"Heaven's Reach", u'David Brin', u'Spectra', u'lrf,rar'],
  737. + 306: [u"Heaven's Reach", u'David Brin', u'Spectra', u'lrf'],
  738. 325: [u"Foundation's Triumph", u'David Brin', u'Easton Press', u'lit,lrf'],
  739. 327: [u'I am Charlotte Simmons', u'Tom Wolfe', u'Vintage', u'htm,lrf'],
  740. 335: [u'The Currents of Space', u'Isaac Asimov', None, u'lit,lrf'],
  741. @@ -290,15 +290,15 @@
  742. u'Aspect',
  743. u'lit,lrf'],
  744. 356: [u'The Naked God', u'Peter F. Hamilton', u'Aspect', u'lit,lrf'],
  745. - 421: [u'A Shadow in Summer', u'Daniel Abraham', u'Tor Fantasy', u'lrf,rar'],
  746. + 421: [u'A Shadow in Summer', u'Daniel Abraham', u'Tor Fantasy', u'lrf'],
  747. 427: [u'Lonesome Dove', u'Larry M\\cMurtry', None, u'lit,lrf'],
  748. 440: [u'Ghost', u'John Ringo', u'Baen', u'lit,lrf'],
  749. 441: [u'Kildar', u'John Ringo', u'Baen', u'lit,lrf'],
  750. - 443: [u'Hidden Empire ', u'Kevin J. Anderson', u'Aspect', u'lrf,rar'],
  751. + 443: [u'Hidden Empire ', u'Kevin J. Anderson', u'Aspect', u'lrf'],
  752. 444: [u'The Gun Seller',
  753. u'Hugh Laurie',
  754. u'Washington Square Press',
  755. - u'lrf,rar']
  756. + u'lrf']
  757. }
  758. tests = {