gablilli commited on
Commit
be59b19
·
1 Parent(s): 0c0701c

fix: merge upstream (epub support)

Browse files
Files changed (4) hide show
  1. .gitignore +2 -1
  2. package-lock.json +742 -14
  3. package.json +2 -1
  4. providers/zanichelli.js +243 -148
.gitignore CHANGED
@@ -1,4 +1,5 @@
1
  node_modules/
2
  temp/
3
  tmp/
4
- *.pdf
 
 
1
  node_modules/
2
  temp/
3
  tmp/
4
+ *.pdf
5
+ *.epub
package-lock.json CHANGED
@@ -22,7 +22,6 @@
22
  "p-limit": "^6.2.0",
23
  "pdf-lib": "^1.17.1",
24
  "pdf-merger-js": "^5.1.1",
25
- "pdfkit": "^0.17.2",
26
  "prompt-sync": "^4.2.0",
27
  "sanitize-filename": "^1.6.3",
28
  "svg-to-pdfkit": "^0.1.8",
@@ -30,7 +29,104 @@
30
  "ws": "^8.19.0",
31
  "xml2js": "^0.6.2",
32
  "yargs": "^17.5.1",
33
- "yauzl": "^3.1.3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  }
35
  },
36
  "node_modules/@pdf-lib/standard-fonts": {
@@ -51,6 +147,16 @@
51
  "pako": "^1.0.10"
52
  }
53
  },
 
 
 
 
 
 
 
 
 
 
54
  "node_modules/@swc/helpers": {
55
  "version": "0.5.18",
56
  "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz",
@@ -96,6 +202,18 @@
96
  "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
97
  "license": "MIT"
98
  },
 
 
 
 
 
 
 
 
 
 
 
 
99
  "node_modules/accepts": {
100
  "version": "2.0.0",
101
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -188,24 +306,82 @@
188
  "url": "https://github.com/chalk/ansi-styles?sponsor=1"
189
  }
190
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  "node_modules/asap": {
192
  "version": "2.0.6",
193
  "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
194
  "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
195
  "license": "MIT"
196
  },
197
- "node_modules/async": {
198
- "version": "3.2.6",
199
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
200
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
201
- "license": "MIT"
202
- },
203
  "node_modules/asynckit": {
204
  "version": "0.4.0",
205
  "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
206
  "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
207
  "license": "MIT"
208
  },
 
 
 
 
 
 
209
  "node_modules/base64-js": {
210
  "version": "1.5.1",
211
  "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -284,6 +460,15 @@
284
  "url": "https://opencollective.com/express"
285
  }
286
  },
 
 
 
 
 
 
 
 
 
287
  "node_modules/brotli": {
288
  "version": "1.3.3",
289
  "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
@@ -529,6 +714,62 @@
529
  "node": ">=16"
530
  }
531
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
532
  "node_modules/concat-stream": {
533
  "version": "1.6.2",
534
  "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
@@ -620,6 +861,85 @@
620
  "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
621
  "license": "MIT"
622
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
623
  "node_modules/crypt": {
624
  "version": "0.0.2",
625
  "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
@@ -744,6 +1064,12 @@
744
  "node": ">= 0.4"
745
  }
746
  },
 
 
 
 
 
 
747
  "node_modules/ee-first": {
748
  "version": "1.1.1",
749
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -858,6 +1184,24 @@
858
  "integrity": "sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==",
859
  "license": "MIT"
860
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
861
  "node_modules/expand-template": {
862
  "version": "2.0.3",
863
  "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
@@ -1032,6 +1376,34 @@
1032
  "node": ">=0.8"
1033
  }
1034
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1035
  "node_modules/form-data": {
1036
  "version": "2.5.5",
1037
  "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz",
@@ -1163,18 +1535,33 @@
1163
  "node": ">= 0.4"
1164
  }
1165
  },
1166
- "node_modules/gettemporaryfilepath": {
1167
- "version": "1.0.1",
1168
- "resolved": "https://registry.npmjs.org/gettemporaryfilepath/-/gettemporaryfilepath-1.0.1.tgz",
1169
- "integrity": "sha512-MVCSgF1blIZuIV3KYhMKOwU1OSxPF1s+ZcyqWMSGR5Fzl6fN7EjIXDFGu9PmWAAwyGjMjmkS2ruqPaj13J3SXA==",
1170
- "license": "BSD"
1171
- },
1172
  "node_modules/github-from-package": {
1173
  "version": "0.0.0",
1174
  "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
1175
  "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
1176
  "license": "MIT"
1177
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1178
  "node_modules/gopd": {
1179
  "version": "1.2.0",
1180
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -1460,6 +1847,18 @@
1460
  "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
1461
  "license": "MIT"
1462
  },
 
 
 
 
 
 
 
 
 
 
 
 
1463
  "node_modules/is-unicode-supported": {
1464
  "version": "0.1.0",
1465
  "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
@@ -1478,6 +1877,27 @@
1478
  "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
1479
  "license": "MIT"
1480
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1481
  "node_modules/jpeg-exif": {
1482
  "version": "1.1.4",
1483
  "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
@@ -1497,6 +1917,48 @@
1497
  "graceful-fs": "^4.1.6"
1498
  }
1499
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1500
  "node_modules/linebreak": {
1501
  "version": "1.1.0",
1502
  "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
@@ -1538,6 +2000,12 @@
1538
  "url": "https://github.com/sponsors/sindresorhus"
1539
  }
1540
  },
 
 
 
 
 
 
1541
  "node_modules/math-intrinsics": {
1542
  "version": "1.1.0",
1543
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -1621,6 +2089,21 @@
1621
  "url": "https://github.com/sponsors/sindresorhus"
1622
  }
1623
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1624
  "node_modules/minimist": {
1625
  "version": "1.2.8",
1626
  "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
@@ -1630,6 +2113,15 @@
1630
  "url": "https://github.com/sponsors/ljharb"
1631
  }
1632
  },
 
 
 
 
 
 
 
 
 
1633
  "node_modules/mkdirp-classic": {
1634
  "version": "0.5.3",
1635
  "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
@@ -1737,6 +2229,15 @@
1737
  "node": ">= 6.13.0"
1738
  }
1739
  },
 
 
 
 
 
 
 
 
 
1740
  "node_modules/object-inspect": {
1741
  "version": "1.13.4",
1742
  "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -1844,6 +2345,12 @@
1844
  "url": "https://github.com/sponsors/sindresorhus"
1845
  }
1846
  },
 
 
 
 
 
 
1847
  "node_modules/pako": {
1848
  "version": "1.0.11",
1849
  "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
@@ -1864,6 +2371,31 @@
1864
  "node": ">= 0.8"
1865
  }
1866
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1867
  "node_modules/path-to-regexp": {
1868
  "version": "8.3.0",
1869
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
@@ -1953,6 +2485,15 @@
1953
  "node": ">=10"
1954
  }
1955
  },
 
 
 
 
 
 
 
 
 
