@xyo-network/image-thumbnail-plugin 2.72.8 → 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 +1 -3
- 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 +180 -180
- package/dist/esm/Witness/Witness.js +1 -3
- 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/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 +13 -13
- package/src/Witness/Witness.ts +1 -3
- package/src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts +61 -43
- package/src/Witness/ffmpeg/spawn/executeFfmpeg.ts +7 -11
|
@@ -76,9 +76,7 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
76
76
|
if (url.startsWith('data:image')) {
|
|
77
77
|
const data = url.split(',')[1];
|
|
78
78
|
if (data) {
|
|
79
|
-
|
|
80
|
-
console.log(`data buffer: ${buffer.length}`);
|
|
81
|
-
return buffer;
|
|
79
|
+
return Buffer.from(Uint8Array.from(atob(data), (c) => c.charCodeAt(0)));
|
|
82
80
|
}
|
|
83
81
|
else {
|
|
84
82
|
const error = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +1,69 @@
|
|
|
1
|
+
import { uuid } from '@xyo-network/core';
|
|
1
2
|
import ffmpeg from 'fluent-ffmpeg';
|
|
2
|
-
import {
|
|
3
|
+
import { unlink, writeFile } from 'fs/promises';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { Writable } from 'stream';
|
|
6
|
+
/**
|
|
7
|
+
* A Writable stream that collects output from ffmpeg.
|
|
8
|
+
*/
|
|
9
|
+
class FfmpegOutputStream extends Writable {
|
|
10
|
+
chunks = [];
|
|
11
|
+
constructor(options) {
|
|
12
|
+
super(options);
|
|
13
|
+
}
|
|
14
|
+
_write(chunk, _encoding, callback) {
|
|
15
|
+
this.chunks.push(chunk);
|
|
16
|
+
callback();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Collects the output from ffmpeg into a buffer.
|
|
20
|
+
* @returns A buffer containing the concatenated
|
|
21
|
+
* output from ffmpeg.
|
|
22
|
+
*/
|
|
23
|
+
toBuffer = () => Buffer.concat(this.chunks);
|
|
24
|
+
}
|
|
3
25
|
/**
|
|
4
26
|
* Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.
|
|
5
27
|
* @param videoBuffer Input video buffer.
|
|
6
28
|
* @returns Output buffer containing the video thumbnail image.
|
|
7
29
|
*/
|
|
8
30
|
export const getVideoFrameAsImageFluent = async (videoBuffer) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
// Get a temp file name
|
|
32
|
+
const tmpFile = `/${tmpdir()}/${uuid()}`;
|
|
33
|
+
try {
|
|
34
|
+
// Write videoBuffer to temp file for use as input to ffmpeg to
|
|
35
|
+
// avoid issues with ffmpeg inferring premature EOF from buffer
|
|
36
|
+
// passed via stdin (happens when ffmpeg is trying to infer
|
|
37
|
+
// input video format)
|
|
38
|
+
await writeFile(tmpFile, videoBuffer, { encoding: 'binary' });
|
|
39
|
+
const imageBuffer = await new Promise((resolve, reject) => {
|
|
40
|
+
// Create a Writable stream to collect PNG output from ffmpeg
|
|
41
|
+
const ffmpegOutput = new FfmpegOutputStream();
|
|
42
|
+
// Execute ffmpeg using fluent API
|
|
43
|
+
ffmpeg()
|
|
44
|
+
// NOTE: Uncomment to debug CLI args to ffmpeg
|
|
45
|
+
// .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))
|
|
46
|
+
.on('error', (err) => reject(err.message))
|
|
47
|
+
// Listen for the 'end' event to combine the output into a buffer holding the PNG image
|
|
48
|
+
.on('end', () => resolve(ffmpegOutput.toBuffer()))
|
|
49
|
+
.input(tmpFile) // Use temp file as input
|
|
50
|
+
.takeFrames(1) // Only take 1st video frame
|
|
51
|
+
.withNoAudio() // Don't include audio
|
|
52
|
+
.outputOptions('-f image2pipe') // Write output to stdout
|
|
53
|
+
.videoCodec('png') // Force PNG output
|
|
54
|
+
// Start processing and direct ffmpeg stdout to writable stream
|
|
55
|
+
.pipe(ffmpegOutput);
|
|
25
56
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
.on('end', () => resolve(Buffer.concat(pngChunks)))
|
|
38
|
-
.on('data', (chunk) => pngChunks.push(chunk))
|
|
39
|
-
// .toFormat('png')
|
|
40
|
-
.outputOptions('-f image2pipe');
|
|
41
|
-
// .outputOptions('-vcodec png')
|
|
42
|
-
// .output(writableStream, { end: true })
|
|
43
|
-
// Start processing
|
|
44
|
-
command.pipe(writableStream);
|
|
45
|
-
});
|
|
46
|
-
return imageBuffer;
|
|
57
|
+
return imageBuffer;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
// Cleanup temp file
|
|
61
|
+
try {
|
|
62
|
+
await unlink(tmpFile);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// No error here since file doesn't exist
|
|
66
|
+
}
|
|
67
|
+
}
|
|
47
68
|
};
|
|
48
69
|
//# sourceMappingURL=getVideoFrameAsImageFluent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getVideoFrameAsImageFluent.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,eAAe,CAAA;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"getVideoFrameAsImageFluent.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,MAAM,MAAM,eAAe,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,EAAE,QAAQ,EAAmB,MAAM,QAAQ,CAAA;AAElD;;GAEG;AACH,MAAM,kBAAmB,SAAQ,QAAQ;IACtB,MAAM,GAAiB,EAAE,CAAA;IAE1C,YAAY,OAAyB;QACnC,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,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;IAED;;;;OAIG;IACH,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;CAC5C;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAAE,WAAmB,EAAE,EAAE;IACtE,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAAA;IACxC,IAAI;QACF,+DAA+D;QAC/D,+DAA+D;QAC/D,2DAA2D;QAC3D,sBAAsB;QACtB,MAAM,SAAS,CAAC,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,MAAM,EAAE;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,MAAM,CAAC,OAAO,CAAC,CAAA;SACtB;QAAC,MAAM;YACN,yCAAyC;SAC1C;KACF;AACH,CAAC,CAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import { PassThrough } from 'stream';
|
|
3
2
|
/**
|
|
4
3
|
* Execute FFmpeg with the provided arguments.
|
|
5
4
|
* @param videoBuffer Input video buffer.
|
|
@@ -8,22 +7,22 @@ import { PassThrough } from 'stream';
|
|
|
8
7
|
*/
|
|
9
8
|
export const executeFFmpeg = (videoBuffer, ffmpegArgs) => {
|
|
10
9
|
return new Promise((resolve, reject) => {
|
|
10
|
+
const imageData = [];
|
|
11
11
|
const ffmpeg = spawn('ffmpeg', ffmpegArgs);
|
|
12
|
-
|
|
13
|
-
const videoStream = new PassThrough().end(videoBuffer);
|
|
14
|
-
// Pipe the input stream to ffmpeg's stdin
|
|
15
|
-
videoStream.pipe(ffmpeg.stdin);
|
|
16
|
-
const chunks = [];
|
|
17
|
-
ffmpeg.stdout.on('data', (chunk) => chunks.push(chunk));
|
|
12
|
+
ffmpeg.stdout.on('data', (data) => imageData.push(data));
|
|
18
13
|
// TODO: This is required as we're seeing errors thrown due to
|
|
19
14
|
// how we're piping the data to ffmpeg. Works perfectly though.
|
|
20
15
|
ffmpeg.stdin.on('error', () => { });
|
|
21
16
|
ffmpeg.on('close', (code) => {
|
|
22
17
|
if (code !== 0) {
|
|
23
|
-
|
|
18
|
+
reject(new Error(`FFmpeg exited with code ${code}`));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
resolve(Buffer.concat(imageData));
|
|
24
22
|
}
|
|
25
|
-
resolve(Buffer.concat(chunks));
|
|
26
23
|
});
|
|
24
|
+
// Pipe the input stream to ffmpeg's stdin
|
|
25
|
+
ffmpeg.stdin.end(videoBuffer);
|
|
27
26
|
});
|
|
28
27
|
};
|
|
29
28
|
//# sourceMappingURL=executeFfmpeg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeFfmpeg.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"executeFfmpeg.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAErC;;;;;GAKG;AACH,MAAM,CAAC,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,KAAK,CAAC,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAOtD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIpC,OAAO,EAAE,sBAAsB,EAAqC,MAAM,UAAU,CAAA;AAEpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAQtD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,OAAgB,aAAa,iDAAsC;IAEnE,OAAO,CAAC,MAAM,CAAC,CAAkC;IACjD,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;gBAUR;IAED,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,UAAU,WAEb;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,aAAa,WAEhB;IAED,IAAI,eAAe,WAElB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAanC,OAAO,CAAC,MAAM,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAOtD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIpC,OAAO,EAAE,sBAAsB,EAAqC,MAAM,UAAU,CAAA;AAEpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAQtD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,OAAgB,aAAa,iDAAsC;IAEnE,OAAO,CAAC,MAAM,CAAC,CAAkC;IACjD,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;gBAUR;IAED,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,UAAU,WAEb;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,aAAa,WAEhB;IAED,IAAI,eAAe,WAElB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAanC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgBhC;;;;;OAKG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM;cAiBN,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAsCjF,sBAAsB;IAiBpC;;;;OAIG;YACW,wBAAwB;YAKxB,QAAQ;CA4HvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getVideoFrameAsImageFluent.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"getVideoFrameAsImageFluent.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"names":[],"mappings":";AA6BA;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,gBAAuB,MAAM,oBAoCnE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeFfmpeg.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"executeFfmpeg.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AACH,eAAO,MAAM,aAAa,gBAAiB,MAAM,cAAc,MAAM,EAAE,KAAG,QAAQ,MAAM,CAkBvF,CAAA"}
|
package/package.json
CHANGED
|
@@ -13,18 +13,18 @@
|
|
|
13
13
|
"@xylabs/assert": "^2.9.3",
|
|
14
14
|
"@xylabs/delay": "^2.9.3",
|
|
15
15
|
"@xylabs/url": "^2.9.3",
|
|
16
|
-
"@xyo-network/abstract-diviner": "~2.72.
|
|
17
|
-
"@xyo-network/archivist-model": "~2.72.
|
|
18
|
-
"@xyo-network/axios": "~2.72.
|
|
19
|
-
"@xyo-network/core": "~2.72.
|
|
20
|
-
"@xyo-network/diviner-model": "~2.72.
|
|
21
|
-
"@xyo-network/diviner-payload-model": "~2.72.
|
|
22
|
-
"@xyo-network/image-thumbnail-payload-plugin": "~2.72.
|
|
23
|
-
"@xyo-network/module": "~2.72.
|
|
24
|
-
"@xyo-network/payload-model": "~2.72.
|
|
25
|
-
"@xyo-network/payloadset-plugin": "~2.72.
|
|
26
|
-
"@xyo-network/url-payload-plugin": "~2.72.
|
|
27
|
-
"@xyo-network/witness": "~2.72.
|
|
16
|
+
"@xyo-network/abstract-diviner": "~2.72.9",
|
|
17
|
+
"@xyo-network/archivist-model": "~2.72.9",
|
|
18
|
+
"@xyo-network/axios": "~2.72.9",
|
|
19
|
+
"@xyo-network/core": "~2.72.9",
|
|
20
|
+
"@xyo-network/diviner-model": "~2.72.9",
|
|
21
|
+
"@xyo-network/diviner-payload-model": "~2.72.9",
|
|
22
|
+
"@xyo-network/image-thumbnail-payload-plugin": "~2.72.9",
|
|
23
|
+
"@xyo-network/module": "~2.72.9",
|
|
24
|
+
"@xyo-network/payload-model": "~2.72.9",
|
|
25
|
+
"@xyo-network/payloadset-plugin": "~2.72.9",
|
|
26
|
+
"@xyo-network/url-payload-plugin": "~2.72.9",
|
|
27
|
+
"@xyo-network/witness": "~2.72.9",
|
|
28
28
|
"async-mutex": "^0.4.0",
|
|
29
29
|
"file-type": "^16.5.4",
|
|
30
30
|
"fluent-ffmpeg": "^2.1.2",
|
|
@@ -78,5 +78,5 @@
|
|
|
78
78
|
},
|
|
79
79
|
"sideEffects": false,
|
|
80
80
|
"types": "dist/types/index.d.ts",
|
|
81
|
-
"version": "2.72.
|
|
81
|
+
"version": "2.72.9"
|
|
82
82
|
}
|
package/src/Witness/Witness.ts
CHANGED
|
@@ -103,9 +103,7 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
103
103
|
if (url.startsWith('data:image')) {
|
|
104
104
|
const data = url.split(',')[1]
|
|
105
105
|
if (data) {
|
|
106
|
-
|
|
107
|
-
console.log(`data buffer: ${buffer.length}`)
|
|
108
|
-
return buffer
|
|
106
|
+
return Buffer.from(Uint8Array.from(atob(data), (c) => c.charCodeAt(0)))
|
|
109
107
|
} else {
|
|
110
108
|
const error: ImageThumbnailWitnessError = {
|
|
111
109
|
message: 'Invalid data Url',
|
|
@@ -1,5 +1,31 @@
|
|
|
1
|
+
import { uuid } from '@xyo-network/core'
|
|
1
2
|
import ffmpeg from 'fluent-ffmpeg'
|
|
2
|
-
import {
|
|
3
|
+
import { unlink, writeFile } from 'fs/promises'
|
|
4
|
+
import { tmpdir } from 'os'
|
|
5
|
+
import { Writable, WritableOptions } from 'stream'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A Writable stream that collects output from ffmpeg.
|
|
9
|
+
*/
|
|
10
|
+
class FfmpegOutputStream extends Writable {
|
|
11
|
+
private readonly chunks: Uint8Array[] = []
|
|
12
|
+
|
|
13
|
+
constructor(options?: WritableOptions) {
|
|
14
|
+
super(options)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {
|
|
18
|
+
this.chunks.push(chunk)
|
|
19
|
+
callback()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Collects the output from ffmpeg into a buffer.
|
|
24
|
+
* @returns A buffer containing the concatenated
|
|
25
|
+
* output from ffmpeg.
|
|
26
|
+
*/
|
|
27
|
+
toBuffer = () => Buffer.concat(this.chunks)
|
|
28
|
+
}
|
|
3
29
|
|
|
4
30
|
/**
|
|
5
31
|
* Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.
|
|
@@ -7,47 +33,39 @@ import { Readable, Writable } from 'stream'
|
|
|
7
33
|
* @returns Output buffer containing the video thumbnail image.
|
|
8
34
|
*/
|
|
9
35
|
export const getVideoFrameAsImageFluent = async (videoBuffer: Buffer) => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
// Get a temp file name
|
|
37
|
+
const tmpFile = `/${tmpdir()}/${uuid()}`
|
|
38
|
+
try {
|
|
39
|
+
// Write videoBuffer to temp file for use as input to ffmpeg to
|
|
40
|
+
// avoid issues with ffmpeg inferring premature EOF from buffer
|
|
41
|
+
// passed via stdin (happens when ffmpeg is trying to infer
|
|
42
|
+
// input video format)
|
|
43
|
+
await writeFile(tmpFile, videoBuffer, { encoding: 'binary' })
|
|
44
|
+
const imageBuffer = await new Promise<Buffer>((resolve, reject) => {
|
|
45
|
+
// Create a Writable stream to collect PNG output from ffmpeg
|
|
46
|
+
const ffmpegOutput = new FfmpegOutputStream()
|
|
47
|
+
// Execute ffmpeg using fluent API
|
|
48
|
+
ffmpeg()
|
|
49
|
+
// NOTE: Uncomment to debug CLI args to ffmpeg
|
|
50
|
+
// .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))
|
|
51
|
+
.on('error', (err) => reject(err.message))
|
|
52
|
+
// Listen for the 'end' event to combine the output into a buffer holding the PNG image
|
|
53
|
+
.on('end', () => resolve(ffmpegOutput.toBuffer()))
|
|
54
|
+
.input(tmpFile) // Use temp file as input
|
|
55
|
+
.takeFrames(1) // Only take 1st video frame
|
|
56
|
+
.withNoAudio() // Don't include audio
|
|
57
|
+
.outputOptions('-f image2pipe') // Write output to stdout
|
|
58
|
+
.videoCodec('png') // Force PNG output
|
|
59
|
+
// Start processing and direct ffmpeg stdout to writable stream
|
|
60
|
+
.pipe(ffmpegOutput)
|
|
29
61
|
})
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// .seekInput(0)
|
|
40
|
-
.on('error', (err) => reject(err.message))
|
|
41
|
-
// Listen for the 'end' event to combine the chunks and create a PNG buffer
|
|
42
|
-
.on('end', () => resolve(Buffer.concat(pngChunks)))
|
|
43
|
-
.on('data', (chunk) => pngChunks.push(chunk))
|
|
44
|
-
// .toFormat('png')
|
|
45
|
-
.outputOptions('-f image2pipe')
|
|
46
|
-
// .outputOptions('-vcodec png')
|
|
47
|
-
// .output(writableStream, { end: true })
|
|
48
|
-
|
|
49
|
-
// Start processing
|
|
50
|
-
command.pipe(writableStream)
|
|
51
|
-
})
|
|
52
|
-
return imageBuffer
|
|
62
|
+
return imageBuffer
|
|
63
|
+
} finally {
|
|
64
|
+
// Cleanup temp file
|
|
65
|
+
try {
|
|
66
|
+
await unlink(tmpFile)
|
|
67
|
+
} catch {
|
|
68
|
+
// No error here since file doesn't exist
|
|
69
|
+
}
|
|
70
|
+
}
|
|
53
71
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { spawn } from 'child_process'
|
|
2
|
-
import { PassThrough } from 'stream'
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Execute FFmpeg with the provided arguments.
|
|
@@ -9,23 +8,20 @@ import { PassThrough } from 'stream'
|
|
|
9
8
|
*/
|
|
10
9
|
export const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {
|
|
11
10
|
return new Promise((resolve, reject) => {
|
|
11
|
+
const imageData: Buffer[] = []
|
|
12
12
|
const ffmpeg = spawn('ffmpeg', ffmpegArgs)
|
|
13
|
-
|
|
14
|
-
// Create a readable stream from the input buffer
|
|
15
|
-
const videoStream = new PassThrough().end(videoBuffer)
|
|
16
|
-
|
|
17
|
-
// Pipe the input stream to ffmpeg's stdin
|
|
18
|
-
videoStream.pipe(ffmpeg.stdin)
|
|
19
|
-
const chunks: Buffer[] = []
|
|
20
|
-
ffmpeg.stdout.on('data', (chunk: Buffer) => chunks.push(chunk))
|
|
13
|
+
ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))
|
|
21
14
|
// TODO: This is required as we're seeing errors thrown due to
|
|
22
15
|
// how we're piping the data to ffmpeg. Works perfectly though.
|
|
23
16
|
ffmpeg.stdin.on('error', () => {})
|
|
24
17
|
ffmpeg.on('close', (code) => {
|
|
25
18
|
if (code !== 0) {
|
|
26
|
-
|
|
19
|
+
reject(new Error(`FFmpeg exited with code ${code}`))
|
|
20
|
+
} else {
|
|
21
|
+
resolve(Buffer.concat(imageData))
|
|
27
22
|
}
|
|
28
|
-
resolve(Buffer.concat(chunks))
|
|
29
23
|
})
|
|
24
|
+
// Pipe the input stream to ffmpeg's stdin
|
|
25
|
+
ffmpeg.stdin.end(videoBuffer)
|
|
30
26
|
})
|
|
31
27
|
}
|