ai-service-hf / utils /local_storage.py
MingDoan's picture
feat: Chats & FD services
eabc9cd
from typing import Any
import os
import json
from threading import Timer
from .constants import TEMP_DIR, APP_DOMAIN
def parse_filename(filename: str):
filename = filename.replace(' ', '_')
filename = filename.replace('(', '')
filename = filename.replace(')', '')
filename = filename.replace('[', '')
filename = filename.replace(']', '')
filename = filename.replace('{', '')
filename = filename.replace('}', '')
filename = filename.replace('<', '')
filename = filename.replace('>', '')
filename = filename.replace(';', '')
filename = filename.replace(':', '')
filename = filename.replace('"', '')
filename = filename.replace("'", '')
filename = filename.replace('\\', '')
filename = filename.replace('/', '')
filename = filename.replace('|', '')
filename = filename.replace('?', '')
filename = filename.replace('*', '')
# If file is exist, add number to filename
if os.path.isfile(os.path.join(TEMP_DIR, filename)):
filename = filename.split('.')
filename = f"{filename[0]}_1.{filename[1]}"
return filename
def save_to_local(file: bytes | Any, filename: str, is_parse_filename: bool = True, directory: str = TEMP_DIR):
# Parse filename
if is_parse_filename:
filename = parse_filename(filename)
# Get type of file
file_extension = filename.split('.')[-1]
# Get write mode
if file_extension == 'json':
mode = 'w'
else:
mode = 'wb'
# Save file
with open(os.path.join(directory, filename), mode) as f:
if file_extension == 'json':
json.dump(file, f)
else:
f.write(file)
# Return access link
return f"{APP_DOMAIN}/static/{filename}"
def read_from_local(filename: str, directory: str = TEMP_DIR):
# Get type of file
file_extension = filename.split('.')[-1]
# Get read mode
if file_extension == 'json':
mode = 'r'
else:
mode = 'rb'
# If file is exist, return file
if os.path.isfile(os.path.join(directory, filename)):
with open(os.path.join(directory, filename), mode) as f:
if file_extension == 'json':
return json.load(f)
return f.read()
def remove_from_local(filename: str, directory: str = TEMP_DIR):
# If file is exist, add number to filename
if os.path.isfile(os.path.join(directory, filename)):
os.remove(os.path.join(directory, filename))
def remove_from_local_with_expire(filename: str, expire: int, directory: str = TEMP_DIR):
# Remove file after expire time
if expire is not None and expire > 0:
t = Timer(expire, remove_from_local, args=[filename, directory])
t.start()