import { fetchRoadshowConfigs } from "@/api/serversetting"; // 5组mock数据 - 保留作为fallback数据 export const MOCK_DATA = [ { id: 1, detail: { projectId: '1', projectName: 'Home and Away', taskId: '1', taskName: 'Episode 1: Flood Disaster', taskDescription: 'A story about a factory accident', taskStatus: '1', mode: 'auto', resolution: 1024, sketch_count: 18, role_count: 1, }, sketch: [{ // sketch_count个分镜草图 url: 'https://cdn.qikongjian.com/1751484624095_ypdp4h.png', script: 'After the flood disaster in the middle and lower reaches of the Yangtze River in 1981\nFlood Documentary Camera\nAccompanied by the sound of news broadcasts.', bg_rgb: ['RGB(58, 58, 59)', 'RGB(189, 186, 185)', 'RGB(114, 113, 115)'] }, { url: 'https://cdn.qikongjian.com/1751484962956_7e2kv2.png', script: 'A big tree has exposed its roots and is lying horizontally on the ground', bg_rgb: ['RGB(12, 13, 13)', 'RGB(42, 46, 47)', 'RGB(101, 107, 109)'] }], roles: [{ // role_count个角色 name: '陈海清', url: 'https://cdn.qikongjian.com/1751486026891_zieiq5.png', sound: 'https://cdn.qikongjian.com/audio/1750385931_99a8fb42-af89-4ae9-841a-a49869f026bd_text_to_video_0.mp3', soundDescription: 'A deep, controlled baritone voice with measured cadence and authoritative undertones.', roleDescription: 'Brief: A portrait of a male in his late 20s or early 30s from South Korea.', }], video: [{ // sketch_count个分镜视频以及对应的音频 url: 'https://cdn.qikongjian.com/1751483686756_01p12v.mp4', script: 'After the flood disaster in the middle and lower reaches of the Yangtze River in 1981', audio: 'https://cdn.qikongjian.com/audio/1750385931_99a8fb42-af89-4ae9-841a-a49869f026bd_text_to_video_0.mp3', }], music: { url: 'https://cdn.qikongjian.com/audio/1750385931_99a8fb42-af89-4ae9-841a-a49869f026bd_text_to_video_0.mp3', script: '激昂的科幻背景音乐', name: 'Music / sci-fi', duration: '01m : 35s : 765ms', totalDuration: '01m : 35s : 765ms', isLooped: true, }, final: { url: 'https://cdn.qikongjian.com/1751593771075_0lxy9f.mp4' }, } ]; // 异步获取随机数据 - 从接口或fallback到本地数据 export const getRandomMockData = async () => { try { const apiData = await fetchRoadshowConfigs(); const randomIndex = Math.floor(Math.random() * apiData.length); const selectedData = apiData[randomIndex]; console.log('从接口数据中随机选择:', selectedData); return selectedData; } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : '未知错误'; console.warn('接口获取数据失败,使用本地fallback数据:', errorMessage); // 确保本地数据结构正确 if (!MOCK_DATA || MOCK_DATA.length === 0) { throw new Error('本地fallback数据也不可用'); } const randomIndex = Math.floor(Math.random() * MOCK_DATA.length); const selectedData = MOCK_DATA[randomIndex]; console.log('使用本地fallback数据:', selectedData); throw error; // 重新抛出错误,让上层知道是fallback数据 } }; export interface TaskObject { projectId: string; projectName: string; taskId: string; taskName: string; taskDescription: string; taskStatus: string; taskProgress: number; mode: string; resolution: string; } export interface SketchItem { id: string; url: string; script: string; bg_rgb?: string[]; status: string; } export interface VideoItem { id: string; url: string; script: string; status: string; } export interface FinalVideo { url: string; } export const STEP_MESSAGES = { loading: 'Loading task information...', sketch: (count: number, total: number) => `Generating sketch ${count + 1 > total ? total : count + 1}/${total}...`, sketchComplete: 'Sketch generation complete', character: 'Drawing characters...', newCharacter: (count: number, total: number) => `Drawing character ${count + 1 > total ? total : count + 1}/${total}...`, video: (count: number, total: number) => `Generating video ${count + 1 > total ? total : count + 1}/${total}...`, videoComplete: 'Video generation complete', audio: 'Generating background audio...', postProduction: (step: string) => `Post-production: ${step}...`, final: 'Generating final product...', complete: 'Task completed' }; export const MOCK_DELAY_TIME = { sketch: 5000, // 5s 一个草图 character: 2000, // 2s 一个角色 video: 6000, // 6s 一个分镜视频 audio: 2000, // 2s 一个音频 postProduction: 2000, // 2s 一个后期制作 final: 10000, // 10s 一个最终成品 }