%PDF- %PDF-
| Direktori : /lib/calibre/calibre/ |
| Current File : //lib/calibre/calibre/libunzip.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
import re
from calibre.utils import zipfile
from calibre.utils.icu import numeric_sort_key
def update(pathtozip, patterns, filepaths, names, compression=zipfile.ZIP_DEFLATED, verbose=True):
'''
Update files in the zip file at `pathtozip` matching the given
`patterns` with the given `filepaths`. If more than
one file matches, all of the files are replaced.
:param patterns: A list of compiled regular expressions
:param filepaths: A list of paths to the replacement files. Must have the
same length as `patterns`.
:param names: A list of archive names for each file in filepaths.
A name can be `None` in which case the name of the existing
file in the archive is used.
:param compression: The compression to use when replacing files. Can be
either `zipfile.ZIP_DEFLATED` or `zipfile.ZIP_STORED`.
'''
assert len(patterns) == len(filepaths) == len(names)
z = zipfile.ZipFile(pathtozip, mode='a')
for name in z.namelist():
for pat, fname, new_name in zip(patterns, filepaths, names):
if pat.search(name):
if verbose:
print(f'Updating {name} with {fname}')
if new_name is None:
z.replace(fname, arcname=name, compress_type=compression)
else:
z.delete(name)
z.write(fname, new_name, compress_type=compression)
break
z.close()
def extract(filename, dir):
"""
Extract archive C{filename} into directory C{dir}
"""
zf = zipfile.ZipFile(filename)
zf.extractall(dir)
def sort_key(filename):
bn, ext = filename.rpartition('.')[::2]
if not bn and ext:
bn, ext = ext, bn
return (numeric_sort_key(bn), numeric_sort_key(ext))
def extract_member(filename, match=re.compile(r'\.(jpg|jpeg|gif|png)\s*$', re.I), sort_alphabetically=False):
zf = zipfile.ZipFile(filename)
names = list(zf.namelist())
if sort_alphabetically:
names.sort(key=sort_key)
for name in names:
if match.search(name):
return name, zf.read(name)
comic_exts = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
def name_ok(name):
return bool(name and not name.startswith('__MACOSX/') and name.rpartition('.')[-1].lower() in comic_exts)
def extract_cover_image(filename):
with zipfile.ZipFile(filename) as zf:
for name in sorted(zf.namelist(), key=sort_key):
if name_ok(name):
return name, zf.read(name)