add translation cache and queue
This commit is contained in:
71
translation_queue.py
Normal file
71
translation_queue.py
Normal file
@@ -0,0 +1,71 @@
|
||||
import json
|
||||
import os
|
||||
from typing import List
|
||||
|
||||
QUEUE_FILE = "translation_queue.json"
|
||||
|
||||
|
||||
def load_queue() -> List[str]:
|
||||
if not os.path.exists(QUEUE_FILE):
|
||||
return []
|
||||
try:
|
||||
with open(QUEUE_FILE, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
return data.get("queue", [])
|
||||
except Exception:
|
||||
return []
|
||||
|
||||
|
||||
def save_queue(queue: List[str]):
|
||||
with open(QUEUE_FILE, "w", encoding="utf-8") as f:
|
||||
json.dump({"queue": queue}, f, ensure_ascii=False, indent=2)
|
||||
|
||||
|
||||
def add_to_queue(filename: str):
|
||||
queue = load_queue()
|
||||
if filename not in queue:
|
||||
queue.append(filename)
|
||||
save_queue(queue)
|
||||
|
||||
|
||||
def remove_from_queue(filename: str):
|
||||
queue = load_queue()
|
||||
if filename in queue:
|
||||
queue.remove(filename)
|
||||
save_queue(queue)
|
||||
|
||||
|
||||
def translate_from_queue(start_translation_func):
|
||||
from utils import notify_telegram
|
||||
import threading
|
||||
import time
|
||||
|
||||
queue = load_queue()
|
||||
if not queue:
|
||||
print("[QUEUE] Черга пуста")
|
||||
return
|
||||
|
||||
filename = queue[0]
|
||||
try:
|
||||
print(f"[QUEUE] Спроба перекладу з черги: {filename}")
|
||||
start_translation_func(filename)
|
||||
remove_from_queue(filename)
|
||||
notify_telegram(f"[✅] Файл з черги перекладено: {filename}")
|
||||
|
||||
if load_queue():
|
||||
threading.Timer(3, translate_from_queue, args=(start_translation_func,)).start()
|
||||
|
||||
except Exception as e:
|
||||
error_text = str(e).lower()
|
||||
if (
|
||||
"too many requests" in error_text
|
||||
or "you are allowed to make" in error_text
|
||||
or "5 requests per second" in error_text
|
||||
):
|
||||
notify_telegram(
|
||||
f"[🛑] Знову ліміт при перекладі з черги. Повтор через 30 хвилин.\nФайл: {filename}"
|
||||
)
|
||||
threading.Timer(1800, translate_from_queue, args=(start_translation_func,)).start()
|
||||
else:
|
||||
notify_telegram(f"[⚠️] Помилка при перекладі з черги: {filename}\n{str(e)}")
|
||||
remove_from_queue(filename)
|
||||
Reference in New Issue
Block a user