@revideo/ffmpeg 0.2.2 → 0.2.4-alpha.894
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/lib/client/FFmpegExporterClient.d.ts +33 -24
- package/lib/client/FFmpegExporterClient.js +76 -73
- package/lib/client/index.d.ts +2 -2
- package/lib/client/index.js +7 -7
- package/lib/server/FFmpegBridge.d.ts +10 -10
- package/lib/server/FFmpegBridge.js +57 -53
- package/lib/server/FFmpegExporterServer.d.ts +44 -39
- package/lib/server/FFmpegExporterServer.d.ts.map +1 -1
- package/lib/server/FFmpegExporterServer.js +287 -265
- package/lib/server/ImageStream.d.ts +6 -6
- package/lib/server/ImageStream.js +20 -20
- package/lib/server/index.d.ts +2 -2
- package/lib/server/index.js +18 -18
- package/lib/server/telemetry/posthog.d.ts +6 -3
- package/lib/server/telemetry/posthog.js +22 -20
- package/package.json +4 -4
- package/lib/server/package.json +0 -37
- package/lib/server/server/FFmpegBridge.d.ts +0 -19
- package/lib/server/server/FFmpegBridge.d.ts.map +0 -1
- package/lib/server/server/FFmpegBridge.js +0 -65
- package/lib/server/server/FFmpegExporterServer.d.ts +0 -48
- package/lib/server/server/FFmpegExporterServer.d.ts.map +0 -1
- package/lib/server/server/FFmpegExporterServer.js +0 -283
- package/lib/server/server/ImageStream.d.ts +0 -10
- package/lib/server/server/ImageStream.d.ts.map +0 -1
- package/lib/server/server/ImageStream.js +0 -25
- package/lib/server/server/index.d.ts +0 -4
- package/lib/server/server/index.d.ts.map +0 -1
- package/lib/server/server/index.js +0 -20
- package/lib/server/server/telemetry/posthog.d.ts +0 -5
- package/lib/server/server/telemetry/posthog.d.ts.map +0 -1
- package/lib/server/server/telemetry/posthog.js +0 -28
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FFmpegExporterServer = void 0;
|
|
4
|
-
const ffmpeg_1 = require("@ffmpeg-installer/ffmpeg");
|
|
5
|
-
const ffprobe_1 = require("@ffprobe-installer/ffprobe");
|
|
6
|
-
const ffmpeg = require("fluent-ffmpeg");
|
|
7
|
-
const fs = require("fs");
|
|
8
|
-
const os = require("os");
|
|
9
|
-
const path = require("path");
|
|
10
|
-
const uuid_1 = require("uuid");
|
|
11
|
-
const ImageStream_1 = require("./ImageStream");
|
|
12
|
-
const posthog_1 = require("./telemetry/posthog");
|
|
13
|
-
const package_json_1 = require("../package.json");
|
|
14
|
-
const SAMPLE_RATE = 48000;
|
|
15
|
-
ffmpeg.setFfmpegPath(ffmpeg_1.path);
|
|
16
|
-
ffmpeg.setFfprobePath(ffprobe_1.path);
|
|
17
|
-
/**
|
|
18
|
-
* The server-side implementation of the FFmpeg video exporter.
|
|
19
|
-
*/
|
|
20
|
-
class FFmpegExporterServer {
|
|
21
|
-
constructor(settings, config) {
|
|
22
|
-
this.config = config;
|
|
23
|
-
this.settings = settings;
|
|
24
|
-
this.jobFolder = path.join(os.tmpdir(), `revideo-${(0, uuid_1.v4)()}`);
|
|
25
|
-
this.stream = new ImageStream_1.ImageStream();
|
|
26
|
-
this.command = ffmpeg();
|
|
27
|
-
// Input image sequence
|
|
28
|
-
this.command
|
|
29
|
-
.input(this.stream)
|
|
30
|
-
.inputFormat('image2pipe')
|
|
31
|
-
.inputFps(settings.fps);
|
|
32
|
-
// Input audio file
|
|
33
|
-
if (settings.includeAudio && settings.audio) {
|
|
34
|
-
this.command
|
|
35
|
-
.input(settings.audio.slice(1))
|
|
36
|
-
// FIXME Offset only works for negative values.
|
|
37
|
-
.inputOptions([`-itsoffset ${settings.audioOffset ?? 0}`]);
|
|
38
|
-
}
|
|
39
|
-
// Output settings
|
|
40
|
-
const size = {
|
|
41
|
-
x: Math.round(settings.size.x * settings.resolutionScale),
|
|
42
|
-
y: Math.round(settings.size.y * settings.resolutionScale),
|
|
43
|
-
};
|
|
44
|
-
this.command
|
|
45
|
-
.output(path.join(this.jobFolder, `visuals.mp4`))
|
|
46
|
-
.outputOptions(['-pix_fmt yuv420p', '-shortest'])
|
|
47
|
-
.outputFps(settings.fps)
|
|
48
|
-
.size(`${size.x}x${size.y}`);
|
|
49
|
-
if (settings.fastStart) {
|
|
50
|
-
this.command.outputOptions(['-movflags +faststart']);
|
|
51
|
-
}
|
|
52
|
-
this.promise = new Promise((resolve, reject) => {
|
|
53
|
-
this.command.on('end', resolve).on('error', reject);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
async start() {
|
|
57
|
-
(0, posthog_1.sendEvent)(posthog_1.EventName.RenderStarted, { version: package_json_1.default.version });
|
|
58
|
-
if (!fs.existsSync(this.config.output)) {
|
|
59
|
-
await fs.promises.mkdir(this.config.output, { recursive: true });
|
|
60
|
-
}
|
|
61
|
-
if (!fs.existsSync(this.jobFolder)) {
|
|
62
|
-
await fs.promises.mkdir(this.jobFolder, { recursive: true });
|
|
63
|
-
}
|
|
64
|
-
this.command.run();
|
|
65
|
-
}
|
|
66
|
-
async handleFrame({ data }) {
|
|
67
|
-
const base64Data = data.slice(data.indexOf(',') + 1);
|
|
68
|
-
this.stream.pushImage(Buffer.from(base64Data, 'base64'));
|
|
69
|
-
}
|
|
70
|
-
async generateAudio({ assets, endFrame, }) {
|
|
71
|
-
const assetPositions = getAssetPlacement(assets);
|
|
72
|
-
const audioFilenames = [];
|
|
73
|
-
for (const asset of assetPositions) {
|
|
74
|
-
let hasAudioStream = true;
|
|
75
|
-
if (asset.type !== 'audio') {
|
|
76
|
-
hasAudioStream = await this.checkForAudioStream(asset);
|
|
77
|
-
}
|
|
78
|
-
if (asset.playbackRate !== 0 && asset.volume !== 0 && hasAudioStream) {
|
|
79
|
-
const filename = await this.prepareAudio(asset, endFrame);
|
|
80
|
-
audioFilenames.push(filename);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
if (audioFilenames.length > 0) {
|
|
84
|
-
await this.mergeAudioTracks(audioFilenames);
|
|
85
|
-
await this.mergeAudioWithVideo(path.join(this.jobFolder, `audio.wav`), path.join(this.jobFolder, `visuals.mp4`));
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
const destination = path.join(this.config.output, `${this.settings.name}.mp4`);
|
|
89
|
-
await fs.promises.copyFile(path.join(this.jobFolder, `visuals.mp4`), destination);
|
|
90
|
-
console.log(`Rendered successfully! Video saved to: ${destination}`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
async checkForAudioStream(asset) {
|
|
94
|
-
return new Promise((resolve, reject) => {
|
|
95
|
-
ffmpeg.ffprobe(asset.src, (err, metadata) => {
|
|
96
|
-
if (err) {
|
|
97
|
-
console.error('error checking for audioStream for asset', asset.key, err);
|
|
98
|
-
reject(err);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
const audioStreams = metadata.streams.filter(s => s.codec_type === 'audio');
|
|
102
|
-
resolve(audioStreams.length > 0);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
async end(result) {
|
|
107
|
-
this.stream.pushImage(null);
|
|
108
|
-
if (result === 1) {
|
|
109
|
-
try {
|
|
110
|
-
this.command.kill('SIGKILL');
|
|
111
|
-
await this.promise;
|
|
112
|
-
}
|
|
113
|
-
catch (_) {
|
|
114
|
-
// do nothing
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
await this.promise;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
async kill() {
|
|
122
|
-
try {
|
|
123
|
-
await fs.promises.rm(this.jobFolder, { recursive: true, force: true }); // cleanup
|
|
124
|
-
this.command.kill('SIGKILL');
|
|
125
|
-
await this.promise;
|
|
126
|
-
}
|
|
127
|
-
catch (_) {
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
async prepareAudio(asset, endFrame) {
|
|
132
|
-
// Construct the output path
|
|
133
|
-
const sanitizedKey = asset.key.replace(/[/[\]]/g, '-');
|
|
134
|
-
const outputPath = path.join(this.jobFolder, `${sanitizedKey}.wav`);
|
|
135
|
-
const trimLeft = asset.trimLeftInSeconds / asset.playbackRate;
|
|
136
|
-
const trimRight = Math.min(trimLeft + asset.duration / this.settings.fps, trimLeft + endFrame / this.settings.fps);
|
|
137
|
-
const padStart = (asset.startInVideo / this.settings.fps) * 1000;
|
|
138
|
-
const padEnd = Math.max(0, (SAMPLE_RATE * endFrame) / this.settings.fps -
|
|
139
|
-
(SAMPLE_RATE * asset.duration) / this.settings.fps -
|
|
140
|
-
(SAMPLE_RATE * padStart) / 1000);
|
|
141
|
-
const atempoFilters = await this.calculateAtempoFilters(asset.playbackRate); // atempo filter value must be >=0.5 and <=100. If the value is higher or lower, this function sets multiple atempo filters
|
|
142
|
-
let resolvedPath;
|
|
143
|
-
if (asset.src.startsWith('/@fs')) {
|
|
144
|
-
resolvedPath = asset.src.replace('/@fs', '');
|
|
145
|
-
}
|
|
146
|
-
else if (asset.src.startsWith('http')) {
|
|
147
|
-
resolvedPath = asset.src;
|
|
148
|
-
}
|
|
149
|
-
else if (asset.src.startsWith('/')) {
|
|
150
|
-
resolvedPath = path.join(this.config.output, '../public', asset.src);
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
resolvedPath = path.join(this.config.output, '..', asset.src);
|
|
154
|
-
}
|
|
155
|
-
await new Promise((resolve, reject) => {
|
|
156
|
-
const audioFilters = [
|
|
157
|
-
...atempoFilters,
|
|
158
|
-
`atrim=start=${trimLeft}:end=${trimRight}`,
|
|
159
|
-
`apad=pad_len=${padEnd}`,
|
|
160
|
-
`adelay=${padStart}|${padStart}|${padStart}`,
|
|
161
|
-
`volume=${asset.volume}`,
|
|
162
|
-
].join(',');
|
|
163
|
-
ffmpeg(resolvedPath)
|
|
164
|
-
.audioChannels(2)
|
|
165
|
-
.audioCodec('pcm_s16le')
|
|
166
|
-
.audioFrequency(SAMPLE_RATE)
|
|
167
|
-
.outputOptions([`-af`, audioFilters])
|
|
168
|
-
.on('end', () => {
|
|
169
|
-
resolve();
|
|
170
|
-
})
|
|
171
|
-
.on('error', err => {
|
|
172
|
-
console.error(`Error processing audio for asset key: ${asset.key}`, err);
|
|
173
|
-
reject(err);
|
|
174
|
-
})
|
|
175
|
-
.save(outputPath);
|
|
176
|
-
});
|
|
177
|
-
return outputPath;
|
|
178
|
-
}
|
|
179
|
-
async mergeAudioTracks(audioFilenames) {
|
|
180
|
-
return new Promise((resolve, reject) => {
|
|
181
|
-
const command = ffmpeg();
|
|
182
|
-
audioFilenames.forEach(filename => {
|
|
183
|
-
command.input(filename);
|
|
184
|
-
});
|
|
185
|
-
command
|
|
186
|
-
.complexFilter([
|
|
187
|
-
`amix=inputs=${audioFilenames.length}:duration=longest`,
|
|
188
|
-
])
|
|
189
|
-
.outputOptions(['-c:a', 'pcm_s16le'])
|
|
190
|
-
.on('end', () => {
|
|
191
|
-
resolve();
|
|
192
|
-
})
|
|
193
|
-
.on('error', err => {
|
|
194
|
-
console.error(`Error merging audio tracks: ${err.message}`);
|
|
195
|
-
reject(err);
|
|
196
|
-
})
|
|
197
|
-
.save(path.join(this.jobFolder, `audio.wav`));
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
async calculateAtempoFilters(playbackRate) {
|
|
201
|
-
const atempoFilters = [];
|
|
202
|
-
// Calculate how many times we need to 100x the speed
|
|
203
|
-
let rate = playbackRate;
|
|
204
|
-
while (rate > 100.0) {
|
|
205
|
-
atempoFilters.push('atempo=100.0');
|
|
206
|
-
rate /= 100.0;
|
|
207
|
-
}
|
|
208
|
-
// Add the last atempo filter with the remaining rate
|
|
209
|
-
if (rate > 1.0) {
|
|
210
|
-
atempoFilters.push(`atempo=${rate}`);
|
|
211
|
-
}
|
|
212
|
-
// Calculate how many times we need to halve the speed
|
|
213
|
-
rate = playbackRate;
|
|
214
|
-
while (rate < 0.5) {
|
|
215
|
-
atempoFilters.push('atempo=0.5');
|
|
216
|
-
rate *= 2.0;
|
|
217
|
-
}
|
|
218
|
-
// Add the last atempo filter with the remaining rate
|
|
219
|
-
if (rate < 1.0) {
|
|
220
|
-
atempoFilters.push(`atempo=${rate}`);
|
|
221
|
-
}
|
|
222
|
-
return atempoFilters;
|
|
223
|
-
}
|
|
224
|
-
async mergeAudioWithVideo(audioPath, videoPath) {
|
|
225
|
-
return new Promise((resolve, reject) => {
|
|
226
|
-
ffmpeg()
|
|
227
|
-
.input(videoPath)
|
|
228
|
-
.input(audioPath)
|
|
229
|
-
.outputOptions([
|
|
230
|
-
'-c:v',
|
|
231
|
-
'copy',
|
|
232
|
-
'-c:a',
|
|
233
|
-
'aac',
|
|
234
|
-
'-strict',
|
|
235
|
-
'experimental',
|
|
236
|
-
])
|
|
237
|
-
.on('end', () => {
|
|
238
|
-
resolve();
|
|
239
|
-
console.log(`Rendered successfully! Video saved to: ${path.join(this.config.output, `${this.settings.name}.mp4`)}`);
|
|
240
|
-
})
|
|
241
|
-
.on('error', err => {
|
|
242
|
-
console.error(`Error merging video and audio: ${err.message}`);
|
|
243
|
-
reject(err);
|
|
244
|
-
})
|
|
245
|
-
.save(path.join(this.config.output, `${this.settings.name}.mp4`));
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
exports.FFmpegExporterServer = FFmpegExporterServer;
|
|
250
|
-
function getAssetPlacement(frames) {
|
|
251
|
-
const assets = [];
|
|
252
|
-
// A map to keep track of when each asset starts.
|
|
253
|
-
const assetStartMap = new Map();
|
|
254
|
-
for (let frame = 0; frame < frames.length; frame++) {
|
|
255
|
-
for (const asset of frames[frame]) {
|
|
256
|
-
if (!assetStartMap.has(asset.key)) {
|
|
257
|
-
assetStartMap.set(asset.key, frame);
|
|
258
|
-
assets.push({
|
|
259
|
-
key: asset.key,
|
|
260
|
-
src: asset.src,
|
|
261
|
-
type: asset.type,
|
|
262
|
-
startInVideo: frame,
|
|
263
|
-
endInVideo: frame,
|
|
264
|
-
duration: asset.duration,
|
|
265
|
-
playbackRate: asset.playbackRate,
|
|
266
|
-
volume: asset.volume,
|
|
267
|
-
trimLeftInSeconds: asset.currentTime,
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
const existingAsset = assets.find(a => a.key === asset.key);
|
|
272
|
-
if (existingAsset) {
|
|
273
|
-
existingAsset.endInVideo = frame;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
assets.forEach(asset => {
|
|
279
|
-
asset.duration = asset.endInVideo - asset.startInVideo + 1;
|
|
280
|
-
});
|
|
281
|
-
return assets;
|
|
282
|
-
}
|
|
283
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZtcGVnRXhwb3J0ZXJTZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zZXJ2ZXIvRkZtcGVnRXhwb3J0ZXJTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQTREO0FBQzVELHdEQUErRDtBQVEvRCx3Q0FBd0M7QUFDeEMseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IsK0JBQWtDO0FBQ2xDLCtDQUEwQztBQUMxQyxpREFBeUQ7QUFFekQsa0RBQTBDO0FBQzFDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLENBQUMsYUFBYSxDQUFDLGFBQVUsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsY0FBVyxDQUFDLENBQUM7QUFxQm5DOztHQUVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFPL0IsWUFDRSxRQUFnQyxFQUNmLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFFckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxXQUFXLElBQUEsU0FBTSxHQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUV4Qix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLE9BQU87YUFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNsQixXQUFXLENBQUMsWUFBWSxDQUFDO2FBQ3pCLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUIsbUJBQW1CO1FBQ25CLElBQUksUUFBUSxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENB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
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import { Readable } from 'stream';
|
|
4
|
-
export declare class ImageStream extends Readable {
|
|
5
|
-
private image;
|
|
6
|
-
private hasData;
|
|
7
|
-
pushImage(image: Buffer | null): void;
|
|
8
|
-
_read(): void;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=ImageStream.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ImageStream.d.ts","sourceRoot":"","sources":["../../../server/ImageStream.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAC;AAEhC,qBAAa,WAAY,SAAQ,QAAQ;IACvC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAS;IAEjB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOrB,KAAK;CAMtB"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ImageStream = void 0;
|
|
4
|
-
const stream_1 = require("stream");
|
|
5
|
-
class ImageStream extends stream_1.Readable {
|
|
6
|
-
constructor() {
|
|
7
|
-
super(...arguments);
|
|
8
|
-
this.image = null;
|
|
9
|
-
this.hasData = false;
|
|
10
|
-
}
|
|
11
|
-
pushImage(image) {
|
|
12
|
-
this.image = image;
|
|
13
|
-
this.hasData = true;
|
|
14
|
-
this._read();
|
|
15
|
-
}
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
17
|
-
_read() {
|
|
18
|
-
if (this.hasData) {
|
|
19
|
-
this.hasData = false;
|
|
20
|
-
this.push(this.image);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
exports.ImageStream = ImageStream;
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZ2VTdHJlYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zZXJ2ZXIvSW1hZ2VTdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWdDO0FBRWhDLE1BQWEsV0FBWSxTQUFRLGlCQUFRO0lBQXpDOztRQUNVLFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxLQUFLLENBQUM7SUFlMUIsQ0FBQztJQWJRLFNBQVMsQ0FBQyxLQUFvQjtRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hELEtBQUs7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpCRCxrQ0FpQkMifQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAGP,MAAM,kCAAkC,CAAC;8BAGvB,MAAM;AAAzB,wBAcE"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const plugins_1 = require("@revideo/vite-plugin/lib/plugins");
|
|
4
|
-
const FFmpegBridge_1 = require("./FFmpegBridge");
|
|
5
|
-
exports.default = () => {
|
|
6
|
-
let config;
|
|
7
|
-
return {
|
|
8
|
-
name: 'revideo/ffmpeg',
|
|
9
|
-
[plugins_1.PLUGIN_OPTIONS]: {
|
|
10
|
-
entryPoint: '@revideo/ffmpeg/lib/client',
|
|
11
|
-
async config(value) {
|
|
12
|
-
config = value;
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
configureServer(server) {
|
|
16
|
-
new FFmpegBridge_1.FFmpegBridge(server.ws, config);
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zZXJ2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4REFJMEM7QUFDMUMsaURBQTRDO0FBRTVDLGtCQUFlLEdBQVcsRUFBRTtJQUMxQixJQUFJLE1BQW9CLENBQUM7SUFDekIsT0FBTztRQUNMLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsQ0FBQyx3QkFBYyxDQUFDLEVBQUU7WUFDaEIsVUFBVSxFQUFFLDRCQUE0QjtZQUN4QyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQ2hCLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDakIsQ0FBQztTQUNGO1FBQ0QsZUFBZSxDQUFDLE1BQU07WUFDcEIsSUFBSSwyQkFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../../server/telemetry/posthog.ts"],"names":[],"mappings":"AAMA,oBAAY,SAAS;IACnB,aAAa,mBAAmB;CACjC;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,eAAe,GAAE,MAAW,QAc3E"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sendEvent = exports.EventName = void 0;
|
|
4
|
-
const posthog_node_1 = require("posthog-node");
|
|
5
|
-
const Client = new posthog_node_1.PostHog('phc_YpKoFD7smPe4SXRtVyMW766uP9AjUwnuRJ8hh2EJcVv', {
|
|
6
|
-
host: 'https://eu.posthog.com',
|
|
7
|
-
});
|
|
8
|
-
var EventName;
|
|
9
|
-
(function (EventName) {
|
|
10
|
-
EventName["RenderStarted"] = "render-started";
|
|
11
|
-
})(EventName || (exports.EventName = EventName = {}));
|
|
12
|
-
function sendEvent(eventName, eventProperties = {}) {
|
|
13
|
-
if (process.env.DISABLE_TELEMETRY === 'true') {
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
try {
|
|
17
|
-
Client.capture({
|
|
18
|
-
distinctId: 'anonymous-user',
|
|
19
|
-
event: eventName,
|
|
20
|
-
properties: eventProperties,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
catch (e) {
|
|
24
|
-
console.error(e);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
exports.sendEvent = sendEvent;
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGhvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NlcnZlci90ZWxlbWV0cnkvcG9zdGhvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBcUM7QUFFckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQkFBTyxDQUFDLGlEQUFpRCxFQUFFO0lBQzVFLElBQUksRUFBRSx3QkFBd0I7Q0FDL0IsQ0FBQyxDQUFDO0FBRUgsSUFBWSxTQUVYO0FBRkQsV0FBWSxTQUFTO0lBQ25CLDZDQUFnQyxDQUFBO0FBQ2xDLENBQUMsRUFGVyxTQUFTLHlCQUFULFNBQVMsUUFFcEI7QUFFRCxTQUFnQixTQUFTLENBQUMsU0FBb0IsRUFBRSxrQkFBMEIsRUFBRTtJQUMxRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDN0MsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ2IsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixLQUFLLEVBQUUsU0FBUztZQUNoQixVQUFVLEVBQUUsZUFBZTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFkRCw4QkFjQyJ9
|