处理页面

This commit is contained in:
Xin Wang 2025-07-01 20:53:07 +08:00
parent 724bbc6c8f
commit 4445c39e78
3 changed files with 29 additions and 25 deletions

View File

@ -5,12 +5,16 @@ import { ApiResponse } from './common';
// 剧本转分镜头请求接口 // 剧本转分镜头请求接口
export interface ScriptToSceneRequest { export interface ScriptToSceneRequest {
script: string; script: string;
episode_id: number;
script_id: number;
project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO; project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO;
} }
// 视频转分镜头请求接口 // 视频转分镜头请求接口
export interface VideoToSceneRequest { export interface VideoToSceneRequest {
video_url: string; video_url: string;
episode_id: number;
script_id: number;
project_type: ProjectTypeEnum.VIDEO_TO_VIDEO; project_type: ProjectTypeEnum.VIDEO_TO_VIDEO;
} }
@ -46,10 +50,14 @@ export const convertScenePrompt = async (
* @returns Promise<ConvertScenePromptResponse> * @returns Promise<ConvertScenePromptResponse>
*/ */
export const convertScriptToScene = async ( export const convertScriptToScene = async (
script: string script: string,
episode_id: number,
script_id: number
): Promise<ConvertScenePromptResponse> => { ): Promise<ConvertScenePromptResponse> => {
return convertScenePrompt({ return convertScenePrompt({
script, script,
episode_id,
script_id,
project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO
}); });
}; };
@ -60,10 +68,14 @@ export const convertScriptToScene = async (
* @returns Promise<ConvertScenePromptResponse> * @returns Promise<ConvertScenePromptResponse>
*/ */
export const convertVideoToScene = async ( export const convertVideoToScene = async (
video_url: string video_url: string,
episode_id: number,
script_id: number
): Promise<ConvertScenePromptResponse> => { ): Promise<ConvertScenePromptResponse> => {
return convertScenePrompt({ return convertScenePrompt({
video_url, video_url,
episode_id,
script_id,
project_type: ProjectTypeEnum.VIDEO_TO_VIDEO project_type: ProjectTypeEnum.VIDEO_TO_VIDEO
}); });
}; };

View File

@ -4,7 +4,7 @@ import { useState, useEffect, useRef } from 'react';
import { Card } from '@/components/ui/card'; import { Card } from '@/components/ui/card';
import { Button } from '@/components/ui/button'; 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 { 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 { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, SheetClose } from "@/components/ui/sheet";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Textarea } from "@/components/ui/textarea"; import { Textarea } from "@/components/ui/textarea";
@ -17,7 +17,6 @@ import type { MenuProps } from 'antd';
import Image from 'next/image'; import Image from 'next/image';
import dynamic from 'next/dynamic'; import dynamic from 'next/dynamic';
import { ProjectTypeEnum, ModeEnum, ResolutionEnum } from "@/api/enums"; import { ProjectTypeEnum, ModeEnum, ResolutionEnum } from "@/api/enums";
import { createScriptProject, CreateScriptProjectRequest } from "@/api/script_project";
import { createScriptEpisode, CreateScriptEpisodeRequest } from "@/api/script_episode"; import { createScriptEpisode, CreateScriptEpisodeRequest } from "@/api/script_episode";
import { getUploadTokenWithDomain, uploadToQiniu } from "@/api/common"; import { getUploadTokenWithDomain, uploadToQiniu } from "@/api/common";
import { convertScriptToScene, convertVideoToScene } from "@/api/video_flow"; 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() { export function CreateToVideo2() {
const router = useRouter(); const router = useRouter();
const searchParams = useSearchParams();
const projectId = searchParams.get('projectId');
const [isClient, setIsClient] = useState(false); const [isClient, setIsClient] = useState(false);
const [isExpanded, setIsExpanded] = useState(false); const [isExpanded, setIsExpanded] = useState(false);
const [videoUrl, setVideoUrl] = useState(''); const [videoUrl, setVideoUrl] = useState('');
@ -69,6 +70,7 @@ export function CreateToVideo2() {
const [script, setInputText] = useState(''); const [script, setInputText] = useState('');
const editorRef = useRef<HTMLDivElement>(null); const editorRef = useRef<HTMLDivElement>(null);
const [runTour, setRunTour] = useState(true); const [runTour, setRunTour] = useState(true);
const [episodeId, setEpisodeId] = useState<number>(0);
const handleUploadVideo = async () => { const handleUploadVideo = async () => {
console.log('upload video'); console.log('upload video');
@ -114,41 +116,31 @@ export function CreateToVideo2() {
alert('请输入剧本内容'); alert('请输入剧本内容');
return; return;
} }
convertResponse = await convertScriptToScene(script); convertResponse = await convertScriptToScene(script, episodeId);
} else { } else {
// 视频模式调用convertVideoToScene (第56-69行) // 视频模式调用convertVideoToScene (第56-69行)
if (!videoUrl) { if (!videoUrl) {
alert('请先上传视频'); alert('请先上传视频');
return; 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('转换成功:', convertResponse.data);
console.log('任务ID:', convertResponse.data.task_id); console.log('任务ID:', convertResponse.data.task_id);
console.log('预估时间:', convertResponse.data.estimated_time, '秒'); 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 = { const episodeData: CreateScriptEpisodeRequest = {
title: "episode 1", title: "episode 1",
script_id: projectId, script_id: projectId ? parseInt(projectId) : 1,
status: 1, status: 1,
summary: script summary: script
}; };
@ -158,13 +150,11 @@ export function CreateToVideo2() {
if (episodeResponse.code === 0) { if (episodeResponse.code === 0) {
// 成功创建后跳转到work-flow页面 // 成功创建后跳转到work-flow页面
setEpisodeId(episodeResponse.data.id);
router.push('/create/work-flow'); router.push('/create/work-flow');
} else { } else {
alert(`创建剧集失败: ${episodeResponse.message}`); alert(`创建剧集失败: ${episodeResponse.message}`);
} }
} else {
alert(`创建项目失败: ${projectResponse.message}`);
}
} else { } else {
alert(`转换失败: ${convertResponse.message}`); alert(`转换失败: ${convertResponse.message}`);
} }

View File

@ -64,6 +64,8 @@ export function HomePage2() {
if (projectResponse.code === 0 && projectResponse.data.id) { if (projectResponse.code === 0 && projectResponse.data.id) {
const projectId = projectResponse.data.id; const projectId = projectResponse.data.id;
setCreatedProjectId(projectId); setCreatedProjectId(projectId);
// projectId 作为参数传递给 work-flow 页面
router.push(`/create/work-flow?projectId=${projectId}`);
} else { } else {
alert(`创建项目失败: ${projectResponse.message}`); alert(`创建项目失败: ${projectResponse.message}`);
} }