@prose-reader/metadata-fetcher 1.349.0 → 1.350.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 +188 -173
- package/dist/index.js.map +1 -1
- package/dist/providers/googleBooks/parse.d.ts +3 -0
- package/dist/providers/openLibrary/parse.d.ts +3 -0
- package/dist/utils/aggregateRating.d.ts +12 -0
- package/dist/utils/aggregateRating.test.d.ts +1 -0
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -86,7 +86,7 @@ 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
|
+
}, k = (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()) {
|
|
@@ -95,49 +95,49 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
95
95
|
e < n ? t -= e : (t += e, n = e);
|
|
96
96
|
}
|
|
97
97
|
return t > 0 ? t : void 0;
|
|
98
|
-
},
|
|
98
|
+
}, ee = (e) => /^\d+$/.test(e) ? Number.parseInt(e, 10) : D[e] ?? k(e), te = (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
|
+
}, A = (e) => {
|
|
103
103
|
let t = /* @__PURE__ */ new Map();
|
|
104
104
|
for (let n of y(e).matchAll(E)) {
|
|
105
|
-
let e = n[1] === void 0 ? void 0 :
|
|
105
|
+
let e = n[1] === void 0 ? void 0 : te(n[1]), r = n[2] === void 0 ? void 0 : ee(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 =
|
|
111
|
+
}, ne = (e, t) => {
|
|
112
|
+
let n = A(e), r = A(t);
|
|
113
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
|
-
},
|
|
118
|
+
}, re = (e) => {
|
|
119
119
|
let t = /* @__PURE__ */ new Set();
|
|
120
|
-
for (let n of
|
|
120
|
+
for (let n of A(e).values()) for (let e of n) t.add(e);
|
|
121
121
|
return t;
|
|
122
|
-
},
|
|
123
|
-
if (
|
|
122
|
+
}, ie = (e, t) => {
|
|
123
|
+
if (ne(e, t)) return 0;
|
|
124
124
|
let n = x(e, t), r = C(e), i = C(t);
|
|
125
125
|
return r.hasSubtitle === i.hasSubtitle ? n : Math.max(n, x(r.main, i.main) * w);
|
|
126
|
-
},
|
|
126
|
+
}, ae = (e, t) => {
|
|
127
127
|
let n;
|
|
128
128
|
for (let r of t) {
|
|
129
|
-
if (
|
|
129
|
+
if (ne(e, r)) return {
|
|
130
130
|
score: 0,
|
|
131
131
|
candidate: r
|
|
132
132
|
};
|
|
133
|
-
let t =
|
|
133
|
+
let t = ie(e, r);
|
|
134
134
|
(n === void 0 || t > n.score) && (n = {
|
|
135
135
|
score: t,
|
|
136
136
|
candidate: r
|
|
137
137
|
});
|
|
138
138
|
}
|
|
139
139
|
return n;
|
|
140
|
-
},
|
|
140
|
+
}, oe = (e) => y(e).split(" ").filter((e) => e.length > 0).sort().join(" "), se = (e, t) => x(oe(e), oe(t)), ce = {
|
|
141
141
|
isbn: 1,
|
|
142
142
|
gtin: 1,
|
|
143
143
|
identifiers: .6,
|
|
@@ -148,35 +148,35 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
148
148
|
publisher: .15,
|
|
149
149
|
languages: .15,
|
|
150
150
|
numberOfPages: .15
|
|
151
|
-
},
|
|
151
|
+
}, le = /* @__PURE__ */ new Set(["isbn", "gtin"]), j = (e) => {
|
|
152
152
|
let t = e?.trim();
|
|
153
153
|
return t !== void 0 && t.length > 0 ? t : void 0;
|
|
154
|
-
},
|
|
155
|
-
let n =
|
|
156
|
-
return n !== void 0 && n ===
|
|
157
|
-
},
|
|
154
|
+
}, ue = (e, t) => {
|
|
155
|
+
let n = j(e.value)?.toLowerCase();
|
|
156
|
+
return n !== void 0 && n === j(t.value)?.toLowerCase();
|
|
157
|
+
}, M = (e) => e.scheme.trim().toLowerCase() === "unknown" ? void 0 : j(e.scheme)?.toLowerCase(), de = (e) => `${e.scheme}:${e.value}`, fe = (e) => {
|
|
158
158
|
let t = e.scheme.trim().toLowerCase();
|
|
159
159
|
return t === "isbn" || t === "gtin";
|
|
160
|
-
},
|
|
161
|
-
if (!
|
|
162
|
-
let n =
|
|
160
|
+
}, pe = (e, t) => {
|
|
161
|
+
if (!ue(e, t)) return !1;
|
|
162
|
+
let n = M(e), r = M(t);
|
|
163
163
|
return n === void 0 || r === void 0 || n === r;
|
|
164
|
-
},
|
|
165
|
-
if (!
|
|
166
|
-
let n =
|
|
164
|
+
}, me = (e, t) => {
|
|
165
|
+
if (!ue(e, t)) return !1;
|
|
166
|
+
let n = M(e), r = M(t);
|
|
167
167
|
return n !== void 0 && n === r;
|
|
168
|
-
},
|
|
168
|
+
}, he = (e) => e.trim().toLowerCase().split("-")[0] ?? "", ge = (e, t) => {
|
|
169
169
|
let n = Math.abs(e - t);
|
|
170
170
|
return n === 0 ? 1 : n === 1 ? .6 : n <= 3 ? .3 : 0;
|
|
171
|
-
},
|
|
171
|
+
}, _e = (e, t) => {
|
|
172
172
|
let n = Math.max(e, t);
|
|
173
173
|
return n <= 0 ? 0 : Math.max(0, 1 - Math.abs(e - t) / n * 2);
|
|
174
|
-
},
|
|
175
|
-
let r =
|
|
174
|
+
}, ve = (e, t, n) => e.reduce((e, r) => t.reduce((e, t) => Math.max(e, n(r, t)), e), 0), ye = (e, t, n = x) => {
|
|
175
|
+
let r = j(e);
|
|
176
176
|
if (r === void 0) return;
|
|
177
177
|
let i;
|
|
178
178
|
for (let e of t) {
|
|
179
|
-
let t =
|
|
179
|
+
let t = j(e);
|
|
180
180
|
if (t === void 0) continue;
|
|
181
181
|
let a = {
|
|
182
182
|
score: n(r, t),
|
|
@@ -186,38 +186,38 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
186
186
|
(i === void 0 || a.score > i.score) && (i = a);
|
|
187
187
|
}
|
|
188
188
|
return i;
|
|
189
|
-
},
|
|
189
|
+
}, be = (t) => {
|
|
190
190
|
let n = e(t), r = t.titles?.find((e) => e.type === "subtitle")?.value;
|
|
191
191
|
return n !== void 0 && r !== void 0 ? `${n}: ${r}` : void 0;
|
|
192
|
-
},
|
|
193
|
-
let n =
|
|
192
|
+
}, xe = (e, t) => {
|
|
193
|
+
let n = re(e);
|
|
194
194
|
if (n.size === 0) return !1;
|
|
195
195
|
let r = (t.belongsTo?.series ?? []).flatMap((e) => e.position === void 0 ? [] : [e.position]);
|
|
196
196
|
return r.length > 0 && r.every((e) => !n.has(e));
|
|
197
|
-
},
|
|
197
|
+
}, Se = (e, t) => {
|
|
198
198
|
if (e === void 0) return;
|
|
199
199
|
let n;
|
|
200
200
|
for (let r of t) {
|
|
201
201
|
if (r === void 0) continue;
|
|
202
202
|
let t = {
|
|
203
|
-
score:
|
|
203
|
+
score: ge(e, r),
|
|
204
204
|
query: String(e),
|
|
205
205
|
candidate: String(r)
|
|
206
206
|
};
|
|
207
207
|
(n === void 0 || t.score > n.score) && (n = t);
|
|
208
208
|
}
|
|
209
209
|
return n;
|
|
210
|
-
},
|
|
210
|
+
}, Ce = (t, n) => {
|
|
211
211
|
let r = [], i = (e, t) => {
|
|
212
212
|
t !== void 0 && r.push({
|
|
213
213
|
field: e,
|
|
214
|
-
weight:
|
|
214
|
+
weight: ce[e],
|
|
215
215
|
score: Math.min(1, Math.max(0, t.score)),
|
|
216
216
|
query: t.query,
|
|
217
217
|
candidate: t.candidate
|
|
218
218
|
});
|
|
219
219
|
}, a = (e, t, n, r = x) => {
|
|
220
|
-
let a =
|
|
220
|
+
let a = j(t), o = j(n);
|
|
221
221
|
a === void 0 || o === void 0 || i(e, {
|
|
222
222
|
score: r(a, o),
|
|
223
223
|
query: a,
|
|
@@ -235,49 +235,49 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
235
235
|
query: m,
|
|
236
236
|
candidate: h
|
|
237
237
|
});
|
|
238
|
-
let _ = (t.identifiers ?? []).filter((e) => !
|
|
238
|
+
let _ = (t.identifiers ?? []).filter((e) => !fe(e)), v = (n.identifiers ?? []).filter((e) => !fe(e)), y = _.some((e) => v.some((t) => me(e, t)));
|
|
239
239
|
_.length > 0 && v.length > 0 && i("identifiers", {
|
|
240
|
-
score: +!!_.some((e) => v.some((t) =>
|
|
241
|
-
query: _.map(
|
|
242
|
-
candidate: v.map(
|
|
240
|
+
score: +!!_.some((e) => v.some((t) => pe(e, t))),
|
|
241
|
+
query: _.map(de).join(", "),
|
|
242
|
+
candidate: v.map(de).join(", ")
|
|
243
243
|
});
|
|
244
|
-
let b =
|
|
245
|
-
let t =
|
|
244
|
+
let b = j(t.title), S = [e(n), be(n)].flatMap((e) => {
|
|
245
|
+
let t = j(e);
|
|
246
246
|
return t === void 0 ? [] : [t];
|
|
247
247
|
});
|
|
248
248
|
if (b !== void 0 && S.length > 0) {
|
|
249
|
-
let e =
|
|
249
|
+
let e = ae(b, S);
|
|
250
250
|
e !== void 0 && i("title", {
|
|
251
|
-
score:
|
|
251
|
+
score: xe(b, n) ? 0 : e.score,
|
|
252
252
|
query: b,
|
|
253
253
|
candidate: e.candidate
|
|
254
254
|
});
|
|
255
255
|
}
|
|
256
|
-
i("publisher",
|
|
256
|
+
i("publisher", ye(t.publisher, [n.publication?.original?.publisher, n.publication?.edition?.publisher])), a("series", t.series, n.belongsTo?.series?.[0]?.name);
|
|
257
257
|
let C = p(n), w = (t.authors ?? []).flatMap((e) => {
|
|
258
|
-
let t =
|
|
258
|
+
let t = j(e);
|
|
259
259
|
return t === void 0 ? [] : [t];
|
|
260
260
|
});
|
|
261
261
|
w.length > 0 && C.length > 0 && i("authors", {
|
|
262
|
-
score:
|
|
262
|
+
score: ve(w, C, se),
|
|
263
263
|
query: w.join(", "),
|
|
264
264
|
candidate: C.join(", ")
|
|
265
|
-
}), i("publishedYear",
|
|
265
|
+
}), i("publishedYear", Se(t.publishedYear, [n.publication?.original?.date?.year, n.publication?.edition?.date?.year]));
|
|
266
266
|
let T = t.languages ?? [], E = n.languages ?? [];
|
|
267
267
|
if (T.length > 0 && E.length > 0) {
|
|
268
|
-
let e = new Set(E.map(
|
|
268
|
+
let e = new Set(E.map(he));
|
|
269
269
|
i("languages", {
|
|
270
|
-
score: +!!T.some((t) => e.has(
|
|
270
|
+
score: +!!T.some((t) => e.has(he(t))),
|
|
271
271
|
query: T.join(", "),
|
|
272
272
|
candidate: E.join(", ")
|
|
273
273
|
});
|
|
274
274
|
}
|
|
275
275
|
t.numberOfPages !== void 0 && n.numberOfPages !== void 0 && i("numberOfPages", {
|
|
276
|
-
score:
|
|
276
|
+
score: _e(t.numberOfPages, n.numberOfPages),
|
|
277
277
|
query: String(t.numberOfPages),
|
|
278
278
|
candidate: String(n.numberOfPages)
|
|
279
279
|
});
|
|
280
|
-
let D = r.filter((e) =>
|
|
280
|
+
let D = r.filter((e) => le.has(e.field));
|
|
281
281
|
if (D.some((e) => e.score === 0)) return {
|
|
282
282
|
score: 0,
|
|
283
283
|
signals: r
|
|
@@ -294,12 +294,12 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
294
294
|
score: r.reduce((e, t) => e + t.score * t.weight, 0) / O,
|
|
295
295
|
signals: r
|
|
296
296
|
};
|
|
297
|
-
},
|
|
297
|
+
}, N = class extends Error {
|
|
298
298
|
status;
|
|
299
299
|
constructor(e, t) {
|
|
300
300
|
super(t ?? `Provider responded with status ${e}`), this.name = "MetadataProviderResponseError", this.status = e;
|
|
301
301
|
}
|
|
302
|
-
},
|
|
302
|
+
}, we = (e) => {
|
|
303
303
|
if (typeof e != "object" || !e || !("status" in e)) return;
|
|
304
304
|
let { status: t } = e;
|
|
305
305
|
if (!(typeof t != "number" || !Number.isInteger(t))) return t >= 100 && t <= 599 ? t : void 0;
|
|
@@ -333,7 +333,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
333
333
|
candidates: void 0,
|
|
334
334
|
failure: P({
|
|
335
335
|
id: r.id,
|
|
336
|
-
status:
|
|
336
|
+
status: we(e)
|
|
337
337
|
})
|
|
338
338
|
};
|
|
339
339
|
}
|
|
@@ -341,7 +341,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
341
341
|
for (let { provider: t, candidates: o } of a) {
|
|
342
342
|
if (o === void 0) continue;
|
|
343
343
|
let a = o.map((n) => {
|
|
344
|
-
let { score: a, signals: o } =
|
|
344
|
+
let { score: a, signals: o } = Ce(e, n.metadata);
|
|
345
345
|
return ke({
|
|
346
346
|
candidate: n,
|
|
347
347
|
providerId: t.id,
|
|
@@ -499,6 +499,8 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
499
499
|
industryIdentifiers: He(t),
|
|
500
500
|
pageCount: L(t, "pageCount"),
|
|
501
501
|
categories: R(t, "categories"),
|
|
502
|
+
averageRating: L(t, "averageRating"),
|
|
503
|
+
ratingsCount: L(t, "ratingsCount"),
|
|
502
504
|
language: I(t, "language"),
|
|
503
505
|
imageLinks: Ue(t),
|
|
504
506
|
infoLink: I(t, "infoLink"),
|
|
@@ -516,13 +518,20 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
516
518
|
}, Ke = (e) => F(e) ? z(e, "items").flatMap((e) => {
|
|
517
519
|
let t = U(e);
|
|
518
520
|
return t === void 0 ? [] : [t];
|
|
519
|
-
}) : [], qe =
|
|
521
|
+
}) : [], qe = 5, Je = (e, t) => {
|
|
522
|
+
if (e === void 0 || e < 0 || e > qe) return;
|
|
523
|
+
let n = t !== void 0 && Number.isInteger(t) && t >= 0 ? t : void 0;
|
|
524
|
+
if (n !== 0) return P({
|
|
525
|
+
value: e,
|
|
526
|
+
count: n
|
|
527
|
+
});
|
|
528
|
+
}, Ye = 25, W = (e) => e.length > 0 ? e : void 0, Xe = (e) => e === "ISBN_10" || e === "ISBN_13" ? "ISBN" : e ?? "Unknown", Ze = (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)), Qe = (e) => e.map((e) => P({
|
|
520
529
|
value: e.identifier,
|
|
521
|
-
scheme:
|
|
522
|
-
})),
|
|
530
|
+
scheme: Xe(e.type)
|
|
531
|
+
})), $e = (e, t) => W([...e === void 0 ? [] : [{ value: e }], ...t === void 0 ? [] : [{
|
|
523
532
|
value: t,
|
|
524
533
|
type: "subtitle"
|
|
525
|
-
}]]),
|
|
534
|
+
}]]), et = (e) => W((e?.volumeSeries ?? []).flatMap((e) => {
|
|
526
535
|
let t = P({
|
|
527
536
|
identifiers: e.seriesId === void 0 ? void 0 : [{
|
|
528
537
|
value: e.seriesId,
|
|
@@ -538,7 +547,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
538
547
|
} catch {
|
|
539
548
|
return;
|
|
540
549
|
}
|
|
541
|
-
},
|
|
550
|
+
}, tt = (e) => {
|
|
542
551
|
if (e === void 0) return;
|
|
543
552
|
let t = [
|
|
544
553
|
e.extraLarge,
|
|
@@ -552,11 +561,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
552
561
|
let t = G(e);
|
|
553
562
|
if (t !== void 0) return t;
|
|
554
563
|
}
|
|
555
|
-
},
|
|
564
|
+
}, nt = (e) => W(e.map((e) => ({
|
|
556
565
|
name: e,
|
|
557
566
|
roles: ["author"]
|
|
558
|
-
}))),
|
|
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,
|
|
567
|
+
}))), rt = (e, t = {}) => {
|
|
568
|
+
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, averageRating: h, ratingsCount: g, language: _, imageLinks: v, seriesInfo: y, infoLink: b, canonicalVolumeLink: x, ...S } = i ?? {}, C = Qe(f ?? []), w = Ze([
|
|
560
569
|
...t.matchedIdentifier === void 0 ? [] : [t.matchedIdentifier],
|
|
561
570
|
...t.matchedIsbn === void 0 ? [] : [{
|
|
562
571
|
value: t.matchedIsbn,
|
|
@@ -566,32 +575,33 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
566
575
|
value: n,
|
|
567
576
|
scheme: B
|
|
568
577
|
}],
|
|
569
|
-
...
|
|
570
|
-
]),
|
|
578
|
+
...C
|
|
579
|
+
]), T = P({
|
|
571
580
|
date: r(u),
|
|
572
581
|
publisher: l
|
|
573
|
-
}),
|
|
574
|
-
uri:
|
|
582
|
+
}), E = tt(v), D = E === void 0 ? void 0 : {
|
|
583
|
+
uri: E,
|
|
575
584
|
confidence: "derived"
|
|
576
|
-
},
|
|
585
|
+
}, O = [...new Set(m ?? [])].slice(0, 25), k = et(y);
|
|
577
586
|
return P({
|
|
578
|
-
titles:
|
|
587
|
+
titles: $e(o, s),
|
|
579
588
|
description: d,
|
|
580
|
-
belongsTo:
|
|
581
|
-
publication:
|
|
582
|
-
languages:
|
|
583
|
-
subjects: W(
|
|
584
|
-
contributors:
|
|
589
|
+
belongsTo: k === void 0 ? void 0 : { series: k },
|
|
590
|
+
publication: T.date !== void 0 || T.publisher !== void 0 ? { edition: T } : void 0,
|
|
591
|
+
languages: _ === void 0 ? void 0 : [_],
|
|
592
|
+
subjects: W(O),
|
|
593
|
+
contributors: nt(c ?? []),
|
|
585
594
|
numberOfPages: p,
|
|
586
|
-
|
|
587
|
-
|
|
595
|
+
aggregateRating: Je(h, g),
|
|
596
|
+
identifiers: w,
|
|
597
|
+
cover: D
|
|
588
598
|
});
|
|
589
|
-
},
|
|
599
|
+
}, it = (e) => G(e.volumeInfo?.canonicalVolumeLink) ?? G(e.volumeInfo?.infoLink) ?? (e.id === void 0 ? void 0 : `https://books.google.com/books?id=${encodeURIComponent(e.id)}`), at = 40, ot = 3, st = 1e3, ct = 3e3, lt = /* @__PURE__ */ new Set([
|
|
590
600
|
500,
|
|
591
601
|
502,
|
|
592
602
|
503,
|
|
593
603
|
504
|
|
594
|
-
]),
|
|
604
|
+
]), ut = (e) => `"${e.replace(/["\\]+/g, " ").replace(/\s+/g, " ").trim()}"`, dt = (e) => {
|
|
595
605
|
let t = e.title?.trim();
|
|
596
606
|
if (t === void 0 || t.length === 0) return;
|
|
597
607
|
let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
|
|
@@ -599,51 +609,51 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
599
609
|
title: t,
|
|
600
610
|
...n === void 0 ? {} : { author: n }
|
|
601
611
|
};
|
|
602
|
-
},
|
|
612
|
+
}, ft = (e) => {
|
|
603
613
|
let t = U(e);
|
|
604
614
|
return t === void 0 ? void 0 : {
|
|
605
615
|
volume: t,
|
|
606
616
|
raw: e
|
|
607
617
|
};
|
|
608
|
-
},
|
|
609
|
-
let t =
|
|
618
|
+
}, pt = (e) => F(e) ? z(e, "items").flatMap((e) => {
|
|
619
|
+
let t = ft(e);
|
|
610
620
|
return t === void 0 ? [] : [t];
|
|
611
621
|
}) : [], K = (e, t = {}) => e.map(({ volume: e, raw: n }) => ({
|
|
612
|
-
metadata:
|
|
622
|
+
metadata: rt(e, t),
|
|
613
623
|
id: e.id,
|
|
614
|
-
url:
|
|
624
|
+
url: it(e),
|
|
615
625
|
raw: n
|
|
616
|
-
})),
|
|
626
|
+
})), mt = (e) => {
|
|
617
627
|
let t = `${e.baseUrl.replace(/\/+$/, "")}/volumes`, n = async (t, n, r = !1) => (t.searchParams.set("key", e.apiKey), Le(async () => {
|
|
618
628
|
let i = await e.fetch(t.toString(), {
|
|
619
629
|
signal: n.signal,
|
|
620
630
|
headers: { Accept: "application/json" }
|
|
621
631
|
});
|
|
622
632
|
if (!(r && i.status === 404)) {
|
|
623
|
-
if (!i.ok) throw new
|
|
633
|
+
if (!i.ok) throw new N(i.status, `Google Books lookup failed with status ${i.status}`);
|
|
624
634
|
return i;
|
|
625
635
|
}
|
|
626
636
|
}, {
|
|
627
|
-
attempts:
|
|
628
|
-
initialDelayMs:
|
|
629
|
-
maxDelayMs:
|
|
637
|
+
attempts: ot,
|
|
638
|
+
initialDelayMs: st,
|
|
639
|
+
maxDelayMs: ct,
|
|
630
640
|
signal: n.signal,
|
|
631
641
|
shouldRetry: (e) => {
|
|
632
|
-
let t =
|
|
633
|
-
return t === void 0 ||
|
|
642
|
+
let t = we(e);
|
|
643
|
+
return t === void 0 || lt.has(t);
|
|
634
644
|
}
|
|
635
645
|
})), r = async (e, r) => {
|
|
636
646
|
let i = await n(new URL(`${t}/${encodeURIComponent(e)}`), r, !0);
|
|
637
647
|
if (i === void 0) return;
|
|
638
|
-
let a =
|
|
648
|
+
let a = ft(await i.json());
|
|
639
649
|
if (a?.volume.id !== e) throw Error(`Google Books response did not contain the requested volume ${e}`);
|
|
640
650
|
return a;
|
|
641
651
|
}, i = async (e, r) => {
|
|
642
652
|
if (r.limit <= 0) return [];
|
|
643
653
|
let i = new URL(t);
|
|
644
|
-
i.searchParams.set("q", e), i.searchParams.set("maxResults", String(Math.min(Math.ceil(r.limit),
|
|
654
|
+
i.searchParams.set("q", e), i.searchParams.set("maxResults", String(Math.min(Math.ceil(r.limit), at))), i.searchParams.set("orderBy", "relevance"), i.searchParams.set("printType", "books");
|
|
645
655
|
let a = await n(i, r);
|
|
646
|
-
return a === void 0 ? [] :
|
|
656
|
+
return a === void 0 ? [] : pt(await a.json());
|
|
647
657
|
};
|
|
648
658
|
return async (e, t) => {
|
|
649
659
|
let n = Ve(e);
|
|
@@ -656,47 +666,47 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
656
666
|
let e = await i(`isbn:${a}`, t);
|
|
657
667
|
if (e.length > 0) return K(e, { matchedIsbn: a });
|
|
658
668
|
}
|
|
659
|
-
let o =
|
|
669
|
+
let o = dt(e);
|
|
660
670
|
if (o === void 0) return [];
|
|
661
|
-
let s = `intitle:${
|
|
671
|
+
let s = `intitle:${ut(o.title)}`, c = o.author === void 0 ? s : `${s} inauthor:${ut(o.author)}`, l = await i(c, t);
|
|
662
672
|
return l.length > 0 || o.author === void 0 ? K(l) : K(await i(s, t));
|
|
663
673
|
};
|
|
664
|
-
},
|
|
674
|
+
}, ht = "googleBooks", gt = "https://www.googleapis.com/books/v1", _t = (e) => {
|
|
665
675
|
let t = e.apiKey.trim();
|
|
666
676
|
if (t.length === 0) throw Error("createGoogleBooksProvider requires a non-empty apiKey");
|
|
667
677
|
return {
|
|
668
|
-
id:
|
|
678
|
+
id: ht,
|
|
669
679
|
name: "Google Books",
|
|
670
|
-
search:
|
|
680
|
+
search: mt({
|
|
671
681
|
apiKey: t,
|
|
672
|
-
baseUrl: e.baseUrl ??
|
|
682
|
+
baseUrl: e.baseUrl ?? gt,
|
|
673
683
|
fetch: e.fetch ?? globalThis.fetch
|
|
674
684
|
})
|
|
675
685
|
};
|
|
676
|
-
},
|
|
686
|
+
}, vt = "ProjectGutenberg", yt = /* @__PURE__ */ new Set(["gutenberg.org", "www.gutenberg.org"]), bt = [
|
|
677
687
|
/^\/ebooks\/(\d+)(?:[./]|$)/i,
|
|
678
688
|
/^\/files\/(\d+)(?:\/|$)/i,
|
|
679
689
|
/^\/cache\/epub\/(\d+)(?:\/|$)/i,
|
|
680
690
|
/^\/(\d+)(?:\/|$)/
|
|
681
|
-
],
|
|
691
|
+
], xt = (e) => {
|
|
682
692
|
let t = e.trim();
|
|
683
693
|
if (!/^\d+$/.test(t)) return;
|
|
684
694
|
let n = t.replace(/^0+(?=\d)/, "");
|
|
685
695
|
return n === "0" ? void 0 : n;
|
|
686
|
-
},
|
|
696
|
+
}, St = (e) => {
|
|
687
697
|
try {
|
|
688
698
|
let t = new URL(e.trim());
|
|
689
|
-
if (t.protocol !== "http:" && t.protocol !== "https:" || !
|
|
690
|
-
for (let e of
|
|
699
|
+
if (t.protocol !== "http:" && t.protocol !== "https:" || !yt.has(t.hostname.toLowerCase())) return;
|
|
700
|
+
for (let e of bt) {
|
|
691
701
|
let n = e.exec(t.pathname)?.[1];
|
|
692
|
-
if (n !== void 0) return
|
|
702
|
+
if (n !== void 0) return xt(n);
|
|
693
703
|
}
|
|
694
704
|
} catch {
|
|
695
705
|
return;
|
|
696
706
|
}
|
|
697
707
|
}, q = (e) => {
|
|
698
708
|
for (let t of e.identifiers ?? []) {
|
|
699
|
-
let e = t.scheme.trim().toLowerCase(), n = e === "projectgutenberg" ?
|
|
709
|
+
let e = t.scheme.trim().toLowerCase(), n = e === "projectgutenberg" ? xt(t.value) : e === "unknown" || e === "url" || e === "uri" ? St(t.value) : void 0;
|
|
700
710
|
if (n !== void 0) return {
|
|
701
711
|
id: n,
|
|
702
712
|
identifier: {
|
|
@@ -705,7 +715,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
705
715
|
}
|
|
706
716
|
};
|
|
707
717
|
}
|
|
708
|
-
},
|
|
718
|
+
}, Ct = (e) => ({
|
|
709
719
|
key: I(e, "key"),
|
|
710
720
|
title: I(e, "title"),
|
|
711
721
|
subtitle: I(e, "subtitle"),
|
|
@@ -714,9 +724,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
714
724
|
language: R(e, "language"),
|
|
715
725
|
subject: R(e, "subject"),
|
|
716
726
|
number_of_pages_median: L(e, "number_of_pages_median"),
|
|
727
|
+
ratings_average: L(e, "ratings_average"),
|
|
728
|
+
ratings_count: L(e, "ratings_count"),
|
|
717
729
|
cover_i: L(e, "cover_i"),
|
|
718
730
|
id_project_gutenberg: R(e, "id_project_gutenberg")
|
|
719
|
-
}),
|
|
731
|
+
}), wt = (e) => F(e) ? z(e, "docs").map(Ct) : [], Tt = {
|
|
720
732
|
afr: "af",
|
|
721
733
|
alb: "sq",
|
|
722
734
|
amh: "am",
|
|
@@ -821,51 +833,52 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
821
833
|
wel: "cy",
|
|
822
834
|
yid: "yi",
|
|
823
835
|
zho: "zh"
|
|
824
|
-
},
|
|
836
|
+
}, Et = /* @__PURE__ */ new Set([
|
|
825
837
|
"mul",
|
|
826
838
|
"und",
|
|
827
839
|
"zxx",
|
|
828
840
|
"sgn"
|
|
829
|
-
]),
|
|
841
|
+
]), Dt = (e) => {
|
|
830
842
|
let t = e.trim().toLowerCase();
|
|
831
|
-
if (t.length !== 0 && !
|
|
832
|
-
},
|
|
833
|
-
let { title: n, subtitle: r, language: i, key: a, author_name: o, first_publish_year: s, subject: c, number_of_pages_median: l,
|
|
843
|
+
if (t.length !== 0 && !Et.has(t)) return Tt[t] ?? t;
|
|
844
|
+
}, Ot = 25, kt = "OpenLibrary", At = "ProjectGutenberg", J = (e) => e.length > 0 ? e : void 0, jt = (e, t) => {
|
|
845
|
+
let { title: n, subtitle: r, language: i, key: a, author_name: o, first_publish_year: s, subject: c, number_of_pages_median: l, ratings_average: u, ratings_count: d, cover_i: f, id_project_gutenberg: p, ...m } = e, h = J([...n === void 0 ? [] : [{ value: n }], ...r === void 0 ? [] : [{
|
|
834
846
|
value: r,
|
|
835
847
|
type: "subtitle"
|
|
836
|
-
}]]),
|
|
848
|
+
}]]), g = J([...new Set((i ?? []).map(Dt).filter((e) => e !== void 0))]), _ = [
|
|
837
849
|
...t.isbn === void 0 ? [] : [{
|
|
838
850
|
value: t.isbn,
|
|
839
851
|
scheme: "ISBN"
|
|
840
852
|
}],
|
|
841
853
|
...t.matchedProjectGutenbergIdentifier === void 0 ? [] : [t.matchedProjectGutenbergIdentifier],
|
|
842
|
-
...(
|
|
854
|
+
...(p ?? []).map((e) => ({
|
|
843
855
|
value: e,
|
|
844
|
-
scheme:
|
|
856
|
+
scheme: At
|
|
845
857
|
})),
|
|
846
858
|
...a === void 0 ? [] : [{
|
|
847
859
|
value: a,
|
|
848
|
-
scheme:
|
|
860
|
+
scheme: kt
|
|
849
861
|
}]
|
|
850
862
|
];
|
|
851
863
|
return P({
|
|
852
|
-
titles:
|
|
853
|
-
cover:
|
|
854
|
-
uri: `${t.coversBaseUrl}/b/id/${
|
|
864
|
+
titles: h,
|
|
865
|
+
cover: f === void 0 ? void 0 : {
|
|
866
|
+
uri: `${t.coversBaseUrl}/b/id/${f}-L.jpg`,
|
|
855
867
|
mediaType: "image/jpeg",
|
|
856
868
|
confidence: "derived"
|
|
857
869
|
},
|
|
858
870
|
publication: s === void 0 ? void 0 : { original: { date: { year: s } } },
|
|
859
|
-
languages:
|
|
871
|
+
languages: g,
|
|
860
872
|
subjects: J((c ?? []).slice(0, 25)),
|
|
861
873
|
contributors: J((o ?? []).map((e) => ({
|
|
862
874
|
name: e,
|
|
863
875
|
roles: ["author"]
|
|
864
876
|
}))),
|
|
865
877
|
numberOfPages: l,
|
|
866
|
-
|
|
878
|
+
aggregateRating: Je(u, d),
|
|
879
|
+
identifiers: J(_)
|
|
867
880
|
});
|
|
868
|
-
},
|
|
881
|
+
}, Mt = "openLibrary", Nt = "https://openlibrary.org", Pt = "https://covers.openlibrary.org", Ft = [
|
|
869
882
|
"key",
|
|
870
883
|
"title",
|
|
871
884
|
"subtitle",
|
|
@@ -874,9 +887,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
874
887
|
"language",
|
|
875
888
|
"subject",
|
|
876
889
|
"number_of_pages_median",
|
|
890
|
+
"ratings_average",
|
|
891
|
+
"ratings_count",
|
|
877
892
|
"cover_i",
|
|
878
893
|
"id_project_gutenberg"
|
|
879
|
-
].join(","),
|
|
894
|
+
].join(","), It = (e) => {
|
|
880
895
|
let t = e.title?.trim();
|
|
881
896
|
if (t === void 0 || t.length === 0) return;
|
|
882
897
|
let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
|
|
@@ -884,11 +899,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
884
899
|
title: t,
|
|
885
900
|
...n === void 0 ? {} : { author: n }
|
|
886
901
|
};
|
|
887
|
-
},
|
|
888
|
-
let t = e.baseUrl ??
|
|
902
|
+
}, Lt = (e = {}) => {
|
|
903
|
+
let t = e.baseUrl ?? Nt, n = e.coversBaseUrl ?? Pt, r = async (n, r) => {
|
|
889
904
|
let i = new URL("/search.json", t);
|
|
890
905
|
for (let [e, t] of Object.entries(n)) i.searchParams.set(e, t);
|
|
891
|
-
i.searchParams.set("fields",
|
|
906
|
+
i.searchParams.set("fields", Ft), i.searchParams.set("limit", String(r.limit));
|
|
892
907
|
let a = await (e.fetch ?? globalThis.fetch)(i.toString(), {
|
|
893
908
|
signal: r.signal,
|
|
894
909
|
headers: {
|
|
@@ -896,10 +911,10 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
896
911
|
...e.userAgent === void 0 ? {} : { "User-Agent": e.userAgent }
|
|
897
912
|
}
|
|
898
913
|
});
|
|
899
|
-
if (!a.ok) throw new
|
|
900
|
-
return
|
|
914
|
+
if (!a.ok) throw new N(a.status, `Open Library search failed with status ${a.status}`);
|
|
915
|
+
return wt(await a.json());
|
|
901
916
|
}, i = (e, r = {}) => e.map((e) => ({
|
|
902
|
-
metadata:
|
|
917
|
+
metadata: jt(e, {
|
|
903
918
|
coversBaseUrl: n,
|
|
904
919
|
isbn: r.isbn,
|
|
905
920
|
matchedProjectGutenbergIdentifier: r.confirmedProjectGutenberg?.identifier
|
|
@@ -909,7 +924,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
909
924
|
raw: e
|
|
910
925
|
}));
|
|
911
926
|
return {
|
|
912
|
-
id:
|
|
927
|
+
id: Mt,
|
|
913
928
|
name: "Open Library",
|
|
914
929
|
search: async (e, t) => {
|
|
915
930
|
let n = d(e.identifiers), a = q(e);
|
|
@@ -921,7 +936,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
921
936
|
let e = await r({ q: `id_project_gutenberg:${a.id}` }, t);
|
|
922
937
|
if (e.length > 0) return i(e, { confirmedProjectGutenberg: a });
|
|
923
938
|
}
|
|
924
|
-
let o =
|
|
939
|
+
let o = It(e);
|
|
925
940
|
if (o === void 0) return [];
|
|
926
941
|
let s = await r(o, t);
|
|
927
942
|
if (s.length > 0) return i(s);
|
|
@@ -929,27 +944,27 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
929
944
|
return i(await r({ q: c }, t));
|
|
930
945
|
}
|
|
931
946
|
};
|
|
932
|
-
}, Y = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e,
|
|
947
|
+
}, Y = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, Rt = (e) => e.type === "element", X = (e, t) => e.children.filter((e) => Rt(e) && Y(e.name).toLowerCase() === t.toLowerCase()), Z = (e, t) => X(e, t)[0], Q = (e) => {
|
|
933
948
|
let t = e?.val.trim();
|
|
934
949
|
return t !== void 0 && t.length > 0 ? t : void 0;
|
|
935
|
-
},
|
|
950
|
+
}, zt = (e, t) => {
|
|
936
951
|
for (let [n, r] of Object.entries(e.attr)) {
|
|
937
952
|
if (Y(n).toLowerCase() !== t.toLowerCase()) continue;
|
|
938
953
|
let e = r.trim();
|
|
939
954
|
if (e.length > 0) return e;
|
|
940
955
|
}
|
|
941
|
-
},
|
|
956
|
+
}, Bt = (e, t) => X(e, t).flatMap((e) => {
|
|
942
957
|
let t = Q(Z(Z(e, "Description") ?? e, "value"));
|
|
943
958
|
return t === void 0 ? [] : [t];
|
|
944
|
-
}),
|
|
945
|
-
let t =
|
|
959
|
+
}), Vt = (e) => {
|
|
960
|
+
let t = zt(e, "about"), n = t === void 0 ? void 0 : /(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];
|
|
946
961
|
if (n === void 0) return;
|
|
947
962
|
let r = n.replace(/^0+(?=\d)/, "");
|
|
948
963
|
return r === "0" ? void 0 : r;
|
|
949
|
-
},
|
|
964
|
+
}, Ht = (e) => {
|
|
950
965
|
let t = [];
|
|
951
966
|
for (let n of e.children) {
|
|
952
|
-
if (!
|
|
967
|
+
if (!Rt(n)) continue;
|
|
953
968
|
let e = n.name.toLowerCase() === "dcterms:creator", r = n.name.toLowerCase().startsWith("marcrel:");
|
|
954
969
|
if (!e && !r) continue;
|
|
955
970
|
let i = Q(Z(Z(n, "agent") ?? n, "name"));
|
|
@@ -959,21 +974,21 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
959
974
|
});
|
|
960
975
|
}
|
|
961
976
|
return t;
|
|
962
|
-
},
|
|
963
|
-
let t = Z(e, "Description"), n = t === void 0 ? void 0 :
|
|
977
|
+
}, Ut = (e) => X(e, "subject").flatMap((e) => {
|
|
978
|
+
let t = Z(e, "Description"), n = t === void 0 ? void 0 : zt(Z(t, "memberOf") ?? t, "resource"), r = Q(t === void 0 ? void 0 : Z(t, "value"));
|
|
964
979
|
return r !== void 0 && n?.endsWith("/LCSH") === !0 ? [r] : [];
|
|
965
|
-
}),
|
|
980
|
+
}), Wt = (e) => {
|
|
966
981
|
let t = X(e, "hasFormat").flatMap((e) => {
|
|
967
982
|
let t = Z(e, "file");
|
|
968
983
|
if (t === void 0) return [];
|
|
969
|
-
let n =
|
|
984
|
+
let n = zt(t, "about"), r = X(t, "format").map((e) => Q(Z(Z(e, "Description") ?? e, "value"))).find((e) => e?.startsWith("image/") === !0);
|
|
970
985
|
return n === void 0 || r === void 0 || !/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n) ? [] : [{
|
|
971
986
|
uri: n,
|
|
972
987
|
mediaType: r
|
|
973
988
|
}];
|
|
974
989
|
});
|
|
975
990
|
return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
|
|
976
|
-
}, $ = (e) => e.length > 0 ? e : void 0,
|
|
991
|
+
}, $ = (e) => e.length > 0 ? e : void 0, Gt = (e) => {
|
|
977
992
|
let t;
|
|
978
993
|
try {
|
|
979
994
|
t = new a(e);
|
|
@@ -984,9 +999,9 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
984
999
|
if (Y(t.name).toLowerCase() !== "rdf") return;
|
|
985
1000
|
let n = Z(t, "ebook");
|
|
986
1001
|
if (n === void 0) return;
|
|
987
|
-
let r =
|
|
1002
|
+
let r = Vt(n);
|
|
988
1003
|
if (r === void 0) return;
|
|
989
|
-
let i = [...new Set(
|
|
1004
|
+
let i = [...new Set(Bt(n, "language"))], o = [...new Set(Ut(n))], s = [...new Set(Bt(n, "bookshelf"))], c = Ht(n);
|
|
990
1005
|
return {
|
|
991
1006
|
id: r,
|
|
992
1007
|
title: Q(Z(n, "title")),
|
|
@@ -1000,9 +1015,9 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1000
1015
|
subjects: $(o),
|
|
1001
1016
|
bookshelves: $(s),
|
|
1002
1017
|
contributors: $(c),
|
|
1003
|
-
cover:
|
|
1018
|
+
cover: Wt(n)
|
|
1004
1019
|
};
|
|
1005
|
-
},
|
|
1020
|
+
}, Kt = 25, qt = {
|
|
1006
1021
|
art: "artist",
|
|
1007
1022
|
aut: "author",
|
|
1008
1023
|
clr: "colorist",
|
|
@@ -1011,17 +1026,17 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1011
1026
|
ill: "illustrator",
|
|
1012
1027
|
nrt: "narrator",
|
|
1013
1028
|
trl: "translator"
|
|
1014
|
-
},
|
|
1029
|
+
}, Jt = (e) => {
|
|
1015
1030
|
let t = /* @__PURE__ */ new Map();
|
|
1016
1031
|
for (let n of e.contributors ?? []) {
|
|
1017
|
-
let e = n.name.trim().toLowerCase(), r =
|
|
1032
|
+
let e = n.name.trim().toLowerCase(), r = qt[n.role.trim().toLowerCase()] ?? n.role, i = t.get(e);
|
|
1018
1033
|
i === void 0 ? t.set(e, {
|
|
1019
1034
|
name: n.name,
|
|
1020
1035
|
roles: [r]
|
|
1021
1036
|
}) : i.roles.includes(r) || i.roles.push(r);
|
|
1022
1037
|
}
|
|
1023
1038
|
return t.size > 0 ? [...t.values()] : void 0;
|
|
1024
|
-
},
|
|
1039
|
+
}, Yt = (e) => {
|
|
1025
1040
|
if (e === void 0) return;
|
|
1026
1041
|
let t = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());
|
|
1027
1042
|
if (t === null) return;
|
|
@@ -1031,33 +1046,33 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1031
1046
|
...r === void 0 ? {} : { month: r },
|
|
1032
1047
|
...i === void 0 ? {} : { day: i }
|
|
1033
1048
|
};
|
|
1034
|
-
},
|
|
1049
|
+
}, Xt = (e, t) => e.split("$").slice(1).flatMap((e) => e[0]?.toLowerCase() === t.toLowerCase() ? [e.slice(1).trim()] : []).filter((e) => e.length > 0), Zt = (e) => {
|
|
1035
1050
|
if (e === void 0) return;
|
|
1036
|
-
let t =
|
|
1051
|
+
let t = Xt(e, "b"), n = (t.length === 1 ? t[0] : void 0)?.replace(/[\s,;:/]+$/u, "").trim(), r = Xt(e, "c"), i = [...new Set(r.flatMap((e) => [...e.matchAll(/\d{4}/g)].flatMap((e) => e[0] === void 0 ? [] : [Number(e[0])])))], a = P({
|
|
1037
1052
|
date: i.length === 1 ? { year: i[0] } : void 0,
|
|
1038
1053
|
publisher: n !== void 0 && n.length > 0 && !/^\[?s\.n\.?\]?$/i.test(n) ? n : void 0
|
|
1039
1054
|
});
|
|
1040
1055
|
return a.date !== void 0 || a.publisher !== void 0 ? a : void 0;
|
|
1041
|
-
},
|
|
1056
|
+
}, Qt = (e, t) => {
|
|
1042
1057
|
try {
|
|
1043
1058
|
let n = new URL(e, t);
|
|
1044
1059
|
return n.protocol === "http:" || n.protocol === "https:" ? n.toString() : void 0;
|
|
1045
1060
|
} catch {
|
|
1046
1061
|
return;
|
|
1047
1062
|
}
|
|
1048
|
-
},
|
|
1063
|
+
}, $t = (e) => e.length > 0 ? e : void 0, en = (e, t) => {
|
|
1049
1064
|
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
1065
|
value: n,
|
|
1051
|
-
scheme:
|
|
1052
|
-
}].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme.trim().toLowerCase() === e.scheme.trim().toLowerCase()) === t), _ = [.../* @__PURE__ */ new Set([...d ?? [], ...f ?? []])].slice(0, 25), v = m === void 0 ? void 0 :
|
|
1066
|
+
scheme: vt
|
|
1067
|
+
}].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme.trim().toLowerCase() === e.scheme.trim().toLowerCase()) === t), _ = [.../* @__PURE__ */ new Set([...d ?? [], ...f ?? []])].slice(0, 25), v = m === void 0 ? void 0 : Qt(m.uri, t.baseUrl), y = v === void 0 ? void 0 : {
|
|
1053
1068
|
uri: v,
|
|
1054
1069
|
mediaType: m?.mediaType,
|
|
1055
1070
|
confidence: "derived"
|
|
1056
1071
|
}, b = P({
|
|
1057
|
-
date:
|
|
1072
|
+
date: Yt(a),
|
|
1058
1073
|
publisher: i
|
|
1059
1074
|
}), x = P({
|
|
1060
|
-
original:
|
|
1075
|
+
original: Zt(o),
|
|
1061
1076
|
edition: b.date !== void 0 || b.publisher !== void 0 ? b : void 0
|
|
1062
1077
|
});
|
|
1063
1078
|
return P({
|
|
@@ -1065,16 +1080,16 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1065
1080
|
publication: x.original !== void 0 || x.edition !== void 0 ? x : void 0,
|
|
1066
1081
|
description: l ?? c,
|
|
1067
1082
|
rights: s,
|
|
1068
|
-
languages:
|
|
1069
|
-
subjects:
|
|
1070
|
-
contributors:
|
|
1083
|
+
languages: $t([...new Set(u ?? [])]),
|
|
1084
|
+
subjects: $t(_),
|
|
1085
|
+
contributors: Jt(e),
|
|
1071
1086
|
identifiers: g,
|
|
1072
1087
|
cover: y
|
|
1073
1088
|
});
|
|
1074
|
-
},
|
|
1075
|
-
let t = e.baseUrl ??
|
|
1089
|
+
}, tn = "projectGutenberg", nn = "https://www.gutenberg.org", rn = (e = {}) => {
|
|
1090
|
+
let t = e.baseUrl ?? nn;
|
|
1076
1091
|
return {
|
|
1077
|
-
id:
|
|
1092
|
+
id: tn,
|
|
1078
1093
|
name: "Project Gutenberg",
|
|
1079
1094
|
search: async (n, r) => {
|
|
1080
1095
|
let i = q(n);
|
|
@@ -1087,23 +1102,23 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
1087
1102
|
}
|
|
1088
1103
|
});
|
|
1089
1104
|
if (o.status === 404) return [];
|
|
1090
|
-
if (!o.ok) throw new
|
|
1091
|
-
let s =
|
|
1105
|
+
if (!o.ok) throw new N(o.status, `Project Gutenberg metadata lookup failed with status ${o.status}`);
|
|
1106
|
+
let s = Gt(await o.text());
|
|
1092
1107
|
if (s === void 0 || s.id !== i.id) throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);
|
|
1093
1108
|
let c = new URL(`/ebooks/${i.id}`, t).toString();
|
|
1094
1109
|
return [{
|
|
1095
1110
|
id: s.id,
|
|
1096
1111
|
url: c,
|
|
1097
1112
|
raw: s,
|
|
1098
|
-
metadata:
|
|
1113
|
+
metadata: en(s, {
|
|
1099
1114
|
baseUrl: t,
|
|
1100
1115
|
matchedIdentifier: i.identifier
|
|
1101
1116
|
})
|
|
1102
1117
|
}];
|
|
1103
1118
|
}
|
|
1104
1119
|
};
|
|
1105
|
-
},
|
|
1120
|
+
}, an = (e) => [e.title, e.series].some((e) => e !== void 0 && e.trim().length > 0) || (e.identifiers ?? []).some((e) => e.value.trim().length > 0) || (e.authors ?? []).some((e) => e.trim().length > 0);
|
|
1106
1121
|
//#endregion
|
|
1107
|
-
export { B as GOOGLE_BOOKS_IDENTIFIER_SCHEME,
|
|
1122
|
+
export { B as GOOGLE_BOOKS_IDENTIFIER_SCHEME, Ye as GOOGLE_BOOKS_MAX_SUBJECTS, ht as GOOGLE_BOOKS_PROVIDER_ID, ce as METADATA_MATCH_WEIGHTS, N as MetadataProviderResponseError, kt as OPEN_LIBRARY_IDENTIFIER_SCHEME, Ot as OPEN_LIBRARY_MAX_SUBJECTS, Mt as OPEN_LIBRARY_PROVIDER_ID, vt as PROJECT_GUTENBERG_IDENTIFIER_SCHEME, Kt as PROJECT_GUTENBERG_MAX_SUBJECTS, tn as PROJECT_GUTENBERG_PROVIDER_ID, _t as createGoogleBooksProvider, Lt as createOpenLibraryProvider, rn as createProjectGutenbergProvider, Ae as fetchMetadata, tt as googleBooksCoverUrl, Ve as googleBooksLookupFromInput, it as googleBooksVolumeUrl, an as hasSearchTerms, Dt as marcLanguageToBcp47, p as metadataAuthors, je as metadataInputFromResolvedArchive, y as normalizeForComparison, U as parseGoogleBooksVolume, Ke as parseGoogleBooksVolumesResponse, wt as parseOpenLibrarySearchResponse, Gt as parseProjectGutenbergRdf, se as personNameSimilarity, q as projectGutenbergLookupFromInput, rt as resolveGoogleBooksVolume, jt as resolveOpenLibraryDoc, en as resolveProjectGutenbergRecord, we as responseErrorStatus, Le as retryWithBackoff, Ce as scoreMetadataCandidate, x as textSimilarity, ie as titleSimilarity, g as toIsbn13 };
|
|
1108
1123
|
|
|
1109
1124
|
//# sourceMappingURL=index.js.map
|