archive-backend/routers/video.py
2026-11-07 11:40:36 +00:00

58 lines
1.7 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends, Query
from fastapi.exceptions import HTTPException
from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from ..core.authx import auth
from ..core.db import get_db
from ..models.video_model import Channel, Video
from ..schemas.video_schemas import VideoDetailOut, VideoOut, VideosResponse
router = APIRouter()
@router.get("/videos", response_model=VideosResponse, dependencies=[Depends(auth.access_token_required)])
async def videos(
page: int = Query(1, ge=1),
per_page: int = Query(24, ge=1),
session: AsyncSession = Depends(get_db), # noqa: B008
):
offset = (page - 1) * per_page
query = (
select(Video, Channel.name.label("channel_name"))
.join(Channel, Channel.id == Video.channel_id)
.order_by(func.random())
.offset(offset)
.limit(per_page)
)
result = await session.execute(query)
rows = result.all()
videos = []
for v, channel_name in rows:
v_out = VideoOut.model_validate(v)
v_out.channel_name = channel_name
videos.append(v_out)
return {
"videos": videos,
"page_inc": f"/videos?page={page + 1}&per_page={per_page}",
"page_dec": f"/videos?page={max(1, page - 1)}&per_page={per_page}",
}
@router.get("/video", response_model=VideoDetailOut, dependencies=[Depends(auth.access_token_required)])
async def video(id: int = Query(...), session: AsyncSession = Depends(get_db)): # noqa: B008
query = select(Video).where(Video.id == id)
result = await session.execute(query)
video = result.scalar()
if video is None:
raise HTTPException(status_code=404, detail="Video not found")
return video