import { ScriptSlice, ScriptValueObject } from "../domain/valueObject"; import { generateScriptStream, applyScriptToShot } from "@/api/video_flow"; export class ScriptEditUseCase { loading: boolean = false; private scriptValueObject: ScriptValueObject; constructor(script: string) { this.scriptValueObject = new ScriptValueObject(script); } /** * @description: AI生成剧本方法 * @param prompt 剧本提示词 * @returns Promise */ async generateScript(prompt: string): Promise { try { this.loading = true; // 使用API接口生成剧本 const response = await generateScriptStream({ prompt, }); if (!response.successful) { throw new Error(response.message || "AI生成剧本失败"); } // 使用for await处理流式数据 for await (const data of response.data) { // TODO: 根据流式数据更新剧本片段 // 这里需要根据实际的流式数据格式来处理 // 可能需要将流式数据转换为ScriptSlice并添加到scriptValueObject中 } } catch (error) { console.error("AI生成剧本出错:", error); throw error; } finally { this.loading = false; } } /** * @description: 应用剧本方法 * @returns Promise */ async applyScript(): Promise { try { this.loading = true; // 调用应用剧本接口 const response = await applyScriptToShot({ script: this.scriptValueObject.toString(), }); if (!response.successful) { throw new Error(response.message || "应用剧本失败"); } console.log("剧本应用成功"); } catch (error) { console.error("应用剧本失败:", error); throw error; } finally { this.loading = false; } } /** * @description: 获取当前剧本片段列表 * @returns ScriptSlice[] */ getScriptSlices(): ScriptSlice[] { return this.scriptValueObject.scriptSlices; } /** * @description: 获取加载状态 * @returns boolean */ isLoading(): boolean { return this.loading; } /** * @description: 更新剧本 * @param scriptText 剧本文本字符串 */ updateScript(scriptText: string): void { this.scriptValueObject = new ScriptValueObject(scriptText); } /** * @description: 将当前剧本片段转换为字符串 * @returns string */ toString(): string { return this.scriptValueObject.toString(); } /** * @description: 更新指定ID的剧本片段 * @param id 剧本片段唯一标识 * @param text 新的文本内容 * @param metaData 新的元数据 * @returns boolean 是否更新成功 */ updateScriptSlice(id: string, text: string, metaData?: Record): boolean { const index = this.scriptValueObject.scriptSlices.findIndex(slice => slice.id === id); if (index === -1) { return false; } // 只更新text和metaData字段,保持其他字段不变 this.scriptValueObject.scriptSlices[index] = { ...this.scriptValueObject.scriptSlices[index], text, metaData: metaData || this.scriptValueObject.scriptSlices[index].metaData }; return true; } }