@xyo-network/image-thumbnail-plugin 2.74.5 → 2.75.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.
Files changed (195) hide show
  1. package/dist/docs.json +1299 -1299
  2. package/dist/node/Diviner/Config.d.cts.map +1 -0
  3. package/dist/node/Diviner/Config.d.mts.map +1 -0
  4. package/dist/node/Diviner/Config.d.ts +11 -0
  5. package/dist/node/Diviner/Config.d.ts.map +1 -0
  6. package/dist/node/Diviner/Config.js +32 -0
  7. package/dist/node/Diviner/Config.js.map +1 -0
  8. package/dist/node/Diviner/Config.mjs +7 -0
  9. package/dist/node/Diviner/Config.mjs.map +1 -0
  10. package/dist/node/Diviner/Diviner.d.cts.map +1 -0
  11. package/dist/node/Diviner/Diviner.d.mts.map +1 -0
  12. package/dist/node/Diviner/Diviner.d.ts +30 -0
  13. package/dist/node/Diviner/Diviner.d.ts.map +1 -0
  14. package/dist/node/Diviner/Diviner.js +207 -0
  15. package/dist/node/Diviner/Diviner.js.map +1 -0
  16. package/dist/node/Diviner/Diviner.mjs +182 -0
  17. package/dist/node/Diviner/Diviner.mjs.map +1 -0
  18. package/dist/node/Diviner/Params.d.cts.map +1 -0
  19. package/dist/node/Diviner/Params.d.mts.map +1 -0
  20. package/dist/node/Diviner/Params.d.ts +5 -0
  21. package/dist/node/Diviner/Params.d.ts.map +1 -0
  22. package/dist/node/Diviner/Params.js +19 -0
  23. package/dist/node/Diviner/Params.js.map +1 -0
  24. package/dist/node/Diviner/Params.mjs +1 -0
  25. package/dist/node/Diviner/Params.mjs.map +1 -0
  26. package/dist/node/Diviner/index.d.cts.map +1 -0
  27. package/dist/node/Diviner/index.d.mts.map +1 -0
  28. package/dist/node/Diviner/index.d.ts +4 -0
  29. package/dist/node/Diviner/index.d.ts.map +1 -0
  30. package/dist/node/Diviner/index.js +209 -0
  31. package/dist/node/Diviner/index.js.map +1 -0
  32. package/dist/node/Diviner/index.mjs +181 -0
  33. package/dist/node/Diviner/index.mjs.map +1 -0
  34. package/dist/node/Plugin.d.cts.map +1 -0
  35. package/dist/node/Plugin.d.mts.map +1 -0
  36. package/dist/node/Plugin.d.ts +116 -0
  37. package/dist/node/Plugin.d.ts.map +1 -0
  38. package/dist/node/Plugin.js +556 -0
  39. package/dist/{index.mjs.map → node/Plugin.js.map} +1 -1
  40. package/dist/node/Plugin.mjs +521 -0
  41. package/dist/node/Plugin.mjs.map +1 -0
  42. package/dist/node/Witness/Config.d.cts.map +1 -0
  43. package/dist/node/Witness/Config.d.mts.map +1 -0
  44. package/dist/node/Witness/Config.d.ts +16 -0
  45. package/dist/node/Witness/Config.d.ts.map +1 -0
  46. package/dist/node/Witness/Config.js +32 -0
  47. package/dist/node/Witness/Config.js.map +1 -0
  48. package/dist/node/Witness/Config.mjs +7 -0
  49. package/dist/node/Witness/Config.mjs.map +1 -0
  50. package/dist/node/Witness/Params.d.cts.map +1 -0
  51. package/dist/node/Witness/Params.d.mts.map +1 -0
  52. package/dist/node/Witness/Params.d.ts +7 -0
  53. package/dist/node/Witness/Params.d.ts.map +1 -0
  54. package/dist/node/Witness/Params.js +19 -0
  55. package/dist/node/Witness/Params.js.map +1 -0
  56. package/dist/node/Witness/Params.mjs +1 -0
  57. package/dist/node/Witness/Params.mjs.map +1 -0
  58. package/dist/node/Witness/Witness.d.cts.map +1 -0
  59. package/dist/node/Witness/Witness.d.mts.map +1 -0
  60. package/dist/node/Witness/Witness.d.ts +66 -0
  61. package/dist/node/Witness/Witness.d.ts.map +1 -0
  62. package/dist/node/Witness/Witness.js +359 -0
  63. package/dist/node/Witness/Witness.js.map +1 -0
  64. package/dist/node/Witness/Witness.mjs +324 -0
  65. package/dist/node/Witness/Witness.mjs.map +1 -0
  66. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.cts.map +1 -0
  67. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts.map +1 -0
  68. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts +8 -0
  69. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +1 -0
  70. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +77 -0
  71. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +1 -0
  72. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.mjs +42 -0
  73. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.mjs.map +1 -0
  74. package/dist/node/Witness/ffmpeg/fluent/index.d.cts.map +1 -0
  75. package/dist/node/Witness/ffmpeg/fluent/index.d.mts.map +1 -0
  76. package/dist/node/Witness/ffmpeg/fluent/index.d.ts +2 -0
  77. package/dist/node/Witness/ffmpeg/fluent/index.d.ts.map +1 -0
  78. package/dist/node/Witness/ffmpeg/fluent/index.js +79 -0
  79. package/dist/node/Witness/ffmpeg/fluent/index.js.map +1 -0
  80. package/dist/node/Witness/ffmpeg/fluent/index.mjs +42 -0
  81. package/dist/node/Witness/ffmpeg/fluent/index.mjs.map +1 -0
  82. package/dist/node/Witness/ffmpeg/index.d.cts.map +1 -0
  83. package/dist/node/Witness/ffmpeg/index.d.mts.map +1 -0
  84. package/dist/node/Witness/ffmpeg/index.d.ts +3 -0
  85. package/dist/node/Witness/ffmpeg/index.d.ts.map +1 -0
  86. package/dist/node/Witness/ffmpeg/index.js +109 -0
  87. package/dist/node/Witness/ffmpeg/index.js.map +1 -0
  88. package/dist/node/Witness/ffmpeg/index.mjs +70 -0
  89. package/dist/node/Witness/ffmpeg/index.mjs.map +1 -0
  90. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.cts.map +1 -0
  91. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.mts.map +1 -0
  92. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.ts +9 -0
  93. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +1 -0
  94. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.js +48 -0
  95. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.js.map +1 -0
  96. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.mjs +23 -0
  97. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.mjs.map +1 -0
  98. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.cts.map +1 -0
  99. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts.map +1 -0
  100. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts +8 -0
  101. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +1 -0
  102. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.js +56 -0
  103. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.js.map +1 -0
  104. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.mjs +29 -0
  105. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.mjs.map +1 -0
  106. package/dist/node/Witness/ffmpeg/spawn/index.d.cts.map +1 -0
  107. package/dist/node/Witness/ffmpeg/spawn/index.d.mts.map +1 -0
  108. package/dist/node/Witness/ffmpeg/spawn/index.d.ts +3 -0
  109. package/dist/node/Witness/ffmpeg/spawn/index.d.ts.map +1 -0
  110. package/dist/node/Witness/ffmpeg/spawn/index.js +58 -0
  111. package/dist/node/Witness/ffmpeg/spawn/index.js.map +1 -0
  112. package/dist/node/Witness/ffmpeg/spawn/index.mjs +30 -0
  113. package/dist/node/Witness/ffmpeg/spawn/index.mjs.map +1 -0
  114. package/dist/node/Witness/index.d.cts.map +1 -0
  115. package/dist/node/Witness/index.d.mts.map +1 -0
  116. package/dist/node/Witness/index.d.ts +4 -0
  117. package/dist/node/Witness/index.d.ts.map +1 -0
  118. package/dist/node/Witness/index.js +363 -0
  119. package/dist/node/Witness/index.js.map +1 -0
  120. package/dist/node/Witness/index.mjs +325 -0
  121. package/dist/node/Witness/index.mjs.map +1 -0
  122. package/dist/node/index.d.cts.map +1 -0
  123. package/dist/node/index.d.mts.map +1 -0
  124. package/dist/node/index.d.ts +6 -0
  125. package/dist/node/index.d.ts.map +1 -0
  126. package/dist/{index.js → node/index.js} +15 -10
  127. package/dist/node/index.js.map +1 -0
  128. package/dist/{index.mjs → node/index.mjs} +15 -10
  129. package/dist/node/index.mjs.map +1 -0
  130. package/package.json +39 -38
  131. package/dist/Diviner/Config.d.mts.map +0 -1
  132. package/dist/Diviner/Config.d.ts.map +0 -1
  133. package/dist/Diviner/Diviner.d.mts.map +0 -1
  134. package/dist/Diviner/Diviner.d.ts.map +0 -1
  135. package/dist/Diviner/Params.d.mts.map +0 -1
  136. package/dist/Diviner/Params.d.ts.map +0 -1
  137. package/dist/Diviner/index.d.mts.map +0 -1
  138. package/dist/Diviner/index.d.ts.map +0 -1
  139. package/dist/Plugin.d.mts.map +0 -1
  140. package/dist/Plugin.d.ts.map +0 -1
  141. package/dist/Witness/Config.d.mts.map +0 -1
  142. package/dist/Witness/Config.d.ts.map +0 -1
  143. package/dist/Witness/Params.d.mts.map +0 -1
  144. package/dist/Witness/Params.d.ts.map +0 -1
  145. package/dist/Witness/Witness.d.mts.map +0 -1
  146. package/dist/Witness/Witness.d.ts.map +0 -1
  147. package/dist/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts.map +0 -1
  148. package/dist/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +0 -1
  149. package/dist/Witness/ffmpeg/fluent/index.d.mts.map +0 -1
  150. package/dist/Witness/ffmpeg/fluent/index.d.ts.map +0 -1
  151. package/dist/Witness/ffmpeg/index.d.mts.map +0 -1
  152. package/dist/Witness/ffmpeg/index.d.ts.map +0 -1
  153. package/dist/Witness/ffmpeg/spawn/executeFfmpeg.d.mts.map +0 -1
  154. package/dist/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +0 -1
  155. package/dist/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts.map +0 -1
  156. package/dist/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +0 -1
  157. package/dist/Witness/ffmpeg/spawn/index.d.mts.map +0 -1
  158. package/dist/Witness/ffmpeg/spawn/index.d.ts.map +0 -1
  159. package/dist/Witness/index.d.mts.map +0 -1
  160. package/dist/Witness/index.d.ts.map +0 -1
  161. package/dist/index.d.mts.map +0 -1
  162. package/dist/index.d.ts.map +0 -1
  163. package/dist/index.js.map +0 -1
  164. /package/dist/{Diviner/Config.d.mts → node/Diviner/Config.d.cts} +0 -0
  165. /package/dist/{Diviner/Config.d.ts → node/Diviner/Config.d.mts} +0 -0
  166. /package/dist/{Diviner/Diviner.d.mts → node/Diviner/Diviner.d.cts} +0 -0
  167. /package/dist/{Diviner/Diviner.d.ts → node/Diviner/Diviner.d.mts} +0 -0
  168. /package/dist/{Diviner/Params.d.mts → node/Diviner/Params.d.cts} +0 -0
  169. /package/dist/{Diviner/Params.d.ts → node/Diviner/Params.d.mts} +0 -0
  170. /package/dist/{Diviner/index.d.mts → node/Diviner/index.d.cts} +0 -0
  171. /package/dist/{Diviner/index.d.ts → node/Diviner/index.d.mts} +0 -0
  172. /package/dist/{Plugin.d.mts → node/Plugin.d.cts} +0 -0
  173. /package/dist/{Plugin.d.ts → node/Plugin.d.mts} +0 -0
  174. /package/dist/{Witness/Config.d.mts → node/Witness/Config.d.cts} +0 -0
  175. /package/dist/{Witness/Config.d.ts → node/Witness/Config.d.mts} +0 -0
  176. /package/dist/{Witness/Params.d.mts → node/Witness/Params.d.cts} +0 -0
  177. /package/dist/{Witness/Params.d.ts → node/Witness/Params.d.mts} +0 -0
  178. /package/dist/{Witness/Witness.d.mts → node/Witness/Witness.d.cts} +0 -0
  179. /package/dist/{Witness/Witness.d.ts → node/Witness/Witness.d.mts} +0 -0
  180. /package/dist/{Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts → node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.cts} +0 -0
  181. /package/dist/{Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts → node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts} +0 -0
  182. /package/dist/{Witness/ffmpeg/fluent/index.d.mts → node/Witness/ffmpeg/fluent/index.d.cts} +0 -0
  183. /package/dist/{Witness/ffmpeg/fluent/index.d.ts → node/Witness/ffmpeg/fluent/index.d.mts} +0 -0
  184. /package/dist/{Witness/ffmpeg/index.d.mts → node/Witness/ffmpeg/index.d.cts} +0 -0
  185. /package/dist/{Witness/ffmpeg/index.d.ts → node/Witness/ffmpeg/index.d.mts} +0 -0
  186. /package/dist/{Witness/ffmpeg/spawn/executeFfmpeg.d.mts → node/Witness/ffmpeg/spawn/executeFfmpeg.d.cts} +0 -0
  187. /package/dist/{Witness/ffmpeg/spawn/executeFfmpeg.d.ts → node/Witness/ffmpeg/spawn/executeFfmpeg.d.mts} +0 -0
  188. /package/dist/{Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts → node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.cts} +0 -0
  189. /package/dist/{Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts → node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts} +0 -0
  190. /package/dist/{Witness/ffmpeg/spawn/index.d.mts → node/Witness/ffmpeg/spawn/index.d.cts} +0 -0
  191. /package/dist/{Witness/ffmpeg/spawn/index.d.ts → node/Witness/ffmpeg/spawn/index.d.mts} +0 -0
  192. /package/dist/{Witness/index.d.mts → node/Witness/index.d.cts} +0 -0
  193. /package/dist/{Witness/index.d.ts → node/Witness/index.d.mts} +0 -0
  194. /package/dist/{index.d.mts → node/index.d.cts} +0 -0
  195. /package/dist/{index.d.ts → node/index.d.mts} +0 -0
