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