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