File size: 2,725 Bytes
aabae8d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eabc9cd
aabae8d
 
 
 
 
 
 
 
 
 
 
eabc9cd
aabae8d
 
 
 
 
 
 
 
eabc9cd
aabae8d
 
 
 
 
 
 
 
eabc9cd
 
aabae8d
 
 
 
 
eabc9cd
aabae8d
eabc9cd
 
aabae8d
 
eabc9cd
aabae8d
 
eabc9cd
aabae8d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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()