@prose-reader/metadata-fetcher 1.345.0 → 1.346.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 +320 -320
- package/dist/index.js.map +1 -1
- package/dist/providers/googleBooks/resolve.d.ts +3 -3
- package/dist/providers/openLibrary/resolve.d.ts +2 -2
- package/dist/providers/projectGutenberg/resolve.d.ts +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Report as
|
|
3
|
-
import { XmlDocument as
|
|
1
|
+
import { mainTitle as e, normalizeGtin as t, normalizeIsbn as n, parseW3cDtfDate as r } from "@prose-reader/archive-reader";
|
|
2
|
+
import { Report as i } from "@prose-reader/shared";
|
|
3
|
+
import { XmlDocument as a } from "xmldoc";
|
|
4
4
|
//#region src/utils/identifierValues.ts
|
|
5
|
-
var
|
|
5
|
+
var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
6
6
|
for (let r of e ?? []) {
|
|
7
|
-
if (!
|
|
7
|
+
if (!o(r, t)) continue;
|
|
8
8
|
let e = n(r.value);
|
|
9
9
|
if (e !== void 0) return e;
|
|
10
10
|
}
|
|
11
|
-
},
|
|
12
|
-
let
|
|
13
|
-
return
|
|
14
|
-
},
|
|
11
|
+
}, c = /* @__PURE__ */ new Set(["isbn", "gtin"]), l = /* @__PURE__ */ new Set(["gtin", "isbn"]), u = (e) => {
|
|
12
|
+
let t = n(e);
|
|
13
|
+
return t !== void 0 && (t.length === 10 || /^97[89]/.test(t)) ? t : void 0;
|
|
14
|
+
}, d = (e) => s(e, c, u), ee = (e) => s(e, l, t), f = (e) => {
|
|
15
15
|
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);
|
|
16
16
|
return [...new Set(r)];
|
|
17
|
-
},
|
|
18
|
-
let
|
|
19
|
-
if (
|
|
20
|
-
if (
|
|
21
|
-
if (!
|
|
22
|
-
let r = `978${
|
|
17
|
+
}, p = /^\d{13}$/, m = /^\d{9}[\dX]$/, h = (e) => {
|
|
18
|
+
let t = n(e);
|
|
19
|
+
if (t === void 0) return;
|
|
20
|
+
if (p.test(t)) return t;
|
|
21
|
+
if (!m.test(t)) return;
|
|
22
|
+
let r = `978${t.slice(0, 9)}`, i = 0;
|
|
23
23
|
for (let e = 0; e < r.length; e++) {
|
|
24
24
|
let t = r.charCodeAt(e) - 48;
|
|
25
25
|
i += e % 2 == 0 ? t : t * 3;
|
|
26
26
|
}
|
|
27
27
|
return `${r}${(10 - i % 10) % 10}`;
|
|
28
|
-
},
|
|
28
|
+
}, g = /[\u0300-\u036f]/g, _ = /[^\p{L}\p{N}]+/gu, v = (e) => e.normalize("NFD").replace(g, "").toLowerCase().replace(_, " ").trim(), y = (e) => {
|
|
29
29
|
let t = /* @__PURE__ */ new Map();
|
|
30
30
|
for (let n = 0; n < e.length - 1; n++) {
|
|
31
31
|
let r = e.slice(n, n + 2);
|
|
32
32
|
t.set(r, (t.get(r) ?? 0) + 1);
|
|
33
33
|
}
|
|
34
34
|
return t;
|
|
35
|
-
},
|
|
36
|
-
let n =
|
|
35
|
+
}, b = (e, t) => {
|
|
36
|
+
let n = v(e).replaceAll(" ", ""), r = v(t).replaceAll(" ", "");
|
|
37
37
|
if (n.length === 0 || r.length === 0) return 0;
|
|
38
38
|
if (n === r) return 1;
|
|
39
39
|
if (n.length < 2 || r.length < 2) return 0;
|
|
40
|
-
let i =
|
|
41
|
-
for (let [e, t] of
|
|
40
|
+
let i = y(n), a = 0;
|
|
41
|
+
for (let [e, t] of y(r)) a += Math.min(t, i.get(e) ?? 0);
|
|
42
42
|
return 2 * a / (n.length - 1 + (r.length - 1));
|
|
43
|
-
},
|
|
44
|
-
let [t = "", ...n] = e.split(
|
|
43
|
+
}, x = /\s*[:;]\s*|\s+[-–—]\s+/, S = (e) => {
|
|
44
|
+
let [t = "", ...n] = e.split(x), r = t.trim(), i = n.join(" ").trim();
|
|
45
45
|
return r.length === 0 ? {
|
|
46
46
|
main: e,
|
|
47
47
|
hasSubtitle: !1
|
|
@@ -49,11 +49,11 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
49
49
|
main: r,
|
|
50
50
|
hasSubtitle: i.length > 0
|
|
51
51
|
};
|
|
52
|
-
},
|
|
52
|
+
}, C = .9, w = [
|
|
53
53
|
"volume",
|
|
54
54
|
"part",
|
|
55
55
|
"book"
|
|
56
|
-
],
|
|
56
|
+
], T = /\b(volumes?|vols?|parts?|books?)\s+([\p{L}\p{N}]+)\b/gu, te = {
|
|
57
57
|
one: 1,
|
|
58
58
|
first: 1,
|
|
59
59
|
two: 2,
|
|
@@ -99,27 +99,27 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
99
99
|
if (e.startsWith("vol")) return "volume";
|
|
100
100
|
if (e.startsWith("part")) return "part";
|
|
101
101
|
if (e.startsWith("book")) return "book";
|
|
102
|
-
},
|
|
102
|
+
}, oe = (e) => {
|
|
103
103
|
let t = /* @__PURE__ */ new Map();
|
|
104
|
-
for (let n of
|
|
104
|
+
for (let n of v(e).matchAll(T)) {
|
|
105
105
|
let e = n[1] === void 0 ? void 0 : ae(n[1]), r = n[2] === void 0 ? void 0 : ie(n[2]);
|
|
106
106
|
if (e === void 0 || r === void 0) continue;
|
|
107
107
|
let i = t.get(e) ?? /* @__PURE__ */ new Set();
|
|
108
108
|
i.add(r), t.set(e, i);
|
|
109
109
|
}
|
|
110
110
|
return t;
|
|
111
|
-
},
|
|
112
|
-
let n =
|
|
113
|
-
for (let e of
|
|
111
|
+
}, se = (e, t) => {
|
|
112
|
+
let n = oe(e), r = oe(t);
|
|
113
|
+
for (let e of w) {
|
|
114
114
|
let t = n.get(e), i = r.get(e);
|
|
115
115
|
if (!(t === void 0 || i === void 0) && [...t].every((e) => !i.has(e))) return !0;
|
|
116
116
|
}
|
|
117
117
|
return !1;
|
|
118
|
-
},
|
|
119
|
-
if (
|
|
120
|
-
let n =
|
|
121
|
-
return r.hasSubtitle === i.hasSubtitle ? n : Math.max(n,
|
|
122
|
-
},
|
|
118
|
+
}, ce = (e, t) => {
|
|
119
|
+
if (se(e, t)) return 0;
|
|
120
|
+
let n = b(e, t), r = S(e), i = S(t);
|
|
121
|
+
return r.hasSubtitle === i.hasSubtitle ? n : Math.max(n, b(r.main, i.main) * C);
|
|
122
|
+
}, le = (e) => v(e).split(" ").filter((e) => e.length > 0).sort().join(" "), ue = (e, t) => b(le(e), le(t)), de = {
|
|
123
123
|
isbn: 1,
|
|
124
124
|
gtin: 1,
|
|
125
125
|
identifiers: .6,
|
|
@@ -130,35 +130,35 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
130
130
|
publisher: .15,
|
|
131
131
|
languages: .15,
|
|
132
132
|
numberOfPages: .15
|
|
133
|
-
},
|
|
133
|
+
}, fe = /* @__PURE__ */ new Set(["isbn", "gtin"]), E = (e) => {
|
|
134
134
|
let t = e?.trim();
|
|
135
135
|
return t !== void 0 && t.length > 0 ? t : void 0;
|
|
136
|
-
},
|
|
137
|
-
let n =
|
|
138
|
-
return n !== void 0 && n ===
|
|
139
|
-
},
|
|
136
|
+
}, pe = (e, t) => {
|
|
137
|
+
let n = E(e.value)?.toLowerCase();
|
|
138
|
+
return n !== void 0 && n === E(t.value)?.toLowerCase();
|
|
139
|
+
}, D = (e) => e.scheme.trim().toLowerCase() === "unknown" ? void 0 : E(e.scheme)?.toLowerCase(), me = (e) => `${e.scheme}:${e.value}`, he = (e) => {
|
|
140
140
|
let t = e.scheme.trim().toLowerCase();
|
|
141
141
|
return t === "isbn" || t === "gtin";
|
|
142
|
-
},
|
|
143
|
-
if (!
|
|
144
|
-
let n =
|
|
142
|
+
}, ge = (e, t) => {
|
|
143
|
+
if (!pe(e, t)) return !1;
|
|
144
|
+
let n = D(e), r = D(t);
|
|
145
145
|
return n === void 0 || r === void 0 || n === r;
|
|
146
|
-
},
|
|
147
|
-
if (!
|
|
148
|
-
let n =
|
|
146
|
+
}, _e = (e, t) => {
|
|
147
|
+
if (!pe(e, t)) return !1;
|
|
148
|
+
let n = D(e), r = D(t);
|
|
149
149
|
return n !== void 0 && n === r;
|
|
150
|
-
},
|
|
150
|
+
}, O = (e) => e.trim().toLowerCase().split("-")[0] ?? "", ve = (e, t) => {
|
|
151
151
|
let n = Math.abs(e - t);
|
|
152
152
|
return n === 0 ? 1 : n === 1 ? .6 : n <= 3 ? .3 : 0;
|
|
153
|
-
},
|
|
153
|
+
}, ye = (e, t) => {
|
|
154
154
|
let n = Math.max(e, t);
|
|
155
155
|
return n <= 0 ? 0 : Math.max(0, 1 - Math.abs(e - t) / n * 2);
|
|
156
|
-
},
|
|
157
|
-
let r =
|
|
156
|
+
}, be = (e, t, n) => e.reduce((e, r) => t.reduce((e, t) => Math.max(e, n(r, t)), e), 0), xe = (e, t, n = b) => {
|
|
157
|
+
let r = E(e);
|
|
158
158
|
if (r === void 0) return;
|
|
159
159
|
let i;
|
|
160
160
|
for (let e of t) {
|
|
161
|
-
let t =
|
|
161
|
+
let t = E(e);
|
|
162
162
|
if (t === void 0) continue;
|
|
163
163
|
let a = {
|
|
164
164
|
score: n(r, t),
|
|
@@ -168,92 +168,92 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
168
168
|
(i === void 0 || a.score > i.score) && (i = a);
|
|
169
169
|
}
|
|
170
170
|
return i;
|
|
171
|
-
},
|
|
171
|
+
}, Se = (e, t) => {
|
|
172
172
|
if (e === void 0) return;
|
|
173
173
|
let n;
|
|
174
174
|
for (let r of t) {
|
|
175
175
|
if (r === void 0) continue;
|
|
176
176
|
let t = {
|
|
177
|
-
score:
|
|
177
|
+
score: ve(e, r),
|
|
178
178
|
query: String(e),
|
|
179
179
|
candidate: String(r)
|
|
180
180
|
};
|
|
181
181
|
(n === void 0 || t.score > n.score) && (n = t);
|
|
182
182
|
}
|
|
183
183
|
return n;
|
|
184
|
-
},
|
|
185
|
-
let
|
|
186
|
-
t !== void 0 &&
|
|
184
|
+
}, k = (t, n) => {
|
|
185
|
+
let r = [], i = (e, t) => {
|
|
186
|
+
t !== void 0 && r.push({
|
|
187
187
|
field: e,
|
|
188
|
-
weight:
|
|
188
|
+
weight: de[e],
|
|
189
189
|
score: Math.min(1, Math.max(0, t.score)),
|
|
190
190
|
query: t.query,
|
|
191
191
|
candidate: t.candidate
|
|
192
192
|
});
|
|
193
|
-
},
|
|
194
|
-
let a =
|
|
195
|
-
a === void 0 || o === void 0 ||
|
|
196
|
-
score:
|
|
193
|
+
}, a = (e, t, n, r = b) => {
|
|
194
|
+
let a = E(t), o = E(n);
|
|
195
|
+
a === void 0 || o === void 0 || i(e, {
|
|
196
|
+
score: r(a, o),
|
|
197
197
|
query: a,
|
|
198
198
|
candidate: o
|
|
199
199
|
});
|
|
200
|
-
},
|
|
201
|
-
|
|
202
|
-
score: +(
|
|
203
|
-
query:
|
|
204
|
-
candidate:
|
|
200
|
+
}, o = d(t.identifiers), s = d(n.identifiers), c = o === void 0 ? void 0 : h(o), l = s === void 0 ? void 0 : h(s), u = o !== void 0 && s !== void 0 && c !== void 0 && l !== void 0;
|
|
201
|
+
u && i("isbn", {
|
|
202
|
+
score: +(c === l),
|
|
203
|
+
query: o,
|
|
204
|
+
candidate: s
|
|
205
205
|
});
|
|
206
|
-
let
|
|
207
|
-
!
|
|
208
|
-
score: +(
|
|
209
|
-
query:
|
|
210
|
-
candidate:
|
|
206
|
+
let p = ee(t.identifiers), m = ee(n.identifiers);
|
|
207
|
+
!u && p !== void 0 && m !== void 0 && i("gtin", {
|
|
208
|
+
score: +(p === m),
|
|
209
|
+
query: p,
|
|
210
|
+
candidate: m
|
|
211
211
|
});
|
|
212
|
-
let
|
|
213
|
-
|
|
214
|
-
score: +!!
|
|
215
|
-
query:
|
|
216
|
-
candidate:
|
|
217
|
-
}),
|
|
218
|
-
let
|
|
219
|
-
let t =
|
|
212
|
+
let g = (t.identifiers ?? []).filter((e) => !he(e)), _ = (n.identifiers ?? []).filter((e) => !he(e)), v = g.some((e) => _.some((t) => _e(e, t)));
|
|
213
|
+
g.length > 0 && _.length > 0 && i("identifiers", {
|
|
214
|
+
score: +!!g.some((e) => _.some((t) => ge(e, t))),
|
|
215
|
+
query: g.map(me).join(", "),
|
|
216
|
+
candidate: _.map(me).join(", ")
|
|
217
|
+
}), a("title", t.title, e(n), ce), i("publisher", xe(t.publisher, [n.publication?.original?.publisher, n.publication?.edition?.publisher])), a("series", t.series, n.belongsTo?.series?.[0]?.name);
|
|
218
|
+
let y = f(n), x = (t.authors ?? []).flatMap((e) => {
|
|
219
|
+
let t = E(e);
|
|
220
220
|
return t === void 0 ? [] : [t];
|
|
221
221
|
});
|
|
222
|
-
|
|
223
|
-
score:
|
|
224
|
-
query:
|
|
225
|
-
candidate:
|
|
226
|
-
}),
|
|
227
|
-
let
|
|
228
|
-
if (
|
|
229
|
-
let e = new Set(
|
|
230
|
-
|
|
231
|
-
score: +!!
|
|
232
|
-
query:
|
|
233
|
-
candidate:
|
|
222
|
+
x.length > 0 && y.length > 0 && i("authors", {
|
|
223
|
+
score: be(x, y, ue),
|
|
224
|
+
query: x.join(", "),
|
|
225
|
+
candidate: y.join(", ")
|
|
226
|
+
}), i("publishedYear", Se(t.publishedYear, [n.publication?.original?.date?.year, n.publication?.edition?.date?.year]));
|
|
227
|
+
let S = t.languages ?? [], C = n.languages ?? [];
|
|
228
|
+
if (S.length > 0 && C.length > 0) {
|
|
229
|
+
let e = new Set(C.map(O));
|
|
230
|
+
i("languages", {
|
|
231
|
+
score: +!!S.some((t) => e.has(O(t))),
|
|
232
|
+
query: S.join(", "),
|
|
233
|
+
candidate: C.join(", ")
|
|
234
234
|
});
|
|
235
235
|
}
|
|
236
|
-
|
|
237
|
-
score:
|
|
238
|
-
query: String(
|
|
239
|
-
candidate: String(
|
|
236
|
+
t.numberOfPages !== void 0 && n.numberOfPages !== void 0 && i("numberOfPages", {
|
|
237
|
+
score: ye(t.numberOfPages, n.numberOfPages),
|
|
238
|
+
query: String(t.numberOfPages),
|
|
239
|
+
candidate: String(n.numberOfPages)
|
|
240
240
|
});
|
|
241
|
-
let
|
|
242
|
-
if (
|
|
241
|
+
let w = r.filter((e) => fe.has(e.field));
|
|
242
|
+
if (w.some((e) => e.score === 0)) return {
|
|
243
243
|
score: 0,
|
|
244
|
-
signals:
|
|
244
|
+
signals: r
|
|
245
245
|
};
|
|
246
|
-
if (
|
|
246
|
+
if (v || w.some((e) => e.score === 1)) return {
|
|
247
247
|
score: 1,
|
|
248
|
-
signals:
|
|
248
|
+
signals: r
|
|
249
249
|
};
|
|
250
|
-
let
|
|
251
|
-
return
|
|
250
|
+
let T = r.reduce((e, t) => e + t.weight, 0);
|
|
251
|
+
return T === 0 ? {
|
|
252
252
|
score: 0,
|
|
253
|
-
signals:
|
|
253
|
+
signals: r
|
|
254
254
|
} : {
|
|
255
|
-
score:
|
|
256
|
-
signals:
|
|
255
|
+
score: r.reduce((e, t) => e + t.score * t.weight, 0) / T,
|
|
256
|
+
signals: r
|
|
257
257
|
};
|
|
258
258
|
}, A = class extends Error {
|
|
259
259
|
status;
|
|
@@ -264,10 +264,10 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
264
264
|
if (typeof e != "object" || !e || !("status" in e)) return;
|
|
265
265
|
let { status: t } = e;
|
|
266
266
|
if (!(typeof t != "number" || !Number.isInteger(t))) return t >= 100 && t <= 599 ? t : void 0;
|
|
267
|
-
},
|
|
267
|
+
}, Ce = i.namespace("@prose-reader/metadata-fetcher", void 0, { color: "#b06642" }), M = (e) => {
|
|
268
268
|
let t = Object.entries(e).filter(([, e]) => e !== void 0);
|
|
269
269
|
return Object.fromEntries(t);
|
|
270
|
-
},
|
|
270
|
+
}, we = 5, Te = .5, Ee = 5, De = ({ candidate: e, providerId: t, score: n, signals: r, accepted: i, includeRaw: a }) => M({
|
|
271
271
|
providerId: t,
|
|
272
272
|
score: n,
|
|
273
273
|
signals: r,
|
|
@@ -276,8 +276,8 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
276
276
|
id: e.id,
|
|
277
277
|
url: e.url,
|
|
278
278
|
raw: a ? e.raw : void 0
|
|
279
|
-
}),
|
|
280
|
-
let n = t.limit ??
|
|
279
|
+
}), Oe = async (e, t) => {
|
|
280
|
+
let n = t.limit ?? we, r = t.minScore ?? Te, i = t.includeRaw === !0, a = await Promise.all(t.providers.map(async (r) => {
|
|
281
281
|
try {
|
|
282
282
|
return {
|
|
283
283
|
provider: r,
|
|
@@ -289,10 +289,10 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
289
289
|
};
|
|
290
290
|
} catch (e) {
|
|
291
291
|
if (t.signal?.aborted === !0) throw e;
|
|
292
|
-
return
|
|
292
|
+
return Ce.error(`fetchMetadata: provider "${r.id}" failed`, e), {
|
|
293
293
|
provider: r,
|
|
294
294
|
candidates: void 0,
|
|
295
|
-
failure:
|
|
295
|
+
failure: M({
|
|
296
296
|
id: r.id,
|
|
297
297
|
status: j(e)
|
|
298
298
|
})
|
|
@@ -302,8 +302,8 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
302
302
|
for (let { provider: t, candidates: o } of a) {
|
|
303
303
|
if (o === void 0) continue;
|
|
304
304
|
let a = o.map((n) => {
|
|
305
|
-
let { score: a, signals: o } =
|
|
306
|
-
return
|
|
305
|
+
let { score: a, signals: o } = k(e, n.metadata);
|
|
306
|
+
return De({
|
|
307
307
|
candidate: n,
|
|
308
308
|
providerId: t.id,
|
|
309
309
|
score: a,
|
|
@@ -312,7 +312,7 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
312
312
|
includeRaw: i
|
|
313
313
|
});
|
|
314
314
|
}).sort((e, t) => t.score - e.score).slice(0, n);
|
|
315
|
-
s[t.id] !== void 0 &&
|
|
315
|
+
s[t.id] !== void 0 && Ce.warn(`fetchMetadata: several providers share the id "${t.id}"`), s[t.id] = {
|
|
316
316
|
provider: {
|
|
317
317
|
id: t.id,
|
|
318
318
|
name: t.name
|
|
@@ -321,89 +321,89 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
321
321
|
}, c.push(...a);
|
|
322
322
|
}
|
|
323
323
|
return {
|
|
324
|
-
version:
|
|
324
|
+
version: Ee,
|
|
325
325
|
matches: [...c].sort((e, t) => t.score - e.score),
|
|
326
326
|
sources: s,
|
|
327
327
|
failedProviders: o
|
|
328
328
|
};
|
|
329
|
-
},
|
|
330
|
-
let { metadata:
|
|
329
|
+
}, ke = (t) => {
|
|
330
|
+
let { metadata: n } = t, r = f(n), i = n.identifiers?.map(({ value: e, scheme: t }) => ({
|
|
331
331
|
value: e,
|
|
332
332
|
scheme: t
|
|
333
333
|
}));
|
|
334
|
-
return
|
|
335
|
-
title:
|
|
336
|
-
authors:
|
|
337
|
-
identifiers:
|
|
338
|
-
series:
|
|
339
|
-
publisher:
|
|
340
|
-
publishedYear:
|
|
341
|
-
languages:
|
|
342
|
-
numberOfPages:
|
|
334
|
+
return M({
|
|
335
|
+
title: e(n),
|
|
336
|
+
authors: r.length > 0 ? r : void 0,
|
|
337
|
+
identifiers: i !== void 0 && i.length > 0 ? i : void 0,
|
|
338
|
+
series: n.belongsTo?.series?.[0]?.name,
|
|
339
|
+
publisher: n.publication?.edition?.publisher ?? n.publication?.original?.publisher,
|
|
340
|
+
publishedYear: n.publication?.edition?.date?.year ?? n.publication?.original?.date?.year,
|
|
341
|
+
languages: n.languages,
|
|
342
|
+
numberOfPages: n.numberOfPages
|
|
343
343
|
});
|
|
344
|
-
},
|
|
344
|
+
}, N = (e) => typeof e == "object" && !!e && !Array.isArray(e), P = (e, t) => {
|
|
345
345
|
let n = e[t];
|
|
346
346
|
if (typeof n != "string") return;
|
|
347
347
|
let r = n.trim();
|
|
348
348
|
return r.length > 0 ? r : void 0;
|
|
349
|
-
},
|
|
349
|
+
}, F = (e, t) => {
|
|
350
350
|
let n = e[t];
|
|
351
351
|
return typeof n == "number" && Number.isFinite(n) ? n : void 0;
|
|
352
|
-
},
|
|
352
|
+
}, I = (e, t) => {
|
|
353
353
|
let n = e[t];
|
|
354
354
|
if (!Array.isArray(n)) return;
|
|
355
355
|
let r = n.filter((e) => typeof e == "string").map((e) => e.trim()).filter((e) => e.length > 0);
|
|
356
356
|
return r.length > 0 ? r : void 0;
|
|
357
|
-
},
|
|
357
|
+
}, L = (e, t) => {
|
|
358
358
|
let n = e[t];
|
|
359
|
-
return Array.isArray(n) ? n.filter(
|
|
360
|
-
},
|
|
361
|
-
if (e?.aborted === !0) throw
|
|
362
|
-
},
|
|
359
|
+
return Array.isArray(n) ? n.filter(N) : [];
|
|
360
|
+
}, Ae = (e) => e.reason ?? new DOMException("The operation was aborted", "AbortError"), je = (e) => {
|
|
361
|
+
if (e?.aborted === !0) throw Ae(e);
|
|
362
|
+
}, Me = (e, t) => (je(t), new Promise((n, r) => {
|
|
363
363
|
let i = () => {
|
|
364
|
-
clearTimeout(a), r(t === void 0 ? void 0 :
|
|
364
|
+
clearTimeout(a), r(t === void 0 ? void 0 : Ae(t));
|
|
365
365
|
}, a = setTimeout(() => {
|
|
366
366
|
t?.removeEventListener("abort", i), n();
|
|
367
367
|
}, e);
|
|
368
368
|
t?.addEventListener("abort", i, { once: !0 });
|
|
369
|
-
})),
|
|
369
|
+
})), Ne = (e) => {
|
|
370
370
|
if (!Number.isInteger(e.attempts) || e.attempts < 1) throw RangeError("attempts must be a positive integer");
|
|
371
371
|
if (!Number.isFinite(e.initialDelayMs) || e.initialDelayMs < 0) throw RangeError("initialDelayMs must be a non-negative finite number");
|
|
372
372
|
if (e.maxDelayMs !== void 0 && (!Number.isFinite(e.maxDelayMs) || e.maxDelayMs < 0)) throw RangeError("maxDelayMs must be a non-negative finite number");
|
|
373
|
-
},
|
|
373
|
+
}, Pe = (e, t) => {
|
|
374
374
|
let n = t.initialDelayMs * 2 ** (e - 1), r = t.jitter === !1 ? n : n * (1 + Math.random());
|
|
375
375
|
return Math.min(r, t.maxDelayMs ?? 2 ** 53 - 1);
|
|
376
|
-
},
|
|
377
|
-
|
|
376
|
+
}, Fe = async (e, t) => {
|
|
377
|
+
Ne(t);
|
|
378
378
|
for (let n = 1; n <= t.attempts; n += 1) {
|
|
379
|
-
|
|
379
|
+
je(t.signal);
|
|
380
380
|
try {
|
|
381
381
|
return await e(n);
|
|
382
382
|
} catch (e) {
|
|
383
383
|
if (n === t.attempts || t.signal?.aborted === !0 || !t.shouldRetry(e, n)) throw e;
|
|
384
|
-
await
|
|
384
|
+
await Me(Pe(n, t), t.signal);
|
|
385
385
|
}
|
|
386
386
|
}
|
|
387
387
|
throw Error("retryWithBackoff reached an invalid state");
|
|
388
|
-
},
|
|
388
|
+
}, Ie = "GoogleBooks", Le = /* @__PURE__ */ new Set(["books.googleapis.com", "www.googleapis.com"]), Re = /^books\.google\.(?:com|[a-z]{2}|com\.[a-z]{2}|co\.[a-z]{2})$/i, R = (e) => {
|
|
389
389
|
let t = e.trim();
|
|
390
390
|
return /^[a-z0-9_-]+$/i.test(t) ? t : void 0;
|
|
391
|
-
},
|
|
391
|
+
}, ze = (e) => {
|
|
392
392
|
try {
|
|
393
393
|
let t = new URL(e.trim());
|
|
394
394
|
if (t.protocol !== "http:" && t.protocol !== "https:") return;
|
|
395
395
|
let n = t.hostname.toLowerCase();
|
|
396
|
-
if (
|
|
397
|
-
if (
|
|
396
|
+
if (Re.test(n)) return R(t.searchParams.get("id") ?? "");
|
|
397
|
+
if (Le.has(n)) {
|
|
398
398
|
let e = /^\/books\/v1\/volumes\/([^/]+)\/?$/i.exec(t.pathname)?.[1];
|
|
399
|
-
return e === void 0 ? void 0 :
|
|
399
|
+
return e === void 0 ? void 0 : R(decodeURIComponent(e));
|
|
400
400
|
}
|
|
401
401
|
} catch {
|
|
402
402
|
return;
|
|
403
403
|
}
|
|
404
|
-
},
|
|
404
|
+
}, z = (e) => {
|
|
405
405
|
for (let t of e.identifiers ?? []) {
|
|
406
|
-
let e = t.scheme.trim().toLowerCase(), n = e === "googlebooks" ?
|
|
406
|
+
let e = t.scheme.trim().toLowerCase(), n = e === "googlebooks" ? R(t.value) : e === "unknown" || e === "url" || e === "uri" ? ze(t.value) : void 0;
|
|
407
407
|
if (n !== void 0) return {
|
|
408
408
|
id: n,
|
|
409
409
|
identifier: {
|
|
@@ -414,69 +414,69 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
414
414
|
}
|
|
415
415
|
}, B = (e, t) => {
|
|
416
416
|
let n = e[t];
|
|
417
|
-
return
|
|
418
|
-
},
|
|
419
|
-
let t =
|
|
420
|
-
let t =
|
|
421
|
-
return t === void 0 ? [] : [
|
|
422
|
-
type:
|
|
417
|
+
return N(n) ? n : void 0;
|
|
418
|
+
}, Be = (e) => {
|
|
419
|
+
let t = L(e, "industryIdentifiers").flatMap((e) => {
|
|
420
|
+
let t = P(e, "identifier");
|
|
421
|
+
return t === void 0 ? [] : [M({
|
|
422
|
+
type: P(e, "type"),
|
|
423
423
|
identifier: t
|
|
424
424
|
})];
|
|
425
425
|
});
|
|
426
426
|
return t.length > 0 ? t : void 0;
|
|
427
|
-
},
|
|
427
|
+
}, Ve = (e) => {
|
|
428
428
|
let t = B(e, "imageLinks");
|
|
429
429
|
if (t === void 0) return;
|
|
430
|
-
let n =
|
|
431
|
-
smallThumbnail:
|
|
432
|
-
thumbnail:
|
|
433
|
-
small:
|
|
434
|
-
medium:
|
|
435
|
-
large:
|
|
436
|
-
extraLarge:
|
|
430
|
+
let n = M({
|
|
431
|
+
smallThumbnail: P(t, "smallThumbnail"),
|
|
432
|
+
thumbnail: P(t, "thumbnail"),
|
|
433
|
+
small: P(t, "small"),
|
|
434
|
+
medium: P(t, "medium"),
|
|
435
|
+
large: P(t, "large"),
|
|
436
|
+
extraLarge: P(t, "extraLarge")
|
|
437
437
|
});
|
|
438
438
|
return Object.keys(n).length > 0 ? n : void 0;
|
|
439
|
-
},
|
|
439
|
+
}, He = (e) => {
|
|
440
440
|
let t = B(e, "seriesInfo");
|
|
441
441
|
if (t === void 0) return;
|
|
442
|
-
let n =
|
|
442
|
+
let n = P(t, "bookDisplayNumber");
|
|
443
443
|
return n === void 0 ? void 0 : { bookDisplayNumber: n };
|
|
444
|
-
},
|
|
444
|
+
}, Ue = (e) => {
|
|
445
445
|
let t = B(e, "volumeInfo");
|
|
446
446
|
if (t === void 0) return;
|
|
447
|
-
let n =
|
|
448
|
-
title:
|
|
449
|
-
subtitle:
|
|
450
|
-
authors:
|
|
451
|
-
publisher:
|
|
452
|
-
publishedDate:
|
|
453
|
-
description:
|
|
454
|
-
industryIdentifiers:
|
|
455
|
-
pageCount:
|
|
456
|
-
categories:
|
|
457
|
-
language:
|
|
458
|
-
imageLinks:
|
|
459
|
-
infoLink:
|
|
460
|
-
canonicalVolumeLink:
|
|
461
|
-
seriesInfo:
|
|
447
|
+
let n = M({
|
|
448
|
+
title: P(t, "title"),
|
|
449
|
+
subtitle: P(t, "subtitle"),
|
|
450
|
+
authors: I(t, "authors"),
|
|
451
|
+
publisher: P(t, "publisher"),
|
|
452
|
+
publishedDate: P(t, "publishedDate"),
|
|
453
|
+
description: P(t, "description"),
|
|
454
|
+
industryIdentifiers: Be(t),
|
|
455
|
+
pageCount: F(t, "pageCount"),
|
|
456
|
+
categories: I(t, "categories"),
|
|
457
|
+
language: P(t, "language"),
|
|
458
|
+
imageLinks: Ve(t),
|
|
459
|
+
infoLink: P(t, "infoLink"),
|
|
460
|
+
canonicalVolumeLink: P(t, "canonicalVolumeLink"),
|
|
461
|
+
seriesInfo: He(t)
|
|
462
462
|
});
|
|
463
463
|
return Object.keys(n).length > 0 ? n : void 0;
|
|
464
464
|
}, V = (e) => {
|
|
465
|
-
if (!
|
|
466
|
-
let t =
|
|
467
|
-
id:
|
|
468
|
-
volumeInfo:
|
|
465
|
+
if (!N(e)) return;
|
|
466
|
+
let t = M({
|
|
467
|
+
id: P(e, "id"),
|
|
468
|
+
volumeInfo: Ue(e)
|
|
469
469
|
});
|
|
470
470
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
471
|
-
},
|
|
471
|
+
}, We = (e) => N(e) ? L(e, "items").flatMap((e) => {
|
|
472
472
|
let t = V(e);
|
|
473
473
|
return t === void 0 ? [] : [t];
|
|
474
|
-
}) : [],
|
|
474
|
+
}) : [], Ge = 25, Ke = {
|
|
475
475
|
id: "identifiers",
|
|
476
476
|
volumeInfo: "metadata"
|
|
477
|
-
},
|
|
478
|
-
title: "
|
|
479
|
-
subtitle: "
|
|
477
|
+
}, qe = {
|
|
478
|
+
title: "titles",
|
|
479
|
+
subtitle: "titles",
|
|
480
480
|
authors: "contributors",
|
|
481
481
|
publisher: "publication.edition.publisher",
|
|
482
482
|
publishedDate: "publication.edition.date",
|
|
@@ -488,11 +488,11 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
488
488
|
imageLinks: "cover",
|
|
489
489
|
infoLink: "candidate.url",
|
|
490
490
|
canonicalVolumeLink: "candidate.url",
|
|
491
|
-
seriesInfo: "
|
|
492
|
-
}, H = (e) => e.length > 0 ? e : void 0,
|
|
491
|
+
seriesInfo: "titles"
|
|
492
|
+
}, H = (e) => e.length > 0 ? e : void 0, Je = (e) => e === "ISBN_10" || e === "ISBN_13" ? "ISBN" : e ?? "Unknown", Ye = (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)), Xe = (e) => e.map((e) => M({
|
|
493
493
|
value: e.identifier,
|
|
494
|
-
scheme:
|
|
495
|
-
})),
|
|
494
|
+
scheme: Je(e.type)
|
|
495
|
+
})), Ze = (e) => {
|
|
496
496
|
let t = e.title !== void 0 && e.subtitle !== void 0 ? `${e.title}: ${e.subtitle}` : e.title, n = e.seriesInfo?.bookDisplayNumber, r = t !== void 0 && (/\bvol(?:ume)?\.?\s*\S+/i.test(t) || /\b(?:book|part)(?:\s*#\s*|\s+)(?:\d+(?:[.-]\d+)*|[ivxlcdm]+)\b/i.test(t));
|
|
497
497
|
return t === void 0 || n === void 0 || r ? t : `${t} Vol ${n}`;
|
|
498
498
|
}, U = (e) => {
|
|
@@ -502,7 +502,7 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
502
502
|
} catch {
|
|
503
503
|
return;
|
|
504
504
|
}
|
|
505
|
-
},
|
|
505
|
+
}, Qe = (e) => {
|
|
506
506
|
if (e === void 0) return;
|
|
507
507
|
let t = [
|
|
508
508
|
e.extraLarge,
|
|
@@ -516,11 +516,11 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
516
516
|
let t = U(e);
|
|
517
517
|
if (t !== void 0) return t;
|
|
518
518
|
}
|
|
519
|
-
},
|
|
519
|
+
}, $e = (e) => H(e.map((e) => ({
|
|
520
520
|
name: e,
|
|
521
521
|
roles: ["author"]
|
|
522
|
-
}))),
|
|
523
|
-
let
|
|
522
|
+
}))), et = (e, t = {}) => {
|
|
523
|
+
let n = e.volumeInfo ?? {}, i = Xe(n.industryIdentifiers ?? []), a = Ye([
|
|
524
524
|
...t.matchedIdentifier === void 0 ? [] : [t.matchedIdentifier],
|
|
525
525
|
...t.matchedIsbn === void 0 ? [] : [{
|
|
526
526
|
value: t.matchedIsbn,
|
|
@@ -528,33 +528,33 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
528
528
|
}],
|
|
529
529
|
...e.id === void 0 ? [] : [{
|
|
530
530
|
value: e.id,
|
|
531
|
-
scheme:
|
|
531
|
+
scheme: Ie
|
|
532
532
|
}],
|
|
533
533
|
...i
|
|
534
|
-
]), o =
|
|
535
|
-
date: n
|
|
536
|
-
publisher:
|
|
537
|
-
}), s =
|
|
534
|
+
]), o = M({
|
|
535
|
+
date: r(n.publishedDate),
|
|
536
|
+
publisher: n.publisher
|
|
537
|
+
}), s = Qe(n.imageLinks), c = s === void 0 ? void 0 : {
|
|
538
538
|
uri: s,
|
|
539
539
|
confidence: "derived"
|
|
540
|
-
}, l = [...new Set(
|
|
541
|
-
return
|
|
542
|
-
|
|
543
|
-
description:
|
|
540
|
+
}, l = [...new Set(n.categories ?? [])].slice(0, 25), u = Ze(n);
|
|
541
|
+
return M({
|
|
542
|
+
titles: u === void 0 ? void 0 : [{ value: u }],
|
|
543
|
+
description: n.description,
|
|
544
544
|
publication: o.date !== void 0 || o.publisher !== void 0 ? { edition: o } : void 0,
|
|
545
|
-
languages:
|
|
545
|
+
languages: n.language === void 0 ? void 0 : [n.language],
|
|
546
546
|
subjects: H(l),
|
|
547
|
-
contributors:
|
|
548
|
-
numberOfPages:
|
|
547
|
+
contributors: $e(n.authors ?? []),
|
|
548
|
+
numberOfPages: n.pageCount,
|
|
549
549
|
identifiers: a,
|
|
550
550
|
cover: c
|
|
551
551
|
});
|
|
552
|
-
},
|
|
552
|
+
}, tt = (e) => U(e.volumeInfo?.canonicalVolumeLink) ?? U(e.volumeInfo?.infoLink) ?? (e.id === void 0 ? void 0 : `https://books.google.com/books?id=${encodeURIComponent(e.id)}`), nt = 40, rt = 3, it = 1e3, at = 3e3, ot = /* @__PURE__ */ new Set([
|
|
553
553
|
500,
|
|
554
554
|
502,
|
|
555
555
|
503,
|
|
556
556
|
504
|
|
557
|
-
]),
|
|
557
|
+
]), st = (e) => `"${e.replace(/["\\]+/g, " ").replace(/\s+/g, " ").trim()}"`, ct = (e) => {
|
|
558
558
|
let t = e.title?.trim();
|
|
559
559
|
if (t === void 0 || t.length === 0) return;
|
|
560
560
|
let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
|
|
@@ -562,22 +562,22 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
562
562
|
title: t,
|
|
563
563
|
...n === void 0 ? {} : { author: n }
|
|
564
564
|
};
|
|
565
|
-
},
|
|
565
|
+
}, lt = (e) => {
|
|
566
566
|
let t = V(e);
|
|
567
567
|
return t === void 0 ? void 0 : {
|
|
568
568
|
volume: t,
|
|
569
569
|
raw: e
|
|
570
570
|
};
|
|
571
|
-
},
|
|
572
|
-
let t =
|
|
571
|
+
}, ut = (e) => N(e) ? L(e, "items").flatMap((e) => {
|
|
572
|
+
let t = lt(e);
|
|
573
573
|
return t === void 0 ? [] : [t];
|
|
574
574
|
}) : [], W = (e, t = {}) => e.map(({ volume: e, raw: n }) => ({
|
|
575
|
-
metadata:
|
|
575
|
+
metadata: et(e, t),
|
|
576
576
|
id: e.id,
|
|
577
|
-
url:
|
|
577
|
+
url: tt(e),
|
|
578
578
|
raw: n
|
|
579
|
-
})),
|
|
580
|
-
let t = `${e.baseUrl.replace(/\/+$/, "")}/volumes`, n = async (t, n, r = !1) => (t.searchParams.set("key", e.apiKey),
|
|
579
|
+
})), dt = (e) => {
|
|
580
|
+
let t = `${e.baseUrl.replace(/\/+$/, "")}/volumes`, n = async (t, n, r = !1) => (t.searchParams.set("key", e.apiKey), Fe(async () => {
|
|
581
581
|
let i = await e.fetch(t.toString(), {
|
|
582
582
|
signal: n.signal,
|
|
583
583
|
headers: { Accept: "application/json" }
|
|
@@ -587,79 +587,79 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
587
587
|
return i;
|
|
588
588
|
}
|
|
589
589
|
}, {
|
|
590
|
-
attempts:
|
|
591
|
-
initialDelayMs:
|
|
592
|
-
maxDelayMs:
|
|
590
|
+
attempts: rt,
|
|
591
|
+
initialDelayMs: it,
|
|
592
|
+
maxDelayMs: at,
|
|
593
593
|
signal: n.signal,
|
|
594
594
|
shouldRetry: (e) => {
|
|
595
595
|
let t = j(e);
|
|
596
|
-
return t === void 0 ||
|
|
596
|
+
return t === void 0 || ot.has(t);
|
|
597
597
|
}
|
|
598
598
|
})), r = async (e, r) => {
|
|
599
599
|
let i = await n(new URL(`${t}/${encodeURIComponent(e)}`), r, !0);
|
|
600
600
|
if (i === void 0) return;
|
|
601
|
-
let a =
|
|
601
|
+
let a = lt(await i.json());
|
|
602
602
|
if (a?.volume.id !== e) throw Error(`Google Books response did not contain the requested volume ${e}`);
|
|
603
603
|
return a;
|
|
604
604
|
}, i = async (e, r) => {
|
|
605
605
|
if (r.limit <= 0) return [];
|
|
606
606
|
let i = new URL(t);
|
|
607
|
-
i.searchParams.set("q", e), i.searchParams.set("maxResults", String(Math.min(Math.ceil(r.limit),
|
|
607
|
+
i.searchParams.set("q", e), i.searchParams.set("maxResults", String(Math.min(Math.ceil(r.limit), nt))), i.searchParams.set("orderBy", "relevance"), i.searchParams.set("printType", "books");
|
|
608
608
|
let a = await n(i, r);
|
|
609
|
-
return a === void 0 ? [] :
|
|
609
|
+
return a === void 0 ? [] : ut(await a.json());
|
|
610
610
|
};
|
|
611
611
|
return async (e, t) => {
|
|
612
|
-
let n =
|
|
612
|
+
let n = z(e);
|
|
613
613
|
if (n !== void 0) {
|
|
614
614
|
let e = await r(n.id, t);
|
|
615
615
|
if (e !== void 0) return W([e], { matchedIdentifier: n.identifier });
|
|
616
616
|
}
|
|
617
|
-
let a =
|
|
617
|
+
let a = d(e.identifiers);
|
|
618
618
|
if (a !== void 0) {
|
|
619
619
|
let e = await i(`isbn:${a}`, t);
|
|
620
620
|
if (e.length > 0) return W(e, { matchedIsbn: a });
|
|
621
621
|
}
|
|
622
|
-
let o =
|
|
622
|
+
let o = ct(e);
|
|
623
623
|
if (o === void 0) return [];
|
|
624
|
-
let s = `intitle:${
|
|
624
|
+
let s = `intitle:${st(o.title)}`, c = o.author === void 0 ? s : `${s} inauthor:${st(o.author)}`, l = await i(c, t);
|
|
625
625
|
return l.length > 0 || o.author === void 0 ? W(l) : W(await i(s, t));
|
|
626
626
|
};
|
|
627
|
-
},
|
|
627
|
+
}, ft = "googleBooks", pt = "https://www.googleapis.com/books/v1", mt = (e) => {
|
|
628
628
|
let t = e.apiKey.trim();
|
|
629
629
|
if (t.length === 0) throw Error("createGoogleBooksProvider requires a non-empty apiKey");
|
|
630
630
|
return {
|
|
631
|
-
id:
|
|
631
|
+
id: ft,
|
|
632
632
|
name: "Google Books",
|
|
633
|
-
search:
|
|
633
|
+
search: dt({
|
|
634
634
|
apiKey: t,
|
|
635
|
-
baseUrl: e.baseUrl ??
|
|
635
|
+
baseUrl: e.baseUrl ?? pt,
|
|
636
636
|
fetch: e.fetch ?? globalThis.fetch
|
|
637
637
|
})
|
|
638
638
|
};
|
|
639
|
-
},
|
|
639
|
+
}, ht = "ProjectGutenberg", gt = /* @__PURE__ */ new Set(["gutenberg.org", "www.gutenberg.org"]), _t = [
|
|
640
640
|
/^\/ebooks\/(\d+)(?:[./]|$)/i,
|
|
641
641
|
/^\/files\/(\d+)(?:\/|$)/i,
|
|
642
642
|
/^\/cache\/epub\/(\d+)(?:\/|$)/i,
|
|
643
643
|
/^\/(\d+)(?:\/|$)/
|
|
644
|
-
],
|
|
644
|
+
], vt = (e) => {
|
|
645
645
|
let t = e.trim();
|
|
646
646
|
if (!/^\d+$/.test(t)) return;
|
|
647
647
|
let n = t.replace(/^0+(?=\d)/, "");
|
|
648
648
|
return n === "0" ? void 0 : n;
|
|
649
|
-
},
|
|
649
|
+
}, yt = (e) => {
|
|
650
650
|
try {
|
|
651
651
|
let t = new URL(e.trim());
|
|
652
|
-
if (t.protocol !== "http:" && t.protocol !== "https:" || !
|
|
653
|
-
for (let e of
|
|
652
|
+
if (t.protocol !== "http:" && t.protocol !== "https:" || !gt.has(t.hostname.toLowerCase())) return;
|
|
653
|
+
for (let e of _t) {
|
|
654
654
|
let n = e.exec(t.pathname)?.[1];
|
|
655
|
-
if (n !== void 0) return
|
|
655
|
+
if (n !== void 0) return vt(n);
|
|
656
656
|
}
|
|
657
657
|
} catch {
|
|
658
658
|
return;
|
|
659
659
|
}
|
|
660
660
|
}, G = (e) => {
|
|
661
661
|
for (let t of e.identifiers ?? []) {
|
|
662
|
-
let e = t.scheme.trim().toLowerCase(), n = e === "projectgutenberg" ?
|
|
662
|
+
let e = t.scheme.trim().toLowerCase(), n = e === "projectgutenberg" ? vt(t.value) : e === "unknown" || e === "url" || e === "uri" ? yt(t.value) : void 0;
|
|
663
663
|
if (n !== void 0) return {
|
|
664
664
|
id: n,
|
|
665
665
|
identifier: {
|
|
@@ -668,18 +668,18 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
668
668
|
}
|
|
669
669
|
};
|
|
670
670
|
}
|
|
671
|
-
},
|
|
672
|
-
key:
|
|
673
|
-
title:
|
|
674
|
-
subtitle:
|
|
675
|
-
author_name:
|
|
676
|
-
first_publish_year:
|
|
677
|
-
language:
|
|
678
|
-
subject:
|
|
679
|
-
number_of_pages_median:
|
|
680
|
-
cover_i:
|
|
681
|
-
id_project_gutenberg:
|
|
682
|
-
}),
|
|
671
|
+
}, bt = (e) => ({
|
|
672
|
+
key: P(e, "key"),
|
|
673
|
+
title: P(e, "title"),
|
|
674
|
+
subtitle: P(e, "subtitle"),
|
|
675
|
+
author_name: I(e, "author_name"),
|
|
676
|
+
first_publish_year: F(e, "first_publish_year"),
|
|
677
|
+
language: I(e, "language"),
|
|
678
|
+
subject: I(e, "subject"),
|
|
679
|
+
number_of_pages_median: F(e, "number_of_pages_median"),
|
|
680
|
+
cover_i: F(e, "cover_i"),
|
|
681
|
+
id_project_gutenberg: I(e, "id_project_gutenberg")
|
|
682
|
+
}), xt = (e) => N(e) ? L(e, "docs").map(bt) : [], St = {
|
|
683
683
|
afr: "af",
|
|
684
684
|
alb: "sq",
|
|
685
685
|
amh: "am",
|
|
@@ -784,18 +784,18 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
784
784
|
wel: "cy",
|
|
785
785
|
yid: "yi",
|
|
786
786
|
zho: "zh"
|
|
787
|
-
},
|
|
787
|
+
}, Ct = /* @__PURE__ */ new Set([
|
|
788
788
|
"mul",
|
|
789
789
|
"und",
|
|
790
790
|
"zxx",
|
|
791
791
|
"sgn"
|
|
792
|
-
]),
|
|
792
|
+
]), wt = (e) => {
|
|
793
793
|
let t = e.trim().toLowerCase();
|
|
794
|
-
if (t.length !== 0 && !
|
|
795
|
-
},
|
|
794
|
+
if (t.length !== 0 && !Ct.has(t)) return St[t] ?? t;
|
|
795
|
+
}, Tt = 25, Et = {
|
|
796
796
|
key: "identifiers",
|
|
797
|
-
title: "
|
|
798
|
-
subtitle: "
|
|
797
|
+
title: "titles",
|
|
798
|
+
subtitle: "titles",
|
|
799
799
|
author_name: "contributors",
|
|
800
800
|
first_publish_year: "publication.original.date",
|
|
801
801
|
language: "languages",
|
|
@@ -803,8 +803,8 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
803
803
|
number_of_pages_median: "numberOfPages",
|
|
804
804
|
cover_i: "cover",
|
|
805
805
|
id_project_gutenberg: "identifiers"
|
|
806
|
-
},
|
|
807
|
-
let n = e.title !== void 0 && e.subtitle !== void 0 ? `${e.title}: ${e.subtitle}` : e.title, r = K([...new Set((e.language ?? []).map(
|
|
806
|
+
}, Dt = "OpenLibrary", Ot = "ProjectGutenberg", K = (e) => e.length > 0 ? e : void 0, kt = (e, t) => {
|
|
807
|
+
let n = e.title !== void 0 && e.subtitle !== void 0 ? `${e.title}: ${e.subtitle}` : e.title, r = K([...new Set((e.language ?? []).map(wt).filter((e) => e !== void 0))]), i = [
|
|
808
808
|
...t.isbn === void 0 ? [] : [{
|
|
809
809
|
value: t.isbn,
|
|
810
810
|
scheme: "ISBN"
|
|
@@ -812,15 +812,15 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
812
812
|
...t.matchedProjectGutenbergIdentifier === void 0 ? [] : [t.matchedProjectGutenbergIdentifier],
|
|
813
813
|
...(e.id_project_gutenberg ?? []).map((e) => ({
|
|
814
814
|
value: e,
|
|
815
|
-
scheme:
|
|
815
|
+
scheme: Ot
|
|
816
816
|
})),
|
|
817
817
|
...e.key === void 0 ? [] : [{
|
|
818
818
|
value: e.key,
|
|
819
|
-
scheme:
|
|
819
|
+
scheme: Dt
|
|
820
820
|
}]
|
|
821
821
|
];
|
|
822
|
-
return
|
|
823
|
-
|
|
822
|
+
return M({
|
|
823
|
+
titles: n === void 0 ? void 0 : [{ value: n }],
|
|
824
824
|
cover: e.cover_i === void 0 ? void 0 : {
|
|
825
825
|
uri: `${t.coversBaseUrl}/b/id/${e.cover_i}-L.jpg`,
|
|
826
826
|
mediaType: "image/jpeg",
|
|
@@ -836,7 +836,7 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
836
836
|
numberOfPages: e.number_of_pages_median,
|
|
837
837
|
identifiers: K(i)
|
|
838
838
|
});
|
|
839
|
-
},
|
|
839
|
+
}, At = "openLibrary", jt = "https://openlibrary.org", Mt = "https://covers.openlibrary.org", Nt = [
|
|
840
840
|
"key",
|
|
841
841
|
"title",
|
|
842
842
|
"subtitle",
|
|
@@ -847,7 +847,7 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
847
847
|
"number_of_pages_median",
|
|
848
848
|
"cover_i",
|
|
849
849
|
"id_project_gutenberg"
|
|
850
|
-
].join(","),
|
|
850
|
+
].join(","), Pt = (e) => {
|
|
851
851
|
let t = e.title?.trim();
|
|
852
852
|
if (t === void 0 || t.length === 0) return;
|
|
853
853
|
let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
|
|
@@ -855,11 +855,11 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
855
855
|
title: t,
|
|
856
856
|
...n === void 0 ? {} : { author: n }
|
|
857
857
|
};
|
|
858
|
-
},
|
|
859
|
-
let t = e.baseUrl ??
|
|
858
|
+
}, Ft = (e = {}) => {
|
|
859
|
+
let t = e.baseUrl ?? jt, n = e.coversBaseUrl ?? Mt, r = async (n, r) => {
|
|
860
860
|
let i = new URL("/search.json", t);
|
|
861
861
|
for (let [e, t] of Object.entries(n)) i.searchParams.set(e, t);
|
|
862
|
-
i.searchParams.set("fields",
|
|
862
|
+
i.searchParams.set("fields", Nt), i.searchParams.set("limit", String(r.limit));
|
|
863
863
|
let a = await (e.fetch ?? globalThis.fetch)(i.toString(), {
|
|
864
864
|
signal: r.signal,
|
|
865
865
|
headers: {
|
|
@@ -868,9 +868,9 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
868
868
|
}
|
|
869
869
|
});
|
|
870
870
|
if (!a.ok) throw new A(a.status, `Open Library search failed with status ${a.status}`);
|
|
871
|
-
return
|
|
871
|
+
return xt(await a.json());
|
|
872
872
|
}, i = (e, r = {}) => e.map((e) => ({
|
|
873
|
-
metadata:
|
|
873
|
+
metadata: kt(e, {
|
|
874
874
|
coversBaseUrl: n,
|
|
875
875
|
isbn: r.isbn,
|
|
876
876
|
matchedProjectGutenbergIdentifier: r.confirmedProjectGutenberg?.identifier
|
|
@@ -880,10 +880,10 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
880
880
|
raw: e
|
|
881
881
|
}));
|
|
882
882
|
return {
|
|
883
|
-
id:
|
|
883
|
+
id: At,
|
|
884
884
|
name: "Open Library",
|
|
885
885
|
search: async (e, t) => {
|
|
886
|
-
let n =
|
|
886
|
+
let n = d(e.identifiers), a = G(e);
|
|
887
887
|
if (n !== void 0) {
|
|
888
888
|
let e = await r({ isbn: n }, t);
|
|
889
889
|
if (e.length > 0) return i(e, { isbn: n });
|
|
@@ -892,7 +892,7 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
892
892
|
let e = await r({ q: `id_project_gutenberg:${a.id}` }, t);
|
|
893
893
|
if (e.length > 0) return i(e, { confirmedProjectGutenberg: a });
|
|
894
894
|
}
|
|
895
|
-
let o =
|
|
895
|
+
let o = Pt(e);
|
|
896
896
|
if (o === void 0) return [];
|
|
897
897
|
let s = await r(o, t);
|
|
898
898
|
if (s.length > 0) return i(s);
|
|
@@ -900,82 +900,82 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
900
900
|
return i(await r({ q: c }, t));
|
|
901
901
|
}
|
|
902
902
|
};
|
|
903
|
-
}, q = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e,
|
|
903
|
+
}, q = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, J = (e) => e.type === "element", Y = (e, t) => e.children.filter((e) => J(e) && q(e.name).toLowerCase() === t.toLowerCase()), X = (e, t) => Y(e, t)[0], Z = (e) => {
|
|
904
904
|
let t = e?.val.trim();
|
|
905
905
|
return t !== void 0 && t.length > 0 ? t : void 0;
|
|
906
|
-
},
|
|
906
|
+
}, Q = (e, t) => {
|
|
907
907
|
for (let [n, r] of Object.entries(e.attr)) {
|
|
908
908
|
if (q(n).toLowerCase() !== t.toLowerCase()) continue;
|
|
909
909
|
let e = r.trim();
|
|
910
910
|
if (e.length > 0) return e;
|
|
911
911
|
}
|
|
912
|
-
}, It = (e, t) =>
|
|
913
|
-
let t = X(
|
|
912
|
+
}, It = (e, t) => Y(e, t).flatMap((e) => {
|
|
913
|
+
let t = Z(X(X(e, "Description") ?? e, "value"));
|
|
914
914
|
return t === void 0 ? [] : [t];
|
|
915
915
|
}), Lt = (e) => {
|
|
916
|
-
let t =
|
|
916
|
+
let t = Q(e, "about"), n = t === void 0 ? void 0 : /(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];
|
|
917
917
|
if (n === void 0) return;
|
|
918
918
|
let r = n.replace(/^0+(?=\d)/, "");
|
|
919
919
|
return r === "0" ? void 0 : r;
|
|
920
920
|
}, Rt = (e) => {
|
|
921
921
|
let t = [];
|
|
922
922
|
for (let n of e.children) {
|
|
923
|
-
if (!
|
|
923
|
+
if (!J(n)) continue;
|
|
924
924
|
let e = n.name.toLowerCase() === "dcterms:creator", r = n.name.toLowerCase().startsWith("marcrel:");
|
|
925
925
|
if (!e && !r) continue;
|
|
926
|
-
let i = X(
|
|
926
|
+
let i = Z(X(X(n, "agent") ?? n, "name"));
|
|
927
927
|
i !== void 0 && t.push({
|
|
928
928
|
name: i,
|
|
929
929
|
role: e ? "aut" : q(n.name).toLowerCase()
|
|
930
930
|
});
|
|
931
931
|
}
|
|
932
932
|
return t;
|
|
933
|
-
}, zt = (e) =>
|
|
934
|
-
let t =
|
|
933
|
+
}, zt = (e) => Y(e, "subject").flatMap((e) => {
|
|
934
|
+
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"));
|
|
935
935
|
return r !== void 0 && n?.endsWith("/LCSH") === !0 ? [r] : [];
|
|
936
936
|
}), Bt = (e) => {
|
|
937
|
-
let t =
|
|
938
|
-
let t =
|
|
937
|
+
let t = Y(e, "hasFormat").flatMap((e) => {
|
|
938
|
+
let t = X(e, "file");
|
|
939
939
|
if (t === void 0) return [];
|
|
940
|
-
let n =
|
|
940
|
+
let n = Q(t, "about"), r = Y(t, "format").map((e) => Z(X(X(e, "Description") ?? e, "value"))).find((e) => e?.startsWith("image/") === !0);
|
|
941
941
|
return n === void 0 || r === void 0 || !/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n) ? [] : [{
|
|
942
942
|
uri: n,
|
|
943
943
|
mediaType: r
|
|
944
944
|
}];
|
|
945
945
|
});
|
|
946
946
|
return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
|
|
947
|
-
},
|
|
947
|
+
}, $ = (e) => e.length > 0 ? e : void 0, Vt = (e) => {
|
|
948
948
|
let t;
|
|
949
949
|
try {
|
|
950
|
-
t = new
|
|
950
|
+
t = new a(e);
|
|
951
951
|
} catch (e) {
|
|
952
952
|
let t = e instanceof Error ? e.message : String(e);
|
|
953
953
|
throw Error(`Project Gutenberg RDF is malformed: ${t}`, { cause: e });
|
|
954
954
|
}
|
|
955
955
|
if (q(t.name).toLowerCase() !== "rdf") return;
|
|
956
|
-
let n =
|
|
956
|
+
let n = X(t, "ebook");
|
|
957
957
|
if (n === void 0) return;
|
|
958
958
|
let r = Lt(n);
|
|
959
959
|
if (r === void 0) return;
|
|
960
|
-
let
|
|
960
|
+
let i = [...new Set(It(n, "language"))], o = [...new Set(zt(n))], s = [...new Set(It(n, "bookshelf"))], c = Rt(n);
|
|
961
961
|
return {
|
|
962
962
|
id: r,
|
|
963
|
-
title: X(
|
|
964
|
-
publisher: X(
|
|
965
|
-
issued: X(
|
|
966
|
-
originalPublication: X(
|
|
967
|
-
rights: X(
|
|
968
|
-
description: X(
|
|
969
|
-
summary: X(
|
|
970
|
-
languages:
|
|
971
|
-
subjects:
|
|
972
|
-
bookshelves:
|
|
973
|
-
contributors:
|
|
963
|
+
title: Z(X(n, "title")),
|
|
964
|
+
publisher: Z(X(n, "publisher")),
|
|
965
|
+
issued: Z(X(n, "issued")),
|
|
966
|
+
originalPublication: Z(X(n, "marc260")),
|
|
967
|
+
rights: Z(X(n, "rights")),
|
|
968
|
+
description: Z(X(n, "description")),
|
|
969
|
+
summary: Z(X(n, "marc520")),
|
|
970
|
+
languages: $(i),
|
|
971
|
+
subjects: $(o),
|
|
972
|
+
bookshelves: $(s),
|
|
973
|
+
contributors: $(c),
|
|
974
974
|
cover: Bt(n)
|
|
975
975
|
};
|
|
976
976
|
}, Ht = 25, Ut = {
|
|
977
977
|
id: "identifiers",
|
|
978
|
-
title: "
|
|
978
|
+
title: "titles",
|
|
979
979
|
publisher: "publication.edition.publisher",
|
|
980
980
|
issued: "publication.edition.date",
|
|
981
981
|
originalPublication: "publication.original",
|
|
@@ -1016,50 +1016,50 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
1016
1016
|
...r === void 0 ? {} : { month: r },
|
|
1017
1017
|
...i === void 0 ? {} : { day: i }
|
|
1018
1018
|
};
|
|
1019
|
-
},
|
|
1019
|
+
}, qt = (e, t) => e.split("$").slice(1).flatMap((e) => e[0]?.toLowerCase() === t.toLowerCase() ? [e.slice(1).trim()] : []).filter((e) => e.length > 0), Jt = (e) => {
|
|
1020
1020
|
if (e === void 0) return;
|
|
1021
|
-
let t =
|
|
1021
|
+
let t = qt(e, "b"), n = (t.length === 1 ? t[0] : void 0)?.replace(/[\s,;:/]+$/u, "").trim(), r = qt(e, "c"), i = [...new Set(r.flatMap((e) => [...e.matchAll(/\d{4}/g)].flatMap((e) => e[0] === void 0 ? [] : [Number(e[0])])))], a = M({
|
|
1022
1022
|
date: i.length === 1 ? { year: i[0] } : void 0,
|
|
1023
1023
|
publisher: n !== void 0 && n.length > 0 && !/^\[?s\.n\.?\]?$/i.test(n) ? n : void 0
|
|
1024
1024
|
});
|
|
1025
1025
|
return a.date !== void 0 || a.publisher !== void 0 ? a : void 0;
|
|
1026
|
-
},
|
|
1026
|
+
}, Yt = (e, t) => {
|
|
1027
1027
|
try {
|
|
1028
1028
|
let n = new URL(e, t);
|
|
1029
1029
|
return n.protocol === "http:" || n.protocol === "https:" ? n.toString() : void 0;
|
|
1030
1030
|
} catch {
|
|
1031
1031
|
return;
|
|
1032
1032
|
}
|
|
1033
|
-
},
|
|
1033
|
+
}, Xt = (e) => e.length > 0 ? e : void 0, Zt = (e, t) => {
|
|
1034
1034
|
let n = [t.matchedIdentifier, {
|
|
1035
1035
|
value: e.id,
|
|
1036
|
-
scheme:
|
|
1037
|
-
}].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme.trim().toLowerCase() === e.scheme.trim().toLowerCase()) === t), r = [.../* @__PURE__ */ new Set([...e.subjects ?? [], ...e.bookshelves ?? []])].slice(0, 25), i = e.cover === void 0 ? void 0 :
|
|
1036
|
+
scheme: ht
|
|
1037
|
+
}].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme.trim().toLowerCase() === e.scheme.trim().toLowerCase()) === t), r = [.../* @__PURE__ */ new Set([...e.subjects ?? [], ...e.bookshelves ?? []])].slice(0, 25), i = e.cover === void 0 ? void 0 : Yt(e.cover.uri, t.baseUrl), a = i === void 0 ? void 0 : {
|
|
1038
1038
|
uri: i,
|
|
1039
1039
|
mediaType: e.cover?.mediaType,
|
|
1040
1040
|
confidence: "derived"
|
|
1041
|
-
}, o =
|
|
1041
|
+
}, o = M({
|
|
1042
1042
|
date: Kt(e.issued),
|
|
1043
1043
|
publisher: e.publisher
|
|
1044
|
-
}), s =
|
|
1045
|
-
original:
|
|
1044
|
+
}), s = M({
|
|
1045
|
+
original: Jt(e.originalPublication),
|
|
1046
1046
|
edition: o.date !== void 0 || o.publisher !== void 0 ? o : void 0
|
|
1047
1047
|
});
|
|
1048
|
-
return
|
|
1049
|
-
title: e.title,
|
|
1048
|
+
return M({
|
|
1049
|
+
titles: e.title === void 0 ? void 0 : [{ value: e.title }],
|
|
1050
1050
|
publication: s.original !== void 0 || s.edition !== void 0 ? s : void 0,
|
|
1051
1051
|
description: e.summary ?? e.description,
|
|
1052
1052
|
rights: e.rights,
|
|
1053
|
-
languages:
|
|
1054
|
-
subjects:
|
|
1053
|
+
languages: Xt([...new Set(e.languages ?? [])]),
|
|
1054
|
+
subjects: Xt(r),
|
|
1055
1055
|
contributors: Gt(e),
|
|
1056
1056
|
identifiers: n,
|
|
1057
1057
|
cover: a
|
|
1058
1058
|
});
|
|
1059
|
-
},
|
|
1060
|
-
let t = e.baseUrl ??
|
|
1059
|
+
}, Qt = "projectGutenberg", $t = "https://www.gutenberg.org", en = (e = {}) => {
|
|
1060
|
+
let t = e.baseUrl ?? $t;
|
|
1061
1061
|
return {
|
|
1062
|
-
id:
|
|
1062
|
+
id: Qt,
|
|
1063
1063
|
name: "Project Gutenberg",
|
|
1064
1064
|
search: async (n, r) => {
|
|
1065
1065
|
let i = G(n);
|
|
@@ -1080,15 +1080,15 @@ var a = (e, t) => t.has(e.scheme.trim().toLowerCase()), o = (e, t, n) => {
|
|
|
1080
1080
|
id: s.id,
|
|
1081
1081
|
url: c,
|
|
1082
1082
|
raw: s,
|
|
1083
|
-
metadata:
|
|
1083
|
+
metadata: Zt(s, {
|
|
1084
1084
|
baseUrl: t,
|
|
1085
1085
|
matchedIdentifier: i.identifier
|
|
1086
1086
|
})
|
|
1087
1087
|
}];
|
|
1088
1088
|
}
|
|
1089
1089
|
};
|
|
1090
|
-
},
|
|
1090
|
+
}, tn = (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);
|
|
1091
1091
|
//#endregion
|
|
1092
|
-
export {
|
|
1092
|
+
export { Ie as GOOGLE_BOOKS_IDENTIFIER_SCHEME, Ge as GOOGLE_BOOKS_MAX_SUBJECTS, ft as GOOGLE_BOOKS_PROVIDER_ID, de as METADATA_MATCH_WEIGHTS, A as MetadataProviderResponseError, Dt as OPEN_LIBRARY_IDENTIFIER_SCHEME, Tt as OPEN_LIBRARY_MAX_SUBJECTS, At as OPEN_LIBRARY_PROVIDER_ID, ht as PROJECT_GUTENBERG_IDENTIFIER_SCHEME, Ht as PROJECT_GUTENBERG_MAX_SUBJECTS, Qt as PROJECT_GUTENBERG_PROVIDER_ID, mt as createGoogleBooksProvider, Ft as createOpenLibraryProvider, en as createProjectGutenbergProvider, Oe as fetchMetadata, Qe as googleBooksCoverUrl, z as googleBooksLookupFromInput, qe as googleBooksVolumeInfoMetadataHomes, Ke as googleBooksVolumeMetadataHomes, tt as googleBooksVolumeUrl, tn as hasSearchTerms, wt as marcLanguageToBcp47, f as metadataAuthors, ke as metadataInputFromResolvedArchive, v as normalizeForComparison, Et as openLibraryMetadataHomes, V as parseGoogleBooksVolume, We as parseGoogleBooksVolumesResponse, xt as parseOpenLibrarySearchResponse, Vt as parseProjectGutenbergRdf, ue as personNameSimilarity, G as projectGutenbergLookupFromInput, Ut as projectGutenbergMetadataHomes, et as resolveGoogleBooksVolume, kt as resolveOpenLibraryDoc, Zt as resolveProjectGutenbergRecord, j as responseErrorStatus, Fe as retryWithBackoff, k as scoreMetadataCandidate, b as textSimilarity, ce as titleSimilarity, h as toIsbn13 };
|
|
1093
1093
|
|
|
1094
1094
|
//# sourceMappingURL=index.js.map
|