1956
  "node_modules/process-nextick-args": {
1957
  "version": "2.0.1",
1958
  "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -2268,6 +2809,27 @@
2268
  "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
2269
  "license": "ISC"
2270
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2271
  "node_modules/side-channel": {
2272
  "version": "1.1.0",
2273
  "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
@@ -2423,6 +2985,42 @@
2423
  "node": ">=8"
2424
  }
2425
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2426
  "node_modules/string-width/node_modules/ansi-regex": {
2427
  "version": "5.0.1",
2428
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -2456,6 +3054,28 @@
2456
  "node": ">=6"
2457
  }
2458
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2459
  "node_modules/strip-json-comments": {
2460
  "version": "2.0.1",
2461
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
@@ -2759,6 +3379,21 @@
2759
  "node": ">= 8"
2760
  }
2761
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2762
  "node_modules/wrap-ansi": {
2763
  "version": "7.0.0",
2764
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -2776,6 +3411,45 @@
2776
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2777
  }
2778
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2779
  "node_modules/wrap-ansi/node_modules/ansi-regex": {
2780
  "version": "5.0.1",
2781
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -2906,6 +3580,60 @@
2906
  "funding": {
2907
  "url": "https://github.com/sponsors/sindresorhus"
2908
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2909
  }
2910
  }
2911
  }
 
22
  "p-limit": "^6.2.0",
23
  "pdf-lib": "^1.17.1",
24
  "pdf-merger-js": "^5.1.1",
 
25
  "prompt-sync": "^4.2.0",
26
  "sanitize-filename": "^1.6.3",
27
  "svg-to-pdfkit": "^0.1.8",
 
29
  "ws": "^8.19.0",
30
  "xml2js": "^0.6.2",
31
  "yargs": "^17.5.1",
32
+ "yauzl": "^3.1.3",
33
+ "zip-stream": "^6.0.1"
34
+ }
35
+ },
36
+ "node_modules/@isaacs/cliui": {
37
+ "version": "8.0.2",
38
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
39
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
40
+ "license": "ISC",
41
+ "dependencies": {
42
+ "string-width": "^5.1.2",
43
+ "string-width-cjs": "npm:string-width@^4.2.0",
44
+ "strip-ansi": "^7.0.1",
45
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
46
+ "wrap-ansi": "^8.1.0",
47
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
48
+ },
49
+ "engines": {
50
+ "node": ">=12"
51
+ }
52
+ },
53
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
54
+ "version": "6.2.2",
55
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
56
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
57
+ "license": "MIT",
58
+ "engines": {
59
+ "node": ">=12"
60
+ },
61
+ "funding": {
62
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
63
+ }
64
+ },
65
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
66
+ "version": "6.2.3",
67
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
68
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
69
+ "license": "MIT",
70
+ "engines": {
71
+ "node": ">=12"
72
+ },
73
+ "funding": {
74
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
75
+ }
76
+ },
77
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
78
+ "version": "9.2.2",
79
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
80
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
81
+ "license": "MIT"
82
+ },
83
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
84
+ "version": "5.1.2",
85
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
86
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
87
+ "license": "MIT",
88
+ "dependencies": {
89
+ "eastasianwidth": "^0.2.0",
90
+ "emoji-regex": "^9.2.2",
91
+ "strip-ansi": "^7.0.1"
92
+ },
93
+ "engines": {
94
+ "node": ">=12"
95
+ },
96
+ "funding": {
97
+ "url": "https://github.com/sponsors/sindresorhus"
98
+ }
99
+ },
100
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
101
+ "version": "7.2.0",
102
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
103
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
104
+ "license": "MIT",
105
+ "dependencies": {
106
+ "ansi-regex": "^6.2.2"
107
+ },
108
+ "engines": {
109
+ "node": ">=12"
110
+ },
111
+ "funding": {
112
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
113
+ }
114
+ },
115
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
116
+ "version": "8.1.0",
117
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
118
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
119
+ "license": "MIT",
120
+ "dependencies": {
121
+ "ansi-styles": "^6.1.0",
122
+ "string-width": "^5.0.1",
123
+ "strip-ansi": "^7.0.1"
124
+ },
125
+ "engines": {
126
+ "node": ">=12"
127
+ },
128
+ "funding": {
129
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
130
  }
131
  },
132
  "node_modules/@pdf-lib/standard-fonts": {
 
147
  "pako": "^1.0.10"
148
  }
149
  },
150
+ "node_modules/@pkgjs/parseargs": {
151
+ "version": "0.11.0",
152
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
153
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
154
+ "license": "MIT",
155
+ "optional": true,
156
+ "engines": {
157
+ "node": ">=14"
158
+ }
159
+ },
160
  "node_modules/@swc/helpers": {
161
  "version": "0.5.18",
162
  "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz",
 
202
  "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
203
  "license": "MIT"
204
  },
205
+ "node_modules/abort-controller": {
206
+ "version": "3.0.0",
207
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
208
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
209
+ "license": "MIT",
210
+ "dependencies": {
211
+ "event-target-shim": "^5.0.0"
212
+ },
213
+ "engines": {
214
+ "node": ">=6.5"
215
+ }
216
+ },
217
  "node_modules/accepts": {
218
  "version": "2.0.0",
219
  "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
 
306
  "url": "https://github.com/chalk/ansi-styles?sponsor=1"
307
  }
308
  },
309
+ "node_modules/archiver-utils": {
310
+ "version": "5.0.2",
311
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz",
312
+ "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==",
313
+ "license": "MIT",
314
+ "dependencies": {
315
+ "glob": "^10.0.0",
316
+ "graceful-fs": "^4.2.0",
317
+ "is-stream": "^2.0.1",
318
+ "lazystream": "^1.0.0",
319
+ "lodash": "^4.17.15",
320
+ "normalize-path": "^3.0.0",
321
+ "readable-stream": "^4.0.0"
322
+ },
323
+ "engines": {
324
+ "node": ">= 14"
325
+ }
326
+ },
327
+ "node_modules/archiver-utils/node_modules/buffer": {
328
+ "version": "6.0.3",
329
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
330
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
331
+ "funding": [
332
+ {
333
+ "type": "github",
334
+ "url": "https://github.com/sponsors/feross"
335
+ },
336
+ {
337
+ "type": "patreon",
338
+ "url": "https://www.patreon.com/feross"
339
+ },
340
+ {
341
+ "type": "consulting",
342
+ "url": "https://feross.org/support"
343
+ }
344
+ ],
345
+ "license": "MIT",
346
+ "dependencies": {
347
+ "base64-js": "^1.3.1",
348
+ "ieee754": "^1.2.1"
349
+ }
350
+ },
351
+ "node_modules/archiver-utils/node_modules/readable-stream": {
352
+ "version": "4.7.0",
353
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
354
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
355
+ "license": "MIT",
356
+ "dependencies": {
357
+ "abort-controller": "^3.0.0",
358
+ "buffer": "^6.0.3",
359
+ "events": "^3.3.0",
360
+ "process": "^0.11.10",
361
+ "string_decoder": "^1.3.0"
362
+ },
363
+ "engines": {
364
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
365
+ }
366
+ },
367
  "node_modules/asap": {
368
  "version": "2.0.6",
369
  "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
370
  "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
371
  "license": "MIT"
372
  },
 
 
 
 
 
 
