@henteko/kumiki
Version:
A video generation tool that creates videos from JSON configurations
78 lines • 2.8 kB
JavaScript
import path from 'node:path';
import { FFmpegService } from '../services/ffmpeg.js';
import { logger } from '../utils/logger.js';
export class TransitionService {
static instance;
constructor() { }
/**
* Get singleton instance
*/
static getInstance() {
if (!TransitionService.instance) {
TransitionService.instance = new TransitionService();
}
return TransitionService.instance;
}
/**
* Apply transition between two scenes
*/
async applyTransition(options) {
const { transition } = options;
logger.info('Applying transition', {
type: transition.type,
duration: transition.duration,
scene1: path.basename(options.scene1Path),
scene2: path.basename(options.scene2Path),
});
switch (transition.type) {
case 'fade':
return this.applyFadeTransition(options);
case 'wipe':
return this.applyWipeTransition(options);
case 'dissolve':
return this.applyDissolveTransition(options);
default:
logger.warning('Unknown transition type', { type: transition.type });
return options.scene2Path; // Fallback to no transition
}
}
/**
* Apply fade transition
*/
async applyFadeTransition(options) {
const { transition, scene1Path, scene2Path, outputPath } = options;
logger.debug('Applying fade transition', {
duration: transition.duration,
});
const ffmpeg = FFmpegService.getInstance();
await ffmpeg.fadeTransition(scene1Path, scene2Path, outputPath, transition.duration);
return outputPath;
}
/**
* Apply wipe transition
*/
async applyWipeTransition(options) {
const { transition, scene1Path, scene2Path, outputPath } = options;
const direction = transition.direction || 'left';
logger.debug('Applying wipe transition', {
duration: transition.duration,
direction,
});
const ffmpeg = FFmpegService.getInstance();
await ffmpeg.wipeTransition(scene1Path, scene2Path, outputPath, transition.duration, direction);
return outputPath;
}
/**
* Apply dissolve transition
*/
async applyDissolveTransition(options) {
const { transition, scene1Path, scene2Path, outputPath } = options;
logger.debug('Applying dissolve transition', {
duration: transition.duration,
});
const ffmpeg = FFmpegService.getInstance();
await ffmpeg.dissolveTransition(scene1Path, scene2Path, outputPath, transition.duration);
return outputPath;
}
}
//# sourceMappingURL=transition.js.map