@prose-reader/metadata-fetcher 1.346.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 +202 -245
- 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
|
@@ -136,18 +136,18 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
136
136
|
}, pe = (e, t) => {
|
|
137
137
|
let n = E(e.value)?.toLowerCase();
|
|
138
138
|
return n !== void 0 && n === E(t.value)?.toLowerCase();
|
|
139
|
-
}, D = (e) => e.scheme.trim().toLowerCase() === "unknown" ? void 0 : E(e.scheme)?.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
|
-
},
|
|
142
|
+
}, he = (e, t) => {
|
|
143
143
|
if (!pe(e, t)) return !1;
|
|
144
144
|
let n = D(e), r = D(t);
|
|
145
145
|
return n === void 0 || r === void 0 || n === r;
|
|
146
|
-
},
|
|
146
|
+
}, ge = (e, t) => {
|
|
147
147
|
if (!pe(e, t)) return !1;
|
|
148
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) => {
|
|
@@ -181,7 +181,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
181
181
|
(n === void 0 || t.score > n.score) && (n = t);
|
|
182
182
|
}
|
|
183
183
|
return n;
|
|
184
|
-
},
|
|
184
|
+
}, Ce = (t, n) => {
|
|
185
185
|
let r = [], i = (e, t) => {
|
|
186
186
|
t !== void 0 && r.push({
|
|
187
187
|
field: e,
|
|
@@ -209,11 +209,11 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
209
209
|
query: p,
|
|
210
210
|
candidate: m
|
|
211
211
|
});
|
|
212
|
-
let g = (t.identifiers ?? []).filter((e) => !
|
|
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
213
|
g.length > 0 && _.length > 0 && i("identifiers", {
|
|
214
|
-
score: +!!g.some((e) => _.some((t) =>
|
|
215
|
-
query: g.map(
|
|
216
|
-
candidate: _.map(
|
|
214
|
+
score: +!!g.some((e) => _.some((t) => he(e, t))),
|
|
215
|
+
query: g.map(O).join(", "),
|
|
216
|
+
candidate: _.map(O).join(", ")
|
|
217
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
218
|
let y = f(n), x = (t.authors ?? []).flatMap((e) => {
|
|
219
219
|
let t = E(e);
|
|
@@ -226,9 +226,9 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
226
226
|
}), i("publishedYear", Se(t.publishedYear, [n.publication?.original?.date?.year, n.publication?.edition?.date?.year]));
|
|
227
227
|
let S = t.languages ?? [], C = n.languages ?? [];
|
|
228
228
|
if (S.length > 0 && C.length > 0) {
|
|
229
|
-
let e = new Set(C.map(
|
|
229
|
+
let e = new Set(C.map(_e));
|
|
230
230
|
i("languages", {
|
|
231
|
-
score: +!!S.some((t) => e.has(
|
|
231
|
+
score: +!!S.some((t) => e.has(_e(t))),
|
|
232
232
|
query: S.join(", "),
|
|
233
233
|
candidate: C.join(", ")
|
|
234
234
|
});
|
|
@@ -255,19 +255,19 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
255
255
|
score: r.reduce((e, t) => e + t.score * t.weight, 0) / T,
|
|
256
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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,17 +321,17 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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
|
-
},
|
|
329
|
+
}, Ae = (t) => {
|
|
330
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
|
|
334
|
+
return j({
|
|
335
335
|
title: e(n),
|
|
336
336
|
authors: r.length > 0 ? r : void 0,
|
|
337
337
|
identifiers: i !== void 0 && i.length > 0 ? i : void 0,
|
|
@@ -341,69 +341,69 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
341
341
|
languages: n.languages,
|
|
342
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
|
-
return e === void 0 ? void 0 :
|
|
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" ?
|
|
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,12 +414,12 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
414
414
|
}
|
|
415
415
|
}, B = (e, t) => {
|
|
416
416
|
let n = e[t];
|
|
417
|
-
return
|
|
417
|
+
return M(n) ? n : void 0;
|
|
418
418
|
}, Be = (e) => {
|
|
419
|
-
let t =
|
|
420
|
-
let t =
|
|
421
|
-
return t === void 0 ? [] : [
|
|
422
|
-
type:
|
|
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
|
});
|
|
@@ -427,72 +427,54 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
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:
|
|
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
454
|
industryIdentifiers: Be(t),
|
|
455
|
-
pageCount:
|
|
456
|
-
categories:
|
|
457
|
-
language:
|
|
455
|
+
pageCount: P(t, "pageCount"),
|
|
456
|
+
categories: F(t, "categories"),
|
|
457
|
+
language: N(t, "language"),
|
|
458
458
|
imageLinks: Ve(t),
|
|
459
|
-
infoLink:
|
|
460
|
-
canonicalVolumeLink:
|
|
459
|
+
infoLink: N(t, "infoLink"),
|
|
460
|
+
canonicalVolumeLink: N(t, "canonicalVolumeLink"),
|
|
461
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:
|
|
465
|
+
if (!M(e)) return;
|
|
466
|
+
let t = j({
|
|
467
|
+
id: N(e, "id"),
|
|
468
468
|
volumeInfo: Ue(e)
|
|
469
469
|
});
|
|
470
470
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
471
|
-
}, We = (e) =>
|
|
471
|
+
}, We = (e) => M(e) ? I(e, "items").flatMap((e) => {
|
|
472
472
|
let t = V(e);
|
|
473
473
|
return t === void 0 ? [] : [t];
|
|
474
|
-
}) : [], Ge = 25, Ke = {
|
|
475
|
-
id: "identifiers",
|
|
476
|
-
volumeInfo: "metadata"
|
|
477
|
-
}, qe = {
|
|
478
|
-
title: "titles",
|
|
479
|
-
subtitle: "titles",
|
|
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: "titles"
|
|
492
|
-
}, H = (e) => e.length > 0 ? e : void 0, Je = (e) => e === "ISBN_10" || e === "ISBN_13" ? "ISBN" : e ?? "Unknown", Ye = (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)), Xe = (e) => e.map((e) => M({
|
|
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 n = e.volumeInfo ?? {}, i =
|
|
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 =
|
|
516
|
+
]), o = j({
|
|
535
517
|
date: r(n.publishedDate),
|
|
536
518
|
publisher: n.publisher
|
|
537
|
-
}), s =
|
|
519
|
+
}), s = Xe(n.imageLinks), c = s === void 0 ? void 0 : {
|
|
538
520
|
uri: s,
|
|
539
521
|
confidence: "derived"
|
|
540
|
-
}, l = [...new Set(n.categories ?? [])].slice(0, 25), u =
|
|
541
|
-
return
|
|
522
|
+
}, l = [...new Set(n.categories ?? [])].slice(0, 25), u = Ye(n);
|
|
523
|
+
return j({
|
|
542
524
|
titles: u === void 0 ? void 0 : [{ value: u }],
|
|
543
525
|
description: n.description,
|
|
544
526
|
publication: o.date !== void 0 || o.publisher !== void 0 ? { edition: o } : void 0,
|
|
545
527
|
languages: n.language === void 0 ? void 0 : [n.language],
|
|
546
528
|
subjects: H(l),
|
|
547
|
-
contributors:
|
|
529
|
+
contributors: Ze(n.authors ?? []),
|
|
548
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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: "titles",
|
|
798
|
-
subtitle: "titles",
|
|
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
|
-
}, Dt = "OpenLibrary", Ot = "ProjectGutenberg", K = (e) => e.length > 0 ? e : void 0, kt = (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(wt).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,14 +783,14 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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
|
|
793
|
+
return j({
|
|
823
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`,
|
|
@@ -828,15 +799,15 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 = d(e.identifiers), a =
|
|
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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,40 +871,40 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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
|
-
},
|
|
883
|
+
}, Nt = (e, t) => Y(e, t).flatMap((e) => {
|
|
913
884
|
let t = Z(X(X(e, "Description") ?? e, "value"));
|
|
914
885
|
return t === void 0 ? [] : [t];
|
|
915
|
-
}),
|
|
886
|
+
}), Pt = (e) => {
|
|
916
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
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
|
-
},
|
|
904
|
+
}, It = (e) => Y(e, "subject").flatMap((e) => {
|
|
934
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
|
-
}),
|
|
907
|
+
}), Lt = (e) => {
|
|
937
908
|
let t = Y(e, "hasFormat").flatMap((e) => {
|
|
938
909
|
let t = X(e, "file");
|
|
939
910
|
if (t === void 0) return [];
|
|
@@ -944,7 +915,7 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
944
915
|
}];
|
|
945
916
|
});
|
|
946
917
|
return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
|
|
947
|
-
}, $ = (e) => e.length > 0 ? e : void 0,
|
|
918
|
+
}, $ = (e) => e.length > 0 ? e : void 0, Rt = (e) => {
|
|
948
919
|
let t;
|
|
949
920
|
try {
|
|
950
921
|
t = new a(e);
|
|
@@ -952,12 +923,12 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
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 (
|
|
926
|
+
if (J(t.name).toLowerCase() !== "rdf") return;
|
|
956
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 i = [...new Set(
|
|
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
934
|
title: Z(X(n, "title")),
|
|
@@ -971,23 +942,9 @@ var o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (e, t, n) => {
|
|
|
971
942
|
subjects: $(o),
|
|
972
943
|
bookshelves: $(s),
|
|
973
944
|
contributors: $(c),
|
|
974
|
-
cover:
|
|
945
|
+
cover: Lt(n)
|
|
975
946
|
};
|
|
976
|
-
},
|
|
977
|
-
id: "identifiers",
|
|
978
|
-
title: "titles",
|
|
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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
|
|
1005
|
+
return j({
|
|
1049
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 o = (e, t) => t.has(e.scheme.trim().toLowerCase()), s = (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
|