373
  "node_modules/asynckit": {
374
  "version": "0.4.0",
375
  "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
376
  "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
377
  "license": "MIT"
378
  },
379
+ "node_modules/balanced-match": {
380
+ "version": "1.0.2",
381
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
382
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
383
+ "license": "MIT"
384
+ },
385
  "node_modules/base64-js": {
386
  "version": "1.5.1",
387
  "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
 
460
  "url": "https://opencollective.com/express"
461
  }
462
  },
463
+ "node_modules/brace-expansion": {
464
+ "version": "2.0.2",
465
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
466
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
467
+ "license": "MIT",
468
+ "dependencies": {
469
+ "balanced-match": "^1.0.0"
470
+ }
471
+ },
472
  "node_modules/brotli": {
473
  "version": "1.3.3",
474
  "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
 
714
  "node": ">=16"
715
  }
716
  },
717
+ "node_modules/compress-commons": {
718
+ "version": "6.0.2",
719
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
720
+ "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
721
+ "license": "MIT",
722
+ "dependencies": {
723
+ "crc-32": "^1.2.0",
724
+ "crc32-stream": "^6.0.0",
725
+ "is-stream": "^2.0.1",
726
+ "normalize-path": "^3.0.0",
727
+ "readable-stream": "^4.0.0"
728
+ },
729
+ "engines": {
730
+ "node": ">= 14"
731
+ }
732
+ },
733
+ "node_modules/compress-commons/node_modules/buffer": {
734
+ "version": "6.0.3",
735
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
736
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
737
+ "funding": [
738
+ {
739
+ "type": "github",
740
+ "url": "https://github.com/sponsors/feross"
741
+ },
742
+ {
743
+ "type": "patreon",
744
+ "url": "https://www.patreon.com/feross"
745
+ },
746
+ {
747
+ "type": "consulting",
748
+ "url": "https://feross.org/support"
749
+ }
750
+ ],
751
+ "license": "MIT",
752
+ "dependencies": {
753
+ "base64-js": "^1.3.1",
754
+ "ieee754": "^1.2.1"
755
+ }
756
+ },
757
+ "node_modules/compress-commons/node_modules/readable-stream": {
758
+ "version": "4.7.0",
759
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
760
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
761
+ "license": "MIT",
762
+ "dependencies": {
763
+ "abort-controller": "^3.0.0",
764
+ "buffer": "^6.0.3",
765
+ "events": "^3.3.0",
766
+ "process": "^0.11.10",
767
+ "string_decoder": "^1.3.0"
768
+ },
769
+ "engines": {
770
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
771
+ }
772
+ },
773
  "node_modules/concat-stream": {
774
  "version": "1.6.2",
775
  "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
 
861
  "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
862
  "license": "MIT"
863
  },
864
+ "node_modules/crc-32": {
865
+ "version": "1.2.2",
866
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
867
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
868
+ "license": "Apache-2.0",
869
+ "bin": {
870
+ "crc32": "bin/crc32.njs"
871
+ },
872
+ "engines": {
873
+ "node": ">=0.8"
874
+ }
875
+ },
876
+ "node_modules/crc32-stream": {
877
+ "version": "6.0.0",
878
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz",
879
+ "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==",
880
+ "license": "MIT",
881
+ "dependencies": {
882
+ "crc-32": "^1.2.0",
883
+ "readable-stream": "^4.0.0"
884
+ },
885
+ "engines": {
886
+ "node": ">= 14"
887
+ }
888
+ },
889
+ "node_modules/crc32-stream/node_modules/buffer": {
890
+ "version": "6.0.3",
891
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
892
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
893
+ "funding": [
894
+ {
895
+ "type": "github",
896
+ "url": "https://github.com/sponsors/feross"
897
+ },
898
+ {
899
+ "type": "patreon",
900
+ "url": "https://www.patreon.com/feross"
901
+ },
902
+ {
903
+ "type": "consulting",
904
+ "url": "https://feross.org/support"
905
+ }
906
+ ],
907
+ "license": "MIT",
908
+ "dependencies": {
909
+ "base64-js": "^1.3.1",
910
+ "ieee754": "^1.2.1"
911
+ }
912
+ },
913
+ "node_modules/crc32-stream/node_modules/readable-stream": {
914
+ "version": "4.7.0",
915
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
916
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
917
+ "license": "MIT",
918
+ "dependencies": {
919
+ "abort-controller": "^3.0.0",
920
+ "buffer": "^6.0.3",
921
+ "events": "^3.3.0",
922
+ "process": "^0.11.10",
923
+ "string_decoder": "^1.3.0"
924
+ },
925
+ "engines": {
926
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
927
+ }
928
+ },
929
+ "node_modules/cross-spawn": {
930
+ "version": "7.0.6",
931
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
932
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
933
+ "license": "MIT",
934
+ "dependencies": {
935
+ "path-key": "^3.1.0",
936
+ "shebang-command": "^2.0.0",
937
+ "which": "^2.0.1"
938
+ },
939
+ "engines": {
940
+ "node": ">= 8"
941
+ }
942
+ },
943
  "node_modules/crypt": {
944
  "version": "0.0.2",
945
  "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
 
1064
  "node": ">= 0.4"
1065
  }
1066
  },
1067
+ "node_modules/eastasianwidth": {
1068
+ "version": "0.2.0",
1069
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1070
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1071
+ "license": "MIT"
1072
+ },
1073
  "node_modules/ee-first": {
1074
  "version": "1.1.1",
1075
  "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 
1184
  "integrity": "sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==",
1185
  "license": "MIT"
1186
  },
1187
+ "node_modules/event-target-shim": {
1188
+ "version": "5.0.1",
1189
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
1190
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
1191
+ "license": "MIT",
1192
+ "engines": {
1193
+ "node": ">=6"
1194
+ }
1195
+ },
1196
+ "node_modules/events": {
1197
+ "version": "3.3.0",
1198
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
1199
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
1200
+ "license": "MIT",
1201
+ "engines": {
1202
+ "node": ">=0.8.x"
1203
+ }
1204
+ },
1205
  "node_modules/expand-template": {
1206
  "version": "2.0.3",
1207
  "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
 
1376
  "node": ">=0.8"
1377
  }
1378
  },
