import uuid from fastapi import APIRouter, Depends from app.shared.logger import setup_logger from app.workers.tasks import ( task_integrated_workflow, get_task_progress_info, ) from app.presentation.schemas.moviemaker_schema import WorkflowStartRequest, GetVideoResultRequest from app.services.get_my_video_result_service import GetMyVideoResultService from app.dependencies import get_get_my_video_result_service router = APIRouter(prefix="/moviemaker", tags=["moviemaker"]) logger = setup_logger(__name__) @router.post("/start-workflow") async def start_workflow(request: WorkflowStartRequest): try: # 고유한 task ID 생성 root_task_id = str(uuid.uuid4()) # 🔥 하나의 통합 task로 전체 워크플로우 실행 task_integrated_workflow.delay(request.id, request.url, root_task_id) return { "success": True, "message": "작업이 시작되었습니다", "task_id": root_task_id } except Exception as e: return { "success": False, "message": f"작업 시작 중 오류 발생: {str(e)}", "task_id": None } @router.get("/progress/{task_id}") async def get_progress_endpoint(task_id: str): try: # 기존 함수 활용하여 진행률 정보 조회 progress_info = get_task_progress_info(task_id) if not progress_info or progress_info.get("error"): return { "success": False, "message": "작업을 찾을 수 없거나 조회 중 오류 발생", "task_id": task_id, "error": progress_info.get("error") if progress_info else None } # 현재 단계별 상세 정보 status = progress_info.get("status", {}) current_step = progress_info.get("current_step", "preparing") return { "success": True, "task_id": task_id, "overall_status": "completed" if progress_info.get("is_completed") else "running", "current_step": current_step, "progress_percentage": progress_info.get("percentage", 0.0), "total_steps": progress_info.get("total_steps", 5), "step_status": { "crawling": status.get("crawling", False), "lyrics": status.get("lyrics", False), "music": status.get("music", False), "images": status.get("images", False), "video": status.get("video", False), }, "is_completed": progress_info.get("is_completed", False), "order_id": progress_info.get("order_id", None) } except Exception as e: return { "success": False, "message": f"상태 조회 중 오류 발생: {str(e)}", "task_id": task_id } @router.post("/video/result") async def get_video_result( request: GetVideoResultRequest, get_my_video_result_service: GetMyVideoResultService = Depends(get_get_my_video_result_service) ): video_result = get_my_video_result_service.get_my_video_result(request) return video_result