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