video-flow-b/app/service/Interaction/MovieProjectService.ts
2025-10-20 20:21:07 +08:00

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 { createMovieProject, createMovieProjectV2, createMovieProjectV3, createMovieProjectV4 } from "@/api/create_movie";
import { QueueResponse, withQueuePolling, QueueResponseData } from "@/api/movie_queue";
/**
* 电影项目创建模式
*/
export enum MovieProjectMode {
/** 普通模式 */
NORMAL = "normal",
/** 照片生成模式 */
IMAGE = "image",
/** 模板生成模式 */
TEMPLATE = "template",
/** V4增强模式支持角色、场景、道具等 */
V4 = "v4"
}
/** 创建项目响应数据 */
export interface CreateProjectResponse {
project_id: string;
}
/**
* 统一的电影项目创建服务
*/
export class MovieProjectService {
/**
* 创建电影项目
*/
static async createProject<T>(
mode: MovieProjectMode,
params: T
): Promise<CreateProjectResponse> {
try {
let apiCall: (p: T) => Promise<QueueResponse>;
switch (mode) {
case MovieProjectMode.NORMAL:
apiCall = createMovieProject as (p: T) => Promise<QueueResponse>;
break;
case MovieProjectMode.IMAGE:
apiCall = createMovieProjectV2 as (p: T) => Promise<QueueResponse>;
break;
case MovieProjectMode.TEMPLATE:
apiCall = createMovieProjectV3 as (p: T) => Promise<QueueResponse>;
break;
case MovieProjectMode.V4:
apiCall = createMovieProjectV4 as (p: T) => Promise<QueueResponse>;
break;
default:
throw new Error(`不支持的创建模式: ${mode}`);
}
const result = await withQueuePolling(apiCall, params, {
interval: 5000,
maxAttempts: 120,
onPolling: (data: QueueResponseData) => {
console.log("轮询状态:", data);
},
onError: (error: Error) => {
if (error.message === '操作已取消') {
window.msg.info('Queue cancelled');
} else {
window.msg.error(error instanceof Error ? error.message : "Failed to create project");
}
},
onCancel: () => {
window.msg.info('Queue cancelled');
}
});
if (result.code !== 0 && result.code !== 202) {
throw new Error(result.message || "Failed to create project");
}
const projectId = (result.data as any).project_id;
if (!projectId) {
throw new Error("Failed to create project: No project ID returned");
}
return { project_id: projectId };
} catch (error) {
if (error instanceof Error && error.message === '操作已取消') {
throw error;
}
window.msg.error(error instanceof Error ? error.message : "Failed to create project");
throw error;
}
}
}