From 9f65a9398a9c1dcf46aa21b7e6850d4fd9782c3a Mon Sep 17 00:00:00 2001 From: poturaevpetr Date: Tue, 30 Dec 2025 02:10:56 +0500 Subject: [PATCH] fix --- apiApp/routers/audio_management_router.py | 98 ++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/apiApp/routers/audio_management_router.py b/apiApp/routers/audio_management_router.py index 651ebe0..f893c44 100644 --- a/apiApp/routers/audio_management_router.py +++ b/apiApp/routers/audio_management_router.py @@ -162,6 +162,11 @@ def process_audio_file(audio_id: str, db: Session): file_size = os.path.getsize(file_path) logger.info(f"📁 Файл найден: {file_path} (размер: {file_size} bytes)") + # Проверяем размер файла - минимум 1000 bytes (1KB) для аудио + if file_size < 1000: + logger.warning(f"⚠️ Файл слишком маленький для аудио ({file_size} bytes), пропускаем: {audio.filename}") + return + # Формируем запрос в GigaAM API # Пробуем асинхронный endpoint, если не работает - fallback на обычный from apiApp.config import GIGAAM_API_URL @@ -267,6 +272,12 @@ async def process_all_pending_audio( logger.warning(f"⚠️ Файл не найден на диске: {audio.filename}") continue + # Проверяем размер файла + file_size = os.path.getsize(file_path) + if file_size < 1000: + logger.warning(f"⚠️ Файл слишком маленький ({file_size} bytes), пропускаем: {audio.filename}") + continue + # Добавляем в фон (асинхронно) # В FastAPI используем BackgroundTasks # Но нужно создавать новую сессию для каждого таска @@ -374,10 +385,20 @@ async def get_audio_stats(db: Session = Depends(get_db)): all_audio = db.query(Audio).all() existing_count = 0 missing_files = [] + small_files = [] # Файлы меньше 1KB + for audio in all_audio: file_path = os.path.join(AUDIOFILES_PATH, audio.filename) if os.path.exists(file_path): existing_count += 1 + file_size = os.path.getsize(file_path) + if file_size < 1000: + small_files.append({ + "audio_id": str(audio.id), + "filename": audio.filename, + "file_size": file_size, + "index_date": audio.index_date.isoformat() if audio.index_date else None + }) else: missing_files.append({ "audio_id": str(audio.id), @@ -390,14 +411,19 @@ async def get_audio_stats(db: Session = Depends(get_db)): "with_conclusion": with_conclusion, "without_conclusion": without_conclusion, "existing_on_disk": existing_count, - "missing_on_disk": total_audio - existing_count + "missing_on_disk": total_audio - existing_count, + "small_files_count": len(small_files) } - # Добавляем список отсутствующих файлов (первые 50) + # Добавляем списки проблемных файлов (первые 50 каждого типа) if missing_files: stats["missing_files_sample"] = missing_files[:50] logger.warning(f"⚠️ Найдено {len(missing_files)} отсутствующих файлов") + if small_files: + stats["small_files_sample"] = small_files[:50] + logger.warning(f"⚠️ Найдено {len(small_files)} файлов меньше 1KB") + return stats except Exception as e: @@ -408,3 +434,71 @@ async def get_audio_stats(db: Session = Depends(get_db)): ) +@audio_management_router.delete("/audio/cleanup") +async def cleanup_invalid_audio_files( + delete_missing: bool = False, + delete_small: bool = True, + min_size_bytes: int = 1000, + db: Session = Depends(get_db) +): + """ + Удаляет записи Audio для проблемных файлов + + Query Parameters: + delete_missing: Удалять записи с отсутствующими файлами (default: False) + delete_small: Удалять записи с маленькими файлами (default: True) + min_size_bytes: Минимальный размер файла в bytes (default: 1000) + + Returns: + Статистику удаления + """ + try: + all_audio = db.session.query(Audio).all() + + deleted_missing = 0 + deleted_small = 0 + + for audio in all_audio: + file_path = os.path.join(AUDIOFILES_PATH, audio.filename) + + # Проверяем отсутствие файла + if delete_missing and not os.path.exists(file_path): + logger.info(f"🗑️ Удаление записи с отсутствующим файлом: {audio.filename}") + db.session.delete(audio) + deleted_missing += 1 + continue + + # Проверяем размер файла + if delete_small and os.path.exists(file_path): + file_size = os.path.getsize(file_path) + if file_size < min_size_bytes: + logger.info(f"🗑️ Удаление записи с маленьким файлом ({file_size} bytes): {audio.filename}") + # Удаляем и файл тоже + try: + os.remove(file_path) + logger.info(f" Файл удалён: {file_path}") + except Exception as e: + logger.warning(f" Не удалось удалить файл: {e}") + + db.session.delete(audio) + deleted_small += 1 + + db.session.commit() + + return { + "success": True, + "deleted_missing": deleted_missing, + "deleted_small": deleted_small, + "total_deleted": deleted_missing + deleted_small, + "message": f"Удалено {deleted_missing + deleted_small} записей" + } + + except Exception as e: + db.session.rollback() + logger.error(f"❌ Ошибка при очистке: {e}") + raise HTTPException( + status_code=500, + detail=str(e) + ) + +