forked from 77media/video-flow
119 lines
3.0 KiB
TypeScript
119 lines
3.0 KiB
TypeScript
import { post } from './request';
|
|
import { ProjectTypeEnum } from './enums';
|
|
import { ApiResponse } from './common';
|
|
|
|
// 场景/分镜头数据结构
|
|
export interface Scene {
|
|
id: string;
|
|
name: string;
|
|
description: string;
|
|
plot: string;
|
|
dialogue: string;
|
|
narration: string;
|
|
imageUrl?: string;
|
|
}
|
|
|
|
// 角色数据结构
|
|
export interface Character {
|
|
name: string;
|
|
desc: string;
|
|
}
|
|
|
|
// 剧本到分镜头提示词模型
|
|
export interface ScenePrompts {
|
|
scenes: Scene[]; // 分场景列表
|
|
characters?: Character[]; // 角色列表
|
|
summary?: string; // 剧情概要
|
|
scene?: string; // 场景描述
|
|
atmosphere?: string; // 氛围描述
|
|
episode_id?: number; // 剧集ID
|
|
total_shots?: string; // 总镜头数
|
|
}
|
|
|
|
// 剧本转分镜头请求接口
|
|
export interface ScriptToSceneRequest {
|
|
script: string;
|
|
episode_id: number;
|
|
script_id: number;
|
|
project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO;
|
|
}
|
|
|
|
// 视频转分镜头请求接口
|
|
export interface VideoToSceneRequest {
|
|
video_url: string;
|
|
episode_id: number;
|
|
script_id: number;
|
|
project_type: ProjectTypeEnum.VIDEO_TO_VIDEO;
|
|
}
|
|
|
|
// 转换分镜头请求类型
|
|
export type ConvertScenePromptRequest = ScriptToSceneRequest | VideoToSceneRequest;
|
|
|
|
// 转换分镜头响应接口
|
|
export type ConvertScenePromptResponse = ApiResponse<ScenePrompts>;
|
|
|
|
/**
|
|
* 将剧本或视频转换为分镜头提示词
|
|
* @param request - 请求参数,根据 project_type 自动判断是剧本还是视频模式
|
|
* @returns Promise<ConvertScenePromptResponse>
|
|
*/
|
|
export const convertScenePrompt = async (
|
|
request: ConvertScenePromptRequest
|
|
): Promise<ConvertScenePromptResponse> => {
|
|
// return post<ConvertScenePromptResponse>('/video_flow/convert-scene-prompts', request);
|
|
return new Promise((resolve) => {
|
|
setTimeout(() => {
|
|
resolve({
|
|
code: 0,
|
|
message: 'success',
|
|
data: {
|
|
scenes: [],
|
|
characters: [],
|
|
summary: '',
|
|
scene: '',
|
|
atmosphere: '',
|
|
episode_id: 0,
|
|
total_shots: ''
|
|
},
|
|
successful: true
|
|
});
|
|
}, 0);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 剧本转分镜头提示词
|
|
* @param script - 剧本内容
|
|
* @returns Promise<ConvertScenePromptResponse>
|
|
*/
|
|
export const convertScriptToScene = async (
|
|
script: string,
|
|
episode_id: number,
|
|
script_id: number
|
|
): Promise<ConvertScenePromptResponse> => {
|
|
return convertScenePrompt({
|
|
script,
|
|
episode_id,
|
|
script_id,
|
|
project_type: ProjectTypeEnum.SCRIPT_TO_VIDEO
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 视频转分镜头提示词
|
|
* @param video_url - 视频链接
|
|
* @returns Promise<ConvertScenePromptResponse>
|
|
*/
|
|
export const convertVideoToScene = async (
|
|
video_url: string,
|
|
episode_id: number,
|
|
script_id: number
|
|
): Promise<ConvertScenePromptResponse> => {
|
|
return convertScenePrompt({
|
|
video_url,
|
|
episode_id,
|
|
script_id,
|
|
project_type: ProjectTypeEnum.VIDEO_TO_VIDEO
|
|
});
|
|
};
|