81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
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):
|
|
"""
|
|
Отправка аудиофайла на распознавание
|
|
""" |