import { Injectable } from '@angular/core'; import type { GeneratedResult, HistoryRecord, RemixVersion } from '../models/app-shell.model'; export interface DigitalHumanPublicationState { dhPrompt: string; dhResolution: string; } export interface DigitalHumanPublicationPayload { result: Partial; history: Partial; } export interface DigitalHumanRemixPublicationInput { videoTitle: string; videoId: string; videoUrl: string; prompt: string; resolution: '720p' | '1080p'; durationSeconds: number; remixId: string; } export interface DigitalHumanRemixVersionInput { videoUrl: string; thumbnailUrl?: string; resolution: '720p' | '1080p'; } @Injectable({ providedIn: 'root' }) export class DigitalHumanPublicationService { build(videoUrl: string, state: DigitalHumanPublicationState, now = new Date()): DigitalHumanPublicationPayload { const title = `数字人合成 - ${now.toLocaleString('zh-CN')}`; const quality = state.dhResolution === '1080p' ? '1080P' : '720P'; return { result: { type: 'video', url: videoUrl, title, quality, duration: '数字人视频', cost: 0, segments: [{ id: 'DH-01', videoUrl, prompt: state.dhPrompt, status: 'completed' }], pipelineId: 'digital_human', }, history: { keyword: '数字人合成', status: 'completed', cost: 0, duration: '数字人视频', styleName: '数字人合成', resultUrl: videoUrl, quality, segmentCount: 1, successCount: 1, }, }; } buildRemix(input: DigitalHumanRemixPublicationInput): DigitalHumanPublicationPayload { const quality = input.resolution === '1080p' ? '1080P' : '720P'; const duration = input.durationSeconds > 0 ? `${input.durationSeconds} 秒` : '数字人视频'; const cost = Math.round(input.durationSeconds * 100) / 100; const title = `${input.videoTitle} - 数字人生成`; return { result: { type: 'video', url: input.videoUrl, title, quality, duration, cost, remixId: input.remixId, videoId: input.videoId, segments: [{ id: 'DH-01', videoUrl: input.videoUrl, prompt: input.prompt, status: 'completed' }], pipelineId: 'digital_human', }, history: { keyword: title, original_video_title: input.videoTitle, status: 'completed', cost, duration, remixId: input.remixId, videoId: input.videoId, styleName: '数字人生成', resultUrl: input.videoUrl, quality, segmentCount: 1, successCount: 1, }, }; } buildRemixVersion(input: DigitalHumanRemixVersionInput, now = new Date()): RemixVersion { return { id: `REMIX-${Date.now()}`, style: '数字人生成', created_at: now, file_path: input.videoUrl, thumbnail: input.thumbnailUrl || 'assets/default-remix-thumb.jpg', description: '使用上传形象图与原视频提取音频生成的数字人版本', parameters: { style: 'digital-human', intensity: 1, preserve_audio: true, quality: input.resolution === '1080p' ? 'high' : 'standard', effects: ['digital-human'], }, }; } }