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

31 lines
1.1 KiB
Python
Raw Permalink Normal View History

from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import Response
from sqlalchemy.ext.asyncio import AsyncSession
from botocore.exceptions import ClientError
from ..outbound.postgres.database import get_db
from ..outbound.postgres.repositories.translated_article_repository import TranslatedArticleRepository
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),
) -> Response:
article = await TranslatedArticleRepository(db).get_by_audio_url(filename)
if article 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)