import random from typing import Optional from dependency_injector.wiring import inject, Provide from fastapi import APIRouter, Path, Query, Depends from pydantic import BaseModel from app.dtos.video import Task, TaskStatus from app.middlewares import Authorized, IsAuthenticatedViaBearerToken from app.configs.constants import EducationalContent from app.controllers.abc import ISpeakingController controller = "speaking_controller" speaking_router = APIRouter() class Video(BaseModel): text: str avatar: str @speaking_router.post( '/media', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def generate_video( video: Video, speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.generate_video(video.text, video.avatar) @speaking_router.get( '/media/{vid_id}', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def pool_video( vid_id: str = Path(...), speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.pool_video(vid_id) @speaking_router.get( '/avatars', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def get_avatars( speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.get_avatars() @speaking_router.get( '/{task}', dependencies=[Depends(Authorized([IsAuthenticatedViaBearerToken]))] ) @inject async def get_speaking_task( task: int = Path(..., ge=1, le=3), topic: Optional[str] = Query(None), first_topic: Optional[str] = Query(None), second_topic: Optional[str] = Query(None), difficulty: str = Query(default=random.choice(EducationalContent.DIFFICULTIES)), speaking_controller: ISpeakingController = Depends(Provide[controller]) ): if not second_topic: topic_or_first_topic = topic if topic else random.choice(EducationalContent.MTI_TOPICS) else: topic_or_first_topic = first_topic if first_topic else random.choice(EducationalContent.MTI_TOPICS) second_topic = second_topic if second_topic else random.choice(EducationalContent.MTI_TOPICS) return await speaking_controller.get_speaking_part(task, topic_or_first_topic, second_topic, difficulty)