from fastapi import APIRouter, Depends, HTTPException, UploadFile, File as FastAPIFile, status from apiApp.database import get_db from fastapi.responses import FileResponse from sqlalchemy.orm import Session import os, uuid from apiApp.config import UPLOAD_FOLDER, ALLOWED_AUDIO_EXTENSIONS, MAX_UPLOAD_SIZE import aiofiles from apiApp.schemas import ( AudioCreate, AudioResponse, AudioListResponse, MessageResponse ) from apiApp.services import AudioCRUD router = APIRouter( prefix="/external_audio", tags=["Внешние аудиофайлы"] ) @router.post("/upload") async def upload_external_audio( file: UploadFile = FastAPIFile(...), db: Session = Depends(get_db) ): """ Загрузка внешнего аудиофайла на сервер """ # Проверка расширения файла file_ext = os.path.splitext(file.filename)[1].lower() if file_ext not in ALLOWED_AUDIO_EXTENSIONS: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=f"File extension not allowed. Allowed: {', '.join(ALLOWED_AUDIO_EXTENSIONS)}" ) content = await file.read() # Проверка размера файла if len(content) > MAX_UPLOAD_SIZE: raise HTTPException( status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE, detail=f"File too large. Maximum size: {MAX_UPLOAD_SIZE / (1024*1024)}MB" ) # Сохранение файла file_path = UPLOAD_FOLDER / f"{uuid.uuid4()}{file_ext}" try: async with aiofiles.open(file_path, 'wb') as f: await f.write(content) except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Error saving file: {str(e)}" ) # Создание записи в БД try: audio_data = AudioCreate(filename=file.filename) audio = AudioCRUD.create( db=db, audio_data=audio_data, file_path=str(file_path), file_size=len(content), sourse="external" ) return audio except Exception as e: # Удаление файла при ошибке записи в БД if os.path.exists(file_path): os.remove(file_path) raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Error creating database record: {str(e)}" ) return {"message": "External audio uploaded successfully"} def send_to_recognition(file_path: str): """ Отправка аудиофайла на распознавание """