summaryrefslogtreecommitdiff
path: root/libre/calibre
diff options
context:
space:
mode:
authorOmar Vega Ramos <ovruni@gnu.org.pe>2018-08-09 01:50:31 -0500
committerOmar Vega Ramos <ovruni@gnu.org.pe>2018-08-09 01:50:31 -0500
commit8660e94571b5eebdea4888aff9e4732050e9a2e9 (patch)
treefb1116e81e71dfed0263792c1257864b2adfe5f6 /libre/calibre
parent23b1861afdb2cbebbd88877ebc4c06d5961cead1 (diff)
downloadabslibre-8660e94571b5eebdea4888aff9e4732050e9a2e9.tar.gz
abslibre-8660e94571b5eebdea4888aff9e4732050e9a2e9.tar.bz2
abslibre-8660e94571b5eebdea4888aff9e4732050e9a2e9.zip
calibre-3.28.0-2.parabola1: updating version
Diffstat (limited to 'libre/calibre')
-rw-r--r--libre/calibre/PKGBUILD27
-rw-r--r--libre/calibre/libre.patch860
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 &amp;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,