@dnyantra/dtly 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +26 -0
- package/README.md +172 -2
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +95 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/anim.d.ts +3 -0
- package/dist/core/anim.js +61 -0
- package/dist/core/anim.js.map +1 -0
- package/dist/core/color.d.ts +4 -0
- package/dist/core/color.js +28 -0
- package/dist/core/color.js.map +1 -0
- package/dist/core/ease.d.ts +8 -0
- package/dist/core/ease.js +90 -0
- package/dist/core/ease.js.map +1 -0
- package/dist/core/model.d.ts +229 -0
- package/dist/core/model.js +4 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/text.d.ts +41 -0
- package/dist/core/text.js +222 -0
- package/dist/core/text.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.js +193 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/node.d.ts +4 -0
- package/dist/node.js +6 -0
- package/dist/node.js.map +1 -0
- package/dist/ops/ops.d.ts +39 -0
- package/dist/ops/ops.js +259 -0
- package/dist/ops/ops.js.map +1 -0
- package/dist/ops/store.d.ts +4 -0
- package/dist/ops/store.js +22 -0
- package/dist/ops/store.js.map +1 -0
- package/dist/presets/index.d.ts +14 -0
- package/dist/presets/index.js +235 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/text.d.ts +5 -0
- package/dist/presets/text.js +19 -0
- package/dist/presets/text.js.map +1 -0
- package/dist/render/export.d.ts +43 -0
- package/dist/render/export.js +215 -0
- package/dist/render/export.js.map +1 -0
- package/dist/render/ffmpeg.d.ts +1 -0
- package/dist/render/ffmpeg.js +16 -0
- package/dist/render/ffmpeg.js.map +1 -0
- package/dist/render/node-host.d.ts +18 -0
- package/dist/render/node-host.js +168 -0
- package/dist/render/node-host.js.map +1 -0
- package/dist/render/renderer.d.ts +36 -0
- package/dist/render/renderer.js +372 -0
- package/dist/render/renderer.js.map +1 -0
- package/dist/starter.d.ts +5 -0
- package/dist/starter.js +32 -0
- package/dist/starter.js.map +1 -0
- package/dist/studio/server.d.ts +12 -0
- package/dist/studio/server.js +190 -0
- package/dist/studio/server.js.map +1 -0
- package/dist/studio-app/app.css +2 -0
- package/dist/studio-app/app.css.map +7 -0
- package/dist/studio-app/app.js +5 -0
- package/dist/studio-app/app.js.map +7 -0
- package/dist/studio-app/index.html +15 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/fonts/Baloo2.ttf +0 -0
- package/fonts/Mukta-Bold.ttf +0 -0
- package/fonts/OFL-Baloo2.txt +93 -0
- package/fonts/OFL-Mukta.txt +93 -0
- package/package.json +84 -4
- package/plugin/skills/dtly/SKILL.md +94 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { addLayer, findLayer, getComp, OpError, setKeyframe, updateLayer } from '../ops/ops.js';
|
|
2
|
+
import { TEXT_ANIMATORS } from './text.js';
|
|
3
|
+
const num = (v, d) => (typeof v === 'number' ? v : d);
|
|
4
|
+
const str = (v, d) => (typeof v === 'string' ? v : d);
|
|
5
|
+
const r3 = (t) => Math.round(t * 1000) / 1000;
|
|
6
|
+
const kf = (...k) => ({ keyframes: k.map(([t, v, ease]) => (ease ? { t: r3(t), v, ease } : { t: r3(t), v })) });
|
|
7
|
+
export const PRESETS = {};
|
|
8
|
+
for (const [name, def] of Object.entries(TEXT_ANIMATORS)) {
|
|
9
|
+
PRESETS[`text.${name}`] = {
|
|
10
|
+
kind: 'text',
|
|
11
|
+
description: def.description,
|
|
12
|
+
params: '{layer: textLayerId, delay?: s, stagger?: s, duration?: s, replace?: boolean}',
|
|
13
|
+
apply: (p, _comp, o) => {
|
|
14
|
+
const { layer } = findLayer(p, str(o.layer, ''));
|
|
15
|
+
if (layer.type !== 'text')
|
|
16
|
+
throw new OpError(`${layer.id} is not a text layer`);
|
|
17
|
+
const anims = def.animators.map((a) => ({ ...a, ...(o.delay !== undefined && { delay: num(o.delay, 0) }), ...(o.stagger !== undefined && { stagger: num(o.stagger, 0) }), ...(o.duration !== undefined && { duration: num(o.duration, 0.5) }) }));
|
|
18
|
+
layer.animators = o.replace === false ? [...(layer.animators ?? []), ...anims] : [...(layer.animators ?? []).filter((a) => (a.mode === 'out') !== (anims[0].mode === 'out')), ...anims];
|
|
19
|
+
return { created: [], note: `Applied ${name} to ${layer.id}` };
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
PRESETS['kinetic.sequence'] = {
|
|
24
|
+
kind: 'kinetic',
|
|
25
|
+
description: 'Classic kinetic typography: phrases appear one after another in the same spot, each with its own entrance, emphasis words bigger and coloured.',
|
|
26
|
+
params: '{phrases: string[], start?: s, each?: s (default by length), position?: [x,y], size?: px, color?, accent?: color, emphasis?: string[] (words to highlight), style?: "slam"|"popIn"|"fadeUp"|"blurIn"|"cascade", font?, maxWidth?, holdLast?: boolean (default true: last phrase stays to the end of the comp)}',
|
|
27
|
+
apply: (p, compId, o) => {
|
|
28
|
+
const comp = getComp(p, compId);
|
|
29
|
+
const phrases = o.phrases ?? [];
|
|
30
|
+
const pos = o.position ?? [comp.width / 2, comp.height / 2];
|
|
31
|
+
const size = num(o.size, Math.round(comp.width / 9));
|
|
32
|
+
const style = str(o.style, 'slam');
|
|
33
|
+
const emphasis = new Set((o.emphasis ?? []).map((w) => w.toLowerCase()));
|
|
34
|
+
let t = num(o.start, 0);
|
|
35
|
+
const created = [];
|
|
36
|
+
const holdLast = o.holdLast !== false;
|
|
37
|
+
phrases.forEach((text, i) => {
|
|
38
|
+
const words = text.split(/\s+/).length;
|
|
39
|
+
const each = num(o.each, Math.max(0.7, 0.35 + words * 0.32));
|
|
40
|
+
const last = holdLast && i === phrases.length - 1;
|
|
41
|
+
const outPoint = last ? Math.max(comp.duration, t + each) : t + each;
|
|
42
|
+
const isEmph = text.split(/\s+/).some((w) => emphasis.has(w.toLowerCase()));
|
|
43
|
+
const layer = addLayer(p, comp.id, {
|
|
44
|
+
type: 'text', name: `kinetic-${i + 1}`, text, inPoint: r3(t), outPoint: r3(outPoint),
|
|
45
|
+
size: isEmph ? Math.round(size * 1.35) : size, weight: 800, font: o.font,
|
|
46
|
+
color: isEmph ? str(o.accent, '#FFC93C') : str(o.color, '#ffffff'), maxWidth: num(o.maxWidth, comp.width * 0.86),
|
|
47
|
+
transform: { position: pos, scale: kf([t, [100, 100]], [outPoint, [100 + 8 * ((outPoint - t) / each), 100 + 8 * ((outPoint - t) / each)]]) },
|
|
48
|
+
animators: [...TEXT_ANIMATORS[style in TEXT_ANIMATORS ? style : 'slam'].animators, ...(last ? [] : [{ unit: 'word', mode: 'out', stagger: 0.03, duration: 0.18, ease: 'easeIn', from: { opacity: 0, scale: 80 } }])],
|
|
49
|
+
});
|
|
50
|
+
created.push(layer.id);
|
|
51
|
+
t = r3(t + each);
|
|
52
|
+
});
|
|
53
|
+
return { created, note: `Sequence ends at ${t.toFixed(2)}s` };
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
PRESETS['opener.logoReveal'] = {
|
|
57
|
+
kind: 'opener',
|
|
58
|
+
description: 'Brand opener: a ring draws on and bursts, the title tracks in, an accent line draws, and a tagline reveals from a mask.',
|
|
59
|
+
params: '{title: string, tagline?: string, start?: s, color?: brand colour, accent?: colour, textColor?, position?: [x,y], size?: px, font?}',
|
|
60
|
+
apply: (p, compId, o) => {
|
|
61
|
+
const comp = getComp(p, compId);
|
|
62
|
+
const t0 = num(o.start, 0);
|
|
63
|
+
const [cx, cy] = o.position ?? [comp.width / 2, comp.height / 2];
|
|
64
|
+
const color = str(o.color, '#E8692A'), accent = str(o.accent, '#FFC93C');
|
|
65
|
+
const size = num(o.size, Math.round(comp.width / 7.5));
|
|
66
|
+
const r = Math.min(comp.width, comp.height) * 0.42;
|
|
67
|
+
const created = [];
|
|
68
|
+
const add = (l) => created.push(addLayer(p, comp.id, l).id);
|
|
69
|
+
add({ type: 'shape', name: 'reveal-ring', shape: 'ellipse', size: [r, r], stroke: color, strokeWidth: 10, inPoint: t0, outPoint: t0 + 1.6, motionBlur: { samples: 8 },
|
|
70
|
+
transform: { position: [cx, cy], rotation: kf([t0, -120, 'expoOut'], [t0 + 1, 0]), scale: kf([t0 + 0.7, [100, 100], 'expoOut'], [t0 + 1.4, [260, 260]]), opacity: kf([t0 + 0.9, 100], [t0 + 1.4, 0]) },
|
|
71
|
+
trim: { end: kf([t0, 0, 'expoOut'], [t0 + 0.8, 100]) } });
|
|
72
|
+
add({ type: 'shape', name: 'reveal-burst', shape: 'ellipse', size: [r * 0.9, r * 0.9], fill: color, inPoint: t0 + 0.7, outPoint: t0 + 1.5,
|
|
73
|
+
transform: { position: [cx, cy], scale: kf([t0 + 0.7, [0, 0], 'expoOut'], [t0 + 1.2, [220, 220]]), opacity: kf([t0 + 0.9, 90], [t0 + 1.5, 0]) } });
|
|
74
|
+
add({ type: 'text', name: 'opener-title', text: str(o.title, 'TITLE'), size, weight: 800, color: str(o.textColor, '#ffffff'), font: o.font, inPoint: t0 + 0.8,
|
|
75
|
+
maxWidth: comp.width * 0.88, transform: { position: [cx, cy] },
|
|
76
|
+
animators: [{ unit: 'grapheme', stagger: 0.025, duration: 1.1, ease: 'expoOut', from: { opacity: 0, tracking: 40, blur: 10 } }],
|
|
77
|
+
effects: [{ type: 'dropShadow', blur: 30, distance: 0, opacity: 50 }] });
|
|
78
|
+
add({ type: 'shape', name: 'opener-line', shape: 'line', points: [[-comp.width * 0.3, 0], [comp.width * 0.3, 0]], stroke: accent, strokeWidth: 8, inPoint: t0 + 1.2,
|
|
79
|
+
transform: { position: [cx, cy + size * 0.85] }, trim: { start: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 0]), end: kf([t0 + 1.2, 50, 'expoOut'], [t0 + 1.9, 100]) } });
|
|
80
|
+
if (o.tagline)
|
|
81
|
+
add({ type: 'text', name: 'opener-tagline', text: str(o.tagline, ''), size: Math.round(size * 0.42), weight: 600, color: accent, font: o.font, inPoint: t0 + 1.5,
|
|
82
|
+
transform: { position: [cx, cy + size * 1.4] }, animators: [{ unit: 'line', clip: true, stagger: 0.1, duration: 0.8, ease: 'expoOut', from: { y: size * 0.6 } }] });
|
|
83
|
+
return { created, note: `Opener settles at ${(t0 + 2.3).toFixed(1)}s` };
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
PRESETS['opener.bars'] = {
|
|
87
|
+
kind: 'opener',
|
|
88
|
+
description: 'Coloured bars sweep across the frame in a stagger, uncovering a title that slams in.',
|
|
89
|
+
params: '{title: string, start?: s, colors?: string[], textColor?, size?: px, font?, direction?: "left"|"right"}',
|
|
90
|
+
apply: (p, compId, o) => {
|
|
91
|
+
const comp = getComp(p, compId);
|
|
92
|
+
const t0 = num(o.start, 0);
|
|
93
|
+
const colors = o.colors ?? ['#E8692A', '#FFC93C', '#F6EEDF', '#1A1512'];
|
|
94
|
+
const dir = o.direction === 'right' ? -1 : 1;
|
|
95
|
+
const barH = comp.height / colors.length;
|
|
96
|
+
const created = [];
|
|
97
|
+
colors.forEach((c, i) => {
|
|
98
|
+
const ts = t0 + i * 0.08;
|
|
99
|
+
created.push(addLayer(p, comp.id, { type: 'solid', name: `bar-${i + 1}`, color: c, size: [comp.width, barH + 2], inPoint: t0, outPoint: t0 + 1.6,
|
|
100
|
+
transform: { anchor: [0, 0], position: kf([ts, [-comp.width * dir, i * barH], 'expoInOut'], [ts + 0.6, [0, i * barH], 'expoInOut'], [ts + 0.85, [0, i * barH], 'expoInOut'], [ts + 1.4, [comp.width * dir, i * barH]]) } }).id);
|
|
101
|
+
});
|
|
102
|
+
created.unshift(addLayer(p, comp.id, { type: 'text', name: 'bars-title', text: str(o.title, 'TITLE'), size: num(o.size, Math.round(comp.width / 8)), weight: 800, color: str(o.textColor, '#ffffff'),
|
|
103
|
+
font: o.font, inPoint: t0 + 0.9, maxWidth: comp.width * 0.88,
|
|
104
|
+
animators: TEXT_ANIMATORS.slam.animators }, 0).id);
|
|
105
|
+
return { created };
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
PRESETS['slides.slideshow'] = {
|
|
109
|
+
kind: 'slides',
|
|
110
|
+
description: 'Slider/slideshow from images and clips: each slide gets a slow Ken Burns move, an optional caption, and a transition into the next.',
|
|
111
|
+
params: '{items: [{src, type?: "image"|"video", caption?, trimIn?, speed?}], start?: s, each?: s, transition?: type or list of types cycled per cut ("push"|"crossfade"|"zoom"|"wipe"|"whip"|"slideUp"), transitionDuration?: s, captionStyle?: text preset name, captionColor?, captionY?: px, plate?: colour, fitComp?: boolean (default true: comp duration = slideshow end)}',
|
|
112
|
+
apply: (p, compId, o) => {
|
|
113
|
+
const comp = getComp(p, compId);
|
|
114
|
+
const items = o.items ?? [];
|
|
115
|
+
const each = num(o.each, 3), td = num(o.transitionDuration, 0.5), t0 = num(o.start, 0);
|
|
116
|
+
const created = [];
|
|
117
|
+
const ids = [];
|
|
118
|
+
items.forEach((it, i) => {
|
|
119
|
+
const start = t0 + i * (each - td);
|
|
120
|
+
const end = start + each;
|
|
121
|
+
const type = it.type ?? (/\.(mp4|mov|webm|m4v)$/i.test(it.src) ? 'video' : 'image');
|
|
122
|
+
const zoomIn = i % 2 === 0;
|
|
123
|
+
const layer = addLayer(p, comp.id, {
|
|
124
|
+
type, name: `slide-${i + 1}`, src: it.src, inPoint: +start.toFixed(3), outPoint: +end.toFixed(3),
|
|
125
|
+
...(type === 'video' ? { trimIn: it.trimIn ?? 0, speed: it.speed ?? 1 } : {}),
|
|
126
|
+
transform: { scale: kf([start, zoomIn ? [104, 104] : [118, 118]], [end, zoomIn ? [118, 118] : [104, 104]]) },
|
|
127
|
+
}, comp.layers.length);
|
|
128
|
+
ids.push(layer.id);
|
|
129
|
+
created.push(layer.id);
|
|
130
|
+
if (it.caption) {
|
|
131
|
+
created.push(addLayer(p, comp.id, { type: 'text', name: `caption-${i + 1}`, text: it.caption, size: Math.round(comp.width / 15), weight: 800, color: str(o.captionColor, '#ffffff'),
|
|
132
|
+
inPoint: +(start + td * 0.6).toFixed(3), outPoint: +(end - td).toFixed(3), maxWidth: comp.width * 0.84,
|
|
133
|
+
transform: { position: [comp.width / 2, num(o.captionY, comp.height * 0.78)] },
|
|
134
|
+
box: o.plate ? { color: str(o.plate, '#000000'), padding: [32, 16], radius: 18, reveal: kf([start + td * 0.6, 0, 'expoOut'], [start + td * 0.6 + 0.5, 100]) } : undefined,
|
|
135
|
+
shadow: o.plate ? undefined : { color: 'rgba(0,0,0,0.7)', blur: 18, y: 4 },
|
|
136
|
+
animators: [...TEXT_ANIMATORS[str(o.captionStyle, 'fadeUp')]?.animators ?? TEXT_ANIMATORS.fadeUp.animators, ...TEXT_ANIMATORS.fadeOutDown.animators] }, 0).id);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
// Transitions between consecutive slides.
|
|
140
|
+
const types = Array.isArray(o.transition) ? o.transition : [str(o.transition, 'push')];
|
|
141
|
+
for (let i = 1; i < ids.length; i++)
|
|
142
|
+
PRESETS['transition.between'].apply(p, comp.id, { from: ids[i - 1], to: ids[i], type: types[(i - 1) % types.length], duration: td });
|
|
143
|
+
const end = r3(t0 + items.length * (each - td) + td);
|
|
144
|
+
if (o.fitComp !== false)
|
|
145
|
+
comp.duration = end;
|
|
146
|
+
return { created, note: `Slideshow ends at ${end}s${o.fitComp !== false ? ' (comp duration set to match)' : ''}` };
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
PRESETS['transition.between'] = {
|
|
150
|
+
kind: 'transition',
|
|
151
|
+
description: 'Animates two overlapping layers (clips, images or precomps) so one hands over to the other at the overlap.',
|
|
152
|
+
params: '{from: layerId (outgoing), to: layerId (incoming, must start before `from` ends), type: "push"|"crossfade"|"zoom"|"wipe"|"whip"|"slideUp", duration?: s}',
|
|
153
|
+
apply: (p, compId, o) => {
|
|
154
|
+
const a = findLayer(p, str(o.from, '')), b = findLayer(p, str(o.to, ''));
|
|
155
|
+
const comp = a.comp;
|
|
156
|
+
const d = num(o.duration, 0.5);
|
|
157
|
+
const t1 = b.layer.inPoint ?? 0, t2 = t1 + d;
|
|
158
|
+
const W = comp.width, H = comp.height;
|
|
159
|
+
const center = [W / 2, H / 2];
|
|
160
|
+
const type = str(o.type, 'push');
|
|
161
|
+
const pos = (id, ...k) => k.forEach(([t, v, e]) => setKeyframe(p, id, 'transform.position', t, v, e));
|
|
162
|
+
// Incoming must sit above the outgoing layer for overlays like wipe/crossfade.
|
|
163
|
+
if (b.index > a.index) {
|
|
164
|
+
comp.layers.splice(b.index, 1);
|
|
165
|
+
comp.layers.splice(a.index, 0, b.layer);
|
|
166
|
+
}
|
|
167
|
+
switch (type) {
|
|
168
|
+
case 'crossfade':
|
|
169
|
+
setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easyEase');
|
|
170
|
+
setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);
|
|
171
|
+
break;
|
|
172
|
+
case 'zoom':
|
|
173
|
+
setKeyframe(p, a.layer.id, 'transform.opacity', t1, 100, 'easeIn');
|
|
174
|
+
setKeyframe(p, a.layer.id, 'transform.opacity', t2, 0);
|
|
175
|
+
updateLayer(p, a.layer.id, { effects: [...(a.layer.effects ?? []), { type: 'blur', radius: kf([t1, 0, 'easeIn'], [t2, 25]) }] });
|
|
176
|
+
setKeyframe(p, b.layer.id, 'transform.opacity', t1, 0, 'easeOut');
|
|
177
|
+
setKeyframe(p, b.layer.id, 'transform.opacity', t2, 100);
|
|
178
|
+
break;
|
|
179
|
+
case 'wipe':
|
|
180
|
+
updateLayer(p, b.layer.id, { masks: [{ shape: 'rect', rect: kf([t1, [0, 0, 0, H], 'expoInOut'], [t2, [0, 0, W * 1.2, H]]) }] });
|
|
181
|
+
break;
|
|
182
|
+
case 'slideUp':
|
|
183
|
+
pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [W / 2, -H / 2]]);
|
|
184
|
+
pos(b.layer.id, [t1, [W / 2, H * 1.5], 'expoInOut'], [t2, center]);
|
|
185
|
+
break;
|
|
186
|
+
case 'whip':
|
|
187
|
+
pos(a.layer.id, [t1, center, 'expoIn'], [t2, [-W / 2, H / 2]]);
|
|
188
|
+
pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoOut'], [t2, center]);
|
|
189
|
+
for (const id of [a.layer.id, b.layer.id])
|
|
190
|
+
updateLayer(p, id, { motionBlur: { samples: 12, shutter: 360 } });
|
|
191
|
+
break;
|
|
192
|
+
default: // push
|
|
193
|
+
pos(a.layer.id, [t1, center, 'expoInOut'], [t2, [-W / 2, H / 2]]);
|
|
194
|
+
pos(b.layer.id, [t1, [W * 1.5, H / 2], 'expoInOut'], [t2, center]);
|
|
195
|
+
}
|
|
196
|
+
return { created: [], note: `${type} from ${a.layer.id} to ${b.layer.id} at ${t1}s–${t2}s` };
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
PRESETS['element.lowerThird'] = {
|
|
200
|
+
kind: 'element',
|
|
201
|
+
description: 'Lower third: an accent bar wipes in, then name and title slide out from behind it.',
|
|
202
|
+
params: '{name: string, title?: string, start?: s, duration?: s, color?, textColor?, y?: px, font?}',
|
|
203
|
+
apply: (p, compId, o) => {
|
|
204
|
+
const comp = getComp(p, compId);
|
|
205
|
+
const t0 = num(o.start, 0), dur = num(o.duration, 4), y = num(o.y, comp.height * 0.72);
|
|
206
|
+
const color = str(o.color, '#E8692A');
|
|
207
|
+
const x = comp.width * 0.08;
|
|
208
|
+
const created = [];
|
|
209
|
+
const bar = addLayer(p, comp.id, { type: 'solid', name: 'lt-bar', color, size: [12, 170], inPoint: t0, outPoint: t0 + dur,
|
|
210
|
+
transform: { anchor: [0, 0], position: [x, y], scale: kf([t0, [100, 0], 'expoOut'], [t0 + 0.5, [100, 100]], [t0 + dur - 0.5, [100, 100], 'expoIn'], [t0 + dur, [100, 0]]) } });
|
|
211
|
+
created.push(bar.id);
|
|
212
|
+
const mk = (text, size, dy, delay, c, name) => created.push(addLayer(p, comp.id, { type: 'text', name, text, size, weight: 800, align: 'left', color: c, font: o.font, inPoint: t0 + delay, outPoint: t0 + dur,
|
|
213
|
+
transform: { position: [x + 34, y + dy] }, masks: [{ shape: 'rect', rect: [0, -200, comp.width, 400] }],
|
|
214
|
+
animators: [{ unit: 'line', duration: 0.7, ease: 'expoOut', from: { x: -comp.width * 0.6 } }, { unit: 'line', mode: 'out', duration: 0.5, ease: 'expoIn', from: { x: -comp.width * 0.6 } }] }).id);
|
|
215
|
+
mk(str(o.name, 'Name'), Math.round(comp.width / 15), 55, 0.25, str(o.textColor, '#ffffff'), 'lt-name');
|
|
216
|
+
if (o.title)
|
|
217
|
+
mk(str(o.title, ''), Math.round(comp.width / 28), 125, 0.4, color, 'lt-title');
|
|
218
|
+
return { created };
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
PRESETS['element.highlightWord'] = {
|
|
222
|
+
kind: 'element',
|
|
223
|
+
description: 'Adds a background plate that wipes in behind an existing text layer (marker highlight).',
|
|
224
|
+
params: '{layer: textLayerId, color?, at?: s, duration?: s, padding?: [x,y], radius?}',
|
|
225
|
+
apply: (p, _c, o) => {
|
|
226
|
+
const { layer } = findLayer(p, str(o.layer, ''));
|
|
227
|
+
if (layer.type !== 'text')
|
|
228
|
+
throw new OpError(`${layer.id} is not a text layer`);
|
|
229
|
+
const at = num(o.at, layer.inPoint ?? 0), d = num(o.duration, 0.45);
|
|
230
|
+
layer.box = { color: str(o.color, '#E8692A'), padding: o.padding ?? [26, 10], radius: num(o.radius, 14), reveal: kf([at, 0, 'expoOut'], [at + d, 100]) };
|
|
231
|
+
return { created: [] };
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
export const listPresets = () => Object.entries(PRESETS).map(([name, p]) => `${name} [${p.kind}] — ${p.description}\n params: ${p.params}`).join('\n');
|
|
235
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Text animator presets — the "Animation Presets > Text" folder of DT.ly.
|
|
2
|
+
export const TEXT_ANIMATORS = {
|
|
3
|
+
typewriter: { description: 'Letters appear one by one with no motion.', animators: [{ unit: 'grapheme', stagger: 0.05, duration: 0.01, ease: 'hold', from: { opacity: 0 } }] },
|
|
4
|
+
fadeUp: { description: 'Words fade in while rising slightly. Calm, readable default.', animators: [{ unit: 'word', stagger: 0.08, duration: 0.6, ease: 'cubicOut', from: { opacity: 0, y: 40 } }] },
|
|
5
|
+
popIn: { description: 'Words scale up from zero with an overshoot. Playful, energetic.', animators: [{ unit: 'word', stagger: 0.1, duration: 0.55, ease: 'backOut', from: { opacity: 0, scale: 0 } }] },
|
|
6
|
+
slam: { description: 'Words crash in from huge and blurred. Punchy kinetic typography.', animators: [{ unit: 'word', stagger: 0.18, duration: 0.35, ease: 'expoOut', from: { opacity: 0, scale: 320, blur: 14 } }] },
|
|
7
|
+
blurIn: { description: 'Letters sharpen from a blur. Elegant, premium.', animators: [{ unit: 'grapheme', stagger: 0.03, duration: 0.7, ease: 'cubicOut', from: { opacity: 0, blur: 18, x: -20 } }] },
|
|
8
|
+
maskedLines: { description: 'Each line slides up from behind its own mask. The classic title reveal.', animators: [{ unit: 'line', stagger: 0.12, duration: 0.8, ease: 'expoOut', clip: true, from: { y: 120 } }] },
|
|
9
|
+
cascade: { description: 'Letters drop and rotate into place with an overshoot.', animators: [{ unit: 'grapheme', stagger: 0.035, duration: 0.7, ease: 'backOut', from: { opacity: 0, y: -70, rotation: -25 } }] },
|
|
10
|
+
trackingIn: { description: 'Letter spacing collapses from wide to normal while fading in. Cinematic openers.', animators: [{ unit: 'grapheme', stagger: 0, duration: 1.4, ease: 'expoOut', from: { opacity: 0, tracking: 60 } }] },
|
|
11
|
+
centerOut: { description: 'Letters grow outward from the middle of the word.', animators: [{ unit: 'grapheme', order: 'center', stagger: 0.04, duration: 0.5, ease: 'backOut', from: { opacity: 0, scale: 0 } }] },
|
|
12
|
+
randomFlicker: { description: 'Letters switch on in random order.', animators: [{ unit: 'grapheme', order: 'random', stagger: 0.03, duration: 0.08, ease: 'hold', from: { opacity: 0 } }] },
|
|
13
|
+
colorSweep: { description: 'A highlight colour sweeps through the letters, settling to the text colour.', animators: [{ unit: 'grapheme', stagger: 0.04, duration: 0.5, ease: 'easeOut', from: { color: '#FFC93C', scale: 115 } }] },
|
|
14
|
+
// Exits (mode: out) end at the layer's outPoint.
|
|
15
|
+
fadeOutDown: { description: 'Exit: words fade out while dropping.', animators: [{ unit: 'word', mode: 'out', stagger: 0.05, duration: 0.4, ease: 'easeIn', from: { opacity: 0, y: 40 } }] },
|
|
16
|
+
blurOut: { description: 'Exit: letters blur away.', animators: [{ unit: 'grapheme', mode: 'out', stagger: 0.02, duration: 0.45, ease: 'easeIn', from: { opacity: 0, blur: 16 } }] },
|
|
17
|
+
maskedLinesOut: { description: 'Exit: lines slide up out of their masks.', animators: [{ unit: 'line', mode: 'out', stagger: 0.08, duration: 0.5, ease: 'expoInOut', clip: true, from: { y: -120 } }] },
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/presets/text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type Project } from '../core/model.js';
|
|
2
|
+
export declare const loadProject: (file: string) => Project;
|
|
3
|
+
export declare const renderStill: (projectFile: string, time: number, out: string, opts?: {
|
|
4
|
+
comp?: string;
|
|
5
|
+
scale?: number;
|
|
6
|
+
}) => Promise<string>;
|
|
7
|
+
export declare const renderContactSheet: (projectFile: string, times: number[], out: string, opts?: {
|
|
8
|
+
comp?: string;
|
|
9
|
+
columns?: number;
|
|
10
|
+
thumbWidth?: number;
|
|
11
|
+
}) => Promise<string>;
|
|
12
|
+
export declare const renderVideo: (projectFile: string, out: string, opts?: {
|
|
13
|
+
comp?: string;
|
|
14
|
+
from?: number;
|
|
15
|
+
to?: number;
|
|
16
|
+
crf?: number;
|
|
17
|
+
audio?: boolean;
|
|
18
|
+
onProgress?: (done: number, total: number) => void;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
out: string;
|
|
21
|
+
frames: number;
|
|
22
|
+
seconds: number;
|
|
23
|
+
audioTracks: number;
|
|
24
|
+
}>;
|
|
25
|
+
export declare const renderVideoParallel: (projectFile: string, out: string, opts?: {
|
|
26
|
+
comp?: string;
|
|
27
|
+
from?: number;
|
|
28
|
+
to?: number;
|
|
29
|
+
crf?: number;
|
|
30
|
+
workers?: number;
|
|
31
|
+
onProgress?: (done: number, total: number) => void;
|
|
32
|
+
}) => Promise<{
|
|
33
|
+
out: string;
|
|
34
|
+
frames: number;
|
|
35
|
+
seconds: number;
|
|
36
|
+
audioTracks: number;
|
|
37
|
+
} | {
|
|
38
|
+
out: string;
|
|
39
|
+
frames: number;
|
|
40
|
+
seconds: number;
|
|
41
|
+
audioTracks: number;
|
|
42
|
+
workers: number;
|
|
43
|
+
}>;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { fork, spawn } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { isAnimated } from '../core/model.js';
|
|
7
|
+
import { checkFfmpeg } from './ffmpeg.js';
|
|
8
|
+
import { newCanvas, NodeHost, registerFonts } from './node-host.js';
|
|
9
|
+
import { Renderer } from './renderer.js';
|
|
10
|
+
export const loadProject = (file) => JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
11
|
+
const setup = (projectFile, project) => {
|
|
12
|
+
const p = project ?? loadProject(projectFile);
|
|
13
|
+
if (p.comps.some((c) => c.layers.some((l) => l.type === 'video' || l.type === 'audio')))
|
|
14
|
+
checkFfmpeg();
|
|
15
|
+
const baseDir = path.dirname(path.resolve(projectFile));
|
|
16
|
+
registerFonts(p, baseDir);
|
|
17
|
+
const host = new NodeHost(baseDir);
|
|
18
|
+
return { project: p, baseDir, host, renderer: new Renderer(p, host) };
|
|
19
|
+
};
|
|
20
|
+
// Renders one frame (or a scaled-down still) to PNG/JPG.
|
|
21
|
+
export const renderStill = async (projectFile, time, out, opts = {}) => {
|
|
22
|
+
const { project, host, renderer } = setup(projectFile);
|
|
23
|
+
const comp = renderer.comp(opts.comp ?? project.root);
|
|
24
|
+
const scale = opts.scale ?? 1;
|
|
25
|
+
const canvas = newCanvas(Math.round(comp.width * scale), Math.round(comp.height * scale));
|
|
26
|
+
const full = newCanvas(comp.width, comp.height);
|
|
27
|
+
await renderer.renderComp(full.getContext('2d'), comp, time);
|
|
28
|
+
canvas.getContext('2d').drawImage(full, 0, 0, canvas.width, canvas.height);
|
|
29
|
+
await canvas.toFile(out);
|
|
30
|
+
host.close();
|
|
31
|
+
return out;
|
|
32
|
+
};
|
|
33
|
+
// A grid of frames for quick review (what an agent "looks at" instead of scrubbing).
|
|
34
|
+
export const renderContactSheet = async (projectFile, times, out, opts = {}) => {
|
|
35
|
+
const { project, host, renderer } = setup(projectFile);
|
|
36
|
+
const comp = renderer.comp(opts.comp ?? project.root);
|
|
37
|
+
const cols = opts.columns ?? Math.min(times.length, 6);
|
|
38
|
+
const tw = opts.thumbWidth ?? 240, th = Math.round((tw * comp.height) / comp.width);
|
|
39
|
+
const rows = Math.ceil(times.length / cols);
|
|
40
|
+
const sheet = newCanvas(cols * tw, rows * (th + 28));
|
|
41
|
+
const sc = sheet.getContext('2d');
|
|
42
|
+
sc.fillStyle = '#111';
|
|
43
|
+
sc.fillRect(0, 0, sheet.width, sheet.height);
|
|
44
|
+
const full = newCanvas(comp.width, comp.height);
|
|
45
|
+
for (const [i, t] of times.entries()) {
|
|
46
|
+
const fc = full.getContext('2d');
|
|
47
|
+
fc.setTransform(1, 0, 0, 1, 0, 0);
|
|
48
|
+
fc.clearRect(0, 0, comp.width, comp.height);
|
|
49
|
+
await renderer.renderComp(fc, comp, t);
|
|
50
|
+
const x = (i % cols) * tw, y = Math.floor(i / cols) * (th + 28);
|
|
51
|
+
sc.drawImage(full, x, y, tw, th);
|
|
52
|
+
sc.fillStyle = '#ddd';
|
|
53
|
+
sc.font = '16px sans-serif';
|
|
54
|
+
sc.fillText(`${t.toFixed(2)}s`, x + 8, y + th + 20);
|
|
55
|
+
}
|
|
56
|
+
await sheet.toFile(out);
|
|
57
|
+
host.close();
|
|
58
|
+
return out;
|
|
59
|
+
};
|
|
60
|
+
// Collects audio from audio layers and un-muted video layers, through nested comps.
|
|
61
|
+
const collectAudio = (project, comp, offset, srcShift, windowEnd, baseDir, out) => {
|
|
62
|
+
for (const l of comp.layers) {
|
|
63
|
+
const inP = l.inPoint ?? 0, outP = Math.min(l.outPoint ?? comp.duration, comp.duration);
|
|
64
|
+
if (l.type === 'audio' || (l.type === 'video' && l.volume !== undefined && l.volume !== 0)) {
|
|
65
|
+
const speed = l.type === 'video' ? l.speed ?? 1 : 1;
|
|
66
|
+
const start = offset + inP - srcShift;
|
|
67
|
+
const visibleFrom = Math.max(start, offset);
|
|
68
|
+
const end = Math.min(offset + outP - srcShift, windowEnd);
|
|
69
|
+
if (end <= visibleFrom)
|
|
70
|
+
continue;
|
|
71
|
+
out.push({
|
|
72
|
+
file: path.resolve(baseDir, l.src),
|
|
73
|
+
start: visibleFrom,
|
|
74
|
+
trimIn: (l.trimIn ?? 0) + (visibleFrom - start) * speed,
|
|
75
|
+
duration: end - visibleFrom,
|
|
76
|
+
speed,
|
|
77
|
+
volume: l.volume ?? 1,
|
|
78
|
+
fadeIn: l.type === 'audio' ? l.fadeIn : undefined,
|
|
79
|
+
fadeOut: l.type === 'audio' ? l.fadeOut : undefined,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (l.type === 'precomp') {
|
|
83
|
+
const child = project.comps.find((c) => c.id === l.comp);
|
|
84
|
+
if (child)
|
|
85
|
+
collectAudio(project, child, offset + inP, l.timeOffset ?? 0, Math.min(windowEnd, offset + outP), baseDir, out);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
// Piecewise-linear FFmpeg volume expression from keyframes (local time t from 0).
|
|
90
|
+
const volumeExpr = (v, layerStart) => {
|
|
91
|
+
if (typeof v === 'number')
|
|
92
|
+
return String(v);
|
|
93
|
+
if (!isAnimated(v))
|
|
94
|
+
return '1';
|
|
95
|
+
const kfs = [...v.keyframes].sort((a, b) => a.t - b.t).map((k) => ({ t: k.t - layerStart, v: k.v }));
|
|
96
|
+
let expr = String(kfs[kfs.length - 1].v);
|
|
97
|
+
for (let i = kfs.length - 2; i >= 0; i--) {
|
|
98
|
+
const a = kfs[i], b = kfs[i + 1];
|
|
99
|
+
const seg = `${a.v}+(${b.v - a.v})*(t-${a.t})/${Math.max(1e-6, b.t - a.t)}`;
|
|
100
|
+
expr = `if(lt(t,${b.t}),${seg},${expr})`;
|
|
101
|
+
}
|
|
102
|
+
return `if(lt(t,${kfs[0].t}),${kfs[0].v},${expr})`;
|
|
103
|
+
};
|
|
104
|
+
// Audio inputs + filter graph for the window [from, to), with FFmpeg input indices starting at `firstInput`.
|
|
105
|
+
const audioGraph = (project, comp, baseDir, from, to, firstInput) => {
|
|
106
|
+
const clips = [];
|
|
107
|
+
collectAudio(project, comp, 0, 0, comp.duration, baseDir, clips);
|
|
108
|
+
const audible = clips
|
|
109
|
+
.map((c) => ({ ...c, start: c.start - from }))
|
|
110
|
+
.filter((c) => c.start + c.duration > 0 && c.start < to - from)
|
|
111
|
+
.map((c) => (c.start < 0 ? { ...c, trimIn: c.trimIn - c.start * c.speed, duration: c.duration + c.start, start: 0 } : c));
|
|
112
|
+
if (!audible.length)
|
|
113
|
+
return { inputs: [], filter: null, count: 0 };
|
|
114
|
+
const chains = audible.map((c, i) => {
|
|
115
|
+
const f = [`atrim=start=${c.trimIn.toFixed(4)}:duration=${(c.duration * c.speed).toFixed(4)}`, 'asetpts=PTS-STARTPTS'];
|
|
116
|
+
if (c.speed !== 1)
|
|
117
|
+
f.push(`atempo=${Math.min(2, Math.max(0.5, c.speed))}`);
|
|
118
|
+
f.push(`volume='${volumeExpr(c.volume, c.start + from)}':eval=frame`);
|
|
119
|
+
if (c.fadeIn)
|
|
120
|
+
f.push(`afade=t=in:st=0:d=${c.fadeIn}`);
|
|
121
|
+
if (c.fadeOut)
|
|
122
|
+
f.push(`afade=t=out:st=${Math.max(0, c.duration - c.fadeOut)}:d=${c.fadeOut}`);
|
|
123
|
+
const ms = Math.round(c.start * 1000);
|
|
124
|
+
f.push(`adelay=${ms}|${ms}`, 'aformat=sample_rates=48000:channel_layouts=stereo');
|
|
125
|
+
return `[${firstInput + i}:a]${f.join(',')}[a${i}]`;
|
|
126
|
+
});
|
|
127
|
+
const mix = `${audible.map((_, i) => `[a${i}]`).join('')}amix=inputs=${audible.length}:normalize=0:dropout_transition=0,alimiter=limit=0.95,apad,atrim=duration=${(to - from).toFixed(3)}[aout]`;
|
|
128
|
+
return { inputs: audible.flatMap((c) => ['-i', c.file]), filter: [...chains, mix].join(';'), count: audible.length };
|
|
129
|
+
};
|
|
130
|
+
const runFfmpeg = (args, stdin = false) => {
|
|
131
|
+
const ff = spawn('ffmpeg', args, { stdio: [stdin ? 'pipe' : 'ignore', 'inherit', 'pipe'] });
|
|
132
|
+
let err = '';
|
|
133
|
+
ff.stderr.on('data', (d) => (err += d));
|
|
134
|
+
const done = new Promise((res, rej) => ff.on('close', (code) => (code === 0 ? res() : rej(new Error(`ffmpeg failed (${code}): ${err.slice(-2000)}`)))));
|
|
135
|
+
return { ff, done };
|
|
136
|
+
};
|
|
137
|
+
const X264 = (crf = 18) => ['-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-crf', String(crf), '-preset', 'medium'];
|
|
138
|
+
export const renderVideo = async (projectFile, out, opts = {}) => {
|
|
139
|
+
checkFfmpeg();
|
|
140
|
+
const { project, baseDir, host, renderer } = setup(projectFile);
|
|
141
|
+
const comp = renderer.comp(opts.comp ?? project.root);
|
|
142
|
+
const from = opts.from ?? 0, to = Math.min(opts.to ?? comp.duration, comp.duration);
|
|
143
|
+
const total = Math.round((to - from) * comp.fps);
|
|
144
|
+
const audio = opts.audio === false ? { inputs: [], filter: null, count: 0 } : audioGraph(project, comp, baseDir, from, to, 1);
|
|
145
|
+
const args = ['-y', '-v', 'error', '-f', 'rawvideo', '-pix_fmt', 'rgba', '-s', `${comp.width}x${comp.height}`, '-r', String(comp.fps), '-i', '-', ...audio.inputs];
|
|
146
|
+
if (audio.filter)
|
|
147
|
+
args.push('-filter_complex', audio.filter, '-map', '0:v', '-map', '[aout]', '-c:a', 'aac', '-b:a', '192k');
|
|
148
|
+
args.push(...X264(opts.crf), '-movflags', '+faststart', '-frames:v', String(total), out);
|
|
149
|
+
const { ff, done } = runFfmpeg(args, true);
|
|
150
|
+
const canvas = newCanvas(comp.width, comp.height);
|
|
151
|
+
const ctx = canvas.getContext('2d');
|
|
152
|
+
for (let f = 0; f < total; f++) {
|
|
153
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
154
|
+
ctx.clearRect(0, 0, comp.width, comp.height);
|
|
155
|
+
if (!comp.background) {
|
|
156
|
+
ctx.fillStyle = '#000';
|
|
157
|
+
ctx.fillRect(0, 0, comp.width, comp.height);
|
|
158
|
+
}
|
|
159
|
+
await renderer.renderComp(ctx, comp, from + f / comp.fps);
|
|
160
|
+
const raw = canvas.toBufferSync('raw');
|
|
161
|
+
if (!ff.stdin.write(raw))
|
|
162
|
+
await new Promise((r) => ff.stdin.once('drain', r));
|
|
163
|
+
opts.onProgress?.(f + 1, total);
|
|
164
|
+
}
|
|
165
|
+
ff.stdin.end();
|
|
166
|
+
await done;
|
|
167
|
+
host.close();
|
|
168
|
+
return { out, frames: total, seconds: to - from, audioTracks: audio.count };
|
|
169
|
+
};
|
|
170
|
+
// Splits the timeline across worker processes (one per core), then joins the chunks
|
|
171
|
+
// losslessly and mixes the audio once over the whole range.
|
|
172
|
+
export const renderVideoParallel = async (projectFile, out, opts = {}) => {
|
|
173
|
+
checkFfmpeg();
|
|
174
|
+
const project = loadProject(projectFile);
|
|
175
|
+
const comp = project.comps.find((c) => c.id === (opts.comp ?? project.root));
|
|
176
|
+
if (!comp)
|
|
177
|
+
throw new Error(`Unknown comp ${opts.comp}`);
|
|
178
|
+
const from = opts.from ?? 0, to = Math.min(opts.to ?? comp.duration, comp.duration);
|
|
179
|
+
const f0 = Math.round(from * comp.fps), total = Math.round((to - from) * comp.fps);
|
|
180
|
+
// One process is fastest for short videos (worker start-up dominates); opt in for long renders.
|
|
181
|
+
const workers = Math.max(1, Math.min(opts.workers ?? 1, os.cpus().length, Math.ceil(total / 15)));
|
|
182
|
+
if (workers === 1)
|
|
183
|
+
return renderVideo(projectFile, out, opts);
|
|
184
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'dtly-'));
|
|
185
|
+
const here = fileURLToPath(import.meta.url);
|
|
186
|
+
const cli = path.resolve(path.dirname(here), here.endsWith('.ts') ? '../cli.ts' : '../cli.js');
|
|
187
|
+
const progress = new Array(workers).fill(0);
|
|
188
|
+
const chunks = [...Array(workers).keys()].map((i) => {
|
|
189
|
+
const a = f0 + Math.floor((total * i) / workers), b = f0 + Math.floor((total * (i + 1)) / workers);
|
|
190
|
+
return { file: path.join(tmp, `chunk-${i}.mp4`), from: a / comp.fps, to: b / comp.fps, frames: b - a };
|
|
191
|
+
});
|
|
192
|
+
await Promise.all(chunks.map((c, i) => new Promise((res, rej) => {
|
|
193
|
+
const child = fork(cli, ['chunk', projectFile, c.file, String(c.from), String(c.to), opts.comp ?? '', String(opts.crf ?? 18)], { execArgv: process.execArgv, stdio: ['ignore', 'ignore', 'pipe', 'ipc'] });
|
|
194
|
+
let err = '';
|
|
195
|
+
child.stderr.on('data', (d) => (err += d));
|
|
196
|
+
child.on('message', (m) => {
|
|
197
|
+
if (m.done !== undefined) {
|
|
198
|
+
progress[i] = m.done;
|
|
199
|
+
opts.onProgress?.(progress.reduce((x, y) => x + y, 0), total);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
child.on('exit', (code) => (code === 0 ? res() : rej(new Error(`chunk ${i} failed: ${err.slice(-1500)}`))));
|
|
203
|
+
})));
|
|
204
|
+
const list = path.join(tmp, 'list.txt');
|
|
205
|
+
fs.writeFileSync(list, chunks.map((c) => `file '${c.file}'`).join('\n'));
|
|
206
|
+
const audio = audioGraph(project, comp, path.dirname(path.resolve(projectFile)), from, to, 1);
|
|
207
|
+
const args = ['-y', '-v', 'error', '-f', 'concat', '-safe', '0', '-i', list, ...audio.inputs];
|
|
208
|
+
if (audio.filter)
|
|
209
|
+
args.push('-filter_complex', audio.filter, '-map', '0:v', '-map', '[aout]', '-c:a', 'aac', '-b:a', '192k');
|
|
210
|
+
args.push('-c:v', 'copy', '-movflags', '+faststart', out);
|
|
211
|
+
await runFfmpeg(args).done;
|
|
212
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
213
|
+
return { out, frames: total, seconds: to - from, audioTracks: audio.count, workers };
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/render/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const checkFfmpeg: () => void;
|