diff options
author | Omar Vega Ramos <ovruni@gnu.org.pe> | 2018-08-09 01:50:31 -0500 |
---|---|---|
committer | Omar Vega Ramos <ovruni@gnu.org.pe> | 2018-08-09 01:50:31 -0500 |
commit | 8660e94571b5eebdea4888aff9e4732050e9a2e9 (patch) | |
tree | fb1116e81e71dfed0263792c1257864b2adfe5f6 /libre | |
parent | 23b1861afdb2cbebbd88877ebc4c06d5961cead1 (diff) | |
download | abslibre-8660e94571b5eebdea4888aff9e4732050e9a2e9.tar.gz abslibre-8660e94571b5eebdea4888aff9e4732050e9a2e9.tar.bz2 abslibre-8660e94571b5eebdea4888aff9e4732050e9a2e9.zip |
calibre-3.28.0-2.parabola1: updating version
Diffstat (limited to 'libre')
-rw-r--r-- | libre/calibre/PKGBUILD | 27 | ||||
-rw-r--r-- | libre/calibre/libre.patch | 860 |
2 files changed, 874 insertions, 13 deletions
diff --git a/libre/calibre/PKGBUILD b/libre/calibre/PKGBUILD index 6f7e7c6d5..2c624f00d 100644 --- a/libre/calibre/PKGBUILD +++ b/libre/calibre/PKGBUILD @@ -15,8 +15,8 @@ # - removed decrompession engine for rar archives pkgname=calibre -pkgver=3.20.0 -pkgrel=1 +pkgver=3.28.0 +pkgrel=2 pkgrel+=.parabola1 pkgdesc="Ebook management application" pkgdesc+=", without nonfree decompression engine for RAR archives" @@ -32,28 +32,29 @@ depends=('python2-six' 'python2-dateutil' 'python2-cssutils' 'python2-dukpy' 'python2-netifaces' 'python2-cssselect' 'python2-apsw' 'qt5-webkit' 'qt5-svg' 'python2-regex' 'python2-pygments' 'mtdev' 'desktop-file-utils' 'gtk-update-icon-cache' 'optipng' 'udisks2') -makedepends=('qt5-x11extras' 'xdg-utils') +makedepends=('qt5-x11extras' 'sip' 'xdg-utils') optdepends=('ipython2: to use calibre-debug' 'poppler: required for converting pdf to html' ) -# for updated libre.patch commit id see: https://gitlab.com/libreforks/calibre/tags -_commit='d4f41a48fd0110c1df9219ccbbda335b' source=("https://download.calibre-ebook.com/${pkgver}/calibre-${pkgver}.tar.xz" - "https://calibre-ebook.com/signatures/${pkgname}-${pkgver}.tar.xz.sig") -source+=("https://gitlab.com/libreforks/calibre/uploads/$_commit/libre.patch") -sha256sums=('be3e82f455f154db154c46d57f8f4d93d4e1c79afc9b6b1eb316c3d48880d5e6' + "https://calibre-ebook.com/signatures/${pkgname}-${pkgver}.tar.xz.sig" + 'libre.patch') +sha256sums=('241050cb89e5a70d3195cfd91ccf406919ac0bfb437e34b538c954c306d87b2c' 'SKIP' - '72a44e11013582eed029463e51906a677648d40ac34bd9afceb289eaa81e080b') -validpgpkeys=('3CE1780F78DD88DF45194FD706BC317B515ACE7C') + 'eebb25512888b663c30ff3bd642d8b6af0edffbed5b019d12a47bbcf18a8dced') +validpgpkeys=('3CE1780F78DD88DF45194FD706BC317B515ACE7C') # Kovid Goyal (New longer key) <kovid@kovidgoyal.net> -prepare(){ +prepare() { cd "${pkgname}-${pkgver}" # Remove unneeded files - rm -rf resources/${pkgname}-portable.* + rm -rf resources/calibre-portable.* # fix freedom issues - rm -rf resources/images/mimetypes/{cbr,rar}.png + rm -v imgsrc/mimetypes/rar.svg + rm -v src/calibre/ebooks/metadata/rar.py + rm -v src/calibre/utils/unrar.py + rm -v resources/images/mimetypes/{cbr,rar}.png patch -fNp1 -i "$srcdir/libre.patch" # Desktop integration (e.g. enforce arch defaults) diff --git a/libre/calibre/libre.patch b/libre/calibre/libre.patch new file mode 100644 index 000000000..34a8eca82 --- /dev/null +++ b/libre/calibre/libre.patch @@ -0,0 +1,860 @@ +--- calibre-3.28.0.orig/COPYRIGHT 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/COPYRIGHT 2018-08-08 17:04:07.751015011 -0500 +@@ -16,11 +16,6 @@ + Copyright: Various + License: BSD + +-Files: src/unrar/* +-Copyright: Various +-License: Non-free +- Code can be distributed freely. +- + Files: src/html5lib/* + Copyright: Copyright (c) 2006-2013 James Graham and other contributors + License: Expat +--- calibre-3.28.0.orig/manual/conversion.rst 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/manual/conversion.rst 2018-08-08 17:08:36.492073334 -0500 +@@ -747,7 +747,7 @@ + Comic book collections + ~~~~~~~~~~~~~~~~~~~~~~~~~ + +-A comic book collection is a .cbc file. A .cbc file is a ZIP file that contains other CBZ/CBR files. In addition the ++A comic book collection is a .cbc file. A .cbc file is a ZIP file that contains other CBZ files. In addition the + .cbc file must contain a simple text file called comics.txt, encoded in UTF-8. The comics.txt file must contain + a list of the comics files inside the .cbc file, in the form filename:title, as shown below:: + +--- calibre-3.28.0.orig/manual/faq.rst 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/manual/faq.rst 2018-08-08 17:21:55.402248998 -0500 +@@ -18,7 +18,7 @@ + calibre supports the conversion of many input formats to many output formats. + It can convert every input format in the following list, to every output format. + +-*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 ++*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 + + *Output Formats:* AZW3, EPUB, DOCX, FB2, HTMLZ, OEB, LIT, LRF, MOBI, PDB, PMLZ, RB, PDF, RTF, SNB, TCR, TXT, TXTZ, ZIP + +--- calibre-3.28.0.orig/manual/gui.rst 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/manual/gui.rst 2018-08-08 17:24:37.468179812 -0500 +@@ -51,7 +51,7 @@ + + 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. + +- 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. ++ 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. + + 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. + +--- calibre-3.28.0.orig/resources/mime.types 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/resources/mime.types 2018-08-08 17:28:00.022261290 -0500 +@@ -138,7 +138,6 @@ + application/prs.nprend + application/prs.plucker + application/qsig +-application/rar rar + application/rdf+xml rdf + application/reginfo+xml rif + application/relax-ng-compact-syntax rnc +@@ -849,7 +848,6 @@ + application/x-pkcs7-crl crl + application/x-python-code pyc pyo + application/x-quicktimeplayer qtl +-application/x-rar-compressed rar + application/x-redhat-package-manager rpm + application/x-sh sh + application/x-shar shar +@@ -1372,7 +1370,6 @@ + application/x-kindle-application azw2 + application/x-mobi8-ebook azw3 + application/x-cbz cbz +-application/x-cbr cbr + application/x-cb7 cb7 + application/x-cbc cbc + application/x-koboreader-ebook kobo +--- calibre-3.28.0.orig/session.vim 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/session.vim 2018-08-08 17:29:03.712685501 -0500 +@@ -10,7 +10,6 @@ + \'/usr/include/qt', + \'/usr/include/freetype2', + \'/usr/include/fontconfig', +- \'src/unrar', + \] + let g:syntastic_c_include_dirs = g:syntastic_cpp_include_dirs + let g:syntastic_python_flake8_exec = 'flake8-python2' +--- calibre-3.28.0.orig/setup/resources.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/setup/resources.py 2018-08-08 17:30:33.135267704 -0500 +@@ -341,7 +341,7 @@ + log = Log() + # log.outputs = [] + for inf in supported_input_formats(): +- if inf in ('zip', 'rar', 'oebzip'): ++ if inf in ('zip', 'oebzip'): + continue + for ouf in available_output_formats(): + of = ouf if ouf == 'oeb' else 'dummy.'+ouf +--- calibre-3.28.0.orig/src/calibre/__init__.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/__init__.py 2018-08-08 17:32:28.929978667 -0500 +@@ -292,10 +292,7 @@ + # First use the file header to identify its type + with open(path, 'rb') as f: + id_ = f.read(3) +- if id_ == b'Rar': +- from calibre.utils.unrar import extract as rarextract +- extractor = rarextract +- elif id_.startswith(b'PK'): ++ if id_.startswith(b'PK'): + from calibre.libunzip import extract as zipextract + extractor = zipextract + if extractor is None: +@@ -304,9 +301,6 @@ + if ext in ['zip', 'cbz', 'epub', 'oebzip']: + from calibre.libunzip import extract as zipextract + extractor = zipextract +- elif ext in ['cbr', 'rar']: +- from calibre.utils.unrar import extract as rarextract +- extractor = rarextract + if extractor is None: + raise Exception('Unknown archive type') + extractor(path, dir) +--- calibre-3.28.0.orig/src/calibre/customize/builtins.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/customize/builtins.py 2018-08-08 17:40:15.368673625 -0500 +@@ -132,7 +132,7 @@ + class ComicMetadataReader(MetadataReaderPlugin): + + name = 'Read comic metadata' +- file_types = set(['cbr', 'cbz']) ++ file_types = set(['cbz']) + description = _('Extract cover from comic files') + + def customization_help(self, gui=False): +@@ -143,19 +143,14 @@ + pos = stream.tell() + id_ = stream.read(3) + stream.seek(pos) +- if id_ == b'Rar': +- ftype = 'cbr' +- elif id_.startswith(b'PK'): ++ if id_.startswith(b'PK'): + ftype = 'cbz' +- if ftype == 'cbr': +- from calibre.utils.unrar import extract_cover_image +- else: +- from calibre.libunzip import extract_cover_image ++ from calibre.libunzip import extract_cover_image + from calibre.ebooks.metadata import MetaInformation + ret = extract_cover_image(stream) + mi = MetaInformation(None, None) + stream.seek(0) +- if ftype in {'cbr', 'cbz'}: ++ if ftype in {'cbz'}: + series_index = self.site_customization + if series_index not in {'volume', 'issue'}: + series_index = 'volume' +@@ -354,17 +349,6 @@ + return get_metadata(stream) + + +-class RARMetadataReader(MetadataReaderPlugin): +- +- name = 'Read RAR metadata' +- file_types = set(['rar']) +- description = _('Read metadata from e-books in RAR archives') +- +- def get_metadata(self, stream, ftype): +- from calibre.ebooks.metadata.rar import get_metadata +- return get_metadata(stream) +- +- + class RBMetadataReader(MetadataReaderPlugin): + + name = 'Read RB metadata' +--- calibre-3.28.0.orig/src/calibre/customize/ui.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/customize/ui.py 2018-08-08 17:41:34.028414098 -0500 +@@ -537,7 +537,7 @@ + if not is_disabled(plugin): + for format in plugin.file_types: + formats.add(format) +- formats.add('zip'), formats.add('rar') ++ formats.add('zip') + return formats + + +--- calibre-3.28.0.orig/src/calibre/devices/kobo/driver.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/devices/kobo/driver.py 2018-08-08 17:43:35.452867917 -0500 +@@ -85,7 +85,7 @@ + book_class = Book + + # Ordered list of supported formats +- FORMATS = ['kepub', 'epub', 'pdf', 'txt', 'cbz', 'cbr'] ++ FORMATS = ['kepub', 'epub', 'pdf', 'txt', 'cbz'] + CAN_SET_METADATA = ['collections'] + + VENDOR_ID = [0x2237] +--- calibre-3.28.0.orig/src/calibre/devices/misc.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/devices/misc.py 2018-08-08 17:45:28.051058218 -0500 +@@ -448,7 +448,7 @@ + EBOOK_DIR_MAIN = 'Documents' + SCAN_FROM_ROOT = True + +- VENDOR_NAME = ['ROCKCHIP', 'CBR'] ++ VENDOR_NAME = ['ROCKCHIP'] + WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = ['RK28_SDK_DEMO', 'EINK_EBOOK_READE'] + SUPPORTS_SUB_DIRS = True + +--- calibre-3.28.0.orig/src/calibre/devices/mtp/filesystem_cache.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/devices/mtp/filesystem_cache.py 2018-08-08 17:46:49.257349041 -0500 +@@ -18,7 +18,7 @@ + from calibre.utils.icu import sort_key, lower + from calibre.ebooks import BOOK_EXTENSIONS + +-bexts = frozenset(BOOK_EXTENSIONS) - {'mbp', 'tan', 'rar', 'zip', 'xml'} ++bexts = frozenset(BOOK_EXTENSIONS) - {'mbp', 'tan', 'zip', 'xml'} + + + class FileOrFolder(object): +--- calibre-3.28.0.orig/src/calibre/ebooks/__init__.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/ebooks/__init__.py 2018-08-08 17:49:03.961196312 -0500 +@@ -30,9 +30,9 @@ + pass + + +-BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'txtz', 'text', 'htm', 'xhtm', ++BOOK_EXTENSIONS = ['lrf', 'zip', 'rtf', 'lit', 'txt', 'txtz', 'text', 'htm', 'xhtm', + 'html', 'htmlz', 'xhtml', 'pdf', 'pdb', 'updb', 'pdr', 'prc', 'mobi', 'azw', 'doc', +- 'epub', 'fb2', 'fbz', 'djv', 'djvu', 'lrx', 'cbr', 'cbz', 'cbc', 'oebzip', ++ 'epub', 'fb2', 'fbz', 'djv', 'djvu', 'lrx', 'cbz', 'cbc', 'oebzip', + 'rb', 'imp', 'odt', 'chm', 'tpz', 'azw1', 'pml', 'pmlz', 'mbp', 'tan', 'snb', + 'xps', 'oxps', 'azw4', 'book', 'zbf', 'pobi', 'docx', 'docm', 'md', + 'textile', 'markdown', 'ibook', 'ibooks', 'iba', 'azw3', 'ps', 'kepub', 'kfx'] +--- calibre-3.28.0.orig/src/calibre/ebooks/comic/__init__.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/ebooks/comic/__init__.py 2018-08-08 17:50:32.240497402 -0500 +@@ -4,7 +4,7 @@ + __docformat__ = 'restructuredtext en' + + ''' +-Convert CBR/CBZ files to LRF. ++Convert CBZ files to LRF. + ''' + + import sys +--- calibre-3.28.0.orig/src/calibre/ebooks/conversion/plugins/comic_input.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/ebooks/conversion/plugins/comic_input.py 2018-08-08 17:52:07.292822461 -0500 +@@ -18,8 +18,8 @@ + + name = 'Comic Input' + author = 'Kovid Goyal' +- description = 'Optimize comic files (.cbz, .cbr, .cbc) for viewing on portable devices' +- file_types = set(['cbz', 'cbr', 'cbc']) ++ description = 'Optimize comic files (.cbz, .cbc) for viewing on portable devices' ++ file_types = set(['cbz', 'cbc']) + is_image_collection = True + commit_name = 'comic_input' + core_usage = -1 +--- calibre-3.28.0.orig/src/calibre/ebooks/conversion/plumber.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/ebooks/conversion/plumber.py 2018-08-08 17:54:43.382359585 -0500 +@@ -43,7 +43,7 @@ + + def supported_input_formats(): + fmts = available_input_formats() +- for x in ('zip', 'rar', 'oebzip'): ++ for x in ('zip', 'oebzip'): + fmts.add(x) + return fmts + +@@ -64,7 +64,7 @@ + self.global_reporter(global_frac, msg) + + +-ARCHIVE_FMTS = ('zip', 'rar', 'oebzip') ++ARCHIVE_FMTS = ('zip', 'oebzip') + + + class Plumber(object): +--- calibre-3.28.0.orig/src/calibre/ebooks/metadata/archive.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/ebooks/metadata/archive.py 2018-08-08 17:58:43.264736057 -0500 +@@ -29,8 +29,6 @@ + ans = None + if id_ == stringFileHeader: + ans = 'zip' +- elif id_.startswith('Rar'): +- ans = 'rar' + try: + stream.seek(pos) + except: +@@ -42,24 +40,16 @@ + name = 'Archive Extract' + author = 'Kovid Goyal' + description = _('Extract common e-book formats from archive files ' +- '(ZIP/RAR). Also try to autodetect if they are actually ' +- 'CBZ/CBR files.') +- file_types = set(['zip', 'rar']) ++ '(ZIP). Also try to autodetect if they are actually ' ++ 'CBZ files.') ++ file_types = set(['zip']) + supported_platforms = ['windows', 'osx', 'linux'] + on_import = True + + def run(self, archive): + from calibre.utils.zipfile import ZipFile +- is_rar = archive.lower().endswith('.rar') +- if is_rar: +- from calibre.utils.unrar import extract_member, names +- else: +- zf = ZipFile(archive, 'r') +- +- if is_rar: +- fnames = list(names(archive)) +- else: +- fnames = zf.namelist() ++ zf = ZipFile(archive, 'r') ++ fnames = zf.namelist() + + def fname_ok(fname): + bn = os.path.basename(fname).lower() +@@ -75,7 +65,7 @@ + + fnames = list(filter(fname_ok, fnames)) + if is_comic(fnames): +- ext = '.cbr' if is_rar else '.cbz' ++ ext = '.cbz' + of = self.temporary_file('_archive_extract'+ext) + with open(archive, 'rb') as f: + of.write(f.read()) +@@ -92,11 +82,7 @@ + + of = self.temporary_file('_archive_extract.'+ext) + with closing(of): +- if is_rar: +- data = extract_member(archive, match=None, name=fname)[1] +- of.write(data) +- else: +- of.write(zf.read(fname)) ++ of.write(zf.read(fname)) + return of.name + + +@@ -159,9 +145,6 @@ + from calibre.utils.zipfile import ZipFile + zf = ZipFile(stream) + comment = zf.comment +- elif stream_type == 'cbr': +- from calibre.utils.unrar import comment as get_comment +- comment = get_comment(stream) + + if comment: + import json +--- calibre-3.28.0.orig/src/calibre/ebooks/oeb/iterator/book.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/ebooks/oeb/iterator/book.py 2018-08-08 18:00:54.085427361 -0500 +@@ -157,7 +157,7 @@ + self.spine = [] + Spiny = partial(SpineItem, read_anchor_map=read_anchor_map, read_links=read_links, + run_char_count=run_char_count, from_epub=self.book_format == 'EPUB') +- is_comic = input_fmt.lower() in {'cbc', 'cbz', 'cbr', 'cb7'} ++ is_comic = input_fmt.lower() in {'cbc', 'cbz', 'cb7'} + for i in ordered: + spath = i.path + mt = None +--- calibre-3.28.0.orig/src/calibre/ebooks/pdf/from_comic.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/ebooks/pdf/from_comic.py 2018-08-08 18:02:19.338200024 -0500 +@@ -3,7 +3,7 @@ + __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' + __docformat__ = 'restructuredtext en' + +-'Convert a comic in CBR/CBZ format to pdf' ++'Convert a comic in CBZ format to pdf' + + import sys + from functools import partial +--- calibre-3.28.0.orig/src/calibre/gui2/__init__.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/__init__.py 2018-08-08 18:06:17.667314109 -0500 +@@ -146,7 +146,7 @@ + defs['cover_grid_show_title'] = False + defs['cover_grid_texture'] = None + defs['show_vl_tabs'] = False +- defs['vl_tabs_closable'] = True ++ defs['closable_tabs'] = True + defs['show_highlight_toggle_button'] = False + defs['add_comments_to_email'] = False + defs['cb_preserve_aspect_ratio'] = False +@@ -189,8 +189,6 @@ + help=_('Confirm before deleting')) + c.add_opt('main_window_geometry', default=None, + help=_('Main window geometry')) +- c.add_opt('new_version_notification', default=True, +- help=_('Notify when a new version is available')) + c.add_opt('use_roman_numerals_for_series_number', default=True, + help=_('Use Roman numerals for series number')) + c.add_opt('sort_tags_by', default='name', +--- calibre-3.28.0.orig/src/calibre/gui2/actions/add.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/actions/add.py 2018-08-08 18:12:40.156510208 -0500 +@@ -36,8 +36,8 @@ + (_('HTML books'), ['htm', 'html', 'xhtm', 'xhtml']), + (_('LIT books'), ['lit']), + (_('Text books'), ['txt', 'text', 'rtf', 'md', 'markdown', 'textile', 'txtz']), +- (_('Comics'), ['cbz', 'cbr', 'cbc']), +- (_('Archives'), ['zip', 'rar']), ++ (_('Comics'), ['cbz', 'cbc']), ++ (_('Archives'), ['zip']), + (_('Wordprocessor files'), ['odt', 'doc', 'docx']), + ] + +@@ -64,7 +64,7 @@ + 'sub-directories (Multiple books per directory, assumes every ' + 'e-book file is a different book)')).triggered.connect( + self.add_recursive_multiple) +- arm = self.add_archive_menu = self.add_menu.addMenu(_('Add multiple books from archive (ZIP/RAR)')) ++ arm = self.add_archive_menu = self.add_menu.addMenu(_('Add multiple books from archive (ZIP)')) + self.create_menu_action(arm, 'recursive-single-archive', _( + 'One book per directory in the archive')).triggered.connect(partial(self.add_archive, True)) + self.create_menu_action(arm, 'recursive-multiple-archive', _( +@@ -199,7 +199,7 @@ + def add_archive(self, single): + paths = choose_files( + self.gui, 'recursive-archive-add', _('Choose archive file'), +- filters=[(_('Archives'), ('zip', 'rar'))], all_files=False, select_only_single_file=False) ++ filters=[(_('Archives'), ('zip'))], all_files=False, select_only_single_file=False) + if paths: + self.do_add_recursive(paths, single, list_of_archives=True) + +--- calibre-3.28.0.orig/src/calibre/gui2/actions/preferences.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/actions/preferences.py 2018-08-08 18:18:23.010850001 -0500 +@@ -29,8 +29,6 @@ + pm.addAction(QIcon(I('config.png')), _('Preferences'), self.do_config) + cm('welcome wizard', _('Run Welcome &wizard'), + icon='wizard.png', triggered=self.gui.run_wizard) +- cm('plugin updater', _('Get plugins to enhance calibre'), +- icon='plugins/plugin_updater.png', triggered=self.get_plugins) + if not DEBUG: + pm.addSeparator() + cm('restart', _('Restart in debug mode'), icon='debug.png', +--- calibre-3.28.0.orig/src/calibre/gui2/add.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/add.py 2018-08-08 18:20:08.403118707 -0500 +@@ -167,9 +167,6 @@ + prints('Corrupt ZIP file, trying to use local headers') + from calibre.utils.localunzip import extractall + extractall(source, tdir) +- elif source.lower().endswith('.rar'): +- from calibre.utils.unrar import extract +- extract(source, tdir) + return tdir + + try: +--- calibre-3.28.0.orig/src/calibre/gui2/dialogs/comicconf.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/dialogs/comicconf.py 2018-08-08 18:21:23.623016298 -0500 +@@ -33,7 +33,7 @@ + class ComicConf(QDialog, Ui_Dialog): + + def __init__(self, window, config_defaults=None, generic=True, +- title=_('Set defaults for conversion of comics (CBR/CBZ files)')): ++ title=_('Set defaults for conversion of comics (CBZ files)')): + QDialog.__init__(self, window) + Ui_Dialog.__init__(self) + self.setupUi(self) +--- calibre-3.28.0.orig/src/calibre/gui2/preferences/behavior.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/preferences/behavior.py 2018-08-08 18:23:06.608312344 -0500 +@@ -40,7 +40,6 @@ + + r('network_timeout', prefs) + +- r('new_version_notification', config) + r('upload_news_to_device', config) + r('delete_news_from_library_on_upload', config) + +@@ -140,7 +139,7 @@ + input_map = prefs['input_format_order'] + all_formats = set() + self.opt_input_order.clear() +- for fmt in all_input_formats().union(set(['ZIP', 'RAR'])): ++ for fmt in all_input_formats().union(set(['ZIP'])): + all_formats.add(fmt.upper()) + for format in input_map + list(all_formats.difference(input_map)): + item = QListWidgetItem(format, self.opt_input_order) +--- calibre-3.28.0.orig/src/calibre/gui2/preferences/behavior.ui 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/preferences/behavior.ui 2018-08-08 18:25:38.618035818 -0500 +@@ -16,13 +16,6 @@ + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QFormLayout" name="formLayout"> +- <item row="0" column="0" colspan="2"> +- <widget class="QCheckBox" name="opt_new_version_notification"> +- <property name="text"> +- <string>Notify when a &new version is available</string> +- </property> +- </widget> +- </item> + <item row="3" column="0" colspan="2"> + <widget class="QCheckBox" name="opt_upload_news_to_device"> + <property name="text"> +--- calibre-3.28.0.orig/src/calibre/gui2/update.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/gui2/update.py 2018-08-08 18:32:36.418952354 -0500 +@@ -1,20 +1,18 @@ + __license__ = 'GPL v3' + __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' + +-import re, binascii, cPickle, ssl, json ++import binascii, cPickle + from future_builtins import map + from threading import Thread, Event + + from PyQt5.Qt import (QObject, pyqtSignal, Qt, QUrl, QDialog, QGridLayout, +- QLabel, QCheckBox, QDialogButtonBox, QIcon) ++ QLabel, QCheckBox, QIcon) + +-from calibre.constants import (__appname__, __version__, iswindows, isosx, ++from calibre.constants import (__appname__, iswindows, isosx, + isportable, is64bit, numeric_version) + from calibre import prints, as_unicode +-from calibre.utils.config import prefs + from calibre.utils.localization import localize_website_link +-from calibre.utils.https import get_https_resource_securely +-from calibre.gui2 import config, dynamic, open_url ++from calibre.gui2 import dynamic, open_url + from calibre.gui2.dialogs.plugin_updater import get_plugin_updates_available + + URL = 'https://code.calibre-ebook.com/latest' +@@ -31,35 +29,7 @@ + + + def get_newest_version(): +- try: +- icon_theme_name = json.loads(I('icon-theme.json', data=True))['name'] +- except Exception: +- icon_theme_name = '' +- headers={ +- 'CALIBRE-VERSION':__version__, +- 'CALIBRE-OS': ('win' if iswindows else 'osx' if isosx else 'oth'), +- 'CALIBRE-INSTALL-UUID': prefs['installation_uuid'], +- 'CALIBRE-ICON-THEME': icon_theme_name, +- } +- try: +- version = get_https_resource_securely(URL, headers=headers) +- except ssl.SSLError as err: +- if getattr(err, 'reason', None) != 'CERTIFICATE_VERIFY_FAILED': +- raise +- # certificate verification failed, since the version check contains no +- # critical information, ignore and proceed +- # We have to do this as if the calibre CA certificate ever +- # needs to be revoked, then we wont be able to do version checks +- version = get_https_resource_securely(URL, headers=headers, cacerts=None) +- try: +- version = version.decode('utf-8').strip() +- except UnicodeDecodeError: +- version = u'' +- ans = NO_CALIBRE_UPDATE +- m = re.match(ur'(\d+)\.(\d+).(\d+)$', version) +- if m is not None: +- ans = tuple(map(int, (m.group(1), m.group(2), m.group(3)))) +- return ans ++ return NO_CALIBRE_UPDATE + + + class Signal(QObject): +@@ -82,12 +52,6 @@ + calibre_update_version = NO_CALIBRE_UPDATE + plugins_update_found = 0 + try: +- version = get_newest_version() +- if version[:2] > numeric_version[:2]: +- calibre_update_version = version +- except Exception as e: +- prints('Failed to check for calibre update:', as_unicode(e)) +- try: + update_plugins = get_plugin_updates_available(raise_error=True) + if update_plugins is not None: + plugins_update_found = len(update_plugins) +@@ -132,11 +96,6 @@ + self.setWindowIcon(QIcon(I('lt.png'))) + self.l.addWidget(self.logo, 0, 0) + self.l.addWidget(self.label, 0, 1) +- self.cb = QCheckBox( +- _('Show this notification for future updates'), self) +- self.l.addWidget(self.cb, 1, 0, 1, -1) +- self.cb.setChecked(config.get('new_version_notification')) +- self.cb.stateChanged.connect(self.show_future) + self.bb = QDialogButtonBox(self) + b = self.bb.addButton(_('&Get update'), self.bb.AcceptRole) + b.setDefault(True) +@@ -164,9 +123,6 @@ + if gui is not None: + gui.quit(restart=True) + +- def show_future(self, *args): +- config.set('new_version_notification', bool(self.cb.isChecked())) +- + def accept(self): + open_url(QUrl(get_download_url())) + +@@ -214,7 +170,7 @@ + self.status_bar.update_label.setVisible(True) + + if has_calibre_update: +- if (force or (config.get('new_version_notification') and dynamic.get(version_key(calibre_version), True))): ++ if force: + if not no_show_popup: + self._update_notification__ = UpdateNotification(calibre_version, + number_of_plugin_updates, parent=self) +--- calibre-3.28.0.orig/src/calibre/linux.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/linux.py 2018-08-08 18:34:23.357401169 -0500 +@@ -317,7 +317,7 @@ + ): + for fmt in fmts: + is_input = group_title == input_group +- if is_input and fmt in {'rar', 'zip', 'oebzip'}: ++ if is_input and fmt in {'zip', 'oebzip'}: + continue + p = (get_parser(input_fmt=fmt) if is_input + else get_parser(output_fmt=fmt)) +--- calibre-3.28.0.orig/src/calibre/test_build.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/test_build.py 2018-08-08 18:37:07.679895579 -0500 +@@ -216,10 +216,6 @@ + from calibre.gui2.win_file_dialogs import test + test() + +- def test_unrar(self): +- from calibre.utils.unrar import test_basic +- test_basic() +- + @unittest.skipUnless(iswindows, 'WPD is windows only') + def test_wpd(self): + wpd = plugins['wpd'][0] +--- calibre-3.28.0.orig/src/calibre/utils/search_query_parser_test.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/utils/search_query_parser_test.py 2018-08-08 18:39:38.979651481 -0500 +@@ -30,16 +30,16 @@ + u'Tor Books', + u'lrf'], + 8: [u'Stalky and Co.', u'Rudyard Kipling', u'manybooks.net', u'lrf'], +- 9: [u'A Game of Thrones', u'George R. R. Martin', None, u'lrf,rar'], +- 10: [u'A Clash of Kings', u'George R. R. Martin', None, u'lrf,rar'], +- 11: [u'A Storm of Swords', u'George R. R. Martin', None, u'lrf,rar'], ++ 9: [u'A Game of Thrones', u'George R. R. Martin', None, u'lrf'], ++ 10: [u'A Clash of Kings', u'George R. R. Martin', None, u'lrf'], ++ 11: [u'A Storm of Swords', u'George R. R. Martin', None, u'lrf'], + 12: [u'Biggles - Pioneer Air Fighter', u'W. E. Johns', None, u'lrf,rtf'], + 13: [u'Biggles of the Camel Squadron', + u'W. E. Johns', + u'London:Thames, (1977)', + u'lrf,rtf'], +- 14: [u'A Feast for Crows', u'George R. R. Martin', None, u'lrf,rar'], +- 15: [u'Cryptonomicon', u'Neal Stephenson', None, u'lrf,rar'], ++ 14: [u'A Feast for Crows', u'George R. R. Martin', None, u'lrf'], ++ 15: [u'Cryptonomicon', u'Neal Stephenson', None, u'lrf'], + 16: [u'Quicksilver', u'Neal Stephenson', None, u'lrf,zip'], + 17: [u'The Comedies of William Shakespeare', + u'William Shakespeare', +@@ -54,15 +54,15 @@ + None, + u'lrf'], + 20: [u'An Ideal Husband', u'Oscar Wilde', u'manybooks.net', u'lrf'], +- 21: [u'Flight of the Nighthawks', u'Raymond E. Feist', None, u'lrf,rar'], +- 22: [u'Into a Dark Realm', u'Raymond E. Feist', None, u'lrf,rar'], +- 23: [u'The Sundering', u'Walter Jon Williams', None, u'lrf,rar'], +- 24: [u'The Praxis', u'Walter Jon Williams', None, u'lrf,rar'], +- 25: [u'Conventions of War', u'Walter Jon Williams', None, u'lrf,rar'], +- 26: [u'Banewreaker', u'Jacqueline Carey', None, u'lrf,rar'], +- 27: [u'Godslayer', u'Jacqueline Carey', None, u'lrf,rar'], +- 28: [u"Kushiel's Scion", u'Jacqueline Carey', None, u'lrf,rar'], +- 29: [u'Underworld', u'Don DeLillo', None, u'lrf,rar'], ++ 21: [u'Flight of the Nighthawks', u'Raymond E. Feist', None, u'lrf'], ++ 22: [u'Into a Dark Realm', u'Raymond E. Feist', None, u'lrf'], ++ 23: [u'The Sundering', u'Walter Jon Williams', None, u'lrf'], ++ 24: [u'The Praxis', u'Walter Jon Williams', None, u'lrf'], ++ 25: [u'Conventions of War', u'Walter Jon Williams', None, u'lrf'], ++ 26: [u'Banewreaker', u'Jacqueline Carey', None, u'lrf'], ++ 27: [u'Godslayer', u'Jacqueline Carey', None, u'lrf'], ++ 28: [u"Kushiel's Scion", u'Jacqueline Carey', None, u'lrf'], ++ 29: [u'Underworld', u'Don DeLillo', None, u'lrf'], + 30: [u'Genghis Khan and The Making of the Modern World', + u'Jack Weatherford Orc', + u'Three Rivers Press', +@@ -73,9 +73,9 @@ + u'lrf,zip'], + 32: [u'The Killer Angels', u'Michael Shaara', None, u'html,lrf'], + 33: [u'Band Of Brothers', u'Stephen E Ambrose', None, u'lrf,txt'], +- 34: [u'The Gates of Rome', u'Conn Iggulden', None, u'lrf,rar'], ++ 34: [u'The Gates of Rome', u'Conn Iggulden', None, u'lrf'], + 35: [u'The Death of Kings', u'Conn Iggulden', u'Bantam Dell', u'lit,lrf'], +- 36: [u'The Field of Swords', u'Conn Iggulden', None, u'lrf,rar'], ++ 36: [u'The Field of Swords', u'Conn Iggulden', None, u'lrf'], + 37: [u'Masterman Ready', u'Marryat, Captain Frederick', None, u'lrf'], + 38: [u'With the Lightnings', + u'David Drake', +@@ -88,16 +88,16 @@ + 40: [u'The Far Side of The Stars', + u'David Drake', + u'Baen Publishing Enterprises', +- u'lrf,rar'], ++ u'lrf'], + 41: [u'The Way to Glory', + u'David Drake', + u'Baen Publishing Enterprises', +- u'lrf,rar'], +- 42: [u'Some Golden Harbor', u'David Drake', u'Baen Books', u'lrf,rar'], ++ u'lrf'], ++ 42: [u'Some Golden Harbor', u'David Drake', u'Baen Books', u'lrf'], + 43: [u'Harry Potter And The Half-Blood Prince', + u'J. K. Rowling', + None, +- u'lrf,rar'], ++ u'lrf'], + 44: [u'Harry Potter and the Order of the Phoenix', + u'J. K. Rowling', + None, +@@ -106,12 +106,12 @@ + 46: [u'The Stars at War II', + u'Steve White', + u'Baen Publishing Enterprises', +- u'lrf,rar'], +- 47: [u'Exodus', u'Steve White,Shirley Meier', u'Baen Books', u'lrf,rar'], ++ u'lrf'], ++ 47: [u'Exodus', u'Steve White,Shirley Meier', u'Baen Books', u'lrf'], + 48: [u'Harry Potter and the Goblet of Fire', + u'J. K. Rowling', + None, +- u'lrf,rar'], ++ u'lrf'], + 49: [u'Harry Potter and the Prisoner of Azkaban', + u'J. K. Rowling', + None, +@@ -124,20 +124,20 @@ + u'J.K. Rowling', + None, + u'lit,lrf,pdf'], +- 52: [u"His Majesty's Dragon", u'Naomi Novik', None, u'lrf,rar'], ++ 52: [u"His Majesty's Dragon", u'Naomi Novik', None, u'lrf'], + 53: [u'Throne of Jade', u'Naomi Novik', u'Del Rey', u'lit,lrf'], +- 54: [u'Black Powder War', u'Naomi Novik', u'Del Rey', u'lrf,rar'], ++ 54: [u'Black Powder War', u'Naomi Novik', u'Del Rey', u'lrf'], + 55: [u'War and Peace', u'Leo Tolstoy', u'gutenberg.org', u'lrf,txt'], + 56: [u'Anna Karenina', u'Leo Tolstoy', u'gutenberg.org', u'lrf,txt'], + 57: [u'A Shorter History of Rome', + u'Eugene Lawrence,Sir William Smith', + u'gutenberg.org', + u'lrf,zip'], +- 58: [u'The Name of the Rose', u'Umberto Eco', None, u'lrf,rar'], ++ 58: [u'The Name of the Rose', u'Umberto Eco', None, u'lrf'], + 71: [u"Wind Rider's Oath", u'David Weber', u'Baen', u'lrf'], + 74: [u'Rally Cry', u'William R Forstchen', None, u'htm,lrf'], +- 86: [u'Empire of Ivory', u'Naomi Novik', None, u'lrf,rar'], +- 87: [u"Renegade's Magic", u'Robin Hobb', None, u'lrf,rar'], ++ 86: [u'Empire of Ivory', u'Naomi Novik', None, u'lrf'], ++ 87: [u"Renegade's Magic", u'Robin Hobb', None, u'lrf'], + 89: [u'Master and commander', + u"Patrick O'Brian", + u'Fontana,\n1971', +@@ -145,7 +145,7 @@ + 91: [u'A Companion to Wolves', + u'Sarah Monette,Elizabeth Beär', + None, +- u'lrf,rar'], ++ u'lrf'], + 92: [u'The Lions of al-Rassan', u'Guy Gavriel Kay', u'Eos', u'lit,lrf'], + 93: [u'Gardens of the Moon', u'Steven Erikson', u'Tor Fantasy', u'lit,lrf'], + 95: [u'The Master and Margarita', +@@ -169,7 +169,7 @@ + 144: [u'Atonement', + u'Ian McEwan', + u'New York : Nan A. Talese/Doubleday, 2002.', +- u'lrf,rar'], ++ u'lrf'], + 146: [u'1632', u'Eric Flint', u'Baen Books', u'lit,lrf'], + 147: [u'1633', u'David Weber,Eric Flint,Dru Blair', u'Baen', u'lit,lrf'], + 148: [u'1634: The Baltic War', +@@ -222,7 +222,7 @@ + 253: [u"Hunter's Run", + u'George R. R. Martin,Gardner Dozois,Daniel Abraham', + u'Eos', +- u'lrf,rar'], ++ u'lrf'], + 257: [u'Knife of Dreams', u'Robert Jordan', None, u'lit,lrf'], + 258: [u'Saturday', + u'Ian McEwan', +@@ -242,7 +242,7 @@ + u'New York : Random House, 2005.', + u'lit,lrf'], + 269: [u'Reap the Whirlwind', u'David Mack', u'Star Trek', u'lit,lrf'], +- 272: [u'Mistborn', u'Brandon Sanderson', u'Tor Fantasy', u'lrf,rar'], ++ 272: [u'Mistborn', u'Brandon Sanderson', u'Tor Fantasy', u'lrf'], + 273: [u'The Thousandfold Thought', + u'R. Scott Bakker', + u'Overlook TP', +@@ -250,17 +250,17 @@ + 276: [u'Elantris', + u'Brandon Sanderson', + u'New York : Tor, 2005.', +- u'lrf,rar'], ++ u'lrf'], + 291: [u'Sundiver', + u'David Brin', + u'New York : Bantam Books, 1995.', + u'lit,lrf'], +- 299: [u'Imperium', u'Robert Harris', u'Arrow', u'lrf,rar'], ++ 299: [u'Imperium', u'Robert Harris', u'Arrow', u'lrf'], + 300: [u'Startide Rising', u'David Brin', u'Bantam', u'htm,lrf'], + 301: [u'The Uplift War', u'David Brin', u'Spectra', u'lit,lrf'], +- 304: [u'Brightness Reef', u'David Brin', u'Orbit', u'lrf,rar'], ++ 304: [u'Brightness Reef', u'David Brin', u'Orbit', u'lrf'], + 305: [u"Infinity's Shore", u'David Brin', u'Spectra', u'txt'], +- 306: [u"Heaven's Reach", u'David Brin', u'Spectra', u'lrf,rar'], ++ 306: [u"Heaven's Reach", u'David Brin', u'Spectra', u'lrf'], + 325: [u"Foundation's Triumph", u'David Brin', u'Easton Press', u'lit,lrf'], + 327: [u'I am Charlotte Simmons', u'Tom Wolfe', u'Vintage', u'htm,lrf'], + 335: [u'The Currents of Space', u'Isaac Asimov', None, u'lit,lrf'], +@@ -290,15 +290,15 @@ + u'Aspect', + u'lit,lrf'], + 356: [u'The Naked God', u'Peter F. Hamilton', u'Aspect', u'lit,lrf'], +- 421: [u'A Shadow in Summer', u'Daniel Abraham', u'Tor Fantasy', u'lrf,rar'], ++ 421: [u'A Shadow in Summer', u'Daniel Abraham', u'Tor Fantasy', u'lrf'], + 427: [u'Lonesome Dove', u'Larry M\\cMurtry', None, u'lit,lrf'], + 440: [u'Ghost', u'John Ringo', u'Baen', u'lit,lrf'], + 441: [u'Kildar', u'John Ringo', u'Baen', u'lit,lrf'], +- 443: [u'Hidden Empire ', u'Kevin J. Anderson', u'Aspect', u'lrf,rar'], ++ 443: [u'Hidden Empire ', u'Kevin J. Anderson', u'Aspect', u'lrf'], + 444: [u'The Gun Seller', + u'Hugh Laurie', + u'Washington Square Press', +- u'lrf,rar'] ++ u'lrf'] + } + + tests = { +--- calibre-3.28.0.orig/src/calibre/web/feeds/feedparser.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/web/feeds/feedparser.py 2018-08-08 18:41:41.890704066 -0500 +@@ -2081,7 +2081,7 @@ + EMAIL = 5 + + known_xfn_relationships = set(['contact', 'acquaintance', 'friend', 'met', 'co-worker', 'coworker', 'colleague', 'co-resident', 'coresident', 'neighbor', 'child', 'parent', 'sibling', 'brother', 'sister', 'spouse', 'wife', 'husband', 'kin', 'relative', 'muse', 'crush', 'date', 'sweetheart', 'me']) +- known_binary_extensions = set(['zip','rar','exe','gz','tar','tgz','tbz2','bz2','z','7z','dmg','img','sit','sitx','hqx','deb','rpm','bz2','jar','rar','iso','bin','msi','mp2','mp3','ogg','ogm','mp4','m4v','m4a','avi','wma','wmv']) ++ known_binary_extensions = set(['zip','exe','gz','tar','tgz','tbz2','bz2','z','7z','dmg','img','sit','sitx','hqx','deb','rpm','bz2','jar','iso','bin','msi','mp2','mp3','ogg','ogm','mp4','m4v','m4a','avi','wma','wmv']) + + def __init__(self, data, baseuri, encoding): + self.document = BeautifulSoup.BeautifulSoup(data) +--- calibre-3.28.0.orig/src/calibre/utils/file_type_icons.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/utils/file_type_icons.py 2018-08-08 19:26:26.611410160 -0500 +@@ -16,7 +16,6 @@ + 'png' : 'png', + 'bmp' : 'bmp', + 'cbz' : 'cbz', +- 'cbr' : 'cbr', + 'svg' : 'svg', + 'html' : 'html', + 'htmlz' : 'html', +@@ -28,7 +27,6 @@ + 'lrx' : 'lrx', + 'pdf' : 'pdf', + 'pdr' : 'zero', +- 'rar' : 'rar', + 'zip' : 'zip', + 'txt' : 'txt', + 'text' : 'txt', +--- calibre-3.28.0.orig/src/calibre/srv/render_book.py 2018-07-19 23:19:03.000000000 -0500 ++++ calibre-3.28.0/src/calibre/srv/render_book.py 2018-08-08 19:26:14.741952309 -0500 +@@ -193,7 +193,7 @@ + 'spine':spine, + 'link_uid': uuid4(), + 'book_hash': book_hash, +- 'is_comic': input_fmt.lower() in {'cbc', 'cbz', 'cbr', 'cb7'}, ++ 'is_comic': input_fmt.lower() in {'cbc', 'cbz', 'cb7'}, + 'raster_cover_name': raster_cover_name, + 'title_page_name': titlepage_name, + 'has_maths': False, |