1379
+ "node_modules/foreground-child": {
1380
+ "version": "3.3.1",
1381
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
1382
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
1383
+ "license": "ISC",
1384
+ "dependencies": {
1385
+ "cross-spawn": "^7.0.6",
1386
+ "signal-exit": "^4.0.1"
1387
+ },
1388
+ "engines": {
1389
+ "node": ">=14"
1390
+ },
1391
+ "funding": {
1392
+ "url": "https://github.com/sponsors/isaacs"
1393
+ }
1394
+ },
1395
+ "node_modules/foreground-child/node_modules/signal-exit": {
1396
+ "version": "4.1.0",
1397
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1398
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1399
+ "license": "ISC",
1400
+ "engines": {
1401
+ "node": ">=14"
1402
+ },
1403
+ "funding": {
1404
+ "url": "https://github.com/sponsors/isaacs"
1405
+ }
1406
+ },
1407
  "node_modules/form-data": {
1408
  "version": "2.5.5",
1409
  "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz",
 
1535
  "node": ">= 0.4"
1536
  }
1537
  },
 
 
 
 
 
 
1538
  "node_modules/github-from-package": {
1539
  "version": "0.0.0",
1540
  "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
1541
  "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
1542
  "license": "MIT"
1543
  },
1544
+ "node_modules/glob": {
1545
+ "version": "10.5.0",
1546
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
1547
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
1548
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
1549
+ "license": "ISC",
1550
+ "dependencies": {
1551
+ "foreground-child": "^3.1.0",
1552
+ "jackspeak": "^3.1.2",
1553
+ "minimatch": "^9.0.4",
1554
+ "minipass": "^7.1.2",
1555
+ "package-json-from-dist": "^1.0.0",
1556
+ "path-scurry": "^1.11.1"
1557
+ },
1558
+ "bin": {
1559
+ "glob": "dist/esm/bin.mjs"
1560
+ },
1561
+ "funding": {
1562
+ "url": "https://github.com/sponsors/isaacs"
1563
+ }
1564
+ },
1565
  "node_modules/gopd": {
1566
  "version": "1.2.0",
1567
  "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 
1847
  "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
1848
  "license": "MIT"
1849
  },
1850
+ "node_modules/is-stream": {
1851
+ "version": "2.0.1",
1852
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
1853
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
1854
+ "license": "MIT",
1855
+ "engines": {
1856
+ "node": ">=8"
1857
+ },
1858
+ "funding": {
1859
+ "url": "https://github.com/sponsors/sindresorhus"
1860
+ }
1861
+ },
1862
  "node_modules/is-unicode-supported": {
1863
  "version": "0.1.0",
1864
  "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
 
1877
  "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
1878
  "license": "MIT"
1879
  },
1880
+ "node_modules/isexe": {
1881
+ "version": "2.0.0",
1882
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1883
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1884
+ "license": "ISC"
1885
+ },
1886
+ "node_modules/jackspeak": {
1887
+ "version": "3.4.3",
1888
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
1889
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
1890
+ "license": "BlueOak-1.0.0",
1891
+ "dependencies": {
1892
+ "@isaacs/cliui": "^8.0.2"
1893
+ },
1894
+ "funding": {
1895
+ "url": "https://github.com/sponsors/isaacs"
1896
+ },
1897
+ "optionalDependencies": {
1898
+ "@pkgjs/parseargs": "^0.11.0"
1899
+ }
1900
+ },
1901
  "node_modules/jpeg-exif": {
1902
  "version": "1.1.4",
1903
  "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz",
 
1917
  "graceful-fs": "^4.1.6"
1918
  }
1919
  },
1920
+ "node_modules/lazystream": {
1921
+ "version": "1.0.1",
1922
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
1923
+ "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
1924
+ "license": "MIT",
1925
+ "dependencies": {
1926
+ "readable-stream": "^2.0.5"
1927
+ },
1928
+ "engines": {
1929
+ "node": ">= 0.6.3"
1930
+ }
1931
+ },
1932
+ "node_modules/lazystream/node_modules/readable-stream": {
1933
+ "version": "2.3.8",
1934
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1935
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1936
+ "license": "MIT",
1937
+ "dependencies": {
1938
+ "core-util-is": "~1.0.0",
1939
+ "inherits": "~2.0.3",
1940
+ "isarray": "~1.0.0",
1941
+ "process-nextick-args": "~2.0.0",
1942
+ "safe-buffer": "~5.1.1",
1943
+ "string_decoder": "~1.1.1",
1944
+ "util-deprecate": "~1.0.1"
1945
+ }
1946
+ },
1947
+ "node_modules/lazystream/node_modules/safe-buffer": {
1948
+ "version": "5.1.2",
1949
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1950
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1951
+ "license": "MIT"
1952
+ },
1953
+ "node_modules/lazystream/node_modules/string_decoder": {
1954
+ "version": "1.1.1",
1955
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1956
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1957
+ "license": "MIT",
1958
+ "dependencies": {
1959
+ "safe-buffer": "~5.1.0"
1960
+ }
1961
+ },
1962
  "node_modules/linebreak": {
1963
  "version": "1.1.0",
1964
  "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
 
2000
  "url": "https://github.com/sponsors/sindresorhus"
2001
  }
2002
  },
2003
+ "node_modules/lru-cache": {
2004
+ "version": "10.4.3",
2005
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
2006
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
2007
+ "license": "ISC"
2008
+ },
2009
  "node_modules/math-intrinsics": {
2010
  "version": "1.1.0",
2011
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
 
2089
  "url": "https://github.com/sponsors/sindresorhus"
2090
  }
2091
  },
2092
+ "node_modules/minimatch": {
2093
+ "version": "9.0.9",
2094
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
2095
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
2096
+ "license": "ISC",
2097
+ "dependencies": {
2098
+ "brace-expansion": "^2.0.2"
2099
+ },
2100
+ "engines": {
2101
+ "node": ">=16 || 14 >=14.17"
2102
+ },
2103
+ "funding": {
2104
+ "url": "https://github.com/sponsors/isaacs"
2105
+ }
2106
+ },
2107
  "node_modules/minimist": {
2108
  "version": "1.2.8",
2109
  "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
 
2113
  "url": "https://github.com/sponsors/ljharb"
2114
  }
2115
  },
2116
+ "node_modules/minipass": {
2117
+ "version": "7.1.3",
2118
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
2119
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
2120
+ "license": "BlueOak-1.0.0",
2121
+ "engines": {
2122
+ "node": ">=16 || 14 >=14.17"
2123
+ }
2124
+ },
2125
  "node_modules/mkdirp-classic": {
2126
  "version": "0.5.3",
2127
  "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
 
2229
  "node": ">= 6.13.0"
2230
  }
2231
  },
2232
+ "node_modules/normalize-path": {
2233
+ "version": "3.0.0",
2234
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2235
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2236
+ "license": "MIT",
2237
+ "engines": {
2238
+ "node": ">=0.10.0"
2239
+ }
2240
+ },
2241
  "node_modules/object-inspect": {
2242
  "version": "1.13.4",
2243
  "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
 
2345
  "url": "https://github.com/sponsors/sindresorhus"
2346
  }
2347
  },
2348
+ "node_modules/package-json-from-dist": {
2349
+ "version": "1.0.1",
2350
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
2351
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
2352
+ "license": "BlueOak-1.0.0"
2353
+ },
2354
  "node_modules/pako": {
2355
  "version": "1.0.11",
2356
  "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
 
2371
  "node": ">= 0.8"
2372
  }
