diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py index e4a88580ae..5211d349e4 100644 --- a/src/calibre/ebooks/metadata/opf.py +++ b/src/calibre/ebooks/metadata/opf.py @@ -46,10 +46,18 @@ def set_metadata_opf2(root, cover_prefix, mi, opf_version, cover_data=None, appl opf.timestamp = mi.timestamp raster_cover = opf.raster_cover if raster_cover is None and cover_data is not None: - if cover_prefix and not cover_prefix.endswith('/'): - cover_prefix += '/' - name = cover_prefix + 'cover.jpg' - i = create_manifest_item(opf.root, name, 'cover') + guide_raster_cover = opf.guide_raster_cover + i = None + if guide_raster_cover is not None: + i = guide_raster_cover + raster_cover = i.get('href') + else: + if cover_prefix and not cover_prefix.endswith('/'): + cover_prefix += '/' + name = cover_prefix + 'cover.jpg' + i = create_manifest_item(opf.root, name, 'cover') + if i is not None: + raster_cover = name if i is not None: if opf_version.major < 3: [x.getparent().remove(x) for x in opf.root.xpath('//*[local-name()="meta" and @name="cover"]')] @@ -59,7 +67,6 @@ def set_metadata_opf2(root, cover_prefix, mi, opf_version, cover_data=None, appl for x in opf.root.xpath('//*[local-name()="item" and contains(@properties, "cover-image")]'): x.set('properties', x.get('properties').replace('cover-image', '').strip()) i.set('properties', 'cover-image') - raster_cover = name with pretty_print: return opf.render(), raster_cover diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py index 9a3868b428..674ce387e5 100644 --- a/src/calibre/ebooks/metadata/opf2.py +++ b/src/calibre/ebooks/metadata/opf2.py @@ -523,6 +523,7 @@ class OPF(object): # {{{ pubdate_path = XPath('descendant::*[re:match(name(), "date", "i")]') raster_cover_path = XPath('descendant::*[re:match(name(), "meta", "i") and ' + 're:match(@name, "cover", "i") and @content]') + guide_cover_path = XPath('descendant::*[local-name()="guide"]/*[local-name()="reference" and re:match(@type, "cover", "i")]/@href') identifier_path = XPath('descendant::*[re:match(name(), "identifier", "i")]') application_id_path = XPath('descendant::*[re:match(name(), "identifier", "i") and '+ '(re:match(@opf:scheme, "calibre|libprs500", "i") or re:match(@scheme, "calibre|libprs500", "i"))]') @@ -1173,6 +1174,19 @@ class OPF(object): # {{{ if mt and 'xml' not in mt and 'html' not in mt: return item.get('href', None) + @property + def guide_raster_cover(self): + covers = self.guide_cover_path(self.root) + if covers: + mt_map = {i.get('href'):i for i in self.itermanifest()} + for href in covers: + if href: + i = mt_map.get(href) + if i is not None: + iid, mt = i.get('id'), i.get('media-type') + if iid and mt and mt.lower() in {'image/png', 'image/jpeg', 'image/jpg', 'image/gif'}: + return i + @property def epub3_nav(self): if self.package_version >= 3.0: