diff --git a/api/DTO/movieEdit.ts b/api/DTO/movieEdit.ts index 0e89685..34e84c8 100644 --- a/api/DTO/movieEdit.ts +++ b/api/DTO/movieEdit.ts @@ -267,6 +267,8 @@ export interface VideoData { video_name_prefix: string; /** 视频URL列表 */ urls: string[]; + /** 视频封面图(后端返回) */ + snapshot_urls?: string[]; /** 视频状态 */ video_status: number; } @@ -654,6 +656,7 @@ export interface ShotVideo { urls: string[]; video_status: number; type: string; + snapshot_url?: string; } // 执行loading文字映射 @@ -700,5 +703,6 @@ export interface TaskObject { final: { url: string; note: string; + snapshot_url?: string; }; // 剪辑视频 } \ No newline at end of file diff --git a/components/pages/work-flow/thumbnail-grid.tsx b/components/pages/work-flow/thumbnail-grid.tsx index 12200c4..f579bba 100644 --- a/components/pages/work-flow/thumbnail-grid.tsx +++ b/components/pages/work-flow/thumbnail-grid.tsx @@ -214,7 +214,7 @@ export function ThumbnailGrid({ > final video thumbnail @@ -226,7 +226,7 @@ export function ThumbnailGrid({ muted playsInline loop - poster={getFirstFrame(taskObject.final.url)} + poster={taskObject.final.snapshot_url || getFirstFrame(taskObject.final.url)} preload="none" /> )} @@ -288,7 +288,7 @@ export function ThumbnailGrid({ > video thumbnail @@ -300,7 +300,7 @@ export function ThumbnailGrid({ muted playsInline loop - poster={getFirstFrame(taskObject.videos.data[index].urls[0])} + poster={taskObject.videos.data[index].snapshot_url || getFirstFrame(taskObject.videos.data[index].urls[0])} preload="none" /> )} diff --git a/components/pages/work-flow/use-workflow-data.tsx b/components/pages/work-flow/use-workflow-data.tsx index e132f79..ed9e9c9 100644 --- a/components/pages/work-flow/use-workflow-data.tsx +++ b/components/pages/work-flow/use-workflow-data.tsx @@ -206,6 +206,7 @@ export function useWorkflowData({}: UseWorkflowDataProps = {}) { const all_task_data = response.data; const { current: taskCurrent } = tempTaskObject; let combinerVideoUrl = ''; + let combinerVideoPoster = ''; // 收集所有需要更新的状态 let stateUpdates = JSON.stringify(taskCurrent); @@ -288,7 +289,8 @@ export function useWorkflowData({}: UseWorkflowDataProps = {}) { urls: videoUrls, video_id: video.video_id, video_status: video_status, // 0 生成中 1 生成完成 2 生成失败 - type: 'video' + type: 'video', + snapshot_url: video.snapshot_url }); } taskCurrent.videos.data = videoList; @@ -312,6 +314,7 @@ export function useWorkflowData({}: UseWorkflowDataProps = {}) { if (task.task_name === 'combiner_videos') { if (task.task_status === 'COMPLETED') { combinerVideoUrl = task.task_result.video_url; + combinerVideoPoster = task.task_result.snapshot_url; } if (task.task_status === 'FAILED' || task.task_status === 'ERROR') { taskCurrent.status = 'FAILED'; @@ -338,6 +341,7 @@ export function useWorkflowData({}: UseWorkflowDataProps = {}) { taskCurrent.currentStage = 'final_video'; taskCurrent.final.url = combinerVideoUrl; taskCurrent.final.note = 'combiner'; + taskCurrent.final.snapshot_url = combinerVideoPoster; taskCurrent.status = 'COMPLETED'; // 停止轮询 setNeedStreamData(false); @@ -410,7 +414,7 @@ export function useWorkflowData({}: UseWorkflowDataProps = {}) { } const { status, data, tags, mode, original_text, aspect_ratio, name, final_simple_video, final_video } = response.data; - + const { current: taskCurrent } = tempTaskObject; taskCurrent.title = name || 'generating...'; @@ -492,7 +496,8 @@ export function useWorkflowData({}: UseWorkflowDataProps = {}) { urls: videoUrls, video_id: video.video_id, video_status: video_status, // 0 生成中 1 生成完成 2 生成失败 - type: 'video' + type: 'video', + snapshot_url: video.snapshot_urls?.[0] || '' }); } taskCurrent.videos.data = videoList;