@xyo-network/image-thumbnail-plugin 2.72.6 → 2.72.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Witness/Witness.js +25 -13
- package/dist/cjs/Witness/Witness.js.map +1 -1
- package/dist/docs.json +5891 -4330
- package/dist/esm/Witness/Witness.js +25 -13
- package/dist/esm/Witness/Witness.js.map +1 -1
- package/dist/types/Plugin.d.ts +5 -1
- package/dist/types/Plugin.d.ts.map +1 -1
- package/dist/types/Witness/Config.d.ts +2 -1
- package/dist/types/Witness/Config.d.ts.map +1 -1
- package/dist/types/Witness/Witness.d.ts +2 -1
- package/dist/types/Witness/Witness.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/Witness/Config.ts +3 -1
- package/src/Witness/Witness.ts +30 -16
|
@@ -4,6 +4,7 @@ import { URL } from '@xylabs/url';
|
|
|
4
4
|
import { axios } from '@xyo-network/axios';
|
|
5
5
|
import { PayloadHasher } from '@xyo-network/core';
|
|
6
6
|
import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin';
|
|
7
|
+
import { UrlSchema } from '@xyo-network/url-payload-plugin';
|
|
7
8
|
import { AbstractWitness } from '@xyo-network/witness';
|
|
8
9
|
import { Semaphore } from 'async-mutex';
|
|
9
10
|
import FileType from 'file-type';
|
|
@@ -41,7 +42,7 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
41
42
|
return this.config.height ?? 128;
|
|
42
43
|
}
|
|
43
44
|
get ipfGateway() {
|
|
44
|
-
return this.config.ipfsGateway ?? '
|
|
45
|
+
return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com';
|
|
45
46
|
}
|
|
46
47
|
get maxAsyncProcesses() {
|
|
47
48
|
return this.config.maxAsyncProcesses ?? 2;
|
|
@@ -116,7 +117,8 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
116
117
|
if (!hasbin('magick')) {
|
|
117
118
|
throw Error('ImageMagick is required for this witness');
|
|
118
119
|
}
|
|
119
|
-
|
|
120
|
+
const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema);
|
|
121
|
+
return await this._semaphore.runExclusive(async () => compact(await Promise.all(urlPayloads.map(async ({ url }) => {
|
|
120
122
|
const cachedResult = this.cache.get(url);
|
|
121
123
|
if (cachedResult) {
|
|
122
124
|
return cachedResult;
|
|
@@ -135,19 +137,19 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
135
137
|
else {
|
|
136
138
|
//if it is ipfs, go through cloud flair
|
|
137
139
|
const mutatedUrl = this.checkIpfsUrl(url);
|
|
138
|
-
result = await this.fromHttp(mutatedUrl);
|
|
140
|
+
result = await this.fromHttp(mutatedUrl, url);
|
|
139
141
|
}
|
|
140
142
|
this.cache.set(url, result);
|
|
141
143
|
return result;
|
|
142
144
|
}))));
|
|
143
145
|
}
|
|
144
|
-
async createThumbnailDataUrl(sourceBuffer) {
|
|
146
|
+
async createThumbnailDataUrl(sourceBuffer, encoding) {
|
|
145
147
|
const thumb = await new Promise((resolve, reject) => {
|
|
146
148
|
gm(sourceBuffer)
|
|
147
149
|
.quality(this.quality)
|
|
148
150
|
.resize(this.width, this.height)
|
|
149
151
|
.flatten()
|
|
150
|
-
.toBuffer(this.encoding, (error, buffer) => {
|
|
152
|
+
.toBuffer(encoding ?? this.encoding, (error, buffer) => {
|
|
151
153
|
if (error) {
|
|
152
154
|
reject(error);
|
|
153
155
|
}
|
|
@@ -167,7 +169,7 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
167
169
|
const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer);
|
|
168
170
|
return this.createThumbnailDataUrl(imageBuffer);
|
|
169
171
|
}
|
|
170
|
-
async fromHttp(url) {
|
|
172
|
+
async fromHttp(url, sourceUrl) {
|
|
171
173
|
let response;
|
|
172
174
|
let dnsResult;
|
|
173
175
|
try {
|
|
@@ -182,7 +184,7 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
182
184
|
dnsError: error.code,
|
|
183
185
|
},
|
|
184
186
|
schema: ImageThumbnailSchema,
|
|
185
|
-
sourceUrl: url,
|
|
187
|
+
sourceUrl: sourceUrl ?? url,
|
|
186
188
|
};
|
|
187
189
|
return result;
|
|
188
190
|
}
|
|
@@ -201,7 +203,7 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
201
203
|
status: axiosError?.response?.status,
|
|
202
204
|
},
|
|
203
205
|
schema: ImageThumbnailSchema,
|
|
204
|
-
sourceUrl: url,
|
|
206
|
+
sourceUrl: sourceUrl ?? url,
|
|
205
207
|
};
|
|
206
208
|
return result;
|
|
207
209
|
}
|
|
@@ -214,11 +216,11 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
214
216
|
status: response.status,
|
|
215
217
|
},
|
|
216
218
|
schema: ImageThumbnailSchema,
|
|
217
|
-
sourceUrl: url,
|
|
219
|
+
sourceUrl: sourceUrl ?? url,
|
|
218
220
|
};
|
|
219
221
|
if (response.status >= 200 && response.status < 300) {
|
|
220
222
|
const contentType = response.headers['content-type']?.toString();
|
|
221
|
-
const mediaType = contentType.split('/')
|
|
223
|
+
const [mediaType, fileType] = contentType.split('/');
|
|
222
224
|
result.mime = result.mime ?? {};
|
|
223
225
|
result.mime.returned = mediaType;
|
|
224
226
|
const sourceBuffer = Buffer.from(response.data, 'binary');
|
|
@@ -229,9 +231,9 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
229
231
|
const error = ex;
|
|
230
232
|
this.logger?.error(`FileType error: ${error.message}`);
|
|
231
233
|
}
|
|
232
|
-
const processImage = async () => {
|
|
234
|
+
const processImage = async (encoding) => {
|
|
233
235
|
result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer);
|
|
234
|
-
result.url = await this.createThumbnailDataUrl(sourceBuffer);
|
|
236
|
+
result.url = await this.createThumbnailDataUrl(sourceBuffer, encoding);
|
|
235
237
|
};
|
|
236
238
|
const processVideo = async () => {
|
|
237
239
|
// Gracefully handle the case where ffmpeg is not installed.
|
|
@@ -244,9 +246,19 @@ export class ImageThumbnailWitness extends AbstractWitness {
|
|
|
244
246
|
result.mime.invalid = true;
|
|
245
247
|
}
|
|
246
248
|
};
|
|
249
|
+
let encoding = 'PNG';
|
|
250
|
+
switch (fileType.toUpperCase()) {
|
|
251
|
+
case 'GIF':
|
|
252
|
+
encoding = 'GIF';
|
|
253
|
+
break;
|
|
254
|
+
case 'JPG':
|
|
255
|
+
case 'JPEG':
|
|
256
|
+
encoding = 'JPG';
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
247
259
|
switch (mediaType) {
|
|
248
260
|
case 'image': {
|
|
249
|
-
await processImage();
|
|
261
|
+
await processImage(encoding);
|
|
250
262
|
result.mime.type = mediaType;
|
|
251
263
|
break;
|
|
252
264
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,UAAU,CAAA;AAElD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAAE,KAAK,EAA6B,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAkB,oBAAoB,EAAE,MAAM,6CAA6C,CAAA;
|
|
1
|
+
{"version":3,"file":"Witness.js","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"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"}
|
package/dist/types/Plugin.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
|
|
|
17
17
|
} | undefined;
|
|
18
18
|
readonly sign?: boolean | undefined;
|
|
19
19
|
readonly storeQueries?: boolean | undefined;
|
|
20
|
+
readonly timestamp?: boolean | undefined;
|
|
20
21
|
} & Omit<Omit<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & {
|
|
21
22
|
accountDerivationPath?: string | undefined;
|
|
22
23
|
readonly archivist?: import("@xyo-network/module-model").ArchivistModuleConfig | undefined;
|
|
@@ -32,6 +33,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
|
|
|
32
33
|
} | undefined;
|
|
33
34
|
readonly sign?: boolean | undefined;
|
|
34
35
|
readonly storeQueries?: boolean | undefined;
|
|
36
|
+
readonly timestamp?: boolean | undefined;
|
|
35
37
|
} & Omit<{
|
|
36
38
|
archivist?: string | undefined;
|
|
37
39
|
schema: "network.xyo.image.thumbnail.witness.config";
|
|
@@ -39,7 +41,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
|
|
|
39
41
|
schema: "network.xyo.payload.set";
|
|
40
42
|
}) | undefined;
|
|
41
43
|
} & {
|
|
42
|
-
encoding?: "
|
|
44
|
+
encoding?: import("./Witness").ImageThumbnailEncoding | undefined;
|
|
43
45
|
height?: number | undefined;
|
|
44
46
|
ipfsGateway?: string | undefined;
|
|
45
47
|
maxAsyncProcesses?: number | undefined;
|
|
@@ -76,6 +78,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
|
|
|
76
78
|
} | undefined;
|
|
77
79
|
readonly sign?: boolean | undefined;
|
|
78
80
|
readonly storeQueries?: boolean | undefined;
|
|
81
|
+
readonly timestamp?: boolean | undefined;
|
|
79
82
|
} & Omit<Omit<import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & {
|
|
80
83
|
accountDerivationPath?: string | undefined;
|
|
81
84
|
readonly archivist?: import("@xyo-network/module-model").ArchivistModuleConfig | undefined;
|
|
@@ -91,6 +94,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
|
|
|
91
94
|
} | undefined;
|
|
92
95
|
readonly sign?: boolean | undefined;
|
|
93
96
|
readonly storeQueries?: boolean | undefined;
|
|
97
|
+
readonly timestamp?: boolean | undefined;
|
|
94
98
|
} & Omit<{
|
|
95
99
|
schema: "network.xyo.image.thumbnail.diviner.config";
|
|
96
100
|
} & Omit<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAa9B,CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { WitnessConfig } from '@xyo-network/witness';
|
|
2
2
|
export declare const ImageThumbnailWitnessConfigSchema: "network.xyo.image.thumbnail.witness.config";
|
|
3
3
|
export type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema;
|
|
4
|
+
export type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF';
|
|
4
5
|
export type ImageThumbnailWitnessConfig = WitnessConfig<{
|
|
5
|
-
encoding?:
|
|
6
|
+
encoding?: ImageThumbnailEncoding;
|
|
6
7
|
height?: number;
|
|
7
8
|
ipfsGateway?: string;
|
|
8
9
|
maxAsyncProcesses?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../src/Witness/Config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,eAAO,MAAM,iCAAiC,8CAAoD,CAAA;AAClG,MAAM,MAAM,iCAAiC,GAAG,OAAO,iCAAiC,CAAA;AAExF,MAAM,MAAM,2BAA2B,GAAG,aAAa,CAAC;IACtD,QAAQ,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../src/Witness/Config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,eAAO,MAAM,iCAAiC,8CAAoD,CAAA;AAClG,MAAM,MAAM,iCAAiC,GAAG,OAAO,iCAAiC,CAAA;AAExF,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;AAE1D,MAAM,MAAM,2BAA2B,GAAG,aAAa,CAAC;IACtD,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iCAAiC,CAAA;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin';
|
|
|
2
2
|
import { UrlPayload } from '@xyo-network/url-payload-plugin';
|
|
3
3
|
import { AbstractWitness } from '@xyo-network/witness';
|
|
4
4
|
import { LRUCache } from 'lru-cache';
|
|
5
|
+
import { ImageThumbnailEncoding } from './Config';
|
|
5
6
|
import { ImageThumbnailWitnessParams } from './Params';
|
|
6
7
|
export interface ImageThumbnailWitnessError extends Error {
|
|
7
8
|
name: 'ImageThumbnailWitnessError';
|
|
@@ -35,7 +36,7 @@ export declare class ImageThumbnailWitness<TParams extends ImageThumbnailWitness
|
|
|
35
36
|
} & {
|
|
36
37
|
schema: "network.xyo.image.thumbnail";
|
|
37
38
|
}, unknown>;
|
|
38
|
-
get encoding():
|
|
39
|
+
get encoding(): ImageThumbnailEncoding;
|
|
39
40
|
get height(): number;
|
|
40
41
|
get ipfGateway(): string;
|
|
41
42
|
get maxAsyncProcesses(): number;
|
|
@@ -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,
|
|
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;IAkBhC;;;;;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"}
|
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.8",
|
|
17
|
+
"@xyo-network/archivist-model": "~2.72.8",
|
|
18
|
+
"@xyo-network/axios": "~2.72.8",
|
|
19
|
+
"@xyo-network/core": "~2.72.8",
|
|
20
|
+
"@xyo-network/diviner-model": "~2.72.8",
|
|
21
|
+
"@xyo-network/diviner-payload-model": "~2.72.8",
|
|
22
|
+
"@xyo-network/image-thumbnail-payload-plugin": "~2.72.8",
|
|
23
|
+
"@xyo-network/module": "~2.72.8",
|
|
24
|
+
"@xyo-network/payload-model": "~2.72.8",
|
|
25
|
+
"@xyo-network/payloadset-plugin": "~2.72.8",
|
|
26
|
+
"@xyo-network/url-payload-plugin": "~2.72.8",
|
|
27
|
+
"@xyo-network/witness": "~2.72.8",
|
|
28
28
|
"async-mutex": "^0.4.0",
|
|
29
29
|
"file-type": "^16.5.4",
|
|
30
30
|
"fluent-ffmpeg": "^2.1.2",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@types/fluent-ffmpeg": "^2.1.21",
|
|
41
41
|
"@types/gm": "^1.25.1",
|
|
42
42
|
"@types/hasbin": "^1.2.0",
|
|
43
|
-
"@types/lodash": "^4.14.
|
|
43
|
+
"@types/lodash": "^4.14.198",
|
|
44
44
|
"@xylabs/ts-scripts-yarn3": "^2.19.3",
|
|
45
45
|
"@xylabs/tsconfig": "^2.19.3",
|
|
46
46
|
"typescript": "^5.2.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.8"
|
|
82
82
|
}
|
package/src/Witness/Config.ts
CHANGED
|
@@ -4,8 +4,10 @@ import { WitnessConfig } from '@xyo-network/witness'
|
|
|
4
4
|
export const ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config` as const
|
|
5
5
|
export type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema
|
|
6
6
|
|
|
7
|
+
export type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF'
|
|
8
|
+
|
|
7
9
|
export type ImageThumbnailWitnessConfig = WitnessConfig<{
|
|
8
|
-
encoding?:
|
|
10
|
+
encoding?: ImageThumbnailEncoding
|
|
9
11
|
height?: number
|
|
10
12
|
ipfsGateway?: string
|
|
11
13
|
maxAsyncProcesses?: number
|
package/src/Witness/Witness.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { URL } from '@xylabs/url'
|
|
|
5
5
|
import { axios, AxiosError, AxiosResponse } from '@xyo-network/axios'
|
|
6
6
|
import { PayloadHasher } from '@xyo-network/core'
|
|
7
7
|
import { ImageThumbnail, ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'
|
|
8
|
-
import { UrlPayload } from '@xyo-network/url-payload-plugin'
|
|
8
|
+
import { UrlPayload, UrlSchema } from '@xyo-network/url-payload-plugin'
|
|
9
9
|
import { AbstractWitness } from '@xyo-network/witness'
|
|
10
10
|
import { Semaphore } from 'async-mutex'
|
|
11
11
|
import FileType from 'file-type'
|
|
@@ -17,7 +17,7 @@ import { LRUCache } from 'lru-cache'
|
|
|
17
17
|
import shajs from 'sha.js'
|
|
18
18
|
import Url from 'url-parse'
|
|
19
19
|
|
|
20
|
-
import { ImageThumbnailWitnessConfigSchema } from './Config'
|
|
20
|
+
import { ImageThumbnailEncoding, ImageThumbnailWitnessConfigSchema } from './Config'
|
|
21
21
|
import { getVideoFrameAsImageFluent } from './ffmpeg'
|
|
22
22
|
import { ImageThumbnailWitnessParams } from './Params'
|
|
23
23
|
|
|
@@ -63,7 +63,7 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
get ipfGateway() {
|
|
66
|
-
return this.config.ipfsGateway ?? '
|
|
66
|
+
return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com'
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
get maxAsyncProcesses() {
|
|
@@ -144,10 +144,11 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
144
144
|
if (!hasbin('magick')) {
|
|
145
145
|
throw Error('ImageMagick is required for this witness')
|
|
146
146
|
}
|
|
147
|
+
const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema)
|
|
147
148
|
return await this._semaphore.runExclusive(async () =>
|
|
148
149
|
compact(
|
|
149
150
|
await Promise.all(
|
|
150
|
-
|
|
151
|
+
urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {
|
|
151
152
|
const cachedResult = this.cache.get(url)
|
|
152
153
|
if (cachedResult) {
|
|
153
154
|
return cachedResult
|
|
@@ -167,7 +168,7 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
167
168
|
} else {
|
|
168
169
|
//if it is ipfs, go through cloud flair
|
|
169
170
|
const mutatedUrl = this.checkIpfsUrl(url)
|
|
170
|
-
result = await this.fromHttp(mutatedUrl)
|
|
171
|
+
result = await this.fromHttp(mutatedUrl, url)
|
|
171
172
|
}
|
|
172
173
|
this.cache.set(url, result)
|
|
173
174
|
return result
|
|
@@ -177,13 +178,13 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
177
178
|
)
|
|
178
179
|
}
|
|
179
180
|
|
|
180
|
-
private async createThumbnailDataUrl(sourceBuffer: Buffer) {
|
|
181
|
+
private async createThumbnailDataUrl(sourceBuffer: Buffer, encoding?: ImageThumbnailEncoding) {
|
|
181
182
|
const thumb = await new Promise<Buffer>((resolve, reject) => {
|
|
182
183
|
gm(sourceBuffer)
|
|
183
184
|
.quality(this.quality)
|
|
184
185
|
.resize(this.width, this.height)
|
|
185
186
|
.flatten()
|
|
186
|
-
.toBuffer(this.encoding, (error, buffer) => {
|
|
187
|
+
.toBuffer(encoding ?? this.encoding, (error, buffer) => {
|
|
187
188
|
if (error) {
|
|
188
189
|
reject(error)
|
|
189
190
|
} else {
|
|
@@ -204,7 +205,7 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
204
205
|
return this.createThumbnailDataUrl(imageBuffer)
|
|
205
206
|
}
|
|
206
207
|
|
|
207
|
-
private async fromHttp(url: string): Promise<ImageThumbnail> {
|
|
208
|
+
private async fromHttp(url: string, sourceUrl?: string): Promise<ImageThumbnail> {
|
|
208
209
|
let response: AxiosResponse
|
|
209
210
|
let dnsResult: string[]
|
|
210
211
|
try {
|
|
@@ -218,7 +219,7 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
218
219
|
dnsError: error.code,
|
|
219
220
|
},
|
|
220
221
|
schema: ImageThumbnailSchema,
|
|
221
|
-
sourceUrl: url,
|
|
222
|
+
sourceUrl: sourceUrl ?? url,
|
|
222
223
|
}
|
|
223
224
|
return result
|
|
224
225
|
}
|
|
@@ -236,7 +237,7 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
236
237
|
status: axiosError?.response?.status,
|
|
237
238
|
},
|
|
238
239
|
schema: ImageThumbnailSchema,
|
|
239
|
-
sourceUrl: url,
|
|
240
|
+
sourceUrl: sourceUrl ?? url,
|
|
240
241
|
}
|
|
241
242
|
return result
|
|
242
243
|
} else {
|
|
@@ -249,15 +250,16 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
249
250
|
status: response.status,
|
|
250
251
|
},
|
|
251
252
|
schema: ImageThumbnailSchema,
|
|
252
|
-
sourceUrl: url,
|
|
253
|
+
sourceUrl: sourceUrl ?? url,
|
|
253
254
|
}
|
|
254
255
|
|
|
255
256
|
if (response.status >= 200 && response.status < 300) {
|
|
256
|
-
const contentType = response.headers['content-type']?.toString()
|
|
257
|
-
const mediaType = contentType.split('/')
|
|
257
|
+
const contentType: string = response.headers['content-type']?.toString()
|
|
258
|
+
const [mediaType, fileType] = contentType.split('/')
|
|
258
259
|
result.mime = result.mime ?? {}
|
|
259
260
|
result.mime.returned = mediaType
|
|
260
261
|
const sourceBuffer = Buffer.from(response.data, 'binary')
|
|
262
|
+
|
|
261
263
|
try {
|
|
262
264
|
result.mime.detected = await FileType.fromBuffer(sourceBuffer)
|
|
263
265
|
} catch (ex) {
|
|
@@ -265,9 +267,9 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
265
267
|
this.logger?.error(`FileType error: ${error.message}`)
|
|
266
268
|
}
|
|
267
269
|
|
|
268
|
-
const processImage = async () => {
|
|
270
|
+
const processImage = async (encoding?: ImageThumbnailEncoding) => {
|
|
269
271
|
result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)
|
|
270
|
-
result.url = await this.createThumbnailDataUrl(sourceBuffer)
|
|
272
|
+
result.url = await this.createThumbnailDataUrl(sourceBuffer, encoding)
|
|
271
273
|
}
|
|
272
274
|
|
|
273
275
|
const processVideo = async () => {
|
|
@@ -281,9 +283,21 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
|
|
|
281
283
|
}
|
|
282
284
|
}
|
|
283
285
|
|
|
286
|
+
let encoding: ImageThumbnailEncoding = 'PNG'
|
|
287
|
+
|
|
288
|
+
switch (fileType.toUpperCase()) {
|
|
289
|
+
case 'GIF':
|
|
290
|
+
encoding = 'GIF'
|
|
291
|
+
break
|
|
292
|
+
case 'JPG':
|
|
293
|
+
case 'JPEG':
|
|
294
|
+
encoding = 'JPG'
|
|
295
|
+
break
|
|
296
|
+
}
|
|
297
|
+
|
|
284
298
|
switch (mediaType) {
|
|
285
299
|
case 'image': {
|
|
286
|
-
await processImage()
|
|
300
|
+
await processImage(encoding)
|
|
287
301
|
result.mime.type = mediaType
|
|
288
302
|
break
|
|
289
303
|
}
|