PDFTranslate / pdf2zh /cache.py
sanbo
update sth. at 2024-11-26 16:15:47
9b0f4a0
raw
history blame
2.4 kB
import tempfile
import os
import time
import hashlib
import shutil
cache_dir = os.path.join(tempfile.gettempdir(), "cache")
os.makedirs(cache_dir, exist_ok=True)
time_filename = "update_time"
max_cache = 5
def deterministic_hash(obj):
hash_object = hashlib.sha256()
hash_object.update(str(obj).encode())
return hash_object.hexdigest()[0:20]
def get_dirs():
dirs = [
os.path.join(cache_dir, dir)
for dir in os.listdir(cache_dir)
if os.path.isdir(os.path.join(cache_dir, dir))
]
return dirs
def get_time(dir):
try:
timefile = os.path.join(dir, time_filename)
t = float(open(timefile, encoding="utf-8").read())
return t
except FileNotFoundError:
# handle the error as needed, for now we'll just return a default value
return float(
"inf"
) # This ensures that this directory will be the first to be removed if required
def write_time(dir):
timefile = os.path.join(dir, time_filename)
t = time.time()
print(t, file=open(timefile, "w", encoding="utf-8"), end="")
def argmin(iterable):
return min(enumerate(iterable), key=lambda x: x[1])[0]
def remove_extra():
dirs = get_dirs()
for dir in dirs:
if not os.path.isdir(
dir
): # This line might be redundant now, as get_dirs() ensures only directories are returned
os.remove(dir)
try:
get_time(dir)
except BaseException:
shutil.rmtree(dir)
while True:
dirs = get_dirs()
if len(dirs) <= max_cache:
break
times = [get_time(dir) for dir in dirs]
arg = argmin(times)
shutil.rmtree(dirs[arg])
def is_cached(hash_key):
dir = os.path.join(cache_dir, hash_key)
return os.path.exists(dir)
def create_cache(hash_key):
dir = os.path.join(cache_dir, hash_key)
os.makedirs(dir, exist_ok=True)
write_time(dir)
def load_paragraph(hash_key, hash_key_paragraph):
filename = os.path.join(cache_dir, hash_key, hash_key_paragraph)
if os.path.exists(filename):
return open(filename, encoding="utf-8").read()
else:
return None
def write_paragraph(hash_key, hash_key_paragraph, paragraph):
filename = os.path.join(cache_dir, hash_key, hash_key_paragraph)
print(paragraph, file=open(filename, "w", encoding="utf-8"), end="")