forked from 77media/video-flow
91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
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}`);
|
||
}
|
||
}
|
||
}
|