@fdm-monster/server 2.0.6 → 2.0.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/.yarn/install-state.gz +0 -0
- package/RELEASE_NOTES.MD +31 -0
- package/dist/consoles/bambu-mqtt-diagnostic.console.js +565 -0
- package/dist/consoles/bambu-mqtt-diagnostic.console.js.map +1 -0
- package/dist/consoles/mock-bambu.server.js +114 -88
- package/dist/consoles/mock-bambu.server.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +34 -14
- package/dist/controllers/file-storage.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +33 -236
- package/dist/controllers/print-job.controller.js.map +1 -1
- package/dist/controllers/print-queue.controller.js +82 -17
- package/dist/controllers/print-queue.controller.js.map +1 -1
- package/dist/controllers/printer-files.controller.js +8 -2
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer.controller.js +3 -3
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/entities/print-job.entity.js.map +1 -1
- package/dist/server.constants.js +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js +13 -21
- package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
- package/dist/services/bambu/bambu-mqtt.adapter.js +86 -32
- package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
- package/dist/services/bambu/bambu.client.js.map +1 -1
- package/dist/services/bambu.api.js +12 -24
- package/dist/services/bambu.api.js.map +1 -1
- package/dist/services/file-storage.service.js +11 -2
- package/dist/services/file-storage.service.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js +5 -17
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +3 -2
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +5 -17
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint.api.js +3 -2
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/print-job.service.js +55 -47
- package/dist/services/orm/print-job.service.js.map +1 -1
- package/dist/services/print-queue.service.js +90 -30
- package/dist/services/print-queue.service.js.map +1 -1
- package/dist/services/printer-api.interface.js +13 -0
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js +12 -22
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js.map +1 -1
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js +50 -0
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -0
- package/dist/utils/bgcode/bgcode.constants.js +57 -0
- package/dist/utils/bgcode/bgcode.constants.js.map +1 -0
- package/dist/utils/bgcode/bgcode.types.js +132 -0
- package/dist/utils/bgcode/bgcode.types.js.map +1 -0
- package/dist/utils/bgcode/bgcode.utils.js +288 -0
- package/dist/utils/bgcode/bgcode.utils.js.map +1 -0
- package/dist/utils/bgcode/heatshrink-decoder.js +172 -0
- package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -0
- package/dist/utils/bgcode/png-encoder.js +76 -0
- package/dist/utils/bgcode/png-encoder.js.map +1 -0
- package/dist/utils/bgcode/qoi-decoder.js +141 -0
- package/dist/utils/bgcode/qoi-decoder.js.map +1 -0
- package/dist/utils/image-dimensions.js +62 -0
- package/dist/utils/image-dimensions.js.map +1 -0
- package/dist/utils/job-stats.util.js +79 -0
- package/dist/utils/job-stats.util.js.map +1 -0
- package/dist/utils/parsers/3mf.parser.js +39 -9
- package/dist/utils/parsers/3mf.parser.js.map +1 -1
- package/dist/utils/parsers/bgcode.parser.js +125 -144
- package/dist/utils/parsers/bgcode.parser.js.map +1 -1
- package/dist/utils/parsers/gcode.parser.js +13 -2
- package/dist/utils/parsers/gcode.parser.js.map +1 -1
- package/dist/utils/parsers/parser.types.js +6 -0
- package/dist/utils/parsers/parser.types.js.map +1 -0
- package/dist/utils/thumbnail.util.js +24 -0
- package/dist/utils/thumbnail.util.js.map +1 -0
- package/package.json +13 -10
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "HeatshrinkDecoder", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return HeatshrinkDecoder;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var HSState = /*#__PURE__*/ function(HSState) {
|
|
12
|
+
HSState[HSState["TAG_BIT"] = 0] = "TAG_BIT";
|
|
13
|
+
HSState[HSState["YIELD_LITERAL"] = 1] = "YIELD_LITERAL";
|
|
14
|
+
HSState[HSState["BACKREF_INDEX_MSB"] = 2] = "BACKREF_INDEX_MSB";
|
|
15
|
+
HSState[HSState["BACKREF_INDEX_LSB"] = 3] = "BACKREF_INDEX_LSB";
|
|
16
|
+
HSState[HSState["BACKREF_COUNT_MSB"] = 4] = "BACKREF_COUNT_MSB";
|
|
17
|
+
HSState[HSState["BACKREF_COUNT_LSB"] = 5] = "BACKREF_COUNT_LSB";
|
|
18
|
+
HSState[HSState["YIELD_BACKREF"] = 6] = "YIELD_BACKREF";
|
|
19
|
+
return HSState;
|
|
20
|
+
}(HSState || {});
|
|
21
|
+
class HeatshrinkDecoder {
|
|
22
|
+
windowBits;
|
|
23
|
+
lookaheadBits;
|
|
24
|
+
windowSize;
|
|
25
|
+
window;
|
|
26
|
+
head = 0;
|
|
27
|
+
state = 0;
|
|
28
|
+
outputIndex = 0;
|
|
29
|
+
outputCount = 0;
|
|
30
|
+
inputBuffer;
|
|
31
|
+
inputIndex = 0;
|
|
32
|
+
bitAccumulator = 0;
|
|
33
|
+
bitsAvailable = 0;
|
|
34
|
+
constructor(windowBits, lookaheadBits){
|
|
35
|
+
this.windowBits = windowBits;
|
|
36
|
+
this.lookaheadBits = lookaheadBits;
|
|
37
|
+
this.windowSize = 1 << windowBits;
|
|
38
|
+
this.window = Buffer.alloc(this.windowSize);
|
|
39
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
40
|
+
}
|
|
41
|
+
decompress(input) {
|
|
42
|
+
this.inputBuffer = input;
|
|
43
|
+
this.inputIndex = 0;
|
|
44
|
+
this.bitAccumulator = 0;
|
|
45
|
+
this.bitsAvailable = 0;
|
|
46
|
+
this.head = 0;
|
|
47
|
+
this.state = 0;
|
|
48
|
+
const output = [];
|
|
49
|
+
while(this.inputIndex < this.inputBuffer.length || this.bitsAvailable > 0){
|
|
50
|
+
const result = this.step();
|
|
51
|
+
if (result === null) {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
if (result >= 0) {
|
|
55
|
+
output.push(result);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return Buffer.from(output);
|
|
59
|
+
}
|
|
60
|
+
step() {
|
|
61
|
+
switch(this.state){
|
|
62
|
+
case 0:
|
|
63
|
+
return this.handleTagBit();
|
|
64
|
+
case 1:
|
|
65
|
+
return this.handleYieldLiteral();
|
|
66
|
+
case 2:
|
|
67
|
+
return this.handleBackrefIndexMSB();
|
|
68
|
+
case 3:
|
|
69
|
+
return this.handleBackrefIndexLSB();
|
|
70
|
+
case 4:
|
|
71
|
+
return this.handleBackrefCountMSB();
|
|
72
|
+
case 5:
|
|
73
|
+
return this.handleBackrefCountLSB();
|
|
74
|
+
case 6:
|
|
75
|
+
return this.handleYieldBackref();
|
|
76
|
+
default:
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
readBits(count) {
|
|
81
|
+
while(this.bitsAvailable < count && this.inputIndex < this.inputBuffer.length){
|
|
82
|
+
this.bitAccumulator = this.bitAccumulator << 8 | this.inputBuffer[this.inputIndex++];
|
|
83
|
+
this.bitsAvailable += 8;
|
|
84
|
+
}
|
|
85
|
+
if (this.bitsAvailable < count) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
this.bitsAvailable -= count;
|
|
89
|
+
const result = this.bitAccumulator >> this.bitsAvailable & (1 << count) - 1;
|
|
90
|
+
this.bitAccumulator &= (1 << this.bitsAvailable) - 1;
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
handleTagBit() {
|
|
94
|
+
const bit = this.readBits(1);
|
|
95
|
+
if (bit === null) return null;
|
|
96
|
+
if (bit === 1) {
|
|
97
|
+
this.state = 1;
|
|
98
|
+
} else {
|
|
99
|
+
if (this.windowBits > 8) {
|
|
100
|
+
this.state = 2;
|
|
101
|
+
} else {
|
|
102
|
+
this.outputIndex = 0;
|
|
103
|
+
this.state = 3;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return -1;
|
|
107
|
+
}
|
|
108
|
+
handleYieldLiteral() {
|
|
109
|
+
const byte = this.readBits(8);
|
|
110
|
+
if (byte === null) return null;
|
|
111
|
+
this.pushByte(byte);
|
|
112
|
+
this.state = 0;
|
|
113
|
+
return byte;
|
|
114
|
+
}
|
|
115
|
+
handleBackrefIndexMSB() {
|
|
116
|
+
const msb = this.readBits(this.windowBits - 8);
|
|
117
|
+
if (msb === null) return null;
|
|
118
|
+
this.outputIndex = msb << 8;
|
|
119
|
+
this.state = 3;
|
|
120
|
+
return -1;
|
|
121
|
+
}
|
|
122
|
+
handleBackrefIndexLSB() {
|
|
123
|
+
const bits = this.windowBits > 8 ? 8 : this.windowBits;
|
|
124
|
+
const lsb = this.readBits(bits);
|
|
125
|
+
if (lsb === null) return null;
|
|
126
|
+
this.outputIndex |= lsb;
|
|
127
|
+
this.outputCount = 0;
|
|
128
|
+
if (this.lookaheadBits > 8) {
|
|
129
|
+
this.state = 4;
|
|
130
|
+
} else {
|
|
131
|
+
this.state = 5;
|
|
132
|
+
}
|
|
133
|
+
return -1;
|
|
134
|
+
}
|
|
135
|
+
handleBackrefCountMSB() {
|
|
136
|
+
const msb = this.readBits(this.lookaheadBits - 8);
|
|
137
|
+
if (msb === null) return null;
|
|
138
|
+
this.outputCount = msb << 8;
|
|
139
|
+
this.state = 5;
|
|
140
|
+
return -1;
|
|
141
|
+
}
|
|
142
|
+
handleBackrefCountLSB() {
|
|
143
|
+
const bits = this.lookaheadBits > 8 ? 8 : this.lookaheadBits;
|
|
144
|
+
const lsb = this.readBits(bits);
|
|
145
|
+
if (lsb === null) return null;
|
|
146
|
+
this.outputCount |= lsb;
|
|
147
|
+
this.outputCount += 1;
|
|
148
|
+
this.outputIndex += 1;
|
|
149
|
+
this.state = 6;
|
|
150
|
+
return -1;
|
|
151
|
+
}
|
|
152
|
+
handleYieldBackref() {
|
|
153
|
+
if (this.outputCount === 0) {
|
|
154
|
+
this.state = 0;
|
|
155
|
+
return -1;
|
|
156
|
+
}
|
|
157
|
+
const pos = (this.head - this.outputIndex + this.windowSize) % this.windowSize;
|
|
158
|
+
const byte = this.window[pos];
|
|
159
|
+
this.pushByte(byte);
|
|
160
|
+
this.outputCount--;
|
|
161
|
+
if (this.outputCount === 0) {
|
|
162
|
+
this.state = 0;
|
|
163
|
+
}
|
|
164
|
+
return byte;
|
|
165
|
+
}
|
|
166
|
+
pushByte(byte) {
|
|
167
|
+
this.window[this.head] = byte;
|
|
168
|
+
this.head = (this.head + 1) % this.windowSize;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
//# sourceMappingURL=heatshrink-decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/bgcode/heatshrink-decoder.ts"],"names":["HeatshrinkDecoder","HSState","windowBits","lookaheadBits","windowSize","window","head","state","outputIndex","outputCount","inputBuffer","inputIndex","bitAccumulator","bitsAvailable","Buffer","alloc","decompress","input","output","length","result","step","push","from","handleTagBit","handleYieldLiteral","handleBackrefIndexMSB","handleBackrefIndexLSB","handleBackrefCountMSB","handleBackrefCountLSB","handleYieldBackref","readBits","count","bit","byte","pushByte","msb","bits","lsb","pos"],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "encodePNG", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return encodePNG;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _nodezlib = require("node:zlib");
|
|
12
|
+
const PNG_SIGNATURE = Buffer.from([
|
|
13
|
+
0x89,
|
|
14
|
+
0x50,
|
|
15
|
+
0x4E,
|
|
16
|
+
0x47,
|
|
17
|
+
0x0D,
|
|
18
|
+
0x0A,
|
|
19
|
+
0x1A,
|
|
20
|
+
0x0A
|
|
21
|
+
]);
|
|
22
|
+
function crc32(buffer) {
|
|
23
|
+
let crc = 0xffffffff;
|
|
24
|
+
for(let i = 0; i < buffer.length; i++){
|
|
25
|
+
crc ^= buffer[i];
|
|
26
|
+
for(let j = 0; j < 8; j++){
|
|
27
|
+
crc = crc >>> 1 ^ 0xedb88320 & -(crc & 1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
31
|
+
}
|
|
32
|
+
function writeChunk(type, data) {
|
|
33
|
+
const typeBuffer = Buffer.from(type, 'ascii');
|
|
34
|
+
const length = Buffer.alloc(4);
|
|
35
|
+
length.writeUInt32BE(data.length, 0);
|
|
36
|
+
const crcBuffer = Buffer.concat([
|
|
37
|
+
typeBuffer,
|
|
38
|
+
data
|
|
39
|
+
]);
|
|
40
|
+
const crc = Buffer.alloc(4);
|
|
41
|
+
crc.writeUInt32BE(crc32(crcBuffer), 0);
|
|
42
|
+
return Buffer.concat([
|
|
43
|
+
length,
|
|
44
|
+
typeBuffer,
|
|
45
|
+
data,
|
|
46
|
+
crc
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
function encodePNG(width, height, rgba) {
|
|
50
|
+
const ihdr = Buffer.alloc(13);
|
|
51
|
+
ihdr.writeUInt32BE(width, 0);
|
|
52
|
+
ihdr.writeUInt32BE(height, 4);
|
|
53
|
+
ihdr.writeUInt8(8, 8);
|
|
54
|
+
ihdr.writeUInt8(6, 9);
|
|
55
|
+
ihdr.writeUInt8(0, 10);
|
|
56
|
+
ihdr.writeUInt8(0, 11);
|
|
57
|
+
ihdr.writeUInt8(0, 12);
|
|
58
|
+
const bytesPerPixel = 4;
|
|
59
|
+
const scanlineLength = width * bytesPerPixel;
|
|
60
|
+
const filteredData = Buffer.alloc(height * (scanlineLength + 1));
|
|
61
|
+
for(let y = 0; y < height; y++){
|
|
62
|
+
const scanlineOffset = y * (scanlineLength + 1);
|
|
63
|
+
filteredData[scanlineOffset] = 0;
|
|
64
|
+
rgba.copy(filteredData, scanlineOffset + 1, y * scanlineLength, (y + 1) * scanlineLength);
|
|
65
|
+
}
|
|
66
|
+
const compressed = (0, _nodezlib.deflateSync)(filteredData);
|
|
67
|
+
const chunks = [
|
|
68
|
+
PNG_SIGNATURE,
|
|
69
|
+
writeChunk('IHDR', ihdr),
|
|
70
|
+
writeChunk('IDAT', compressed),
|
|
71
|
+
writeChunk('IEND', Buffer.alloc(0))
|
|
72
|
+
];
|
|
73
|
+
return Buffer.concat(chunks);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=png-encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/bgcode/png-encoder.ts"],"names":["encodePNG","PNG_SIGNATURE","Buffer","from","crc32","buffer","crc","i","length","j","writeChunk","type","data","typeBuffer","alloc","writeUInt32BE","crcBuffer","concat","width","height","rgba","ihdr","writeUInt8","bytesPerPixel","scanlineLength","filteredData","y","scanlineOffset","copy","compressed","deflateSync","chunks"],"mappings":";;;;+BAiCgBA;;;eAAAA;;;0BA5BY;AAE5B,MAAMC,gBAAgBC,OAAOC,IAAI,CAAC;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK;AAElF,SAASC,MAAMC,MAAc;IAE3B,IAAIC,MAAM;IACV,IAAK,IAAIC,IAAI,GAAGA,IAAIF,OAAOG,MAAM,EAAED,IAAK;QACtCD,OAAOD,MAAM,CAACE,EAAE;QAChB,IAAK,IAAIE,IAAI,GAAGA,IAAI,GAAGA,IAAK;YAC1BH,MAAM,AAACA,QAAQ,IAAM,aAAa,CAAEA,CAAAA,MAAM,CAAA;QAC5C;IACF;IACA,OAAO,AAACA,CAAAA,MAAM,UAAS,MAAO;AAChC;AAEA,SAASI,WAAWC,IAAY,EAAEC,IAAY;IAC5C,MAAMC,aAAaX,OAAOC,IAAI,CAACQ,MAAM;IACrC,MAAMH,SAASN,OAAOY,KAAK,CAAC;IAC5BN,OAAOO,aAAa,CAACH,KAAKJ,MAAM,EAAE;IAElC,MAAMQ,YAAYd,OAAOe,MAAM,CAAC;QAACJ;QAAYD;KAAK;IAClD,MAAMN,MAAMJ,OAAOY,KAAK,CAAC;IACzBR,IAAIS,aAAa,CAACX,MAAMY,YAAY;IAEpC,OAAOd,OAAOe,MAAM,CAAC;QAACT;QAAQK;QAAYD;QAAMN;KAAI;AACtD;AAEO,SAASN,UAAUkB,KAAa,EAAEC,MAAc,EAAEC,IAAY;IACnE,MAAMC,OAAOnB,OAAOY,KAAK,CAAC;IAC1BO,KAAKN,aAAa,CAACG,OAAO;IAC1BG,KAAKN,aAAa,CAACI,QAAQ;IAC3BE,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IAGnB,MAAMC,gBAAgB;IACtB,MAAMC,iBAAiBN,QAAQK;IAC/B,MAAME,eAAevB,OAAOY,KAAK,CAACK,SAAUK,CAAAA,iBAAiB,CAAA;IAE7D,IAAK,IAAIE,IAAI,GAAGA,IAAIP,QAAQO,IAAK;QAC/B,MAAMC,iBAAiBD,IAAKF,CAAAA,iBAAiB,CAAA;QAC7CC,YAAY,CAACE,eAAe,GAAG;QAC/BP,KAAKQ,IAAI,CAACH,cAAcE,iBAAiB,GAAGD,IAAIF,gBAAgB,AAACE,CAAAA,IAAI,CAAA,IAAKF;IAC5E;IAGA,MAAMK,aAAaC,IAAAA,qBAAW,EAACL;IAG/B,MAAMM,SAAS;QACb9B;QACAS,WAAW,QAAQW;QACnBX,WAAW,QAAQmB;QACnBnB,WAAW,QAAQR,OAAOY,KAAK,CAAC;KACjC;IAED,OAAOZ,OAAOe,MAAM,CAACc;AACvB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "decodeQOI", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return decodeQOI;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const QOI_OP_INDEX = 0x00;
|
|
12
|
+
const QOI_OP_DIFF = 0x40;
|
|
13
|
+
const QOI_OP_LUMA = 0x80;
|
|
14
|
+
const QOI_OP_RUN = 0xc0;
|
|
15
|
+
const QOI_OP_RGB = 0xfe;
|
|
16
|
+
const QOI_OP_RGBA = 0xff;
|
|
17
|
+
const QOI_MAGIC = 0x716f6966;
|
|
18
|
+
function hashColor(r, g, b, a) {
|
|
19
|
+
return (r * 3 + g * 5 + b * 7 + a * 11) % 64;
|
|
20
|
+
}
|
|
21
|
+
function decodeQOI(buffer) {
|
|
22
|
+
let pos = 0;
|
|
23
|
+
if (buffer.length < 14) {
|
|
24
|
+
throw new Error('Invalid QOI file: too short');
|
|
25
|
+
}
|
|
26
|
+
const magic = buffer.readUInt32BE(pos);
|
|
27
|
+
pos += 4;
|
|
28
|
+
if (magic !== QOI_MAGIC) {
|
|
29
|
+
throw new Error(`Invalid QOI magic: expected ${QOI_MAGIC.toString(16)}, got ${magic.toString(16)}`);
|
|
30
|
+
}
|
|
31
|
+
const width = buffer.readUInt32BE(pos);
|
|
32
|
+
pos += 4;
|
|
33
|
+
const height = buffer.readUInt32BE(pos);
|
|
34
|
+
pos += 4;
|
|
35
|
+
const channels = buffer.readUInt8(pos);
|
|
36
|
+
pos += 1;
|
|
37
|
+
const colorspace = buffer.readUInt8(pos);
|
|
38
|
+
pos += 1;
|
|
39
|
+
if (channels !== 3 && channels !== 4) {
|
|
40
|
+
throw new Error(`Invalid QOI channels: ${channels}`);
|
|
41
|
+
}
|
|
42
|
+
const pixelCount = width * height;
|
|
43
|
+
const outputSize = pixelCount * 4;
|
|
44
|
+
const output = Buffer.alloc(outputSize);
|
|
45
|
+
const colorArray = new Array(64);
|
|
46
|
+
for(let i = 0; i < 64; i++){
|
|
47
|
+
colorArray[i] = [
|
|
48
|
+
0,
|
|
49
|
+
0,
|
|
50
|
+
0,
|
|
51
|
+
0
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
let r = 0, g = 0, b = 0, a = 255;
|
|
55
|
+
let outPos = 0;
|
|
56
|
+
while(outPos < outputSize){
|
|
57
|
+
if (pos + 8 <= buffer.length) {
|
|
58
|
+
let isEnd = true;
|
|
59
|
+
for(let i = 0; i < 7; i++){
|
|
60
|
+
if (buffer[pos + i] !== 0x00) {
|
|
61
|
+
isEnd = false;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (isEnd && buffer[pos + 7] === 0x01) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (pos >= buffer.length) {
|
|
70
|
+
throw new Error('Unexpected end of QOI data');
|
|
71
|
+
}
|
|
72
|
+
const byte1 = buffer[pos++];
|
|
73
|
+
if (byte1 === QOI_OP_RGB) {
|
|
74
|
+
r = buffer[pos++];
|
|
75
|
+
g = buffer[pos++];
|
|
76
|
+
b = buffer[pos++];
|
|
77
|
+
} else if (byte1 === QOI_OP_RGBA) {
|
|
78
|
+
r = buffer[pos++];
|
|
79
|
+
g = buffer[pos++];
|
|
80
|
+
b = buffer[pos++];
|
|
81
|
+
a = buffer[pos++];
|
|
82
|
+
} else {
|
|
83
|
+
const tag = byte1 & 0xc0;
|
|
84
|
+
if (tag === QOI_OP_INDEX) {
|
|
85
|
+
const index = byte1 & 0x3f;
|
|
86
|
+
[r, g, b, a] = colorArray[index];
|
|
87
|
+
} else if (tag === QOI_OP_DIFF) {
|
|
88
|
+
const dr = (byte1 >> 4 & 0x03) - 2;
|
|
89
|
+
const dg = (byte1 >> 2 & 0x03) - 2;
|
|
90
|
+
const db = (byte1 & 0x03) - 2;
|
|
91
|
+
r = r + dr & 0xff;
|
|
92
|
+
g = g + dg & 0xff;
|
|
93
|
+
b = b + db & 0xff;
|
|
94
|
+
} else if (tag === QOI_OP_LUMA) {
|
|
95
|
+
const byte2 = buffer[pos++];
|
|
96
|
+
const dg = (byte1 & 0x3f) - 32;
|
|
97
|
+
const dr_dg = (byte2 >> 4 & 0x0f) - 8;
|
|
98
|
+
const db_dg = (byte2 & 0x0f) - 8;
|
|
99
|
+
g = g + dg & 0xff;
|
|
100
|
+
r = r + dg + dr_dg & 0xff;
|
|
101
|
+
b = b + dg + db_dg & 0xff;
|
|
102
|
+
} else if (tag === QOI_OP_RUN) {
|
|
103
|
+
const run = (byte1 & 0x3f) + 1;
|
|
104
|
+
for(let i = 0; i < run; i++){
|
|
105
|
+
output[outPos++] = r;
|
|
106
|
+
output[outPos++] = g;
|
|
107
|
+
output[outPos++] = b;
|
|
108
|
+
output[outPos++] = a;
|
|
109
|
+
}
|
|
110
|
+
const hash = hashColor(r, g, b, a);
|
|
111
|
+
colorArray[hash] = [
|
|
112
|
+
r,
|
|
113
|
+
g,
|
|
114
|
+
b,
|
|
115
|
+
a
|
|
116
|
+
];
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
output[outPos++] = r;
|
|
121
|
+
output[outPos++] = g;
|
|
122
|
+
output[outPos++] = b;
|
|
123
|
+
output[outPos++] = a;
|
|
124
|
+
const hash = hashColor(r, g, b, a);
|
|
125
|
+
colorArray[hash] = [
|
|
126
|
+
r,
|
|
127
|
+
g,
|
|
128
|
+
b,
|
|
129
|
+
a
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
width,
|
|
134
|
+
height,
|
|
135
|
+
channels,
|
|
136
|
+
colorspace,
|
|
137
|
+
data: output
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=qoi-decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/bgcode/qoi-decoder.ts"],"names":["decodeQOI","QOI_OP_INDEX","QOI_OP_DIFF","QOI_OP_LUMA","QOI_OP_RUN","QOI_OP_RGB","QOI_OP_RGBA","QOI_MAGIC","hashColor","r","g","b","a","buffer","pos","length","Error","magic","readUInt32BE","toString","width","height","channels","readUInt8","colorspace","pixelCount","outputSize","output","Buffer","alloc","colorArray","Array","i","outPos","isEnd","byte1","tag","index","dr","dg","db","byte2","dr_dg","db_dg","run","hash","data"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "getImageDimensions", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return getImageDimensions;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
function getImageDimensions(imageData, format) {
|
|
12
|
+
if (format === "PNG") {
|
|
13
|
+
return getPngDimensions(imageData);
|
|
14
|
+
} else if (format === "JPG" || format === "JPEG") {
|
|
15
|
+
return getJpgDimensions(imageData);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
width: 0,
|
|
19
|
+
height: 0
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function getPngDimensions(data) {
|
|
23
|
+
if (data.length < 24) {
|
|
24
|
+
return {
|
|
25
|
+
width: 0,
|
|
26
|
+
height: 0
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const width = data.readUInt32BE(16);
|
|
30
|
+
const height = data.readUInt32BE(20);
|
|
31
|
+
return {
|
|
32
|
+
width,
|
|
33
|
+
height
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getJpgDimensions(data) {
|
|
37
|
+
let offset = 2;
|
|
38
|
+
while(offset < data.length){
|
|
39
|
+
if (data[offset] !== 0xFF) break;
|
|
40
|
+
const marker = data[offset + 1];
|
|
41
|
+
offset += 2;
|
|
42
|
+
if (marker === 0xC0 || marker === 0xC2) {
|
|
43
|
+
if (offset + 5 < data.length) {
|
|
44
|
+
const height = data.readUInt16BE(offset + 1);
|
|
45
|
+
const width = data.readUInt16BE(offset + 3);
|
|
46
|
+
return {
|
|
47
|
+
width,
|
|
48
|
+
height
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
const segmentLength = data.readUInt16BE(offset);
|
|
54
|
+
offset += segmentLength;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
width: 0,
|
|
58
|
+
height: 0
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=image-dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/image-dimensions.ts"],"names":["getImageDimensions","imageData","format","getPngDimensions","getJpgDimensions","width","height","data","length","readUInt32BE","offset","marker","readUInt16BE","segmentLength"],"mappings":";;;;+BAAgBA;;;eAAAA;;;AAAT,SAASA,mBAAmBC,SAAiB,EAAEC,MAAc;IAClE,IAAIA,WAAW,OAAO;QACpB,OAAOC,iBAAiBF;IAC1B,OAAO,IAAIC,WAAW,SAASA,WAAW,QAAQ;QAChD,OAAOE,iBAAiBH;IAC1B;IACA,OAAO;QAAEI,OAAO;QAAGC,QAAQ;IAAE;AAC/B;AAEA,SAASH,iBAAiBI,IAAY;IACpC,IAAIA,KAAKC,MAAM,GAAG,IAAI;QACpB,OAAO;YAAEH,OAAO;YAAGC,QAAQ;QAAE;IAC/B;IAEA,MAAMD,QAAQE,KAAKE,YAAY,CAAC;IAChC,MAAMH,SAASC,KAAKE,YAAY,CAAC;IAEjC,OAAO;QAAEJ;QAAOC;IAAO;AACzB;AAEA,SAASF,iBAAiBG,IAAY;IACpC,IAAIG,SAAS;IAEb,MAAOA,SAASH,KAAKC,MAAM,CAAE;QAC3B,IAAID,IAAI,CAACG,OAAO,KAAK,MAAM;QAE3B,MAAMC,SAASJ,IAAI,CAACG,SAAS,EAAE;QAC/BA,UAAU;QAEV,IAAIC,WAAW,QAAQA,WAAW,MAAM;YACtC,IAAID,SAAS,IAAIH,KAAKC,MAAM,EAAE;gBAC5B,MAAMF,SAASC,KAAKK,YAAY,CAACF,SAAS;gBAC1C,MAAML,QAAQE,KAAKK,YAAY,CAACF,SAAS;gBACzC,OAAO;oBAAEL;oBAAOC;gBAAO;YACzB;YACA;QACF;QAEA,MAAMO,gBAAgBN,KAAKK,YAAY,CAACF;QACxCA,UAAUG;IACZ;IAEA,OAAO;QAAER,OAAO;QAAGC,QAAQ;IAAE;AAC/B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get calculateJobDuration () {
|
|
13
|
+
return calculateJobDuration;
|
|
14
|
+
},
|
|
15
|
+
get initializeOrUpdateStatistics () {
|
|
16
|
+
return initializeOrUpdateStatistics;
|
|
17
|
+
},
|
|
18
|
+
get updateStatisticsForCancellation () {
|
|
19
|
+
return updateStatisticsForCancellation;
|
|
20
|
+
},
|
|
21
|
+
get updateStatisticsForCompletion () {
|
|
22
|
+
return updateStatisticsForCompletion;
|
|
23
|
+
},
|
|
24
|
+
get updateStatisticsForFailure () {
|
|
25
|
+
return updateStatisticsForFailure;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
function calculateJobDuration(startedAt, endedAt = new Date()) {
|
|
29
|
+
if (!startedAt) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return (endedAt.getTime() - startedAt.getTime()) / 1000;
|
|
33
|
+
}
|
|
34
|
+
function initializeOrUpdateStatistics(job, endedAt = new Date(), options = {}) {
|
|
35
|
+
const actualPrintTimeSeconds = calculateJobDuration(job.startedAt, endedAt);
|
|
36
|
+
if (!job.statistics) {
|
|
37
|
+
return {
|
|
38
|
+
startedAt: job.startedAt,
|
|
39
|
+
endedAt,
|
|
40
|
+
actualPrintTimeSeconds,
|
|
41
|
+
progress: options.progress ?? job.progress ?? null,
|
|
42
|
+
failureReason: options.failureReason,
|
|
43
|
+
failureTime: options.failureTime
|
|
44
|
+
};
|
|
45
|
+
} else {
|
|
46
|
+
job.statistics.endedAt = endedAt;
|
|
47
|
+
job.statistics.actualPrintTimeSeconds = actualPrintTimeSeconds;
|
|
48
|
+
if (options.progress !== undefined) {
|
|
49
|
+
job.statistics.progress = options.progress;
|
|
50
|
+
}
|
|
51
|
+
if (options.failureReason !== undefined) {
|
|
52
|
+
job.statistics.failureReason = options.failureReason;
|
|
53
|
+
job.statistics.failureTime = options.failureTime ?? endedAt;
|
|
54
|
+
}
|
|
55
|
+
return job.statistics;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function updateStatisticsForCompletion(job, endedAt = new Date()) {
|
|
59
|
+
job.statistics = initializeOrUpdateStatistics(job, endedAt, {
|
|
60
|
+
progress: 100
|
|
61
|
+
});
|
|
62
|
+
job.endedAt = endedAt;
|
|
63
|
+
job.progress = 100;
|
|
64
|
+
}
|
|
65
|
+
function updateStatisticsForFailure(job, reason, endedAt = new Date()) {
|
|
66
|
+
job.statistics = initializeOrUpdateStatistics(job, endedAt, {
|
|
67
|
+
failureReason: reason,
|
|
68
|
+
failureTime: endedAt
|
|
69
|
+
});
|
|
70
|
+
job.endedAt = endedAt;
|
|
71
|
+
job.statusReason = reason;
|
|
72
|
+
}
|
|
73
|
+
function updateStatisticsForCancellation(job, reason = "Print cancelled by user", endedAt = new Date()) {
|
|
74
|
+
job.statistics = initializeOrUpdateStatistics(job, endedAt);
|
|
75
|
+
job.endedAt = endedAt;
|
|
76
|
+
job.statusReason = reason;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=job-stats.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/job-stats.util.ts"],"names":["calculateJobDuration","initializeOrUpdateStatistics","updateStatisticsForCancellation","updateStatisticsForCompletion","updateStatisticsForFailure","startedAt","endedAt","Date","getTime","job","options","actualPrintTimeSeconds","statistics","progress","failureReason","failureTime","undefined","reason","statusReason"],"mappings":";;;;;;;;;;;QAEgBA;eAAAA;;QAaAC;eAAAA;;QAoDAC;eAAAA;;QAnBAC;eAAAA;;QAMAC;eAAAA;;;AApDT,SAASJ,qBAAqBK,SAAsB,EAAEC,UAAgB,IAAIC,MAAM;IACrF,IAAI,CAACF,WAAW;QACd,OAAO;IACT;IACA,OAAO,AAACC,CAAAA,QAAQE,OAAO,KAAKH,UAAUG,OAAO,EAAC,IAAK;AACrD;AAQO,SAASP,6BACdQ,GAAa,EACbH,UAAgB,IAAIC,MAAM,EAC1BG,UAAmC,CAAC,CAAC;IAErC,MAAMC,yBAAyBX,qBAAqBS,IAAIJ,SAAS,EAAEC;IAEnE,IAAI,CAACG,IAAIG,UAAU,EAAE;QACnB,OAAO;YACLP,WAAWI,IAAIJ,SAAS;YACxBC;YACAK;YACAE,UAAUH,QAAQG,QAAQ,IAAIJ,IAAII,QAAQ,IAAI;YAC9CC,eAAeJ,QAAQI,aAAa;YACpCC,aAAaL,QAAQK,WAAW;QAClC;IACF,OAAO;QACLN,IAAIG,UAAU,CAACN,OAAO,GAAGA;QACzBG,IAAIG,UAAU,CAACD,sBAAsB,GAAGA;QAExC,IAAID,QAAQG,QAAQ,KAAKG,WAAW;YAClCP,IAAIG,UAAU,CAACC,QAAQ,GAAGH,QAAQG,QAAQ;QAC5C;QAEA,IAAIH,QAAQI,aAAa,KAAKE,WAAW;YACvCP,IAAIG,UAAU,CAACE,aAAa,GAAGJ,QAAQI,aAAa;YACpDL,IAAIG,UAAU,CAACG,WAAW,GAAGL,QAAQK,WAAW,IAAIT;QACtD;QAEA,OAAOG,IAAIG,UAAU;IACvB;AACF;AAEO,SAAST,8BAA8BM,GAAa,EAAEH,UAAgB,IAAIC,MAAM;IACrFE,IAAIG,UAAU,GAAGX,6BAA6BQ,KAAKH,SAAS;QAAEO,UAAU;IAAI;IAC5EJ,IAAIH,OAAO,GAAGA;IACdG,IAAII,QAAQ,GAAG;AACjB;AAEO,SAAST,2BACdK,GAAa,EACbQ,MAAc,EACdX,UAAgB,IAAIC,MAAM;IAE1BE,IAAIG,UAAU,GAAGX,6BAA6BQ,KAAKH,SAAS;QAC1DQ,eAAeG;QACfF,aAAaT;IACf;IACAG,IAAIH,OAAO,GAAGA;IACdG,IAAIS,YAAY,GAAGD;AACrB;AAEO,SAASf,gCACdO,GAAa,EACbQ,SAAiB,yBAAyB,EAC1CX,UAAgB,IAAIC,MAAM;IAE1BE,IAAIG,UAAU,GAAGX,6BAA6BQ,KAAKH;IACnDG,IAAIH,OAAO,GAAGA;IACdG,IAAIS,YAAY,GAAGD;AACrB"}
|
|
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "ThreeMFParser", {
|
|
|
11
11
|
const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
|
|
12
12
|
const _nodepath = /*#__PURE__*/ _interop_require_wildcard(require("node:path"));
|
|
13
13
|
const _admzip = /*#__PURE__*/ _interop_require_default(require("adm-zip"));
|
|
14
|
+
const _imagedimensions = require("../image-dimensions");
|
|
14
15
|
function _interop_require_default(obj) {
|
|
15
16
|
return obj && obj.__esModule ? obj : {
|
|
16
17
|
default: obj
|
|
@@ -158,6 +159,12 @@ class ThreeMFParser {
|
|
|
158
159
|
slicerVersion: topLevelSlicerVersion,
|
|
159
160
|
maxLayerZ: topLevelMaxZ,
|
|
160
161
|
totalLayers: topLevelLayers,
|
|
162
|
+
thumbnails: thumbnails.length > 0 ? thumbnails.map((t)=>({
|
|
163
|
+
width: t.width,
|
|
164
|
+
height: t.height,
|
|
165
|
+
format: t.format,
|
|
166
|
+
dataLength: t.data?.length || 0
|
|
167
|
+
})) : undefined,
|
|
161
168
|
plates: plates.length > 0 ? plates : undefined
|
|
162
169
|
};
|
|
163
170
|
return {
|
|
@@ -223,6 +230,24 @@ class ThreeMFParser {
|
|
|
223
230
|
const gcodeContent = entry.getData().toString("utf8", 0, Math.min(50000, entry.getData().length));
|
|
224
231
|
const metadata = this.parseGCodeHeader(gcodeContent);
|
|
225
232
|
const plateThumbs = zipEntries.filter((e)=>e.entryName.includes(`plate_${plateMatch[1]}`) && (e.entryName.endsWith(".png") || e.entryName.endsWith(".jpg")));
|
|
233
|
+
const plateThumbnails = plateThumbs.map((t)=>{
|
|
234
|
+
const format = t.entryName.endsWith(".png") ? "PNG" : "JPG";
|
|
235
|
+
const imageData = t.getData();
|
|
236
|
+
const sizeMatch = t.entryName.match(/(\d+)x(\d+)/);
|
|
237
|
+
let width = sizeMatch ? Number.parseInt(sizeMatch[1]) : 0;
|
|
238
|
+
let height = sizeMatch ? Number.parseInt(sizeMatch[2]) : 0;
|
|
239
|
+
if (width === 0 || height === 0) {
|
|
240
|
+
const dimensions = (0, _imagedimensions.getImageDimensions)(imageData, format);
|
|
241
|
+
width = dimensions.width;
|
|
242
|
+
height = dimensions.height;
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
width,
|
|
246
|
+
height,
|
|
247
|
+
format,
|
|
248
|
+
data: imageData.toString("base64")
|
|
249
|
+
};
|
|
250
|
+
});
|
|
226
251
|
const printTime = this.parseTime(metadata.model_printing_time || metadata.total_estimated_time || metadata.print_time);
|
|
227
252
|
const filamentWeight = this.parseFloat(metadata.total_filament_weight_g || metadata.filament_weight || metadata.total_filament_weight);
|
|
228
253
|
const layerCount = this.parseInt(metadata.total_layer_number || metadata.layer_count || metadata.total_layers);
|
|
@@ -246,11 +271,12 @@ class ThreeMFParser {
|
|
|
246
271
|
filamentType: metadata.filament_type || null,
|
|
247
272
|
printerModel: metadata.printer_model || null,
|
|
248
273
|
objects: [],
|
|
249
|
-
thumbnails:
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
274
|
+
thumbnails: plateThumbnails.length > 0 ? plateThumbnails.map((t)=>({
|
|
275
|
+
width: t.width,
|
|
276
|
+
height: t.height,
|
|
277
|
+
format: t.format,
|
|
278
|
+
dataLength: t.data?.length || 0
|
|
279
|
+
})) : undefined
|
|
254
280
|
};
|
|
255
281
|
plates.push(plateMetadata);
|
|
256
282
|
}
|
|
@@ -293,17 +319,21 @@ class ThreeMFParser {
|
|
|
293
319
|
const thumbnails = [];
|
|
294
320
|
const thumbEntries = zipEntries.filter((e)=>e.entryName.match(/Metadata\/.*\.(png|jpg|jpeg)/i) || e.entryName.match(/Thumbnails\/.*/i));
|
|
295
321
|
for (const entry of thumbEntries){
|
|
296
|
-
const sizeMatch = entry.entryName.match(/(\d+)x(\d+)/);
|
|
297
|
-
const width = sizeMatch ? Number.parseInt(sizeMatch[1]) : 0;
|
|
298
|
-
const height = sizeMatch ? Number.parseInt(sizeMatch[2]) : 0;
|
|
299
322
|
const format = entry.entryName.match(/\.(png|jpg|jpeg)$/i)?.[1].toUpperCase() || "PNG";
|
|
300
323
|
const imageData = entry.getData();
|
|
324
|
+
const sizeMatch = entry.entryName.match(/(\d+)x(\d+)/);
|
|
325
|
+
let width = sizeMatch ? Number.parseInt(sizeMatch[1]) : 0;
|
|
326
|
+
let height = sizeMatch ? Number.parseInt(sizeMatch[2]) : 0;
|
|
327
|
+
if (width === 0 || height === 0) {
|
|
328
|
+
const dimensions = (0, _imagedimensions.getImageDimensions)(imageData, format);
|
|
329
|
+
width = dimensions.width;
|
|
330
|
+
height = dimensions.height;
|
|
331
|
+
}
|
|
301
332
|
const base64Data = imageData.toString("base64");
|
|
302
333
|
thumbnails.push({
|
|
303
334
|
width,
|
|
304
335
|
height,
|
|
305
336
|
format,
|
|
306
|
-
path: entry.entryName,
|
|
307
337
|
data: base64Data
|
|
308
338
|
});
|
|
309
339
|
}
|