mirror of
https://github.com/gryf/ebook-converter.git
synced 2026-01-23 05:15:45 +01:00
Every mime related function in main __init__.py has a flag check for the check if initialization has already done. This is nonsense, since it should be done implicitly early on the converter is starting. This commit straight the things out, and initialization is done in cli module. Also, function guess_type was removed, since it's just a proxy for mimetypes.guess_type function.
1150 lines
39 KiB
Python
1150 lines
39 KiB
Python
import glob
|
|
import mimetypes
|
|
import os
|
|
import re
|
|
|
|
from ebook_converter.constants_old import numeric_version
|
|
from ebook_converter.customize import FileTypePlugin
|
|
from ebook_converter.customize import InterfaceActionBase
|
|
from ebook_converter.customize import MetadataReaderPlugin
|
|
from ebook_converter.customize import MetadataWriterPlugin
|
|
from ebook_converter.ebooks.html.to_zip import HTML2ZIP
|
|
from ebook_converter.ebooks.metadata.archive import ArchiveExtract
|
|
from ebook_converter.ebooks.metadata.archive import KPFExtract
|
|
from ebook_converter.ebooks.metadata.archive import get_comic_metadata
|
|
|
|
|
|
plugins = []
|
|
|
|
# To archive plugins {{{
|
|
|
|
|
|
class PML2PMLZ(FileTypePlugin):
|
|
name = 'PML to PMLZ'
|
|
author = 'John Schember'
|
|
description = ('Create a PMLZ archive containing the PML file '
|
|
'and all images in the directory pmlname_img or images. '
|
|
'This plugin is run every time you add '
|
|
'a PML file to the library.')
|
|
version = numeric_version
|
|
file_types = {'pml'}
|
|
supported_platforms = ['windows', 'osx', 'linux']
|
|
on_import = True
|
|
|
|
def run(self, pmlfile):
|
|
import zipfile
|
|
|
|
of = self.temporary_file('_plugin_pml2pmlz.pmlz')
|
|
pmlz = zipfile.ZipFile(of.name, 'w')
|
|
pmlz.write(pmlfile, os.path.basename(pmlfile), zipfile.ZIP_DEFLATED)
|
|
|
|
pml_img = os.path.splitext(pmlfile)[0] + '_img'
|
|
i_img = os.path.join(os.path.dirname(pmlfile), 'images')
|
|
img_dir = pml_img if os.path.isdir(pml_img) else i_img if \
|
|
os.path.isdir(i_img) else ''
|
|
if img_dir:
|
|
for image in glob.glob(os.path.join(img_dir, '*.png')):
|
|
pmlz.write(image, os.path.join('images',
|
|
(os.path.basename(image))))
|
|
pmlz.close()
|
|
|
|
return of.name
|
|
|
|
|
|
class TXT2TXTZ(FileTypePlugin):
|
|
name = 'TXT to TXTZ'
|
|
author = 'John Schember'
|
|
description = ('Create a TXTZ archive when a TXT file is imported '
|
|
'containing Markdown or Textile references to images. The '
|
|
'referenced images as well as the TXT file are added to '
|
|
'the archive.')
|
|
version = numeric_version
|
|
file_types = {'txt', 'text'}
|
|
supported_platforms = ['windows', 'osx', 'linux']
|
|
on_import = True
|
|
|
|
def _get_image_references(self, txt, base_dir):
|
|
from ebook_converter.ebooks.oeb.base import OEB_IMAGES
|
|
|
|
images = []
|
|
|
|
# Textile
|
|
for m in re.finditer(r'(?mu)(?:[\[{])?\!(?:\. )?(?P<path>[^\s(!]+)\s?(?:\(([^\)]+)\))?\!(?::(\S+))?(?:[\]}]|(?=\s|$))', txt):
|
|
path = m.group('path')
|
|
if path and not os.path.isabs(path) and mimetypes.guess_type(path)[0] in OEB_IMAGES and os.path.exists(os.path.join(base_dir, path)):
|
|
images.append(path)
|
|
|
|
# Markdown inline
|
|
for m in re.finditer(r'(?mu)\!\[([^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*)\]\s*\((?P<path>[^\)]*)\)', txt): # noqa
|
|
path = m.group('path')
|
|
if path and not os.path.isabs(path) and mimetypes.guess_type(path)[0] in OEB_IMAGES and os.path.exists(os.path.join(base_dir, path)):
|
|
images.append(path)
|
|
|
|
# Markdown reference
|
|
refs = {}
|
|
for m in re.finditer(r'(?mu)^(\ ?\ ?\ ?)\[(?P<id>[^\]]*)\]:\s*(?P<path>[^\s]*)$', txt):
|
|
if m.group('id') and m.group('path'):
|
|
refs[m.group('id')] = m.group('path')
|
|
for m in re.finditer(r'(?mu)\!\[([^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*(\[[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*\])*[^\]\[]*)\]\s*\[(?P<id>[^\]]*)\]', txt): # noqa
|
|
path = refs.get(m.group('id'), None)
|
|
if path and not os.path.isabs(path) and mimetypes.guess_type(path)[0] in OEB_IMAGES and os.path.exists(os.path.join(base_dir, path)):
|
|
images.append(path)
|
|
|
|
# Remove duplicates
|
|
return list(set(images))
|
|
|
|
def run(self, path_to_ebook):
|
|
from ebook_converter.ebooks.metadata.opf2 import metadata_to_opf
|
|
|
|
with open(path_to_ebook, 'rb') as ebf:
|
|
txt = ebf.read().decode('utf-8', 'replace')
|
|
base_dir = os.path.dirname(path_to_ebook)
|
|
images = self._get_image_references(txt, base_dir)
|
|
|
|
if images:
|
|
# Create TXTZ and put file plus images inside of it.
|
|
import zipfile
|
|
of = self.temporary_file('_plugin_txt2txtz.txtz')
|
|
txtz = zipfile.ZipFile(of.name, 'w')
|
|
# Add selected TXT file to archive.
|
|
txtz.write(path_to_ebook, os.path.basename(path_to_ebook), zipfile.ZIP_DEFLATED)
|
|
# metadata.opf
|
|
if os.path.exists(os.path.join(base_dir, 'metadata.opf')):
|
|
txtz.write(os.path.join(base_dir, 'metadata.opf'), 'metadata.opf', zipfile.ZIP_DEFLATED)
|
|
else:
|
|
from ebook_converter.ebooks.metadata.txt import get_metadata
|
|
with open(path_to_ebook, 'rb') as ebf:
|
|
mi = get_metadata(ebf)
|
|
opf = metadata_to_opf(mi)
|
|
txtz.writestr('metadata.opf', opf, zipfile.ZIP_DEFLATED)
|
|
# images
|
|
for image in images:
|
|
txtz.write(os.path.join(base_dir, image), image)
|
|
txtz.close()
|
|
|
|
return of.name
|
|
else:
|
|
# No images so just import the TXT file.
|
|
return path_to_ebook
|
|
|
|
|
|
plugins += [HTML2ZIP, PML2PMLZ, TXT2TXTZ, ArchiveExtract, KPFExtract]
|
|
# }}}
|
|
|
|
# Metadata reader plugins {{{
|
|
|
|
|
|
class ComicMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read comic metadata'
|
|
file_types = {'cbr', 'cbz'}
|
|
description = 'Extract cover from comic files'
|
|
|
|
def customization_help(self, gui=False):
|
|
return 'Read series number from volume or issue number. Default is volume, set this to issue to use issue number instead.'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
if hasattr(stream, 'seek') and hasattr(stream, 'tell'):
|
|
pos = stream.tell()
|
|
id_ = stream.read(3)
|
|
stream.seek(pos)
|
|
if id_ == b'Rar':
|
|
ftype = 'cbr'
|
|
elif id_.startswith(b'PK'):
|
|
ftype = 'cbz'
|
|
if ftype == 'cbr':
|
|
from ebook_converter.utils.unrar import extract_cover_image
|
|
else:
|
|
from ebook_converter.libunzip import extract_cover_image
|
|
from ebook_converter.ebooks.metadata import MetaInformation
|
|
ret = extract_cover_image(stream)
|
|
mi = MetaInformation(None, None)
|
|
stream.seek(0)
|
|
if ftype in {'cbr', 'cbz'}:
|
|
series_index = self.site_customization
|
|
if series_index not in {'volume', 'issue'}:
|
|
series_index = 'volume'
|
|
try:
|
|
mi.smart_update(get_comic_metadata(stream, ftype, series_index=series_index))
|
|
except:
|
|
pass
|
|
if ret is not None:
|
|
path, data = ret
|
|
ext = os.path.splitext(path)[1][1:]
|
|
mi.cover_data = (ext.lower(), data)
|
|
return mi
|
|
|
|
|
|
class CHMMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read CHM metadata'
|
|
file_types = {'chm'}
|
|
description = 'Read metadata from CHM files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.chm.metadata import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class EPUBMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read EPUB metadata'
|
|
file_types = {'epub'}
|
|
description = 'Read metadata from EPUB files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.epub import get_metadata, get_quick_metadata
|
|
if self.quick:
|
|
return get_quick_metadata(stream)
|
|
return get_metadata(stream)
|
|
|
|
|
|
class FB2MetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read FB2 metadata'
|
|
file_types = {'fb2', 'fbz'}
|
|
description = 'Read metadata from FB2 files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.fb2 import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class HTMLMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read HTML metadata'
|
|
file_types = {'html'}
|
|
description = 'Read metadata from HTML files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.html import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class HTMLZMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read HTMLZ metadata'
|
|
file_types = {'htmlz'}
|
|
description = 'Read metadata from HTMLZ files'
|
|
author = 'John Schember'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.extz import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class IMPMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read IMP metadata'
|
|
file_types = {'imp'}
|
|
description = 'Read metadata from IMP files'
|
|
author = 'Ashish Kulkarni'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.imp import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class LITMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read LIT metadata'
|
|
file_types = {'lit'}
|
|
description = 'Read metadata from LIT files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.lit import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class LRFMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read LRF metadata'
|
|
file_types = {'lrf'}
|
|
description = 'Read metadata from LRF files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.lrf.meta import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class LRXMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read LRX metadata'
|
|
file_types = {'lrx'}
|
|
description = 'Read metadata from LRX files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.lrx import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class MOBIMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read MOBI metadata'
|
|
file_types = {'mobi', 'prc', 'azw', 'azw3', 'azw4', 'pobi'}
|
|
description = 'Read metadata from MOBI files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.mobi import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class ODTMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read ODT metadata'
|
|
file_types = {'odt'}
|
|
description = 'Read metadata from ODT files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.odt import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class DocXMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read DOCX metadata'
|
|
file_types = {'docx'}
|
|
description = 'Read metadata from DOCX files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.docx import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class OPFMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read OPF metadata'
|
|
file_types = {'opf'}
|
|
description = 'Read metadata from OPF files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.opf import get_metadata
|
|
return get_metadata(stream)[0]
|
|
|
|
|
|
class PDBMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read PDB metadata'
|
|
file_types = {'pdb', 'updb'}
|
|
description = 'Read metadata from PDB files'
|
|
author = 'John Schember'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.pdb import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class PDFMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read PDF metadata'
|
|
file_types = {'pdf'}
|
|
description = 'Read metadata from PDF files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.pdf import get_metadata, get_quick_metadata
|
|
if self.quick:
|
|
return get_quick_metadata(stream)
|
|
return get_metadata(stream)
|
|
|
|
|
|
class PMLMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read PML metadata'
|
|
file_types = {'pml', 'pmlz'}
|
|
description = 'Read metadata from PML files'
|
|
author = 'John Schember'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.pml import get_metadata
|
|
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 ebook_converter.ebooks.metadata.rar import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class RBMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read RB metadata'
|
|
file_types = {'rb'}
|
|
description = 'Read metadata from RB files'
|
|
author = 'Ashish Kulkarni'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.rb import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class RTFMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read RTF metadata'
|
|
file_types = {'rtf'}
|
|
description = 'Read metadata from RTF files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.rtf import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class SNBMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read SNB metadata'
|
|
file_types = {'snb'}
|
|
description = 'Read metadata from SNB files'
|
|
author = 'Li Fanxi'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.snb import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class TOPAZMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read Topaz metadata'
|
|
file_types = {'tpz', 'azw1'}
|
|
description = 'Read metadata from MOBI files'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.topaz import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class TXTMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read TXT metadata'
|
|
file_types = {'txt'}
|
|
description = 'Read metadata from TXT files'
|
|
author = 'John Schember'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.txt import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class TXTZMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read TXTZ metadata'
|
|
file_types = {'txtz'}
|
|
description = 'Read metadata from TXTZ files'
|
|
author = 'John Schember'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.extz import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
class ZipMetadataReader(MetadataReaderPlugin):
|
|
|
|
name = 'Read ZIP metadata'
|
|
file_types = {'zip', 'oebzip'}
|
|
description = 'Read metadata from e-books in ZIP archives'
|
|
|
|
def get_metadata(self, stream, ftype):
|
|
from ebook_converter.ebooks.metadata.zip import get_metadata
|
|
return get_metadata(stream)
|
|
|
|
|
|
plugins += [x for x in list(locals().values()) if isinstance(x, type) and
|
|
x.__name__.endswith('MetadataReader')]
|
|
|
|
# }}}
|
|
|
|
# Metadata writer plugins {{{
|
|
|
|
|
|
class EPUBMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set EPUB metadata'
|
|
file_types = {'epub'}
|
|
description = 'Set metadata in EPUB files'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.epub import set_metadata
|
|
q = self.site_customization or ''
|
|
set_metadata(stream, mi, apply_null=self.apply_null, force_identifiers=self.force_identifiers, add_missing_cover='disable-add-missing-cover' != q)
|
|
|
|
def customization_help(self, gui=False):
|
|
h = 'disable-add-missing-cover'
|
|
if gui:
|
|
h = '<i>' + h + '</i>'
|
|
return ('Enter {0} below to have the EPUB metadata writer plugin not '
|
|
'add cover images to EPUB files that have no existing cover '
|
|
'image.'.format(h))
|
|
|
|
|
|
class FB2MetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set FB2 metadata'
|
|
file_types = {'fb2', 'fbz'}
|
|
description = 'Set metadata in FB2 files'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.fb2 import set_metadata
|
|
set_metadata(stream, mi, apply_null=self.apply_null)
|
|
|
|
|
|
class HTMLZMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set HTMLZ metadata'
|
|
file_types = {'htmlz'}
|
|
description = 'Set metadata from HTMLZ files'
|
|
author = 'John Schember'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.extz import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class LRFMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set LRF metadata'
|
|
file_types = {'lrf'}
|
|
description = 'Set metadata in LRF files'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.lrf.meta import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class MOBIMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set MOBI metadata'
|
|
file_types = {'mobi', 'prc', 'azw', 'azw3', 'azw4'}
|
|
description = 'Set metadata in MOBI files'
|
|
author = 'Marshall T. Vandegrift'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.mobi import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class PDBMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set PDB metadata'
|
|
file_types = {'pdb'}
|
|
description = 'Set metadata from PDB files'
|
|
author = 'John Schember'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.pdb import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class PDFMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set PDF metadata'
|
|
file_types = {'pdf'}
|
|
description = 'Set metadata in PDF files'
|
|
author = 'Kovid Goyal'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.pdf import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class RTFMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set RTF metadata'
|
|
file_types = {'rtf'}
|
|
description = 'Set metadata in RTF files'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.rtf import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class TOPAZMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set TOPAZ metadata'
|
|
file_types = {'tpz', 'azw1'}
|
|
description = 'Set metadata in TOPAZ files'
|
|
author = 'Greg Riker'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.topaz import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class TXTZMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set TXTZ metadata'
|
|
file_types = {'txtz'}
|
|
description = 'Set metadata from TXTZ files'
|
|
author = 'John Schember'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.extz import set_metadata
|
|
set_metadata(stream, mi)
|
|
|
|
|
|
class ODTMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set ODT metadata'
|
|
file_types = {'odt'}
|
|
description = 'Set metadata from ODT files'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.odt import set_metadata
|
|
return set_metadata(stream, mi)
|
|
|
|
|
|
class DocXMetadataWriter(MetadataWriterPlugin):
|
|
|
|
name = 'Set DOCX metadata'
|
|
file_types = {'docx'}
|
|
description = 'Set metadata from DOCX files'
|
|
|
|
def set_metadata(self, stream, mi, type):
|
|
from ebook_converter.ebooks.metadata.docx import set_metadata
|
|
return set_metadata(stream, mi)
|
|
|
|
|
|
plugins += [x for x in list(locals().values()) if isinstance(x, type) and
|
|
x.__name__.endswith('MetadataWriter')]
|
|
|
|
# }}}
|
|
|
|
# Conversion plugins {{{
|
|
from ebook_converter.ebooks.conversion.plugins.comic_input import ComicInput
|
|
from ebook_converter.ebooks.conversion.plugins.djvu_input import DJVUInput
|
|
from ebook_converter.ebooks.conversion.plugins.epub_input import EPUBInput
|
|
from ebook_converter.ebooks.conversion.plugins.fb2_input import FB2Input
|
|
from ebook_converter.ebooks.conversion.plugins.html_input import HTMLInput
|
|
from ebook_converter.ebooks.conversion.plugins.htmlz_input import HTMLZInput
|
|
from ebook_converter.ebooks.conversion.plugins.lit_input import LITInput
|
|
from ebook_converter.ebooks.conversion.plugins.mobi_input import MOBIInput
|
|
from ebook_converter.ebooks.conversion.plugins.odt_input import ODTInput
|
|
from ebook_converter.ebooks.conversion.plugins.pdb_input import PDBInput
|
|
from ebook_converter.ebooks.conversion.plugins.azw4_input import AZW4Input
|
|
from ebook_converter.ebooks.conversion.plugins.pdf_input import PDFInput
|
|
from ebook_converter.ebooks.conversion.plugins.pml_input import PMLInput
|
|
from ebook_converter.ebooks.conversion.plugins.rb_input import RBInput
|
|
from ebook_converter.ebooks.conversion.plugins.recipe_input import RecipeInput
|
|
from ebook_converter.ebooks.conversion.plugins.rtf_input import RTFInput
|
|
from ebook_converter.ebooks.conversion.plugins.tcr_input import TCRInput
|
|
from ebook_converter.ebooks.conversion.plugins.txt_input import TXTInput
|
|
from ebook_converter.ebooks.conversion.plugins.lrf_input import LRFInput
|
|
from ebook_converter.ebooks.conversion.plugins.chm_input import CHMInput
|
|
from ebook_converter.ebooks.conversion.plugins.snb_input import SNBInput
|
|
from ebook_converter.ebooks.conversion.plugins.docx_input import DOCXInput
|
|
|
|
from ebook_converter.ebooks.conversion.plugins.epub_output import EPUBOutput
|
|
from ebook_converter.ebooks.conversion.plugins.fb2_output import FB2Output
|
|
from ebook_converter.ebooks.conversion.plugins.lit_output import LITOutput
|
|
from ebook_converter.ebooks.conversion.plugins.lrf_output import LRFOutput
|
|
from ebook_converter.ebooks.conversion.plugins.mobi_output import (MOBIOutput,
|
|
AZW3Output)
|
|
from ebook_converter.ebooks.conversion.plugins.oeb_output import OEBOutput
|
|
from ebook_converter.ebooks.conversion.plugins.pdb_output import PDBOutput
|
|
from ebook_converter.ebooks.conversion.plugins.pdf_output import PDFOutput
|
|
from ebook_converter.ebooks.conversion.plugins.pml_output import PMLOutput
|
|
from ebook_converter.ebooks.conversion.plugins.rb_output import RBOutput
|
|
from ebook_converter.ebooks.conversion.plugins.rtf_output import RTFOutput
|
|
from ebook_converter.ebooks.conversion.plugins.tcr_output import TCROutput
|
|
from ebook_converter.ebooks.conversion.plugins.txt_output import TXTOutput, TXTZOutput
|
|
from ebook_converter.ebooks.conversion.plugins.html_output import HTMLOutput
|
|
from ebook_converter.ebooks.conversion.plugins.htmlz_output import HTMLZOutput
|
|
from ebook_converter.ebooks.conversion.plugins.snb_output import SNBOutput
|
|
from ebook_converter.ebooks.conversion.plugins.docx_output import DOCXOutput
|
|
|
|
plugins += [
|
|
ComicInput,
|
|
DJVUInput,
|
|
EPUBInput,
|
|
FB2Input,
|
|
HTMLInput,
|
|
HTMLZInput,
|
|
LITInput,
|
|
MOBIInput,
|
|
ODTInput,
|
|
PDBInput,
|
|
AZW4Input,
|
|
PDFInput,
|
|
PMLInput,
|
|
RBInput,
|
|
RecipeInput,
|
|
RTFInput,
|
|
TCRInput,
|
|
TXTInput,
|
|
LRFInput,
|
|
CHMInput,
|
|
SNBInput,
|
|
DOCXInput,
|
|
]
|
|
plugins += [
|
|
EPUBOutput,
|
|
DOCXOutput,
|
|
FB2Output,
|
|
LITOutput,
|
|
LRFOutput,
|
|
MOBIOutput, AZW3Output,
|
|
OEBOutput,
|
|
PDBOutput,
|
|
PDFOutput,
|
|
PMLOutput,
|
|
RBOutput,
|
|
RTFOutput,
|
|
TCROutput,
|
|
TXTOutput,
|
|
TXTZOutput,
|
|
HTMLOutput,
|
|
HTMLZOutput,
|
|
SNBOutput,
|
|
]
|
|
# }}}
|
|
|
|
# Catalog plugins {{{
|
|
from ebook_converter.library.catalogs.csv_xml import CSV_XML
|
|
from ebook_converter.library.catalogs.bibtex import BIBTEX
|
|
from ebook_converter.library.catalogs.epub_mobi import EPUB_MOBI
|
|
plugins += [CSV_XML, BIBTEX, EPUB_MOBI]
|
|
# }}}
|
|
|
|
# Profiles {{{
|
|
from ebook_converter.customize.profiles import input_profiles, output_profiles
|
|
plugins += input_profiles + output_profiles
|
|
# }}}
|
|
|
|
# Device driver plugins {{{
|
|
#from ebook_converter.devices.hanlin.driver import HANLINV3, HANLINV5, BOOX, SPECTRA
|
|
#from ebook_converter.devices.blackberry.driver import BLACKBERRY, PLAYBOOK
|
|
#from ebook_converter.devices.cybook.driver import CYBOOK, ORIZON, MUSE, DIVA
|
|
#from ebook_converter.devices.eb600.driver import (EB600, COOL_ER, SHINEBOOK, TOLINO,
|
|
# POCKETBOOK360, GER2, ITALICA, ECLICTO, DBOOK, INVESBOOK,
|
|
# BOOQ, ELONEX, POCKETBOOK301, MENTOR, POCKETBOOK602,
|
|
# POCKETBOOK701, POCKETBOOK740, POCKETBOOK360P, PI2, POCKETBOOK622,
|
|
# POCKETBOOKHD)
|
|
#from ebook_converter.devices.iliad.driver import ILIAD
|
|
#from ebook_converter.devices.irexdr.driver import IREXDR1000, IREXDR800
|
|
#from ebook_converter.devices.jetbook.driver import (JETBOOK, MIBUK, JETBOOK_MINI,
|
|
# JETBOOK_COLOR)
|
|
#from ebook_converter.devices.kindle.driver import (KINDLE, KINDLE2, KINDLE_DX,
|
|
# KINDLE_FIRE)
|
|
#from ebook_converter.devices.nook.driver import NOOK, NOOK_COLOR
|
|
#from ebook_converter.devices.prs505.driver import PRS505
|
|
#from ebook_converter.devices.prst1.driver import PRST1
|
|
#from ebook_converter.devices.user_defined.driver import USER_DEFINED
|
|
#from ebook_converter.devices.android.driver import ANDROID, S60, WEBOS
|
|
#from ebook_converter.devices.nokia.driver import N770, N810, E71X, E52
|
|
#from ebook_converter.devices.eslick.driver import ESLICK, EBK52
|
|
#from ebook_converter.devices.nuut2.driver import NUUT2
|
|
#from ebook_converter.devices.iriver.driver import IRIVER_STORY
|
|
#from ebook_converter.devices.binatone.driver import README
|
|
#from ebook_converter.devices.hanvon.driver import (N516, EB511, ALEX, AZBOOKA, THEBOOK,
|
|
# LIBREAIR, ODYSSEY, KIBANO)
|
|
#from ebook_converter.devices.edge.driver import EDGE
|
|
#from ebook_converter.devices.teclast.driver import (TECLAST_K3, NEWSMY, IPAPYRUS,
|
|
# SOVOS, PICO, SUNSTECH_EB700, ARCHOS7O, STASH, WEXLER)
|
|
#from ebook_converter.devices.sne.driver import SNE
|
|
#from ebook_converter.devices.misc import (
|
|
# PALMPRE, AVANT, SWEEX, PDNOVEL, GEMEI, VELOCITYMICRO, PDNOVEL_KOBO,
|
|
# LUMIREAD, ALURATEK_COLOR, TREKSTOR, EEEREADER, NEXTBOOK, ADAM, MOOVYBOOK,
|
|
# COBY, EX124G, WAYTEQ, WOXTER, POCKETBOOK626, SONYDPTS1, CERVANTES)
|
|
#from ebook_converter.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG
|
|
#from ebook_converter.devices.kobo.driver import KOBO, KOBOTOUCH
|
|
#from ebook_converter.devices.boeye.driver import BOEYE_BEX, BOEYE_BDX
|
|
#from ebook_converter.devices.smart_device_app.driver import SMART_DEVICE_APP
|
|
#from ebook_converter.devices.mtp.driver import MTP_DEVICE
|
|
|
|
# Order here matters. The first matched device is the one used.
|
|
#plugins += [
|
|
# HANLINV3,
|
|
# HANLINV5,
|
|
# BLACKBERRY, PLAYBOOK,
|
|
# CYBOOK, ORIZON, MUSE, DIVA,
|
|
# ILIAD,
|
|
# IREXDR1000,
|
|
# IREXDR800,
|
|
# JETBOOK, JETBOOK_MINI, MIBUK, JETBOOK_COLOR,
|
|
# SHINEBOOK,
|
|
# POCKETBOOK360, POCKETBOOK301, POCKETBOOK602, POCKETBOOK701, POCKETBOOK360P,
|
|
# POCKETBOOK622, PI2, POCKETBOOKHD, POCKETBOOK740,
|
|
# KINDLE, KINDLE2, KINDLE_DX, KINDLE_FIRE,
|
|
# NOOK, NOOK_COLOR,
|
|
# PRS505, PRST1,
|
|
# ANDROID, S60, WEBOS,
|
|
# N770,
|
|
# E71X,
|
|
# E52,
|
|
# N810,
|
|
# COOL_ER,
|
|
# ESLICK,
|
|
# EBK52,
|
|
# NUUT2,
|
|
# IRIVER_STORY,
|
|
# GER2,
|
|
# ITALICA,
|
|
# ECLICTO,
|
|
# DBOOK,
|
|
# INVESBOOK,
|
|
# BOOX,
|
|
# BOOQ,
|
|
# EB600, TOLINO,
|
|
# README,
|
|
# N516, KIBANO,
|
|
# THEBOOK, LIBREAIR,
|
|
# EB511,
|
|
# ELONEX,
|
|
# TECLAST_K3,
|
|
# NEWSMY,
|
|
# PICO, SUNSTECH_EB700, ARCHOS7O, SOVOS, STASH, WEXLER,
|
|
# IPAPYRUS,
|
|
# EDGE,
|
|
# SNE,
|
|
# ALEX, ODYSSEY,
|
|
# PALMPRE,
|
|
# KOBO, KOBOTOUCH,
|
|
# AZBOOKA,
|
|
# FOLDER_DEVICE_FOR_CONFIG,
|
|
# AVANT, CERVANTES,
|
|
# MENTOR,
|
|
# SWEEX,
|
|
# PDNOVEL,
|
|
# SPECTRA,
|
|
# GEMEI,
|
|
# VELOCITYMICRO,
|
|
# PDNOVEL_KOBO,
|
|
# LUMIREAD,
|
|
# ALURATEK_COLOR,
|
|
# TREKSTOR,
|
|
# EEEREADER,
|
|
# NEXTBOOK,
|
|
# ADAM,
|
|
# MOOVYBOOK, COBY, EX124G, WAYTEQ, WOXTER, POCKETBOOK626, SONYDPTS1,
|
|
# BOEYE_BEX,
|
|
# BOEYE_BDX,
|
|
# MTP_DEVICE,
|
|
# SMART_DEVICE_APP,
|
|
# USER_DEFINED,
|
|
#]
|
|
|
|
|
|
# }}}
|
|
|
|
# Interface Actions {{{
|
|
|
|
|
|
class ActionAdd(InterfaceActionBase):
|
|
name = 'Add Books'
|
|
actual_plugin = 'ebook_converter.gui2.actions.add:AddAction'
|
|
description = 'Add books to calibre or the connected device'
|
|
|
|
|
|
class ActionFetchAnnotations(InterfaceActionBase):
|
|
name = 'Fetch Annotations'
|
|
actual_plugin = 'ebook_converter.gui2.actions.annotate:FetchAnnotationsAction'
|
|
description = 'Fetch annotations from a connected Kindle (experimental)'
|
|
|
|
|
|
class ActionGenerateCatalog(InterfaceActionBase):
|
|
name = 'Generate Catalog'
|
|
actual_plugin = 'ebook_converter.gui2.actions.catalog:GenerateCatalogAction'
|
|
description = 'Generate a catalog of the books in your calibre library'
|
|
|
|
|
|
class ActionConvert(InterfaceActionBase):
|
|
name = 'Convert Books'
|
|
actual_plugin = 'ebook_converter.gui2.actions.convert:ConvertAction'
|
|
description = 'Convert books to various e-book formats'
|
|
|
|
|
|
class ActionPolish(InterfaceActionBase):
|
|
name = 'Polish Books'
|
|
actual_plugin = 'ebook_converter.gui2.actions.polish:PolishAction'
|
|
description = 'Fine tune your e-books'
|
|
|
|
|
|
class ActionEditToC(InterfaceActionBase):
|
|
name = 'Edit ToC'
|
|
actual_plugin = 'ebook_converter.gui2.actions.toc_edit:ToCEditAction'
|
|
description = 'Edit the Table of Contents in your books'
|
|
|
|
|
|
class ActionDelete(InterfaceActionBase):
|
|
name = 'Remove Books'
|
|
actual_plugin = 'ebook_converter.gui2.actions.delete:DeleteAction'
|
|
description = 'Delete books from your calibre library or connected device'
|
|
|
|
|
|
class ActionEmbed(InterfaceActionBase):
|
|
name = 'Embed Metadata'
|
|
actual_plugin = 'ebook_converter.gui2.actions.embed:EmbedAction'
|
|
description = ('Embed updated metadata into the actual book files in '
|
|
'your calibre library')
|
|
|
|
|
|
class ActionEditMetadata(InterfaceActionBase):
|
|
name = 'Edit Metadata'
|
|
actual_plugin = 'ebook_converter.gui2.actions.edit_metadata:EditMetadataAction'
|
|
description = 'Edit the metadata of books in your calibre library'
|
|
|
|
|
|
class ActionView(InterfaceActionBase):
|
|
name = 'View'
|
|
actual_plugin = 'ebook_converter.gui2.actions.view:ViewAction'
|
|
description = 'Read books in your calibre library'
|
|
|
|
|
|
class ActionFetchNews(InterfaceActionBase):
|
|
name = 'Fetch News'
|
|
actual_plugin = 'ebook_converter.gui2.actions.fetch_news:FetchNewsAction'
|
|
description = 'Download news from the internet in e-book form'
|
|
|
|
|
|
class ActionQuickview(InterfaceActionBase):
|
|
name = 'Quickview'
|
|
actual_plugin = 'ebook_converter.gui2.actions.show_quickview:ShowQuickviewAction'
|
|
description = 'Show a list of related books quickly'
|
|
|
|
|
|
class ActionTagMapper(InterfaceActionBase):
|
|
name = 'Tag Mapper'
|
|
actual_plugin = 'ebook_converter.gui2.actions.tag_mapper:TagMapAction'
|
|
description = 'Filter/transform the tags for books in the library'
|
|
|
|
|
|
class ActionAuthorMapper(InterfaceActionBase):
|
|
name = 'Author Mapper'
|
|
actual_plugin = 'ebook_converter.gui2.actions.author_mapper:AuthorMapAction'
|
|
description = 'Transform the authors for books in the library'
|
|
|
|
|
|
class ActionTemplateTester(InterfaceActionBase):
|
|
name = 'Template Tester'
|
|
actual_plugin = 'ebook_converter.gui2.actions.show_template_tester:ShowTemplateTesterAction'
|
|
description = 'Show an editor for testing templates'
|
|
|
|
|
|
class ActionSaveToDisk(InterfaceActionBase):
|
|
name = 'Save To Disk'
|
|
actual_plugin = 'ebook_converter.gui2.actions.save_to_disk:SaveToDiskAction'
|
|
description = 'Export books from your calibre library to the hard disk'
|
|
|
|
|
|
class ActionShowBookDetails(InterfaceActionBase):
|
|
name = 'Show Book Details'
|
|
actual_plugin = 'ebook_converter.gui2.actions.show_book_details:ShowBookDetailsAction'
|
|
description = 'Show Book details in a separate popup'
|
|
|
|
|
|
class ActionRestart(InterfaceActionBase):
|
|
name = 'Restart'
|
|
actual_plugin = 'ebook_converter.gui2.actions.restart:RestartAction'
|
|
description = 'Restart calibre'
|
|
|
|
|
|
class ActionOpenFolder(InterfaceActionBase):
|
|
name = 'Open Folder'
|
|
actual_plugin = 'ebook_converter.gui2.actions.open:OpenFolderAction'
|
|
description = ('Open the folder that contains the book files in your'
|
|
' calibre library')
|
|
|
|
|
|
class ActionSendToDevice(InterfaceActionBase):
|
|
name = 'Send To Device'
|
|
actual_plugin = 'ebook_converter.gui2.actions.device:SendToDeviceAction'
|
|
description = 'Send books to the connected device'
|
|
|
|
|
|
class ActionConnectShare(InterfaceActionBase):
|
|
name = 'Connect Share'
|
|
actual_plugin = 'ebook_converter.gui2.actions.device:ConnectShareAction'
|
|
description = ('Send books via email or the web. Also connect to'
|
|
' folders on your computer as if they are devices')
|
|
|
|
|
|
class ActionHelp(InterfaceActionBase):
|
|
name = 'Help'
|
|
actual_plugin = 'ebook_converter.gui2.actions.help:HelpAction'
|
|
description = 'Browse the calibre User Manual'
|
|
|
|
|
|
class ActionPreferences(InterfaceActionBase):
|
|
name = 'Preferences'
|
|
actual_plugin = 'ebook_converter.gui2.actions.preferences:PreferencesAction'
|
|
description = 'Customize calibre'
|
|
|
|
|
|
class ActionSimilarBooks(InterfaceActionBase):
|
|
name = 'Similar Books'
|
|
actual_plugin = 'ebook_converter.gui2.actions.similar_books:SimilarBooksAction'
|
|
description = 'Easily find books similar to the currently selected one'
|
|
|
|
|
|
class ActionChooseLibrary(InterfaceActionBase):
|
|
name = 'Choose Library'
|
|
actual_plugin = 'ebook_converter.gui2.actions.choose_library:ChooseLibraryAction'
|
|
description = ('Switch between different calibre libraries and perform '
|
|
'maintenance on them')
|
|
|
|
|
|
class ActionAddToLibrary(InterfaceActionBase):
|
|
name = 'Add To Library'
|
|
actual_plugin = 'ebook_converter.gui2.actions.add_to_library:AddToLibraryAction'
|
|
description = 'Copy books from the device to your calibre library'
|
|
|
|
|
|
class ActionEditCollections(InterfaceActionBase):
|
|
name = 'Edit Collections'
|
|
actual_plugin = 'ebook_converter.gui2.actions.edit_collections:EditCollectionsAction'
|
|
description = ('Edit the collections in which books are placed on your '
|
|
'device')
|
|
|
|
|
|
class ActionMatchBooks(InterfaceActionBase):
|
|
name = 'Match Books'
|
|
actual_plugin = 'ebook_converter.gui2.actions.match_books:MatchBookAction'
|
|
description = 'Match book on the devices to books in the library'
|
|
|
|
|
|
class ActionCopyToLibrary(InterfaceActionBase):
|
|
name = 'Copy To Library'
|
|
actual_plugin = 'ebook_converter.gui2.actions.copy_to_library:CopyToLibraryAction'
|
|
description = 'Copy a book from one calibre library to another'
|
|
|
|
|
|
class ActionTweakEpub(InterfaceActionBase):
|
|
name = 'Tweak ePub'
|
|
actual_plugin = 'ebook_converter.gui2.actions.tweak_epub:TweakEpubAction'
|
|
description = 'Edit e-books in the EPUB or AZW3 formats'
|
|
|
|
|
|
class ActionUnpackBook(InterfaceActionBase):
|
|
name = 'Unpack Book'
|
|
actual_plugin = 'ebook_converter.gui2.actions.unpack_book:UnpackBookAction'
|
|
description = ('Make small changes to EPUB or HTMLZ files in your '
|
|
'calibre library')
|
|
|
|
|
|
class ActionNextMatch(InterfaceActionBase):
|
|
name = 'Next Match'
|
|
actual_plugin = 'ebook_converter.gui2.actions.next_match:NextMatchAction'
|
|
description = ('Find the next or previous match when searching in '
|
|
'your calibre library in highlight mode')
|
|
|
|
|
|
class ActionPickRandom(InterfaceActionBase):
|
|
name = 'Pick Random Book'
|
|
actual_plugin = 'ebook_converter.gui2.actions.random:PickRandomAction'
|
|
description = 'Choose a random book from your calibre library'
|
|
|
|
|
|
class ActionSortBy(InterfaceActionBase):
|
|
name = 'Sort By'
|
|
actual_plugin = 'ebook_converter.gui2.actions.sort:SortByAction'
|
|
description = 'Sort the list of books'
|
|
|
|
|
|
class ActionMarkBooks(InterfaceActionBase):
|
|
name = 'Mark Books'
|
|
actual_plugin = 'ebook_converter.gui2.actions.mark_books:MarkBooksAction'
|
|
description = 'Temporarily mark books'
|
|
|
|
|
|
class ActionVirtualLibrary(InterfaceActionBase):
|
|
name = 'Virtual Library'
|
|
actual_plugin = 'ebook_converter.gui2.actions.virtual_library:VirtualLibraryAction'
|
|
description = 'Change the current Virtual library'
|
|
|
|
|
|
class ActionStore(InterfaceActionBase):
|
|
name = 'Store'
|
|
author = 'John Schember'
|
|
actual_plugin = 'ebook_converter.gui2.actions.store:StoreAction'
|
|
description = 'Search for books from different book sellers'
|
|
|
|
def customization_help(self, gui=False):
|
|
return 'Customize the behavior of the store search.'
|
|
|
|
def config_widget(self):
|
|
from ebook_converter.gui2.store.config.store import config_widget as get_cw
|
|
return get_cw()
|
|
|
|
def save_settings(self, config_widget):
|
|
from ebook_converter.gui2.store.config.store import save_settings as save
|
|
save(config_widget)
|
|
|
|
|
|
class ActionPluginUpdater(InterfaceActionBase):
|
|
name = 'Plugin Updater'
|
|
author = 'Grant Drake'
|
|
description = ('Get new ebook_converter plugins or update your existing '
|
|
'ones')
|
|
actual_plugin = 'calibre.gui2.actions.plugin_updates:PluginUpdaterAction'
|
|
|
|
|
|
plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog,
|
|
ActionConvert, ActionDelete, ActionEditMetadata, ActionView,
|
|
ActionFetchNews, ActionSaveToDisk, ActionQuickview, ActionPolish,
|
|
ActionShowBookDetails,ActionRestart, ActionOpenFolder, ActionConnectShare,
|
|
ActionSendToDevice, ActionHelp, ActionPreferences, ActionSimilarBooks,
|
|
ActionAddToLibrary, ActionEditCollections, ActionMatchBooks, ActionChooseLibrary,
|
|
ActionCopyToLibrary, ActionTweakEpub, ActionUnpackBook, ActionNextMatch, ActionStore,
|
|
ActionPluginUpdater, ActionPickRandom, ActionEditToC, ActionSortBy,
|
|
ActionMarkBooks, ActionEmbed, ActionTemplateTester, ActionTagMapper, ActionAuthorMapper,
|
|
ActionVirtualLibrary]
|
|
|
|
# }}}
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# Test load speed
|
|
import subprocess, textwrap
|
|
try:
|
|
subprocess.check_call(['python', '-c', textwrap.dedent(
|
|
'''
|
|
import init_calibre # noqa
|
|
|
|
def doit():
|
|
import ebook_converter.customize.builtins as b # noqa
|
|
|
|
def show_stats():
|
|
from pstats import Stats
|
|
s = Stats('/tmp/calibre_stats')
|
|
s.sort_stats('cumulative')
|
|
s.print_stats(30)
|
|
|
|
import cProfile
|
|
cProfile.run('doit()', '/tmp/calibre_stats')
|
|
show_stats()
|
|
|
|
'''
|
|
)])
|
|
except subprocess.CalledProcessError:
|
|
raise SystemExit(1)
|
|
try:
|
|
subprocess.check_call(['python', '-c', textwrap.dedent(
|
|
'''
|
|
import time, sys, init_calibre
|
|
st = time.time()
|
|
import ebook_converter.customize.builtins
|
|
t = time.time() - st
|
|
ret = 0
|
|
|
|
for x in ('lxml', 'ebook_converter.ebooks.BeautifulSoup', 'uuid',
|
|
'ebook_converter.utils.terminal', 'ebook_converter.utils.img', 'PIL', 'Image',
|
|
'sqlite3', 'mechanize', 'httplib', 'xml', 'inspect', 'urllib',
|
|
'ebook_converter.utils.date', 'ebook_converter.utils.config', 'platform',
|
|
'ebook_converter.utils.zipfile', 'ebook_converter.utils.formatter',
|
|
):
|
|
if x in sys.modules:
|
|
ret = 1
|
|
print (x, 'has been loaded by a plugin')
|
|
if ret:
|
|
print ('\\nA good way to track down what is loading something is to run'
|
|
' python -c "import init_calibre; import ebook_converter.customize.builtins"')
|
|
print()
|
|
print ('Time taken to import all plugins: %.2f'%t)
|
|
sys.exit(ret)
|
|
|
|
''')])
|
|
except subprocess.CalledProcessError:
|
|
raise SystemExit(1)
|