forked from 77media/video-flow
67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
import { generateCharacterBrief } from "@/api/video_flow";
|
||
import { StoryTemplateEntity } from "../domain/Entities";
|
||
import { getTemplateStoryList } from "@/api/movie_start";
|
||
|
||
/**
|
||
* 模板故事用例
|
||
* 负责管理故事模板的获取与操作
|
||
*/
|
||
export class TemplateStoryUseCase {
|
||
/** 故事模板列表 */
|
||
templateStoryList: StoryTemplateEntity[] = [];
|
||
/** 当前选中的故事模板 */
|
||
selectedTemplate: StoryTemplateEntity | null = null;
|
||
|
||
constructor() {}
|
||
|
||
/**
|
||
* 获取故事模板列表
|
||
* @returns {Promise<StoryTemplateEntity[]>} - 故事模板实体数组
|
||
*/
|
||
async getTemplateStoryList(): Promise<StoryTemplateEntity[]> {
|
||
try {
|
||
const response = await getTemplateStoryList();
|
||
if (response.successful && response.data) {
|
||
this.templateStoryList = response.data.items;
|
||
return response.data.items;
|
||
}
|
||
throw new Error(response.message || "获取故事模板列表失败");
|
||
} catch (error) {
|
||
console.error("获取故事模板列表失败:", error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 上传人物头像并分析特征,
|
||
* @returns {Promise<{crop_url: string, whisk_caption: string}>} 返回新的头像URL和特征描述
|
||
*/
|
||
async AvatarAndAnalyzeFeatures(
|
||
imageUrl: string
|
||
): Promise<{ crop_url: string; whisk_caption: string }> {
|
||
// 直接在这里处理上传和分析逻辑
|
||
try {
|
||
// 2. 调用AI分析接口获取人物特征描述
|
||
const analysisResult = await generateCharacterBrief({
|
||
image_url: imageUrl,
|
||
});
|
||
|
||
if (!analysisResult.successful || !analysisResult.data) {
|
||
throw new Error("人物特征分析失败");
|
||
}
|
||
|
||
// 3. 返回新的头像URL和特征描述,用于替换旧数据
|
||
const result = {
|
||
crop_url: imageUrl,
|
||
whisk_caption: JSON.stringify(analysisResult.data.character_brief),
|
||
};
|
||
|
||
return result;
|
||
} catch (error) {
|
||
throw error;
|
||
}
|
||
}
|
||
}
|