ebook-meta: Add an option to disallow rendered cover of first page for EPUB

This commit is contained in:
Kovid Goyal 2024-10-27 21:45:28 +05:30
parent 57017c437e
commit cec78caa1f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 22 additions and 3 deletions

View File

@ -81,6 +81,9 @@ def config():
c.add_opt('get_cover', ['--get-cover'],
help=_('Get the cover from the e-book and save it at as the '
'specified file.'))
c.add_opt('disallow_rendered_cover', ['--disallow-rendered-cover'], action='store_true', help=_(
'For formats like EPUB that use a "default cover" of the first page rendered, disallow such default covers'))
c.add_opt('to_opf', ['--to-opf'],
help=_('Specify the name of an OPF file. The metadata will '
'be written to the OPF file.'))
@ -182,7 +185,8 @@ def main(args=sys.argv):
if getattr(opts, pref.name) is not None:
trying_to_set = True
break
with open(path, 'rb') as stream:
from calibre.ebooks.metadata.epub import epub_metadata_settings
with open(path, 'rb') as stream, epub_metadata_settings(allow_rendered_cover=not opts.disallow_rendered_cover):
mi = get_metadata(stream, stream_type, force_read_metadata=True)
if trying_to_set:
prints(_('Original metadata')+'::')

View File

@ -10,7 +10,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
import io
import os
import posixpath
from contextlib import closing, suppress
from contextlib import closing, contextmanager, suppress
from calibre import CurrentDir
from calibre.ebooks.metadata.opf import get_metadata as get_metadata_from_opf
@ -230,6 +230,20 @@ def render_cover(cpage, zf, reader=None):
return render_html_svg_workaround(cpage, default_log, root=tdir)
epub_allow_rendered_cover = True
@contextmanager
def epub_metadata_settings(allow_rendered_cover=epub_allow_rendered_cover):
global epub_allow_rendered_cover
oarc = epub_allow_rendered_cover
epub_allow_rendered_cover = allow_rendered_cover
try:
yield
finally:
epub_allow_rendered_cover = oarc
def get_cover(raster_cover, first_spine_item, reader):
zf = reader.archive
@ -241,6 +255,7 @@ def get_cover(raster_cover, first_spine_item, reader):
except Exception:
pass
if epub_allow_rendered_cover:
return render_cover(first_spine_item, zf, reader=reader)