@xyo-network/image-thumbnail-plugin 2.72.1 → 2.72.2
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 +70 -9
- package/dist/cjs/Witness/Witness.js.map +1 -1
- package/dist/cjs/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +53 -0
- package/dist/cjs/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +1 -0
- package/dist/cjs/Witness/ffmpeg/fluent/index.js +5 -0
- package/dist/cjs/Witness/ffmpeg/fluent/index.js.map +1 -0
- package/dist/cjs/Witness/ffmpeg/index.js +6 -0
- package/dist/cjs/Witness/ffmpeg/index.js.map +1 -0
- package/dist/cjs/Witness/ffmpeg/spawn/executeFfmpeg.js +33 -0
- package/dist/cjs/Witness/ffmpeg/spawn/executeFfmpeg.js.map +1 -0
- package/dist/cjs/Witness/ffmpeg/spawn/getVideoFrameAsImage.js +16 -0
- package/dist/cjs/Witness/ffmpeg/spawn/getVideoFrameAsImage.js.map +1 -0
- package/dist/cjs/Witness/ffmpeg/spawn/index.js +6 -0
- package/dist/cjs/Witness/ffmpeg/spawn/index.js.map +1 -0
- package/dist/docs.json +3956 -3218
- package/dist/esm/Witness/Witness.js +66 -8
- package/dist/esm/Witness/Witness.js.map +1 -1
- package/dist/esm/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +48 -0
- package/dist/esm/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +1 -0
- package/dist/esm/Witness/ffmpeg/fluent/index.js +2 -0
- package/dist/esm/Witness/ffmpeg/fluent/index.js.map +1 -0
- package/dist/esm/Witness/ffmpeg/index.js +3 -0
- package/dist/esm/Witness/ffmpeg/index.js.map +1 -0
- package/dist/esm/Witness/ffmpeg/spawn/executeFfmpeg.js +29 -0
- package/dist/esm/Witness/ffmpeg/spawn/executeFfmpeg.js.map +1 -0
- package/dist/esm/Witness/ffmpeg/spawn/getVideoFrameAsImage.js +11 -0
- package/dist/esm/Witness/ffmpeg/spawn/getVideoFrameAsImage.js.map +1 -0
- package/dist/esm/Witness/ffmpeg/spawn/index.js +3 -0
- package/dist/esm/Witness/ffmpeg/spawn/index.js.map +1 -0
- package/dist/types/Witness/Witness.d.ts +11 -0
- package/dist/types/Witness/Witness.d.ts.map +1 -1
- package/dist/types/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts +8 -0
- package/dist/types/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +1 -0
- package/dist/types/Witness/ffmpeg/fluent/index.d.ts +2 -0
- package/dist/types/Witness/ffmpeg/fluent/index.d.ts.map +1 -0
- package/dist/types/Witness/ffmpeg/index.d.ts +3 -0
- package/dist/types/Witness/ffmpeg/index.d.ts.map +1 -0
- package/dist/types/Witness/ffmpeg/spawn/executeFfmpeg.d.ts +9 -0
- package/dist/types/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +1 -0
- package/dist/types/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts +8 -0
- package/dist/types/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +1 -0
- package/dist/types/Witness/ffmpeg/spawn/index.d.ts +3 -0
- package/dist/types/Witness/ffmpeg/spawn/index.d.ts.map +1 -0
- package/package.json +19 -16
- package/src/Witness/Witness.ts +70 -8
- package/src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts +53 -0
- package/src/Witness/ffmpeg/fluent/index.ts +1 -0
- package/src/Witness/ffmpeg/index.ts +2 -0
- package/src/Witness/ffmpeg/spawn/executeFfmpeg.ts +31 -0
- package/src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts +11 -0
- package/src/Witness/ffmpeg/spawn/index.ts +2 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ImageThumbnailWitness = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
+
/* eslint-disable max-statements */
|
|
5
6
|
const node_dns_1 = require("node:dns");
|
|
6
7
|
const url_1 = require("@xylabs/url");
|
|
7
8
|
const axios_1 = require("@xyo-network/axios");
|
|
@@ -9,6 +10,7 @@ const core_1 = require("@xyo-network/core");
|
|
|
9
10
|
const image_thumbnail_payload_plugin_1 = require("@xyo-network/image-thumbnail-payload-plugin");
|
|
10
11
|
const witness_1 = require("@xyo-network/witness");
|
|
11
12
|
const async_mutex_1 = require("async-mutex");
|
|
13
|
+
const file_type_1 = tslib_1.__importDefault(require("file-type"));
|
|
12
14
|
const gm_1 = require("gm");
|
|
13
15
|
const hasbin_1 = require("hasbin");
|
|
14
16
|
const hash_wasm_1 = require("hash-wasm");
|
|
@@ -17,7 +19,9 @@ const lru_cache_1 = require("lru-cache");
|
|
|
17
19
|
const sha_js_1 = tslib_1.__importDefault(require("sha.js"));
|
|
18
20
|
const url_parse_1 = tslib_1.__importDefault(require("url-parse"));
|
|
19
21
|
const Config_1 = require("./Config");
|
|
22
|
+
const ffmpeg_1 = require("./ffmpeg");
|
|
20
23
|
//TODO: Break this into two Witnesses?
|
|
24
|
+
// setFfmpegPath(ffmpegPath)
|
|
21
25
|
const gm = (0, gm_1.subClass)({ imageMagick: '7+' });
|
|
22
26
|
class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
23
27
|
constructor() {
|
|
@@ -171,8 +175,19 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
171
175
|
return `data:image/png;base64,${thumb.toString('base64')}`;
|
|
172
176
|
});
|
|
173
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Creates an image thumbnail from a video.
|
|
180
|
+
* @param videoBuffer The input video buffer.
|
|
181
|
+
* @returns An buffer containing an image thumbnail for the video.
|
|
182
|
+
*/
|
|
183
|
+
createThumbnailFromVideo(videoBuffer) {
|
|
184
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
185
|
+
const imageBuffer = yield (0, ffmpeg_1.getVideoFrameAsImageFluent)(videoBuffer);
|
|
186
|
+
return this.createThumbnailDataUrl(imageBuffer);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
174
189
|
fromHttp(url) {
|
|
175
|
-
var _a, _b, _c;
|
|
190
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
176
191
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
177
192
|
let response;
|
|
178
193
|
let dnsResult;
|
|
@@ -224,17 +239,63 @@ class ImageThumbnailWitness extends witness_1.AbstractWitness {
|
|
|
224
239
|
};
|
|
225
240
|
if (response.status >= 200 && response.status < 300) {
|
|
226
241
|
const contentType = (_b = response.headers['content-type']) === null || _b === void 0 ? void 0 : _b.toString();
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
result.mime.
|
|
242
|
+
const mediaType = contentType.split('/')[0];
|
|
243
|
+
result.mime = (_c = result.mime) !== null && _c !== void 0 ? _c : {};
|
|
244
|
+
result.mime.returned = mediaType;
|
|
245
|
+
const sourceBuffer = Buffer.from(response.data, 'binary');
|
|
246
|
+
try {
|
|
247
|
+
result.mime.detected = yield file_type_1.default.fromBuffer(sourceBuffer);
|
|
233
248
|
}
|
|
234
|
-
|
|
235
|
-
const
|
|
249
|
+
catch (ex) {
|
|
250
|
+
const error = ex;
|
|
251
|
+
(_d = this.logger) === null || _d === void 0 ? void 0 : _d.error(`FileType error: ${error.message}`);
|
|
252
|
+
}
|
|
253
|
+
const processImage = () => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
236
254
|
result.sourceHash = yield ImageThumbnailWitness.binaryToSha256(sourceBuffer);
|
|
237
255
|
result.url = yield this.createThumbnailDataUrl(sourceBuffer);
|
|
256
|
+
});
|
|
257
|
+
const processVideo = () => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
258
|
+
var _h;
|
|
259
|
+
// Gracefully handle the case where ffmpeg is not installed.
|
|
260
|
+
if ((0, hasbin_1.sync)('ffmpeg')) {
|
|
261
|
+
result.sourceHash = yield ImageThumbnailWitness.binaryToSha256(sourceBuffer);
|
|
262
|
+
result.url = yield this.createThumbnailFromVideo(sourceBuffer);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
result.mime = (_h = result.mime) !== null && _h !== void 0 ? _h : {};
|
|
266
|
+
result.mime.invalid = true;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
switch (mediaType) {
|
|
270
|
+
case 'image': {
|
|
271
|
+
yield processImage();
|
|
272
|
+
result.mime.type = mediaType;
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
case 'video': {
|
|
276
|
+
yield processVideo();
|
|
277
|
+
result.mime.type = mediaType;
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
default: {
|
|
281
|
+
switch ((_e = result.mime.detected) === null || _e === void 0 ? void 0 : _e.mime) {
|
|
282
|
+
case 'image': {
|
|
283
|
+
yield processImage();
|
|
284
|
+
result.mime.type = (_f = result.mime.detected) === null || _f === void 0 ? void 0 : _f.mime;
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
case 'video': {
|
|
288
|
+
yield processVideo();
|
|
289
|
+
result.mime.type = (_g = result.mime.detected) === null || _g === void 0 ? void 0 : _g.mime;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
default: {
|
|
293
|
+
result.mime.invalid = true;
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
238
299
|
}
|
|
239
300
|
}
|
|
240
301
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":";;;;AAAA,uCAAkD;AAElD,qCAAiC;AACjC,8CAAqE;AACrE,4CAAiD;AACjD,gGAAkG;AAElG,kDAAsD;AACtD,6CAAuC;AACvC,2BAA6B;AAC7B,mCAAuC;AACvC,yCAAkC;AAClC,qEAAoC;AACpC,yCAAoC;AACpC,4DAA0B;AAC1B,kEAA2B;AAE3B,qCAA4D;
|
|
1
|
+
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getVideoFrameAsImageFluent = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fluent_ffmpeg_1 = tslib_1.__importDefault(require("fluent-ffmpeg"));
|
|
6
|
+
const stream_1 = require("stream");
|
|
7
|
+
/**
|
|
8
|
+
* Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.
|
|
9
|
+
* @param videoBuffer Input video buffer.
|
|
10
|
+
* @returns Output buffer containing the video thumbnail image.
|
|
11
|
+
*/
|
|
12
|
+
const getVideoFrameAsImageFluent = (videoBuffer) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
+
const imageBuffer = yield new Promise((resolve, reject) => {
|
|
14
|
+
// const videoStream = new PassThrough()
|
|
15
|
+
// videoStream.end(videoBuffer)
|
|
16
|
+
const videoStream = new stream_1.Readable();
|
|
17
|
+
videoStream._read = () => { }; // _read is required but you can noop it
|
|
18
|
+
videoStream.push(videoBuffer);
|
|
19
|
+
videoStream.push(null);
|
|
20
|
+
// Initialize empty array to collect PNG chunks
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
const pngChunks = [];
|
|
23
|
+
// Create a Writable stream to collect PNG output from ffmpeg
|
|
24
|
+
const writableStream = new stream_1.Writable({
|
|
25
|
+
write(chunk, encoding, callback) {
|
|
26
|
+
pngChunks.push(chunk);
|
|
27
|
+
callback();
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const command = (0, fluent_ffmpeg_1.default)()
|
|
31
|
+
// Uncomment to debug CLI args to ffmpeg
|
|
32
|
+
// .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))
|
|
33
|
+
.input(videoStream)
|
|
34
|
+
.takeFrames(1)
|
|
35
|
+
.withNoAudio()
|
|
36
|
+
// Exactly as their docs but does not work
|
|
37
|
+
// .setStartTime('00:00:00')
|
|
38
|
+
// .seekInput(0)
|
|
39
|
+
.on('error', (err) => reject(err.message))
|
|
40
|
+
// Listen for the 'end' event to combine the chunks and create a PNG buffer
|
|
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;
|
|
51
|
+
});
|
|
52
|
+
exports.getVideoFrameAsImageFluent = getVideoFrameAsImageFluent;
|
|
53
|
+
//# sourceMappingURL=getVideoFrameAsImageFluent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getVideoFrameAsImageFluent.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"names":[],"mappings":";;;;AAAA,0EAAkC;AAClC,mCAA2C;AAE3C;;;;GAIG;AACI,MAAM,0BAA0B,GAAG,CAAO,WAAmB,EAAE,EAAE;IACtE,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAChE,wCAAwC;QACxC,+BAA+B;QAE/B,MAAM,WAAW,GAAG,IAAI,iBAAQ,EAAE,CAAA;QAClC,WAAW,CAAC,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA,CAAC,wCAAwC;QACrE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEtB,+CAA+C;QAC/C,8DAA8D;QAC9D,MAAM,SAAS,GAAU,EAAE,CAAA;QAE3B,6DAA6D;QAC7D,MAAM,cAAc,GAAG,IAAI,iBAAQ,CAAC;YAClC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ;gBAC7B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACrB,QAAQ,EAAE,CAAA;YACZ,CAAC;SACF,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,IAAA,uBAAM,GAAE;YACtB,wCAAwC;YACxC,4FAA4F;aAC3F,KAAK,CAAC,WAAW,CAAC;aAClB,UAAU,CAAC,CAAC,CAAC;aACb,WAAW,EAAE;YACd,0CAA0C;YAC1C,4BAA4B;YAC5B,gBAAgB;aACf,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,2EAA2E;aAC1E,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;aAClD,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7C,mBAAmB;aAClB,aAAa,CAAC,eAAe,CAAC,CAAA;QACjC,gCAAgC;QAChC,yCAAyC;QAEzC,mBAAmB;QACnB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA,CAAA;AA5CY,QAAA,0BAA0B,8BA4CtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/index.ts"],"names":[],"mappings":";;;AAAA,uEAA4C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Witness/ffmpeg/index.ts"],"names":[],"mappings":";;;AAAA,mDAAwB;AACxB,kDAAuB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeFFmpeg = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const stream_1 = require("stream");
|
|
6
|
+
/**
|
|
7
|
+
* Execute FFmpeg with the provided arguments.
|
|
8
|
+
* @param videoBuffer Input video buffer.
|
|
9
|
+
* @param ffmpegArgs FFmpeg arguments.
|
|
10
|
+
* @returns Output buffer containing the video thumbnail image.
|
|
11
|
+
*/
|
|
12
|
+
const executeFFmpeg = (videoBuffer, ffmpegArgs) => {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const ffmpeg = (0, child_process_1.spawn)('ffmpeg', ffmpegArgs);
|
|
15
|
+
// Create a readable stream from the input buffer
|
|
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));
|
|
21
|
+
// TODO: This is required as we're seeing errors thrown due to
|
|
22
|
+
// how we're piping the data to ffmpeg. Works perfectly though.
|
|
23
|
+
ffmpeg.stdin.on('error', () => { });
|
|
24
|
+
ffmpeg.on('close', (code) => {
|
|
25
|
+
if (code !== 0) {
|
|
26
|
+
return reject(new Error(`FFmpeg exited with code ${code}`));
|
|
27
|
+
}
|
|
28
|
+
resolve(Buffer.concat(chunks));
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
exports.executeFFmpeg = executeFFmpeg;
|
|
33
|
+
//# sourceMappingURL=executeFfmpeg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeFfmpeg.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AACrC,mCAAoC;AAEpC;;;;;GAKG;AACI,MAAM,aAAa,GAAG,CAAC,WAAmB,EAAE,UAAoB,EAAmB,EAAE;IAC1F,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QAE1C,iDAAiD;QACjD,MAAM,WAAW,GAAG,IAAI,oBAAW,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAEtD,0CAA0C;QAC1C,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/D,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,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAA;aAC5D;YACD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AArBY,QAAA,aAAa,iBAqBzB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getVideoFrameAsImage = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const executeFfmpeg_1 = require("./executeFfmpeg");
|
|
6
|
+
/**
|
|
7
|
+
* Execute FFmpeg with provided input buffer and return video thumbnail image.
|
|
8
|
+
* @param videoBuffer Input video buffer.
|
|
9
|
+
* @returns Output buffer containing the video thumbnail image.
|
|
10
|
+
*/
|
|
11
|
+
const getVideoFrameAsImage = (videoBuffer) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
12
|
+
const imageBuffer = yield (0, executeFfmpeg_1.executeFFmpeg)(videoBuffer, ['-i', 'pipe:', '-ss', '00:00:00', '-vframes', '1', '-f', 'image2pipe', '-']);
|
|
13
|
+
return imageBuffer;
|
|
14
|
+
});
|
|
15
|
+
exports.getVideoFrameAsImage = getVideoFrameAsImage;
|
|
16
|
+
//# sourceMappingURL=getVideoFrameAsImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getVideoFrameAsImage.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"names":[],"mappings":";;;;AAAA,mDAA+C;AAE/C;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,CAAO,WAAmB,EAAE,EAAE;IAChE,MAAM,WAAW,GAAG,MAAM,IAAA,6BAAa,EAAC,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,CAAA;IAClI,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA,CAAA;AAHY,QAAA,oBAAoB,wBAGhC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./executeFfmpeg"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./getVideoFrameAsImage"), exports);
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/index.ts"],"names":[],"mappings":";;;AAAA,0DAA+B;AAC/B,iEAAsC"}
|