From 2c19714c4057942e8857579e979d87ddd6c35c69 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 2 Mar 2020 08:21:55 +0530 Subject: [PATCH] Automatically extract the source DOCX file from Kindle Create KPF files when adding them to calibre. If you prefer to preserve the KPF file you can disable the KPF Extract plugin in Preferences->Plugins --- src/calibre/customize/builtins.py | 4 ++-- src/calibre/ebooks/__init__.py | 2 +- src/calibre/ebooks/metadata/archive.py | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index a855be92fa..44880cbc0e 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -9,7 +9,7 @@ from calibre import guess_type from calibre.customize import (FileTypePlugin, MetadataReaderPlugin, MetadataWriterPlugin, PreferencesPlugin, InterfaceActionBase, StoreBase) from calibre.constants import numeric_version -from calibre.ebooks.metadata.archive import ArchiveExtract, get_comic_metadata +from calibre.ebooks.metadata.archive import ArchiveExtract, KPFExtract, get_comic_metadata from calibre.ebooks.html.to_zip import HTML2ZIP plugins = [] @@ -124,7 +124,7 @@ class TXT2TXTZ(FileTypePlugin): return path_to_ebook -plugins += [HTML2ZIP, PML2PMLZ, TXT2TXTZ, ArchiveExtract,] +plugins += [HTML2ZIP, PML2PMLZ, TXT2TXTZ, ArchiveExtract, KPFExtract] # }}} # Metadata reader plugins {{{ diff --git a/src/calibre/ebooks/__init__.py b/src/calibre/ebooks/__init__.py index c240ded56c..a88f7519f6 100644 --- a/src/calibre/ebooks/__init__.py +++ b/src/calibre/ebooks/__init__.py @@ -38,7 +38,7 @@ BOOK_EXTENSIONS = ['lrf', 'rar', 'zip', 'rtf', 'lit', 'txt', 'txtz', 'text', 'ht 'epub', 'fb2', 'fbz', 'djv', 'djvu', 'lrx', 'cbr', 'cbz', 'cbc', 'oebzip', 'rb', 'imp', 'odt', 'chm', 'tpz', 'azw1', 'pml', 'pmlz', 'mbp', 'tan', 'snb', 'xps', 'oxps', 'azw4', 'book', 'zbf', 'pobi', 'docx', 'docm', 'md', - 'textile', 'markdown', 'ibook', 'ibooks', 'iba', 'azw3', 'ps', 'kepub', 'kfx'] + 'textile', 'markdown', 'ibook', 'ibooks', 'iba', 'azw3', 'ps', 'kepub', 'kfx', 'kpf'] def return_raster_image(path): diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py index 2bdc35e76d..23be91decc 100644 --- a/src/calibre/ebooks/metadata/archive.py +++ b/src/calibre/ebooks/metadata/archive.py @@ -40,6 +40,29 @@ def archive_type(stream): return ans +class KPFExtract(FileTypePlugin): + + name = 'KPF Extract' + author = 'Kovid Goyal' + description = _('Extract the source DOCX file from Amazon Kindle Create KPF files.' + ' Note this will not contain any edits made in the Kindle Create program itself.') + file_types = {'kpf'} + supported_platforms = ['windows', 'osx', 'linux'] + on_import = True + + def run(self, archive): + from calibre.utils.zipfile import ZipFile + with ZipFile(archive, 'r') as zf: + fnames = zf.namelist() + candidates = [x for x in fnames if x.lower().endswith('.docx')] + if not candidates: + return archive + of = self.temporary_file('_kpf_extract.docx') + with closing(of): + of.write(zf.read(candidates[0])) + return of.name + + class ArchiveExtract(FileTypePlugin): name = 'Archive Extract' author = 'Kovid Goyal'