@@ -0,0 +1,42 @@
1
+ // src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts
2
+ import { uuid } from "@xyo-network/core";
3
+ import ffmpeg from "fluent-ffmpeg";
4
+ import { unlink, writeFile } from "fs/promises";
5
+ import { tmpdir } from "os";
6
+ import { Writable } from "stream";
7
+ var FfmpegOutputStream = class extends Writable {
8
+ chunks = [];
9
+ constructor(options) {
10
+ super(options);
11
+ }
12
+ _write(chunk, _encoding, callback) {
13
+ this.chunks.push(chunk);
14
+ callback();
15
+ }
16
+ /**
17
+ * Collects the output from ffmpeg into a buffer.
18
+ * @returns A buffer containing the concatenated
19
+ * output from ffmpeg.
20
+ */
21
+ toBuffer = () => Buffer.concat(this.chunks);
22
+ };
23
+ var getVideoFrameAsImageFluent = async (videoBuffer) => {
24
+ const tmpFile = `/${tmpdir()}/${uuid()}`;
25
+ try {
26
+ await writeFile(tmpFile, videoBuffer, { encoding: "binary" });
27
+ const imageBuffer = await new Promise((resolve, reject) => {
28
+ const ffmpegOutput = new FfmpegOutputStream();
29
+ ffmpeg().on("error", (err) => reject(err.message)).on("end", () => resolve(ffmpegOutput.toBuffer())).input(tmpFile).takeFrames(1).withNoAudio().outputOptions("-f image2pipe").videoCodec("png").pipe(ffmpegOutput);
30
+ });
31
+ return imageBuffer;
32
+ } finally {
33
+ try {
34
+ await unlink(tmpFile);
35
+ } catch {
36
+ }
37
+ }
38
+ };
39
+ export {
40
+ getVideoFrameAsImageFluent
41
+ };
42
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts"],"sourcesContent":["import { uuid } from '@xyo-network/core'\nimport ffmpeg from 'fluent-ffmpeg'\nimport { unlink, writeFile } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport { Writable, WritableOptions } from 'stream'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: Buffer) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, videoBuffer, { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // NOTE: Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', (err) => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,OAAO,YAAY;AACnB,SAAS,QAAQ,iBAAiB;AAClC,SAAS,cAAc;AACvB,SAAS,gBAAiC;AAK1C,IAAM,qBAAN,cAAiC,SAAS;AAAA,EACvB,SAAuB,CAAC;AAAA,EAEzC,YAAY,SAA2B;AACrC,UAAM,OAAO;AAAA,EACf;AAAA,EAES,OAAO,OAAc,WAA2B,UAAgD;AACvG,SAAK,OAAO,KAAK,KAAK;AACtB,aAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,MAAM,OAAO,OAAO,KAAK,MAAM;AAC5C;AAOO,IAAM,6BAA6B,OAAO,gBAAwB;AAEvE,QAAM,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;AACtC,MAAI;AAKF,UAAM,UAAU,SAAS,aAAa,EAAE,UAAU,SAAS,CAAC;AAC5D,UAAM,cAAc,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAEjE,YAAM,eAAe,IAAI,mBAAmB;AAE5C,aAAO,EAGJ,GAAG,SAAS,CAAC,QAAQ,OAAO,IAAI,OAAO,CAAC,EAExC,GAAG,OAAO,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC,EAChD,MAAM,OAAO,EACb,WAAW,CAAC,EACZ,YAAY,EACZ,cAAc,eAAe,EAC7B,WAAW,KAAK,EAEhB,KAAK,YAAY;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,EACT,UAAE;AAEA,QAAI;AACF,YAAM,OAAO,OAAO;AAAA,IACtB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Witness/ffmpeg/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Witness/ffmpeg/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './fluent';
2
+ export * from './spawn';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Witness/ffmpeg/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/Witness/ffmpeg/index.ts
31
+ var ffmpeg_exports = {};
32
+ __export(ffmpeg_exports, {
33
+ executeFFmpeg: () => executeFFmpeg,
34
+ getVideoFrameAsImage: () => getVideoFrameAsImage,
35
+ getVideoFrameAsImageFluent: () => getVideoFrameAsImageFluent
36
+ });
37
+ module.exports = __toCommonJS(ffmpeg_exports);
38
+
39
+ // src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts
40
+ var import_core = require("@xyo-network/core");
41
+ var import_fluent_ffmpeg = __toESM(require("fluent-ffmpeg"));
42
+ var import_promises = require("fs/promises");
43
+ var import_os = require("os");
44
+ var import_stream = require("stream");
45
+ var FfmpegOutputStream = class extends import_stream.Writable {
46
+ chunks = [];
47
+ constructor(options) {
48
+ super(options);
49
+ }
50
+ _write(chunk, _encoding, callback) {
51
+ this.chunks.push(chunk);
52
+ callback();
53
+ }
54
+ /**
55
+ * Collects the output from ffmpeg into a buffer.
56
+ * @returns A buffer containing the concatenated
57
+ * output from ffmpeg.
58
+ */
59
+ toBuffer = () => Buffer.concat(this.chunks);
60
+ };
61
+ var getVideoFrameAsImageFluent = async (videoBuffer) => {
62
+ const tmpFile = `/${(0, import_os.tmpdir)()}/${(0, import_core.uuid)()}`;
63
+ try {
64
+ await (0, import_promises.writeFile)(tmpFile, videoBuffer, { encoding: "binary" });
65
+ const imageBuffer = await new Promise((resolve, reject) => {
66
+ const ffmpegOutput = new FfmpegOutputStream();
67
+ (0, import_fluent_ffmpeg.default)().on("error", (err) => reject(err.message)).on("end", () => resolve(ffmpegOutput.toBuffer())).input(tmpFile).takeFrames(1).withNoAudio().outputOptions("-f image2pipe").videoCodec("png").pipe(ffmpegOutput);
68
+ });
69
+ return imageBuffer;
70
+ } finally {
71
+ try {
72
+ await (0, import_promises.unlink)(tmpFile);
73
+ } catch {
74
+ }
75
+ }
76
+ };
77
+
78
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
79
+ var import_child_process = require("child_process");
80
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
81
+ return new Promise((resolve, reject) => {
82
+ const imageData = [];
83
+ const ffmpeg2 = (0, import_child_process.spawn)("ffmpeg", ffmpegArgs);
84
+ ffmpeg2.stdout.on("data", (data) => imageData.push(data));
85
+ ffmpeg2.stdin.on("error", () => {
86
+ });
87
+ ffmpeg2.on("close", (code) => {
88
+ if (code !== 0) {
89
+ reject(new Error(`FFmpeg exited with code ${code}`));
90
+ } else {
91
+ resolve(Buffer.concat(imageData));
92
+ }
93
+ });
94
+ ffmpeg2.stdin.end(videoBuffer);
95
+ });
96
+ };
97
+
98
+ // src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts
99
+ var getVideoFrameAsImage = async (videoBuffer) => {
100
+ const imageBuffer = await executeFFmpeg(videoBuffer, ["-i", "pipe:", "-ss", "00:00:00", "-vframes", "1", "-f", "image2pipe", "-"]);
101
+ return imageBuffer;
102
+ };
103
+ // Annotate the CommonJS export names for ESM import in node:
104
+ 0 && (module.exports = {
105
+ executeFFmpeg,
106
+ getVideoFrameAsImage,
107
+ getVideoFrameAsImageFluent
108
+ });
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/Witness/ffmpeg/index.ts","../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts","../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts","../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"sourcesContent":["export * from './fluent'\nexport * from './spawn'\n","import { uuid } from '@xyo-network/core'\nimport ffmpeg from 'fluent-ffmpeg'\nimport { unlink, writeFile } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport { Writable, WritableOptions } from 'stream'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: Buffer) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, videoBuffer, { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // NOTE: Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', (err) => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n","import { spawn } from 'child_process'\n\n/**\n * Execute FFmpeg with the provided arguments.\n * @param videoBuffer Input video buffer.\n * @param ffmpegArgs FFmpeg arguments.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {\n return new Promise((resolve, reject) => {\n const imageData: Buffer[] = []\n const ffmpeg = spawn('ffmpeg', ffmpegArgs)\n ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))\n // TODO: This is required as we're seeing errors thrown due to\n // how we're piping the data to ffmpeg. Works perfectly though.\n ffmpeg.stdin.on('error', () => {})\n ffmpeg.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`FFmpeg exited with code ${code}`))\n } else {\n resolve(Buffer.concat(imageData))\n }\n })\n // Pipe the input stream to ffmpeg's stdin\n ffmpeg.stdin.end(videoBuffer)\n })\n}\n","import { executeFFmpeg } from './executeFfmpeg'\n\n/**\n * Execute FFmpeg with provided input buffer and return video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImage = async (videoBuffer: Buffer) => {\n const imageBuffer = await executeFFmpeg(videoBuffer, ['-i', 'pipe:', '-ss', '00:00:00', '-vframes', '1', '-f', 'image2pipe', '-'])\n return imageBuffer\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAqB;AACrB,2BAAmB;AACnB,sBAAkC;AAClC,gBAAuB;AACvB,oBAA0C;AAK1C,IAAM,qBAAN,cAAiC,uBAAS;AAAA,EACvB,SAAuB,CAAC;AAAA,EAEzC,YAAY,SAA2B;AACrC,UAAM,OAAO;AAAA,EACf;AAAA,EAES,OAAO,OAAc,WAA2B,UAAgD;AACvG,SAAK,OAAO,KAAK,KAAK;AACtB,aAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,MAAM,OAAO,OAAO,KAAK,MAAM;AAC5C;AAOO,IAAM,6BAA6B,OAAO,gBAAwB;AAEvE,QAAM,UAAU,QAAI,kBAAO,CAAC,QAAI,kBAAK,CAAC;AACtC,MAAI;AAKF,cAAM,2BAAU,SAAS,aAAa,EAAE,UAAU,SAAS,CAAC;AAC5D,UAAM,cAAc,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAEjE,YAAM,eAAe,IAAI,mBAAmB;AAE5C,+BAAAA,SAAO,EAGJ,GAAG,SAAS,CAAC,QAAQ,OAAO,IAAI,OAAO,CAAC,EAExC,GAAG,OAAO,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC,EAChD,MAAM,OAAO,EACb,WAAW,CAAC,EACZ,YAAY,EACZ,cAAc,eAAe,EAC7B,WAAW,KAAK,EAEhB,KAAK,YAAY;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,EACT,UAAE;AAEA,QAAI;AACF,gBAAM,wBAAO,OAAO;AAAA,IACtB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ACtEA,2BAAsB;AAQf,IAAM,gBAAgB,CAAC,aAAqB,eAA0C;AAC3F,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAsB,CAAC;AAC7B,UAAMC,cAAS,4BAAM,UAAU,UAAU;AACzC,IAAAA,QAAO,OAAO,GAAG,QAAQ,CAAC,SAAiB,UAAU,KAAK,IAAI,CAAC;AAG/D,IAAAA,QAAO,MAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AACjC,IAAAA,QAAO,GAAG,SAAS,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAED,IAAAA,QAAO,MAAM,IAAI,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACnBO,IAAM,uBAAuB,OAAO,gBAAwB;AACjE,QAAM,cAAc,MAAM,cAAc,aAAa,CAAC,MAAM,SAAS,OAAO,YAAY,YAAY,KAAK,MAAM,cAAc,GAAG,CAAC;AACjI,SAAO;AACT;","names":["ffmpeg","ffmpeg"]}
@@ -0,0 +1,70 @@
1
+ // src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts
2
+ import { uuid } from "@xyo-network/core";
3
+ import ffmpeg from "fluent-ffmpeg";
4
+ import { unlink, writeFile } from "fs/promises";
5
+ import { tmpdir } from "os";
6
+ import { Writable } from "stream";
7
+ var FfmpegOutputStream = class extends Writable {
8
+ chunks = [];
9
+ constructor(options) {
10
+ super(options);
11
+ }
12
+ _write(chunk, _encoding, callback) {
13
+ this.chunks.push(chunk);
14
+ callback();
15
+ }
16
+ /**
17
+ * Collects the output from ffmpeg into a buffer.
18
+ * @returns A buffer containing the concatenated
19
+ * output from ffmpeg.
20
+ */
21
+ toBuffer = () => Buffer.concat(this.chunks);
22
+ };
23
+ var getVideoFrameAsImageFluent = async (videoBuffer) => {
24
+ const tmpFile = `/${tmpdir()}/${uuid()}`;
25
+ try {
26
+ await writeFile(tmpFile, videoBuffer, { encoding: "binary" });
27
+ const imageBuffer = await new Promise((resolve, reject) => {
28
+ const ffmpegOutput = new FfmpegOutputStream();
29
+ ffmpeg().on("error", (err) => reject(err.message)).on("end", () => resolve(ffmpegOutput.toBuffer())).input(tmpFile).takeFrames(1).withNoAudio().outputOptions("-f image2pipe").videoCodec("png").pipe(ffmpegOutput);
30
+ });
31
+ return imageBuffer;
32
+ } finally {
33
+ try {
34
+ await unlink(tmpFile);
35
+ } catch {
36
+ }
37
+ }
38
+ };
39
+
40
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
41
+ import { spawn } from "child_process";
42
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
43
+ return new Promise((resolve, reject) => {
44
+ const imageData = [];
45
+ const ffmpeg2 = spawn("ffmpeg", ffmpegArgs);
46
+ ffmpeg2.stdout.on("data", (data) => imageData.push(data));
47
+ ffmpeg2.stdin.on("error", () => {
48
+ });
49
+ ffmpeg2.on("close", (code) => {
50
+ if (code !== 0) {
51
+ reject(new Error(`FFmpeg exited with code ${code}`));
52
+ } else {
53
+ resolve(Buffer.concat(imageData));
54
+ }
55
+ });
56
+ ffmpeg2.stdin.end(videoBuffer);
57
+ });
58
+ };
59
+
60
+ // src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts
61
+ var getVideoFrameAsImage = async (videoBuffer) => {
62
+ const imageBuffer = await executeFFmpeg(videoBuffer, ["-i", "pipe:", "-ss", "00:00:00", "-vframes", "1", "-f", "image2pipe", "-"]);
63
+ return imageBuffer;
64
+ };
65
+ export {
66
+ executeFFmpeg,
67
+ getVideoFrameAsImage,
68
+ getVideoFrameAsImageFluent
69
+ };
70
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts","../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts","../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"sourcesContent":["import { uuid } from '@xyo-network/core'\nimport ffmpeg from 'fluent-ffmpeg'\nimport { unlink, writeFile } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport { Writable, WritableOptions } from 'stream'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: Buffer) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, videoBuffer, { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // NOTE: Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', (err) => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n","import { spawn } from 'child_process'\n\n/**\n * Execute FFmpeg with the provided arguments.\n * @param videoBuffer Input video buffer.\n * @param ffmpegArgs FFmpeg arguments.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {\n return new Promise((resolve, reject) => {\n const imageData: Buffer[] = []\n const ffmpeg = spawn('ffmpeg', ffmpegArgs)\n ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))\n // TODO: This is required as we're seeing errors thrown due to\n // how we're piping the data to ffmpeg. Works perfectly though.\n ffmpeg.stdin.on('error', () => {})\n ffmpeg.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`FFmpeg exited with code ${code}`))\n } else {\n resolve(Buffer.concat(imageData))\n }\n })\n // Pipe the input stream to ffmpeg's stdin\n ffmpeg.stdin.end(videoBuffer)\n })\n}\n","import { executeFFmpeg } from './executeFfmpeg'\n\n/**\n * Execute FFmpeg with provided input buffer and return video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImage = async (videoBuffer: Buffer) => {\n const imageBuffer = await executeFFmpeg(videoBuffer, ['-i', 'pipe:', '-ss', '00:00:00', '-vframes', '1', '-f', 'image2pipe', '-'])\n return imageBuffer\n}\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,OAAO,YAAY;AACnB,SAAS,QAAQ,iBAAiB;AAClC,SAAS,cAAc;AACvB,SAAS,gBAAiC;AAK1C,IAAM,qBAAN,cAAiC,SAAS;AAAA,EACvB,SAAuB,CAAC;AAAA,EAEzC,YAAY,SAA2B;AACrC,UAAM,OAAO;AAAA,EACf;AAAA,EAES,OAAO,OAAc,WAA2B,UAAgD;AACvG,SAAK,OAAO,KAAK,KAAK;AACtB,aAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,MAAM,OAAO,OAAO,KAAK,MAAM;AAC5C;AAOO,IAAM,6BAA6B,OAAO,gBAAwB;AAEvE,QAAM,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;AACtC,MAAI;AAKF,UAAM,UAAU,SAAS,aAAa,EAAE,UAAU,SAAS,CAAC;AAC5D,UAAM,cAAc,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAEjE,YAAM,eAAe,IAAI,mBAAmB;AAE5C,aAAO,EAGJ,GAAG,SAAS,CAAC,QAAQ,OAAO,IAAI,OAAO,CAAC,EAExC,GAAG,OAAO,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC,EAChD,MAAM,OAAO,EACb,WAAW,CAAC,EACZ,YAAY,EACZ,cAAc,eAAe,EAC7B,WAAW,KAAK,EAEhB,KAAK,YAAY;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,EACT,UAAE;AAEA,QAAI;AACF,YAAM,OAAO,OAAO;AAAA,IACtB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;ACtEA,SAAS,aAAa;AAQf,IAAM,gBAAgB,CAAC,aAAqB,eAA0C;AAC3F,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAsB,CAAC;AAC7B,UAAMA,UAAS,MAAM,UAAU,UAAU;AACzC,IAAAA,QAAO,OAAO,GAAG,QAAQ,CAAC,SAAiB,UAAU,KAAK,IAAI,CAAC;AAG/D,IAAAA,QAAO,MAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AACjC,IAAAA,QAAO,GAAG,SAAS,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAED,IAAAA,QAAO,MAAM,IAAI,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACnBO,IAAM,uBAAuB,OAAO,gBAAwB;AACjE,QAAM,cAAc,MAAM,cAAc,aAAa,CAAC,MAAM,SAAS,OAAO,YAAY,YAAY,KAAK,MAAM,cAAc,GAAG,CAAC;AACjI,SAAO;AACT;","names":["ffmpeg"]}
@@ -0,0 +1 @@
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"}
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Execute FFmpeg with the provided arguments.
4
+ * @param videoBuffer Input video buffer.
5
+ * @param ffmpegArgs FFmpeg arguments.
6
+ * @returns Output buffer containing the video thumbnail image.
7
+ */
8
+ export declare const executeFFmpeg: (videoBuffer: Buffer, ffmpegArgs: string[]) => Promise<Buffer>;
9
+ //# sourceMappingURL=executeFfmpeg.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
21
+ var executeFfmpeg_exports = {};
22
+ __export(executeFfmpeg_exports, {
23
+ executeFFmpeg: () => executeFFmpeg
24
+ });
25
+ module.exports = __toCommonJS(executeFfmpeg_exports);
26
+ var import_child_process = require("child_process");
27
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
28
+ return new Promise((resolve, reject) => {
29
+ const imageData = [];
30
+ const ffmpeg = (0, import_child_process.spawn)("ffmpeg", ffmpegArgs);
31
+ ffmpeg.stdout.on("data", (data) => imageData.push(data));
32
+ ffmpeg.stdin.on("error", () => {
33
+ });
34
+ ffmpeg.on("close", (code) => {
35
+ if (code !== 0) {
36
+ reject(new Error(`FFmpeg exited with code ${code}`));
37
+ } else {
38
+ resolve(Buffer.concat(imageData));
39
+ }
40
+ });
41
+ ffmpeg.stdin.end(videoBuffer);
42
+ });
43
+ };
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ executeFFmpeg
47
+ });
48
+ //# sourceMappingURL=executeFfmpeg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"sourcesContent":["import { spawn } from 'child_process'\n\n/**\n * Execute FFmpeg with the provided arguments.\n * @param videoBuffer Input video buffer.\n * @param ffmpegArgs FFmpeg arguments.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {\n return new Promise((resolve, reject) => {\n const imageData: Buffer[] = []\n const ffmpeg = spawn('ffmpeg', ffmpegArgs)\n ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))\n // TODO: This is required as we're seeing errors thrown due to\n // how we're piping the data to ffmpeg. Works perfectly though.\n ffmpeg.stdin.on('error', () => {})\n ffmpeg.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`FFmpeg exited with code ${code}`))\n } else {\n resolve(Buffer.concat(imageData))\n }\n })\n // Pipe the input stream to ffmpeg's stdin\n ffmpeg.stdin.end(videoBuffer)\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAsB;AAQf,IAAM,gBAAgB,CAAC,aAAqB,eAA0C;AAC3F,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAsB,CAAC;AAC7B,UAAM,aAAS,4BAAM,UAAU,UAAU;AACzC,WAAO,OAAO,GAAG,QAAQ,CAAC,SAAiB,UAAU,KAAK,IAAI,CAAC;AAG/D,WAAO,MAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO,GAAG,SAAS,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAED,WAAO,MAAM,IAAI,WAAW;AAAA,EAC9B,CAAC;AACH;","names":[]}
@@ -0,0 +1,23 @@
1
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
2
+ import { spawn } from "child_process";
3
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
4
+ return new Promise((resolve, reject) => {
5
+ const imageData = [];
6
+ const ffmpeg = spawn("ffmpeg", ffmpegArgs);
7
+ ffmpeg.stdout.on("data", (data) => imageData.push(data));
8
+ ffmpeg.stdin.on("error", () => {
9
+ });
10
+ ffmpeg.on("close", (code) => {
11
+ if (code !== 0) {
12
+ reject(new Error(`FFmpeg exited with code ${code}`));
13
+ } else {
14
+ resolve(Buffer.concat(imageData));
15
+ }
16
+ });
17
+ ffmpeg.stdin.end(videoBuffer);
18
+ });
19
+ };
20
+ export {
21
+ executeFFmpeg
22
+ };
23
+ //# sourceMappingURL=executeFfmpeg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"sourcesContent":["import { spawn } from 'child_process'\n\n/**\n * Execute FFmpeg with the provided arguments.\n * @param videoBuffer Input video buffer.\n * @param ffmpegArgs FFmpeg arguments.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {\n return new Promise((resolve, reject) => {\n const imageData: Buffer[] = []\n const ffmpeg = spawn('ffmpeg', ffmpegArgs)\n ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))\n // TODO: This is required as we're seeing errors thrown due to\n // how we're piping the data to ffmpeg. Works perfectly though.\n ffmpeg.stdin.on('error', () => {})\n ffmpeg.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`FFmpeg exited with code ${code}`))\n } else {\n resolve(Buffer.concat(imageData))\n }\n })\n // Pipe the input stream to ffmpeg's stdin\n ffmpeg.stdin.end(videoBuffer)\n })\n}\n"],"mappings":";AAAA,SAAS,aAAa;AAQf,IAAM,gBAAgB,CAAC,aAAqB,eAA0C;AAC3F,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAsB,CAAC;AAC7B,UAAM,SAAS,MAAM,UAAU,UAAU;AACzC,WAAO,OAAO,GAAG,QAAQ,CAAC,SAAiB,UAAU,KAAK,IAAI,CAAC;AAG/D,WAAO,MAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO,GAAG,SAAS,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAED,WAAO,MAAM,IAAI,WAAW;AAAA,EAC9B,CAAC;AACH;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVideoFrameAsImage.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gBAAuB,MAAM,oBAG7D,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVideoFrameAsImage.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gBAAuB,MAAM,oBAG7D,CAAA"}
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Execute FFmpeg with provided input buffer and return video thumbnail image.
4
+ * @param videoBuffer Input video buffer.
5
+ * @returns Output buffer containing the video thumbnail image.
6
+ */
7
+ export declare const getVideoFrameAsImage: (videoBuffer: Buffer) => Promise<Buffer>;
8
+ //# sourceMappingURL=getVideoFrameAsImage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVideoFrameAsImage.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gBAAuB,MAAM,oBAG7D,CAAA"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts
21
+ var getVideoFrameAsImage_exports = {};
22
+ __export(getVideoFrameAsImage_exports, {
23
+ getVideoFrameAsImage: () => getVideoFrameAsImage
24
+ });
25
+ module.exports = __toCommonJS(getVideoFrameAsImage_exports);
26
+
27
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
28
+ var import_child_process = require("child_process");
29
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
30
+ return new Promise((resolve, reject) => {
31
+ const imageData = [];
32
+ const ffmpeg = (0, import_child_process.spawn)("ffmpeg", ffmpegArgs);
33
+ ffmpeg.stdout.on("data", (data) => imageData.push(data));
34
+ ffmpeg.stdin.on("error", () => {
35
+ });
36
+ ffmpeg.on("close", (code) => {
37
+ if (code !== 0) {
38
+ reject(new Error(`FFmpeg exited with code ${code}`));
39
+ } else {
40
+ resolve(Buffer.concat(imageData));
41
+ }
42
+ });
43
+ ffmpeg.stdin.end(videoBuffer);
44
+ });
45
+ };
46
+
47
+ // src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts
48
+ var getVideoFrameAsImage = async (videoBuffer) => {
49
+ const imageBuffer = await executeFFmpeg(videoBuffer, ["-i", "pipe:", "-ss", "00:00:00", "-vframes", "1", "-f", "image2pipe", "-"]);
50
+ return imageBuffer;
51
+ };
52
+ // Annotate the CommonJS export names for ESM import in node:
53
+ 0 && (module.exports = {
54
+ getVideoFrameAsImage
55
+ });
56
+ //# sourceMappingURL=getVideoFrameAsImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts","../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts"],"sourcesContent":["import { executeFFmpeg } from './executeFfmpeg'\n\n/**\n * Execute FFmpeg with provided input buffer and return video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImage = async (videoBuffer: Buffer) => {\n const imageBuffer = await executeFFmpeg(videoBuffer, ['-i', 'pipe:', '-ss', '00:00:00', '-vframes', '1', '-f', 'image2pipe', '-'])\n return imageBuffer\n}\n","import { spawn } from 'child_process'\n\n/**\n * Execute FFmpeg with the provided arguments.\n * @param videoBuffer Input video buffer.\n * @param ffmpegArgs FFmpeg arguments.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {\n return new Promise((resolve, reject) => {\n const imageData: Buffer[] = []\n const ffmpeg = spawn('ffmpeg', ffmpegArgs)\n ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))\n // TODO: This is required as we're seeing errors thrown due to\n // how we're piping the data to ffmpeg. Works perfectly though.\n ffmpeg.stdin.on('error', () => {})\n ffmpeg.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`FFmpeg exited with code ${code}`))\n } else {\n resolve(Buffer.concat(imageData))\n }\n })\n // Pipe the input stream to ffmpeg's stdin\n ffmpeg.stdin.end(videoBuffer)\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,2BAAsB;AAQf,IAAM,gBAAgB,CAAC,aAAqB,eAA0C;AAC3F,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAsB,CAAC;AAC7B,UAAM,aAAS,4BAAM,UAAU,UAAU;AACzC,WAAO,OAAO,GAAG,QAAQ,CAAC,SAAiB,UAAU,KAAK,IAAI,CAAC;AAG/D,WAAO,MAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO,GAAG,SAAS,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAED,WAAO,MAAM,IAAI,WAAW;AAAA,EAC9B,CAAC;AACH;;;ADnBO,IAAM,uBAAuB,OAAO,gBAAwB;AACjE,QAAM,cAAc,MAAM,cAAc,aAAa,CAAC,MAAM,SAAS,OAAO,YAAY,YAAY,KAAK,MAAM,cAAc,GAAG,CAAC;AACjI,SAAO;AACT;","names":[]}
@@ -0,0 +1,29 @@
1
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
2
+ import { spawn } from "child_process";
3
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
4
+ return new Promise((resolve, reject) => {
5
+ const imageData = [];
6
+ const ffmpeg = spawn("ffmpeg", ffmpegArgs);
7
+ ffmpeg.stdout.on("data", (data) => imageData.push(data));
8
+ ffmpeg.stdin.on("error", () => {
9
+ });
10
+ ffmpeg.on("close", (code) => {
11
+ if (code !== 0) {
12
+ reject(new Error(`FFmpeg exited with code ${code}`));
13
+ } else {
14
+ resolve(Buffer.concat(imageData));
15
+ }
16
+ });
17
+ ffmpeg.stdin.end(videoBuffer);
18
+ });
19
+ };
20
+
21
+ // src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts
22
+ var getVideoFrameAsImage = async (videoBuffer) => {
23
+ const imageBuffer = await executeFFmpeg(videoBuffer, ["-i", "pipe:", "-ss", "00:00:00", "-vframes", "1", "-f", "image2pipe", "-"]);
24
+ return imageBuffer;
25
+ };
26
+ export {
27
+ getVideoFrameAsImage
28
+ };
29
+ //# sourceMappingURL=getVideoFrameAsImage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts","../../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"sourcesContent":["import { spawn } from 'child_process'\n\n/**\n * Execute FFmpeg with the provided arguments.\n * @param videoBuffer Input video buffer.\n * @param ffmpegArgs FFmpeg arguments.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {\n return new Promise((resolve, reject) => {\n const imageData: Buffer[] = []\n const ffmpeg = spawn('ffmpeg', ffmpegArgs)\n ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))\n // TODO: This is required as we're seeing errors thrown due to\n // how we're piping the data to ffmpeg. Works perfectly though.\n ffmpeg.stdin.on('error', () => {})\n ffmpeg.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`FFmpeg exited with code ${code}`))\n } else {\n resolve(Buffer.concat(imageData))\n }\n })\n // Pipe the input stream to ffmpeg's stdin\n ffmpeg.stdin.end(videoBuffer)\n })\n}\n","import { executeFFmpeg } from './executeFfmpeg'\n\n/**\n * Execute FFmpeg with provided input buffer and return video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImage = async (videoBuffer: Buffer) => {\n const imageBuffer = await executeFFmpeg(videoBuffer, ['-i', 'pipe:', '-ss', '00:00:00', '-vframes', '1', '-f', 'image2pipe', '-'])\n return imageBuffer\n}\n"],"mappings":";AAAA,SAAS,aAAa;AAQf,IAAM,gBAAgB,CAAC,aAAqB,eAA0C;AAC3F,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAsB,CAAC;AAC7B,UAAM,SAAS,MAAM,UAAU,UAAU;AACzC,WAAO,OAAO,GAAG,QAAQ,CAAC,SAAiB,UAAU,KAAK,IAAI,CAAC;AAG/D,WAAO,MAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO,GAAG,SAAS,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAED,WAAO,MAAM,IAAI,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACnBO,IAAM,uBAAuB,OAAO,gBAAwB;AACjE,QAAM,cAAc,MAAM,cAAc,aAAa,CAAC,MAAM,SAAS,OAAO,YAAY,YAAY,KAAK,MAAM,cAAc,GAAG,CAAC;AACjI,SAAO;AACT;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './executeFfmpeg';
2
+ export * from './getVideoFrameAsImage';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/spawn/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/Witness/ffmpeg/spawn/index.ts
21
+ var spawn_exports = {};
22
+ __export(spawn_exports, {
23
+ executeFFmpeg: () => executeFFmpeg,
24
+ getVideoFrameAsImage: () => getVideoFrameAsImage
25
+ });
26
+ module.exports = __toCommonJS(spawn_exports);
27
+
28
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
29
+ var import_child_process = require("child_process");
30
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
31
+ return new Promise((resolve, reject) => {
32
+ const imageData = [];
33
+ const ffmpeg = (0, import_child_process.spawn)("ffmpeg", ffmpegArgs);
34
+ ffmpeg.stdout.on("data", (data) => imageData.push(data));
35
+ ffmpeg.stdin.on("error", () => {
36
+ });
37
+ ffmpeg.on("close", (code) => {
38
+ if (code !== 0) {
39
+ reject(new Error(`FFmpeg exited with code ${code}`));
40
+ } else {
41
+ resolve(Buffer.concat(imageData));
42
+ }
43
+ });
44
+ ffmpeg.stdin.end(videoBuffer);
45
+ });
46
+ };
47
+
48
+ // src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts
49
+ var getVideoFrameAsImage = async (videoBuffer) => {
50
+ const imageBuffer = await executeFFmpeg(videoBuffer, ["-i", "pipe:", "-ss", "00:00:00", "-vframes", "1", "-f", "image2pipe", "-"]);
51
+ return imageBuffer;
52
+ };
53
+ // Annotate the CommonJS export names for ESM import in node:
54
+ 0 && (module.exports = {
55
+ executeFFmpeg,
56
+ getVideoFrameAsImage
57
+ });
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/Witness/ffmpeg/spawn/index.ts","../../../../../src/Witness/ffmpeg/spawn/executeFfmpeg.ts","../../../../../src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts"],"sourcesContent":["export * from './executeFfmpeg'\nexport * from './getVideoFrameAsImage'\n","import { spawn } from 'child_process'\n\n/**\n * Execute FFmpeg with the provided arguments.\n * @param videoBuffer Input video buffer.\n * @param ffmpegArgs FFmpeg arguments.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const executeFFmpeg = (videoBuffer: Buffer, ffmpegArgs: string[]): Promise<Buffer> => {\n return new Promise((resolve, reject) => {\n const imageData: Buffer[] = []\n const ffmpeg = spawn('ffmpeg', ffmpegArgs)\n ffmpeg.stdout.on('data', (data: Buffer) => imageData.push(data))\n // TODO: This is required as we're seeing errors thrown due to\n // how we're piping the data to ffmpeg. Works perfectly though.\n ffmpeg.stdin.on('error', () => {})\n ffmpeg.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`FFmpeg exited with code ${code}`))\n } else {\n resolve(Buffer.concat(imageData))\n }\n })\n // Pipe the input stream to ffmpeg's stdin\n ffmpeg.stdin.end(videoBuffer)\n })\n}\n","import { executeFFmpeg } from './executeFfmpeg'\n\n/**\n * Execute FFmpeg with provided input buffer and return video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImage = async (videoBuffer: Buffer) => {\n const imageBuffer = await executeFFmpeg(videoBuffer, ['-i', 'pipe:', '-ss', '00:00:00', '-vframes', '1', '-f', 'image2pipe', '-'])\n return imageBuffer\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,2BAAsB;AAQf,IAAM,gBAAgB,CAAC,aAAqB,eAA0C;AAC3F,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,YAAsB,CAAC;AAC7B,UAAM,aAAS,4BAAM,UAAU,UAAU;AACzC,WAAO,OAAO,GAAG,QAAQ,CAAC,SAAiB,UAAU,KAAK,IAAI,CAAC;AAG/D,WAAO,MAAM,GAAG,SAAS,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO,GAAG,SAAS,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAED,WAAO,MAAM,IAAI,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACnBO,IAAM,uBAAuB,OAAO,gBAAwB;AACjE,QAAM,cAAc,MAAM,cAAc,aAAa,CAAC,MAAM,SAAS,OAAO,YAAY,YAAY,KAAK,MAAM,cAAc,GAAG,CAAC;AACjI,SAAO;AACT;","names":[]}
@@ -0,0 +1,30 @@
1
+ // src/Witness/ffmpeg/spawn/executeFfmpeg.ts
2
+ import { spawn } from "child_process";
3
+ var executeFFmpeg = (videoBuffer, ffmpegArgs) => {
4
+ return new Promise((resolve, reject) => {
5
+ const imageData = [];
6
+ const ffmpeg = spawn("ffmpeg", ffmpegArgs);
7
+ ffmpeg.stdout.on("data", (data) => imageData.push(data));
8
+ ffmpeg.stdin.on("error", () => {
9
+ });
10
+ ffmpeg.on("close", (code) => {
11
+ if (code !== 0) {
12
+ reject(new Error(`FFmpeg exited with code ${code}`));
13
+ } else {
14
+ resolve(Buffer.concat(imageData));
15
+ }
16
+ });
17
+ ffmpeg.stdin.end(videoBuffer);
18
+ });
19
+ };
20
+
21
+ // src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts
22
+ var getVideoFrameAsImage = async (videoBuffer) => {
23
+ const imageBuffer = await executeFFmpeg(videoBuffer, ["-i", "pipe:", "-ss", "00:00:00", "-vframes", "1", "-f", "image2pipe", "-"]);
24
+ return imageBuffer;
25
+ };
26
+ export {
27
+ executeFFmpeg,
28
+ getVideoFrameAsImage
29
+ };
30
+ //# sourceMappingURL=index.mjs.map