5 changed files with 125 additions and 3 deletions
@ -0,0 +1,81 @@ |
|||||||
|
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): |
||||||
|
""" |
||||||
|
Отправка аудиофайла на распознавание |
||||||
|
""" |
||||||
Loading…
Reference in new issue