|
|
|
@ -330,3 +330,64 @@ async def get_audio_stats(db: Session = Depends(get_db)): |
|
|
|
status_code=500, |
|
|
|
status_code=500, |
|
|
|
detail=str(e) |
|
|
|
detail=str(e) |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def auto_restore_on_startup(db: Session, limit: int = 100): |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
Автоматическое восстановление распознавания при старте FileAudioAPI |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Проверяет, есть ли файлы без AiConclusion, и запускает их распознавание |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
|
|
|
db: Сессия БД |
|
|
|
|
|
|
|
limit: Максимум файлов для восстановления |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
from sqlalchemy import or_ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Проверяем, есть ли файлы без AiConclusion |
|
|
|
|
|
|
|
pending_audio = db.query(Audio).filter( |
|
|
|
|
|
|
|
or_( |
|
|
|
|
|
|
|
Audio.AiConclusion == None, |
|
|
|
|
|
|
|
Audio.AiConclusion == '' |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
).limit(limit).all() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not pending_audio: |
|
|
|
|
|
|
|
logger.info("ℹ️ Auto-restore: нет файлов для распознавания") |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger.info(f"🔄 Auto-restore: найдено {len(pending_audio)} файлов без AiConclusion") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Запускаем распознавание |
|
|
|
|
|
|
|
started_count = 0 |
|
|
|
|
|
|
|
for audio in pending_audio: |
|
|
|
|
|
|
|
file_path = os.path.join(AUDIOFILES_PATH, audio.filename) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(file_path): |
|
|
|
|
|
|
|
logger.warning(f"⚠️ Файл не найден: {audio.filename}") |
|
|
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Отправляем в GigaAM API |
|
|
|
|
|
|
|
from apiApp.config import GIGAAM_API_URL |
|
|
|
|
|
|
|
api_url = f"{GIGAAM_API_URL}/api/call/process" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
payload = {"filename": audio.filename} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
import requests |
|
|
|
|
|
|
|
response = requests.post(api_url, json=payload, timeout=5) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if response.status_code in [200, 202]: |
|
|
|
|
|
|
|
logger.info(f"✅ Запущено распознавание: {audio.filename}") |
|
|
|
|
|
|
|
started_count += 1 |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
logger.warning(f"⚠️ Ошибка запуска {audio.filename}: {response.status_code}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
|
|
|
|
logger.error(f"❌ Ошибка при запуске {audio.filename}: {e}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger.info(f"🎉 Auto-restore завершено: запущено {started_count} файлов") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
|
|
|
|
logger.error(f"❌ Ошибка при auto-restore: {e}") |
|
|
|
|