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