From 4445c39e788d0d7dbad70b5e495df16e81eb8d0e Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Tue, 1 Jul 2025 20:53:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/video_flow.ts | 16 ++++++++++-- components/pages/create-to-video2.tsx | 36 ++++++++++----------------- components/pages/home-page2.tsx | 2 ++ 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/api/video_flow.ts b/api/video_flow.ts index 8f6c9f3..e30608f 100644 --- a/api/video_flow.ts +++ b/api/video_flow.ts @@ -5,12 +5,16 @@ import { ApiResponse } from './common'; // 剧本转分镜头请求接口 export interface ScriptToSceneRequest { script: string; + episode_id: number; + script_id: number; project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO; } // 视频转分镜头请求接口 export interface VideoToSceneRequest { video_url: string; + episode_id: number; + script_id: number; project_type: ProjectTypeEnum.VIDEO_TO_VIDEO; } @@ -46,10 +50,14 @@ export const convertScenePrompt = async ( * @returns Promise */ export const convertScriptToScene = async ( - script: string + script: string, + episode_id: number, + script_id: number ): Promise => { return convertScenePrompt({ script, + episode_id, + script_id, project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO }); }; @@ -60,10 +68,14 @@ export const convertScriptToScene = async ( * @returns Promise */ export const convertVideoToScene = async ( - video_url: string + video_url: string, + episode_id: number, + script_id: number ): Promise => { return convertScenePrompt({ video_url, + episode_id, + script_id, project_type: ProjectTypeEnum.VIDEO_TO_VIDEO }); }; diff --git a/components/pages/create-to-video2.tsx b/components/pages/create-to-video2.tsx index 84bc456..1ad3545 100644 --- a/components/pages/create-to-video2.tsx +++ b/components/pages/create-to-video2.tsx @@ -4,7 +4,7 @@ import { useState, useEffect, useRef } from 'react'; import { Card } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { ArrowLeft, ChevronDown, ChevronUp, Video, ListOrdered, Play, Loader2, Pause, MoreHorizontal, Edit2, Check, X, RefreshCw, Lightbulb, Package, Crown, ArrowUp } from 'lucide-react'; -import { useRouter } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, SheetClose } from "@/components/ui/sheet"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; @@ -17,7 +17,6 @@ import type { MenuProps } from 'antd'; import Image from 'next/image'; import dynamic from 'next/dynamic'; import { ProjectTypeEnum, ModeEnum, ResolutionEnum } from "@/api/enums"; -import { createScriptProject, CreateScriptProjectRequest } from "@/api/script_project"; import { createScriptEpisode, CreateScriptEpisodeRequest } from "@/api/script_episode"; import { getUploadTokenWithDomain, uploadToQiniu } from "@/api/common"; import { convertScriptToScene, convertVideoToScene } from "@/api/video_flow"; @@ -57,6 +56,8 @@ const ideaText = 'a cute capybara with an orange on its head, staring into the d export function CreateToVideo2() { const router = useRouter(); + const searchParams = useSearchParams(); + const projectId = searchParams.get('projectId'); const [isClient, setIsClient] = useState(false); const [isExpanded, setIsExpanded] = useState(false); const [videoUrl, setVideoUrl] = useState(''); @@ -69,6 +70,7 @@ export function CreateToVideo2() { const [script, setInputText] = useState(''); const editorRef = useRef(null); const [runTour, setRunTour] = useState(true); + const [episodeId, setEpisodeId] = useState(0); const handleUploadVideo = async () => { console.log('upload video'); @@ -114,41 +116,31 @@ export function CreateToVideo2() { alert('请输入剧本内容'); return; } - convertResponse = await convertScriptToScene(script); + convertResponse = await convertScriptToScene(script, episodeId); } else { // 视频模式:调用convertVideoToScene (第56-69行) if (!videoUrl) { alert('请先上传视频'); return; } - convertResponse = await convertVideoToScene(videoUrl); + if (!episodeId) { + alert('Episode ID not available'); + return; + } + convertResponse = await convertVideoToScene(videoUrl, episodeId); } // 检查转换结果 - if (convertResponse.code === 0) { + if (convertResponse.successful) { console.log('转换成功:', convertResponse.data); console.log('任务ID:', convertResponse.data.task_id); console.log('预估时间:', convertResponse.data.estimated_time, '秒'); // 确定项目类型 - const projectType = activeTab === 'script' ? ProjectTypeEnum.SCRIPT_TO_VIDEO : ProjectTypeEnum.VIDEO_TO_VIDEO; - - // 构建项目数据并调用API - const projectData: CreateScriptProjectRequest = { - project_type: projectType, - mode: selectedMode, - resolution: selectedResolution - }; - - const projectResponse = await createScriptProject(projectData); - - if (projectResponse.code === 0 && projectResponse.data.id) { - const projectId = projectResponse.data.id; - // 创建剧集数据 const episodeData: CreateScriptEpisodeRequest = { title: "episode 1", - script_id: projectId, + script_id: projectId ? parseInt(projectId) : 1, status: 1, summary: script }; @@ -158,13 +150,11 @@ export function CreateToVideo2() { if (episodeResponse.code === 0) { // 成功创建后跳转到work-flow页面 + setEpisodeId(episodeResponse.data.id); router.push('/create/work-flow'); } else { alert(`创建剧集失败: ${episodeResponse.message}`); } - } else { - alert(`创建项目失败: ${projectResponse.message}`); - } } else { alert(`转换失败: ${convertResponse.message}`); } diff --git a/components/pages/home-page2.tsx b/components/pages/home-page2.tsx index b50b418..72bd3b3 100644 --- a/components/pages/home-page2.tsx +++ b/components/pages/home-page2.tsx @@ -64,6 +64,8 @@ export function HomePage2() { if (projectResponse.code === 0 && projectResponse.data.id) { const projectId = projectResponse.data.id; setCreatedProjectId(projectId); + // projectId 作为参数传递给 work-flow 页面 + router.push(`/create/work-flow?projectId=${projectId}`); } else { alert(`创建项目失败: ${projectResponse.message}`); }