@prose-reader/metadata-fetcher 1.356.0 → 1.357.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +338 -375
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Report as
|
|
3
|
-
import { XmlDocument as
|
|
1
|
+
import { identifierValue as e, isIsbnBearingScheme as t, mainTitle as n, normalizeIsbn as r, parseW3cDtfDate as i } from "@prose-reader/archive-reader";
|
|
2
|
+
import { Report as a } from "@prose-reader/shared";
|
|
3
|
+
import { XmlDocument as o } from "xmldoc";
|
|
4
4
|
//#region src/utils/metadataAuthors.ts
|
|
5
|
-
var
|
|
5
|
+
var s = (e) => {
|
|
6
6
|
let t = e.contributors ?? [], n = t.filter((e) => e.roles.includes("author")), r = (n.length > 0 ? n : t).map((e) => e.name.trim()).filter((e) => e.length > 0);
|
|
7
7
|
return [...new Set(r)];
|
|
8
|
-
},
|
|
9
|
-
let t =
|
|
8
|
+
}, c = /^\d{13}$/, l = /^\d{9}[\dX]$/, u = (e) => {
|
|
9
|
+
let t = r(e);
|
|
10
10
|
if (t === void 0) return;
|
|
11
|
-
if (
|
|
12
|
-
if (!
|
|
13
|
-
let n = `978${t.slice(0, 9)}`,
|
|
11
|
+
if (c.test(t)) return t;
|
|
12
|
+
if (!l.test(t)) return;
|
|
13
|
+
let n = `978${t.slice(0, 9)}`, i = 0;
|
|
14
14
|
for (let e = 0; e < n.length; e++) {
|
|
15
15
|
let t = n.charCodeAt(e) - 48;
|
|
16
|
-
|
|
16
|
+
i += e % 2 == 0 ? t : t * 3;
|
|
17
17
|
}
|
|
18
|
-
return `${n}${(10 -
|
|
19
|
-
},
|
|
18
|
+
return `${n}${(10 - i % 10) % 10}`;
|
|
19
|
+
}, d = /[\u0300-\u036f]/g, f = /[^\p{L}\p{N}]+/gu, p = (e) => e.normalize("NFD").replace(d, "").toLowerCase().replace(f, " ").trim(), m = (e) => {
|
|
20
20
|
let t = /* @__PURE__ */ new Map();
|
|
21
21
|
for (let n = 0; n < e.length - 1; n++) {
|
|
22
22
|
let r = e.slice(n, n + 2);
|
|
23
23
|
t.set(r, (t.get(r) ?? 0) + 1);
|
|
24
24
|
}
|
|
25
25
|
return t;
|
|
26
|
-
},
|
|
27
|
-
let n =
|
|
26
|
+
}, h = (e, t) => {
|
|
27
|
+
let n = p(e).replaceAll(" ", ""), r = p(t).replaceAll(" ", "");
|
|
28
28
|
if (n.length === 0 || r.length === 0) return 0;
|
|
29
29
|
if (n === r) return 1;
|
|
30
30
|
if (n.length < 2 || r.length < 2) return 0;
|
|
31
|
-
let i =
|
|
32
|
-
for (let [e, t] of
|
|
31
|
+
let i = m(n), a = 0;
|
|
32
|
+
for (let [e, t] of m(r)) a += Math.min(t, i.get(e) ?? 0);
|
|
33
33
|
return 2 * a / (n.length - 1 + (r.length - 1));
|
|
34
|
-
},
|
|
35
|
-
let [t = "", ...n] = e.split(
|
|
34
|
+
}, g = /\s*[:;]\s*|\s+[-–—]\s+/, _ = (e) => {
|
|
35
|
+
let [t = "", ...n] = e.split(g), r = t.trim(), i = n.join(" ").trim();
|
|
36
36
|
return r.length === 0 ? {
|
|
37
37
|
main: e,
|
|
38
38
|
hasSubtitle: !1
|
|
@@ -40,11 +40,11 @@ var c = (e) => {
|
|
|
40
40
|
main: r,
|
|
41
41
|
hasSubtitle: i.length > 0
|
|
42
42
|
};
|
|
43
|
-
},
|
|
43
|
+
}, v = .9, y = [
|
|
44
44
|
"volume",
|
|
45
45
|
"part",
|
|
46
46
|
"book"
|
|
47
|
-
],
|
|
47
|
+
], b = /\b(volumes?|vols?|parts?|books?)\s+([\p{L}\p{N}]+)\b/gu, x = {
|
|
48
48
|
one: 1,
|
|
49
49
|
first: 1,
|
|
50
50
|
two: 2,
|
|
@@ -69,7 +69,7 @@ var c = (e) => {
|
|
|
69
69
|
eleventh: 11,
|
|
70
70
|
twelve: 12,
|
|
71
71
|
twelfth: 12
|
|
72
|
-
},
|
|
72
|
+
}, S = {
|
|
73
73
|
i: 1,
|
|
74
74
|
v: 5,
|
|
75
75
|
x: 10,
|
|
@@ -77,58 +77,58 @@ var c = (e) => {
|
|
|
77
77
|
c: 100,
|
|
78
78
|
d: 500,
|
|
79
79
|
m: 1e3
|
|
80
|
-
},
|
|
80
|
+
}, C = (e) => {
|
|
81
81
|
if (!/^m{0,3}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/i.test(e)) return;
|
|
82
82
|
let t = 0, n = 0;
|
|
83
83
|
for (let r of [...e.toLowerCase()].reverse()) {
|
|
84
|
-
let e =
|
|
84
|
+
let e = S[r];
|
|
85
85
|
if (e === void 0) return;
|
|
86
86
|
e < n ? t -= e : (t += e, n = e);
|
|
87
87
|
}
|
|
88
88
|
return t > 0 ? t : void 0;
|
|
89
|
-
},
|
|
89
|
+
}, w = (e) => /^\d+$/.test(e) ? Number.parseInt(e, 10) : x[e] ?? C(e), T = (e) => {
|
|
90
90
|
if (e.startsWith("vol")) return "volume";
|
|
91
91
|
if (e.startsWith("part")) return "part";
|
|
92
92
|
if (e.startsWith("book")) return "book";
|
|
93
|
-
},
|
|
93
|
+
}, E = (e) => {
|
|
94
94
|
let t = /* @__PURE__ */ new Map();
|
|
95
|
-
for (let n of
|
|
96
|
-
let e = n[1] === void 0 ? void 0 :
|
|
95
|
+
for (let n of p(e).matchAll(b)) {
|
|
96
|
+
let e = n[1] === void 0 ? void 0 : T(n[1]), r = n[2] === void 0 ? void 0 : w(n[2]);
|
|
97
97
|
if (e === void 0 || r === void 0) continue;
|
|
98
98
|
let i = t.get(e) ?? /* @__PURE__ */ new Set();
|
|
99
99
|
i.add(r), t.set(e, i);
|
|
100
100
|
}
|
|
101
101
|
return t;
|
|
102
|
-
},
|
|
103
|
-
let n =
|
|
104
|
-
for (let e of
|
|
102
|
+
}, D = (e, t) => {
|
|
103
|
+
let n = E(e), r = E(t);
|
|
104
|
+
for (let e of y) {
|
|
105
105
|
let t = n.get(e), i = r.get(e);
|
|
106
106
|
if (!(t === void 0 || i === void 0) && [...t].every((e) => !i.has(e))) return !0;
|
|
107
107
|
}
|
|
108
108
|
return !1;
|
|
109
|
-
},
|
|
109
|
+
}, O = (e) => {
|
|
110
110
|
let t = /* @__PURE__ */ new Set();
|
|
111
|
-
for (let n of
|
|
111
|
+
for (let n of E(e).values()) for (let e of n) t.add(e);
|
|
112
112
|
return t;
|
|
113
|
+
}, k = (e, t) => {
|
|
114
|
+
if (D(e, t)) return 0;
|
|
115
|
+
let n = h(e, t), r = _(e), i = _(t);
|
|
116
|
+
return r.hasSubtitle === i.hasSubtitle ? n : Math.max(n, h(r.main, i.main) * v);
|
|
113
117
|
}, ee = (e, t) => {
|
|
114
|
-
if (O(e, t)) return 0;
|
|
115
|
-
let n = g(e, t), r = v(e), i = v(t);
|
|
116
|
-
return r.hasSubtitle === i.hasSubtitle ? n : Math.max(n, g(r.main, i.main) * y);
|
|
117
|
-
}, te = (e, t) => {
|
|
118
118
|
let n;
|
|
119
119
|
for (let r of t) {
|
|
120
|
-
if (
|
|
120
|
+
if (D(e, r)) return {
|
|
121
121
|
score: 0,
|
|
122
122
|
candidate: r
|
|
123
123
|
};
|
|
124
|
-
let t =
|
|
124
|
+
let t = k(e, r);
|
|
125
125
|
(n === void 0 || t > n.score) && (n = {
|
|
126
126
|
score: t,
|
|
127
127
|
candidate: r
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
130
|
return n;
|
|
131
|
-
},
|
|
131
|
+
}, te = (e) => p(e).split(" ").filter((e) => e.length > 0).sort().join(" "), ne = (e, t) => h(te(e), te(t)), re = {
|
|
132
132
|
isbn: 1,
|
|
133
133
|
gtin: 1,
|
|
134
134
|
identifiers: .6,
|
|
@@ -139,27 +139,27 @@ var c = (e) => {
|
|
|
139
139
|
publisher: .15,
|
|
140
140
|
languages: .15,
|
|
141
141
|
numberOfPages: .15
|
|
142
|
-
},
|
|
142
|
+
}, ie = /* @__PURE__ */ new Set(["isbn", "gtin"]), A = (e) => {
|
|
143
143
|
let t = e?.trim();
|
|
144
144
|
return t !== void 0 && t.length > 0 ? t : void 0;
|
|
145
|
-
},
|
|
145
|
+
}, ae = (e, t) => {
|
|
146
146
|
let n = A(e.value)?.toLowerCase();
|
|
147
147
|
return n !== void 0 && n === A(t.value)?.toLowerCase();
|
|
148
|
-
}, j = (e) => e.scheme.trim().toLowerCase() === "unknown" ? void 0 : A(e.scheme)?.toLowerCase(),
|
|
149
|
-
if (!
|
|
148
|
+
}, j = (e) => e.scheme.trim().toLowerCase() === "unknown" ? void 0 : A(e.scheme)?.toLowerCase(), oe = (e) => `${e.scheme}:${e.value}`, se = (e, t) => {
|
|
149
|
+
if (!ae(e, t)) return !1;
|
|
150
150
|
let n = j(e), r = j(t);
|
|
151
151
|
return n === void 0 || r === void 0 || n === r;
|
|
152
|
-
},
|
|
153
|
-
if (!
|
|
152
|
+
}, ce = (e, t) => {
|
|
153
|
+
if (!ae(e, t)) return !1;
|
|
154
154
|
let n = j(e), r = j(t);
|
|
155
155
|
return n !== void 0 && n === r;
|
|
156
|
-
},
|
|
156
|
+
}, le = (e) => e.trim().toLowerCase().split("-")[0] ?? "", ue = (e, t) => {
|
|
157
157
|
let n = Math.abs(e - t);
|
|
158
158
|
return n === 0 ? 1 : n === 1 ? .6 : n <= 3 ? .3 : 0;
|
|
159
|
-
},
|
|
159
|
+
}, de = (e, t) => {
|
|
160
160
|
let n = Math.max(e, t);
|
|
161
161
|
return n <= 0 ? 0 : Math.max(0, 1 - Math.abs(e - t) / n * 2);
|
|
162
|
-
},
|
|
162
|
+
}, fe = (e, t, n) => e.reduce((e, r) => t.reduce((e, t) => Math.max(e, n(r, t)), e), 0), pe = (e, t, n = h) => {
|
|
163
163
|
let r = A(e);
|
|
164
164
|
if (r === void 0) return;
|
|
165
165
|
let i;
|
|
@@ -174,127 +174,127 @@ var c = (e) => {
|
|
|
174
174
|
(i === void 0 || a.score > i.score) && (i = a);
|
|
175
175
|
}
|
|
176
176
|
return i;
|
|
177
|
-
},
|
|
178
|
-
let t =
|
|
179
|
-
return t !== void 0 &&
|
|
180
|
-
},
|
|
181
|
-
let n =
|
|
177
|
+
}, me = (e) => {
|
|
178
|
+
let t = n(e), r = e.titles?.find((e) => e.type === "subtitle")?.value;
|
|
179
|
+
return t !== void 0 && r !== void 0 ? `${t}: ${r}` : void 0;
|
|
180
|
+
}, he = (e, t) => {
|
|
181
|
+
let n = O(e);
|
|
182
182
|
if (n.size === 0) return !1;
|
|
183
183
|
let r = (t.belongsTo?.series ?? []).flatMap((e) => e.position === void 0 ? [] : [e.position]);
|
|
184
184
|
return r.length > 0 && r.every((e) => !n.has(e));
|
|
185
|
-
},
|
|
185
|
+
}, ge = (e, t) => {
|
|
186
186
|
if (e === void 0) return;
|
|
187
187
|
let n;
|
|
188
188
|
for (let r of t) {
|
|
189
189
|
if (r === void 0) continue;
|
|
190
190
|
let t = {
|
|
191
|
-
score:
|
|
191
|
+
score: ue(e, r),
|
|
192
192
|
query: String(e),
|
|
193
193
|
candidate: String(r)
|
|
194
194
|
};
|
|
195
195
|
(n === void 0 || t.score > n.score) && (n = t);
|
|
196
196
|
}
|
|
197
197
|
return n;
|
|
198
|
-
},
|
|
199
|
-
let
|
|
200
|
-
t !== void 0 &&
|
|
198
|
+
}, _e = (r, i) => {
|
|
199
|
+
let a = [], o = (e, t) => {
|
|
200
|
+
t !== void 0 && a.push({
|
|
201
201
|
field: e,
|
|
202
|
-
weight:
|
|
202
|
+
weight: re[e],
|
|
203
203
|
score: Math.min(1, Math.max(0, t.score)),
|
|
204
204
|
query: t.query,
|
|
205
205
|
candidate: t.candidate
|
|
206
206
|
});
|
|
207
|
-
},
|
|
207
|
+
}, c = (e, t, n, r = h) => {
|
|
208
208
|
let i = A(t), a = A(n);
|
|
209
|
-
i === void 0 || a === void 0 ||
|
|
209
|
+
i === void 0 || a === void 0 || o(e, {
|
|
210
210
|
score: r(i, a),
|
|
211
211
|
query: i,
|
|
212
212
|
candidate: a
|
|
213
213
|
});
|
|
214
|
-
},
|
|
215
|
-
|
|
216
|
-
score: +(
|
|
217
|
-
query:
|
|
218
|
-
candidate:
|
|
214
|
+
}, l = e(r.identifiers, "ISBN"), d = e(i.identifiers, "ISBN"), f = l === void 0 ? void 0 : u(l), p = d === void 0 ? void 0 : u(d), m = l !== void 0 && d !== void 0 && f !== void 0 && p !== void 0;
|
|
215
|
+
m && o("isbn", {
|
|
216
|
+
score: +(f === p),
|
|
217
|
+
query: l,
|
|
218
|
+
candidate: d
|
|
219
219
|
});
|
|
220
|
-
let
|
|
221
|
-
!
|
|
222
|
-
score: +(
|
|
223
|
-
query:
|
|
224
|
-
candidate:
|
|
220
|
+
let g = e(r.identifiers, "GTIN"), _ = e(i.identifiers, "GTIN");
|
|
221
|
+
!m && g !== void 0 && _ !== void 0 && o("gtin", {
|
|
222
|
+
score: +(g === _),
|
|
223
|
+
query: g,
|
|
224
|
+
candidate: _
|
|
225
225
|
});
|
|
226
|
-
let
|
|
227
|
-
|
|
228
|
-
score: +!!
|
|
229
|
-
query:
|
|
230
|
-
candidate:
|
|
226
|
+
let v = (r.identifiers ?? []).filter((e) => !t(e.scheme)), y = (i.identifiers ?? []).filter((e) => !t(e.scheme)), b = v.some((e) => y.some((t) => ce(e, t)));
|
|
227
|
+
v.length > 0 && y.length > 0 && o("identifiers", {
|
|
228
|
+
score: +!!v.some((e) => y.some((t) => se(e, t))),
|
|
229
|
+
query: v.map(oe).join(", "),
|
|
230
|
+
candidate: y.map(oe).join(", ")
|
|
231
231
|
});
|
|
232
|
-
let
|
|
232
|
+
let x = A(r.title), S = [n(i), me(i)].flatMap((e) => {
|
|
233
233
|
let t = A(e);
|
|
234
234
|
return t === void 0 ? [] : [t];
|
|
235
235
|
});
|
|
236
|
-
if (
|
|
237
|
-
let e =
|
|
238
|
-
e !== void 0 &&
|
|
239
|
-
score:
|
|
240
|
-
query:
|
|
236
|
+
if (x !== void 0 && S.length > 0) {
|
|
237
|
+
let e = ee(x, S);
|
|
238
|
+
e !== void 0 && o("title", {
|
|
239
|
+
score: he(x, i) ? 0 : e.score,
|
|
240
|
+
query: x,
|
|
241
241
|
candidate: e.candidate
|
|
242
242
|
});
|
|
243
243
|
}
|
|
244
|
-
|
|
245
|
-
let
|
|
244
|
+
o("publisher", pe(r.publisher, [i.publication?.original?.publisher, i.publication?.edition?.publisher])), c("series", r.series, i.belongsTo?.series?.[0]?.name);
|
|
245
|
+
let C = s(i), w = (r.authors ?? []).flatMap((e) => {
|
|
246
246
|
let t = A(e);
|
|
247
247
|
return t === void 0 ? [] : [t];
|
|
248
248
|
});
|
|
249
|
-
|
|
250
|
-
score:
|
|
251
|
-
query:
|
|
252
|
-
candidate:
|
|
253
|
-
}),
|
|
254
|
-
let
|
|
255
|
-
if (
|
|
256
|
-
let e = new Set(
|
|
257
|
-
|
|
258
|
-
score: +!!
|
|
259
|
-
query:
|
|
260
|
-
candidate:
|
|
249
|
+
w.length > 0 && C.length > 0 && o("authors", {
|
|
250
|
+
score: fe(w, C, ne),
|
|
251
|
+
query: w.join(", "),
|
|
252
|
+
candidate: C.join(", ")
|
|
253
|
+
}), o("publishedYear", ge(r.publishedYear, [i.publication?.original?.date?.year, i.publication?.edition?.date?.year]));
|
|
254
|
+
let T = r.languages ?? [], E = i.languages ?? [];
|
|
255
|
+
if (T.length > 0 && E.length > 0) {
|
|
256
|
+
let e = new Set(E.map(le));
|
|
257
|
+
o("languages", {
|
|
258
|
+
score: +!!T.some((t) => e.has(le(t))),
|
|
259
|
+
query: T.join(", "),
|
|
260
|
+
candidate: E.join(", ")
|
|
261
261
|
});
|
|
262
262
|
}
|
|
263
|
-
|
|
264
|
-
score:
|
|
265
|
-
query: String(
|
|
266
|
-
candidate: String(
|
|
263
|
+
r.numberOfPages !== void 0 && i.numberOfPages !== void 0 && o("numberOfPages", {
|
|
264
|
+
score: de(r.numberOfPages, i.numberOfPages),
|
|
265
|
+
query: String(r.numberOfPages),
|
|
266
|
+
candidate: String(i.numberOfPages)
|
|
267
267
|
});
|
|
268
|
-
let
|
|
269
|
-
if (
|
|
268
|
+
let D = a.filter((e) => ie.has(e.field));
|
|
269
|
+
if (D.some((e) => e.score === 0)) return {
|
|
270
270
|
score: 0,
|
|
271
|
-
signals:
|
|
271
|
+
signals: a
|
|
272
272
|
};
|
|
273
|
-
if (
|
|
273
|
+
if (b || D.some((e) => e.score === 1)) return {
|
|
274
274
|
score: 1,
|
|
275
|
-
signals:
|
|
275
|
+
signals: a
|
|
276
276
|
};
|
|
277
|
-
let
|
|
278
|
-
return
|
|
277
|
+
let O = a.reduce((e, t) => e + t.weight, 0);
|
|
278
|
+
return O === 0 ? {
|
|
279
279
|
score: 0,
|
|
280
|
-
signals:
|
|
280
|
+
signals: a
|
|
281
281
|
} : {
|
|
282
|
-
score:
|
|
283
|
-
signals:
|
|
282
|
+
score: a.reduce((e, t) => e + t.score * t.weight, 0) / O,
|
|
283
|
+
signals: a
|
|
284
284
|
};
|
|
285
285
|
}, M = class extends Error {
|
|
286
286
|
status;
|
|
287
287
|
constructor(e, t) {
|
|
288
288
|
super(t ?? `Provider responded with status ${e}`), this.name = "MetadataProviderResponseError", this.status = e;
|
|
289
289
|
}
|
|
290
|
-
},
|
|
290
|
+
}, ve = (e) => {
|
|
291
291
|
if (typeof e != "object" || !e || !("status" in e)) return;
|
|
292
292
|
let { status: t } = e;
|
|
293
293
|
if (!(typeof t != "number" || !Number.isInteger(t))) return t >= 100 && t <= 599 ? t : void 0;
|
|
294
|
-
}, ye =
|
|
294
|
+
}, ye = a.namespace("@prose-reader/metadata-fetcher", void 0, { color: "#b06642" }), N = (e) => {
|
|
295
295
|
let t = Object.entries(e).filter(([, e]) => e !== void 0);
|
|
296
296
|
return Object.fromEntries(t);
|
|
297
|
-
}, be = 5, xe = .5, Se = 5, Ce = ({ candidate: e, providerId: t, score: n, signals: r, accepted: i, includeRaw: a }) =>
|
|
297
|
+
}, be = 5, xe = .5, Se = 5, Ce = ({ candidate: e, providerId: t, score: n, signals: r, accepted: i, includeRaw: a }) => N({
|
|
298
298
|
providerId: t,
|
|
299
299
|
score: n,
|
|
300
300
|
signals: r,
|
|
@@ -319,9 +319,9 @@ var c = (e) => {
|
|
|
319
319
|
return ye.error(`fetchMetadata: provider "${r.id}" failed`, e), {
|
|
320
320
|
provider: r,
|
|
321
321
|
candidates: void 0,
|
|
322
|
-
failure:
|
|
322
|
+
failure: N({
|
|
323
323
|
id: r.id,
|
|
324
|
-
status:
|
|
324
|
+
status: ve(e)
|
|
325
325
|
})
|
|
326
326
|
};
|
|
327
327
|
}
|
|
@@ -329,7 +329,7 @@ var c = (e) => {
|
|
|
329
329
|
for (let { provider: t, candidates: o } of a) {
|
|
330
330
|
if (o === void 0) continue;
|
|
331
331
|
let a = o.map((n) => {
|
|
332
|
-
let { score: a, signals: o } =
|
|
332
|
+
let { score: a, signals: o } = _e(e, n.metadata);
|
|
333
333
|
return Ce({
|
|
334
334
|
candidate: n,
|
|
335
335
|
providerId: t.id,
|
|
@@ -354,13 +354,13 @@ var c = (e) => {
|
|
|
354
354
|
failedProviders: o
|
|
355
355
|
};
|
|
356
356
|
}, Te = (e) => {
|
|
357
|
-
let { metadata: t } = e,
|
|
357
|
+
let { metadata: t } = e, r = s(t), i = t.identifiers?.map(({ value: e, scheme: t }) => ({
|
|
358
358
|
value: e,
|
|
359
359
|
scheme: t
|
|
360
360
|
}));
|
|
361
|
-
return
|
|
362
|
-
title:
|
|
363
|
-
authors:
|
|
361
|
+
return N({
|
|
362
|
+
title: n(t),
|
|
363
|
+
authors: r.length > 0 ? r : void 0,
|
|
364
364
|
identifiers: i !== void 0 && i.length > 0 ? i : void 0,
|
|
365
365
|
series: t.belongsTo?.series?.[0]?.name,
|
|
366
366
|
publisher: t.publication?.edition?.publisher ?? t.publication?.original?.publisher,
|
|
@@ -368,22 +368,22 @@ var c = (e) => {
|
|
|
368
368
|
languages: t.languages,
|
|
369
369
|
numberOfPages: t.numberOfPages
|
|
370
370
|
});
|
|
371
|
-
},
|
|
371
|
+
}, P = (e) => typeof e == "object" && !!e && !Array.isArray(e), F = (e, t) => {
|
|
372
372
|
let n = e[t];
|
|
373
373
|
if (typeof n != "string") return;
|
|
374
374
|
let r = n.trim();
|
|
375
375
|
return r.length > 0 ? r : void 0;
|
|
376
|
-
},
|
|
376
|
+
}, I = (e, t) => {
|
|
377
377
|
let n = e[t];
|
|
378
378
|
return typeof n == "number" && Number.isFinite(n) ? n : void 0;
|
|
379
|
-
},
|
|
379
|
+
}, L = (e, t) => {
|
|
380
380
|
let n = e[t];
|
|
381
381
|
if (!Array.isArray(n)) return;
|
|
382
382
|
let r = n.filter((e) => typeof e == "string").map((e) => e.trim()).filter((e) => e.length > 0);
|
|
383
383
|
return r.length > 0 ? r : void 0;
|
|
384
|
-
},
|
|
384
|
+
}, R = (e, t) => {
|
|
385
385
|
let n = e[t];
|
|
386
|
-
return Array.isArray(n) ? n.filter(
|
|
386
|
+
return Array.isArray(n) ? n.filter(P) : [];
|
|
387
387
|
}, Ee = (e) => e.reason ?? new DOMException("The operation was aborted", "AbortError"), De = (e) => {
|
|
388
388
|
if (e?.aborted === !0) throw Ee(e);
|
|
389
389
|
}, Oe = (e, t) => (De(t), new Promise((n, r) => {
|
|
@@ -412,130 +412,114 @@ var c = (e) => {
|
|
|
412
412
|
}
|
|
413
413
|
}
|
|
414
414
|
throw Error("retryWithBackoff reached an invalid state");
|
|
415
|
-
},
|
|
416
|
-
let t
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
let t = new URL(e.trim());
|
|
421
|
-
if (t.protocol !== "http:" && t.protocol !== "https:") return;
|
|
422
|
-
let n = t.hostname.toLowerCase();
|
|
423
|
-
if (Ne.test(n)) return V(t.searchParams.get("id") ?? "");
|
|
424
|
-
if (Me.has(n)) {
|
|
425
|
-
let e = /^\/books\/v1\/volumes\/([^/]+)\/?$/i.exec(t.pathname)?.[1];
|
|
426
|
-
return e === void 0 ? void 0 : V(decodeURIComponent(e));
|
|
427
|
-
}
|
|
428
|
-
} catch {
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
}, Fe = (e) => {
|
|
432
|
-
for (let t of e.identifiers ?? []) {
|
|
433
|
-
let e = t.scheme.trim().toLowerCase(), n = e === "googlebooks" ? V(t.value) : e === "unknown" || e === "url" || e === "uri" ? Pe(t.value) : void 0;
|
|
434
|
-
if (n !== void 0) return {
|
|
435
|
-
id: n,
|
|
415
|
+
}, z = "GoogleBooks", Me = (t) => {
|
|
416
|
+
for (let n of t.identifiers ?? []) {
|
|
417
|
+
let t = e([n], z);
|
|
418
|
+
if (t !== void 0) return {
|
|
419
|
+
id: t,
|
|
436
420
|
identifier: {
|
|
437
|
-
value:
|
|
438
|
-
scheme:
|
|
421
|
+
value: n.value,
|
|
422
|
+
scheme: n.scheme
|
|
439
423
|
}
|
|
440
424
|
};
|
|
441
425
|
}
|
|
442
|
-
},
|
|
426
|
+
}, B = (e, t) => {
|
|
443
427
|
let n = e[t];
|
|
444
|
-
return
|
|
445
|
-
},
|
|
446
|
-
let t =
|
|
447
|
-
let t =
|
|
448
|
-
return t === void 0 ? [] : [
|
|
449
|
-
type:
|
|
428
|
+
return P(n) ? n : void 0;
|
|
429
|
+
}, Ne = (e) => {
|
|
430
|
+
let t = R(e, "industryIdentifiers").flatMap((e) => {
|
|
431
|
+
let t = F(e, "identifier");
|
|
432
|
+
return t === void 0 ? [] : [N({
|
|
433
|
+
type: F(e, "type"),
|
|
450
434
|
identifier: t
|
|
451
435
|
})];
|
|
452
436
|
});
|
|
453
437
|
return t.length > 0 ? t : void 0;
|
|
454
|
-
},
|
|
455
|
-
let t =
|
|
438
|
+
}, Pe = (e) => {
|
|
439
|
+
let t = B(e, "imageLinks");
|
|
456
440
|
if (t === void 0) return;
|
|
457
|
-
let n =
|
|
458
|
-
smallThumbnail:
|
|
459
|
-
thumbnail:
|
|
460
|
-
small:
|
|
461
|
-
medium:
|
|
462
|
-
large:
|
|
463
|
-
extraLarge:
|
|
441
|
+
let n = N({
|
|
442
|
+
smallThumbnail: F(t, "smallThumbnail"),
|
|
443
|
+
thumbnail: F(t, "thumbnail"),
|
|
444
|
+
small: F(t, "small"),
|
|
445
|
+
medium: F(t, "medium"),
|
|
446
|
+
large: F(t, "large"),
|
|
447
|
+
extraLarge: F(t, "extraLarge")
|
|
464
448
|
});
|
|
465
449
|
return Object.keys(n).length > 0 ? n : void 0;
|
|
466
|
-
},
|
|
467
|
-
let t =
|
|
450
|
+
}, Fe = (e) => {
|
|
451
|
+
let t = B(e, "seriesInfo");
|
|
468
452
|
if (t === void 0) return;
|
|
469
|
-
let n =
|
|
470
|
-
let t =
|
|
471
|
-
seriesId:
|
|
472
|
-
orderNumber:
|
|
453
|
+
let n = R(t, "volumeSeries").flatMap((e) => {
|
|
454
|
+
let t = N({
|
|
455
|
+
seriesId: F(e, "seriesId"),
|
|
456
|
+
orderNumber: I(e, "orderNumber")
|
|
473
457
|
});
|
|
474
458
|
return Object.keys(t).length > 0 ? [t] : [];
|
|
475
459
|
});
|
|
476
460
|
return n.length > 0 ? { volumeSeries: n } : void 0;
|
|
477
|
-
},
|
|
478
|
-
let t =
|
|
461
|
+
}, Ie = (e) => {
|
|
462
|
+
let t = B(e, "volumeInfo");
|
|
479
463
|
if (t === void 0) return;
|
|
480
|
-
let n =
|
|
481
|
-
title:
|
|
482
|
-
subtitle:
|
|
483
|
-
authors:
|
|
484
|
-
publisher:
|
|
485
|
-
publishedDate:
|
|
486
|
-
description:
|
|
487
|
-
industryIdentifiers:
|
|
488
|
-
pageCount:
|
|
489
|
-
categories:
|
|
490
|
-
averageRating:
|
|
491
|
-
ratingsCount:
|
|
492
|
-
language:
|
|
493
|
-
imageLinks:
|
|
494
|
-
infoLink:
|
|
495
|
-
canonicalVolumeLink:
|
|
496
|
-
seriesInfo:
|
|
464
|
+
let n = N({
|
|
465
|
+
title: F(t, "title"),
|
|
466
|
+
subtitle: F(t, "subtitle"),
|
|
467
|
+
authors: L(t, "authors"),
|
|
468
|
+
publisher: F(t, "publisher"),
|
|
469
|
+
publishedDate: F(t, "publishedDate"),
|
|
470
|
+
description: F(t, "description"),
|
|
471
|
+
industryIdentifiers: Ne(t),
|
|
472
|
+
pageCount: I(t, "pageCount"),
|
|
473
|
+
categories: L(t, "categories"),
|
|
474
|
+
averageRating: I(t, "averageRating"),
|
|
475
|
+
ratingsCount: I(t, "ratingsCount"),
|
|
476
|
+
language: F(t, "language"),
|
|
477
|
+
imageLinks: Pe(t),
|
|
478
|
+
infoLink: F(t, "infoLink"),
|
|
479
|
+
canonicalVolumeLink: F(t, "canonicalVolumeLink"),
|
|
480
|
+
seriesInfo: Fe(t)
|
|
497
481
|
});
|
|
498
482
|
return Object.keys(n).length > 0 ? n : void 0;
|
|
499
|
-
},
|
|
500
|
-
if (!
|
|
501
|
-
let t =
|
|
502
|
-
id:
|
|
503
|
-
volumeInfo:
|
|
483
|
+
}, V = (e) => {
|
|
484
|
+
if (!P(e)) return;
|
|
485
|
+
let t = N({
|
|
486
|
+
id: F(e, "id"),
|
|
487
|
+
volumeInfo: Ie(e)
|
|
504
488
|
});
|
|
505
489
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
506
|
-
},
|
|
507
|
-
let t =
|
|
490
|
+
}, Le = (e) => P(e) ? R(e, "items").flatMap((e) => {
|
|
491
|
+
let t = V(e);
|
|
508
492
|
return t === void 0 ? [] : [t];
|
|
509
|
-
}) : [],
|
|
510
|
-
if (e === void 0 || e < 0 || e >
|
|
493
|
+
}) : [], Re = 5, ze = (e, t) => {
|
|
494
|
+
if (e === void 0 || e < 0 || e > Re) return;
|
|
511
495
|
let n = t !== void 0 && Number.isInteger(t) && t >= 0 ? t : void 0;
|
|
512
|
-
if (n !== 0) return
|
|
496
|
+
if (n !== 0) return N({
|
|
513
497
|
value: e,
|
|
514
498
|
count: n
|
|
515
499
|
});
|
|
516
|
-
},
|
|
500
|
+
}, Be = 25, H = (e) => e.length > 0 ? e : void 0, Ve = (e) => e === "ISBN_10" || e === "ISBN_13" ? "ISBN" : e ?? "Unknown", He = (e) => H(e.filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme.trim().toLowerCase() === e.scheme.trim().toLowerCase()) === t)), Ue = (e) => e.map((e) => N({
|
|
517
501
|
value: e.identifier,
|
|
518
|
-
scheme:
|
|
519
|
-
})),
|
|
502
|
+
scheme: Ve(e.type)
|
|
503
|
+
})), We = (e, t) => H([...e === void 0 ? [] : [{ value: e }], ...t === void 0 ? [] : [{
|
|
520
504
|
value: t,
|
|
521
505
|
type: "subtitle"
|
|
522
|
-
}]]),
|
|
523
|
-
let t =
|
|
506
|
+
}]]), Ge = (e) => H((e?.volumeSeries ?? []).flatMap((e) => {
|
|
507
|
+
let t = N({
|
|
524
508
|
identifiers: e.seriesId === void 0 ? void 0 : [{
|
|
525
509
|
value: e.seriesId,
|
|
526
|
-
scheme:
|
|
510
|
+
scheme: z
|
|
527
511
|
}],
|
|
528
512
|
position: e.orderNumber
|
|
529
513
|
});
|
|
530
514
|
return Object.keys(t).length > 0 ? [t] : [];
|
|
531
|
-
})),
|
|
515
|
+
})), U = (e) => {
|
|
532
516
|
if (e !== void 0) try {
|
|
533
517
|
let t = new URL(e);
|
|
534
518
|
return t.protocol !== "http:" && t.protocol !== "https:" ? void 0 : (t.protocol === "http:" && (t.protocol = "https:"), t.toString());
|
|
535
519
|
} catch {
|
|
536
520
|
return;
|
|
537
521
|
}
|
|
538
|
-
},
|
|
522
|
+
}, Ke = (e) => {
|
|
539
523
|
if (e === void 0) return;
|
|
540
524
|
let t = [
|
|
541
525
|
e.extraLarge,
|
|
@@ -546,14 +530,14 @@ var c = (e) => {
|
|
|
546
530
|
e.smallThumbnail
|
|
547
531
|
];
|
|
548
532
|
for (let e of t) {
|
|
549
|
-
let t =
|
|
533
|
+
let t = U(e);
|
|
550
534
|
if (t !== void 0) return t;
|
|
551
535
|
}
|
|
552
|
-
},
|
|
536
|
+
}, qe = (e) => H(e.map((e) => ({
|
|
553
537
|
name: e,
|
|
554
538
|
roles: ["author"]
|
|
555
|
-
}))),
|
|
556
|
-
let { id: n, volumeInfo: r, ...
|
|
539
|
+
}))), Je = (e, t = {}) => {
|
|
540
|
+
let { id: n, volumeInfo: r, ...a } = e, { title: o, subtitle: s, authors: c, publisher: l, publishedDate: u, description: d, industryIdentifiers: f, pageCount: p, categories: m, averageRating: h, ratingsCount: g, language: _, imageLinks: v, seriesInfo: y, infoLink: b, canonicalVolumeLink: x, ...S } = r ?? {}, C = Ue(f ?? []), w = He([
|
|
557
541
|
...t.matchedIdentifier === void 0 ? [] : [t.matchedIdentifier],
|
|
558
542
|
...t.matchedIsbn === void 0 ? [] : [{
|
|
559
543
|
value: t.matchedIsbn,
|
|
@@ -561,59 +545,59 @@ var c = (e) => {
|
|
|
561
545
|
}],
|
|
562
546
|
...n === void 0 ? [] : [{
|
|
563
547
|
value: n,
|
|
564
|
-
scheme:
|
|
548
|
+
scheme: z
|
|
565
549
|
}],
|
|
566
550
|
...C
|
|
567
|
-
]), T =
|
|
568
|
-
date:
|
|
551
|
+
]), T = N({
|
|
552
|
+
date: i(u),
|
|
569
553
|
publisher: l
|
|
570
|
-
}), E =
|
|
554
|
+
}), E = Ke(v), D = E === void 0 ? void 0 : {
|
|
571
555
|
uri: E,
|
|
572
556
|
confidence: "derived"
|
|
573
|
-
}, O = [...new Set(m ?? [])].slice(0, 25), k =
|
|
574
|
-
return
|
|
575
|
-
titles:
|
|
557
|
+
}, O = [...new Set(m ?? [])].slice(0, 25), k = Ge(y);
|
|
558
|
+
return N({
|
|
559
|
+
titles: We(o, s),
|
|
576
560
|
description: d,
|
|
577
561
|
belongsTo: k === void 0 ? void 0 : { series: k },
|
|
578
562
|
publication: T.date !== void 0 || T.publisher !== void 0 ? { edition: T } : void 0,
|
|
579
563
|
languages: _ === void 0 ? void 0 : [_],
|
|
580
|
-
subjects:
|
|
581
|
-
contributors:
|
|
564
|
+
subjects: H(O),
|
|
565
|
+
contributors: qe(c ?? []),
|
|
582
566
|
numberOfPages: p,
|
|
583
|
-
aggregateRating:
|
|
567
|
+
aggregateRating: ze(h, g),
|
|
584
568
|
identifiers: w,
|
|
585
569
|
cover: D
|
|
586
570
|
});
|
|
587
|
-
},
|
|
571
|
+
}, Ye = (e) => U(e.volumeInfo?.canonicalVolumeLink) ?? U(e.volumeInfo?.infoLink) ?? (e.id === void 0 ? void 0 : `https://books.google.com/books?id=${encodeURIComponent(e.id)}`), Xe = 40, Ze = 1, Qe = 4, $e = 3, et = 1e3, tt = 3e3, nt = /* @__PURE__ */ new Set([
|
|
588
572
|
500,
|
|
589
573
|
502,
|
|
590
574
|
503,
|
|
591
575
|
504
|
|
592
|
-
]),
|
|
593
|
-
let t =
|
|
576
|
+
]), rt = /["\\]+/g, it = /:/g, at = /(^|\s)-+/g, ot = /\s+/g, st = (e) => e.replace(rt, " ").replace(it, " ").replace(at, " ").replace(ot, " ").trim(), ct = (e) => e.length > 0, lt = (e) => {
|
|
577
|
+
let t = st(e.title ?? "");
|
|
594
578
|
if (t.length === 0) return;
|
|
595
|
-
let n = e.authors?.map(
|
|
579
|
+
let n = e.authors?.map(st).find(ct);
|
|
596
580
|
return {
|
|
597
581
|
title: t,
|
|
598
582
|
...n === void 0 ? {} : { author: n }
|
|
599
583
|
};
|
|
600
|
-
},
|
|
601
|
-
let t =
|
|
584
|
+
}, ut = (e) => {
|
|
585
|
+
let t = V(e);
|
|
602
586
|
return t === void 0 ? void 0 : {
|
|
603
587
|
volume: t,
|
|
604
588
|
raw: e
|
|
605
589
|
};
|
|
606
|
-
},
|
|
607
|
-
let t =
|
|
590
|
+
}, dt = (e) => P(e) ? R(e, "items").flatMap((e) => {
|
|
591
|
+
let t = ut(e);
|
|
608
592
|
return t === void 0 ? [] : [t];
|
|
609
|
-
}) : [],
|
|
610
|
-
metadata:
|
|
593
|
+
}) : [], W = (e, t = {}) => e.map(({ volume: e, raw: n }) => ({
|
|
594
|
+
metadata: Je(e, t),
|
|
611
595
|
id: e.id,
|
|
612
|
-
url:
|
|
596
|
+
url: Ye(e),
|
|
613
597
|
raw: n
|
|
614
|
-
})),
|
|
615
|
-
let
|
|
616
|
-
let i = await
|
|
598
|
+
})), ft = (t) => {
|
|
599
|
+
let n = `${t.baseUrl.replace(/\/+$/, "")}/volumes`, r = async (e, n, r = !1) => (e.searchParams.set("key", t.apiKey), je(async () => {
|
|
600
|
+
let i = await t.fetch(e.toString(), {
|
|
617
601
|
signal: n.signal,
|
|
618
602
|
headers: { Accept: "application/json" }
|
|
619
603
|
});
|
|
@@ -622,102 +606,81 @@ var c = (e) => {
|
|
|
622
606
|
return i;
|
|
623
607
|
}
|
|
624
608
|
}, {
|
|
625
|
-
attempts:
|
|
626
|
-
initialDelayMs:
|
|
627
|
-
maxDelayMs:
|
|
609
|
+
attempts: $e,
|
|
610
|
+
initialDelayMs: et,
|
|
611
|
+
maxDelayMs: tt,
|
|
628
612
|
signal: n.signal,
|
|
629
613
|
shouldRetry: (e) => {
|
|
630
|
-
let t =
|
|
631
|
-
return t === void 0 ||
|
|
614
|
+
let t = ve(e);
|
|
615
|
+
return t === void 0 || nt.has(t);
|
|
632
616
|
}
|
|
633
|
-
})), i = async (e,
|
|
634
|
-
let i = await r(new URL(`${
|
|
617
|
+
})), i = async (e, t) => {
|
|
618
|
+
let i = await r(new URL(`${n}/${encodeURIComponent(e)}`), t, !0);
|
|
635
619
|
if (i === void 0) return;
|
|
636
|
-
let a =
|
|
620
|
+
let a = ut(await i.json());
|
|
637
621
|
if (a?.volume.id !== e) throw Error(`Google Books response did not contain the requested volume ${e}`);
|
|
638
622
|
return a;
|
|
639
|
-
}, a = async (e,
|
|
640
|
-
let a = Math.min(Math.ceil(
|
|
623
|
+
}, a = async (e, t, i) => {
|
|
624
|
+
let a = Math.min(Math.ceil(t.limit * i), Xe);
|
|
641
625
|
if (a <= 0) return [];
|
|
642
|
-
let o = new URL(
|
|
626
|
+
let o = new URL(n);
|
|
643
627
|
o.searchParams.set("q", e), o.searchParams.set("maxResults", String(a)), o.searchParams.set("orderBy", "relevance"), o.searchParams.set("printType", "books");
|
|
644
|
-
let s = await r(o,
|
|
645
|
-
return s === void 0 ? [] :
|
|
628
|
+
let s = await r(o, t);
|
|
629
|
+
return s === void 0 ? [] : dt(await s.json());
|
|
646
630
|
};
|
|
647
|
-
return async (
|
|
648
|
-
let r =
|
|
631
|
+
return async (t, n) => {
|
|
632
|
+
let r = Me(t);
|
|
649
633
|
if (r !== void 0) {
|
|
650
|
-
let e = await i(r.id,
|
|
651
|
-
if (e !== void 0) return
|
|
634
|
+
let e = await i(r.id, n);
|
|
635
|
+
if (e !== void 0) return W([e], { matchedIdentifier: r.identifier });
|
|
652
636
|
}
|
|
653
|
-
let o =
|
|
637
|
+
let o = e(t.identifiers, "ISBN");
|
|
654
638
|
if (o !== void 0) {
|
|
655
|
-
let e = await a(`isbn:${o}`,
|
|
656
|
-
if (e.length > 0) return
|
|
639
|
+
let e = await a(`isbn:${o}`, n, Ze);
|
|
640
|
+
if (e.length > 0) return W(e, { matchedIsbn: o });
|
|
657
641
|
}
|
|
658
|
-
let s =
|
|
642
|
+
let s = lt(t);
|
|
659
643
|
if (s === void 0) return [];
|
|
660
|
-
let c = `intitle:${s.title}`, l = s.author === void 0 ? c : `${c} inauthor:${s.author}`, u = await a(l,
|
|
661
|
-
return u.length > 0 || s.author === void 0 ?
|
|
644
|
+
let c = `intitle:${s.title}`, l = s.author === void 0 ? c : `${c} inauthor:${s.author}`, u = await a(l, n, Qe);
|
|
645
|
+
return u.length > 0 || s.author === void 0 ? W(u) : W(await a(c, n, Qe));
|
|
662
646
|
};
|
|
663
|
-
},
|
|
647
|
+
}, pt = "googleBooks", mt = "https://www.googleapis.com/books/v1", ht = (e) => {
|
|
664
648
|
let t = e.apiKey.trim();
|
|
665
649
|
if (t.length === 0) throw Error("createGoogleBooksProvider requires a non-empty apiKey");
|
|
666
650
|
return {
|
|
667
|
-
id:
|
|
651
|
+
id: pt,
|
|
668
652
|
name: "Google Books",
|
|
669
|
-
search:
|
|
653
|
+
search: ft({
|
|
670
654
|
apiKey: t,
|
|
671
|
-
baseUrl: e.baseUrl ??
|
|
655
|
+
baseUrl: e.baseUrl ?? mt,
|
|
672
656
|
fetch: e.fetch ?? globalThis.fetch
|
|
673
657
|
})
|
|
674
658
|
};
|
|
675
|
-
},
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
], St = (e) => {
|
|
681
|
-
let t = e.trim();
|
|
682
|
-
if (!/^\d+$/.test(t)) return;
|
|
683
|
-
let n = t.replace(/^0+(?=\d)/, "");
|
|
684
|
-
return n === "0" ? void 0 : n;
|
|
685
|
-
}, Ct = (e) => {
|
|
686
|
-
try {
|
|
687
|
-
let t = new URL(e.trim());
|
|
688
|
-
if (t.protocol !== "http:" && t.protocol !== "https:" || !bt.has(t.hostname.toLowerCase())) return;
|
|
689
|
-
for (let e of xt) {
|
|
690
|
-
let n = e.exec(t.pathname)?.[1];
|
|
691
|
-
if (n !== void 0) return St(n);
|
|
692
|
-
}
|
|
693
|
-
} catch {
|
|
694
|
-
return;
|
|
695
|
-
}
|
|
696
|
-
}, wt = (e) => {
|
|
697
|
-
for (let t of e.identifiers ?? []) {
|
|
698
|
-
let e = t.scheme.trim().toLowerCase(), n = e === "projectgutenberg" ? St(t.value) : e === "unknown" || e === "url" || e === "uri" ? Ct(t.value) : void 0;
|
|
699
|
-
if (n !== void 0) return {
|
|
700
|
-
id: n,
|
|
659
|
+
}, G = "ProjectGutenberg", K = (t) => {
|
|
660
|
+
for (let n of t.identifiers ?? []) {
|
|
661
|
+
let t = e([n], G);
|
|
662
|
+
if (t !== void 0) return {
|
|
663
|
+
id: t,
|
|
701
664
|
identifier: {
|
|
702
|
-
value:
|
|
703
|
-
scheme:
|
|
665
|
+
value: n.value,
|
|
666
|
+
scheme: n.scheme
|
|
704
667
|
}
|
|
705
668
|
};
|
|
706
669
|
}
|
|
707
|
-
},
|
|
708
|
-
key:
|
|
709
|
-
title:
|
|
710
|
-
subtitle:
|
|
711
|
-
author_name:
|
|
712
|
-
first_publish_year:
|
|
713
|
-
language:
|
|
714
|
-
subject:
|
|
715
|
-
number_of_pages_median:
|
|
716
|
-
ratings_average:
|
|
717
|
-
ratings_count:
|
|
718
|
-
cover_i:
|
|
719
|
-
id_project_gutenberg:
|
|
720
|
-
}),
|
|
670
|
+
}, gt = (e) => ({
|
|
671
|
+
key: F(e, "key"),
|
|
672
|
+
title: F(e, "title"),
|
|
673
|
+
subtitle: F(e, "subtitle"),
|
|
674
|
+
author_name: L(e, "author_name"),
|
|
675
|
+
first_publish_year: I(e, "first_publish_year"),
|
|
676
|
+
language: L(e, "language"),
|
|
677
|
+
subject: L(e, "subject"),
|
|
678
|
+
number_of_pages_median: I(e, "number_of_pages_median"),
|
|
679
|
+
ratings_average: I(e, "ratings_average"),
|
|
680
|
+
ratings_count: I(e, "ratings_count"),
|
|
681
|
+
cover_i: I(e, "cover_i"),
|
|
682
|
+
id_project_gutenberg: L(e, "id_project_gutenberg")
|
|
683
|
+
}), _t = (e) => P(e) ? R(e, "docs").map(gt) : [], vt = {
|
|
721
684
|
afr: "af",
|
|
722
685
|
alb: "sq",
|
|
723
686
|
amh: "am",
|
|
@@ -822,19 +785,19 @@ var c = (e) => {
|
|
|
822
785
|
wel: "cy",
|
|
823
786
|
yid: "yi",
|
|
824
787
|
zho: "zh"
|
|
825
|
-
},
|
|
788
|
+
}, yt = /* @__PURE__ */ new Set([
|
|
826
789
|
"mul",
|
|
827
790
|
"und",
|
|
828
791
|
"zxx",
|
|
829
792
|
"sgn"
|
|
830
|
-
]),
|
|
793
|
+
]), bt = (e) => {
|
|
831
794
|
let t = e.trim().toLowerCase();
|
|
832
|
-
if (t.length !== 0 && !
|
|
833
|
-
},
|
|
795
|
+
if (t.length !== 0 && !yt.has(t)) return vt[t] ?? t;
|
|
796
|
+
}, xt = 25, St = "OpenLibrary", Ct = "ProjectGutenberg", q = (e) => e.length > 0 ? e : void 0, wt = (e, t) => {
|
|
834
797
|
let { title: n, subtitle: r, language: i, key: a, author_name: o, first_publish_year: s, subject: c, number_of_pages_median: l, ratings_average: u, ratings_count: d, cover_i: f, id_project_gutenberg: p, ...m } = e, h = q([...n === void 0 ? [] : [{ value: n }], ...r === void 0 ? [] : [{
|
|
835
798
|
value: r,
|
|
836
799
|
type: "subtitle"
|
|
837
|
-
}]]), g = q([...new Set((i ?? []).map(
|
|
800
|
+
}]]), g = q([...new Set((i ?? []).map(bt).filter((e) => e !== void 0))]), _ = [
|
|
838
801
|
...t.isbn === void 0 ? [] : [{
|
|
839
802
|
value: t.isbn,
|
|
840
803
|
scheme: "ISBN"
|
|
@@ -842,14 +805,14 @@ var c = (e) => {
|
|
|
842
805
|
...t.matchedProjectGutenbergIdentifier === void 0 ? [] : [t.matchedProjectGutenbergIdentifier],
|
|
843
806
|
...(p ?? []).map((e) => ({
|
|
844
807
|
value: e,
|
|
845
|
-
scheme:
|
|
808
|
+
scheme: Ct
|
|
846
809
|
})),
|
|
847
810
|
...a === void 0 ? [] : [{
|
|
848
811
|
value: a,
|
|
849
|
-
scheme:
|
|
812
|
+
scheme: St
|
|
850
813
|
}]
|
|
851
814
|
];
|
|
852
|
-
return
|
|
815
|
+
return N({
|
|
853
816
|
titles: h,
|
|
854
817
|
cover: f === void 0 ? void 0 : {
|
|
855
818
|
uri: `${t.coversBaseUrl}/b/id/${f}-L.jpg`,
|
|
@@ -864,10 +827,10 @@ var c = (e) => {
|
|
|
864
827
|
roles: ["author"]
|
|
865
828
|
}))),
|
|
866
829
|
numberOfPages: l,
|
|
867
|
-
aggregateRating:
|
|
830
|
+
aggregateRating: ze(u, d),
|
|
868
831
|
identifiers: q(_)
|
|
869
832
|
});
|
|
870
|
-
},
|
|
833
|
+
}, Tt = "openLibrary", Et = "https://openlibrary.org", Dt = "https://covers.openlibrary.org", Ot = [
|
|
871
834
|
"key",
|
|
872
835
|
"title",
|
|
873
836
|
"subtitle",
|
|
@@ -880,7 +843,7 @@ var c = (e) => {
|
|
|
880
843
|
"ratings_count",
|
|
881
844
|
"cover_i",
|
|
882
845
|
"id_project_gutenberg"
|
|
883
|
-
].join(","),
|
|
846
|
+
].join(","), kt = (e) => {
|
|
884
847
|
let t = e.title?.trim();
|
|
885
848
|
if (t === void 0 || t.length === 0) return;
|
|
886
849
|
let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
|
|
@@ -888,52 +851,52 @@ var c = (e) => {
|
|
|
888
851
|
title: t,
|
|
889
852
|
...n === void 0 ? {} : { author: n }
|
|
890
853
|
};
|
|
891
|
-
},
|
|
892
|
-
let
|
|
893
|
-
let i = new URL("/search.json",
|
|
894
|
-
for (let [
|
|
895
|
-
i.searchParams.set("fields",
|
|
896
|
-
let a = await (
|
|
854
|
+
}, At = (t = {}) => {
|
|
855
|
+
let n = t.baseUrl ?? Et, r = t.coversBaseUrl ?? Dt, i = async (e, r) => {
|
|
856
|
+
let i = new URL("/search.json", n);
|
|
857
|
+
for (let [t, n] of Object.entries(e)) i.searchParams.set(t, n);
|
|
858
|
+
i.searchParams.set("fields", Ot), i.searchParams.set("limit", String(r.limit));
|
|
859
|
+
let a = await (t.fetch ?? globalThis.fetch)(i.toString(), {
|
|
897
860
|
signal: r.signal,
|
|
898
861
|
headers: {
|
|
899
862
|
Accept: "application/json",
|
|
900
|
-
...
|
|
863
|
+
...t.userAgent === void 0 ? {} : { "User-Agent": t.userAgent }
|
|
901
864
|
}
|
|
902
865
|
});
|
|
903
866
|
if (!a.ok) throw new M(a.status, `Open Library search failed with status ${a.status}`);
|
|
904
|
-
return
|
|
905
|
-
}, a = (e,
|
|
906
|
-
metadata:
|
|
867
|
+
return _t(await a.json());
|
|
868
|
+
}, a = (e, t = {}) => e.map((e) => ({
|
|
869
|
+
metadata: wt(e, {
|
|
907
870
|
coversBaseUrl: r,
|
|
908
|
-
isbn:
|
|
909
|
-
matchedProjectGutenbergIdentifier:
|
|
871
|
+
isbn: t.isbn,
|
|
872
|
+
matchedProjectGutenbergIdentifier: t.confirmedProjectGutenberg?.identifier
|
|
910
873
|
}),
|
|
911
874
|
id: e.key,
|
|
912
|
-
url: e.key === void 0 ? void 0 : `${
|
|
875
|
+
url: e.key === void 0 ? void 0 : `${n}${e.key}`,
|
|
913
876
|
raw: e
|
|
914
877
|
}));
|
|
915
878
|
return {
|
|
916
|
-
id:
|
|
879
|
+
id: Tt,
|
|
917
880
|
name: "Open Library",
|
|
918
|
-
search: async (
|
|
919
|
-
let r =
|
|
881
|
+
search: async (t, n) => {
|
|
882
|
+
let r = e(t.identifiers, "ISBN"), o = K(t);
|
|
920
883
|
if (r !== void 0) {
|
|
921
|
-
let e = await i({ isbn: r },
|
|
884
|
+
let e = await i({ isbn: r }, n);
|
|
922
885
|
if (e.length > 0) return a(e, { isbn: r });
|
|
923
886
|
}
|
|
924
887
|
if (o !== void 0) {
|
|
925
|
-
let e = await i({ q: `id_project_gutenberg:${o.id}` },
|
|
888
|
+
let e = await i({ q: `id_project_gutenberg:${o.id}` }, n);
|
|
926
889
|
if (e.length > 0) return a(e, { confirmedProjectGutenberg: o });
|
|
927
890
|
}
|
|
928
|
-
let s =
|
|
891
|
+
let s = kt(t);
|
|
929
892
|
if (s === void 0) return [];
|
|
930
|
-
let c = await i(s,
|
|
893
|
+
let c = await i(s, n);
|
|
931
894
|
if (c.length > 0) return a(c);
|
|
932
895
|
let l = s.author === void 0 ? s.title : `${s.title} ${s.author}`;
|
|
933
|
-
return a(await i({ q: l },
|
|
896
|
+
return a(await i({ q: l }, n));
|
|
934
897
|
}
|
|
935
898
|
};
|
|
936
|
-
}, J = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e,
|
|
899
|
+
}, J = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, jt = (e) => e.type === "element", Y = (e, t) => e.children.filter((e) => jt(e) && J(e.name).toLowerCase() === t.toLowerCase()), X = (e, t) => Y(e, t)[0], Z = (e) => {
|
|
937
900
|
let t = e?.val.trim();
|
|
938
901
|
return t !== void 0 && t.length > 0 ? t : void 0;
|
|
939
902
|
}, Q = (e, t) => {
|
|
@@ -942,18 +905,18 @@ var c = (e) => {
|
|
|
942
905
|
let e = r.trim();
|
|
943
906
|
if (e.length > 0) return e;
|
|
944
907
|
}
|
|
945
|
-
},
|
|
908
|
+
}, Mt = (e, t) => Y(e, t).flatMap((e) => {
|
|
946
909
|
let t = Z(X(X(e, "Description") ?? e, "value"));
|
|
947
910
|
return t === void 0 ? [] : [t];
|
|
948
|
-
}),
|
|
911
|
+
}), Nt = (e) => {
|
|
949
912
|
let t = Q(e, "about"), n = t === void 0 ? void 0 : /(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];
|
|
950
913
|
if (n === void 0) return;
|
|
951
914
|
let r = n.replace(/^0+(?=\d)/, "");
|
|
952
915
|
return r === "0" ? void 0 : r;
|
|
953
|
-
},
|
|
916
|
+
}, Pt = (e) => {
|
|
954
917
|
let t = [];
|
|
955
918
|
for (let n of e.children) {
|
|
956
|
-
if (!
|
|
919
|
+
if (!jt(n)) continue;
|
|
957
920
|
let e = n.name.toLowerCase() === "dcterms:creator", r = n.name.toLowerCase().startsWith("marcrel:");
|
|
958
921
|
if (!e && !r) continue;
|
|
959
922
|
let i = Z(X(X(n, "agent") ?? n, "name"));
|
|
@@ -963,10 +926,10 @@ var c = (e) => {
|
|
|
963
926
|
});
|
|
964
927
|
}
|
|
965
928
|
return t;
|
|
966
|
-
},
|
|
929
|
+
}, Ft = (e) => Y(e, "subject").flatMap((e) => {
|
|
967
930
|
let t = X(e, "Description"), n = t === void 0 ? void 0 : Q(X(t, "memberOf") ?? t, "resource"), r = Z(t === void 0 ? void 0 : X(t, "value"));
|
|
968
931
|
return r !== void 0 && n?.endsWith("/LCSH") === !0 ? [r] : [];
|
|
969
|
-
}),
|
|
932
|
+
}), It = (e) => {
|
|
970
933
|
let t = Y(e, "hasFormat").flatMap((e) => {
|
|
971
934
|
let t = X(e, "file");
|
|
972
935
|
if (t === void 0) return [];
|
|
@@ -977,10 +940,10 @@ var c = (e) => {
|
|
|
977
940
|
}];
|
|
978
941
|
});
|
|
979
942
|
return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
|
|
980
|
-
}, $ = (e) => e.length > 0 ? e : void 0,
|
|
943
|
+
}, $ = (e) => e.length > 0 ? e : void 0, Lt = (e) => {
|
|
981
944
|
let t;
|
|
982
945
|
try {
|
|
983
|
-
t = new
|
|
946
|
+
t = new o(e);
|
|
984
947
|
} catch (e) {
|
|
985
948
|
let t = e instanceof Error ? e.message : String(e);
|
|
986
949
|
throw Error(`Project Gutenberg RDF is malformed: ${t}`, { cause: e });
|
|
@@ -988,9 +951,9 @@ var c = (e) => {
|
|
|
988
951
|
if (J(t.name).toLowerCase() !== "rdf") return;
|
|
989
952
|
let n = X(t, "ebook");
|
|
990
953
|
if (n === void 0) return;
|
|
991
|
-
let r =
|
|
954
|
+
let r = Nt(n);
|
|
992
955
|
if (r === void 0) return;
|
|
993
|
-
let i = [...new Set(
|
|
956
|
+
let i = [...new Set(Mt(n, "language"))], a = [...new Set(Ft(n))], s = [...new Set(Mt(n, "bookshelf"))], c = Pt(n);
|
|
994
957
|
return {
|
|
995
958
|
id: r,
|
|
996
959
|
title: Z(X(n, "title")),
|
|
@@ -1002,11 +965,11 @@ var c = (e) => {
|
|
|
1002
965
|
summary: Z(X(n, "marc520")),
|
|
1003
966
|
languages: $(i),
|
|
1004
967
|
subjects: $(a),
|
|
1005
|
-
bookshelves: $(
|
|
968
|
+
bookshelves: $(s),
|
|
1006
969
|
contributors: $(c),
|
|
1007
|
-
cover:
|
|
970
|
+
cover: It(n)
|
|
1008
971
|
};
|
|
1009
|
-
},
|
|
972
|
+
}, Rt = 25, zt = {
|
|
1010
973
|
art: "artist",
|
|
1011
974
|
aut: "author",
|
|
1012
975
|
clr: "colorist",
|
|
@@ -1015,17 +978,17 @@ var c = (e) => {
|
|
|
1015
978
|
ill: "illustrator",
|
|
1016
979
|
nrt: "narrator",
|
|
1017
980
|
trl: "translator"
|
|
1018
|
-
},
|
|
981
|
+
}, Bt = (e) => {
|
|
1019
982
|
let t = /* @__PURE__ */ new Map();
|
|
1020
983
|
for (let n of e.contributors ?? []) {
|
|
1021
|
-
let e = n.name.trim().toLowerCase(), r =
|
|
984
|
+
let e = n.name.trim().toLowerCase(), r = zt[n.role.trim().toLowerCase()] ?? n.role, i = t.get(e);
|
|
1022
985
|
i === void 0 ? t.set(e, {
|
|
1023
986
|
name: n.name,
|
|
1024
987
|
roles: [r]
|
|
1025
988
|
}) : i.roles.includes(r) || i.roles.push(r);
|
|
1026
989
|
}
|
|
1027
990
|
return t.size > 0 ? [...t.values()] : void 0;
|
|
1028
|
-
},
|
|
991
|
+
}, Vt = (e) => {
|
|
1029
992
|
if (e === void 0) return;
|
|
1030
993
|
let t = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());
|
|
1031
994
|
if (t === null) return;
|
|
@@ -1035,53 +998,53 @@ var c = (e) => {
|
|
|
1035
998
|
...r === void 0 ? {} : { month: r },
|
|
1036
999
|
...i === void 0 ? {} : { day: i }
|
|
1037
1000
|
};
|
|
1038
|
-
},
|
|
1001
|
+
}, Ht = (e, t) => e.split("$").slice(1).flatMap((e) => e[0]?.toLowerCase() === t.toLowerCase() ? [e.slice(1).trim()] : []).filter((e) => e.length > 0), Ut = (e) => {
|
|
1039
1002
|
if (e === void 0) return;
|
|
1040
|
-
let t =
|
|
1003
|
+
let t = Ht(e, "b"), n = (t.length === 1 ? t[0] : void 0)?.replace(/[\s,;:/]+$/u, "").trim(), r = Ht(e, "c"), i = [...new Set(r.flatMap((e) => [...e.matchAll(/\d{4}/g)].flatMap((e) => e[0] === void 0 ? [] : [Number(e[0])])))], a = N({
|
|
1041
1004
|
date: i.length === 1 ? { year: i[0] } : void 0,
|
|
1042
1005
|
publisher: n !== void 0 && n.length > 0 && !/^\[?s\.n\.?\]?$/i.test(n) ? n : void 0
|
|
1043
1006
|
});
|
|
1044
1007
|
return a.date !== void 0 || a.publisher !== void 0 ? a : void 0;
|
|
1045
|
-
},
|
|
1008
|
+
}, Wt = (e, t) => {
|
|
1046
1009
|
try {
|
|
1047
1010
|
let n = new URL(e, t);
|
|
1048
1011
|
return n.protocol === "http:" || n.protocol === "https:" ? n.toString() : void 0;
|
|
1049
1012
|
} catch {
|
|
1050
1013
|
return;
|
|
1051
1014
|
}
|
|
1052
|
-
},
|
|
1015
|
+
}, Gt = (e) => e.length > 0 ? e : void 0, Kt = (e, t) => {
|
|
1053
1016
|
let { id: n, title: r, publisher: i, issued: a, originalPublication: o, rights: s, description: c, summary: l, languages: u, subjects: d, bookshelves: f, contributors: p, cover: m, ...h } = e, g = [t.matchedIdentifier, {
|
|
1054
1017
|
value: n,
|
|
1055
|
-
scheme:
|
|
1056
|
-
}].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme.trim().toLowerCase() === e.scheme.trim().toLowerCase()) === t), _ = [.../* @__PURE__ */ new Set([...d ?? [], ...f ?? []])].slice(0, 25), v = m === void 0 ? void 0 :
|
|
1018
|
+
scheme: G
|
|
1019
|
+
}].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme.trim().toLowerCase() === e.scheme.trim().toLowerCase()) === t), _ = [.../* @__PURE__ */ new Set([...d ?? [], ...f ?? []])].slice(0, 25), v = m === void 0 ? void 0 : Wt(m.uri, t.baseUrl), y = v === void 0 ? void 0 : {
|
|
1057
1020
|
uri: v,
|
|
1058
1021
|
mediaType: m?.mediaType,
|
|
1059
1022
|
confidence: "derived"
|
|
1060
|
-
}, b =
|
|
1061
|
-
date:
|
|
1023
|
+
}, b = N({
|
|
1024
|
+
date: Vt(a),
|
|
1062
1025
|
publisher: i
|
|
1063
|
-
}), x =
|
|
1064
|
-
original:
|
|
1026
|
+
}), x = N({
|
|
1027
|
+
original: Ut(o),
|
|
1065
1028
|
edition: b.date !== void 0 || b.publisher !== void 0 ? b : void 0
|
|
1066
1029
|
});
|
|
1067
|
-
return
|
|
1030
|
+
return N({
|
|
1068
1031
|
titles: r === void 0 ? void 0 : [{ value: r }],
|
|
1069
1032
|
publication: x.original !== void 0 || x.edition !== void 0 ? x : void 0,
|
|
1070
1033
|
description: l ?? c,
|
|
1071
1034
|
rights: s,
|
|
1072
|
-
languages:
|
|
1073
|
-
subjects:
|
|
1074
|
-
contributors:
|
|
1035
|
+
languages: Gt([...new Set(u ?? [])]),
|
|
1036
|
+
subjects: Gt(_),
|
|
1037
|
+
contributors: Bt(e),
|
|
1075
1038
|
identifiers: g,
|
|
1076
1039
|
cover: y
|
|
1077
1040
|
});
|
|
1078
|
-
},
|
|
1079
|
-
let t = e.baseUrl ??
|
|
1041
|
+
}, qt = "projectGutenberg", Jt = "https://www.gutenberg.org", Yt = (e = {}) => {
|
|
1042
|
+
let t = e.baseUrl ?? Jt;
|
|
1080
1043
|
return {
|
|
1081
|
-
id:
|
|
1044
|
+
id: qt,
|
|
1082
1045
|
name: "Project Gutenberg",
|
|
1083
1046
|
search: async (n, r) => {
|
|
1084
|
-
let i =
|
|
1047
|
+
let i = K(n);
|
|
1085
1048
|
if (i === void 0) return [];
|
|
1086
1049
|
let a = new URL(`/cache/epub/${i.id}/pg${i.id}.rdf`, t), o = await (e.fetch ?? globalThis.fetch)(a.toString(), {
|
|
1087
1050
|
signal: r.signal,
|
|
@@ -1092,22 +1055,22 @@ var c = (e) => {
|
|
|
1092
1055
|
});
|
|
1093
1056
|
if (o.status === 404) return [];
|
|
1094
1057
|
if (!o.ok) throw new M(o.status, `Project Gutenberg metadata lookup failed with status ${o.status}`);
|
|
1095
|
-
let s =
|
|
1058
|
+
let s = Lt(await o.text());
|
|
1096
1059
|
if (s === void 0 || s.id !== i.id) throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);
|
|
1097
1060
|
let c = new URL(`/ebooks/${i.id}`, t).toString();
|
|
1098
1061
|
return [{
|
|
1099
1062
|
id: s.id,
|
|
1100
1063
|
url: c,
|
|
1101
1064
|
raw: s,
|
|
1102
|
-
metadata:
|
|
1065
|
+
metadata: Kt(s, {
|
|
1103
1066
|
baseUrl: t,
|
|
1104
1067
|
matchedIdentifier: i.identifier
|
|
1105
1068
|
})
|
|
1106
1069
|
}];
|
|
1107
1070
|
}
|
|
1108
1071
|
};
|
|
1109
|
-
},
|
|
1072
|
+
}, Xt = (e) => [e.title, e.series].some((e) => e !== void 0 && e.trim().length > 0) || (e.identifiers ?? []).some((e) => e.value.trim().length > 0) || (e.authors ?? []).some((e) => e.trim().length > 0);
|
|
1110
1073
|
//#endregion
|
|
1111
|
-
export {
|
|
1074
|
+
export { z as GOOGLE_BOOKS_IDENTIFIER_SCHEME, Be as GOOGLE_BOOKS_MAX_SUBJECTS, pt as GOOGLE_BOOKS_PROVIDER_ID, re as METADATA_MATCH_WEIGHTS, M as MetadataProviderResponseError, St as OPEN_LIBRARY_IDENTIFIER_SCHEME, xt as OPEN_LIBRARY_MAX_SUBJECTS, Tt as OPEN_LIBRARY_PROVIDER_ID, G as PROJECT_GUTENBERG_IDENTIFIER_SCHEME, Rt as PROJECT_GUTENBERG_MAX_SUBJECTS, qt as PROJECT_GUTENBERG_PROVIDER_ID, ht as createGoogleBooksProvider, At as createOpenLibraryProvider, Yt as createProjectGutenbergProvider, we as fetchMetadata, Ke as googleBooksCoverUrl, Me as googleBooksLookupFromInput, Ye as googleBooksVolumeUrl, Xt as hasSearchTerms, bt as marcLanguageToBcp47, s as metadataAuthors, Te as metadataInputFromResolvedArchive, p as normalizeForComparison, V as parseGoogleBooksVolume, Le as parseGoogleBooksVolumesResponse, _t as parseOpenLibrarySearchResponse, Lt as parseProjectGutenbergRdf, ne as personNameSimilarity, K as projectGutenbergLookupFromInput, Je as resolveGoogleBooksVolume, wt as resolveOpenLibraryDoc, Kt as resolveProjectGutenbergRecord, ve as responseErrorStatus, je as retryWithBackoff, _e as scoreMetadataCandidate, h as textSimilarity, k as titleSimilarity, u as toIsbn13 };
|
|
1112
1075
|
|
|
1113
1076
|
//# sourceMappingURL=index.js.map
|