| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import { Injectable } from '@angular/core';
- export type TopicVideoStage = 'idle' | 'scripting' | 'imaging' | 'videoing' | 'composing' | 'done' | 'failed';
- export type TopicVideoMediaMode = 'image' | 'video';
- export interface TopicVideoProgressInput {
- quickMode: boolean;
- stage: TopicVideoStage;
- mediaMode: TopicVideoMediaMode;
- imageProgress: number;
- videoProgress: number;
- composeProgress: number;
- }
- interface SceneLike {
- state?: string;
- imageUrl?: string;
- videoUrl?: string;
- }
- @Injectable({ providedIn: 'root' })
- export class TopicVideoProgressService {
- calculateTotalProgress(input: TopicVideoProgressInput): number {
- if (!input.quickMode) {
- return input.stage === 'composing' ? input.composeProgress : (input.stage === 'done' ? 100 : 0);
- }
- const SCRIPT_W = 5;
- const IMAGE_W = 30;
- const COMPOSE_W = 40;
- const videoW = input.mediaMode === 'video' ? 25 : 0;
- const remain = 100 - SCRIPT_W - IMAGE_W - videoW - COMPOSE_W;
- const composeW = COMPOSE_W + remain;
- const script = input.stage === 'idle' ? 0 : (input.stage === 'scripting' ? 2 : SCRIPT_W);
- const image = Math.round((input.imageProgress / 100) * IMAGE_W);
- const video = Math.round((input.videoProgress / 100) * videoW);
- const compose = Math.round((input.composeProgress / 100) * composeW);
- return Math.min(script + image + video + compose, 100);
- }
- readyCount(scenes: SceneLike[]): number {
- return scenes.filter((scene) => scene.state === 'image-done' || scene.state === 'video-done').length;
- }
- videoReadyCount(scenes: SceneLike[]): number {
- return scenes.filter((scene) => !!scene.videoUrl).length;
- }
- caseSummary(scenes: SceneLike[]): { C: number; D: number; total: number } {
- const summary = { C: 0, D: 0, total: 0 };
- for (const scene of scenes) {
- if (scene.videoUrl) summary.C++;
- else if (scene.imageUrl) summary.D++;
- }
- summary.total = summary.C + summary.D;
- return summary;
- }
- formatSize(bytes: number): string {
- if (bytes < 1024) return `${bytes} B`;
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
- return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
- }
- }
|