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 @@
images/textures/grey_wash_wall.png
images/mimetypes/djvu.png
images/mimetypes/rtf.png
-images/mimetypes/cbr.png
images/mimetypes/lrf.png
images/mimetypes/jpeg.png
images/mimetypes/pdf.png
@@ -181,7 +180,6 @@
images/mimetypes/txt.png
images/mimetypes/snb.png
images/mimetypes/odt.png
-images/mimetypes/rar.png
images/mimetypes/azw2.png
images/mimetypes/zip.png
images/mimetypes/dir.png
@@ -212,4 +210,4 @@
images/devices/tablet.png
images/devices/folder.png
-
\ No newline at end of file
+
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 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)