From 30bcd866345b61f47135678f132671434a36367f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 21 Feb 2025 10:44:10 +0530 Subject: [PATCH] Support reading metadata from KEPUB files --- src/calibre/customize/builtins.py | 8 ++++---- src/calibre/ebooks/metadata/epub.py | 6 +++--- src/calibre/ebooks/metadata/opf.py | 18 +++++++++++------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 497f08e345..9588ede62e 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -167,14 +167,14 @@ class CHMMetadataReader(MetadataReaderPlugin): class EPUBMetadataReader(MetadataReaderPlugin): name = 'Read EPUB metadata' - file_types = {'epub'} - description = _('Read metadata from %s files')%'EPUB' + file_types = {'epub', 'kepub'} + description = _('Read metadata from EPUB and KEPUB files') def get_metadata(self, stream, ftype): from calibre.ebooks.metadata.epub import get_metadata, get_quick_metadata if self.quick: - return get_quick_metadata(stream) - return get_metadata(stream) + return get_quick_metadata(stream, ftype=ftype) + return get_metadata(stream, ftype=ftype) class FB2MetadataReader(MetadataReaderPlugin): diff --git a/src/calibre/ebooks/metadata/epub.py b/src/calibre/ebooks/metadata/epub.py index 5f0a89f153..d89cce3e33 100644 --- a/src/calibre/ebooks/metadata/epub.py +++ b/src/calibre/ebooks/metadata/epub.py @@ -258,12 +258,12 @@ def get_cover(raster_cover, first_spine_item, reader): return render_cover(first_spine_item, zf, reader=reader) -def get_metadata(stream, extract_cover=True): +def get_metadata(stream, extract_cover=True, ftype='epub'): ''' Return metadata as a :class:`Metadata` object ''' stream.seek(0) reader = get_zip_reader(stream) opfbytes = reader.read_bytes(reader.opf_path) - mi, ver, raster_cover, first_spine_item = get_metadata_from_opf(opfbytes) + mi, ver, raster_cover, first_spine_item = get_metadata_from_opf(opfbytes, ftype) if extract_cover: base = posixpath.dirname(reader.opf_path) if raster_cover: @@ -281,7 +281,7 @@ def get_metadata(stream, extract_cover=True): return mi -def get_quick_metadata(stream): +def get_quick_metadata(stream, ftype='epub'): return get_metadata(stream, False) diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py index 090d966e68..b6f7800253 100644 --- a/src/calibre/ebooks/metadata/opf.py +++ b/src/calibre/ebooks/metadata/opf.py @@ -20,26 +20,30 @@ class DummyFile: return self.raw -def get_metadata2(root, ver): +def get_metadata2(root, ver, ftype='epub'): opf = OPF(None, preparsed_opf=root, read_toc=False) - return opf.to_book_metadata(), ver, opf.raster_cover, opf.first_spine_item() + if ftype == 'kepub': + raster_cover = opf.epub3_raster_cover or opf.raster_cover + else: + raster_cover = opf.raster_cover + return opf.to_book_metadata(), ver, raster_cover, opf.first_spine_item() -def get_metadata3(root, ver): +def get_metadata3(root, ver, ftype='epub'): return read_metadata(root, ver=ver, return_extra_data=True) -def get_metadata_from_parsed(root): +def get_metadata_from_parsed(root, ftype='epub'): ver = parse_opf_version(root.get('version')) f = get_metadata2 if ver.major < 3 else get_metadata3 - return f(root, ver) + return f(root, ver, ftype) -def get_metadata(stream): +def get_metadata(stream, ftype='epub'): if isinstance(stream, bytes): stream = DummyFile(stream) root = parse_opf(stream) - return get_metadata_from_parsed(root) + return get_metadata_from_parsed(root, ftype) def set_metadata_opf2(root, cover_prefix, mi, opf_version,