Code to render books without an auto-generated cover

This commit is contained in:
Kovid Goyal 2019-10-14 09:05:55 +05:30
parent cc8918d470
commit 7a9e791506
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 22 additions and 5 deletions

View File

@ -440,6 +440,19 @@ def remove_cover_image_in_page(container, page, cover_images):
break break
def has_epub_cover(container):
if find_cover_image(container):
return True
if find_cover_page(container):
return True
spine_items = tuple(container.spine_items)
if spine_items:
candidate = container.abspath_to_name(spine_items[0])
if find_cover_image_in_page(container, candidate) is not None:
return True
return False
def set_epub_cover(container, cover_path, report, options=None, image_callback=None): def set_epub_cover(container, cover_path, report, options=None, image_callback=None):
existing_image = options is not None and options.get('existing_image', False) existing_image = options is not None and options.get('existing_image', False)
if existing_image: if existing_image:

View File

@ -25,7 +25,9 @@ from calibre.ebooks.oeb.base import (
) )
from calibre.ebooks.oeb.iterator.book import extract_book from calibre.ebooks.oeb.iterator.book import extract_book
from calibre.ebooks.oeb.polish.container import Container as ContainerBase from calibre.ebooks.oeb.polish.container import Container as ContainerBase
from calibre.ebooks.oeb.polish.cover import find_cover_image, set_epub_cover from calibre.ebooks.oeb.polish.cover import (
find_cover_image, has_epub_cover, set_epub_cover
)
from calibre.ebooks.oeb.polish.css import transform_css from calibre.ebooks.oeb.polish.css import transform_css
from calibre.ebooks.oeb.polish.toc import from_xpaths, get_landmarks, get_toc from calibre.ebooks.oeb.polish.toc import from_xpaths, get_landmarks, get_toc
from calibre.ebooks.oeb.polish.utils import extract, guess_type from calibre.ebooks.oeb.polish.utils import extract, guess_type
@ -201,8 +203,9 @@ class Container(ContainerBase):
tweak_mode = True tweak_mode = True
def __init__(self, path_to_ebook, tdir, log=None, book_hash=None, save_bookmark_data=False, book_metadata=None): def __init__(self, path_to_ebook, tdir, log=None, book_hash=None, save_bookmark_data=False, book_metadata=None, allow_no_cover=False):
log = log or default_log log = log or default_log
self.allow_no_cover = allow_no_cover
book_fmt, opfpath, input_fmt = extract_book(path_to_ebook, tdir, log=log) book_fmt, opfpath, input_fmt = extract_book(path_to_ebook, tdir, log=log)
ContainerBase.__init__(self, tdir, opfpath, log) ContainerBase.__init__(self, tdir, opfpath, log)
self.book_metadata = book_metadata self.book_metadata = book_metadata
@ -318,12 +321,16 @@ class Container(ContainerBase):
cdata = getattr(image_callback, 'cover_data', None) or generic_cover() cdata = getattr(image_callback, 'cover_data', None) or generic_cover()
data.write(cdata) data.write(cdata)
if self.allow_no_cover and not has_epub_cover(self):
return None, None
raster_cover_name, titlepage_name = set_epub_cover( raster_cover_name, titlepage_name = set_epub_cover(
self, cover_path, (lambda *a: None), options={'template':templ}, self, cover_path, (lambda *a: None), options={'template':templ},
image_callback=image_callback) image_callback=image_callback)
else: else:
raster_cover_name = find_cover_image(self, strict=True) raster_cover_name = find_cover_image(self, strict=True)
if raster_cover_name is None: if raster_cover_name is None:
if self.allow_no_cover:
return None, None
item = self.generate_item(name='cover.jpeg', id_prefix='cover') item = self.generate_item(name='cover.jpeg', id_prefix='cover')
raster_cover_name = self.href_to_name(item.get('href'), self.opf_name) raster_cover_name = self.href_to_name(item.get('href'), self.opf_name)
with self.open(raster_cover_name, 'wb') as dest: with self.open(raster_cover_name, 'wb') as dest:

View File

@ -44,9 +44,6 @@ def load_resources(book, root_name, previous_resources, proceed):
ui_operations.get_file(book, name, got_one) ui_operations.get_file(book, name, got_one)
def got_one(data, name, mimetype): def got_one(data, name, mimetype):
if False and name is book.manifest.title_page_name:
# Enable to have cover image not preserve aspect ratio
data = data.replace('width: auto; height: auto', 'width: 100vw; height: 100vh')
ans[name] = v'[data, mimetype]' ans[name] = v'[data, mimetype]'
if jstype(data) is 'string': if jstype(data) is 'string':
find_virtualized_resources(data) find_virtualized_resources(data)