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