88 lines
3.2 KiB
Python
88 lines
3.2 KiB
Python
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 |