mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
MOBI Output: Remove the --kindlegen option so I don't have to deal with people demanding kindlegen support in calibre
This commit is contained in:
parent
7128bcee12
commit
2d3cdfedf3
@ -1,86 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
|
||||||
from __future__ import (unicode_literals, division, absolute_import,
|
|
||||||
print_function)
|
|
||||||
|
|
||||||
__license__ = 'GPL v3'
|
|
||||||
__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
|
|
||||||
__docformat__ = 'restructuredtext en'
|
|
||||||
|
|
||||||
import os, subprocess, shutil, tempfile
|
|
||||||
|
|
||||||
from lxml import etree
|
|
||||||
|
|
||||||
from calibre.constants import iswindows
|
|
||||||
from calibre.customize.ui import plugin_for_output_format
|
|
||||||
from calibre.ptempfile import TemporaryDirectory
|
|
||||||
from calibre.ebooks.mobi.utils import detect_periodical
|
|
||||||
from calibre import CurrentDir
|
|
||||||
|
|
||||||
exe = 'kindlegen.exe' if iswindows else 'kindlegen'
|
|
||||||
|
|
||||||
def refactor_opf(opf, is_periodical, toc):
|
|
||||||
with open(opf, 'rb') as f:
|
|
||||||
root = etree.fromstring(f.read())
|
|
||||||
'''
|
|
||||||
for spine in root.xpath('//*[local-name() = "spine" and @toc]'):
|
|
||||||
# Do not use the NCX toc as kindlegen requires the section structure
|
|
||||||
# in the TOC to be duplicated in the HTML, asinine!
|
|
||||||
del spine.attrib['toc']
|
|
||||||
'''
|
|
||||||
if is_periodical:
|
|
||||||
metadata = root.xpath('//*[local-name() = "metadata"]')[0]
|
|
||||||
xm = etree.SubElement(metadata, 'x-metadata')
|
|
||||||
xm.tail = '\n'
|
|
||||||
xm.text = '\n\t'
|
|
||||||
mobip = etree.SubElement(xm, 'output', attrib={'encoding':"utf-8",
|
|
||||||
'content-type':"application/x-mobipocket-subscription-magazine"})
|
|
||||||
mobip.tail = '\n\t'
|
|
||||||
with open(opf, 'wb') as f:
|
|
||||||
f.write(etree.tostring(root, method='xml', encoding='utf-8',
|
|
||||||
xml_declaration=True))
|
|
||||||
|
|
||||||
|
|
||||||
def refactor_guide(oeb):
|
|
||||||
for key in list(oeb.guide):
|
|
||||||
if key not in ('toc', 'start', 'masthead'):
|
|
||||||
oeb.guide.remove(key)
|
|
||||||
|
|
||||||
def run_kindlegen(opf, log):
|
|
||||||
log.info('Running kindlegen on MOBIML created by calibre')
|
|
||||||
oname = os.path.splitext(opf)[0] + '.mobi'
|
|
||||||
p = subprocess.Popen([exe, opf, '-c1', '-verbose', '-o', oname],
|
|
||||||
stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
|
|
||||||
ko = p.stdout.read()
|
|
||||||
returncode = p.wait()
|
|
||||||
log.debug('kindlegen verbose output:')
|
|
||||||
log.debug(ko.decode('utf-8', 'replace'))
|
|
||||||
log.info('kindlegen returned returncode: %d'%returncode)
|
|
||||||
if not os.path.exists(oname) or os.stat(oname).st_size < 100:
|
|
||||||
raise RuntimeError('kindlegen did not produce any output. '
|
|
||||||
'kindlegen return code: %d'%returncode)
|
|
||||||
return oname
|
|
||||||
|
|
||||||
def kindlegen(oeb, opts, input_plugin, output_path):
|
|
||||||
is_periodical = detect_periodical(oeb.toc, oeb.log)
|
|
||||||
refactor_guide(oeb)
|
|
||||||
with TemporaryDirectory('_kindlegen_output') as tdir:
|
|
||||||
oeb_output = plugin_for_output_format('oeb')
|
|
||||||
oeb_output.convert(oeb, tdir, input_plugin, opts, oeb.log)
|
|
||||||
opf = [x for x in os.listdir(tdir) if x.endswith('.opf')][0]
|
|
||||||
refactor_opf(os.path.join(tdir, opf), is_periodical, oeb.toc)
|
|
||||||
try:
|
|
||||||
td = tempfile.gettempdir()
|
|
||||||
kd = os.path.join(td, 'kindlegen')
|
|
||||||
if os.path.exists(kd):
|
|
||||||
shutil.rmtree(kd)
|
|
||||||
shutil.copytree(tdir, kd)
|
|
||||||
oeb.log('kindlegen intermediate output stored in: %s'%kd)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
with CurrentDir(tdir):
|
|
||||||
oname = run_kindlegen(opf, oeb.log)
|
|
||||||
shutil.copyfile(oname, output_path)
|
|
||||||
|
|
||||||
|
|
@ -55,13 +55,6 @@ class MOBIOutput(OutputFormatPlugin):
|
|||||||
' specified directory. If the directory already '
|
' specified directory. If the directory already '
|
||||||
'exists, it will be deleted.')
|
'exists, it will be deleted.')
|
||||||
),
|
),
|
||||||
OptionRecommendation(name='kindlegen',
|
|
||||||
recommended_value=False,
|
|
||||||
help=('Use kindlegen (must be in your PATH) to generate the'
|
|
||||||
' binary wrapper for the MOBI format. Useful to debug '
|
|
||||||
' the calibre MOBI output.')
|
|
||||||
),
|
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
||||||
def check_for_periodical(self):
|
def check_for_periodical(self):
|
||||||
@ -175,13 +168,9 @@ class MOBIOutput(OutputFormatPlugin):
|
|||||||
MobiWriter
|
MobiWriter
|
||||||
else:
|
else:
|
||||||
from calibre.ebooks.mobi.writer import MobiWriter
|
from calibre.ebooks.mobi.writer import MobiWriter
|
||||||
if opts.kindlegen:
|
writer = MobiWriter(opts,
|
||||||
from calibre.ebooks.mobi.kindlegen import kindlegen
|
write_page_breaks_after_item=write_page_breaks_after_item)
|
||||||
kindlegen(oeb, opts, input_plugin, output_path)
|
writer(oeb, output_path)
|
||||||
else:
|
|
||||||
writer = MobiWriter(opts,
|
|
||||||
write_page_breaks_after_item=write_page_breaks_after_item)
|
|
||||||
writer(oeb, output_path)
|
|
||||||
|
|
||||||
if opts.extract_to is not None:
|
if opts.extract_to is not None:
|
||||||
from calibre.ebooks.mobi.debug import inspect_mobi
|
from calibre.ebooks.mobi.debug import inspect_mobi
|
||||||
|
Loading…
x
Reference in New Issue
Block a user