@xyo-network/image-thumbnail-plugin 2.73.2 → 2.73.4
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/docs.json +567 -550
- package/dist/index.d.mts +245 -0
- package/dist/index.d.ts +245 -0
- package/dist/index.js +565 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +524 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -31
- package/src/Diviner/Config.ts +1 -1
- package/src/Diviner/Diviner.ts +5 -1
- package/src/Witness/Witness.ts +8 -5
- package/tsup.config.ts +16 -0
- package/dist/cjs/Diviner/Config.js +0 -6
- package/dist/cjs/Diviner/Config.js.map +0 -1
- package/dist/cjs/Diviner/Diviner.js +0 -204
- package/dist/cjs/Diviner/Diviner.js.map +0 -1
- package/dist/cjs/Diviner/Params.js +0 -3
- package/dist/cjs/Diviner/Params.js.map +0 -1
- package/dist/cjs/Diviner/index.js +0 -7
- package/dist/cjs/Diviner/index.js.map +0 -1
- package/dist/cjs/Plugin.js +0 -21
- package/dist/cjs/Plugin.js.map +0 -1
- package/dist/cjs/Witness/Config.js +0 -6
- package/dist/cjs/Witness/Config.js.map +0 -1
- package/dist/cjs/Witness/Params.js +0 -3
- package/dist/cjs/Witness/Params.js.map +0 -1
- package/dist/cjs/Witness/Witness.js +0 -321
- package/dist/cjs/Witness/Witness.js.map +0 -1
- package/dist/cjs/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +0 -74
- package/dist/cjs/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +0 -1
- package/dist/cjs/Witness/ffmpeg/fluent/index.js +0 -5
- package/dist/cjs/Witness/ffmpeg/fluent/index.js.map +0 -1
- package/dist/cjs/Witness/ffmpeg/index.js +0 -6
- package/dist/cjs/Witness/ffmpeg/index.js.map +0 -1
- package/dist/cjs/Witness/ffmpeg/spawn/executeFfmpeg.js +0 -32
- package/dist/cjs/Witness/ffmpeg/spawn/executeFfmpeg.js.map +0 -1
- package/dist/cjs/Witness/ffmpeg/spawn/getVideoFrameAsImage.js +0 -16
- package/dist/cjs/Witness/ffmpeg/spawn/getVideoFrameAsImage.js.map +0 -1
- package/dist/cjs/Witness/ffmpeg/spawn/index.js +0 -6
- package/dist/cjs/Witness/ffmpeg/spawn/index.js.map +0 -1
- package/dist/cjs/Witness/index.js +0 -7
- package/dist/cjs/Witness/index.js.map +0 -1
- package/dist/cjs/index.js +0 -11
- package/dist/cjs/index.js.map +0 -1
- package/dist/esm/Diviner/Config.js +0 -3
- package/dist/esm/Diviner/Config.js.map +0 -1
- package/dist/esm/Diviner/Diviner.js +0 -179
- package/dist/esm/Diviner/Diviner.js.map +0 -1
- package/dist/esm/Diviner/Params.js +0 -2
- package/dist/esm/Diviner/Params.js.map +0 -1
- package/dist/esm/Diviner/index.js +0 -4
- package/dist/esm/Diviner/index.js.map +0 -1
- package/dist/esm/Plugin.js +0 -16
- package/dist/esm/Plugin.js.map +0 -1
- package/dist/esm/Witness/Config.js +0 -3
- package/dist/esm/Witness/Config.js.map +0 -1
- package/dist/esm/Witness/Params.js +0 -2
- package/dist/esm/Witness/Params.js.map +0 -1
- package/dist/esm/Witness/Witness.js +0 -292
- package/dist/esm/Witness/Witness.js.map +0 -1
- package/dist/esm/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +0 -69
- package/dist/esm/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +0 -1
- package/dist/esm/Witness/ffmpeg/fluent/index.js +0 -2
- package/dist/esm/Witness/ffmpeg/fluent/index.js.map +0 -1
- package/dist/esm/Witness/ffmpeg/index.js +0 -3
- package/dist/esm/Witness/ffmpeg/index.js.map +0 -1
- package/dist/esm/Witness/ffmpeg/spawn/executeFfmpeg.js +0 -28
- package/dist/esm/Witness/ffmpeg/spawn/executeFfmpeg.js.map +0 -1
- package/dist/esm/Witness/ffmpeg/spawn/getVideoFrameAsImage.js +0 -11
- package/dist/esm/Witness/ffmpeg/spawn/getVideoFrameAsImage.js.map +0 -1
- package/dist/esm/Witness/ffmpeg/spawn/index.js +0 -3
- package/dist/esm/Witness/ffmpeg/spawn/index.js.map +0 -1
- package/dist/esm/Witness/index.js +0 -4
- package/dist/esm/Witness/index.js.map +0 -1
- package/dist/esm/index.js +0 -7
- package/dist/esm/index.js.map +0 -1
- package/dist/types/Diviner/Config.d.ts +0 -11
- package/dist/types/Diviner/Config.d.ts.map +0 -1
- package/dist/types/Diviner/Diviner.d.ts +0 -30
- package/dist/types/Diviner/Diviner.d.ts.map +0 -1
- package/dist/types/Diviner/Params.d.ts +0 -5
- package/dist/types/Diviner/Params.d.ts.map +0 -1
- package/dist/types/Diviner/index.d.ts +0 -4
- package/dist/types/Diviner/index.d.ts.map +0 -1
- package/dist/types/Plugin.d.ts +0 -116
- package/dist/types/Plugin.d.ts.map +0 -1
- package/dist/types/Witness/Config.d.ts +0 -16
- package/dist/types/Witness/Config.d.ts.map +0 -1
- package/dist/types/Witness/Params.d.ts +0 -7
- package/dist/types/Witness/Params.d.ts.map +0 -1
- package/dist/types/Witness/Witness.d.ts +0 -66
- package/dist/types/Witness/Witness.d.ts.map +0 -1
- package/dist/types/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts +0 -8
- package/dist/types/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +0 -1
- package/dist/types/Witness/ffmpeg/fluent/index.d.ts +0 -2
- package/dist/types/Witness/ffmpeg/fluent/index.d.ts.map +0 -1
- package/dist/types/Witness/ffmpeg/index.d.ts +0 -3
- package/dist/types/Witness/ffmpeg/index.d.ts.map +0 -1
- package/dist/types/Witness/ffmpeg/spawn/executeFfmpeg.d.ts +0 -9
- package/dist/types/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +0 -1
- package/dist/types/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts +0 -8
- package/dist/types/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +0 -1
- package/dist/types/Witness/ffmpeg/spawn/index.d.ts +0 -3
- package/dist/types/Witness/ffmpeg/spawn/index.d.ts.map +0 -1
- package/dist/types/Witness/index.d.ts +0 -4
- package/dist/types/Witness/index.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -6
- package/dist/types/index.d.ts.map +0 -1
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import { assertEx } from '@xylabs/assert';
|
|
2
|
-
import { delay } from '@xylabs/delay';
|
|
3
|
-
import { compact } from '@xylabs/lodash';
|
|
4
|
-
import { AbstractDiviner } from '@xyo-network/abstract-diviner';
|
|
5
|
-
import { asArchivistInstance } from '@xyo-network/archivist-model';
|
|
6
|
-
import { PayloadHasher } from '@xyo-network/core';
|
|
7
|
-
import { asDivinerInstance, DivinerConfigSchema } from '@xyo-network/diviner-model';
|
|
8
|
-
import { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model';
|
|
9
|
-
import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin';
|
|
10
|
-
import { ImageThumbnailDivinerConfigSchema } from './Config';
|
|
11
|
-
export class ImageThumbnailDiviner extends AbstractDiviner {
|
|
12
|
-
static configSchemas = [ImageThumbnailDivinerConfigSchema, DivinerConfigSchema];
|
|
13
|
-
_archivistInstance;
|
|
14
|
-
_initializeArchivistConnectionIfNeededPromise;
|
|
15
|
-
_map;
|
|
16
|
-
_payloadDivinerInstance;
|
|
17
|
-
_pollId;
|
|
18
|
-
get archivist() {
|
|
19
|
-
return this.config.archivist;
|
|
20
|
-
}
|
|
21
|
-
get payloadDiviner() {
|
|
22
|
-
return this.config.payloadDiviner;
|
|
23
|
-
}
|
|
24
|
-
get payloadDivinerLimit() {
|
|
25
|
-
return this.config.payloadDivinerLimit ?? 10000;
|
|
26
|
-
}
|
|
27
|
-
get pollFrequency() {
|
|
28
|
-
return this.config.pollFrequency;
|
|
29
|
-
}
|
|
30
|
-
//using promise as mutex
|
|
31
|
-
async getArchivistInstance() {
|
|
32
|
-
//if previously checked, but not found, clear promise
|
|
33
|
-
if (this._archivistInstance && !(await this._archivistInstance)) {
|
|
34
|
-
this._archivistInstance = undefined;
|
|
35
|
-
}
|
|
36
|
-
this._archivistInstance =
|
|
37
|
-
this._archivistInstance ??
|
|
38
|
-
(async () => {
|
|
39
|
-
const module = await this.resolve(this.archivist);
|
|
40
|
-
return asArchivistInstance(module, 'Provided archivist address did not resolve to an Archivist');
|
|
41
|
-
})();
|
|
42
|
-
return this._archivistInstance;
|
|
43
|
-
}
|
|
44
|
-
//using promise as mutex
|
|
45
|
-
async getPayloadDivinerInstance() {
|
|
46
|
-
const payloadDivinerAddress = this.payloadDiviner;
|
|
47
|
-
if (payloadDivinerAddress) {
|
|
48
|
-
//if previously checked, but not found, clear promise
|
|
49
|
-
if (this._payloadDivinerInstance && !(await this._payloadDivinerInstance)) {
|
|
50
|
-
this._payloadDivinerInstance = undefined;
|
|
51
|
-
}
|
|
52
|
-
this._payloadDivinerInstance =
|
|
53
|
-
this._payloadDivinerInstance ??
|
|
54
|
-
(async () => {
|
|
55
|
-
const module = await this.resolve(payloadDivinerAddress);
|
|
56
|
-
return asDivinerInstance(module, 'Provided payload diviner address did not resolve to a Diviner');
|
|
57
|
-
})();
|
|
58
|
-
return this._payloadDivinerInstance;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
async divineHandler(payloads = []) {
|
|
62
|
-
await this.initializeArchivistConnectionIfNeeded();
|
|
63
|
-
const urls = payloads.map((urlPayload) => urlPayload.url);
|
|
64
|
-
const map = await this.getSafeMap();
|
|
65
|
-
const archivist = await this.getArchivistInstance();
|
|
66
|
-
const hashes = compact(urls.map((url) => map?.[url]));
|
|
67
|
-
return (await archivist.get(hashes)).filter((payload) => payload.schema === ImageThumbnailSchema);
|
|
68
|
-
}
|
|
69
|
-
//using promise as mutex
|
|
70
|
-
initializeArchivistConnectionIfNeeded() {
|
|
71
|
-
this._initializeArchivistConnectionIfNeededPromise =
|
|
72
|
-
this._initializeArchivistConnectionIfNeededPromise ??
|
|
73
|
-
(async () => {
|
|
74
|
-
if (!this._map) {
|
|
75
|
-
await this.attachArchivistEvents();
|
|
76
|
-
console.log('initializeArchivistConnectionIfNeeded: attachArchivistEvents done');
|
|
77
|
-
await this.poll();
|
|
78
|
-
console.log('initializeArchivistConnectionIfNeeded: poll done');
|
|
79
|
-
}
|
|
80
|
-
})();
|
|
81
|
-
return this._initializeArchivistConnectionIfNeededPromise;
|
|
82
|
-
}
|
|
83
|
-
async loadMap() {
|
|
84
|
-
if (this.payloadDiviner) {
|
|
85
|
-
return await this.loadMapWithPayloadDiviner();
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
return await this.loadMapWithAll();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
async loadMapWithAll() {
|
|
92
|
-
if (await this.started()) {
|
|
93
|
-
const archivist = await this.getArchivistInstance();
|
|
94
|
-
assertEx(archivist.all, "Archivist does not support 'all'");
|
|
95
|
-
const allPayloads = (await archivist.all?.()) ?? [];
|
|
96
|
-
const imagePayloadPairs = await Promise.all(allPayloads
|
|
97
|
-
.filter((payload) => payload.schema === ImageThumbnailSchema)
|
|
98
|
-
.map(async (payload) => [await PayloadHasher.hashAsync(payload), payload]));
|
|
99
|
-
this._map = imagePayloadPairs.reduce((prev, [hash, payload]) => {
|
|
100
|
-
prev[payload.sourceUrl] = hash;
|
|
101
|
-
return prev;
|
|
102
|
-
}, {});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
async loadMapWithPayloadDiviner() {
|
|
106
|
-
console.log('loadMapWithPayloadDiviner: started');
|
|
107
|
-
if (await this.started()) {
|
|
108
|
-
const diviner = await this.getPayloadDivinerInstance();
|
|
109
|
-
let offset = undefined;
|
|
110
|
-
let moreAvailable = true;
|
|
111
|
-
if (diviner) {
|
|
112
|
-
const newMap = {};
|
|
113
|
-
while (moreAvailable) {
|
|
114
|
-
const payloadDivinerQuery = {
|
|
115
|
-
limit: this.payloadDivinerLimit,
|
|
116
|
-
offset,
|
|
117
|
-
schema: PayloadDivinerQuerySchema,
|
|
118
|
-
schemas: [ImageThumbnailSchema],
|
|
119
|
-
};
|
|
120
|
-
const payloads = await diviner.divine([payloadDivinerQuery]);
|
|
121
|
-
offset = (offset ?? 0) + payloads.length;
|
|
122
|
-
moreAvailable = payloads.length > 0;
|
|
123
|
-
console.log(`loadMapWithPayloadDiviner.offset: ${offset}`);
|
|
124
|
-
console.log(`loadMapWithPayloadDiviner.moreAvailable: ${moreAvailable}`);
|
|
125
|
-
const imagePayloadPairs = await Promise.all(payloads
|
|
126
|
-
.filter((payload) => payload.schema === ImageThumbnailSchema)
|
|
127
|
-
.map(async (payload) => [await PayloadHasher.hashAsync(payload), payload]));
|
|
128
|
-
imagePayloadPairs.forEach(([hash, payload]) => (newMap[payload.sourceUrl] = hash));
|
|
129
|
-
}
|
|
130
|
-
this._map = newMap;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async stopHandler(_timeout) {
|
|
135
|
-
if (this._pollId) {
|
|
136
|
-
clearTimeout(this._pollId);
|
|
137
|
-
this._pollId = undefined;
|
|
138
|
-
}
|
|
139
|
-
return await super.stopHandler();
|
|
140
|
-
}
|
|
141
|
-
async attachArchivistEvents() {
|
|
142
|
-
const archivist = await this.getArchivistInstance();
|
|
143
|
-
const mapPromise = this.getSafeMap();
|
|
144
|
-
archivist.on('inserted', async ({ payloads }) => {
|
|
145
|
-
const map = await mapPromise;
|
|
146
|
-
const thumbnails = compact(payloads.filter((payload) => payload.schema === ImageThumbnailSchema));
|
|
147
|
-
await Promise.all(thumbnails.map(async (payload) => (map[payload.sourceUrl] = await PayloadHasher.hashAsync(payload))));
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
async getSafeMap() {
|
|
151
|
-
let mapRetry = 100; //10 seconds max
|
|
152
|
-
let map = this._map;
|
|
153
|
-
while (!map) {
|
|
154
|
-
await delay(100);
|
|
155
|
-
mapRetry = mapRetry - 1;
|
|
156
|
-
if (mapRetry === 0) {
|
|
157
|
-
throw Error('Map Not Loaded');
|
|
158
|
-
}
|
|
159
|
-
map = this._map;
|
|
160
|
-
}
|
|
161
|
-
return map;
|
|
162
|
-
}
|
|
163
|
-
async poll() {
|
|
164
|
-
if (await this.started()) {
|
|
165
|
-
const pollFrequency = this.pollFrequency;
|
|
166
|
-
if (pollFrequency) {
|
|
167
|
-
this._pollId = setTimeout(async () => {
|
|
168
|
-
this._pollId = undefined;
|
|
169
|
-
await this.loadMap();
|
|
170
|
-
await this.poll();
|
|
171
|
-
}, pollFrequency);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
await this.loadMap();
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
//# sourceMappingURL=Diviner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Diviner.js","sourceRoot":"","sources":["../../../src/Diviner/Diviner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Params.js","sourceRoot":"","sources":["../../../src/Diviner/Params.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Diviner/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA"}
|
package/dist/esm/Plugin.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin';
|
|
2
|
-
import { PayloadSetSchema } from '@xyo-network/payload-model';
|
|
3
|
-
import { createPayloadSetDualPlugin } from '@xyo-network/payloadset-plugin';
|
|
4
|
-
import { ImageThumbnailDiviner } from './Diviner';
|
|
5
|
-
import { ImageThumbnailWitness } from './Witness';
|
|
6
|
-
export const ImageThumbnailPlugin = () => createPayloadSetDualPlugin({ required: { [ImageThumbnailSchema]: 1 }, schema: PayloadSetSchema }, {
|
|
7
|
-
diviner: async (params) => {
|
|
8
|
-
const result = await ImageThumbnailDiviner.create(params);
|
|
9
|
-
return result;
|
|
10
|
-
},
|
|
11
|
-
witness: async (params) => {
|
|
12
|
-
const result = await ImageThumbnailWitness.create(params);
|
|
13
|
-
return result;
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
//# sourceMappingURL=Plugin.js.map
|
package/dist/esm/Plugin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAE3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CACvC,0BAA0B,CACxB,EAAE,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,EACrE;IACE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACzD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACzD,OAAO,MAAM,CAAA;IACf,CAAC;CACF,CACF,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../../src/Witness/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAA;AAGlF,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,oBAAoB,iBAA0B,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Params.js","sourceRoot":"","sources":["../../../src/Witness/Params.ts"],"names":[],"mappings":""}
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
/* eslint-disable max-statements */
|
|
2
|
-
import { promises as dnsPromises } from 'node:dns';
|
|
3
|
-
import { compact } from '@xylabs/lodash';
|
|
4
|
-
import { URL } from '@xylabs/url';
|
|
5
|
-
import { axios } from '@xyo-network/axios';
|
|
6
|
-
import { PayloadHasher } from '@xyo-network/core';
|
|
7
|
-
import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin';
|
|
8
|
-
import { UrlSchema } from '@xyo-network/url-payload-plugin';
|
|
9
|
-
import { AbstractWitness } from '@xyo-network/witness';
|
|
10
|
-
import { Semaphore } from 'async-mutex';
|
|
11
|
-
import FileType from 'file-type';
|
|
12
|
-
import { subClass } from 'gm';
|
|
13
|
-
import { sync as hasbin } from 'hasbin';
|
|
14
|
-
import { sha256 } from 'hash-wasm';
|
|
15
|
-
import { LRUCache } from 'lru-cache';
|
|
16
|
-
import shajs from 'sha.js';
|
|
17
|
-
import Url from 'url-parse';
|
|
18
|
-
import { ImageThumbnailWitnessConfigSchema } from './Config';
|
|
19
|
-
import { getVideoFrameAsImageFluent } from './ffmpeg';
|
|
20
|
-
//TODO: Break this into two Witnesses?
|
|
21
|
-
// setFfmpegPath(ffmpegPath)
|
|
22
|
-
const gm = subClass({ imageMagick: '7+' });
|
|
23
|
-
export class ImageThumbnailWitness extends AbstractWitness {
|
|
24
|
-
static configSchemas = [ImageThumbnailWitnessConfigSchema];
|
|
25
|
-
_cache;
|
|
26
|
-
_semaphore = new Semaphore(this.maxAsyncProcesses);
|
|
27
|
-
get cache() {
|
|
28
|
-
this._cache =
|
|
29
|
-
this._cache ??
|
|
30
|
-
new LRUCache({
|
|
31
|
-
max: this.maxCacheEntries,
|
|
32
|
-
maxSize: this.maxCacheBytes,
|
|
33
|
-
//just returning the size of the data
|
|
34
|
-
sizeCalculation: (value) => value.url?.length ?? 1,
|
|
35
|
-
});
|
|
36
|
-
return this._cache;
|
|
37
|
-
}
|
|
38
|
-
get encoding() {
|
|
39
|
-
return this.config.encoding ?? 'PNG';
|
|
40
|
-
}
|
|
41
|
-
get height() {
|
|
42
|
-
return this.config.height ?? 128;
|
|
43
|
-
}
|
|
44
|
-
get ipfGateway() {
|
|
45
|
-
return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com';
|
|
46
|
-
}
|
|
47
|
-
get maxAsyncProcesses() {
|
|
48
|
-
return this.config.maxAsyncProcesses ?? 2;
|
|
49
|
-
}
|
|
50
|
-
get maxCacheBytes() {
|
|
51
|
-
return this.config.maxCacheBytes ?? 1024 * 1024 * 16; //64MB max size
|
|
52
|
-
}
|
|
53
|
-
get maxCacheEntries() {
|
|
54
|
-
return this.config.maxCacheEntries ?? 500;
|
|
55
|
-
}
|
|
56
|
-
get quality() {
|
|
57
|
-
return this.config.quality ?? 50;
|
|
58
|
-
}
|
|
59
|
-
get width() {
|
|
60
|
-
return this.config.width ?? 128;
|
|
61
|
-
}
|
|
62
|
-
static async binaryToSha256(data) {
|
|
63
|
-
await PayloadHasher.wasmInitialized;
|
|
64
|
-
if (PayloadHasher.wasmSupport.canUseWasm) {
|
|
65
|
-
try {
|
|
66
|
-
return await sha256(data);
|
|
67
|
-
}
|
|
68
|
-
catch (ex) {
|
|
69
|
-
PayloadHasher.wasmSupport.allowWasm = false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// eslint-disable-next-line deprecation/deprecation
|
|
73
|
-
return shajs('sha256').update(data).digest().toString();
|
|
74
|
-
}
|
|
75
|
-
static bufferFromDataUrl(url) {
|
|
76
|
-
if (url.startsWith('data:image')) {
|
|
77
|
-
const data = url.split(',')[1];
|
|
78
|
-
if (data) {
|
|
79
|
-
return Buffer.from(Uint8Array.from(atob(data), (c) => c.charCodeAt(0)));
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
const error = {
|
|
83
|
-
message: 'Invalid data Url',
|
|
84
|
-
name: 'ImageThumbnailWitnessError',
|
|
85
|
-
url,
|
|
86
|
-
};
|
|
87
|
-
throw error;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Returns the equivalent IPFS gateway URL for the supplied URL.
|
|
93
|
-
* @param urlToCheck The URL to check
|
|
94
|
-
* @returns If the supplied URL is an IPFS URL, it converts the URL to the
|
|
95
|
-
* equivalent IPFS gateway URL. Otherwise, returns the original URL.
|
|
96
|
-
*/
|
|
97
|
-
checkIpfsUrl(urlToCheck) {
|
|
98
|
-
const url = new URL(urlToCheck);
|
|
99
|
-
let protocol = url.protocol;
|
|
100
|
-
let host = url.host;
|
|
101
|
-
let path = url.pathname;
|
|
102
|
-
const query = url.search;
|
|
103
|
-
if (protocol === 'ipfs:') {
|
|
104
|
-
protocol = 'https:';
|
|
105
|
-
host = this.ipfGateway;
|
|
106
|
-
path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`;
|
|
107
|
-
const root = `${protocol}//${host}/${path}`;
|
|
108
|
-
return query?.length > 0 ? `${root}?${query}` : root;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return urlToCheck;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
async observeHandler(payloads = []) {
|
|
115
|
-
if (!hasbin('magick')) {
|
|
116
|
-
throw Error('ImageMagick is required for this witness');
|
|
117
|
-
}
|
|
118
|
-
const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema);
|
|
119
|
-
return await this._semaphore.runExclusive(async () => compact(await Promise.all(urlPayloads.map(async ({ url }) => {
|
|
120
|
-
const cachedResult = this.cache.get(url);
|
|
121
|
-
if (cachedResult) {
|
|
122
|
-
return cachedResult;
|
|
123
|
-
}
|
|
124
|
-
let result;
|
|
125
|
-
//if it is a data URL, return a Buffer
|
|
126
|
-
const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url);
|
|
127
|
-
if (dataBuffer) {
|
|
128
|
-
result = {
|
|
129
|
-
schema: ImageThumbnailSchema,
|
|
130
|
-
sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),
|
|
131
|
-
sourceUrl: url,
|
|
132
|
-
url,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
//if it is ipfs, go through cloud flair
|
|
137
|
-
const mutatedUrl = this.checkIpfsUrl(url);
|
|
138
|
-
result = await this.fromHttp(mutatedUrl, url);
|
|
139
|
-
}
|
|
140
|
-
this.cache.set(url, result);
|
|
141
|
-
return result;
|
|
142
|
-
}))));
|
|
143
|
-
}
|
|
144
|
-
async createThumbnailDataUrl(sourceBuffer, encoding) {
|
|
145
|
-
const thumb = await new Promise((resolve, reject) => {
|
|
146
|
-
gm(sourceBuffer)
|
|
147
|
-
.quality(this.quality)
|
|
148
|
-
.resize(this.width, this.height)
|
|
149
|
-
.flatten()
|
|
150
|
-
.toBuffer(encoding ?? this.encoding, (error, buffer) => {
|
|
151
|
-
if (error) {
|
|
152
|
-
reject(error);
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
resolve(buffer);
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
return `data:image/png;base64,${thumb.toString('base64')}`;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Creates an image thumbnail from a video.
|
|
163
|
-
* @param videoBuffer The input video buffer.
|
|
164
|
-
* @returns An buffer containing an image thumbnail for the video.
|
|
165
|
-
*/
|
|
166
|
-
async createThumbnailFromVideo(videoBuffer) {
|
|
167
|
-
const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer);
|
|
168
|
-
return this.createThumbnailDataUrl(imageBuffer);
|
|
169
|
-
}
|
|
170
|
-
async fromHttp(url, sourceUrl) {
|
|
171
|
-
let response;
|
|
172
|
-
let dnsResult;
|
|
173
|
-
try {
|
|
174
|
-
const urlObj = new Url(url);
|
|
175
|
-
dnsResult = await dnsPromises.resolve(urlObj.host);
|
|
176
|
-
// console.log(`dnsResult: ${JSON.stringify(dnsResult, null, 2)}`)
|
|
177
|
-
}
|
|
178
|
-
catch (ex) {
|
|
179
|
-
const error = ex;
|
|
180
|
-
const result = {
|
|
181
|
-
http: {
|
|
182
|
-
dnsError: error.code,
|
|
183
|
-
},
|
|
184
|
-
schema: ImageThumbnailSchema,
|
|
185
|
-
sourceUrl: sourceUrl ?? url,
|
|
186
|
-
};
|
|
187
|
-
return result;
|
|
188
|
-
}
|
|
189
|
-
try {
|
|
190
|
-
response = await axios.get(url, {
|
|
191
|
-
responseType: 'arraybuffer',
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
catch (ex) {
|
|
195
|
-
const axiosError = ex;
|
|
196
|
-
if (axiosError.isAxiosError) {
|
|
197
|
-
//selectively pick fields from AxiosError
|
|
198
|
-
const result = {
|
|
199
|
-
http: {
|
|
200
|
-
ipAddress: dnsResult[0],
|
|
201
|
-
status: axiosError?.response?.status,
|
|
202
|
-
},
|
|
203
|
-
schema: ImageThumbnailSchema,
|
|
204
|
-
sourceUrl: sourceUrl ?? url,
|
|
205
|
-
};
|
|
206
|
-
return result;
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
throw ex;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
const result = {
|
|
213
|
-
http: {
|
|
214
|
-
status: response.status,
|
|
215
|
-
},
|
|
216
|
-
schema: ImageThumbnailSchema,
|
|
217
|
-
sourceUrl: sourceUrl ?? url,
|
|
218
|
-
};
|
|
219
|
-
if (response.status >= 200 && response.status < 300) {
|
|
220
|
-
const contentType = response.headers['content-type']?.toString();
|
|
221
|
-
const [mediaType, fileType] = contentType.split('/');
|
|
222
|
-
result.mime = result.mime ?? {};
|
|
223
|
-
result.mime.returned = mediaType;
|
|
224
|
-
const sourceBuffer = Buffer.from(response.data, 'binary');
|
|
225
|
-
try {
|
|
226
|
-
result.mime.detected = await FileType.fromBuffer(sourceBuffer);
|
|
227
|
-
}
|
|
228
|
-
catch (ex) {
|
|
229
|
-
const error = ex;
|
|
230
|
-
this.logger?.error(`FileType error: ${error.message}`);
|
|
231
|
-
}
|
|
232
|
-
const processImage = async (encoding) => {
|
|
233
|
-
result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer);
|
|
234
|
-
result.url = await this.createThumbnailDataUrl(sourceBuffer, encoding);
|
|
235
|
-
};
|
|
236
|
-
const processVideo = async () => {
|
|
237
|
-
// Gracefully handle the case where ffmpeg is not installed.
|
|
238
|
-
if (hasbin('ffmpeg')) {
|
|
239
|
-
result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer);
|
|
240
|
-
result.url = await this.createThumbnailFromVideo(sourceBuffer);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
result.mime = result.mime ?? {};
|
|
244
|
-
result.mime.invalid = true;
|
|
245
|
-
}
|
|
246
|
-
};
|
|
247
|
-
let encoding = 'PNG';
|
|
248
|
-
switch (fileType.toUpperCase()) {
|
|
249
|
-
case 'GIF':
|
|
250
|
-
encoding = 'GIF';
|
|
251
|
-
break;
|
|
252
|
-
case 'JPG':
|
|
253
|
-
case 'JPEG':
|
|
254
|
-
encoding = 'JPG';
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
switch (mediaType) {
|
|
258
|
-
case 'image': {
|
|
259
|
-
await processImage(encoding);
|
|
260
|
-
result.mime.type = mediaType;
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
case 'video': {
|
|
264
|
-
await processVideo();
|
|
265
|
-
result.mime.type = mediaType;
|
|
266
|
-
break;
|
|
267
|
-
}
|
|
268
|
-
default: {
|
|
269
|
-
switch (result.mime.detected?.mime) {
|
|
270
|
-
case 'image': {
|
|
271
|
-
await processImage();
|
|
272
|
-
result.mime.type = result.mime.detected?.mime;
|
|
273
|
-
break;
|
|
274
|
-
}
|
|
275
|
-
case 'video': {
|
|
276
|
-
await processVideo();
|
|
277
|
-
result.mime.type = result.mime.detected?.mime;
|
|
278
|
-
break;
|
|
279
|
-
}
|
|
280
|
-
default: {
|
|
281
|
-
result.mime.invalid = true;
|
|
282
|
-
break;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
break;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
return result;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
//# sourceMappingURL=Witness.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { uuid } from '@xyo-network/core';
|
|
2
|
-
import ffmpeg from 'fluent-ffmpeg';
|
|
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
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.
|
|
27
|
-
* @param videoBuffer Input video buffer.
|
|
28
|
-
* @returns Output buffer containing the video thumbnail image.
|
|
29
|
-
*/
|
|
30
|
-
export const getVideoFrameAsImageFluent = async (videoBuffer) => {
|
|
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);
|
|
56
|
-
});
|
|
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
|
-
}
|
|
68
|
-
};
|
|
69
|
-
//# sourceMappingURL=getVideoFrameAsImageFluent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/Witness/ffmpeg/fluent/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Witness/ffmpeg/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA"}
|