From cec78caa1f0b01b1996274fc9d245df66b6ce0ff Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 27 Oct 2024 21:45:28 +0530 Subject: [PATCH] ebook-meta: Add an option to disallow rendered cover of first page for EPUB --- src/calibre/ebooks/metadata/cli.py | 6 +++++- src/calibre/ebooks/metadata/epub.py | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/metadata/cli.py b/src/calibre/ebooks/metadata/cli.py index e1f913a0ce..13492c67fe 100644 --- a/src/calibre/ebooks/metadata/cli.py +++ b/src/calibre/ebooks/metadata/cli.py @@ -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')+'::') diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index ef6368a1ce..70cbd08b8c 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -10,7 +10,7 @@ __copyright__ = '2008, Kovid Goyal ' 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,7 +255,8 @@ def get_cover(raster_cover, first_spine_item, reader): except Exception: pass - return render_cover(first_spine_item, zf, reader=reader) + if epub_allow_rendered_cover: + return render_cover(first_spine_item, zf, reader=reader) def get_metadata(stream, extract_cover=True):