AFAIK, a zipped epub archive needs be packed in certain sequence and the mimetype needs be added first and uncompressed.
The Sigil Plugin runner routines contain this Python 3 code that worked fine for me:
Code:
epub_mimetype = b'application/epub+zip'
def unzip_epub_to_dir(path_to_epub, destdir):
f = open(pathof(path_to_epub), 'rb')
sz = ZipFile(f)
for name in sz.namelist():
data = sz.read(name)
name = name.replace("/", os.sep)
filepath = os.path.join(destdir,name)
basedir = os.path.dirname(filepath)
if not os.path.isdir(basedir):
os.makedirs(basedir)
with open(filepath,'wb') as fp:
fp.write(data)
f.close()
def epub_zip_up_book_contents(ebook_path, epub_filepath):
outzip = zipfile.ZipFile(pathof(epub_filepath), 'w')
files = unipath.walk(ebook_path)
if 'mimetype' in files:
outzip.write(pathof(os.path.join(ebook_path, 'mimetype')), pathof('mimetype'), zipfile.ZIP_STORED)
else:
raise Exception('mimetype file is missing')
files.remove('mimetype')
for file in files:
filepath = os.path.join(ebook_path, file)
outzip.write(pathof(filepath),pathof(file),zipfile.ZIP_DEFLATED)
outzip.close()
You can find the latest version (with all required imports, e.g. zipfile, os) on
Github.
Since you're a Linux user, you could also use a
shell script.
Alternatively, you could also run your Python code in
Calibre Editor as a function or write a Sigil plugin.
This way all the packing and unpacking is handled by the hosting app.