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.
This commit is contained in:
Kovid Goyal 2017-02-01 09:30:44 +05:30
parent d2d3f8b67f
commit 1428b0afda
2 changed files with 26 additions and 8 deletions

View File

@ -1101,6 +1101,8 @@ OptionRecommendation(name='search_replace',
self.opts.source = self.opts.input_profile self.opts.source = self.opts.input_profile
self.opts.dest = self.opts.output_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 from calibre.ebooks.oeb.transforms.metadata import MergeMetadata
MergeMetadata()(self.oeb, self.user_metadata, self.opts, MergeMetadata()(self.oeb, self.user_metadata, self.opts,
override_input_metadata=self.override_input_metadata) override_input_metadata=self.override_input_metadata)

View File

@ -34,11 +34,7 @@ class SafeFormatter(Formatter):
return '' return ''
class Jacket(object): class Base(object):
'''
Book jacket manipulation. Remove first image and insert comments at start of
book.
'''
def remove_images(self, item, limit=1): def remove_images(self, item, limit=1):
path = XPath('//h:img[@src]') path = XPath('//h:img[@src]')
@ -50,13 +46,19 @@ class Jacket(object):
image = self.oeb.manifest.hrefs.get(href, None) image = self.oeb.manifest.hrefs.get(href, None)
if image is not None: if image is not None:
self.oeb.manifest.remove(image) self.oeb.manifest.remove(image)
self.oeb.guide.remove_by_href(href)
img.getparent().remove(img) img.getparent().remove(img)
removed += 1 removed += 1
return removed return removed
class RemoveFirstImage(Base):
def remove_first_image(self): def remove_first_image(self):
deleted_item = None deleted_item = None
for item in self.oeb.spine: for item in self.oeb.spine:
if XPath(JACKET_XPATH)(item.data):
continue
removed = self.remove_images(item) removed = self.remove_images(item)
if removed > 0: if removed > 0:
self.log('Removed first image') self.log('Removed first image')
@ -74,6 +76,23 @@ class Jacket(object):
href = urldefrag(item.href)[0] href = urldefrag(item.href)[0]
if href == deleted_item.href: if href == deleted_item.href:
self.oeb.toc.remove(item) 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): def insert_metadata(self, mi):
self.log('Inserting metadata into book...') self.log('Inserting metadata into book...')
@ -125,8 +144,6 @@ class Jacket(object):
''' '''
self.oeb, self.opts, self.log = oeb, opts, oeb.log self.oeb, self.opts, self.log = oeb, opts, oeb.log
self.remove_existing_jacket() self.remove_existing_jacket()
if opts.remove_first_image:
self.remove_first_image()
if opts.insert_metadata: if opts.insert_metadata:
self.insert_metadata(metadata) self.insert_metadata(metadata)
@ -338,4 +355,3 @@ def referenced_images(root):
path = path[1:] path = path[1:]
if os.path.exists(path): if os.path.exists(path):
yield img, path yield img, path