UNPKG

motion-canvas-multitrack

Version:

A plug and play audio plugin for Motion Canvas

79 lines 2.99 kB
import { BoolMetaField, ObjectMetaField } from '@motion-canvas/core/lib/meta'; import { EventDispatcher } from '@motion-canvas/core/lib/events'; export class MultiExport { project; settings; static id = 'multitrack'; static displayName = 'MultiTrack'; static meta(project) { return new ObjectMetaField(this.displayName, { fastStart: new BoolMetaField('fast start', true), includeAudio: new BoolMetaField('include audio', true).disable(!project.audio), }); } static async create(project, settings) { return new MultiExport(project, settings); } static response = new EventDispatcher(); static { if (import.meta.hot) { import.meta.hot.on(`motion-canvas/ffmpeg-ack`, (response) => this.response.dispatch(response)); } } constructor(project, settings) { this.project = project; this.settings = settings; } async start() { const options = this.settings.exporter.options; document.addEventListener("multi-track:finalize", (e) => start_invoke()); document.dispatchEvent(new CustomEvent("multi-track:prepare")); const start_invoke = async () => { await this.invoke('start', { ...this.settings, ...options, audio: "/audio/multi-track-audio.wav", audioOffset: this.project.meta.shared.audioOffset.get() - this.settings.range[0], }); }; } async handleFrame(canvas) { await this.invoke('handleFrame', { data: canvas.toDataURL('image/png'), }); } async stop(result) { await this.invoke('end', result); } invoke(method, data) { if (import.meta.hot) { return new Promise((resolve, reject) => { const handle = (response) => { if (response.method == "end") { fetch("cleanup"); // remove file "/audio/multi-track-audio.wav" } if (response.method !== method) { return; } MultiExport.response.unsubscribe(handle); if (response.status === 'success') { resolve(response.data); } else { reject({ message: 'An error occurred while exporting the video.', remarks: `Method: ${method}<br>Server error: ${response.message}`, object: data, }); } }; MultiExport.response.subscribe(handle); import.meta.hot.send('motion-canvas/ffmpeg', { method, data }); }); } else { throw new Error('MultiExport can only be used locally.'); } } } //# sourceMappingURL=export.js.map