@prose-reader/metadata-fetcher 1.349.0 → 1.352.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 +342 -339
- package/dist/index.js.map +1 -1
- package/dist/providers/googleBooks/parse.d.ts +3 -0
- package/dist/providers/openLibrary/parse.d.ts +3 -0
- package/dist/utils/aggregateRating.d.ts +12 -0
- package/package.json +4 -4
- package/dist/utils/identifierValues.d.ts +0 -5
- /package/dist/utils/{identifierValues.test.d.ts → aggregateRating.test.d.ts} +0 -0
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,30 +139,27 @@ 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
|
-
},
|
|
145
|
+
}, oe = (e, t) => {
|
|
155
146
|
let n = A(e.value)?.toLowerCase();
|
|
156
147
|
return n !== void 0 && n === A(t.value)?.toLowerCase();
|
|
157
|
-
}, j = (e) => e.scheme.trim().toLowerCase() === "unknown" ? void 0 : A(e.scheme)?.toLowerCase(),
|
|
158
|
-
|
|
159
|
-
return t === "isbn" || t === "gtin";
|
|
160
|
-
}, me = (e, t) => {
|
|
161
|
-
if (!de(e, t)) return !1;
|
|
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;
|
|
162
150
|
let n = j(e), r = j(t);
|
|
163
151
|
return n === void 0 || r === void 0 || n === r;
|
|
164
|
-
},
|
|
165
|
-
if (!
|
|
152
|
+
}, le = (e, t) => {
|
|
153
|
+
if (!oe(e, t)) return !1;
|
|
166
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
|
-
},
|
|
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) => {
|
|
175
163
|
let r = A(e);
|
|
176
164
|
if (r === void 0) return;
|
|
177
165
|
let i;
|
|
@@ -186,113 +174,113 @@ 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
|
|
232
|
+
let S = A(i.title), C = [r(a), he(a)].flatMap((e) => {
|
|
245
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
|
|
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) => {
|
|
258
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;
|
|
@@ -303,10 +291,10 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
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,7 +316,7 @@ 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({
|
|
@@ -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,33 +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"),
|
|
490
|
+
averageRating: L(t, "averageRating"),
|
|
491
|
+
ratingsCount: L(t, "ratingsCount"),
|
|
502
492
|
language: I(t, "language"),
|
|
503
|
-
imageLinks:
|
|
493
|
+
imageLinks: Le(t),
|
|
504
494
|
infoLink: I(t, "infoLink"),
|
|
505
495
|
canonicalVolumeLink: I(t, "canonicalVolumeLink"),
|
|
506
|
-
seriesInfo:
|
|
496
|
+
seriesInfo: Re(t)
|
|
507
497
|
});
|
|
508
498
|
return Object.keys(n).length > 0 ? n : void 0;
|
|
509
499
|
}, U = (e) => {
|
|
510
500
|
if (!F(e)) return;
|
|
511
501
|
let t = P({
|
|
512
502
|
id: I(e, "id"),
|
|
513
|
-
volumeInfo:
|
|
503
|
+
volumeInfo: ze(e)
|
|
514
504
|
});
|
|
515
505
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
516
|
-
},
|
|
506
|
+
}, Be = (e) => F(e) ? z(e, "items").flatMap((e) => {
|
|
517
507
|
let t = U(e);
|
|
518
508
|
return t === void 0 ? [] : [t];
|
|
519
|
-
}) : [],
|
|
509
|
+
}) : [], Ve = 5, He = (e, t) => {
|
|
510
|
+
if (e === void 0 || e < 0 || e > Ve) return;
|
|
511
|
+
let n = t !== void 0 && Number.isInteger(t) && t >= 0 ? t : void 0;
|
|
512
|
+
if (n !== 0) return P({
|
|
513
|
+
value: e,
|
|
514
|
+
count: n
|
|
515
|
+
});
|
|
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({
|
|
520
517
|
value: e.identifier,
|
|
521
|
-
scheme:
|
|
522
|
-
})),
|
|
518
|
+
scheme: We(e.type)
|
|
519
|
+
})), qe = (e, t) => W([...e === void 0 ? [] : [{ value: e }], ...t === void 0 ? [] : [{
|
|
523
520
|
value: t,
|
|
524
521
|
type: "subtitle"
|
|
525
|
-
}]]),
|
|
522
|
+
}]]), Je = (e) => W((e?.volumeSeries ?? []).flatMap((e) => {
|
|
526
523
|
let t = P({
|
|
527
524
|
identifiers: e.seriesId === void 0 ? void 0 : [{
|
|
528
525
|
value: e.seriesId,
|
|
@@ -538,7 +535,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
538
535
|
} catch {
|
|
539
536
|
return;
|
|
540
537
|
}
|
|
541
|
-
},
|
|
538
|
+
}, Ye = (e) => {
|
|
542
539
|
if (e === void 0) return;
|
|
543
540
|
let t = [
|
|
544
541
|
e.extraLarge,
|
|
@@ -552,11 +549,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
552
549
|
let t = G(e);
|
|
553
550
|
if (t !== void 0) return t;
|
|
554
551
|
}
|
|
555
|
-
},
|
|
552
|
+
}, Xe = (e) => W(e.map((e) => ({
|
|
556
553
|
name: e,
|
|
557
554
|
roles: ["author"]
|
|
558
|
-
}))),
|
|
559
|
-
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([
|
|
560
557
|
...t.matchedIdentifier === void 0 ? [] : [t.matchedIdentifier],
|
|
561
558
|
...t.matchedIsbn === void 0 ? [] : [{
|
|
562
559
|
value: t.matchedIsbn,
|
|
@@ -566,32 +563,33 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
566
563
|
value: n,
|
|
567
564
|
scheme: B
|
|
568
565
|
}],
|
|
569
|
-
...
|
|
570
|
-
]),
|
|
571
|
-
date:
|
|
566
|
+
...C
|
|
567
|
+
]), T = P({
|
|
568
|
+
date: a(u),
|
|
572
569
|
publisher: l
|
|
573
|
-
}),
|
|
574
|
-
uri:
|
|
570
|
+
}), E = Ye(v), D = E === void 0 ? void 0 : {
|
|
571
|
+
uri: E,
|
|
575
572
|
confidence: "derived"
|
|
576
|
-
},
|
|
573
|
+
}, O = [...new Set(m ?? [])].slice(0, 25), k = Je(y);
|
|
577
574
|
return P({
|
|
578
|
-
titles:
|
|
575
|
+
titles: qe(o, s),
|
|
579
576
|
description: d,
|
|
580
|
-
belongsTo:
|
|
581
|
-
publication:
|
|
582
|
-
languages:
|
|
583
|
-
subjects: W(
|
|
584
|
-
contributors:
|
|
577
|
+
belongsTo: k === void 0 ? void 0 : { series: k },
|
|
578
|
+
publication: T.date !== void 0 || T.publisher !== void 0 ? { edition: T } : void 0,
|
|
579
|
+
languages: _ === void 0 ? void 0 : [_],
|
|
580
|
+
subjects: W(O),
|
|
581
|
+
contributors: Xe(c ?? []),
|
|
585
582
|
numberOfPages: p,
|
|
586
|
-
|
|
587
|
-
|
|
583
|
+
aggregateRating: He(h, g),
|
|
584
|
+
identifiers: w,
|
|
585
|
+
cover: D
|
|
588
586
|
});
|
|
589
|
-
},
|
|
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([
|
|
590
588
|
500,
|
|
591
589
|
502,
|
|
592
590
|
503,
|
|
593
591
|
504
|
|
594
|
-
]),
|
|
592
|
+
]), it = (e) => `"${e.replace(/["\\]+/g, " ").replace(/\s+/g, " ").trim()}"`, at = (e) => {
|
|
595
593
|
let t = e.title?.trim();
|
|
596
594
|
if (t === void 0 || t.length === 0) return;
|
|
597
595
|
let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
|
|
@@ -599,22 +597,22 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
599
597
|
title: t,
|
|
600
598
|
...n === void 0 ? {} : { author: n }
|
|
601
599
|
};
|
|
602
|
-
},
|
|
600
|
+
}, ot = (e) => {
|
|
603
601
|
let t = U(e);
|
|
604
602
|
return t === void 0 ? void 0 : {
|
|
605
603
|
volume: t,
|
|
606
604
|
raw: e
|
|
607
605
|
};
|
|
608
|
-
},
|
|
609
|
-
let t =
|
|
606
|
+
}, st = (e) => F(e) ? z(e, "items").flatMap((e) => {
|
|
607
|
+
let t = ot(e);
|
|
610
608
|
return t === void 0 ? [] : [t];
|
|
611
609
|
}) : [], K = (e, t = {}) => e.map(({ volume: e, raw: n }) => ({
|
|
612
|
-
metadata:
|
|
610
|
+
metadata: Ze(e, t),
|
|
613
611
|
id: e.id,
|
|
614
|
-
url:
|
|
612
|
+
url: Qe(e),
|
|
615
613
|
raw: n
|
|
616
|
-
})),
|
|
617
|
-
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 () => {
|
|
618
616
|
let i = await e.fetch(t.toString(), {
|
|
619
617
|
signal: n.signal,
|
|
620
618
|
headers: { Accept: "application/json" }
|
|
@@ -624,79 +622,79 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
624
622
|
return i;
|
|
625
623
|
}
|
|
626
624
|
}, {
|
|
627
|
-
attempts:
|
|
628
|
-
initialDelayMs:
|
|
629
|
-
maxDelayMs:
|
|
625
|
+
attempts: et,
|
|
626
|
+
initialDelayMs: tt,
|
|
627
|
+
maxDelayMs: nt,
|
|
630
628
|
signal: n.signal,
|
|
631
629
|
shouldRetry: (e) => {
|
|
632
630
|
let t = N(e);
|
|
633
|
-
return t === void 0 ||
|
|
631
|
+
return t === void 0 || rt.has(t);
|
|
634
632
|
}
|
|
635
|
-
})),
|
|
636
|
-
let i = await
|
|
633
|
+
})), i = async (e, n) => {
|
|
634
|
+
let i = await r(new URL(`${t}/${encodeURIComponent(e)}`), n, !0);
|
|
637
635
|
if (i === void 0) return;
|
|
638
|
-
let a =
|
|
636
|
+
let a = ot(await i.json());
|
|
639
637
|
if (a?.volume.id !== e) throw Error(`Google Books response did not contain the requested volume ${e}`);
|
|
640
638
|
return a;
|
|
641
|
-
},
|
|
642
|
-
if (
|
|
639
|
+
}, a = async (e, n) => {
|
|
640
|
+
if (n.limit <= 0) return [];
|
|
643
641
|
let i = new URL(t);
|
|
644
|
-
i.searchParams.set("q", e), i.searchParams.set("maxResults", String(Math.min(Math.ceil(
|
|
645
|
-
let a = await
|
|
646
|
-
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());
|
|
647
645
|
};
|
|
648
646
|
return async (e, t) => {
|
|
649
|
-
let
|
|
650
|
-
if (
|
|
651
|
-
let e = await r
|
|
652
|
-
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 });
|
|
653
651
|
}
|
|
654
|
-
let
|
|
655
|
-
if (
|
|
656
|
-
let e = await
|
|
657
|
-
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 });
|
|
658
656
|
}
|
|
659
|
-
let
|
|
660
|
-
if (
|
|
661
|
-
let
|
|
662
|
-
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));
|
|
663
661
|
};
|
|
664
|
-
},
|
|
662
|
+
}, lt = "googleBooks", ut = "https://www.googleapis.com/books/v1", dt = (e) => {
|
|
665
663
|
let t = e.apiKey.trim();
|
|
666
664
|
if (t.length === 0) throw Error("createGoogleBooksProvider requires a non-empty apiKey");
|
|
667
665
|
return {
|
|
668
|
-
id:
|
|
666
|
+
id: lt,
|
|
669
667
|
name: "Google Books",
|
|
670
|
-
search:
|
|
668
|
+
search: ct({
|
|
671
669
|
apiKey: t,
|
|
672
|
-
baseUrl: e.baseUrl ??
|
|
670
|
+
baseUrl: e.baseUrl ?? ut,
|
|
673
671
|
fetch: e.fetch ?? globalThis.fetch
|
|
674
672
|
})
|
|
675
673
|
};
|
|
676
|
-
},
|
|
674
|
+
}, ft = "ProjectGutenberg", pt = /* @__PURE__ */ new Set(["gutenberg.org", "www.gutenberg.org"]), mt = [
|
|
677
675
|
/^\/ebooks\/(\d+)(?:[./]|$)/i,
|
|
678
676
|
/^\/files\/(\d+)(?:\/|$)/i,
|
|
679
677
|
/^\/cache\/epub\/(\d+)(?:\/|$)/i,
|
|
680
678
|
/^\/(\d+)(?:\/|$)/
|
|
681
|
-
],
|
|
679
|
+
], ht = (e) => {
|
|
682
680
|
let t = e.trim();
|
|
683
681
|
if (!/^\d+$/.test(t)) return;
|
|
684
682
|
let n = t.replace(/^0+(?=\d)/, "");
|
|
685
683
|
return n === "0" ? void 0 : n;
|
|
686
|
-
},
|
|
684
|
+
}, gt = (e) => {
|
|
687
685
|
try {
|
|
688
686
|
let t = new URL(e.trim());
|
|
689
|
-
if (t.protocol !== "http:" && t.protocol !== "https:" || !
|
|
690
|
-
for (let e of
|
|
687
|
+
if (t.protocol !== "http:" && t.protocol !== "https:" || !pt.has(t.hostname.toLowerCase())) return;
|
|
688
|
+
for (let e of mt) {
|
|
691
689
|
let n = e.exec(t.pathname)?.[1];
|
|
692
|
-
if (n !== void 0) return
|
|
690
|
+
if (n !== void 0) return ht(n);
|
|
693
691
|
}
|
|
694
692
|
} catch {
|
|
695
693
|
return;
|
|
696
694
|
}
|
|
697
|
-
},
|
|
695
|
+
}, _t = (e) => {
|
|
698
696
|
for (let t of e.identifiers ?? []) {
|
|
699
|
-
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;
|
|
700
698
|
if (n !== void 0) return {
|
|
701
699
|
id: n,
|
|
702
700
|
identifier: {
|
|
@@ -705,7 +703,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
705
703
|
}
|
|
706
704
|
};
|
|
707
705
|
}
|
|
708
|
-
},
|
|
706
|
+
}, vt = (e) => ({
|
|
709
707
|
key: I(e, "key"),
|
|
710
708
|
title: I(e, "title"),
|
|
711
709
|
subtitle: I(e, "subtitle"),
|
|
@@ -714,9 +712,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
714
712
|
language: R(e, "language"),
|
|
715
713
|
subject: R(e, "subject"),
|
|
716
714
|
number_of_pages_median: L(e, "number_of_pages_median"),
|
|
715
|
+
ratings_average: L(e, "ratings_average"),
|
|
716
|
+
ratings_count: L(e, "ratings_count"),
|
|
717
717
|
cover_i: L(e, "cover_i"),
|
|
718
718
|
id_project_gutenberg: R(e, "id_project_gutenberg")
|
|
719
|
-
}),
|
|
719
|
+
}), yt = (e) => F(e) ? z(e, "docs").map(vt) : [], bt = {
|
|
720
720
|
afr: "af",
|
|
721
721
|
alb: "sq",
|
|
722
722
|
amh: "am",
|
|
@@ -821,51 +821,52 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
821
821
|
wel: "cy",
|
|
822
822
|
yid: "yi",
|
|
823
823
|
zho: "zh"
|
|
824
|
-
},
|
|
824
|
+
}, xt = /* @__PURE__ */ new Set([
|
|
825
825
|
"mul",
|
|
826
826
|
"und",
|
|
827
827
|
"zxx",
|
|
828
828
|
"sgn"
|
|
829
|
-
]),
|
|
829
|
+
]), St = (e) => {
|
|
830
830
|
let t = e.trim().toLowerCase();
|
|
831
|
-
if (t.length !== 0 && !
|
|
832
|
-
},
|
|
833
|
-
let { title: n, subtitle: r, language: i, key: a, author_name: o, first_publish_year: s, subject: c, number_of_pages_median: l,
|
|
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 ? [] : [{
|
|
834
834
|
value: r,
|
|
835
835
|
type: "subtitle"
|
|
836
|
-
}]]),
|
|
836
|
+
}]]), g = q([...new Set((i ?? []).map(St).filter((e) => e !== void 0))]), _ = [
|
|
837
837
|
...t.isbn === void 0 ? [] : [{
|
|
838
838
|
value: t.isbn,
|
|
839
839
|
scheme: "ISBN"
|
|
840
840
|
}],
|
|
841
841
|
...t.matchedProjectGutenbergIdentifier === void 0 ? [] : [t.matchedProjectGutenbergIdentifier],
|
|
842
|
-
...(
|
|
842
|
+
...(p ?? []).map((e) => ({
|
|
843
843
|
value: e,
|
|
844
|
-
scheme:
|
|
844
|
+
scheme: Tt
|
|
845
845
|
})),
|
|
846
846
|
...a === void 0 ? [] : [{
|
|
847
847
|
value: a,
|
|
848
|
-
scheme:
|
|
848
|
+
scheme: wt
|
|
849
849
|
}]
|
|
850
850
|
];
|
|
851
851
|
return P({
|
|
852
|
-
titles:
|
|
853
|
-
cover:
|
|
854
|
-
uri: `${t.coversBaseUrl}/b/id/${
|
|
852
|
+
titles: h,
|
|
853
|
+
cover: f === void 0 ? void 0 : {
|
|
854
|
+
uri: `${t.coversBaseUrl}/b/id/${f}-L.jpg`,
|
|
855
855
|
mediaType: "image/jpeg",
|
|
856
856
|
confidence: "derived"
|
|
857
857
|
},
|
|
858
858
|
publication: s === void 0 ? void 0 : { original: { date: { year: s } } },
|
|
859
|
-
languages:
|
|
860
|
-
subjects:
|
|
861
|
-
contributors:
|
|
859
|
+
languages: g,
|
|
860
|
+
subjects: q((c ?? []).slice(0, 25)),
|
|
861
|
+
contributors: q((o ?? []).map((e) => ({
|
|
862
862
|
name: e,
|
|
863
863
|
roles: ["author"]
|
|
864
864
|
}))),
|
|
865
865
|
numberOfPages: l,
|
|
866
|
-
|
|
866
|
+
aggregateRating: He(u, d),
|
|
867
|
+
identifiers: q(_)
|
|
867
868
|
});
|
|
868
|
-
},
|
|
869
|
+
}, Dt = "openLibrary", Ot = "https://openlibrary.org", kt = "https://covers.openlibrary.org", At = [
|
|
869
870
|
"key",
|
|
870
871
|
"title",
|
|
871
872
|
"subtitle",
|
|
@@ -874,9 +875,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
874
875
|
"language",
|
|
875
876
|
"subject",
|
|
876
877
|
"number_of_pages_median",
|
|
878
|
+
"ratings_average",
|
|
879
|
+
"ratings_count",
|
|
877
880
|
"cover_i",
|
|
878
881
|
"id_project_gutenberg"
|
|
879
|
-
].join(","),
|
|
882
|
+
].join(","), jt = (e) => {
|
|
880
883
|
let t = e.title?.trim();
|
|
881
884
|
if (t === void 0 || t.length === 0) return;
|
|
882
885
|
let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
|
|
@@ -884,11 +887,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
884
887
|
title: t,
|
|
885
888
|
...n === void 0 ? {} : { author: n }
|
|
886
889
|
};
|
|
887
|
-
},
|
|
888
|
-
let t = e.baseUrl ??
|
|
890
|
+
}, Mt = (e = {}) => {
|
|
891
|
+
let t = e.baseUrl ?? Ot, r = e.coversBaseUrl ?? kt, i = async (n, r) => {
|
|
889
892
|
let i = new URL("/search.json", t);
|
|
890
893
|
for (let [e, t] of Object.entries(n)) i.searchParams.set(e, t);
|
|
891
|
-
i.searchParams.set("fields",
|
|
894
|
+
i.searchParams.set("fields", At), i.searchParams.set("limit", String(r.limit));
|
|
892
895
|
let a = await (e.fetch ?? globalThis.fetch)(i.toString(), {
|
|
893
896
|
signal: r.signal,
|
|
894
897
|
headers: {
|
|
@@ -897,112 +900,112 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
897
900
|
}
|
|
898
901
|
});
|
|
899
902
|
if (!a.ok) throw new M(a.status, `Open Library search failed with status ${a.status}`);
|
|
900
|
-
return
|
|
901
|
-
},
|
|
902
|
-
metadata:
|
|
903
|
-
coversBaseUrl:
|
|
904
|
-
isbn:
|
|
905
|
-
matchedProjectGutenbergIdentifier:
|
|
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
|
|
906
909
|
}),
|
|
907
910
|
id: e.key,
|
|
908
911
|
url: e.key === void 0 ? void 0 : `${t}${e.key}`,
|
|
909
912
|
raw: e
|
|
910
913
|
}));
|
|
911
914
|
return {
|
|
912
|
-
id:
|
|
915
|
+
id: Dt,
|
|
913
916
|
name: "Open Library",
|
|
914
917
|
search: async (e, t) => {
|
|
915
|
-
let
|
|
916
|
-
if (
|
|
917
|
-
let e = await
|
|
918
|
-
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 });
|
|
919
922
|
}
|
|
920
|
-
if (
|
|
921
|
-
let e = await
|
|
922
|
-
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 });
|
|
923
926
|
}
|
|
924
|
-
let
|
|
925
|
-
if (
|
|
926
|
-
let
|
|
927
|
-
if (
|
|
928
|
-
let
|
|
929
|
-
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));
|
|
930
933
|
}
|
|
931
934
|
};
|
|
932
|
-
},
|
|
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) => {
|
|
933
936
|
let t = e?.val.trim();
|
|
934
937
|
return t !== void 0 && t.length > 0 ? t : void 0;
|
|
935
|
-
},
|
|
938
|
+
}, Q = (e, t) => {
|
|
936
939
|
for (let [n, r] of Object.entries(e.attr)) {
|
|
937
|
-
if (
|
|
940
|
+
if (J(n).toLowerCase() !== t.toLowerCase()) continue;
|
|
938
941
|
let e = r.trim();
|
|
939
942
|
if (e.length > 0) return e;
|
|
940
943
|
}
|
|
941
|
-
},
|
|
942
|
-
let t =
|
|
944
|
+
}, Pt = (e, t) => Y(e, t).flatMap((e) => {
|
|
945
|
+
let t = Z(X(X(e, "Description") ?? e, "value"));
|
|
943
946
|
return t === void 0 ? [] : [t];
|
|
944
|
-
}),
|
|
945
|
-
let t =
|
|
947
|
+
}), Ft = (e) => {
|
|
948
|
+
let t = Q(e, "about"), n = t === void 0 ? void 0 : /(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];
|
|
946
949
|
if (n === void 0) return;
|
|
947
950
|
let r = n.replace(/^0+(?=\d)/, "");
|
|
948
951
|
return r === "0" ? void 0 : r;
|
|
949
|
-
},
|
|
952
|
+
}, It = (e) => {
|
|
950
953
|
let t = [];
|
|
951
954
|
for (let n of e.children) {
|
|
952
|
-
if (!
|
|
955
|
+
if (!Nt(n)) continue;
|
|
953
956
|
let e = n.name.toLowerCase() === "dcterms:creator", r = n.name.toLowerCase().startsWith("marcrel:");
|
|
954
957
|
if (!e && !r) continue;
|
|
955
|
-
let i =
|
|
958
|
+
let i = Z(X(X(n, "agent") ?? n, "name"));
|
|
956
959
|
i !== void 0 && t.push({
|
|
957
960
|
name: i,
|
|
958
|
-
role: e ? "aut" :
|
|
961
|
+
role: e ? "aut" : J(n.name).toLowerCase()
|
|
959
962
|
});
|
|
960
963
|
}
|
|
961
964
|
return t;
|
|
962
|
-
},
|
|
963
|
-
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"));
|
|
964
967
|
return r !== void 0 && n?.endsWith("/LCSH") === !0 ? [r] : [];
|
|
965
|
-
}),
|
|
966
|
-
let t =
|
|
967
|
-
let t =
|
|
968
|
+
}), Rt = (e) => {
|
|
969
|
+
let t = Y(e, "hasFormat").flatMap((e) => {
|
|
970
|
+
let t = X(e, "file");
|
|
968
971
|
if (t === void 0) return [];
|
|
969
|
-
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);
|
|
970
973
|
return n === void 0 || r === void 0 || !/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n) ? [] : [{
|
|
971
974
|
uri: n,
|
|
972
975
|
mediaType: r
|
|
973
976
|
}];
|
|
974
977
|
});
|
|
975
978
|
return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
|
|
976
|
-
}, $ = (e) => e.length > 0 ? e : void 0,
|
|
979
|
+
}, $ = (e) => e.length > 0 ? e : void 0, zt = (e) => {
|
|
977
980
|
let t;
|
|
978
981
|
try {
|
|
979
|
-
t = new
|
|
982
|
+
t = new s(e);
|
|
980
983
|
} catch (e) {
|
|
981
984
|
let t = e instanceof Error ? e.message : String(e);
|
|
982
985
|
throw Error(`Project Gutenberg RDF is malformed: ${t}`, { cause: e });
|
|
983
986
|
}
|
|
984
|
-
if (
|
|
985
|
-
let n =
|
|
987
|
+
if (J(t.name).toLowerCase() !== "rdf") return;
|
|
988
|
+
let n = X(t, "ebook");
|
|
986
989
|
if (n === void 0) return;
|
|
987
|
-
let r =
|
|
990
|
+
let r = Ft(n);
|
|
988
991
|
if (r === void 0) return;
|
|
989
|
-
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);
|
|
990
993
|
return {
|
|
991
994
|
id: r,
|
|
992
|
-
title:
|
|
993
|
-
publisher:
|
|
994
|
-
issued:
|
|
995
|
-
originalPublication:
|
|
996
|
-
rights:
|
|
997
|
-
description:
|
|
998
|
-
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")),
|
|
999
1002
|
languages: $(i),
|
|
1000
|
-
subjects: $(
|
|
1001
|
-
bookshelves: $(
|
|
1003
|
+
subjects: $(a),
|
|
1004
|
+
bookshelves: $(o),
|
|
1002
1005
|
contributors: $(c),
|
|
1003
|
-
cover:
|
|
1006
|
+
cover: Rt(n)
|
|
1004
1007
|
};
|
|
1005
|
-
},
|
|
1008
|
+
}, Bt = 25, Vt = {
|
|
1006
1009
|
art: "artist",
|
|
1007
1010
|
aut: "author",
|
|
1008
1011
|
clr: "colorist",
|
|
@@ -1011,17 +1014,17 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1011
1014
|
ill: "illustrator",
|
|
1012
1015
|
nrt: "narrator",
|
|
1013
1016
|
trl: "translator"
|
|
1014
|
-
},
|
|
1017
|
+
}, Ht = (e) => {
|
|
1015
1018
|
let t = /* @__PURE__ */ new Map();
|
|
1016
1019
|
for (let n of e.contributors ?? []) {
|
|
1017
|
-
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);
|
|
1018
1021
|
i === void 0 ? t.set(e, {
|
|
1019
1022
|
name: n.name,
|
|
1020
1023
|
roles: [r]
|
|
1021
1024
|
}) : i.roles.includes(r) || i.roles.push(r);
|
|
1022
1025
|
}
|
|
1023
1026
|
return t.size > 0 ? [...t.values()] : void 0;
|
|
1024
|
-
},
|
|
1027
|
+
}, Ut = (e) => {
|
|
1025
1028
|
if (e === void 0) return;
|
|
1026
1029
|
let t = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());
|
|
1027
1030
|
if (t === null) return;
|
|
@@ -1031,33 +1034,33 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1031
1034
|
...r === void 0 ? {} : { month: r },
|
|
1032
1035
|
...i === void 0 ? {} : { day: i }
|
|
1033
1036
|
};
|
|
1034
|
-
},
|
|
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) => {
|
|
1035
1038
|
if (e === void 0) return;
|
|
1036
|
-
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({
|
|
1037
1040
|
date: i.length === 1 ? { year: i[0] } : void 0,
|
|
1038
1041
|
publisher: n !== void 0 && n.length > 0 && !/^\[?s\.n\.?\]?$/i.test(n) ? n : void 0
|
|
1039
1042
|
});
|
|
1040
1043
|
return a.date !== void 0 || a.publisher !== void 0 ? a : void 0;
|
|
1041
|
-
},
|
|
1044
|
+
}, Kt = (e, t) => {
|
|
1042
1045
|
try {
|
|
1043
1046
|
let n = new URL(e, t);
|
|
1044
1047
|
return n.protocol === "http:" || n.protocol === "https:" ? n.toString() : void 0;
|
|
1045
1048
|
} catch {
|
|
1046
1049
|
return;
|
|
1047
1050
|
}
|
|
1048
|
-
},
|
|
1051
|
+
}, qt = (e) => e.length > 0 ? e : void 0, Jt = (e, t) => {
|
|
1049
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, {
|
|
1050
1053
|
value: n,
|
|
1051
|
-
scheme:
|
|
1052
|
-
}].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 : {
|
|
1053
1056
|
uri: v,
|
|
1054
1057
|
mediaType: m?.mediaType,
|
|
1055
1058
|
confidence: "derived"
|
|
1056
1059
|
}, b = P({
|
|
1057
|
-
date:
|
|
1060
|
+
date: Ut(a),
|
|
1058
1061
|
publisher: i
|
|
1059
1062
|
}), x = P({
|
|
1060
|
-
original:
|
|
1063
|
+
original: Gt(o),
|
|
1061
1064
|
edition: b.date !== void 0 || b.publisher !== void 0 ? b : void 0
|
|
1062
1065
|
});
|
|
1063
1066
|
return P({
|
|
@@ -1065,19 +1068,19 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1065
1068
|
publication: x.original !== void 0 || x.edition !== void 0 ? x : void 0,
|
|
1066
1069
|
description: l ?? c,
|
|
1067
1070
|
rights: s,
|
|
1068
|
-
languages:
|
|
1069
|
-
subjects:
|
|
1070
|
-
contributors:
|
|
1071
|
+
languages: qt([...new Set(u ?? [])]),
|
|
1072
|
+
subjects: qt(_),
|
|
1073
|
+
contributors: Ht(e),
|
|
1071
1074
|
identifiers: g,
|
|
1072
1075
|
cover: y
|
|
1073
1076
|
});
|
|
1074
|
-
},
|
|
1075
|
-
let t = e.baseUrl ??
|
|
1077
|
+
}, Yt = "projectGutenberg", Xt = "https://www.gutenberg.org", Zt = (e = {}) => {
|
|
1078
|
+
let t = e.baseUrl ?? Xt;
|
|
1076
1079
|
return {
|
|
1077
|
-
id:
|
|
1080
|
+
id: Yt,
|
|
1078
1081
|
name: "Project Gutenberg",
|
|
1079
1082
|
search: async (n, r) => {
|
|
1080
|
-
let i =
|
|
1083
|
+
let i = _t(n);
|
|
1081
1084
|
if (i === void 0) return [];
|
|
1082
1085
|
let a = new URL(`/cache/epub/${i.id}/pg${i.id}.rdf`, t), o = await (e.fetch ?? globalThis.fetch)(a.toString(), {
|
|
1083
1086
|
signal: r.signal,
|
|
@@ -1088,22 +1091,22 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1088
1091
|
});
|
|
1089
1092
|
if (o.status === 404) return [];
|
|
1090
1093
|
if (!o.ok) throw new M(o.status, `Project Gutenberg metadata lookup failed with status ${o.status}`);
|
|
1091
|
-
let s =
|
|
1094
|
+
let s = zt(await o.text());
|
|
1092
1095
|
if (s === void 0 || s.id !== i.id) throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);
|
|
1093
1096
|
let c = new URL(`/ebooks/${i.id}`, t).toString();
|
|
1094
1097
|
return [{
|
|
1095
1098
|
id: s.id,
|
|
1096
1099
|
url: c,
|
|
1097
1100
|
raw: s,
|
|
1098
|
-
metadata:
|
|
1101
|
+
metadata: Jt(s, {
|
|
1099
1102
|
baseUrl: t,
|
|
1100
1103
|
matchedIdentifier: i.identifier
|
|
1101
1104
|
})
|
|
1102
1105
|
}];
|
|
1103
1106
|
}
|
|
1104
1107
|
};
|
|
1105
|
-
},
|
|
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);
|
|
1106
1109
|
//#endregion
|
|
1107
|
-
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 };
|
|
1108
1111
|
|
|
1109
1112
|
//# sourceMappingURL=index.js.map
|