diff --git a/apps/web/src/api/generation/confirm.ts b/apps/web/src/api/generation/confirm.ts new file mode 100755 index 000000000..e559e6e35 --- /dev/null +++ b/apps/web/src/api/generation/confirm.ts @@ -0,0 +1,14 @@ +import apiClient from "../client" +import type { ConfirmGenerationRequest, ConfirmGenerationResponse } from "./types" + +/** 确认生成 — 基于预览任务创建正式生成任务 */ +export const confirmGeneration = async ( + taskId: string, + params: ConfirmGenerationRequest, +): Promise => { + const response = await apiClient.post( + `/tasks/${taskId}/confirm`, + params, + ) + return response.data +} diff --git a/apps/web/src/api/generation/index.ts b/apps/web/src/api/generation/index.ts old mode 100644 new mode 100755 index a3785acc7..672dc9699 --- a/apps/web/src/api/generation/index.ts +++ b/apps/web/src/api/generation/index.ts @@ -3,6 +3,10 @@ export type { CreatePreviewRequest, CreatePreviewResponse, PreviewTaskResponse, + ConfirmGenerationRequest, + ConfirmGenerationResponse, + ConfirmGenerationTaskItem, } from "./types" export { createPreview, getPreviewStatus } from "./preview" +export { confirmGeneration } from "./confirm" diff --git a/apps/web/src/api/generation/types.ts b/apps/web/src/api/generation/types.ts old mode 100644 new mode 100755 index 502d19df0..2231f74cb --- a/apps/web/src/api/generation/types.ts +++ b/apps/web/src/api/generation/types.ts @@ -45,3 +45,47 @@ export interface PreviewTaskResponse { finished_at?: string generate_duration?: number } + +/** 确认生成请求体 — 基于预览任务创建正式生成任务 */ +export interface ConfirmGenerationRequest { + /** 输出视频宽度,默认 1080 */ + output_width?: number + /** 输出视频高度,默认 1920 */ + output_height?: number + /** 自定义封面图片 URL */ + cover_url?: string + /** 自定义视频标题 */ + custom_title?: string +} + +/** 确认生成响应 */ +export interface ConfirmGenerationResponse { + items: ConfirmGenerationTaskItem[] + total: number +} + +/** 确认生成返回的任务项 */ +export interface ConfirmGenerationTaskItem { + id: string + project_id: string + asset_library_id: string + strategy_id: string + voice_library_id: string + template_id: string + asset_ids: string[] + title_ids: string[] + voice_ids: string[] + source_edit_plan_id: string + asset_select_mode: string + batch_id: string + is_preview: boolean + source_task_id: string + output_width: number + output_height: number + cover_url: string + custom_title: string + status: string + progress: number + result_count: number + error_message: string +} diff --git a/apps/web/src/pages/generate/hooks/generate-video/types.ts b/apps/web/src/pages/generate/hooks/generate-video/types.ts old mode 100644 new mode 100755 index c9434c5a6..a09ab562f --- a/apps/web/src/pages/generate/hooks/generate-video/types.ts +++ b/apps/web/src/pages/generate/hooks/generate-video/types.ts @@ -19,6 +19,8 @@ export interface UseGenerateVideoProps { autoSubtitles: boolean bgm: boolean generateCount: number + /** 预览任务的 task_id(用于新确认生成 API) */ + previewTaskId?: string } /** 生成阶段 */ diff --git a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts old mode 100644 new mode 100755 index d78fdaa17..b99f00b5b --- a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts +++ b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts @@ -6,6 +6,7 @@ import { useState, useCallback } from "react" import { message } from "antd" import type { GeneratedVideo } from "@/api/template-editor" import { generateEditPlan, updateEditPlan, getEditPlan } from "@/api/template-editor" +import { confirmGeneration } from "@/api/generation" import type { UseGenerateVideoProps } from "./generate-video/types" import { getGenerationPhase } from "./generate-video/phase" import { useGenerationPolling } from "./generate-video/useGenerationPolling" @@ -55,6 +56,25 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { clearTimer() try { + // 新流程:使用确认生成 API(基于预览任务) + if (props.previewTaskId) { + // 解析分辨率 + const [widthStr, heightStr] = (props.videoRatio || "1080x1920").split("x") + const outputWidth = parseInt(widthStr, 10) || 1080 + const outputHeight = parseInt(heightStr, 10) || 1920 + + await confirmGeneration(props.previewTaskId, { + output_width: outputWidth, + output_height: outputHeight, + cover_url: props.coverSettings.upload_url || "", + custom_title: props.titleSettings.title || "", + }) + + startPolling() + return + } + + // 旧流程:使用 EditPlan API(向后兼容) const payload = buildEditPlanPayload(props) // 获取或创建草稿