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'], c.add_opt('get_cover', ['--get-cover'],
help=_('Get the cover from the e-book and save it at as the ' help=_('Get the cover from the e-book and save it at as the '
'specified file.')) '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'], c.add_opt('to_opf', ['--to-opf'],
help=_('Specify the name of an OPF file. The metadata will ' help=_('Specify the name of an OPF file. The metadata will '
'be written to the OPF file.')) 'be written to the OPF file.'))
@ -182,7 +185,8 @@ def main(args=sys.argv):
if getattr(opts, pref.name) is not None: if getattr(opts, pref.name) is not None:
trying_to_set = True trying_to_set = True
break 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) mi = get_metadata(stream, stream_type, force_read_metadata=True)
if trying_to_set: if trying_to_set:
prints(_('Original metadata')+'::') prints(_('Original metadata')+'::')

View File

@ -10,7 +10,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
import io import io
import os import os
import posixpath import posixpath
from contextlib import closing, suppress from contextlib import closing, contextmanager, suppress
from calibre import CurrentDir from calibre import CurrentDir
from calibre.ebooks.metadata.opf import get_metadata as get_metadata_from_opf 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) 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): def get_cover(raster_cover, first_spine_item, reader):
zf = reader.archive zf = reader.archive
@ -241,7 +255,8 @@ def get_cover(raster_cover, first_spine_item, reader):
except Exception: except Exception:
pass 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): def get_metadata(stream, extract_cover=True):