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