2373
  },
2374
+ "node_modules/path-key": {
2375
+ "version": "3.1.1",
2376
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2377
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2378
+ "license": "MIT",
2379
+ "engines": {
2380
+ "node": ">=8"
2381
+ }
2382
+ },
2383
+ "node_modules/path-scurry": {
2384
+ "version": "1.11.1",
2385
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
2386
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
2387
+ "license": "BlueOak-1.0.0",
2388
+ "dependencies": {
2389
+ "lru-cache": "^10.2.0",
2390
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
2391
+ },
2392
+ "engines": {
2393
+ "node": ">=16 || 14 >=14.18"
2394
+ },
2395
+ "funding": {
2396
+ "url": "https://github.com/sponsors/isaacs"
2397
+ }
2398
+ },
2399
  "node_modules/path-to-regexp": {
2400
  "version": "8.3.0",
2401
  "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
 
2485
  "node": ">=10"
2486
  }
2487
  },
2488
+ "node_modules/process": {
2489
+ "version": "0.11.10",
2490
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
2491
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
2492
+ "license": "MIT",
2493
+ "engines": {
2494
+ "node": ">= 0.6.0"
2495
+ }
2496
+ },
2497
  "node_modules/process-nextick-args": {
2498
  "version": "2.0.1",
2499
  "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
 
2809
  "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
2810
  "license": "ISC"
2811
  },
2812
+ "node_modules/shebang-command": {
2813
+ "version": "2.0.0",
2814
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2815
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2816
+ "license": "MIT",
2817
+ "dependencies": {
2818
+ "shebang-regex": "^3.0.0"
2819
+ },
2820
+ "engines": {
2821
+ "node": ">=8"
2822
+ }
2823
+ },
2824
+ "node_modules/shebang-regex": {
2825
+ "version": "3.0.0",
2826
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2827
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2828
+ "license": "MIT",
2829
+ "engines": {
2830
+ "node": ">=8"
2831
+ }
2832
+ },
2833
  "node_modules/side-channel": {
2834
  "version": "1.1.0",
2835
  "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
 
2985
  "node": ">=8"
2986
  }
2987
  },
2988
+ "node_modules/string-width-cjs": {
2989
+ "name": "string-width",
2990
+ "version": "4.2.3",
2991
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2992
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2993
+ "license": "MIT",
2994
+ "dependencies": {
2995
+ "emoji-regex": "^8.0.0",
2996
+ "is-fullwidth-code-point": "^3.0.0",
2997
+ "strip-ansi": "^6.0.1"
2998
+ },
2999
+ "engines": {
3000
+ "node": ">=8"
3001
+ }
3002
+ },
3003
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
3004
+ "version": "5.0.1",
3005
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3006
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3007
+ "license": "MIT",
3008
+ "engines": {
3009
+ "node": ">=8"
3010
+ }
3011
+ },
3012
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
3013
+ "version": "6.0.1",
3014
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3015
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3016
+ "license": "MIT",
3017
+ "dependencies": {
3018
+ "ansi-regex": "^5.0.1"
3019
+ },
3020
+ "engines": {
3021
+ "node": ">=8"
3022
+ }
3023
+ },
3024
  "node_modules/string-width/node_modules/ansi-regex": {
3025
  "version": "5.0.1",
3026
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 
3054
  "node": ">=6"
3055
  }
3056
  },
3057
+ "node_modules/strip-ansi-cjs": {
3058
+ "name": "strip-ansi",
3059
+ "version": "6.0.1",
3060
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3061
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3062
+ "license": "MIT",
3063
+ "dependencies": {
3064
+ "ansi-regex": "^5.0.1"
3065
+ },
3066
+ "engines": {
3067
+ "node": ">=8"
3068
+ }
3069
+ },
3070
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
3071
+ "version": "5.0.1",
3072
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3073
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3074
+ "license": "MIT",
3075
+ "engines": {
3076
+ "node": ">=8"
3077
+ }
3078
+ },
3079
  "node_modules/strip-json-comments": {
3080
  "version": "2.0.1",
3081
  "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
 
3379
  "node": ">= 8"
3380
  }
3381
  },
3382
+ "node_modules/which": {
3383
+ "version": "2.0.2",
3384
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3385
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3386
+ "license": "ISC",
3387
+ "dependencies": {
3388
+ "isexe": "^2.0.0"
3389
+ },
3390
+ "bin": {
3391
+ "node-which": "bin/node-which"
3392
+ },
3393
+ "engines": {
3394
+ "node": ">= 8"
3395
+ }
3396
+ },
3397
  "node_modules/wrap-ansi": {
3398
  "version": "7.0.0",
3399
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
 
3411
  "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3412
  }
3413
  },
3414
+ "node_modules/wrap-ansi-cjs": {
3415
+ "name": "wrap-ansi",
3416
+ "version": "7.0.0",
3417
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3418
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3419
+ "license": "MIT",
3420
+ "dependencies": {
3421
+ "ansi-styles": "^4.0.0",
3422
+ "string-width": "^4.1.0",
3423
+ "strip-ansi": "^6.0.0"
3424
+ },
3425
+ "engines": {
3426
+ "node": ">=10"
3427
+ },
3428
+ "funding": {
3429
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3430
+ }
3431
+ },
3432
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
3433
+ "version": "5.0.1",
3434
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3435
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3436
+ "license": "MIT",
3437
+ "engines": {
3438
+ "node": ">=8"
3439
+ }
3440
+ },
3441
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
3442
+ "version": "6.0.1",
3443
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3444
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3445
+ "license": "MIT",
3446
+ "dependencies": {
3447
+ "ansi-regex": "^5.0.1"
3448
+ },
3449
+ "engines": {
3450
+ "node": ">=8"
3451
+ }
3452
+ },
3453
  "node_modules/wrap-ansi/node_modules/ansi-regex": {
3454
  "version": "5.0.1",
3455
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
 
3580
  "funding": {
3581
  "url": "https://github.com/sponsors/sindresorhus"
3582
  }
3583
+ },
3584
+ "node_modules/zip-stream": {
3585
+ "version": "6.0.1",
3586
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",
3587
+ "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==",
3588
+ "license": "MIT",
3589
+ "dependencies": {
3590
+ "archiver-utils": "^5.0.0",
3591
+ "compress-commons": "^6.0.2",
3592
+ "readable-stream": "^4.0.0"
3593
+ },
3594
+ "engines": {
3595
+ "node": ">= 14"
3596
+ }
3597
+ },
3598
+ "node_modules/zip-stream/node_modules/buffer": {
3599
+ "version": "6.0.3",
3600
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
3601
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
3602
+ "funding": [
3603
+ {
3604
+ "type": "github",
3605
+ "url": "https://github.com/sponsors/feross"
3606
+ },
3607
+ {
3608
+ "type": "patreon",
3609
+ "url": "https://www.patreon.com/feross"
3610
+ },
3611
+ {
3612
+ "type": "consulting",
3613
+ "url": "https://feross.org/support"
3614
+ }
3615
+ ],
3616
+ "license": "MIT",
3617
+ "dependencies": {
3618
+ "base64-js": "^1.3.1",
3619
+ "ieee754": "^1.2.1"
3620
+ }
3621
+ },
3622
+ "node_modules/zip-stream/node_modules/readable-stream": {
3623
+ "version": "4.7.0",
3624
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
3625
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
3626
+ "license": "MIT",
3627
+ "dependencies": {
3628
+ "abort-controller": "^3.0.0",
3629
+ "buffer": "^6.0.3",
3630
+ "events": "^3.3.0",
3631
+ "process": "^0.11.10",
3632
+ "string_decoder": "^1.3.0"
3633
+ },
3634
+ "engines": {
3635
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3636
+ }
3637
  }
