@prose-reader/metadata-fetcher 1.340.0 → 1.342.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
@@ -44,7 +44,7 @@ var r = (e) => {
44
44
  "volume",
45
45
  "part",
46
46
  "book"
47
- ], ee = /\b(volumes?|vols?|parts?|books?)\s+([\p{L}\p{N}]+)\b/gu, g = {
47
+ ], g = /\b(volumes?|vols?|parts?|books?)\s+([\p{L}\p{N}]+)\b/gu, _ = {
48
48
  one: 1,
49
49
  first: 1,
50
50
  two: 2,
@@ -69,7 +69,7 @@ var r = (e) => {
69
69
  eleventh: 11,
70
70
  twelve: 12,
71
71
  twelfth: 12
72
- }, _ = {
72
+ }, v = {
73
73
  i: 1,
74
74
  v: 5,
75
75
  x: 10,
@@ -77,140 +77,161 @@ var r = (e) => {
77
77
  c: 100,
78
78
  d: 500,
79
79
  m: 1e3
80
- }, v = (e) => {
80
+ }, y = (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 = _[r];
84
+ let e = v[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
- }, y = (e) => /^\d+$/.test(e) ? Number.parseInt(e, 10) : g[e] ?? v(e), b = (e) => {
89
+ }, b = (e) => /^\d+$/.test(e) ? Number.parseInt(e, 10) : _[e] ?? y(e), x = (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
- }, x = (e) => {
93
+ }, S = (e) => {
94
94
  let t = /* @__PURE__ */ new Map();
95
- for (let n of l(e).matchAll(ee)) {
96
- let e = n[1] === void 0 ? void 0 : b(n[1]), r = n[2] === void 0 ? void 0 : y(n[2]);
95
+ for (let n of l(e).matchAll(g)) {
96
+ let e = n[1] === void 0 ? void 0 : x(n[1]), r = n[2] === void 0 ? void 0 : b(n[2]);
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
- }, S = (e, t) => {
103
- let n = x(e), r = x(t);
102
+ }, ee = (e, t) => {
103
+ let n = S(e), r = S(t);
104
104
  for (let e of h) {
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
- }, C = (e, t) => {
110
- if (S(e, t)) return 0;
109
+ }, te = (e, t) => {
110
+ if (ee(e, t)) return 0;
111
111
  let n = d(e, t), r = p(e), i = p(t);
112
112
  return r.hasSubtitle === i.hasSubtitle ? n : Math.max(n, d(r.main, i.main) * m);
113
- }, w = (e) => l(e).split(" ").filter((e) => e.length > 0).sort().join(" "), T = (e, t) => d(w(e), w(t)), E = {
113
+ }, C = (e) => l(e).split(" ").filter((e) => e.length > 0).sort().join(" "), w = (e, t) => d(C(e), C(t)), T = {
114
114
  isbn: 1,
115
115
  gtin: 1,
116
116
  identifiers: .6,
117
117
  title: .8,
118
- contributors: .5,
118
+ authors: .5,
119
119
  series: .3,
120
- "publication.original.date": .2,
121
- "publication.original.publisher": .15,
122
- "publication.edition.date": .2,
123
- "publication.edition.publisher": .15,
120
+ publishedYear: .2,
121
+ publisher: .15,
124
122
  languages: .15,
125
123
  numberOfPages: .15
126
- }, te = /* @__PURE__ */ new Set(["isbn", "gtin"]), D = (e) => {
124
+ }, ne = /* @__PURE__ */ new Set(["isbn", "gtin"]), E = (e) => {
127
125
  let t = e?.trim();
128
126
  return t !== void 0 && t.length > 0 ? t : void 0;
129
- }, ne = (e, t) => {
130
- let n = D(e.value)?.toLowerCase();
131
- return n !== void 0 && n === D(t.value)?.toLowerCase();
132
- }, O = (e) => D(e.scheme)?.toLowerCase(), re = (e) => e.scheme === void 0 ? e.value : `${e.scheme}:${e.value}`, ie = (e, t) => {
133
- if (!ne(e, t)) return !1;
127
+ }, D = (e, t) => {
128
+ let n = E(e.value)?.toLowerCase();
129
+ return n !== void 0 && n === E(t.value)?.toLowerCase();
130
+ }, O = (e) => E(e.scheme)?.toLowerCase(), re = (e) => e.scheme === void 0 ? e.value : `${e.scheme}:${e.value}`, ie = (e, t) => {
131
+ if (!D(e, t)) return !1;
134
132
  let n = O(e), r = O(t);
135
133
  return n === void 0 || r === void 0 || n === r;
136
134
  }, ae = (e, t) => {
137
- if (!ne(e, t)) return !1;
135
+ if (!D(e, t)) return !1;
138
136
  let n = O(e), r = O(t);
139
137
  return n !== void 0 && n === r;
140
- }, k = (e) => e.trim().toLowerCase().split("-")[0] ?? "", oe = (e, t) => {
138
+ }, oe = (e) => e.trim().toLowerCase().split("-")[0] ?? "", se = (e, t) => {
141
139
  let n = Math.abs(e - t);
142
140
  return n === 0 ? 1 : n === 1 ? .6 : n <= 3 ? .3 : 0;
143
- }, se = (e, t) => {
141
+ }, ce = (e, t) => {
144
142
  let n = Math.max(e, t);
145
143
  return n <= 0 ? 0 : Math.max(0, 1 - Math.abs(e - t) / n * 2);
146
- }, ce = (e, t, n) => e.reduce((e, r) => t.reduce((e, t) => Math.max(e, n(r, t)), e), 0), A = (e, t) => {
144
+ }, le = (e, t, n) => e.reduce((e, r) => t.reduce((e, t) => Math.max(e, n(r, t)), e), 0), ue = (e, t, n = d) => {
145
+ let r = E(e);
146
+ if (r === void 0) return;
147
+ let i;
148
+ for (let e of t) {
149
+ let t = E(e);
150
+ if (t === void 0) continue;
151
+ let a = {
152
+ score: n(r, t),
153
+ query: r,
154
+ candidate: t
155
+ };
156
+ (i === void 0 || a.score > i.score) && (i = a);
157
+ }
158
+ return i;
159
+ }, de = (e, t) => {
160
+ if (e === void 0) return;
161
+ let n;
162
+ for (let r of t) {
163
+ if (r === void 0) continue;
164
+ let t = {
165
+ score: se(e, r),
166
+ query: String(e),
167
+ candidate: String(r)
168
+ };
169
+ (n === void 0 || t.score > n.score) && (n = t);
170
+ }
171
+ return n;
172
+ }, k = (e, t) => {
147
173
  let n = [], i = (e, t) => {
148
174
  t !== void 0 && n.push({
149
175
  field: e,
150
- weight: E[e],
176
+ weight: T[e],
151
177
  score: Math.min(1, Math.max(0, t.score)),
152
178
  query: t.query,
153
179
  candidate: t.candidate
154
180
  });
155
181
  }, a = (e, t, n, r = d) => {
156
- let a = D(t), o = D(n);
182
+ let a = E(t), o = E(n);
157
183
  a === void 0 || o === void 0 || i(e, {
158
184
  score: r(a, o),
159
185
  query: a,
160
186
  candidate: o
161
187
  });
162
- }, s = D(e.isbn), c = D(t.isbn), l = s === void 0 ? void 0 : o(s), u = c === void 0 ? void 0 : o(c);
188
+ }, s = E(e.isbn), c = E(t.isbn), l = s === void 0 ? void 0 : o(s), u = c === void 0 ? void 0 : o(c);
163
189
  s !== void 0 && c !== void 0 && l !== void 0 && u !== void 0 && i("isbn", {
164
190
  score: +(l === u),
165
191
  query: s,
166
192
  candidate: c
167
193
  });
168
- let f = D(e.gtin), p = D(t.gtin);
194
+ let f = E(e.gtin), p = E(t.gtin);
169
195
  f !== void 0 && p !== void 0 && i("gtin", {
170
196
  score: +(f === p),
171
197
  query: f,
172
198
  candidate: p
173
199
  });
174
- let m = e.identifiers ?? [], h = t.identifiers ?? [], ee = m.some((e) => h.some((t) => ae(e, t)));
200
+ let m = e.identifiers ?? [], h = t.identifiers ?? [], g = m.some((e) => h.some((t) => ae(e, t)));
175
201
  m.length > 0 && h.length > 0 && i("identifiers", {
176
202
  score: +!!m.some((e) => h.some((t) => ie(e, t))),
177
203
  query: m.map(re).join(", "),
178
204
  candidate: h.map(re).join(", ")
179
- }), a("title", e.title, t.title, C), a("publication.original.publisher", e.publication?.original?.publisher, t.publication?.original?.publisher), a("publication.edition.publisher", e.publication?.edition?.publisher, t.publication?.edition?.publisher), a("series", e.belongsTo?.series?.[0]?.name, t.belongsTo?.series?.[0]?.name);
180
- let g = r(t), _ = r(e);
181
- _.length > 0 && g.length > 0 && i("contributors", {
182
- score: ce(_, g, T),
183
- query: _.join(", "),
184
- candidate: g.join(", ")
205
+ }), a("title", e.title, t.title, te), i("publisher", ue(e.publisher, [t.publication?.original?.publisher, t.publication?.edition?.publisher])), a("series", e.series, t.belongsTo?.series?.[0]?.name);
206
+ let _ = r(t), v = (e.authors ?? []).flatMap((e) => {
207
+ let t = E(e);
208
+ return t === void 0 ? [] : [t];
185
209
  });
186
- let v = (e, t, n) => {
187
- t === void 0 || n === void 0 || i(e, {
188
- score: oe(t, n),
189
- query: String(t),
190
- candidate: String(n)
191
- });
192
- };
193
- v("publication.original.date", e.publication?.original?.date?.year, t.publication?.original?.date?.year), v("publication.edition.date", e.publication?.edition?.date?.year, t.publication?.edition?.date?.year);
210
+ v.length > 0 && _.length > 0 && i("authors", {
211
+ score: le(v, _, w),
212
+ query: v.join(", "),
213
+ candidate: _.join(", ")
214
+ }), i("publishedYear", de(e.publishedYear, [t.publication?.original?.date?.year, t.publication?.edition?.date?.year]));
194
215
  let y = e.languages ?? [], b = t.languages ?? [];
195
216
  if (y.length > 0 && b.length > 0) {
196
- let e = new Set(b.map(k));
217
+ let e = new Set(b.map(oe));
197
218
  i("languages", {
198
- score: +!!y.some((t) => e.has(k(t))),
219
+ score: +!!y.some((t) => e.has(oe(t))),
199
220
  query: y.join(", "),
200
221
  candidate: b.join(", ")
201
222
  });
202
223
  }
203
224
  e.numberOfPages !== void 0 && t.numberOfPages !== void 0 && i("numberOfPages", {
204
- score: se(e.numberOfPages, t.numberOfPages),
225
+ score: ce(e.numberOfPages, t.numberOfPages),
205
226
  query: String(e.numberOfPages),
206
227
  candidate: String(t.numberOfPages)
207
228
  });
208
- let x = n.filter((e) => te.has(e.field));
229
+ let x = n.filter((e) => ne.has(e.field));
209
230
  if (x.some((e) => e.score === 0)) return {
210
231
  score: 0,
211
232
  signals: n
212
233
  };
213
- if (ee || x.some((e) => e.score === 1)) return {
234
+ if (g || x.some((e) => e.score === 1)) return {
214
235
  score: 1,
215
236
  signals: n
216
237
  };
@@ -222,76 +243,19 @@ var r = (e) => {
222
243
  score: n.reduce((e, t) => e + t.score * t.weight, 0) / S,
223
244
  signals: n
224
245
  };
225
- }, j = (e) => {
226
- let t = Object.entries(e).filter(([, e]) => e !== void 0);
227
- return Object.fromEntries(t);
228
- }, le = (e) => {
229
- let t = /* @__PURE__ */ new Map();
230
- for (let n of e) {
231
- let e = `${n.scheme?.trim().toLowerCase() ?? ""}:${n.value.trim().toLowerCase()}`, r = t.get(e);
232
- if (r === void 0) {
233
- t.set(e, n);
234
- continue;
235
- }
236
- n.unique === !0 && r.unique !== !0 && t.set(e, {
237
- ...r,
238
- unique: !0
239
- });
240
- }
241
- return [...t.values()];
242
- }, M = (...e) => {
243
- let t = e.filter((e) => e !== void 0), n = (e) => {
244
- for (let n of t) {
245
- let t = n[e];
246
- if (t !== void 0) return t;
247
- }
248
- }, r = le(t.flatMap((e) => e.identifiers ?? [])), i = j({
249
- series: t.find((e) => e.belongsTo?.series !== void 0)?.belongsTo?.series,
250
- collection: t.find((e) => e.belongsTo?.collection !== void 0)?.belongsTo?.collection
251
- }), a = (e) => {
252
- let n = j({
253
- date: t.find((t) => t.publication?.[e]?.date !== void 0)?.publication?.[e]?.date,
254
- publisher: t.find((t) => t.publication?.[e]?.publisher !== void 0)?.publication?.[e]?.publisher,
255
- imprint: t.find((t) => t.publication?.[e]?.imprint !== void 0)?.publication?.[e]?.imprint
256
- });
257
- return n.date !== void 0 || n.publisher !== void 0 || n.imprint !== void 0 ? n : void 0;
258
- }, o = j({
259
- original: a("original"),
260
- edition: a("edition")
261
- });
262
- return j({
263
- title: n("title"),
264
- cover: n("cover"),
265
- description: n("description"),
266
- publication: o.original !== void 0 || o.edition !== void 0 ? o : void 0,
267
- rights: n("rights"),
268
- languages: n("languages"),
269
- subjects: n("subjects"),
270
- contributors: n("contributors"),
271
- readingDirection: n("readingDirection"),
272
- renditionLayout: n("renditionLayout"),
273
- renditionFlow: n("renditionFlow"),
274
- renditionSpread: n("renditionSpread"),
275
- numberOfPages: n("numberOfPages"),
276
- gtin: n("gtin"),
277
- isbn: n("isbn"),
278
- identifiers: r.length > 0 ? r : void 0,
279
- belongsTo: Object.keys(i).length > 0 ? i : void 0,
280
- properties: n("properties"),
281
- comic: n("comic"),
282
- apple: n("apple"),
283
- kobo: n("kobo")
284
- });
285
- }, N = class extends Error {
246
+ }, A = class extends Error {
286
247
  status;
287
248
  constructor(e, t) {
288
249
  super(t ?? `Provider responded with status ${e}`), this.name = "MetadataProviderResponseError", this.status = e;
289
250
  }
290
- }, ue = (e) => {
251
+ }, j = (e) => {
291
252
  if (typeof e != "object" || !e || !("status" in e)) return;
292
253
  let { status: t } = e;
293
254
  if (!(typeof t != "number" || !Number.isInteger(t))) return t >= 100 && t <= 599 ? t : void 0;
294
- }, de = t.namespace("@prose-reader/metadata-fetcher", void 0, { color: "#b06642" }), fe = 5, pe = .5, me = 2, he = ({ candidate: e, providerId: t, score: n, signals: r, accepted: i, includeRaw: a }) => j({
255
+ }, M = t.namespace("@prose-reader/metadata-fetcher", void 0, { color: "#b06642" }), N = (e) => {
256
+ let t = Object.entries(e).filter(([, e]) => e !== void 0);
257
+ return Object.fromEntries(t);
258
+ }, fe = 5, pe = .5, me = 4, he = ({ candidate: e, providerId: t, score: n, signals: r, accepted: i, includeRaw: a }) => N({
295
259
  providerId: t,
296
260
  score: n,
297
261
  signals: r,
@@ -301,58 +265,73 @@ var r = (e) => {
301
265
  url: e.url,
302
266
  raw: a ? e.raw : void 0
303
267
  }), ge = async (e, t) => {
304
- let n = "metadata" in e ? e.metadata : e, r = t.limit ?? fe, i = t.minScore ?? pe, a = t.includeRaw === !0, o = await Promise.all(t.providers.map(async (e) => {
268
+ let n = t.limit ?? fe, r = t.minScore ?? pe, i = t.includeRaw === !0, a = await Promise.all(t.providers.map(async (r) => {
305
269
  try {
306
270
  return {
307
- provider: e,
308
- candidates: await e.search(n, {
309
- limit: r,
271
+ provider: r,
272
+ candidates: await r.search(e, {
273
+ limit: n,
310
274
  signal: t.signal
311
275
  }),
312
276
  failure: void 0
313
277
  };
314
- } catch (n) {
315
- if (t.signal?.aborted === !0) throw n;
316
- return de.error(`fetchMetadata: provider "${e.id}" failed`, n), {
317
- provider: e,
278
+ } catch (e) {
279
+ if (t.signal?.aborted === !0) throw e;
280
+ return M.error(`fetchMetadata: provider "${r.id}" failed`, e), {
281
+ provider: r,
318
282
  candidates: void 0,
319
- failure: j({
320
- id: e.id,
321
- status: ue(n)
283
+ failure: N({
284
+ id: r.id,
285
+ status: j(e)
322
286
  })
323
287
  };
324
288
  }
325
- })), s = o.flatMap((e) => e.failure === void 0 ? [] : [e.failure]), c = {}, l = [];
326
- for (let { provider: e, candidates: t } of o) {
327
- if (t === void 0) continue;
328
- let o = t.map((t) => {
329
- let { score: r, signals: o } = A(n, t.metadata);
289
+ })), o = a.flatMap((e) => e.failure === void 0 ? [] : [e.failure]), s = {}, c = [];
290
+ for (let { provider: t, candidates: o } of a) {
291
+ if (o === void 0) continue;
292
+ let a = o.map((n) => {
293
+ let { score: a, signals: o } = k(e, n.metadata);
330
294
  return he({
331
- candidate: t,
332
- providerId: e.id,
333
- score: r,
295
+ candidate: n,
296
+ providerId: t.id,
297
+ score: a,
334
298
  signals: o,
335
- accepted: r >= i,
336
- includeRaw: a
299
+ accepted: a >= r,
300
+ includeRaw: i
337
301
  });
338
- }).sort((e, t) => t.score - e.score).slice(0, r);
339
- c[e.id] !== void 0 && de.warn(`fetchMetadata: several providers share the id "${e.id}"`), c[e.id] = {
302
+ }).sort((e, t) => t.score - e.score).slice(0, n);
303
+ s[t.id] !== void 0 && M.warn(`fetchMetadata: several providers share the id "${t.id}"`), s[t.id] = {
340
304
  provider: {
341
- id: e.id,
342
- name: e.name
305
+ id: t.id,
306
+ name: t.name
343
307
  },
344
- matches: o
345
- }, l.push(...o);
308
+ matches: a
309
+ }, c.push(...a);
346
310
  }
347
- let u = [...l].sort((e, t) => t.score - e.score);
348
311
  return {
349
312
  version: me,
350
- metadata: M(...u.filter((e) => e.accepted).map((e) => e.metadata)),
351
- matches: u,
352
- sources: c,
353
- failedProviders: s
313
+ matches: [...c].sort((e, t) => t.score - e.score),
314
+ sources: s,
315
+ failedProviders: o
354
316
  };
355
- }, P = "ProjectGutenberg", _e = /* @__PURE__ */ new Set(["gutenberg.org", "www.gutenberg.org"]), ve = [
317
+ }, _e = (e) => {
318
+ let { metadata: t } = e, n = r(t), i = t.identifiers?.map(({ value: e, scheme: t }) => N({
319
+ value: e,
320
+ scheme: t
321
+ }));
322
+ return N({
323
+ title: t.title,
324
+ authors: n.length > 0 ? n : void 0,
325
+ isbn: t.isbn,
326
+ gtin: t.gtin,
327
+ identifiers: i !== void 0 && i.length > 0 ? i : void 0,
328
+ series: t.belongsTo?.series?.[0]?.name,
329
+ publisher: t.publication?.edition?.publisher ?? t.publication?.original?.publisher,
330
+ publishedYear: t.publication?.edition?.date?.year ?? t.publication?.original?.date?.year,
331
+ languages: t.languages,
332
+ numberOfPages: t.numberOfPages
333
+ });
334
+ }, P = "ProjectGutenberg", ve = /* @__PURE__ */ new Set(["gutenberg.org", "www.gutenberg.org"]), ye = [
356
335
  /^\/ebooks\/(\d+)(?:[./]|$)/i,
357
336
  /^\/files\/(\d+)(?:\/|$)/i,
358
337
  /^\/cache\/epub\/(\d+)(?:\/|$)/i,
@@ -362,11 +341,11 @@ var r = (e) => {
362
341
  if (!/^\d+$/.test(t)) return;
363
342
  let n = t.replace(/^0+(?=\d)/, "");
364
343
  return n === "0" ? void 0 : n;
365
- }, ye = (e) => {
344
+ }, be = (e) => {
366
345
  try {
367
346
  let t = new URL(e.trim());
368
- if (t.protocol !== "http:" && t.protocol !== "https:" || !_e.has(t.hostname.toLowerCase())) return;
369
- for (let e of ve) {
347
+ if (t.protocol !== "http:" && t.protocol !== "https:" || !ve.has(t.hostname.toLowerCase())) return;
348
+ for (let e of ye) {
370
349
  let n = e.exec(t.pathname)?.[1];
371
350
  if (n !== void 0) return F(n);
372
351
  }
@@ -375,7 +354,7 @@ var r = (e) => {
375
354
  }
376
355
  }, I = (e) => {
377
356
  for (let t of e.identifiers ?? []) {
378
- let e = t.scheme?.trim().toLowerCase(), n = e === "projectgutenberg" ? F(t.value) : e === void 0 || e === "url" || e === "uri" ? ye(t.value) : void 0;
357
+ let e = t.scheme?.trim().toLowerCase(), n = e === "projectgutenberg" ? F(t.value) : e === void 0 || e === "url" || e === "uri" ? be(t.value) : void 0;
379
358
  if (n !== void 0) return {
380
359
  id: n,
381
360
  identifier: {
@@ -397,10 +376,10 @@ var r = (e) => {
397
376
  if (!Array.isArray(n)) return;
398
377
  let r = n.filter((e) => typeof e == "string").map((e) => e.trim()).filter((e) => e.length > 0);
399
378
  return r.length > 0 ? r : void 0;
400
- }, be = (e, t) => {
379
+ }, xe = (e, t) => {
401
380
  let n = e[t];
402
381
  return Array.isArray(n) ? n.filter(L) : [];
403
- }, xe = (e) => ({
382
+ }, Se = (e) => ({
404
383
  key: R(e, "key"),
405
384
  title: R(e, "title"),
406
385
  subtitle: R(e, "subtitle"),
@@ -411,7 +390,7 @@ var r = (e) => {
411
390
  number_of_pages_median: z(e, "number_of_pages_median"),
412
391
  cover_i: z(e, "cover_i"),
413
392
  id_project_gutenberg: B(e, "id_project_gutenberg")
414
- }), V = (e) => L(e) ? be(e, "docs").map(xe) : [], Se = {
393
+ }), V = (e) => L(e) ? xe(e, "docs").map(Se) : [], Ce = {
415
394
  afr: "af",
416
395
  alb: "sq",
417
396
  amh: "am",
@@ -516,15 +495,15 @@ var r = (e) => {
516
495
  wel: "cy",
517
496
  yid: "yi",
518
497
  zho: "zh"
519
- }, Ce = /* @__PURE__ */ new Set([
498
+ }, we = /* @__PURE__ */ new Set([
520
499
  "mul",
521
500
  "und",
522
501
  "zxx",
523
502
  "sgn"
524
503
  ]), H = (e) => {
525
504
  let t = e.trim().toLowerCase();
526
- if (t.length !== 0 && !Ce.has(t)) return Se[t] ?? t;
527
- }, we = 25, Te = {
505
+ if (t.length !== 0 && !we.has(t)) return Ce[t] ?? t;
506
+ }, Te = 25, Ee = {
528
507
  key: "identifiers",
529
508
  title: "title",
530
509
  subtitle: "title",
@@ -535,7 +514,7 @@ var r = (e) => {
535
514
  number_of_pages_median: "numberOfPages",
536
515
  cover_i: "cover",
537
516
  id_project_gutenberg: "identifiers"
538
- }, U = "OpenLibrary", Ee = "ProjectGutenberg", W = (e) => e.length > 0 ? e : void 0, G = (e, t) => {
517
+ }, U = "OpenLibrary", De = "ProjectGutenberg", W = (e) => e.length > 0 ? e : void 0, G = (e, t) => {
539
518
  let n = e.title !== void 0 && e.subtitle !== void 0 ? `${e.title}: ${e.subtitle}` : e.title, r = W([...new Set((e.language ?? []).map(H).filter((e) => e !== void 0))]), i = [
540
519
  ...t.isbn === void 0 ? [] : [{
541
520
  value: t.isbn,
@@ -544,14 +523,14 @@ var r = (e) => {
544
523
  ...t.matchedProjectGutenbergIdentifier === void 0 ? [] : [t.matchedProjectGutenbergIdentifier],
545
524
  ...(e.id_project_gutenberg ?? []).map((e) => ({
546
525
  value: e,
547
- scheme: Ee
526
+ scheme: De
548
527
  })),
549
528
  ...e.key === void 0 ? [] : [{
550
529
  value: e.key,
551
530
  scheme: U
552
531
  }]
553
532
  ];
554
- return j({
533
+ return N({
555
534
  title: n,
556
535
  cover: e.cover_i === void 0 ? void 0 : {
557
536
  uri: `${t.coversBaseUrl}/b/id/${e.cover_i}-L.jpg`,
@@ -569,7 +548,7 @@ var r = (e) => {
569
548
  isbn: t.isbn,
570
549
  identifiers: W(i)
571
550
  });
572
- }, K = "openLibrary", De = "https://openlibrary.org", Oe = "https://covers.openlibrary.org", ke = [
551
+ }, Oe = "openLibrary", ke = "https://openlibrary.org", Ae = "https://covers.openlibrary.org", je = [
573
552
  "key",
574
553
  "title",
575
554
  "subtitle",
@@ -580,19 +559,19 @@ var r = (e) => {
580
559
  "number_of_pages_median",
581
560
  "cover_i",
582
561
  "id_project_gutenberg"
583
- ].join(","), Ae = (e) => {
562
+ ].join(","), Me = (e) => {
584
563
  let t = e.title?.trim();
585
564
  if (t === void 0 || t.length === 0) return;
586
- let n = r(e)[0];
565
+ let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
587
566
  return {
588
567
  title: t,
589
568
  ...n === void 0 ? {} : { author: n }
590
569
  };
591
- }, je = (e = {}) => {
592
- let t = e.baseUrl ?? De, n = e.coversBaseUrl ?? Oe, r = async (n, r) => {
570
+ }, Ne = (e = {}) => {
571
+ let t = e.baseUrl ?? ke, n = e.coversBaseUrl ?? Ae, r = async (n, r) => {
593
572
  let i = new URL("/search.json", t);
594
573
  for (let [e, t] of Object.entries(n)) i.searchParams.set(e, t);
595
- i.searchParams.set("fields", ke), i.searchParams.set("limit", String(r.limit));
574
+ i.searchParams.set("fields", je), i.searchParams.set("limit", String(r.limit));
596
575
  let a = await (e.fetch ?? globalThis.fetch)(i.toString(), {
597
576
  signal: r.signal,
598
577
  headers: {
@@ -600,7 +579,7 @@ var r = (e) => {
600
579
  ...e.userAgent === void 0 ? {} : { "User-Agent": e.userAgent }
601
580
  }
602
581
  });
603
- if (!a.ok) throw new N(a.status, `Open Library search failed with status ${a.status}`);
582
+ if (!a.ok) throw new A(a.status, `Open Library search failed with status ${a.status}`);
604
583
  return V(await a.json());
605
584
  }, i = (e, r = {}) => e.map((e) => ({
606
585
  metadata: G(e, {
@@ -613,7 +592,7 @@ var r = (e) => {
613
592
  raw: e
614
593
  }));
615
594
  return {
616
- id: K,
595
+ id: Oe,
617
596
  name: "Open Library",
618
597
  search: async (e, t) => {
619
598
  let n = e.isbn?.trim() || void 0, a = I(e);
@@ -625,55 +604,55 @@ var r = (e) => {
625
604
  let e = await r({ q: `id_project_gutenberg:${a.id}` }, t);
626
605
  if (e.length > 0) return i(e, { confirmedProjectGutenberg: a });
627
606
  }
628
- let o = Ae(e);
607
+ let o = Me(e);
629
608
  return o === void 0 ? [] : i(await r(o, t));
630
609
  }
631
610
  };
632
- }, q = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, Me = (e) => e.type === "element", J = (e, t) => e.children.filter((e) => Me(e) && q(e.name).toLowerCase() === t.toLowerCase()), Y = (e, t) => J(e, t)[0], X = (e) => {
611
+ }, K = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, Pe = (e) => e.type === "element", q = (e, t) => e.children.filter((e) => Pe(e) && K(e.name).toLowerCase() === t.toLowerCase()), J = (e, t) => q(e, t)[0], Y = (e) => {
633
612
  let t = e?.val.trim();
634
613
  return t !== void 0 && t.length > 0 ? t : void 0;
635
- }, Z = (e, t) => {
614
+ }, X = (e, t) => {
636
615
  for (let [n, r] of Object.entries(e.attr)) {
637
- if (q(n).toLowerCase() !== t.toLowerCase()) continue;
616
+ if (K(n).toLowerCase() !== t.toLowerCase()) continue;
638
617
  let e = r.trim();
639
618
  if (e.length > 0) return e;
640
619
  }
641
- }, Ne = (e, t) => J(e, t).flatMap((e) => {
642
- let t = X(Y(Y(e, "Description") ?? e, "value"));
620
+ }, Fe = (e, t) => q(e, t).flatMap((e) => {
621
+ let t = Y(J(J(e, "Description") ?? e, "value"));
643
622
  return t === void 0 ? [] : [t];
644
- }), Pe = (e) => {
645
- let t = Z(e, "about"), n = t === void 0 ? void 0 : /(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];
623
+ }), Ie = (e) => {
624
+ let t = X(e, "about"), n = t === void 0 ? void 0 : /(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];
646
625
  if (n === void 0) return;
647
626
  let r = n.replace(/^0+(?=\d)/, "");
648
627
  return r === "0" ? void 0 : r;
649
- }, Fe = (e) => {
628
+ }, Le = (e) => {
650
629
  let t = [];
651
630
  for (let n of e.children) {
652
- if (!Me(n)) continue;
631
+ if (!Pe(n)) continue;
653
632
  let e = n.name.toLowerCase() === "dcterms:creator", r = n.name.toLowerCase().startsWith("marcrel:");
654
633
  if (!e && !r) continue;
655
- let i = X(Y(Y(n, "agent") ?? n, "name"));
634
+ let i = Y(J(J(n, "agent") ?? n, "name"));
656
635
  i !== void 0 && t.push({
657
636
  name: i,
658
- role: e ? "aut" : q(n.name).toLowerCase()
637
+ role: e ? "aut" : K(n.name).toLowerCase()
659
638
  });
660
639
  }
661
640
  return t;
662
- }, Ie = (e) => J(e, "subject").flatMap((e) => {
663
- 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"));
641
+ }, Re = (e) => q(e, "subject").flatMap((e) => {
642
+ let t = J(e, "Description"), n = t === void 0 ? void 0 : X(J(t, "memberOf") ?? t, "resource"), r = Y(t === void 0 ? void 0 : J(t, "value"));
664
643
  return r !== void 0 && n?.endsWith("/LCSH") === !0 ? [r] : [];
665
- }), Le = (e) => {
666
- let t = J(e, "hasFormat").flatMap((e) => {
667
- let t = Y(e, "file");
644
+ }), ze = (e) => {
645
+ let t = q(e, "hasFormat").flatMap((e) => {
646
+ let t = J(e, "file");
668
647
  if (t === void 0) return [];
669
- let n = Z(t, "about"), r = J(t, "format").map((e) => X(Y(Y(e, "Description") ?? e, "value"))).find((e) => e?.startsWith("image/") === !0);
648
+ let n = X(t, "about"), r = q(t, "format").map((e) => Y(J(J(e, "Description") ?? e, "value"))).find((e) => e?.startsWith("image/") === !0);
670
649
  return n === void 0 || r === void 0 || !/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n) ? [] : [{
671
650
  uri: n,
672
651
  mediaType: r
673
652
  }];
674
653
  });
675
654
  return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
676
- }, Q = (e) => e.length > 0 ? e : void 0, Re = (e) => {
655
+ }, Z = (e) => e.length > 0 ? e : void 0, Be = (e) => {
677
656
  let t;
678
657
  try {
679
658
  t = new n(e);
@@ -681,28 +660,28 @@ var r = (e) => {
681
660
  let t = e instanceof Error ? e.message : String(e);
682
661
  throw Error(`Project Gutenberg RDF is malformed: ${t}`, { cause: e });
683
662
  }
684
- if (q(t.name).toLowerCase() !== "rdf") return;
685
- let r = Y(t, "ebook");
663
+ if (K(t.name).toLowerCase() !== "rdf") return;
664
+ let r = J(t, "ebook");
686
665
  if (r === void 0) return;
687
- let i = Pe(r);
666
+ let i = Ie(r);
688
667
  if (i === void 0) return;
689
- let a = [...new Set(Ne(r, "language"))], o = [...new Set(Ie(r))], s = [...new Set(Ne(r, "bookshelf"))], c = Fe(r);
668
+ let a = [...new Set(Fe(r, "language"))], o = [...new Set(Re(r))], s = [...new Set(Fe(r, "bookshelf"))], c = Le(r);
690
669
  return {
691
670
  id: i,
692
- title: X(Y(r, "title")),
693
- publisher: X(Y(r, "publisher")),
694
- issued: X(Y(r, "issued")),
695
- originalPublication: X(Y(r, "marc260")),
696
- rights: X(Y(r, "rights")),
697
- description: X(Y(r, "description")),
698
- summary: X(Y(r, "marc520")),
699
- languages: Q(a),
700
- subjects: Q(o),
701
- bookshelves: Q(s),
702
- contributors: Q(c),
703
- cover: Le(r)
671
+ title: Y(J(r, "title")),
672
+ publisher: Y(J(r, "publisher")),
673
+ issued: Y(J(r, "issued")),
674
+ originalPublication: Y(J(r, "marc260")),
675
+ rights: Y(J(r, "rights")),
676
+ description: Y(J(r, "description")),
677
+ summary: Y(J(r, "marc520")),
678
+ languages: Z(a),
679
+ subjects: Z(o),
680
+ bookshelves: Z(s),
681
+ contributors: Z(c),
682
+ cover: ze(r)
704
683
  };
705
- }, ze = 25, Be = {
684
+ }, Ve = 25, He = {
706
685
  id: "identifiers",
707
686
  title: "title",
708
687
  publisher: "publication.edition.publisher",
@@ -716,7 +695,7 @@ var r = (e) => {
716
695
  bookshelves: "subjects",
717
696
  contributors: "contributors",
718
697
  cover: "cover"
719
- }, Ve = {
698
+ }, Ue = {
720
699
  art: "artist",
721
700
  aut: "author",
722
701
  clr: "colorist",
@@ -725,17 +704,17 @@ var r = (e) => {
725
704
  ill: "illustrator",
726
705
  nrt: "narrator",
727
706
  trl: "translator"
728
- }, He = (e) => {
707
+ }, We = (e) => {
729
708
  let t = /* @__PURE__ */ new Map();
730
709
  for (let n of e.contributors ?? []) {
731
- let e = n.name.trim().toLowerCase(), r = Ve[n.role.trim().toLowerCase()] ?? n.role, i = t.get(e);
710
+ let e = n.name.trim().toLowerCase(), r = Ue[n.role.trim().toLowerCase()] ?? n.role, i = t.get(e);
732
711
  i === void 0 ? t.set(e, {
733
712
  name: n.name,
734
713
  roles: [r]
735
714
  }) : i.roles.includes(r) || i.roles.push(r);
736
715
  }
737
716
  return t.size > 0 ? [...t.values()] : void 0;
738
- }, Ue = (e) => {
717
+ }, Ge = (e) => {
739
718
  if (e === void 0) return;
740
719
  let t = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());
741
720
  if (t === null) return;
@@ -745,48 +724,48 @@ var r = (e) => {
745
724
  ...r === void 0 ? {} : { month: r },
746
725
  ...i === void 0 ? {} : { day: i }
747
726
  };
748
- }, We = (e, t) => e.split("$").slice(1).flatMap((e) => e[0]?.toLowerCase() === t.toLowerCase() ? [e.slice(1).trim()] : []).filter((e) => e.length > 0), Ge = (e) => {
727
+ }, Q = (e, t) => e.split("$").slice(1).flatMap((e) => e[0]?.toLowerCase() === t.toLowerCase() ? [e.slice(1).trim()] : []).filter((e) => e.length > 0), Ke = (e) => {
749
728
  if (e === void 0) return;
750
- let t = We(e, "b"), n = (t.length === 1 ? t[0] : void 0)?.replace(/[\s,;:/]+$/u, "").trim(), r = We(e, "c"), i = [...new Set(r.flatMap((e) => [...e.matchAll(/\d{4}/g)].flatMap((e) => e[0] === void 0 ? [] : [Number(e[0])])))], a = j({
729
+ let t = Q(e, "b"), n = (t.length === 1 ? t[0] : void 0)?.replace(/[\s,;:/]+$/u, "").trim(), r = Q(e, "c"), i = [...new Set(r.flatMap((e) => [...e.matchAll(/\d{4}/g)].flatMap((e) => e[0] === void 0 ? [] : [Number(e[0])])))], a = N({
751
730
  date: i.length === 1 ? { year: i[0] } : void 0,
752
731
  publisher: n !== void 0 && n.length > 0 && !/^\[?s\.n\.?\]?$/i.test(n) ? n : void 0
753
732
  });
754
733
  return a.date !== void 0 || a.publisher !== void 0 ? a : void 0;
755
- }, Ke = (e, t) => {
734
+ }, qe = (e, t) => {
756
735
  try {
757
736
  let n = new URL(e, t);
758
737
  return n.protocol === "http:" || n.protocol === "https:" ? n.toString() : void 0;
759
738
  } catch {
760
739
  return;
761
740
  }
762
- }, qe = (e) => e.length > 0 ? e : void 0, Je = (e, t) => {
741
+ }, Je = (e) => e.length > 0 ? e : void 0, Ye = (e, t) => {
763
742
  let n = [t.matchedIdentifier, {
764
743
  value: e.id,
765
744
  scheme: P
766
- }].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 : Ke(e.cover.uri, t.baseUrl), a = i === void 0 ? void 0 : {
745
+ }].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme?.trim().toLowerCase() === e.scheme?.trim().toLowerCase()) === t), r = [.../* @__PURE__ */ new Set([...e.subjects ?? [], ...e.bookshelves ?? []])].slice(0, 25), i = e.cover === void 0 ? void 0 : qe(e.cover.uri, t.baseUrl), a = i === void 0 ? void 0 : {
767
746
  uri: i,
768
747
  mediaType: e.cover?.mediaType,
769
748
  confidence: "derived"
770
- }, o = j({
771
- date: Ue(e.issued),
749
+ }, o = N({
750
+ date: Ge(e.issued),
772
751
  publisher: e.publisher
773
- }), s = j({
774
- original: Ge(e.originalPublication),
752
+ }), s = N({
753
+ original: Ke(e.originalPublication),
775
754
  edition: o.date !== void 0 || o.publisher !== void 0 ? o : void 0
776
755
  });
777
- return j({
756
+ return N({
778
757
  title: e.title,
779
758
  publication: s.original !== void 0 || s.edition !== void 0 ? s : void 0,
780
759
  description: e.summary ?? e.description,
781
760
  rights: e.rights,
782
- languages: qe([...new Set(e.languages ?? [])]),
783
- subjects: qe(r),
784
- contributors: He(e),
761
+ languages: Je([...new Set(e.languages ?? [])]),
762
+ subjects: Je(r),
763
+ contributors: We(e),
785
764
  identifiers: n,
786
765
  cover: a
787
766
  });
788
- }, $ = "projectGutenberg", Ye = "https://www.gutenberg.org", Xe = (e = {}) => {
789
- let t = e.baseUrl ?? Ye;
767
+ }, $ = "projectGutenberg", Xe = "https://www.gutenberg.org", Ze = (e = {}) => {
768
+ let t = e.baseUrl ?? Xe;
790
769
  return {
791
770
  id: $,
792
771
  name: "Project Gutenberg",
@@ -801,28 +780,28 @@ var r = (e) => {
801
780
  }
802
781
  });
803
782
  if (o.status === 404) return [];
804
- if (!o.ok) throw new N(o.status, `Project Gutenberg metadata lookup failed with status ${o.status}`);
805
- let s = Re(await o.text());
783
+ if (!o.ok) throw new A(o.status, `Project Gutenberg metadata lookup failed with status ${o.status}`);
784
+ let s = Be(await o.text());
806
785
  if (s === void 0 || s.id !== i.id) throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);
807
786
  let c = new URL(`/ebooks/${i.id}`, t).toString();
808
787
  return [{
809
788
  id: s.id,
810
789
  url: c,
811
790
  raw: s,
812
- metadata: Je(s, {
791
+ metadata: Ye(s, {
813
792
  baseUrl: t,
814
793
  matchedIdentifier: i.identifier
815
794
  })
816
795
  }];
817
796
  }
818
797
  };
819
- }, Ze = (e) => [
798
+ }, Qe = (e) => [
820
799
  e.title,
821
800
  e.isbn,
822
801
  e.gtin,
823
- e.belongsTo?.series?.[0]?.name
824
- ].some((e) => e !== void 0 && e.trim().length > 0) || (e.identifiers ?? []).length > 0 || r(e).length > 0;
802
+ e.series
803
+ ].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);
825
804
  //#endregion
826
- export { E as METADATA_MATCH_WEIGHTS, N as MetadataProviderResponseError, U as OPEN_LIBRARY_IDENTIFIER_SCHEME, we as OPEN_LIBRARY_MAX_SUBJECTS, K as OPEN_LIBRARY_PROVIDER_ID, P as PROJECT_GUTENBERG_IDENTIFIER_SCHEME, ze as PROJECT_GUTENBERG_MAX_SUBJECTS, $ as PROJECT_GUTENBERG_PROVIDER_ID, je as createOpenLibraryProvider, Xe as createProjectGutenbergProvider, ge as fetchMetadata, Ze as hasSearchTerms, H as marcLanguageToBcp47, M as mergeResolvedMetadata, r as metadataAuthors, l as normalizeForComparison, Te as openLibraryMetadataHomes, V as parseOpenLibrarySearchResponse, Re as parseProjectGutenbergRdf, T as personNameSimilarity, I as projectGutenbergLookupFromMetadata, Be as projectGutenbergMetadataHomes, G as resolveOpenLibraryDoc, Je as resolveProjectGutenbergRecord, ue as responseErrorStatus, A as scoreMetadataCandidate, d as textSimilarity, C as titleSimilarity, o as toIsbn13 };
805
+ export { T as METADATA_MATCH_WEIGHTS, A as MetadataProviderResponseError, U as OPEN_LIBRARY_IDENTIFIER_SCHEME, Te as OPEN_LIBRARY_MAX_SUBJECTS, Oe as OPEN_LIBRARY_PROVIDER_ID, P as PROJECT_GUTENBERG_IDENTIFIER_SCHEME, Ve as PROJECT_GUTENBERG_MAX_SUBJECTS, $ as PROJECT_GUTENBERG_PROVIDER_ID, Ne as createOpenLibraryProvider, Ze as createProjectGutenbergProvider, ge as fetchMetadata, Qe as hasSearchTerms, H as marcLanguageToBcp47, r as metadataAuthors, _e as metadataInputFromResolvedArchive, l as normalizeForComparison, Ee as openLibraryMetadataHomes, V as parseOpenLibrarySearchResponse, Be as parseProjectGutenbergRdf, w as personNameSimilarity, I as projectGutenbergLookupFromInput, He as projectGutenbergMetadataHomes, G as resolveOpenLibraryDoc, Ye as resolveProjectGutenbergRecord, j as responseErrorStatus, k as scoreMetadataCandidate, d as textSimilarity, te as titleSimilarity, o as toIsbn13 };
827
806
 
828
807
  //# sourceMappingURL=index.js.map