import random from typing import Optional, List from dependency_injector.wiring import inject, Provide from fastapi import APIRouter, Path, Query, Depends from ielts_be.dtos.speaking import Video from ielts_be.middlewares import Authorized, IsAuthenticatedViaBearerToken from ielts_be.configs.constants import EducationalContent from ielts_be.controllers import ISpeakingController controller = "speaking_controller" speaking_router = APIRouter() @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 poll_video( vid_id: str = Path(...), speaking_controller: ISpeakingController = Depends(Provide[controller]) ): return await speaking_controller.poll_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: List[str] = Query(default=None), 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) difficulty = [random.choice(EducationalContent.DIFFICULTIES)] if not difficulty else difficulty 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)