@xyo-network/image-thumbnail-plugin 2.72.7 → 2.72.9
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/dist/cjs/Witness/Witness.js +25 -15
- package/dist/cjs/Witness/Witness.js.map +1 -1
- package/dist/cjs/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +58 -37
- package/dist/cjs/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +1 -1
- package/dist/cjs/Witness/ffmpeg/spawn/executeFfmpeg.js +8 -9
- package/dist/cjs/Witness/ffmpeg/spawn/executeFfmpeg.js.map +1 -1
- package/dist/docs.json +5895 -4334
- package/dist/esm/Witness/Witness.js +25 -15
- package/dist/esm/Witness/Witness.js.map +1 -1
- package/dist/esm/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +59 -38
- package/dist/esm/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +1 -1
- package/dist/esm/Witness/ffmpeg/spawn/executeFfmpeg.js +8 -9
- package/dist/esm/Witness/ffmpeg/spawn/executeFfmpeg.js.map +1 -1
- package/dist/types/Plugin.d.ts +5 -1
- package/dist/types/Plugin.d.ts.map +1 -1
- package/dist/types/Witness/Config.d.ts +2 -1
- package/dist/types/Witness/Config.d.ts.map +1 -1
- package/dist/types/Witness/Witness.d.ts +2 -1
- package/dist/types/Witness/Witness.d.ts.map +1 -1
- package/dist/types/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +1 -1
- package/dist/types/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/Witness/Config.ts +3 -1
- package/src/Witness/Witness.ts +30 -18
- package/src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts +61 -43
- package/src/Witness/ffmpeg/spawn/executeFfmpeg.ts +7 -11
|
@@ -8,6 +8,7 @@ const url_1 = require("@xylabs/url");
|
|
|
8
8
|
const axios_1 = require("@xyo-network/axios");
|
|
9
9
|
const core_1 = require("@xyo-network/core");
|
|
10
10
|
const image_thumbnail_payload_plugin_1 = require("@xyo-network/image-thumbnail-payload-plugin");
|
|
11
|
+
const url_payload_plugin_1 = require("@xyo-network/url-payload-plugin");
|
|
11
12
|
const witness_1 = require("@xyo-network/witness");
|
|
12
13
|
const async_mutex_1 = require("async-mutex");
|
|
13
14
|
const file_type_1 = tslib_1.__importDefault(require("file-type"));
|
|
@@ -90,9 +91,7 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
90
91
|
if (url.startsWith('data:image')) {
|
|
91
92
|
const data = url.split(',')[1];
|
|
92
93
|
if (data) {
|
|
93
|
-
|
|
94
|
-
console.log(`data buffer: ${buffer.length}`);
|
|
95
|
-
return buffer;
|
|
94
|
+
return Buffer.from(Uint8Array.from(atob(data), (c) => c.charCodeAt(0)));
|
|
96
95
|
}
|
|
97
96
|
else {
|
|
98
97
|
const error = {
|
|
@@ -132,8 +131,9 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
132
131
|
if (!(0, hasbin_1.sync)('magick')) {
|
|
133
132
|
throw Error('ImageMagick is required for this witness');
|
|
134
133
|
}
|
|
134
|
+
const urlPayloads = payloads.filter((payload) => payload.schema === url_payload_plugin_1.UrlSchema);
|
|
135
135
|
return yield this._semaphore.runExclusive(() => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
136
|
-
return (0, compact_1.default)(yield Promise.all(
|
|
136
|
+
return (0, compact_1.default)(yield Promise.all(urlPayloads.map(({ url }) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
137
137
|
const cachedResult = this.cache.get(url);
|
|
138
138
|
if (cachedResult) {
|
|
139
139
|
return cachedResult;
|
|
@@ -152,7 +152,7 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
152
152
|
else {
|
|
153
153
|
//if it is ipfs, go through cloud flair
|
|
154
154
|
const mutatedUrl = this.checkIpfsUrl(url);
|
|
155
|
-
result = yield this.fromHttp(mutatedUrl);
|
|
155
|
+
result = yield this.fromHttp(mutatedUrl, url);
|
|
156
156
|
}
|
|
157
157
|
this.cache.set(url, result);
|
|
158
158
|
return result;
|
|
@@ -160,14 +160,14 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
160
160
|
}));
|
|
161
161
|
});
|
|
162
162
|
}
|
|
163
|
-
createThumbnailDataUrl(sourceBuffer) {
|
|
163
|
+
createThumbnailDataUrl(sourceBuffer, encoding) {
|
|
164
164
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
165
165
|
const thumb = yield new Promise((resolve, reject) => {
|
|
166
166
|
gm(sourceBuffer)
|
|
167
167
|
.quality(this.quality)
|
|
168
168
|
.resize(this.width, this.height)
|
|
169
169
|
.flatten()
|
|
170
|
-
.toBuffer(this.encoding, (error, buffer) => {
|
|
170
|
+
.toBuffer(encoding !== null && encoding !== void 0 ? encoding : this.encoding, (error, buffer) => {
|
|
171
171
|
if (error) {
|
|
172
172
|
reject(error);
|
|
173
173
|
}
|
|
@@ -190,7 +190,7 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
190
190
|
return this.createThumbnailDataUrl(imageBuffer);
|
|
191
191
|
});
|
|
192
192
|
}
|
|
193
|
-
fromHttp(url) {
|
|
193
|
+
fromHttp(url, sourceUrl) {
|
|
194
194
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
195
195
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
196
196
|
let response;
|
|
@@ -207,7 +207,7 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
207
207
|
dnsError: error.code,
|
|
208
208
|
},
|
|
209
209
|
schema: image_thumbnail_payload_plugin_1.ImageThumbnailSchema,
|
|
210
|
-
sourceUrl: url,
|
|
210
|
+
sourceUrl: sourceUrl !== null && sourceUrl !== void 0 ? sourceUrl : url,
|
|
211
211
|
};
|
|
212
212
|
return result;
|
|
213
213
|
}
|
|
@@ -226,7 +226,7 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
226
226
|
status: (_a = axiosError === null || axiosError === void 0 ? void 0 : axiosError.response) === null || _a === void 0 ? void 0 : _a.status,
|
|
227
227
|
},
|
|
228
228
|
schema: image_thumbnail_payload_plugin_1.ImageThumbnailSchema,
|
|
229
|
-
sourceUrl: url,
|
|
229
|
+
sourceUrl: sourceUrl !== null && sourceUrl !== void 0 ? sourceUrl : url,
|
|
230
230
|
};
|
|
231
231
|
return result;
|
|
232
232
|
}
|
|
@@ -239,11 +239,11 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
239
239
|
status: response.status,
|
|
240
240
|
},
|
|
241
241
|
schema: image_thumbnail_payload_plugin_1.ImageThumbnailSchema,
|
|
242
|
-
sourceUrl: url,
|
|
242
|
+
sourceUrl: sourceUrl !== null && sourceUrl !== void 0 ? sourceUrl : url,
|
|
243
243
|
};
|
|
244
244
|
if (response.status >= 200 && response.status < 300) {
|
|
245
245
|
const contentType = (_b = response.headers['content-type']) === null || _b === void 0 ? void 0 : _b.toString();
|
|
246
|
-
const mediaType = contentType.split('/')
|
|
246
|
+
const [mediaType, fileType] = contentType.split('/');
|
|
247
247
|
result.mime = (_c = result.mime) !== null && _c !== void 0 ? _c : {};
|
|
248
248
|
result.mime.returned = mediaType;
|
|
249
249
|
const sourceBuffer = Buffer.from(response.data, 'binary');
|
|
@@ -254,9 +254,9 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
254
254
|
const error = ex;
|
|
255
255
|
(_d = this.logger) === null || _d === void 0 ? void 0 : _d.error(`FileType error: ${error.message}`);
|
|
256
256
|
}
|
|
257
|
-
const processImage = () => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
257
|
+
const processImage = (encoding) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
258
258
|
result.sourceHash = yield ImageThumbnailWitness.binaryToSha256(sourceBuffer);
|
|
259
|
-
result.url = yield this.createThumbnailDataUrl(sourceBuffer);
|
|
259
|
+
result.url = yield this.createThumbnailDataUrl(sourceBuffer, encoding);
|
|
260
260
|
});
|
|
261
261
|
const processVideo = () => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
262
262
|
var _h;
|
|
@@ -270,9 +270,19 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
270
270
|
result.mime.invalid = true;
|
|
271
271
|
}
|
|
272
272
|
});
|
|
273
|
+
let encoding = 'PNG';
|
|
274
|
+
switch (fileType.toUpperCase()) {
|
|
275
|
+
case 'GIF':
|
|
276
|
+
encoding = 'GIF';
|
|
277
|
+
break;
|
|
278
|
+
case 'JPG':
|
|
279
|
+
case 'JPEG':
|
|
280
|
+
encoding = 'JPG';
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
273
283
|
switch (mediaType) {
|
|
274
284
|
case 'image': {
|
|
275
|
-
yield processImage();
|
|
285
|
+
yield processImage(encoding);
|
|
276
286
|
result.mime.type = mediaType;
|
|
277
287
|
break;
|
|
278
288
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":";;;;AAAA,mCAAmC;AACnC,uCAAkD;AAElD,qCAAiC;AACjC,8CAAqE;AACrE,4CAAiD;AACjD,gGAAkG;
|
|
1
|
+
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,52 +2,73 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getVideoFrameAsImageFluent = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@xyo-network/core");
|
|
5
6
|
const fluent_ffmpeg_1 = tslib_1.__importDefault(require("fluent-ffmpeg"));
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const os_1 = require("os");
|
|
6
9
|
const stream_1 = require("stream");
|
|
10
|
+
/**
|
|
11
|
+
* A Writable stream that collects output from ffmpeg.
|
|
12
|
+
*/
|
|
13
|
+
class FfmpegOutputStream extends stream_1.Writable {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
super(options);
|
|
16
|
+
this.chunks = [];
|
|
17
|
+
/**
|
|
18
|
+
* Collects the output from ffmpeg into a buffer.
|
|
19
|
+
* @returns A buffer containing the concatenated
|
|
20
|
+
* output from ffmpeg.
|
|
21
|
+
*/
|
|
22
|
+
this.toBuffer = () => Buffer.concat(this.chunks);
|
|
23
|
+
}
|
|
24
|
+
_write(chunk, _encoding, callback) {
|
|
25
|
+
this.chunks.push(chunk);
|
|
26
|
+
callback();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
7
29
|
/**
|
|
8
30
|
* Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.
|
|
9
31
|
* @param videoBuffer Input video buffer.
|
|
10
32
|
* @returns Output buffer containing the video thumbnail image.
|
|
11
33
|
*/
|
|
12
34
|
const getVideoFrameAsImageFluent = (videoBuffer) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
// Get a temp file name
|
|
36
|
+
const tmpFile = `/${(0, os_1.tmpdir)()}/${(0, core_1.uuid)()}`;
|
|
37
|
+
try {
|
|
38
|
+
// Write videoBuffer to temp file for use as input to ffmpeg to
|
|
39
|
+
// avoid issues with ffmpeg inferring premature EOF from buffer
|
|
40
|
+
// passed via stdin (happens when ffmpeg is trying to infer
|
|
41
|
+
// input video format)
|
|
42
|
+
yield (0, promises_1.writeFile)(tmpFile, videoBuffer, { encoding: 'binary' });
|
|
43
|
+
const imageBuffer = yield new Promise((resolve, reject) => {
|
|
44
|
+
// Create a Writable stream to collect PNG output from ffmpeg
|
|
45
|
+
const ffmpegOutput = new FfmpegOutputStream();
|
|
46
|
+
// Execute ffmpeg using fluent API
|
|
47
|
+
(0, fluent_ffmpeg_1.default)()
|
|
48
|
+
// NOTE: Uncomment to debug CLI args to ffmpeg
|
|
49
|
+
// .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))
|
|
50
|
+
.on('error', (err) => reject(err.message))
|
|
51
|
+
// Listen for the 'end' event to combine the output into a buffer holding the PNG image
|
|
52
|
+
.on('end', () => resolve(ffmpegOutput.toBuffer()))
|
|
53
|
+
.input(tmpFile) // Use temp file as input
|
|
54
|
+
.takeFrames(1) // Only take 1st video frame
|
|
55
|
+
.withNoAudio() // Don't include audio
|
|
56
|
+
.outputOptions('-f image2pipe') // Write output to stdout
|
|
57
|
+
.videoCodec('png') // Force PNG output
|
|
58
|
+
// Start processing and direct ffmpeg stdout to writable stream
|
|
59
|
+
.pipe(ffmpegOutput);
|
|
29
60
|
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.on('end', () => resolve(Buffer.concat(pngChunks)))
|
|
42
|
-
.on('data', (chunk) => pngChunks.push(chunk))
|
|
43
|
-
// .toFormat('png')
|
|
44
|
-
.outputOptions('-f image2pipe');
|
|
45
|
-
// .outputOptions('-vcodec png')
|
|
46
|
-
// .output(writableStream, { end: true })
|
|
47
|
-
// Start processing
|
|
48
|
-
command.pipe(writableStream);
|
|
49
|
-
});
|
|
50
|
-
return imageBuffer;
|
|
61
|
+
return imageBuffer;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
// Cleanup temp file
|
|
65
|
+
try {
|
|
66
|
+
yield (0, promises_1.unlink)(tmpFile);
|
|
67
|
+
}
|
|
68
|
+
catch (_a) {
|
|
69
|
+
// No error here since file doesn't exist
|
|
70
|
+
}
|
|
71
|
+
}
|
|
51
72
|
});
|
|
52
73
|
exports.getVideoFrameAsImageFluent = getVideoFrameAsImageFluent;
|
|
53
74
|
//# sourceMappingURL=getVideoFrameAsImageFluent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getVideoFrameAsImageFluent.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"names":[],"mappings":";;;;AAAA,0EAAkC;AAClC,
|
|
1
|
+
{"version":3,"file":"getVideoFrameAsImageFluent.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"names":[],"mappings":";;;;AAAA,4CAAwC;AACxC,0EAAkC;AAClC,0CAA+C;AAC/C,2BAA2B;AAC3B,mCAAkD;AAElD;;GAEG;AACH,MAAM,kBAAmB,SAAQ,iBAAQ;IAGvC,YAAY,OAAyB;QACnC,KAAK,CAAC,OAAO,CAAC,CAAA;QAHC,WAAM,GAAiB,EAAE,CAAA;QAW1C;;;;WAIG;QACH,aAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAZ3C,CAAC;IAEQ,MAAM,CAAC,KAAY,EAAE,SAAyB,EAAE,QAAwC;QAC/F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,QAAQ,EAAE,CAAA;IACZ,CAAC;CAQF;AAED;;;;GAIG;AACI,MAAM,0BAA0B,GAAG,CAAO,WAAmB,EAAE,EAAE;IACtE,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,IAAA,WAAM,GAAE,IAAI,IAAA,WAAI,GAAE,EAAE,CAAA;IACxC,IAAI;QACF,+DAA+D;QAC/D,+DAA+D;QAC/D,2DAA2D;QAC3D,sBAAsB;QACtB,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC7D,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChE,6DAA6D;YAC7D,MAAM,YAAY,GAAG,IAAI,kBAAkB,EAAE,CAAA;YAC7C,kCAAkC;YAClC,IAAA,uBAAM,GAAE;gBACN,8CAA8C;gBAC9C,4FAA4F;iBAC3F,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1C,uFAAuF;iBACtF,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;iBACjD,KAAK,CAAC,OAAO,CAAC,CAAC,yBAAyB;iBACxC,UAAU,CAAC,CAAC,CAAC,CAAC,4BAA4B;iBAC1C,WAAW,EAAE,CAAC,sBAAsB;iBACpC,aAAa,CAAC,eAAe,CAAC,CAAC,yBAAyB;iBACxD,UAAU,CAAC,KAAK,CAAC,CAAC,mBAAmB;gBACtC,+DAA+D;iBAC9D,IAAI,CAAC,YAAY,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;QACF,OAAO,WAAW,CAAA;KACnB;YAAS;QACR,oBAAoB;QACpB,IAAI;YACF,MAAM,IAAA,iBAAM,EAAC,OAAO,CAAC,CAAA;SACtB;QAAC,WAAM;YACN,yCAAyC;SAC1C;KACF;AACH,CAAC,CAAA,CAAA;AApCY,QAAA,0BAA0B,8BAoCtC"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.executeFFmpeg = void 0;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
|
-
const stream_1 = require("stream");
|
|
6
5
|
/**
|
|
7
6
|
* Execute FFmpeg with the provided arguments.
|
|
8
7
|
* @param videoBuffer Input video buffer.
|
|
@@ -11,22 +10,22 @@ const stream_1 = require("stream");
|
|
|
11
10
|
*/
|
|
12
11
|
const executeFFmpeg = (videoBuffer, ffmpegArgs) => {
|
|
13
12
|
return new Promise((resolve, reject) => {
|
|
13
|
+
const imageData = [];
|
|
14
14
|
const ffmpeg = (0, child_process_1.spawn)('ffmpeg', ffmpegArgs);
|
|
15
|
-
|
|
16
|
-
const videoStream = new stream_1.PassThrough().end(videoBuffer);
|
|
17
|
-
// Pipe the input stream to ffmpeg's stdin
|
|
18
|
-
videoStream.pipe(ffmpeg.stdin);
|
|
19
|
-
const chunks = [];
|
|
20
|
-
ffmpeg.stdout.on('data', (chunk) => chunks.push(chunk));
|
|
15
|
+
ffmpeg.stdout.on('data', (data) => imageData.push(data));
|
|
21
16
|
// TODO: This is required as we're seeing errors thrown due to
|
|
22
17
|
// how we're piping the data to ffmpeg. Works perfectly though.
|
|
23
18
|
ffmpeg.stdin.on('error', () => { });
|
|
24
19
|
ffmpeg.on('close', (code) => {
|
|
25
20
|
if (code !== 0) {
|
|
26
|
-
|
|
21
|
+
reject(new Error(`FFmpeg exited with code ${code}`));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
resolve(Buffer.concat(imageData));
|
|
27
25
|
}
|
|
28
|
-
resolve(Buffer.concat(chunks));
|
|
29
26
|
});
|
|
27
|
+
// Pipe the input stream to ffmpeg's stdin
|
|
28
|
+
ffmpeg.stdin.end(videoBuffer);
|
|
30
29
|
});
|
|
31
30
|
};
|
|
32
31
|
exports.executeFFmpeg = executeFFmpeg;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeFfmpeg.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;
|
|
1
|
+
{"version":3,"file":"executeFfmpeg.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AAErC;;;;;GAKG;AACI,MAAM,aAAa,GAAG,CAAC,WAAmB,EAAE,UAAoB,EAAmB,EAAE;IAC1F,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,SAAS,GAAa,EAAE,CAAA;QAC9B,MAAM,MAAM,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAChE,8DAA8D;QAC9D,+DAA+D;QAC/D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,KAAK,CAAC,EAAE;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAA;aACrD;iBAAM;gBACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;aAClC;QACH,CAAC,CAAC,CAAA;QACF,0CAA0C;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAlBY,QAAA,aAAa,iBAkBzB"}
|