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'