O2Sound_ver2_final/backend/app/presentation/api/v1/moviemakers.py

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