From 1428b0afda9f253d974f7df4460f653c66ab8989 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 1 Feb 2017 09:30:44 +0530 Subject: [PATCH] Conversion: Fix regression that broke conversion of some epub files when using the "Remove first image" option. Fixes #1660699 [Private bug](https://bugs.launchpad.net/calibre/+bug/1660699) Conversion: Ensure that the "Remove first image" conversion option does not remove the new cover image specified as a conversion option. --- src/calibre/ebooks/conversion/plumber.py | 2 ++ src/calibre/ebooks/oeb/transforms/jacket.py | 32 +++++++++++++++------ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 3dfa5f0718..9918618a6b 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -1101,6 +1101,8 @@ OptionRecommendation(name='search_replace', self.opts.source = self.opts.input_profile self.opts.dest = self.opts.output_profile + from calibre.ebooks.oeb.transforms.jacket import RemoveFirstImage + RemoveFirstImage()(self.oeb, self.opts, self.user_metadata) from calibre.ebooks.oeb.transforms.metadata import MergeMetadata MergeMetadata()(self.oeb, self.user_metadata, self.opts, override_input_metadata=self.override_input_metadata) diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index defd29ae67..36a08a1266 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -34,11 +34,7 @@ class SafeFormatter(Formatter): return '' -class Jacket(object): - ''' - Book jacket manipulation. Remove first image and insert comments at start of - book. - ''' +class Base(object): def remove_images(self, item, limit=1): path = XPath('//h:img[@src]') @@ -50,13 +46,19 @@ class Jacket(object): image = self.oeb.manifest.hrefs.get(href, None) if image is not None: self.oeb.manifest.remove(image) + self.oeb.guide.remove_by_href(href) img.getparent().remove(img) removed += 1 return removed + +class RemoveFirstImage(Base): + def remove_first_image(self): deleted_item = None for item in self.oeb.spine: + if XPath(JACKET_XPATH)(item.data): + continue removed = self.remove_images(item) if removed > 0: self.log('Removed first image') @@ -74,6 +76,23 @@ class Jacket(object): href = urldefrag(item.href)[0] if href == deleted_item.href: self.oeb.toc.remove(item) + self.oeb.guide.remove_by_href(deleted_item.href) + + def __call__(self, oeb, opts, metadata): + ''' + Add metadata in jacket.xhtml if specified in opts + If not specified, remove previous jacket instance + ''' + self.oeb, self.opts, self.log = oeb, opts, oeb.log + if opts.remove_first_image: + self.remove_first_image() + + +class Jacket(Base): + ''' + Book jacket manipulation. Remove first image and insert comments at start of + book. + ''' def insert_metadata(self, mi): self.log('Inserting metadata into book...') @@ -125,8 +144,6 @@ class Jacket(object): ''' self.oeb, self.opts, self.log = oeb, opts, oeb.log self.remove_existing_jacket() - if opts.remove_first_image: - self.remove_first_image() if opts.insert_metadata: self.insert_metadata(metadata) @@ -338,4 +355,3 @@ def referenced_images(root): path = path[1:] if os.path.exists(path): yield img, path -