From 28a258c2919924a864471eaa484bd4bf970c6b9a Mon Sep 17 00:00:00 2001 From: Alex Gleyzer Date: Fri, 31 Jan 2025 15:50:29 -0500 Subject: [PATCH] improve cover image retrieval logic --- audiblez.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/audiblez.py b/audiblez.py index 9c24290..592a4c2 100755 --- a/audiblez.py +++ b/audiblez.py @@ -45,10 +45,11 @@ def main(kokoro, file_path, lang, voice, pick_manually, speed, providers): title = book.get_metadata('DC', 'title')[0][0] creator = book.get_metadata('DC', 'creator')[0][0] - cover_maybe = [c for c in book.get_items() if c.get_type() == ebooklib.ITEM_COVER] - cover_image = cover_maybe[0].get_content() if cover_maybe else b"" + cover_maybe = find_cover(book) + cover_image = cover_maybe.get_content() if cover_maybe else b"" if cover_maybe: - print(f'Found cover image {cover_maybe[0].file_name} in {cover_maybe[0].media_type} format') + print(f'Found cover image {cover_maybe.file_name} in {cover_maybe.media_type} format') + exit(0); intro = f'{title} by {creator}' print(intro) @@ -105,6 +106,27 @@ def main(kokoro, file_path, lang, voice, pick_manually, speed, providers): create_index_file(title, creator, chapter_mp3_files, durations) create_m4b(chapter_mp3_files, filename, title, creator, cover_image) +def find_cover(book): + def is_image(item): + return item is not None and item.media_type.startswith('image/') + + for item in book.get_items_of_type(ebooklib.ITEM_COVER): + if is_image(item): + return item + + # https://idpf.org/forum/topic-715 + for meta in book.get_metadata('OPF', 'cover'): + if is_image(item := book.get_item_with_id(meta[1]['content'])): + return item + + if is_image(item := book.get_item_with_id('cover')): + return item + + for item in book.get_items_of_type(ebooklib.ITEM_IMAGE): + if 'cover' in item.get_name().lower() and is_image(item): + return item + + return None def extract_texts(chapters): texts = []