diff options
Diffstat (limited to 'libre/calibre-libre')
-rw-r--r-- | libre/calibre-libre/PKGBUILD | 52 | ||||
-rw-r--r-- | libre/calibre-libre/libre.patch | 761 |
2 files changed, 796 insertions, 17 deletions
diff --git a/libre/calibre-libre/PKGBUILD b/libre/calibre-libre/PKGBUILD index 57adf177c..75fc57164 100644 --- a/libre/calibre-libre/PKGBUILD +++ b/libre/calibre-libre/PKGBUILD @@ -1,16 +1,16 @@ -# $Id: PKGBUILD 109846 2014-04-19 07:55:26Z jelle $ -# Maintainer: jelle van der Waa <jelle@vdwaa.nl> -# Maintainer: Daniel Wallace <danielwallace at gtmanfred dot com> -# Contributor: Giovanni Scafora <giovanni@archlinux.org> -# Contributor: Petrov Roman <nwhisper@gmail.com> -# Contributor: Andrea Fagiani <andfagiani _at_ gmail dot com> -# Contributor: Larry Hajali <larryhaja@gmail.com> -# Maintainer (Parabola): André Silva <emulatorman@parabola.nu> +# $Id: PKGBUILD 111362 2014-05-17 12:56:09Z jelle $ +# Maintainer (Arch): Jelle van der Waa <jelle@vdwaa.nl> +# Maintainer (Arch): Daniel Wallace <danielwallace at gtmanfred dot com> +# Contributor (Arch): Giovanni Scafora <giovanni@archlinux.org> +# Contributor (Arch): Petrov Roman <nwhisper@gmail.com> +# Contributor (Arch): Andrea Fagiani <andfagiani _at_ gmail dot com> +# Contributor (Arch): Larry Hajali <larryhaja@gmail.com> +# Maintainer: André Silva <emulatorman@parabola.nu> _pkgname=calibre pkgname=calibre-libre -pkgver=1.33.0 -pkgrel=2 +pkgver=1.37.0 +pkgrel=1 pkgdesc="Ebook management application, without nonfree libunrar support" arch=('i686' 'x86_64' 'mips64el') url="http://calibre-ebook.com/" @@ -23,19 +23,37 @@ depends=('python2-six' 'python2-dateutil' 'python2-cssutils' 'python2-cherrypy' 'python2-netifaces' 'python2-cssselect' 'python2-apsw') makedepends=('python2-pycountry' 'qt4-private-headers') optdepends=('ipython2: to use calibre-debug') -replaces=$_pkgname -conflicts=$_pkgname -provides=$_pkgname=$pkgver +replaces=($_pkgname) +conflicts=($_pkgname) +provides=($_pkgname=$pkgver) install=calibre.install -source=("http://download.calibre-ebook.com/${pkgver}/calibre-${pkgver}.tar.xz" +mksource=("http://download.calibre-ebook.com/${pkgver}/calibre-${pkgver}.tar.xz") +source=("https://repo.parabolagnulinux.org/other/${pkgname}/${pkgname}-${pkgver}.tar.xz" 'desktop_integration.patch' - 'calibre-mount-helper') -md5sums=('df51094fe6d5f2e1f10bc070b3d65a68' + 'calibre-mount-helper' + 'libre.patch') +mkmd5sums=('e57c708292694b315eff36a8eca6140b') +md5sums=('3e7250c608d2544c78e10abf8f62669a' 'ece36dfd737fa4a346f0a0e59395e949' - '675cd87d41342119827ef706055491e7') + '675cd87d41342119827ef706055491e7' + '64b6798f526165146084e447cc3d9e1a') + +mksource(){ + cd "${srcdir}/${_pkgname}" + + # Remove nonfree unRAR utility files from the source + rm -rv src/unrar +} prepare(){ cd "${srcdir}/${_pkgname}" + + # Remove nonfree libunrar/cbr support and references + rm -v src/calibre/{ebooks/metadata/rar.py,utils/unrar.{cpp,py}} + rm -v resources/images/mimetypes/{cbr,rar}.png + rm -v imgsrc/mimetypes/rar.svg + patch -Np1 -i "${srcdir}/libre.patch" + #rm -rf src/{cherrypy,pyPdf} rm -rf src/cherrypy rm -rf resources/${pkgname}-portable.* diff --git a/libre/calibre-libre/libre.patch b/libre/calibre-libre/libre.patch new file mode 100644 index 000000000..cff783d15 --- /dev/null +++ b/libre/calibre-libre/libre.patch @@ -0,0 +1,761 @@ +diff --git a/resources/images.qrc b/resources/images.qrc +index 4daf069..f7569d1 100644 +--- a/resources/images.qrc ++++ b/resources/images.qrc +@@ -159,7 +159,6 @@ + <file>images/textures/grey_wash_wall.png</file> + <file>images/mimetypes/djvu.png</file> + <file>images/mimetypes/rtf.png</file> +-<file>images/mimetypes/cbr.png</file> + <file>images/mimetypes/lrf.png</file> + <file>images/mimetypes/jpeg.png</file> + <file>images/mimetypes/pdf.png</file> +@@ -181,7 +180,6 @@ + <file>images/mimetypes/txt.png</file> + <file>images/mimetypes/snb.png</file> + <file>images/mimetypes/odt.png</file> +-<file>images/mimetypes/rar.png</file> + <file>images/mimetypes/azw2.png</file> + <file>images/mimetypes/zip.png</file> + <file>images/mimetypes/dir.png</file> +@@ -212,4 +210,4 @@ + <file>images/devices/tablet.png</file> + <file>images/devices/folder.png</file> + </qresource> +-</RCC> +\ No newline at end of file ++</RCC> +diff --git a/resources/mime.types b/resources/mime.types +index b7c33e9..055ea61 100644 +--- a/resources/mime.types ++++ b/resources/mime.types +@@ -137,7 +137,6 @@ application/prs.cww cww + 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-certreqresp p7r + 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-mobipocket-subscription pobi + application/x-kindle-application azw2 + application/x-mobi8-ebook azw3 + application/x-cbz cbz +-application/x-cbr cbr + application/x-cb7 cb7 + application/x-koboreader-ebook kobo + image/wmf wmf +diff --git a/session.vim b/session.vim +index 67502c2..b7f24d3 100644 +--- a/session.vim ++++ b/session.vim +@@ -11,7 +11,6 @@ let g:syntastic_cpp_include_dirs = [ + \'/usr/include/freetype2', + \'/usr/include/fontconfig', + \'src/qtcurve/common', 'src/qtcurve', +- \'src/unrar', + \'src/qt-harfbuzz/src', + \'/usr/include/ImageMagick', + \] +diff --git a/setup/extensions.py b/setup/extensions.py +index b9d92f6..2ac13a9 100644 +--- a/setup/extensions.py ++++ b/setup/extensions.py +@@ -224,24 +224,6 @@ extensions = [ + sip_files=['calibre/ebooks/pdf/render/qt_hack.sip'] + ), + +- Extension('unrar', +- ['unrar/%s.cpp'%(x.partition('.')[0]) for x in ''' +- rar.o strlist.o strfn.o pathfn.o savepos.o smallfn.o global.o file.o +- filefn.o filcreat.o archive.o arcread.o unicode.o system.o +- isnt.o crypt.o crc.o rawread.o encname.o resource.o match.o +- timefn.o rdwrfn.o consio.o options.o ulinks.o errhnd.o rarvm.o +- secpassword.o rijndael.o getbits.o sha1.o extinfo.o extract.o +- volume.o list.o find.o unpack.o cmddata.o filestr.o scantree.o +- '''.split()] + ['calibre/utils/unrar.cpp'], +- inc_dirs=['unrar'], +- cflags=[('/' if iswindows else '-') + x for x in ( +- 'DSILENT', 'DRARDLL', 'DUNRAR')] + ( +- [] if iswindows else ['-D_FILE_OFFSET_BITS=64', +- '-D_LARGEFILE_SOURCE']), +- optimize_level=2, +- libraries=['User32', 'Advapi32', 'kernel32', 'Shell32'] if iswindows else [] +- ), +- + ] + + +diff --git a/setup/installer/windows/freeze.py b/setup/installer/windows/freeze.py +index 08aa91f..7ee523b 100644 +--- a/setup/installer/windows/freeze.py ++++ b/setup/installer/windows/freeze.py +@@ -635,7 +635,7 @@ class Win32Freeze(Command, WixMixIn): + # Because of https://github.com/fancycode/MemoryModule/issues/4 + # any extensions that use C++ exceptions must be loaded + # from files +- 'unrar.pyd', 'wpd.pyd', 'podofo.pyd', ++ 'wpd.pyd', 'podofo.pyd', + 'progress_indicator.pyd', 'hunspell.pyd', + # As per this https://bugs.launchpad.net/bugs/1087816 + # on some systems magick.pyd fails to load from memory +diff --git a/setup/resources.py b/setup/resources.py +index 1bcc288..7d6c72f 100644 +--- a/setup/resources.py ++++ b/setup/resources.py +@@ -282,7 +282,7 @@ class Resources(Command): # {{{ + 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 +diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py +index fcb627c..3289865 100644 +--- a/src/calibre/__init__.py ++++ b/src/calibre/__init__.py +@@ -271,10 +271,7 @@ def extract(path, dir): + # 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: +@@ -283,9 +280,6 @@ def extract(path, dir): + 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) +diff --git a/src/calibre/constants.py b/src/calibre/constants.py +index a250521..5d891b8 100644 +--- a/src/calibre/constants.py ++++ b/src/calibre/constants.py +@@ -137,7 +137,6 @@ class Plugins(collections.Mapping): + 'speedup', + 'freetype', + 'woff', +- 'unrar', + 'qt_hack', + '_regex', + 'hunspell', +diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py +index a74951c..a91abb6 100644 +--- a/src/calibre/customize/builtins.py ++++ b/src/calibre/customize/builtins.py +@@ -127,7 +127,7 @@ plugins += [HTML2ZIP, PML2PMLZ, TXT2TXTZ, ArchiveExtract,] + 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): +@@ -138,14 +138,8 @@ class ComicMetadataReader(MetadataReaderPlugin): + 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_first_alphabetically as extract_first +- extract_first +- else: + from calibre.libunzip import extract_member + extract_first = functools.partial(extract_member, + sort_alphabetically=True) +@@ -153,7 +147,7 @@ class ComicMetadataReader(MetadataReaderPlugin): + ret = extract_first(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' +@@ -336,16 +330,6 @@ class PMLMetadataReader(MetadataReaderPlugin): + from calibre.ebooks.metadata.pml import get_metadata + return get_metadata(stream) + +-class RARMetadataReader(MetadataReaderPlugin): +- +- name = 'Read RAR metadata' +- file_types = set(['rar']) +- description = _('Read metadata from ebooks 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' +diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py +index 2e1cc23..c9a3701 100644 +--- a/src/calibre/customize/ui.py ++++ b/src/calibre/customize/ui.py +@@ -436,7 +436,7 @@ def available_input_formats(): + 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 + + +diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py +index aca5e86..1c2064f 100644 +--- a/src/calibre/devices/kobo/driver.py ++++ b/src/calibre/devices/kobo/driver.py +@@ -77,7 +77,7 @@ class KOBO(USBMS): + 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] +diff --git a/src/calibre/devices/mtp/filesystem_cache.py b/src/calibre/devices/mtp/filesystem_cache.py +index 3acb026..f3626ab 100644 +--- a/src/calibre/devices/mtp/filesystem_cache.py ++++ b/src/calibre/devices/mtp/filesystem_cache.py +@@ -18,7 +18,7 @@ from calibre.utils.date import local_tz, as_utc + 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): + +diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py +index 3d01f84..8818bcb 100644 +--- a/src/calibre/ebooks/__init__.py ++++ b/src/calibre/ebooks/__init__.py +@@ -26,9 +26,9 @@ class DRMError(ValueError): + class ParserError(ValueError): + 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', 'djv', 'djvu', 'lrx', 'cbr', 'cbz', 'cbc', 'oebzip', ++ 'epub', 'fb2', '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', 'iba', 'azw3', 'ps'] +diff --git a/src/calibre/ebooks/conversion/plugins/comic_input.py b/src/calibre/ebooks/conversion/plugins/comic_input.py +index e66ca49..3caa2db 100644 +--- a/src/calibre/ebooks/conversion/plugins/comic_input.py ++++ b/src/calibre/ebooks/conversion/plugins/comic_input.py +@@ -17,8 +17,8 @@ class ComicInput(InputFormatPlugin): + + 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 + core_usage = -1 + +diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py +index cb49801..689c5aa 100644 +--- a/src/calibre/ebooks/conversion/plumber.py ++++ b/src/calibre/ebooks/conversion/plumber.py +@@ -42,7 +42,7 @@ various stages of conversion. The stages are: + + def supported_input_formats(): + fmts = available_input_formats() +- for x in ('zip', 'rar', 'oebzip'): ++ for x in ('zip', 'oebzip'): + fmts.add(x) + return fmts + +@@ -60,7 +60,7 @@ class CompositeProgressReporter(object): + (self.global_max - self.global_min) + self.global_reporter(global_frac, msg) + +-ARCHIVE_FMTS = ('zip', 'rar', 'oebzip') ++ARCHIVE_FMTS = ('zip', 'oebzip') + + class Plumber(object): + ''' +diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py +index 7b8ecd2..f5c31ac 100644 +--- a/src/calibre/ebooks/metadata/archive.py ++++ b/src/calibre/ebooks/metadata/archive.py +@@ -27,8 +27,6 @@ def archive_type(stream): + ans = None + if id_ == stringFileHeader: + ans = 'zip' +- elif id_.startswith('Rar'): +- ans = 'rar' + try: + stream.seek(pos) + except: +@@ -40,29 +38,20 @@ class ArchiveExtract(FileTypePlugin): + name = 'Archive Extract' + author = 'Kovid Goyal' + description = _('Extract common e-book formats from archives ' +- '(zip/rar) files. Also try to autodetect if they are actually ' +- 'cbz/cbr files.') +- file_types = set(['zip', 'rar']) ++ 'zip files. 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: +- with open(archive, 'rb') as rf: +- fnames = list(names(rf)) +- else: +- fnames = zf.namelist() ++ zf = ZipFile(archive, 'r') ++ fnames = zf.namelist() + + fnames = [x for x in fnames if '.' in x and x.lower().rpartition('/')[-1] != 'thumbs.db'] + 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()) +@@ -78,12 +67,7 @@ class ArchiveExtract(FileTypePlugin): + + of = self.temporary_file('_archive_extract.'+ext) + with closing(of): +- if is_rar: +- with open(archive, 'rb') as f: +- data = extract_member(f, match=None, name=fname)[1] +- of.write(data) +- else: +- of.write(zf.read(fname)) ++ of.write(zf.read(fname)) + return of.name + + def get_comic_book_info(d, mi, series_index='volume'): +@@ -141,10 +125,6 @@ def get_comic_metadata(stream, stream_type, series_index='volume'): + from calibre.utils.zipfile import ZipFile + zf = ZipFile(stream) + comment = zf.comment +- elif stream_type == 'cbr': +- from calibre.utils.unrar import RARFile +- f = RARFile(stream, get_comment=True) +- comment = f.comment + + if comment: + import json +diff --git a/src/calibre/ebooks/oeb/iterator/book.py b/src/calibre/ebooks/oeb/iterator/book.py +index 8868e7c..4662f67 100644 +--- a/src/calibre/ebooks/oeb/iterator/book.py ++++ b/src/calibre/ebooks/oeb/iterator/book.py +@@ -127,7 +127,7 @@ class EbookIterator(BookmarksMixin): + self.spine = [] + Spiny = partial(SpineItem, read_anchor_map=read_anchor_map, + run_char_count=run_char_count, from_epub=self.book_format == 'EPUB') +- is_comic = plumber.input_fmt.lower() in {'cbc', 'cbz', 'cbr', 'cb7'} ++ is_comic = plumber.input_fmt.lower() in {'cbc', 'cbz', 'cb7'} + for i in ordered: + spath = i.path + mt = None +diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py +index e419685..ee83d7b 100644 +--- a/src/calibre/gui2/__init__.py ++++ b/src/calibre/gui2/__init__.py +@@ -488,7 +488,6 @@ class FileIconProvider(QFileIconProvider): + 'png' : 'png', + 'bmp' : 'bmp', + 'cbz' : 'cbz', +- 'cbr' : 'cbr', + 'svg' : 'svg', + 'html' : 'html', + 'htmlz' : 'html', +@@ -500,7 +499,6 @@ class FileIconProvider(QFileIconProvider): + 'lrx' : 'lrx', + 'pdf' : 'pdf', + 'pdr' : 'zero', +- 'rar' : 'rar', + 'zip' : 'zip', + 'txt' : 'txt', + 'text' : 'txt', +diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py +index 3e3c48b..a605ff5 100644 +--- a/src/calibre/gui2/actions/add.py ++++ b/src/calibre/gui2/actions/add.py +@@ -38,8 +38,8 @@ def get_filters(): + (_('Text books'), ['txt', 'text', 'rtf']), + (_('PDF Books'), ['pdf', 'azw4']), + (_('SNB Books'), ['snb']), +- (_('Comics'), ['cbz', 'cbr', 'cbc']), +- (_('Archives'), ['zip', 'rar']), ++ (_('Comics'), ['cbz', 'cbc']), ++ (_('Archives'), ['zip']), + (_('Wordprocessor files'), ['odt', 'doc', 'docx']), + ] + +@@ -66,7 +66,7 @@ class AddAction(InterfaceAction): + 'sub directories (Multiple books per directory, assumes every ' + 'ebook 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', _( +@@ -144,7 +144,7 @@ class AddAction(InterfaceAction): + 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=True) ++ filters=[(_('Archives'), ('zip'))], all_files=False, select_only_single_file=True) + if paths: + self.do_add_recursive(paths[0], single) + +diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py +index d849846..50aa6d9 100644 +--- a/src/calibre/gui2/add.py ++++ b/src/calibre/gui2/add.py +@@ -84,11 +84,8 @@ class RecursiveFind(QThread): # {{{ + prints('Corrupt ZIP file, trying to use local headers') + from calibre.utils.localunzip import extractall + extractall(self.path, self.tdir) +- elif self.path.lower().endswith('.rar'): +- from calibre.utils.unrar import extract +- extract(self.path, self.tdir) + else: +- raise ValueError('Can only process ZIP or RAR archives') ++ raise ValueError('Can only process ZIP archives') + + def run(self): + if self.tdir is not None: +@@ -292,7 +289,7 @@ class Adder(QObject): # {{{ + self.pd.canceled_signal.connect(self.canceled) + + def add_recursive(self, root, single=True): +- if os.path.exists(root) and os.path.isfile(root) and root.lower().rpartition('.')[-1] in {'zip', 'rar'}: ++ if os.path.exists(root) and os.path.isfile(root) and root.lower().rpartition('.')[-1] in {'zip'}: + self.path = tdir = PersistentTemporaryDirectory('_arcv_') + else: + self.path = root +diff --git a/src/calibre/library/server/opds.py b/src/calibre/library/server/opds.py +index 5e9ca44..f5d230d 100644 +--- a/src/calibre/library/server/opds.py ++++ b/src/calibre/library/server/opds.py +@@ -29,7 +29,7 @@ BASE_HREFS = { + 1 : '/opds', + } + +-STANZA_FORMATS = frozenset(['epub', 'pdb', 'pdf', 'cbr', 'cbz', 'djvu']) ++STANZA_FORMATS = frozenset(['epub', 'pdb', 'pdf', 'cbz', 'djvu']) + + def url_for(name, version, **kwargs): + if not name.endswith('_'): +diff --git a/src/calibre/linux.py b/src/calibre/linux.py +index c746606..d6b2c6c 100644 +--- a/src/calibre/linux.py ++++ b/src/calibre/linux.py +@@ -314,7 +314,7 @@ class ZshCompleter(object): # {{{ + ): + 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)) +diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py +index fd9a36d..130d08d 100644 +--- a/src/calibre/test_build.py ++++ b/src/calibre/test_build.py +@@ -102,11 +102,6 @@ def test_imaging(): + raise RuntimeError('PIL choked!') + print ('PIL OK!') + +-def test_unrar(): +- from calibre.utils.unrar import test_basic +- test_basic() +- print ('Unrar OK!') +- + def test_ssl(): + import ssl + ssl +@@ -146,7 +141,6 @@ def test(): + test_ssl() + test_sqlite() + test_imaging() +- test_unrar() + test_icu() + test_woff() + test_qt() +diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot +index 1775b71..65cf8c4 100644 +--- a/src/calibre/translations/calibre.pot ++++ b/src/calibre/translations/calibre.pot +@@ -3870,7 +3870,7 @@ msgid "Set book ID" + msgstr "" + + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:42 +-msgid "Extract common e-book formats from archives (zip/rar) files. Also try to autodetect if they are actually cbz/cbr files." ++msgid "Extract common e-book formats from archives (zip) files. Also try to autodetect if they are actually cbz files." + msgstr "" + + #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/book/base.py:644 +@@ -10866,7 +10866,7 @@ msgid "You can also customise the plugin locations using <b>Preferences -> Custo + msgstr "" + + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:33 +-msgid "Set defaults for conversion of comics (CBR/CBZ files)" ++msgid "Set defaults for conversion of comics (CBZ files)" + msgstr "" + + #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/comicconf.py:48 +diff --git a/src/calibre/utils/search_query_parser.py b/src/calibre/utils/search_query_parser.py +index d395057..4804b28 100644 +--- a/src/calibre/utils/search_query_parser.py ++++ b/src/calibre/utils/search_query_parser.py +@@ -445,16 +445,16 @@ class Tester(SearchQueryParser): + 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', +@@ -469,15 +469,15 @@ class Tester(SearchQueryParser): + 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', +@@ -488,9 +488,9 @@ class Tester(SearchQueryParser): + 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', +@@ -503,16 +503,16 @@ class Tester(SearchQueryParser): + 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, +@@ -521,12 +521,12 @@ class Tester(SearchQueryParser): + 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, +@@ -539,20 +539,20 @@ class Tester(SearchQueryParser): + 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', +@@ -560,7 +560,7 @@ class Tester(SearchQueryParser): + 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', +@@ -584,7 +584,7 @@ class Tester(SearchQueryParser): + 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', +@@ -637,7 +637,7 @@ class Tester(SearchQueryParser): + 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', +@@ -657,7 +657,7 @@ class Tester(SearchQueryParser): + 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', +@@ -665,17 +665,17 @@ class Tester(SearchQueryParser): + 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'], +@@ -705,15 +705,15 @@ class Tester(SearchQueryParser): + 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 = { +diff --git a/src/calibre/web/feeds/feedparser.py b/src/calibre/web/feeds/feedparser.py +index 16085cf..420efaa 100755 +--- a/src/calibre/web/feeds/feedparser.py ++++ b/src/calibre/web/feeds/feedparser.py +@@ -2081,7 +2081,7 @@ class _MicroformatsParser: + 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) |