Maia/backend/app/services/upload_service.py

40 lines
1.4 KiB
Python

import os
import aiofiles
from fastapi import UploadFile, HTTPException
from app.config import settings
async def save_audio_file(file: UploadFile, meeting_id: str) -> str:
os.makedirs(settings.AUDIO_STORAGE_PATH, exist_ok=True)
original_name = file.filename or "audio.wav"
ext = os.path.splitext(original_name)[1].lower() or ".wav"
allowed_extensions = {".wav", ".mp3", ".m4a", ".ogg", ".flac", ".mp4", ".webm"}
if ext not in allowed_extensions:
raise HTTPException(
status_code=400,
detail=f"Unsupported audio format '{ext}'. Supported: {', '.join(allowed_extensions)}",
)
filename = f"{meeting_id}{ext}"
file_path = os.path.join(settings.AUDIO_STORAGE_PATH, filename)
max_size = settings.UPLOAD_MAX_SIZE_MB * 1024 * 1024
total_size = 0
async with aiofiles.open(file_path, "wb") as f:
while True:
chunk = await file.read(1024 * 1024)
if not chunk:
break
total_size += len(chunk)
if total_size > max_size:
await f.close()
os.remove(file_path)
raise HTTPException(
status_code=413,
detail=f"File too large. Maximum allowed size is {settings.UPLOAD_MAX_SIZE_MB}MB",
)
await f.write(chunk)
return file_path