3638
  }
3639
  }
package.json CHANGED
@@ -42,6 +42,7 @@
42
  "ws": "^8.19.0",
43
  "xml2js": "^0.6.2",
44
  "yargs": "^17.5.1",
45
- "yauzl": "^3.1.3"
 
46
  }
47
  }
 
42
  "ws": "^8.19.0",
43
  "xml2js": "^0.6.2",
44
  "yargs": "^17.5.1",
45
+ "yauzl": "^3.1.3",
46
+ "zip-stream": "^6.0.1"
47
  }
48
  }
providers/zanichelli.js CHANGED
@@ -10,6 +10,7 @@ import aesjs from "aes-js";
10
  import forge from "node-forge";
11
  import yargs from "yargs";
12
  import { spawn } from "child_process";
 
13
 
14
  const prompt = PromptSync({ sigint: true });
15
 
@@ -130,175 +131,269 @@ async function downloadKitabooBook(bookReaderUrl, doOcr, outputDir) {
130
  let rawPrivateKey = downloadBook.privateKey;
131
  let jwtToken = downloadBook.jwtToken; // note how jwt = json web token, so what you are saying is json web token token... gg
132
 
133
- console.log("Fetching encrypted encryption key...")
 
134
 
135
- let encryptedEncryptionKey = await fetch(`https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/enc_resource.key`, {
136
- headers: {
137
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
138
- "Referer": "https://webreader.zanichelli.it/",
139
- authorization: jwtToken,
140
- cookie: readerCookies
141
- },
142
- }).then((res) => res.text()).catch((err) => {
143
- console.log("Error: ", err);
144
- process.exit(1);
145
- });
146
 
147
- console.log("Processing...");
148
-
149
- console.log("Decrypting encryption key...");
 
 
 
 
 
 
 
 
150
 
151
- let privateKey = "-----BEGIN RSA PRIVATE KEY-----\n";
152
- privateKey += rawPrivateKey.match(/.{1,64}/g).join('\n');
153
- privateKey += "\n-----END RSA PRIVATE KEY-----";
154
 
155
- let key = forge.pki.privateKeyFromPem(privateKey);
156
- let encryptionKey = key.decrypt(forge.util.decode64(encryptedEncryptionKey));
 
157
 
158
- console.log("Fetching book content...");
 
159
 
160
- let content = await fetch(`https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/content.opf`, {
161
- headers: {
162
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
163
- "Referer": "https://webreader.zanichelli.it/",
164
- cookie: readerCookies
165
- }
166
- }).then((res) => res.text()).then(parseString).catch((err) => {
167
- console.log("Error: ", err);
168
- process.exit(1);
169
- });
170
 
171
- // mention in content.metadata of render type, could be usefull in the future if other formats get added
 
 
 
 
 
 
 
 
 
172
 
173
- if (content.Error) {
174
- console.log("Error: ", ...content.Error.Code, ...content.Error.Message);
175
- process.exit(1);
176
- }
177
 
178
- let title = content.package.metadata[0]["dc:title"][0];
 
 
 
179
 
180
- let items = {};
181
 
182
- for (let item of content.package.manifest[0].item) {
183
- if (['image/svg+xml', 'image/png', 'image/jpeg'].includes(item.$['media-type'])) items[item.$.id] = item.$.href;
184
- }
185
 
186
- const pdfPath = path.join(outputDir, title.replace(/[^a-z0-9]/gi, '_') + '.pdf');
187
- const doc = new PDFDocument();
188
- const writeStream = fs.createWriteStream(pdfPath);
189
- doc.pipe(writeStream);
190
-
191
- for (let [i, itemref] of content.package.spine[0].itemref.entries()) {
192
- console.log(`Downloading ${itemref.$.idref}`);
193
- if (items[`images${itemref.$.idref}svgz`] !== undefined) {
194
- let svg = null;
195
- while (!svg) {
196
- const abortController = new AbortController();
197
- const promise = fetch(
198
- `https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/${items[`images${itemref.$.idref}svgz`]}`,
199
- { headers: {
200
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
201
- "Referer": "https://webreader.zanichelli.it/",
202
- cookie: readerCookies
203
- }, controller: abortController.signal }
204
- ).then(async (res) => {
205
- return decryptFile(encryptionKey, await res.text());
206
- });
207
- const timeoutId = setTimeout(() => abortController.abort(), 10000);
208
- svg = await promise;
209
- clearTimeout(timeoutId);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
210
  }
211
- doc.addSVG(svg, 0, 0, { preserveAspectRatio: "xMinYMin meet" });
212
- } else if (items[`images${itemref.$.idref}png`] !== undefined) {
213
- let png = null;
214
- while (!png) {
215
- const abortController = new AbortController();
216
- const promise = fetch(
217
- `https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/${items[`images${itemref.$.idref}png`]}`,
218
- { headers: {
219
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
220
- "Referer": "https://webreader.zanichelli.it/",
221
- cookie: readerCookies
222
- }, controller: abortController.signal }
223
- ).then(async (res) => {
224
- return decryptFile(encryptionKey, await res.text());
225
- });
226
- const timeoutId = setTimeout(() => abortController.abort(), 10000);
227
- png = await promise;
228
- clearTimeout(timeoutId);
 
 
 
 
 
229
  }
230
- doc.image(png, 0, 0, {fit: [doc.page.width, doc.page.height], align: 'center', valign: 'center'});
231
- } else if (items[`images${itemref.$.idref}jpg`] !== undefined) {
232
- let jpeg = null;
233
- while (!jpeg) {
234
- const abortController = new AbortController();
235
- const promise = fetch(
236
- `https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/${items[`images${itemref.$.idref}jpg`]}`,
237
- { headers: {
238
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
239
- "Referer": "https://webreader.zanichelli.it/",
240
- cookie: readerCookies
241
- }, controller: abortController.signal }
242
- ).then(async (res) => {
243
- return decryptFile(encryptionKey, await res.body());
244
- });
245
- const timeoutId = setTimeout(() => abortController.abort(), 5000)
246
- jpeg = await promise;
247
- clearTimeout(timeoutId);
 
 
 
248
  }
249
- doc.image(jpeg, 0, 0, {fit: [doc.page.width, doc.page.height], align: 'center', valign: 'center'});
250
  } else {
251
- console.log(`Unable to find suitable format for ${itemref.$.idref}`);
 
252
  }
253
- if (i < content.package.spine[0].itemref.length - 1) doc.addPage();
254
- }
255
 
256
- doc.end();
257
-
258
- // Wait for the write stream to finish
259
- await new Promise((resolve, reject) => {
260
- writeStream.on('finish', resolve);
261
- writeStream.on('error', reject);
262
- });
263
-
264
- let fileExists = false;
265
- for (let i = 0; i < 50; i++) {
266
- try {
267
- const stats = await fs.promises.stat(pdfPath);
268
- console.log(`Check ${i+1}: File size = ${stats.size} bytes`);
269
- if (stats.size > 0) {
270
- fileExists = true;
271
- console.log("File found!");
272
- break;
273
- }
274
- } catch (e) {
275
- console.log(`Check ${i+1}: File not found yet`);
276
  }
277
- await new Promise(resolve => setTimeout(resolve, 200));
278
- }
279
-
280
- if (!fileExists) {
281
- console.error('PDF file was not created');
282
- console.error('Expected file: ' + pdfPath);
283
- console.error('Current directory: ' + process.cwd());
284
- process.exit(1);
285
- }
286
-
287
- console.log("Running OCR to make text selectable...");
288
- if (doOcr) {
289
- try {
290
- const ocrPath = path.join(outputDir, 'ocr_' + path.basename(pdfPath));
291
- await runOCR(pdfPath, ocrPath);
292
- console.log("Done! PDF with selectable text: " + ocrPath);
293
- console.log(`OURBOOKS_OUTPUT:${ocrPath}`);
294
- } catch (err) {
295
- console.error("OCR error:", err.message);
296
- console.error("The PDF was saved without OCR as: " + pdfPath);
297
- console.log(`OURBOOKS_OUTPUT:${pdfPath}`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
298
  }
 
 
 
 
 
 
299
  } else {
300
- console.log("Done! PDF saved: " + pdfPath);
301
- console.log(`OURBOOKS_OUTPUT:${pdfPath}`);
302
  }
303
  }
304
 
 
10
  import forge from "node-forge";
11
  import yargs from "yargs";
12
  import { spawn } from "child_process";
13
+ import ZipStream from "zip-stream";
14
 
15
  const prompt = PromptSync({ sigint: true });
16
 
 
131
  let rawPrivateKey = downloadBook.privateKey;
132
  let jwtToken = downloadBook.jwtToken; // note how jwt = json web token, so what you are saying is json web token token... gg
133
 
134
+ if (bookDetails.bookList[0].book.assetType == "BOOK") {
135
+ console.log("Detected standard book, downloading as PDF");
136
 
137
+ console.log("Fetching encrypted encryption key...")
 
 
 
 
 
 
 
 
 
 
138
 
139
+ let encryptedEncryptionKey = await fetch(`https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/enc_resource.key`, {
140
+ headers: {
141
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
142
+ "Referer": "https://webreader.zanichelli.it/",
143
+ authorization: jwtToken,
144
+ cookie: readerCookies
145
+ },
146
+ }).then((res) => res.text()).catch((err) => {
147
+ console.log("Error: ", err);
148
+ process.exit(1);
149
+ });
150
 
151
+ console.log("Processing...");
152
+
153
+ console.log("Decrypting encryption key...");
154
 
155
+ let privateKey = "-----BEGIN RSA PRIVATE KEY-----\n";
156
+ privateKey += rawPrivateKey.match(/.{1,64}/g).join('\n');
157
+ privateKey += "\n-----END RSA PRIVATE KEY-----";
158
 
159
+ let key = forge.pki.privateKeyFromPem(privateKey);
160
+ let encryptionKey = key.decrypt(forge.util.decode64(encryptedEncryptionKey));
161
 
162
+ console.log("Fetching book content...");
 
 
 
 
 
 
 
 
 
163
 
164
+ let content = await fetch(`https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/content.opf`, {
165
+ headers: {
166
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
167
+ "Referer": "https://webreader.zanichelli.it/",
168
+ cookie: readerCookies
169
+ }
170
+ }).then((res) => res.text()).then(parseString).catch((err) => {
171
+ console.log("Error: ", err);
172
+ process.exit(1);
173
+ });
174
 
175
+ // mention in content.metadata of render type, could be usefull in the future if other formats get added
 
 
 
176
 
177
+ if (content.Error) {
178
+ console.log("Error: ", ...content.Error.Code, ...content.Error.Message);
179
+ process.exit(1);
180
+ }
181
 
182
+ let title = content.package.metadata[0]["dc:title"][0];
183
 
184
+ let items = {};
 
 
185
 
186
+ for (let item of content.package.manifest[0].item) {
187
+ if (['image/svg+xml', 'image/png', 'image/jpeg'].includes(item.$['media-type'])) items[item.$.id] = item.$.href;
188
+ }
189
+
190
+ const pdfPath = path.join(outputDir, title.replace(/[^a-z0-9]/gi, '_') + '.pdf');
191
+ const doc = new PDFDocument();
192
+ const writeStream = fs.createWriteStream(pdfPath);
193
+ doc.pipe(writeStream);
194
+
195
+ for (let [i, itemref] of content.package.spine[0].itemref.entries()) {
196
+ console.log(`Downloading ${itemref.$.idref}`);
197
+ if (items[`images${itemref.$.idref}svgz`] !== undefined) {
198
+ let svg = null;
199
+ while (!svg) {
200
+ const abortController = new AbortController();
201
+ const promise = fetch(
202
+ `https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/${items[`images${itemref.$.idref}svgz`]}`,
203
+ { headers: {
204
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
205
+ "Referer": "https://webreader.zanichelli.it/",
206
+ cookie: readerCookies
207
+ }, controller: abortController.signal }
208
+ ).then(async (res) => {
209
+ return decryptFile(encryptionKey, await res.text());
210
+ });
211
+ const timeoutId = setTimeout(() => abortController.abort(), 10000);
212
+ svg = await promise;
213
+ clearTimeout(timeoutId);
214
+ }
215
+ doc.addSVG(svg, 0, 0, { preserveAspectRatio: "xMinYMin meet" });
216
+ } else if (items[`images${itemref.$.idref}png`] !== undefined) {
217
+ let png = null;
218
+ while (!png) {
219
+ const abortController = new AbortController();
220
+ const promise = fetch(
221
+ `https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/${items[`images${itemref.$.idref}png`]}`,
222
+ { headers: {
223
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
224
+ "Referer": "https://webreader.zanichelli.it/",
225
+ cookie: readerCookies
226
+ }, controller: abortController.signal }
227
+ ).then(async (res) => {
228
+ return decryptFile(encryptionKey, await res.text());
229
+ });
230
+ const timeoutId = setTimeout(() => abortController.abort(), 10000);
231
+ png = await promise;
232
+ clearTimeout(timeoutId);
233
+ }
234
+ doc.image(png, 0, 0, {fit: [doc.page.width, doc.page.height], align: 'center', valign: 'center'});
235
+ } else if (items[`images${itemref.$.idref}jpg`] !== undefined) {
236
+ let jpeg = null;
237
+ while (!jpeg) {
238
+ const abortController = new AbortController();
239
+ const promise = fetch(
240
+ `https://webreader.zanichelli.it/${ebookID}/html5/${ebookID}/OPS/${items[`images${itemref.$.idref}jpg`]}`,
241
+ { headers: {
242
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
243
+ "Referer": "https://webreader.zanichelli.it/",
244
+ cookie: readerCookies
245
+ }, controller: abortController.signal }
246
+ ).then(async (res) => {
247
+ return decryptFile(encryptionKey, await res.body());
248
+ });
249
+ const timeoutId = setTimeout(() => abortController.abort(), 5000)
250
+ jpeg = await promise;
251
+ clearTimeout(timeoutId);
252
+ }
253
+ doc.image(jpeg, 0, 0, {fit: [doc.page.width, doc.page.height], align: 'center', valign: 'center'});
254
+ } else {
255
+ console.log(`Unable to find suitable format for ${itemref.$.idref}`);
256
  }
257
+ if (i < content.package.spine[0].itemref.length - 1) doc.addPage();
258
+ }
259
+
260
+ doc.end();
261
+
262
+ // Wait for the write stream to finish
263
+ await new Promise((resolve, reject) => {
264
+ writeStream.on('finish', resolve);
265
+ writeStream.on('error', reject);
266
+ });
267
+
268
+ let fileExists = false;
269
+ for (let i = 0; i < 50; i++) {
270
+ try {
271
+ const stats = await fs.promises.stat(pdfPath);
272
+ console.log(`Check ${i+1}: File size = ${stats.size} bytes`);
273
+ if (stats.size > 0) {
274
+ fileExists = true;
275
+ console.log("File found!");
276
+ break;
277
+ }
278
+ } catch (e) {
279
+ console.log(`Check ${i+1}: File not found yet`);
280
  }
281
+ await new Promise(resolve => setTimeout(resolve, 200));
282
+ }
283
+
284
+ if (!fileExists) {
285
+ console.error('PDF file was not created');
286
+ console.error('Expected file: ' + pdfPath);
287
+ console.error('Current directory: ' + process.cwd());
288
+ process.exit(1);
289
+ }
290
+
291
+ console.log("Running OCR to make text selectable...");
292
+ if (doOcr) {
293
+ try {
294
+ const ocrPath = path.join(outputDir, 'ocr_' + path.basename(pdfPath));
295
+ await runOCR(pdfPath, ocrPath);
296
+ console.log("Done! PDF with selectable text: " + ocrPath);
297
+ console.log(`OURBOOKS_OUTPUT:${ocrPath}`);
298
+ } catch (err) {
299
+ console.error("OCR error:", err.message);
300
+ console.error("The PDF was saved without OCR as: " + pdfPath);
301
+ console.log(`OURBOOKS_OUTPUT:${pdfPath}`);
302
  }
 
303
  } else {
304
+ console.log("Done! PDF saved: " + pdfPath);
305
+ console.log(`OURBOOKS_OUTPUT:${pdfPath}`);
306
  }
307
+ } else if (bookDetails.bookList[0].book.assetType == "EPUB") {
308
+ console.log("Detected liquid book, downloading as EPUB");
309
 
310
+ const archive = new ZipStream({store: true});
311
+
312
+ archive.on("error", function (err) {
313
+ throw err;
314
+ });
315
+
316
+ function saveFile(fileName, content) {
317
+ return new Promise((resolve, reject) => {
318
+ archive.entry(content, {
319
+ name: fileName,
320
+ }, (err, res) => {
321
+ if (err) reject(err);
322
+ else resolve(res);
323
+ });
324
+ });
 
 
 
 
 
325
  }
326
+
327
+ const epubPath = path.join(outputDir, bookDetails.bookList[0].book.title.trim().replace(/[^a-z0-9]/gi, '_') + ".epub");
328
+ archive.pipe(fs.createWriteStream(epubPath));
329
+
330
+ console.log("Fetching container file");
331
+
332
+ const rootUrl = `https://webreader.zanichelli.it/${ebookID}/fixed_epub_image/${ebookID}/`
333
+
334
+ const containerFile = await fetch(rootUrl + "META-INF/container.xml", {
335
+ headers: {
336
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
337
+ "Referer": "https://webreader.zanichelli.it/",
338
+ cookie: readerCookies
339
+ }
340
+ }).then((res) => res.text()).catch((err) => {
341
+ console.log("Error: ", err);
342
+ process.exit(1);
343
+ });
344
+
345
+ const parsedContainerFile = await parseString(containerFile);
346
+ const rootFileUrl = parsedContainerFile.container.rootfiles[0].rootfile[0].$['full-path'];
347
+
348
+ await saveFile("META-INF/container.xml", containerFile);
349
+
350
+ console.log("Fetching root file");
351
+
352
+ const rootFile = await fetch(rootUrl + rootFileUrl, {
353
+ headers: {
354
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
355
+ "Referer": "https://webreader.zanichelli.it/",
356
+ cookie: readerCookies
357
+ }
358
+ }).then((res) => res.text()).catch((err) => {
359
+ console.log("Error: ", err);
360
+ process.exit(1);
361
+ });
362
+
363
+ const parsedRootFile = await parseString(rootFile);
364
+
365
+ await saveFile(rootFileUrl, rootFile);
366
+
367
+ const prefix = path.dirname(rootFileUrl) + '/';
368
+
369
+ for (let i = 0; i < parsedRootFile.package.manifest[0].item.length; i++) {
370
+ console.log(`Fetching content ${i+1}/${parsedRootFile.package.manifest[0].item.length}`);
371
+
372
+ const fileEntry = parsedRootFile.package.manifest[0].item[i];
373
+ const file = await fetch(rootUrl + prefix + fileEntry.$['href'], {
374
+ headers: {
375
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
376
+ "Referer": "https://webreader.zanichelli.it/",
377
+ cookie: readerCookies
378
+ }
379
+ }).then(res => {
380
+ if (!res.ok) throw res;
381
+ return res;
382
+ }).then(async (res) => Buffer.from(await res.arrayBuffer())).catch((err) => {
383
+ console.log("Error: ", err);
384
+ process.exit(1);
385
+ });
386
+
387
+ await saveFile(prefix + fileEntry.$['href'], file);
388
  }
389
+
390
+ console.log("Finalising");
391
+
392
+ archive.finalize();
393
+ console.log("Done! You'll find the EPUB where it was requested as " + epubPath);
394
+ console.log(`OURBOOKS_OUTPUT:${epubPath}`);
395
  } else {
396
+ console.log(`Unknown book type (${bookDetails.bookList[0].book.assetType}), please open an issue on github`);
 
397
  }
398
  }
399