Support reading metadata from KEPUB files

This commit is contained in:
Kovid Goyal 2025-02-21 10:44:10 +05:30
parent e23dcffe43
commit 30bcd86634
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 18 additions and 14 deletions

View File

@ -167,14 +167,14 @@ class CHMMetadataReader(MetadataReaderPlugin):
class EPUBMetadataReader(MetadataReaderPlugin): class EPUBMetadataReader(MetadataReaderPlugin):
name = 'Read EPUB metadata' name = 'Read EPUB metadata'
file_types = {'epub'} file_types = {'epub', 'kepub'}
description = _('Read metadata from %s files')%'EPUB' description = _('Read metadata from EPUB and KEPUB files')
def get_metadata(self, stream, ftype): def get_metadata(self, stream, ftype):
from calibre.ebooks.metadata.epub import get_metadata, get_quick_metadata from calibre.ebooks.metadata.epub import get_metadata, get_quick_metadata
if self.quick: if self.quick:
return get_quick_metadata(stream) return get_quick_metadata(stream, ftype=ftype)
return get_metadata(stream) return get_metadata(stream, ftype=ftype)
class FB2MetadataReader(MetadataReaderPlugin): class FB2MetadataReader(MetadataReaderPlugin):

View File

@ -258,12 +258,12 @@ def get_cover(raster_cover, first_spine_item, reader):
return render_cover(first_spine_item, zf, reader=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 ''' ''' Return metadata as a :class:`Metadata` object '''
stream.seek(0) stream.seek(0)
reader = get_zip_reader(stream) reader = get_zip_reader(stream)
opfbytes = reader.read_bytes(reader.opf_path) 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: if extract_cover:
base = posixpath.dirname(reader.opf_path) base = posixpath.dirname(reader.opf_path)
if raster_cover: if raster_cover:
@ -281,7 +281,7 @@ def get_metadata(stream, extract_cover=True):
return mi return mi
def get_quick_metadata(stream): def get_quick_metadata(stream, ftype='epub'):
return get_metadata(stream, False) return get_metadata(stream, False)

View File

@ -20,26 +20,30 @@ class DummyFile:
return self.raw return self.raw
def get_metadata2(root, ver): def get_metadata2(root, ver, ftype='epub'):
opf = OPF(None, preparsed_opf=root, read_toc=False) 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) 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')) ver = parse_opf_version(root.get('version'))
f = get_metadata2 if ver.major < 3 else get_metadata3 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): if isinstance(stream, bytes):
stream = DummyFile(stream) stream = DummyFile(stream)
root = parse_opf(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, def set_metadata_opf2(root, cover_prefix, mi, opf_version,