mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Code to update cached conversions
This commit is contained in:
parent
55fbc89eb6
commit
bc8fdc4ced
@ -18,7 +18,7 @@ from calibre.srv.render_book import RENDER_VERSION
|
|||||||
from calibre.utils.ipc.simple_worker import fork_job
|
from calibre.utils.ipc.simple_worker import fork_job
|
||||||
from calibre.utils.lock import ExclusiveFile
|
from calibre.utils.lock import ExclusiveFile
|
||||||
from calibre.utils.short_uuid import uuid4
|
from calibre.utils.short_uuid import uuid4
|
||||||
from polyglot.builtins import as_bytes, as_unicode
|
from polyglot.builtins import as_bytes, as_unicode, iteritems
|
||||||
|
|
||||||
DAY = 24 * 3600
|
DAY = 24 * 3600
|
||||||
|
|
||||||
@ -118,15 +118,16 @@ def do_convert(path, temp_path, key, instance):
|
|||||||
instance['cache_size'] = size
|
instance['cache_size'] = size
|
||||||
|
|
||||||
|
|
||||||
|
def save_metadata(metadata, f):
|
||||||
|
f.seek(0), f.truncate(), f.write(as_bytes(json.dumps(metadata, indent=2)))
|
||||||
|
|
||||||
|
|
||||||
def prepare_book(path, convert_func=do_convert, max_age=30 * DAY):
|
def prepare_book(path, convert_func=do_convert, max_age=30 * DAY):
|
||||||
st = os.stat(path)
|
st = os.stat(path)
|
||||||
key = book_hash(path, st.st_size, st.st_mtime)
|
key = book_hash(path, st.st_size, st.st_mtime)
|
||||||
finished_path = safe_makedirs(os.path.join(book_cache_dir(), 'f'))
|
finished_path = safe_makedirs(os.path.join(book_cache_dir(), 'f'))
|
||||||
temp_path = safe_makedirs(os.path.join(book_cache_dir(), 't'))
|
temp_path = safe_makedirs(os.path.join(book_cache_dir(), 't'))
|
||||||
|
|
||||||
def save_metadata(metadata, f):
|
|
||||||
f.seek(0), f.truncate(), f.write(as_bytes(json.dumps(metadata, indent=2)))
|
|
||||||
|
|
||||||
with cache_lock() as f:
|
with cache_lock() as f:
|
||||||
try:
|
try:
|
||||||
metadata = json.loads(f.read())
|
metadata = json.loads(f.read())
|
||||||
@ -165,6 +166,39 @@ def prepare_book(path, convert_func=do_convert, max_age=30 * DAY):
|
|||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
|
||||||
|
def update_book(path, old_stat, name_data_map=None):
|
||||||
|
old_key = book_hash(path, old_stat.st_size, old_stat.st_mtime)
|
||||||
|
finished_path = safe_makedirs(os.path.join(book_cache_dir(), 'f'))
|
||||||
|
|
||||||
|
with cache_lock() as f:
|
||||||
|
st = os.stat(path)
|
||||||
|
new_key = book_hash(path, st.st_size, st.st_mtime)
|
||||||
|
if old_key == new_key:
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
metadata = json.loads(f.read())
|
||||||
|
except ValueError:
|
||||||
|
metadata = {'entries': {}, 'last_clear_at': 0}
|
||||||
|
entries = metadata['entries']
|
||||||
|
instances = entries.get(old_key)
|
||||||
|
if not instances:
|
||||||
|
return
|
||||||
|
for instance in tuple(instances):
|
||||||
|
if instance['status'] == 'finished':
|
||||||
|
entries.setdefault(new_key, []).append(instance)
|
||||||
|
instances.remove(instance)
|
||||||
|
if not instances:
|
||||||
|
del entries[old_key]
|
||||||
|
instance['file_mtime'] = st.st_mtime
|
||||||
|
instance['file_size'] = st.st_size
|
||||||
|
if name_data_map:
|
||||||
|
for name, data in iteritems(name_data_map):
|
||||||
|
with open(os.path.join(finished_path, instance['path'], name), 'wb') as f2:
|
||||||
|
f2.write(data)
|
||||||
|
save_metadata(metadata, f)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def find_tests():
|
def find_tests():
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
@ -205,4 +239,24 @@ def find_tests():
|
|||||||
prepare_book(book_src, convert_func=convert_mock, max_age=-1000)
|
prepare_book(book_src, convert_func=convert_mock, max_age=-1000)
|
||||||
self.ae([], os.listdir(os.path.join(book_cache_dir(), 'f')))
|
self.ae([], os.listdir(os.path.join(book_cache_dir(), 'f')))
|
||||||
|
|
||||||
|
# Test updating cached book
|
||||||
|
book_src = os.path.join(self.tdir, 'book2.epub')
|
||||||
|
open(book_src, 'wb').write(b'bb')
|
||||||
|
path = prepare_book(book_src, convert_func=convert_mock)
|
||||||
|
self.ae(open(os.path.join(path, 'sentinel'), 'rb').read(), b'test')
|
||||||
|
bs = os.stat(book_src)
|
||||||
|
open(book_src, 'wb').write(b'cde')
|
||||||
|
update_book(book_src, bs, name_data_map={'sentinel': b'updated'})
|
||||||
|
self.ae(open(os.path.join(path, 'sentinel'), 'rb').read(), b'updated')
|
||||||
|
self.ae(1, len(os.listdir(os.path.join(book_cache_dir(), 'f'))))
|
||||||
|
with cache_lock() as f:
|
||||||
|
metadata = json.loads(f.read())
|
||||||
|
self.ae(len(metadata['entries']), 1)
|
||||||
|
entry = list(metadata['entries'].values())[0]
|
||||||
|
self.ae(len(entry), 1)
|
||||||
|
entry = entry[0]
|
||||||
|
st = os.stat(book_src)
|
||||||
|
self.ae(entry['file_size'], st.st_size)
|
||||||
|
self.ae(entry['file_mtime'], st.st_mtime)
|
||||||
|
|
||||||
return unittest.defaultTestLoader.loadTestsFromTestCase(TestViewerCache)
|
return unittest.defaultTestLoader.loadTestsFromTestCase(TestViewerCache)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user