mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix exporting of data not storing timestamps for format and extra files
Also make the code DRYer
This commit is contained in:
parent
d6b602a085
commit
bcc8ea4d5e
@ -46,7 +46,7 @@ from calibre.ebooks.metadata.book.base import Metadata
|
|||||||
from calibre.ebooks.metadata.opf2 import metadata_to_opf
|
from calibre.ebooks.metadata.opf2 import metadata_to_opf
|
||||||
from calibre.ptempfile import PersistentTemporaryFile, SpooledTemporaryFile, base_dir
|
from calibre.ptempfile import PersistentTemporaryFile, SpooledTemporaryFile, base_dir
|
||||||
from calibre.utils.config import prefs, tweaks
|
from calibre.utils.config import prefs, tweaks
|
||||||
from calibre.utils.date import UNDEFINED_DATE, utcnow
|
from calibre.utils.date import UNDEFINED_DATE, timestampfromdt, utcnow
|
||||||
from calibre.utils.date import now as nowf
|
from calibre.utils.date import now as nowf
|
||||||
from calibre.utils.filenames import make_long_path_useable
|
from calibre.utils.filenames import make_long_path_useable
|
||||||
from calibre.utils.icu import lower as icu_lower
|
from calibre.utils.icu import lower as icu_lower
|
||||||
@ -3158,7 +3158,10 @@ class Cache:
|
|||||||
mdata = self.format_metadata(book_id, fmt)
|
mdata = self.format_metadata(book_id, fmt)
|
||||||
key = f'{key_prefix}:{book_id}:{fmt}'
|
key = f'{key_prefix}:{book_id}:{fmt}'
|
||||||
fm[fmt] = key
|
fm[fmt] = key
|
||||||
with exporter.start_file(key, mtime=mdata.get('mtime')) as dest:
|
mtime = mdata.get('mtime')
|
||||||
|
if mtime is not None:
|
||||||
|
mtime = timestampfromdt(mtime)
|
||||||
|
with exporter.start_file(key, mtime=mtime) as dest:
|
||||||
self._copy_format_to(book_id, fmt, dest, report_file_size=dest.ensure_space)
|
self._copy_format_to(book_id, fmt, dest, report_file_size=dest.ensure_space)
|
||||||
cover_key = '{}:{}:{}'.format(key_prefix, book_id, '.cover')
|
cover_key = '{}:{}:{}'.format(key_prefix, book_id, '.cover')
|
||||||
with exporter.start_file(cover_key) as dest:
|
with exporter.start_file(cover_key) as dest:
|
||||||
|
@ -25,18 +25,6 @@ from polyglot.builtins import error_message, iteritems
|
|||||||
|
|
||||||
# Export {{{
|
# Export {{{
|
||||||
|
|
||||||
|
|
||||||
def send_file(from_obj, to_obj, chunksize=1<<20):
|
|
||||||
m = hashlib.sha1()
|
|
||||||
while True:
|
|
||||||
raw = from_obj.read(chunksize)
|
|
||||||
if not raw:
|
|
||||||
break
|
|
||||||
m.update(raw)
|
|
||||||
to_obj.write(raw)
|
|
||||||
return str(m.hexdigest())
|
|
||||||
|
|
||||||
|
|
||||||
class FileDest:
|
class FileDest:
|
||||||
|
|
||||||
def __init__(self, key, exporter, mtime=None):
|
def __init__(self, key, exporter, mtime=None):
|
||||||
@ -44,7 +32,7 @@ class FileDest:
|
|||||||
self.hasher = hashlib.sha1()
|
self.hasher = hashlib.sha1()
|
||||||
self.start_pos = exporter.f.tell()
|
self.start_pos = exporter.f.tell()
|
||||||
self._discard = False
|
self._discard = False
|
||||||
self.mtime = None
|
self.mtime = mtime
|
||||||
|
|
||||||
def discard(self):
|
def discard(self):
|
||||||
self._discard = True
|
self._discard = True
|
||||||
@ -59,7 +47,7 @@ class FileDest:
|
|||||||
self.exporter.f.write(data)
|
self.exporter.f.write(data)
|
||||||
|
|
||||||
def flush(self):
|
def flush(self):
|
||||||
pass
|
self.exporter.f.flush()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if not self._discard:
|
if not self._discard:
|
||||||
@ -127,15 +115,8 @@ class Exporter:
|
|||||||
self.commit_part(is_last=True)
|
self.commit_part(is_last=True)
|
||||||
|
|
||||||
def add_file(self, fileobj, key):
|
def add_file(self, fileobj, key):
|
||||||
fileobj.seek(0, os.SEEK_END)
|
with self.start_file(key, os.fstat(fileobj.fileno()).st_mtime) as dest:
|
||||||
size = fileobj.tell()
|
shutil.copyfileobj(fileobj, dest)
|
||||||
fileobj.seek(0)
|
|
||||||
self.ensure_space(size)
|
|
||||||
pos = self.f.tell()
|
|
||||||
digest = send_file(fileobj, self.f)
|
|
||||||
size = self.f.tell() - pos
|
|
||||||
mtime = os.fstat(fileobj.fileno()).st_mtime
|
|
||||||
self.file_metadata[key] = (len(self.parts), pos, size, digest, mtime)
|
|
||||||
|
|
||||||
def start_file(self, key, mtime=None):
|
def start_file(self, key, mtime=None):
|
||||||
return FileDest(key, self, mtime=mtime)
|
return FileDest(key, self, mtime=mtime)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user