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