74 lines
1.8 KiB
Python
74 lines
1.8 KiB
Python
import re
|
||
import time
|
||
from .loggers import logger
|
||
|
||
# Простая транслитерация
|
||
TRANSLIT_MAP = {
|
||
"а": "a",
|
||
"б": "b",
|
||
"в": "v",
|
||
"г": "g",
|
||
"д": "d",
|
||
"е": "e",
|
||
"ё": "yo",
|
||
"ж": "zh",
|
||
"з": "z",
|
||
"и": "i",
|
||
"й": "y",
|
||
"к": "k",
|
||
"л": "l",
|
||
"м": "m",
|
||
"н": "n",
|
||
"о": "o",
|
||
"п": "p",
|
||
"р": "r",
|
||
"с": "s",
|
||
"т": "t",
|
||
"у": "u",
|
||
"ф": "f",
|
||
"х": "h",
|
||
"ц": "c",
|
||
"ч": "ch",
|
||
"ш": "sh",
|
||
"щ": "sch",
|
||
"ъ": "",
|
||
"ы": "y",
|
||
"ь": "",
|
||
"э": "e",
|
||
"ю": "yu",
|
||
"я": "ya",
|
||
}
|
||
|
||
# Заглавные буквы → в ту же латиницу, но без capital (ниже мы в lower() всё равно переводим)
|
||
TRANSLIT_MAP.update({k.upper(): v for k, v in TRANSLIT_MAP.items()})
|
||
|
||
|
||
def transliterate(text: str) -> str:
|
||
return "".join(TRANSLIT_MAP.get(ch, ch) for ch in text)
|
||
|
||
|
||
def safeFilename(name: str) -> str:
|
||
try:
|
||
# 1. Транслитерация кириллицы
|
||
name = transliterate(name)
|
||
|
||
# 2. Приводим к нижнему регистру
|
||
name = name.lower()
|
||
|
||
# 3. Заменяем всё, что не буква/цифра, на "_"
|
||
name = re.sub(r"[^a-z0-9]+", "_", name)
|
||
|
||
# 4. Убираем повторяющиеся "_"
|
||
name = re.sub(r"_+", "_", name).strip("_")
|
||
|
||
# 5. Ограничиваем длину
|
||
name = name[:80] or "file"
|
||
|
||
# 6. Добавляем таймштамп
|
||
timestamp = int(time.time() * 1000) # миллисекунды
|
||
return f"{name}_{timestamp}"
|
||
|
||
except Exception as e:
|
||
logger.error(f"Ошибка создания названия файла: {str(e)}")
|
||
return "file"
|