video-flow-b/app/service/usecase/SceneEditUseCase.ts

91 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { SceneEntity, AITextEntity, TagEntity } from '../domain/Entities';
import { SceneItem, TagItem, TextItem } from '../domain/Item';
import { regenerateScene, applySceneToShots, getSceneData } from '@/api/video_flow';
/**
* 场景编辑用例
* 负责场景内容的初始化、修改和优化
*/
export class SceneEditUseCase {
constructor(private sceneItem: SceneItem) {
}
/**
* @description: 重新生成场景
* @param {TextItem} prompt
* @param {TagItem[]} tags
* @return {*}
*/
async AIgenerateScene(prompt: TextItem, tags: TagItem[]): Promise<SceneEntity> {
const promptText = prompt.entity.content;
const tagList = tags.map((tag) => tag.entity.content);
// 调用重新生成场景接口
const response = await regenerateScene({
sceneId: this.sceneItem.entity.id || '',
prompt: promptText,
tagTypes: tagList,
});
if (response.successful) {
const sceneEntity = response.data;
this.sceneItem.setEntity(sceneEntity);
return sceneEntity;
} else {
throw new Error(`重新生成场景失败: ${response.message}`);
}
}
/**
* 应用此场景到指定分镜
* @param shotIds 分镜ID列表
* @returns 应用结果
*/
async applyScene(shotIds: string[]) {
const sceneId = this.sceneItem.entity.id;
return await applySceneToShots({
sceneId,
shotIds
});
}
/**
* 重新获取当前场景的数据
* @description 从服务器重新获取当前场景的AI文本和标签数据并更新当前实体
* @returns Promise<{ text: AITextEntity; tags: TagEntity[] }> 场景相关的AI文本和标签数据
* @throws {Error} 当API调用失败时抛出错误
*/
async refreshSceneData(): Promise<{ text: AITextEntity; tags: TagEntity[] }> {
const sceneId = this.sceneItem.entity.id;
if (!sceneId) {
throw new Error('场景ID不存在无法获取场景数据');
}
const response = await getSceneData({
sceneId: sceneId
});
if (response.successful) {
// 更新当前场景的实体数据
const { text, tags } = response.data;
// 更新场景实体中的相关字段
const updatedSceneEntity = {
...this.sceneItem.entity,
generateTextId: text.id, // 更新AI文本ID
tagIds: tags.map(tag => tag.id), // 更新标签ID列表
updatedAt: Date.now(), // 更新时间戳
};
// 更新当前UseCase中的实体
this.sceneItem.setEntity(updatedSceneEntity);
return response.data;
} else {
throw new Error(`获取场景数据失败: ${response.message}`);
}
}
}