diff -rupN calibre-3.39.1/manual/conversion.rst calibre-3.39.1.new/manual/conversion.rst --- calibre-3.39.1/manual/conversion.rst 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/manual/conversion.rst 2019-02-26 11:40:36.546704530 +0100 @@ -747,7 +747,7 @@ output ranging anywhere from decent to u 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:: diff -rupN calibre-3.39.1/manual/faq.rst calibre-3.39.1.new/manual/faq.rst --- calibre-3.39.1/manual/faq.rst 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/manual/faq.rst 2019-02-26 11:40:36.546704530 +0100 @@ -18,7 +18,7 @@ What formats does calibre support conver 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 diff -rupN calibre-3.39.1/manual/gui.rst calibre-3.39.1.new/manual/gui.rst --- calibre-3.39.1/manual/gui.rst 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/manual/gui.rst 2019-02-26 11:40:36.550037909 +0100 @@ -51,7 +51,7 @@ Add books 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. diff -rupN calibre-3.39.1/resources/mime.types calibre-3.39.1.new/resources/mime.types --- calibre-3.39.1/resources/mime.types 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/resources/mime.types 2019-02-26 11:40:36.550037909 +0100 @@ -138,7 +138,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 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 diff -rupN calibre-3.39.1/setup/resources.py calibre-3.39.1.new/setup/resources.py --- calibre-3.39.1/setup/resources.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/setup/resources.py 2019-02-26 11:40:36.550037909 +0100 @@ -348,7 +348,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 -rupN calibre-3.39.1/src/calibre/customize/builtins.py calibre-3.39.1.new/src/calibre/customize/builtins.py --- calibre-3.39.1/src/calibre/customize/builtins.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/customize/builtins.py 2019-02-26 11:40:36.550037909 +0100 @@ -132,7 +132,7 @@ plugins += [HTML2ZIP, PML2PMLZ, TXT2TXTZ class ComicMetadataReader(MetadataReaderPlugin): name = 'Read comic metadata' - file_types = {'cbr', 'cbz'} + file_types = {'cbz'} description = _('Extract cover from comic files') def customization_help(self, gui=False): @@ -143,19 +143,14 @@ class ComicMetadataReader(MetadataReader 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 @@ class PMLMetadataReader(MetadataReaderPl return get_metadata(stream) -class RARMetadataReader(MetadataReaderPlugin): - - name = 'Read RAR metadata' - file_types = {'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' diff -rupN calibre-3.39.1/src/calibre/customize/ui.py calibre-3.39.1.new/src/calibre/customize/ui.py --- calibre-3.39.1/src/calibre/customize/ui.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/customize/ui.py 2019-02-26 11:40:36.550037909 +0100 @@ -538,7 +538,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 -rupN calibre-3.39.1/src/calibre/devices/kobo/driver.py calibre-3.39.1.new/src/calibre/devices/kobo/driver.py --- calibre-3.39.1/src/calibre/devices/kobo/driver.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/devices/kobo/driver.py 2019-02-26 11:40:36.553371290 +0100 @@ -90,7 +90,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 -rupN calibre-3.39.1/src/calibre/devices/misc.py calibre-3.39.1.new/src/calibre/devices/misc.py --- calibre-3.39.1/src/calibre/devices/misc.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/devices/misc.py 2019-02-26 11:40:36.553371290 +0100 @@ -448,7 +448,7 @@ class WAYTEQ(USBMS): 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 diff -rupN calibre-3.39.1/src/calibre/devices/mtp/filesystem_cache.py calibre-3.39.1.new/src/calibre/devices/mtp/filesystem_cache.py --- calibre-3.39.1/src/calibre/devices/mtp/filesystem_cache.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/devices/mtp/filesystem_cache.py 2019-02-26 11:40:36.553371290 +0100 @@ -18,7 +18,7 @@ from calibre.utils.date import local_tz, 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 -rupN calibre-3.39.1/src/calibre/ebooks/comic/__init__.py calibre-3.39.1.new/src/calibre/ebooks/comic/__init__.py --- calibre-3.39.1/src/calibre/ebooks/comic/__init__.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/ebooks/comic/__init__.py 2019-02-26 11:40:36.553371290 +0100 @@ -4,7 +4,7 @@ __copyright__ = '2008, Kovid Goyal kovid __docformat__ = 'restructuredtext en' ''' -Convert CBR/CBZ files to LRF. +Convert CBZ files to LRF. ''' import sys diff -rupN calibre-3.39.1/src/calibre/ebooks/conversion/plugins/comic_input.py calibre-3.39.1.new/src/calibre/ebooks/conversion/plugins/comic_input.py --- calibre-3.39.1/src/calibre/ebooks/conversion/plugins/comic_input.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/ebooks/conversion/plugins/comic_input.py 2019-02-26 11:40:36.553371290 +0100 @@ -18,8 +18,8 @@ class ComicInput(InputFormatPlugin): name = 'Comic Input' author = 'Kovid Goyal' - description = 'Optimize comic files (.cbz, .cbr, .cbc) for viewing on portable devices' - file_types = {'cbz', 'cbr', 'cbc'} + description = 'Optimize comic files (.cbz, .cbc) for viewing on portable devices' + file_types = {'cbz', 'cbc'} is_image_collection = True commit_name = 'comic_input' core_usage = -1 diff -rupN calibre-3.39.1/src/calibre/ebooks/conversion/plumber.py calibre-3.39.1.new/src/calibre/ebooks/conversion/plumber.py --- calibre-3.39.1/src/calibre/ebooks/conversion/plumber.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/ebooks/conversion/plumber.py 2019-02-26 11:40:36.553371290 +0100 @@ -43,7 +43,7 @@ various stages of conversion. The stages 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 @@ class CompositeProgressReporter(object): self.global_reporter(global_frac, msg) -ARCHIVE_FMTS = ('zip', 'rar', 'oebzip') +ARCHIVE_FMTS = ('zip', 'oebzip') class Plumber(object): diff -rupN calibre-3.39.1/src/calibre/ebooks/__init__.py calibre-3.39.1.new/src/calibre/ebooks/__init__.py --- calibre-3.39.1/src/calibre/ebooks/__init__.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/ebooks/__init__.py 2019-02-26 11:40:36.553371290 +0100 @@ -30,9 +30,9 @@ 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', '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'] diff -rupN calibre-3.39.1/src/calibre/ebooks/metadata/archive.py calibre-3.39.1.new/src/calibre/ebooks/metadata/archive.py --- calibre-3.39.1/src/calibre/ebooks/metadata/archive.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/ebooks/metadata/archive.py 2019-02-26 11:40:36.553371290 +0100 @@ -29,8 +29,6 @@ def archive_type(stream): ans = None if id_ == stringFileHeader: ans = 'zip' - elif id_.startswith('Rar'): - ans = 'rar' try: stream.seek(pos) except: @@ -42,24 +40,16 @@ class ArchiveExtract(FileTypePlugin): 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 = {'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 @@ class ArchiveExtract(FileTypePlugin): 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 @@ class ArchiveExtract(FileTypePlugin): 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 @@ def get_comic_metadata(stream, stream_ty 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 diff -rupN calibre-3.39.1/src/calibre/ebooks/oeb/iterator/book.py calibre-3.39.1.new/src/calibre/ebooks/oeb/iterator/book.py --- calibre-3.39.1/src/calibre/ebooks/oeb/iterator/book.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/ebooks/oeb/iterator/book.py 2019-02-26 11:41:29.474118987 +0100 @@ -161,7 +161,7 @@ class EbookIterator(BookmarksMixin): else: ordered = [i for i in self.opf.spine if i.is_linear] + \ [i for i in self.opf.spine if not i.is_linear] - 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 diff -rupN calibre-3.39.1/src/calibre/ebooks/pdf/from_comic.py calibre-3.39.1.new/src/calibre/ebooks/pdf/from_comic.py --- calibre-3.39.1/src/calibre/ebooks/pdf/from_comic.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/ebooks/pdf/from_comic.py 2019-02-26 11:40:36.556704670 +0100 @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __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 diff -rupN calibre-3.39.1/src/calibre/gui2/actions/add.py calibre-3.39.1.new/src/calibre/gui2/actions/add.py --- calibre-3.39.1/src/calibre/gui2/actions/add.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/actions/add.py 2019-02-26 11:40:36.556704670 +0100 @@ -36,8 +36,8 @@ def get_filters(): (_('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,10 +64,10 @@ class AddAction(InterfaceAction): '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)')) connect_lambda(self.create_menu_action( - arm, 'recursive-single-archive', _('One book per directory in the archive')).triggered, - self, lambda self: self.add_archive(True)) + arm, 'recursive-single-archive', _('One book per directory in the archive')).triggered, + self, lambda self: self.add_archive(True)) connect_lambda(self.create_menu_action( arm, 'recursive-multiple-archive', _('Multiple books per directory in the archive')).triggered, self, lambda self: self.add_archive(False)) @@ -201,7 +201,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=False) + filters=[(_('Archives'), ('zip'))], all_files=False, select_only_single_file=False) if paths: self.do_add_recursive(paths, single, list_of_archives=True) diff -rupN calibre-3.39.1/src/calibre/gui2/actions/preferences.py calibre-3.39.1.new/src/calibre/gui2/actions/preferences.py --- calibre-3.39.1/src/calibre/gui2/actions/preferences.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/actions/preferences.py 2019-02-26 11:40:36.556704670 +0100 @@ -29,8 +29,6 @@ class PreferencesAction(InterfaceAction) 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', diff -rupN calibre-3.39.1/src/calibre/gui2/add.py calibre-3.39.1.new/src/calibre/gui2/add.py --- calibre-3.39.1/src/calibre/gui2/add.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/add.py 2019-02-26 11:40:36.556704670 +0100 @@ -167,9 +167,6 @@ class Adder(QObject): 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: diff -rupN calibre-3.39.1/src/calibre/gui2/dialogs/comicconf.py calibre-3.39.1.new/src/calibre/gui2/dialogs/comicconf.py --- calibre-3.39.1/src/calibre/gui2/dialogs/comicconf.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/dialogs/comicconf.py 2019-02-26 11:40:36.560038051 +0100 @@ -33,7 +33,7 @@ def get_conversion_options(window, defau 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) diff -rupN calibre-3.39.1/src/calibre/gui2/__init__.py calibre-3.39.1.new/src/calibre/gui2/__init__.py --- calibre-3.39.1/src/calibre/gui2/__init__.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/__init__.py 2019-02-26 11:40:36.560038051 +0100 @@ -191,8 +191,6 @@ def _config(): # {{{ 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', diff -rupN calibre-3.39.1/src/calibre/gui2/preferences/behavior.py calibre-3.39.1.new/src/calibre/gui2/preferences/behavior.py --- calibre-3.39.1/src/calibre/gui2/preferences/behavior.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/preferences/behavior.py 2019-02-26 11:40:36.560038051 +0100 @@ -40,7 +40,6 @@ class ConfigWidget(ConfigWidgetBase, Ui_ 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 @@ class ConfigWidget(ConfigWidgetBase, Ui_ input_map = prefs['input_format_order'] all_formats = set() self.opt_input_order.clear() - for fmt in all_input_formats().union({'ZIP', 'RAR'}): + for fmt in all_input_formats().union({'ZIP'}): all_formats.add(fmt.upper()) for format in input_map + list(all_formats.difference(input_map)): item = QListWidgetItem(format, self.opt_input_order) diff -rupN calibre-3.39.1/src/calibre/gui2/preferences/behavior.ui calibre-3.39.1.new/src/calibre/gui2/preferences/behavior.ui --- calibre-3.39.1/src/calibre/gui2/preferences/behavior.ui 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/preferences/behavior.ui 2019-02-26 11:40:36.560038051 +0100 @@ -16,13 +16,6 @@ - - - - Notify when a &new version is available - - - diff -rupN calibre-3.39.1/src/calibre/gui2/update.py calibre-3.39.1.new/src/calibre/gui2/update.py --- calibre-3.39.1/src/calibre/gui2/update.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/gui2/update.py 2019-02-26 11:40:36.560038051 +0100 @@ -6,15 +6,13 @@ from polyglot.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_download_url(): 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(unicode(r'(\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 @@ class CheckForUpdates(Thread): 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 @@ class UpdateNotification(QDialog): 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 @@ class UpdateNotification(QDialog): 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 @@ class UpdateMixin(object): 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) diff -rupN calibre-3.39.1/src/calibre/__init__.py calibre-3.39.1.new/src/calibre/__init__.py --- calibre-3.39.1/src/calibre/__init__.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/__init__.py 2019-02-26 11:40:36.560038051 +0100 @@ -298,10 +298,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: @@ -310,9 +307,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 -rupN calibre-3.39.1/src/calibre/linux.py calibre-3.39.1.new/src/calibre/linux.py --- calibre-3.39.1/src/calibre/linux.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/linux.py 2019-02-26 11:40:36.560038051 +0100 @@ -318,7 +318,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 -rupN calibre-3.39.1/src/calibre/srv/render_book.py calibre-3.39.1.new/src/calibre/srv/render_book.py --- calibre-3.39.1/src/calibre/srv/render_book.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/srv/render_book.py 2019-02-26 11:40:36.560038051 +0100 @@ -195,7 +195,7 @@ class Container(ContainerBase): '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, diff -rupN calibre-3.39.1/src/calibre/srv/tests/loop.py calibre-3.39.1.new/src/calibre/srv/tests/loop.py --- calibre-3.39.1/src/calibre/srv/tests/loop.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/srv/tests/loop.py 2019-02-26 11:42:14.074747922 +0100 @@ -108,24 +108,6 @@ class LoopTest(BaseTest): with TestServer(lambda data:(data.path[0] + data.read()), listen_on='1.1.1.1', fallback_to_detected_interface=True, specialize=specialize) as server: self.assertNotEqual('1.1.1.1', server.address[0]) - @skipIf(is_ci, 'Continuous Integration servers do not support BonJour') - def test_bonjour(self): - 'Test advertising via BonJour' - from calibre.srv.bonjour import BonJour - from calibre.utils.Zeroconf import Zeroconf - b = BonJour() - with TestServer(lambda data:(data.path[0] + data.read()), plugins=(b,), shutdown_timeout=5) as server: - self.assertTrue(b.started.wait(5), 'BonJour not started') - self.ae(b.advertised_port, server.address[1]) - service = b.services[0] - self.ae(service.type, b'_calibre._tcp.local.') - r = Zeroconf() - info = r.getServiceInfo(service.type, service.name) - self.assertIsNotNone(info) - self.ae(info.text, b'\npath=/opds') - - self.assertTrue(b.stopped.wait(5), 'BonJour not stopped') - def test_dual_stack(self): from calibre.srv.loop import IPPROTO_IPV6 with TestServer(lambda data:(data.path[0] + data.read()), listen_on='::') as server: diff -rupN calibre-3.39.1/src/calibre/test_build.py calibre-3.39.1.new/src/calibre/test_build.py --- calibre-3.39.1/src/calibre/test_build.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/test_build.py 2019-02-26 11:40:36.563371432 +0100 @@ -220,10 +220,6 @@ class BuildTest(unittest.TestCase): 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] diff -rupN calibre-3.39.1/src/calibre/utils/file_type_icons.py calibre-3.39.1.new/src/calibre/utils/file_type_icons.py --- calibre-3.39.1/src/calibre/utils/file_type_icons.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/utils/file_type_icons.py 2019-02-26 11:40:36.563371432 +0100 @@ -16,7 +16,6 @@ EXT_MAP = { 'png' : 'png', 'bmp' : 'bmp', 'cbz' : 'cbz', - 'cbr' : 'cbr', 'svg' : 'svg', 'html' : 'html', 'htmlz' : 'html', @@ -28,7 +27,6 @@ EXT_MAP = { 'lrx' : 'lrx', 'pdf' : 'pdf', 'pdr' : 'zero', - 'rar' : 'rar', 'zip' : 'zip', 'txt' : 'txt', 'text' : 'txt', diff -rupN calibre-3.39.1/src/calibre/utils/search_query_parser_test.py calibre-3.39.1.new/src/calibre/utils/search_query_parser_test.py --- calibre-3.39.1/src/calibre/utils/search_query_parser_test.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/utils/search_query_parser_test.py 2019-02-26 11:40:36.563371432 +0100 @@ -30,16 +30,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', @@ -54,15 +54,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', @@ -73,9 +73,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', @@ -88,16 +88,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, @@ -106,12 +106,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, @@ -124,20 +124,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', @@ -145,7 +145,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', @@ -169,7 +169,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', @@ -222,7 +222,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', @@ -242,7 +242,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', @@ -250,17 +250,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'], @@ -290,15 +290,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 -rupN calibre-3.39.1/src/calibre/web/feeds/feedparser.py calibre-3.39.1.new/src/calibre/web/feeds/feedparser.py --- calibre-3.39.1/src/calibre/web/feeds/feedparser.py 2019-02-01 18:43:29.000000000 +0100 +++ calibre-3.39.1.new/src/calibre/web/feeds/feedparser.py 2019-02-26 11:40:36.563371432 +0100 @@ -2081,7 +2081,7 @@ class _MicroformatsParser: EMAIL = 5 known_xfn_relationships = {'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 = {'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 = {'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)