language-learning-app/api/app/routers/media.py

35 lines
1.2 KiB
Python

import uuid
from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import Response
from sqlalchemy.ext.asyncio import AsyncSession
from botocore.exceptions import ClientError
from ..auth import verify_token
from ..outbound.postgres.database import get_db
from ..outbound.postgres.repositories import summarise_job_repository
from ..storage import download_audio
router = APIRouter(prefix="/media", tags=["media"])
@router.get("/{filename:path}")
async def get_media_file(
filename: str,
db: AsyncSession = Depends(get_db),
token_data: dict = Depends(verify_token),
) -> Response:
user_id = uuid.UUID(token_data["sub"])
job = await summarise_job_repository.get_by_audio_url_and_user(db, filename, user_id)
if job is None:
raise HTTPException(status_code=404, detail="File not found")
try:
audio_bytes, content_type = download_audio(filename)
except ClientError as e:
if e.response["Error"]["Code"] in ("NoSuchKey", "404"):
raise HTTPException(status_code=404, detail="File not found")
raise HTTPException(status_code=500, detail="Storage error")
return Response(content=audio_bytes, media_type=content_type)