summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libre/calibre-libre/PKGBUILD31
-rw-r--r--libre/calibre-libre/libre.patch545
2 files changed, 556 insertions, 20 deletions
diff --git a/libre/calibre-libre/PKGBUILD b/libre/calibre-libre/PKGBUILD
index 6118642c4..2205ffc11 100644
--- a/libre/calibre-libre/PKGBUILD
+++ b/libre/calibre-libre/PKGBUILD
@@ -1,5 +1,5 @@
-# $Id: PKGBUILD 110173 2014-04-25 19:47:10Z jelle $
-# Maintainer: jelle van der Waa <jelle@vdwaa.nl>
+# $Id: PKGBUILD 110547 2014-05-03 08:51:00Z 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>
@@ -9,7 +9,7 @@
_pkgname=calibre
pkgname=calibre-libre
-pkgver=1.34.0
+pkgver=1.35.0
pkgrel=1
pkgdesc="Ebook management application, without nonfree libunrar support"
arch=('i686' 'x86_64' 'mips64el')
@@ -27,28 +27,33 @@ replaces=$_pkgname
conflicts=$_pkgname
provides=$_pkgname=$pkgver
install=calibre.install
-mksource=("http://download.calibre-ebook.com/${pkgver}/calibre-${pkgver}.tar.xz"
- 'libre.patch')
+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')
-mkmd5sums=('1621d563c0cd46d582f8fdf8c44dbb6f'
- '1540d92a314bf748b60b8fc436777ccb')
-md5sums=('38469886ead2808b81555ab2f505da7c'
+ 'calibre-mount-helper'
+ 'libre.patch')
+mkmd5sums=('fa98868fc6b446a8c22ef13475e6d224')
+md5sums=('78e6d511b77c6cc485f92d81961f31b7'
'ece36dfd737fa4a346f0a0e59395e949'
- '675cd87d41342119827ef706055491e7')
+ '675cd87d41342119827ef706055491e7'
+ '64b6798f526165146084e447cc3d9e1a')
mksource(){
cd "${srcdir}/${_pkgname}"
- # Remove unrar files from the source
+ # Remove nonfree unRAR utility files from the source
rm -rv src/unrar
- rm -v src/calibre/utils/unrar.{cpp,py}
- patch -Np1 -i "${srcdir}/libre.patch"
}
prepare(){
cd "${srcdir}/${_pkgname}"
+
+ # Remove rar/cbr 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
index c3dd28eb1..cff783d15 100644
--- a/libre/calibre-libre/libre.patch
+++ b/libre/calibre-libre/libre.patch
@@ -1,3 +1,58 @@
+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
@@ -52,6 +107,19 @@ index 08aa91f..7ee523b 100644
'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
@@ -79,7 +147,7 @@ index fcb627c..3289865 100644
raise Exception('Unknown archive type')
extractor(path, dir)
diff --git a/src/calibre/constants.py b/src/calibre/constants.py
-index 13c78db..8e699e2 100644
+index a250521..5d891b8 100644
--- a/src/calibre/constants.py
+++ b/src/calibre/constants.py
@@ -137,7 +137,6 @@ class Plugins(collections.Mapping):
@@ -91,12 +159,26 @@ index 13c78db..8e699e2 100644
'_regex',
'hunspell',
diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py
-index a74951c..86aa14d 100644
+index a74951c..a91abb6 100644
--- a/src/calibre/customize/builtins.py
+++ b/src/calibre/customize/builtins.py
-@@ -142,10 +142,6 @@ class ComicMetadataReader(MetadataReaderPlugin):
- ftype = 'cbr'
- elif id_.startswith(b'PK'):
+@@ -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
@@ -105,8 +187,126 @@ index a74951c..86aa14d 100644
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..2910280 100644
+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):
@@ -124,9 +324,10 @@ index 7b8ecd2..2910280 100644
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', 'rar'])
++ file_types = set(['zip'])
supported_platforms = ['windows', 'osx', 'linux']
on_import = True
@@ -178,6 +379,72 @@ index 7b8ecd2..2910280 100644
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
@@ -204,6 +471,32 @@ index d849846..50aa6d9 100644
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
@@ -228,3 +521,241 @@ index fd9a36d..130d08d 100644
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)