@prose-reader/metadata-fetcher 1.341.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
@@ -99,142 +99,163 @@ var r = (e) => {
99
99
  i.add(r), t.set(e, i);
100
100
  }
101
101
  return t;
102
- }, C = (e, t) => {
102
+ }, ee = (e, t) => {
103
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
- }, w = (e, t) => {
110
- if (C(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
- }, T = (e) => l(e).split(" ").filter((e) => e.length > 0).sort().join(" "), E = (e, t) => d(T(e), T(t)), D = {
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
- }, ee = /* @__PURE__ */ new Set(["isbn", "gtin"]), O = (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
- }, k = (e, t) => {
130
- let n = O(e.value)?.toLowerCase();
131
- return n !== void 0 && n === O(t.value)?.toLowerCase();
132
- }, A = (e) => O(e.scheme)?.toLowerCase(), te = (e) => e.scheme === void 0 ? e.value : `${e.scheme}:${e.value}`, ne = (e, t) => {
133
- if (!k(e, t)) return !1;
134
- let n = A(e), r = A(t);
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;
132
+ let n = O(e), r = O(t);
135
133
  return n === void 0 || r === void 0 || n === r;
136
- }, re = (e, t) => {
137
- if (!k(e, t)) return !1;
138
- let n = A(e), r = A(t);
134
+ }, ae = (e, t) => {
135
+ if (!D(e, t)) return !1;
136
+ let n = O(e), r = O(t);
139
137
  return n !== void 0 && n === r;
140
- }, ie = (e) => e.trim().toLowerCase().split("-")[0] ?? "", ae = (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
- }, oe = (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
- }, se = (e, t, n) => e.reduce((e, r) => t.reduce((e, t) => Math.max(e, n(r, t)), e), 0), ce = (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: D[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 = O(t), o = O(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 = O(e.isbn), c = O(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 = O(e.gtin), p = O(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 ?? [], g = m.some((e) => h.some((t) => re(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
- score: +!!m.some((e) => h.some((t) => ne(e, t))),
177
- query: m.map(te).join(", "),
178
- candidate: h.map(te).join(", ")
179
- }), a("title", e.title, t.title, w), 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 _ = r(t), v = r(e);
181
- v.length > 0 && _.length > 0 && i("contributors", {
182
- score: se(v, _, E),
202
+ score: +!!m.some((e) => h.some((t) => ie(e, t))),
203
+ query: m.map(re).join(", "),
204
+ candidate: h.map(re).join(", ")
205
+ }), a("title", e.title, t.title, te), i("publisher", ue(e.publisher, [t.publication?.original?.publisher, t.publication?.edition?.publisher])), a("series", e.series, t.belongsTo?.series?.[0]?.name);
206
+ let _ = r(t), v = (e.authors ?? []).flatMap((e) => {
207
+ let t = E(e);
208
+ return t === void 0 ? [] : [t];
209
+ });
210
+ v.length > 0 && _.length > 0 && i("authors", {
211
+ score: le(v, _, w),
183
212
  query: v.join(", "),
184
213
  candidate: _.join(", ")
185
- });
186
- let y = (e, t, n) => {
187
- t === void 0 || n === void 0 || i(e, {
188
- score: ae(t, n),
189
- query: String(t),
190
- candidate: String(n)
191
- });
192
- };
193
- y("publication.original.date", e.publication?.original?.date?.year, t.publication?.original?.date?.year), y("publication.edition.date", e.publication?.edition?.date?.year, t.publication?.edition?.date?.year);
194
- let b = e.languages ?? [], x = t.languages ?? [];
195
- if (b.length > 0 && x.length > 0) {
196
- let e = new Set(x.map(ie));
214
+ }), i("publishedYear", de(e.publishedYear, [t.publication?.original?.date?.year, t.publication?.edition?.date?.year]));
215
+ let y = e.languages ?? [], b = t.languages ?? [];
216
+ if (y.length > 0 && b.length > 0) {
217
+ let e = new Set(b.map(oe));
197
218
  i("languages", {
198
- score: +!!b.some((t) => e.has(ie(t))),
199
- query: b.join(", "),
200
- candidate: x.join(", ")
219
+ score: +!!y.some((t) => e.has(oe(t))),
220
+ query: y.join(", "),
221
+ candidate: b.join(", ")
201
222
  });
202
223
  }
203
224
  e.numberOfPages !== void 0 && t.numberOfPages !== void 0 && i("numberOfPages", {
204
- score: oe(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 S = n.filter((e) => ee.has(e.field));
209
- if (S.some((e) => e.score === 0)) return {
229
+ let x = n.filter((e) => ne.has(e.field));
230
+ if (x.some((e) => e.score === 0)) return {
210
231
  score: 0,
211
232
  signals: n
212
233
  };
213
- if (g || S.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
  };
217
- let C = n.reduce((e, t) => e + t.weight, 0);
218
- return C === 0 ? {
238
+ let S = n.reduce((e, t) => e + t.weight, 0);
239
+ return S === 0 ? {
219
240
  score: 0,
220
241
  signals: n
221
242
  } : {
222
- score: n.reduce((e, t) => e + t.score * t.weight, 0) / C,
243
+ score: n.reduce((e, t) => e + t.score * t.weight, 0) / S,
223
244
  signals: n
224
245
  };
225
- }, j = class extends Error {
246
+ }, A = class extends Error {
226
247
  status;
227
248
  constructor(e, t) {
228
249
  super(t ?? `Provider responded with status ${e}`), this.name = "MetadataProviderResponseError", this.status = e;
229
250
  }
230
- }, M = (e) => {
251
+ }, j = (e) => {
231
252
  if (typeof e != "object" || !e || !("status" in e)) return;
232
253
  let { status: t } = e;
233
254
  if (!(typeof t != "number" || !Number.isInteger(t))) return t >= 100 && t <= 599 ? t : void 0;
234
- }, N = t.namespace("@prose-reader/metadata-fetcher", void 0, { color: "#b06642" }), P = (e) => {
255
+ }, M = t.namespace("@prose-reader/metadata-fetcher", void 0, { color: "#b06642" }), N = (e) => {
235
256
  let t = Object.entries(e).filter(([, e]) => e !== void 0);
236
257
  return Object.fromEntries(t);
237
- }, le = 5, ue = .5, de = 3, fe = ({ candidate: e, providerId: t, score: n, signals: r, accepted: i, includeRaw: a }) => P({
258
+ }, fe = 5, pe = .5, me = 4, he = ({ candidate: e, providerId: t, score: n, signals: r, accepted: i, includeRaw: a }) => N({
238
259
  providerId: t,
239
260
  score: n,
240
261
  signals: r,
@@ -243,80 +264,97 @@ var r = (e) => {
243
264
  id: e.id,
244
265
  url: e.url,
245
266
  raw: a ? e.raw : void 0
246
- }), pe = async (e, t) => {
247
- let n = "metadata" in e ? e.metadata : e, r = t.limit ?? le, i = t.minScore ?? ue, a = t.includeRaw === !0, o = await Promise.all(t.providers.map(async (e) => {
267
+ }), ge = async (e, t) => {
268
+ let n = t.limit ?? fe, r = t.minScore ?? pe, i = t.includeRaw === !0, a = await Promise.all(t.providers.map(async (r) => {
248
269
  try {
249
270
  return {
250
- provider: e,
251
- candidates: await e.search(n, {
252
- limit: r,
271
+ provider: r,
272
+ candidates: await r.search(e, {
273
+ limit: n,
253
274
  signal: t.signal
254
275
  }),
255
276
  failure: void 0
256
277
  };
257
- } catch (n) {
258
- if (t.signal?.aborted === !0) throw n;
259
- return N.error(`fetchMetadata: provider "${e.id}" failed`, n), {
260
- 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,
261
282
  candidates: void 0,
262
- failure: P({
263
- id: e.id,
264
- status: M(n)
283
+ failure: N({
284
+ id: r.id,
285
+ status: j(e)
265
286
  })
266
287
  };
267
288
  }
268
- })), s = o.flatMap((e) => e.failure === void 0 ? [] : [e.failure]), c = {}, l = [];
269
- for (let { provider: e, candidates: t } of o) {
270
- if (t === void 0) continue;
271
- let o = t.map((t) => {
272
- let { score: r, signals: o } = ce(n, t.metadata);
273
- return fe({
274
- candidate: t,
275
- providerId: e.id,
276
- score: r,
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);
294
+ return he({
295
+ candidate: n,
296
+ providerId: t.id,
297
+ score: a,
277
298
  signals: o,
278
- accepted: r >= i,
279
- includeRaw: a
299
+ accepted: a >= r,
300
+ includeRaw: i
280
301
  });
281
- }).sort((e, t) => t.score - e.score).slice(0, r);
282
- c[e.id] !== void 0 && N.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] = {
283
304
  provider: {
284
- id: e.id,
285
- name: e.name
305
+ id: t.id,
306
+ name: t.name
286
307
  },
287
- matches: o
288
- }, l.push(...o);
308
+ matches: a
309
+ }, c.push(...a);
289
310
  }
290
311
  return {
291
- version: de,
292
- matches: [...l].sort((e, t) => t.score - e.score),
293
- sources: c,
294
- failedProviders: s
312
+ version: me,
313
+ matches: [...c].sort((e, t) => t.score - e.score),
314
+ sources: s,
315
+ failedProviders: o
295
316
  };
296
- }, F = "ProjectGutenberg", me = /* @__PURE__ */ new Set(["gutenberg.org", "www.gutenberg.org"]), he = [
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 = [
297
335
  /^\/ebooks\/(\d+)(?:[./]|$)/i,
298
336
  /^\/files\/(\d+)(?:\/|$)/i,
299
337
  /^\/cache\/epub\/(\d+)(?:\/|$)/i,
300
338
  /^\/(\d+)(?:\/|$)/
301
- ], I = (e) => {
339
+ ], F = (e) => {
302
340
  let t = e.trim();
303
341
  if (!/^\d+$/.test(t)) return;
304
342
  let n = t.replace(/^0+(?=\d)/, "");
305
343
  return n === "0" ? void 0 : n;
306
- }, ge = (e) => {
344
+ }, be = (e) => {
307
345
  try {
308
346
  let t = new URL(e.trim());
309
- if (t.protocol !== "http:" && t.protocol !== "https:" || !me.has(t.hostname.toLowerCase())) return;
310
- for (let e of he) {
347
+ if (t.protocol !== "http:" && t.protocol !== "https:" || !ve.has(t.hostname.toLowerCase())) return;
348
+ for (let e of ye) {
311
349
  let n = e.exec(t.pathname)?.[1];
312
- if (n !== void 0) return I(n);
350
+ if (n !== void 0) return F(n);
313
351
  }
314
352
  } catch {
315
353
  return;
316
354
  }
317
- }, L = (e) => {
355
+ }, I = (e) => {
318
356
  for (let t of e.identifiers ?? []) {
319
- let e = t.scheme?.trim().toLowerCase(), n = e === "projectgutenberg" ? I(t.value) : e === void 0 || e === "url" || e === "uri" ? ge(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;
320
358
  if (n !== void 0) return {
321
359
  id: n,
322
360
  identifier: {
@@ -325,34 +363,34 @@ var r = (e) => {
325
363
  }
326
364
  };
327
365
  }
328
- }, R = (e) => typeof e == "object" && !!e && !Array.isArray(e), z = (e, t) => {
366
+ }, L = (e) => typeof e == "object" && !!e && !Array.isArray(e), R = (e, t) => {
329
367
  let n = e[t];
330
368
  if (typeof n != "string") return;
331
369
  let r = n.trim();
332
370
  return r.length > 0 ? r : void 0;
333
- }, B = (e, t) => {
371
+ }, z = (e, t) => {
334
372
  let n = e[t];
335
373
  return typeof n == "number" && Number.isFinite(n) ? n : void 0;
336
- }, V = (e, t) => {
374
+ }, B = (e, t) => {
337
375
  let n = e[t];
338
376
  if (!Array.isArray(n)) return;
339
377
  let r = n.filter((e) => typeof e == "string").map((e) => e.trim()).filter((e) => e.length > 0);
340
378
  return r.length > 0 ? r : void 0;
341
- }, _e = (e, t) => {
379
+ }, xe = (e, t) => {
342
380
  let n = e[t];
343
- return Array.isArray(n) ? n.filter(R) : [];
344
- }, ve = (e) => ({
345
- key: z(e, "key"),
346
- title: z(e, "title"),
347
- subtitle: z(e, "subtitle"),
348
- author_name: V(e, "author_name"),
349
- first_publish_year: B(e, "first_publish_year"),
350
- language: V(e, "language"),
351
- subject: V(e, "subject"),
352
- number_of_pages_median: B(e, "number_of_pages_median"),
353
- cover_i: B(e, "cover_i"),
354
- id_project_gutenberg: V(e, "id_project_gutenberg")
355
- }), H = (e) => R(e) ? _e(e, "docs").map(ve) : [], ye = {
381
+ return Array.isArray(n) ? n.filter(L) : [];
382
+ }, Se = (e) => ({
383
+ key: R(e, "key"),
384
+ title: R(e, "title"),
385
+ subtitle: R(e, "subtitle"),
386
+ author_name: B(e, "author_name"),
387
+ first_publish_year: z(e, "first_publish_year"),
388
+ language: B(e, "language"),
389
+ subject: B(e, "subject"),
390
+ number_of_pages_median: z(e, "number_of_pages_median"),
391
+ cover_i: z(e, "cover_i"),
392
+ id_project_gutenberg: B(e, "id_project_gutenberg")
393
+ }), V = (e) => L(e) ? xe(e, "docs").map(Se) : [], Ce = {
356
394
  afr: "af",
357
395
  alb: "sq",
358
396
  amh: "am",
@@ -457,15 +495,15 @@ var r = (e) => {
457
495
  wel: "cy",
458
496
  yid: "yi",
459
497
  zho: "zh"
460
- }, be = /* @__PURE__ */ new Set([
498
+ }, we = /* @__PURE__ */ new Set([
461
499
  "mul",
462
500
  "und",
463
501
  "zxx",
464
502
  "sgn"
465
- ]), U = (e) => {
503
+ ]), H = (e) => {
466
504
  let t = e.trim().toLowerCase();
467
- if (t.length !== 0 && !be.has(t)) return ye[t] ?? t;
468
- }, xe = 25, Se = {
505
+ if (t.length !== 0 && !we.has(t)) return Ce[t] ?? t;
506
+ }, Te = 25, Ee = {
469
507
  key: "identifiers",
470
508
  title: "title",
471
509
  subtitle: "title",
@@ -476,8 +514,8 @@ var r = (e) => {
476
514
  number_of_pages_median: "numberOfPages",
477
515
  cover_i: "cover",
478
516
  id_project_gutenberg: "identifiers"
479
- }, W = "OpenLibrary", Ce = "ProjectGutenberg", G = (e) => e.length > 0 ? e : void 0, K = (e, t) => {
480
- let n = e.title !== void 0 && e.subtitle !== void 0 ? `${e.title}: ${e.subtitle}` : e.title, r = G([...new Set((e.language ?? []).map(U).filter((e) => e !== void 0))]), i = [
517
+ }, U = "OpenLibrary", De = "ProjectGutenberg", W = (e) => e.length > 0 ? e : void 0, G = (e, t) => {
518
+ let n = e.title !== void 0 && e.subtitle !== void 0 ? `${e.title}: ${e.subtitle}` : e.title, r = W([...new Set((e.language ?? []).map(H).filter((e) => e !== void 0))]), i = [
481
519
  ...t.isbn === void 0 ? [] : [{
482
520
  value: t.isbn,
483
521
  scheme: "ISBN"
@@ -485,14 +523,14 @@ var r = (e) => {
485
523
  ...t.matchedProjectGutenbergIdentifier === void 0 ? [] : [t.matchedProjectGutenbergIdentifier],
486
524
  ...(e.id_project_gutenberg ?? []).map((e) => ({
487
525
  value: e,
488
- scheme: Ce
526
+ scheme: De
489
527
  })),
490
528
  ...e.key === void 0 ? [] : [{
491
529
  value: e.key,
492
- scheme: W
530
+ scheme: U
493
531
  }]
494
532
  ];
495
- return P({
533
+ return N({
496
534
  title: n,
497
535
  cover: e.cover_i === void 0 ? void 0 : {
498
536
  uri: `${t.coversBaseUrl}/b/id/${e.cover_i}-L.jpg`,
@@ -501,16 +539,16 @@ var r = (e) => {
501
539
  },
502
540
  publication: e.first_publish_year === void 0 ? void 0 : { original: { date: { year: e.first_publish_year } } },
503
541
  languages: r,
504
- subjects: G((e.subject ?? []).slice(0, 25)),
505
- contributors: G((e.author_name ?? []).map((e) => ({
542
+ subjects: W((e.subject ?? []).slice(0, 25)),
543
+ contributors: W((e.author_name ?? []).map((e) => ({
506
544
  name: e,
507
545
  roles: ["author"]
508
546
  }))),
509
547
  numberOfPages: e.number_of_pages_median,
510
548
  isbn: t.isbn,
511
- identifiers: G(i)
549
+ identifiers: W(i)
512
550
  });
513
- }, we = "openLibrary", Te = "https://openlibrary.org", Ee = "https://covers.openlibrary.org", De = [
551
+ }, Oe = "openLibrary", ke = "https://openlibrary.org", Ae = "https://covers.openlibrary.org", je = [
514
552
  "key",
515
553
  "title",
516
554
  "subtitle",
@@ -521,19 +559,19 @@ var r = (e) => {
521
559
  "number_of_pages_median",
522
560
  "cover_i",
523
561
  "id_project_gutenberg"
524
- ].join(","), Oe = (e) => {
562
+ ].join(","), Me = (e) => {
525
563
  let t = e.title?.trim();
526
564
  if (t === void 0 || t.length === 0) return;
527
- let n = r(e)[0];
565
+ let n = e.authors?.find((e) => e.trim().length > 0)?.trim();
528
566
  return {
529
567
  title: t,
530
568
  ...n === void 0 ? {} : { author: n }
531
569
  };
532
- }, ke = (e = {}) => {
533
- let t = e.baseUrl ?? Te, n = e.coversBaseUrl ?? Ee, r = async (n, r) => {
570
+ }, Ne = (e = {}) => {
571
+ let t = e.baseUrl ?? ke, n = e.coversBaseUrl ?? Ae, r = async (n, r) => {
534
572
  let i = new URL("/search.json", t);
535
573
  for (let [e, t] of Object.entries(n)) i.searchParams.set(e, t);
536
- i.searchParams.set("fields", De), i.searchParams.set("limit", String(r.limit));
574
+ i.searchParams.set("fields", je), i.searchParams.set("limit", String(r.limit));
537
575
  let a = await (e.fetch ?? globalThis.fetch)(i.toString(), {
538
576
  signal: r.signal,
539
577
  headers: {
@@ -541,10 +579,10 @@ var r = (e) => {
541
579
  ...e.userAgent === void 0 ? {} : { "User-Agent": e.userAgent }
542
580
  }
543
581
  });
544
- if (!a.ok) throw new j(a.status, `Open Library search failed with status ${a.status}`);
545
- return H(await a.json());
582
+ if (!a.ok) throw new A(a.status, `Open Library search failed with status ${a.status}`);
583
+ return V(await a.json());
546
584
  }, i = (e, r = {}) => e.map((e) => ({
547
- metadata: K(e, {
585
+ metadata: G(e, {
548
586
  coversBaseUrl: n,
549
587
  isbn: r.isbn,
550
588
  matchedProjectGutenbergIdentifier: r.confirmedProjectGutenberg?.identifier
@@ -554,10 +592,10 @@ var r = (e) => {
554
592
  raw: e
555
593
  }));
556
594
  return {
557
- id: we,
595
+ id: Oe,
558
596
  name: "Open Library",
559
597
  search: async (e, t) => {
560
- let n = e.isbn?.trim() || void 0, a = L(e);
598
+ let n = e.isbn?.trim() || void 0, a = I(e);
561
599
  if (n !== void 0) {
562
600
  let e = await r({ isbn: n }, t);
563
601
  if (e.length > 0) return i(e, { isbn: n });
@@ -566,55 +604,55 @@ var r = (e) => {
566
604
  let e = await r({ q: `id_project_gutenberg:${a.id}` }, t);
567
605
  if (e.length > 0) return i(e, { confirmedProjectGutenberg: a });
568
606
  }
569
- let o = Oe(e);
607
+ let o = Me(e);
570
608
  return o === void 0 ? [] : i(await r(o, t));
571
609
  }
572
610
  };
573
- }, q = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, Ae = (e) => e.type === "element", J = (e, t) => e.children.filter((e) => Ae(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) => {
574
612
  let t = e?.val.trim();
575
613
  return t !== void 0 && t.length > 0 ? t : void 0;
576
- }, Z = (e, t) => {
614
+ }, X = (e, t) => {
577
615
  for (let [n, r] of Object.entries(e.attr)) {
578
- if (q(n).toLowerCase() !== t.toLowerCase()) continue;
616
+ if (K(n).toLowerCase() !== t.toLowerCase()) continue;
579
617
  let e = r.trim();
580
618
  if (e.length > 0) return e;
581
619
  }
582
- }, je = (e, t) => J(e, t).flatMap((e) => {
583
- 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"));
584
622
  return t === void 0 ? [] : [t];
585
- }), Me = (e) => {
586
- 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];
587
625
  if (n === void 0) return;
588
626
  let r = n.replace(/^0+(?=\d)/, "");
589
627
  return r === "0" ? void 0 : r;
590
- }, Ne = (e) => {
628
+ }, Le = (e) => {
591
629
  let t = [];
592
630
  for (let n of e.children) {
593
- if (!Ae(n)) continue;
631
+ if (!Pe(n)) continue;
594
632
  let e = n.name.toLowerCase() === "dcterms:creator", r = n.name.toLowerCase().startsWith("marcrel:");
595
633
  if (!e && !r) continue;
596
- let i = X(Y(Y(n, "agent") ?? n, "name"));
634
+ let i = Y(J(J(n, "agent") ?? n, "name"));
597
635
  i !== void 0 && t.push({
598
636
  name: i,
599
- role: e ? "aut" : q(n.name).toLowerCase()
637
+ role: e ? "aut" : K(n.name).toLowerCase()
600
638
  });
601
639
  }
602
640
  return t;
603
- }, Pe = (e) => J(e, "subject").flatMap((e) => {
604
- 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"));
605
643
  return r !== void 0 && n?.endsWith("/LCSH") === !0 ? [r] : [];
606
- }), Fe = (e) => {
607
- let t = J(e, "hasFormat").flatMap((e) => {
608
- let t = Y(e, "file");
644
+ }), ze = (e) => {
645
+ let t = q(e, "hasFormat").flatMap((e) => {
646
+ let t = J(e, "file");
609
647
  if (t === void 0) return [];
610
- 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);
611
649
  return n === void 0 || r === void 0 || !/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n) ? [] : [{
612
650
  uri: n,
613
651
  mediaType: r
614
652
  }];
615
653
  });
616
654
  return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
617
- }, Q = (e) => e.length > 0 ? e : void 0, Ie = (e) => {
655
+ }, Z = (e) => e.length > 0 ? e : void 0, Be = (e) => {
618
656
  let t;
619
657
  try {
620
658
  t = new n(e);
@@ -622,28 +660,28 @@ var r = (e) => {
622
660
  let t = e instanceof Error ? e.message : String(e);
623
661
  throw Error(`Project Gutenberg RDF is malformed: ${t}`, { cause: e });
624
662
  }
625
- if (q(t.name).toLowerCase() !== "rdf") return;
626
- let r = Y(t, "ebook");
663
+ if (K(t.name).toLowerCase() !== "rdf") return;
664
+ let r = J(t, "ebook");
627
665
  if (r === void 0) return;
628
- let i = Me(r);
666
+ let i = Ie(r);
629
667
  if (i === void 0) return;
630
- let a = [...new Set(je(r, "language"))], o = [...new Set(Pe(r))], s = [...new Set(je(r, "bookshelf"))], c = Ne(r);
668
+ let a = [...new Set(Fe(r, "language"))], o = [...new Set(Re(r))], s = [...new Set(Fe(r, "bookshelf"))], c = Le(r);
631
669
  return {
632
670
  id: i,
633
- title: X(Y(r, "title")),
634
- publisher: X(Y(r, "publisher")),
635
- issued: X(Y(r, "issued")),
636
- originalPublication: X(Y(r, "marc260")),
637
- rights: X(Y(r, "rights")),
638
- description: X(Y(r, "description")),
639
- summary: X(Y(r, "marc520")),
640
- languages: Q(a),
641
- subjects: Q(o),
642
- bookshelves: Q(s),
643
- contributors: Q(c),
644
- cover: Fe(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)
645
683
  };
646
- }, Le = 25, Re = {
684
+ }, Ve = 25, He = {
647
685
  id: "identifiers",
648
686
  title: "title",
649
687
  publisher: "publication.edition.publisher",
@@ -657,7 +695,7 @@ var r = (e) => {
657
695
  bookshelves: "subjects",
658
696
  contributors: "contributors",
659
697
  cover: "cover"
660
- }, ze = {
698
+ }, Ue = {
661
699
  art: "artist",
662
700
  aut: "author",
663
701
  clr: "colorist",
@@ -666,17 +704,17 @@ var r = (e) => {
666
704
  ill: "illustrator",
667
705
  nrt: "narrator",
668
706
  trl: "translator"
669
- }, Be = (e) => {
707
+ }, We = (e) => {
670
708
  let t = /* @__PURE__ */ new Map();
671
709
  for (let n of e.contributors ?? []) {
672
- let e = n.name.trim().toLowerCase(), r = ze[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);
673
711
  i === void 0 ? t.set(e, {
674
712
  name: n.name,
675
713
  roles: [r]
676
714
  }) : i.roles.includes(r) || i.roles.push(r);
677
715
  }
678
716
  return t.size > 0 ? [...t.values()] : void 0;
679
- }, Ve = (e) => {
717
+ }, Ge = (e) => {
680
718
  if (e === void 0) return;
681
719
  let t = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());
682
720
  if (t === null) return;
@@ -686,53 +724,53 @@ var r = (e) => {
686
724
  ...r === void 0 ? {} : { month: r },
687
725
  ...i === void 0 ? {} : { day: i }
688
726
  };
689
- }, $ = (e, t) => e.split("$").slice(1).flatMap((e) => e[0]?.toLowerCase() === t.toLowerCase() ? [e.slice(1).trim()] : []).filter((e) => e.length > 0), He = (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) => {
690
728
  if (e === void 0) return;
691
- 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 = P({
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({
692
730
  date: i.length === 1 ? { year: i[0] } : void 0,
693
731
  publisher: n !== void 0 && n.length > 0 && !/^\[?s\.n\.?\]?$/i.test(n) ? n : void 0
694
732
  });
695
733
  return a.date !== void 0 || a.publisher !== void 0 ? a : void 0;
696
- }, Ue = (e, t) => {
734
+ }, qe = (e, t) => {
697
735
  try {
698
736
  let n = new URL(e, t);
699
737
  return n.protocol === "http:" || n.protocol === "https:" ? n.toString() : void 0;
700
738
  } catch {
701
739
  return;
702
740
  }
703
- }, We = (e) => e.length > 0 ? e : void 0, Ge = (e, t) => {
741
+ }, Je = (e) => e.length > 0 ? e : void 0, Ye = (e, t) => {
704
742
  let n = [t.matchedIdentifier, {
705
743
  value: e.id,
706
- scheme: F
707
- }].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 : Ue(e.cover.uri, t.baseUrl), a = i === void 0 ? void 0 : {
744
+ scheme: P
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 : {
708
746
  uri: i,
709
747
  mediaType: e.cover?.mediaType,
710
748
  confidence: "derived"
711
- }, o = P({
712
- date: Ve(e.issued),
749
+ }, o = N({
750
+ date: Ge(e.issued),
713
751
  publisher: e.publisher
714
- }), s = P({
715
- original: He(e.originalPublication),
752
+ }), s = N({
753
+ original: Ke(e.originalPublication),
716
754
  edition: o.date !== void 0 || o.publisher !== void 0 ? o : void 0
717
755
  });
718
- return P({
756
+ return N({
719
757
  title: e.title,
720
758
  publication: s.original !== void 0 || s.edition !== void 0 ? s : void 0,
721
759
  description: e.summary ?? e.description,
722
760
  rights: e.rights,
723
- languages: We([...new Set(e.languages ?? [])]),
724
- subjects: We(r),
725
- contributors: Be(e),
761
+ languages: Je([...new Set(e.languages ?? [])]),
762
+ subjects: Je(r),
763
+ contributors: We(e),
726
764
  identifiers: n,
727
765
  cover: a
728
766
  });
729
- }, Ke = "projectGutenberg", qe = "https://www.gutenberg.org", Je = (e = {}) => {
730
- let t = e.baseUrl ?? qe;
767
+ }, $ = "projectGutenberg", Xe = "https://www.gutenberg.org", Ze = (e = {}) => {
768
+ let t = e.baseUrl ?? Xe;
731
769
  return {
732
- id: Ke,
770
+ id: $,
733
771
  name: "Project Gutenberg",
734
772
  search: async (n, r) => {
735
- let i = L(n);
773
+ let i = I(n);
736
774
  if (i === void 0) return [];
737
775
  let a = new URL(`/cache/epub/${i.id}/pg${i.id}.rdf`, t), o = await (e.fetch ?? globalThis.fetch)(a.toString(), {
738
776
  signal: r.signal,
@@ -742,28 +780,28 @@ var r = (e) => {
742
780
  }
743
781
  });
744
782
  if (o.status === 404) return [];
745
- if (!o.ok) throw new j(o.status, `Project Gutenberg metadata lookup failed with status ${o.status}`);
746
- let s = Ie(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());
747
785
  if (s === void 0 || s.id !== i.id) throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);
748
786
  let c = new URL(`/ebooks/${i.id}`, t).toString();
749
787
  return [{
750
788
  id: s.id,
751
789
  url: c,
752
790
  raw: s,
753
- metadata: Ge(s, {
791
+ metadata: Ye(s, {
754
792
  baseUrl: t,
755
793
  matchedIdentifier: i.identifier
756
794
  })
757
795
  }];
758
796
  }
759
797
  };
760
- }, Ye = (e) => [
798
+ }, Qe = (e) => [
761
799
  e.title,
762
800
  e.isbn,
763
801
  e.gtin,
764
- e.belongsTo?.series?.[0]?.name
765
- ].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);
766
804
  //#endregion
767
- export { D as METADATA_MATCH_WEIGHTS, j as MetadataProviderResponseError, W as OPEN_LIBRARY_IDENTIFIER_SCHEME, xe as OPEN_LIBRARY_MAX_SUBJECTS, we as OPEN_LIBRARY_PROVIDER_ID, F as PROJECT_GUTENBERG_IDENTIFIER_SCHEME, Le as PROJECT_GUTENBERG_MAX_SUBJECTS, Ke as PROJECT_GUTENBERG_PROVIDER_ID, ke as createOpenLibraryProvider, Je as createProjectGutenbergProvider, pe as fetchMetadata, Ye as hasSearchTerms, U as marcLanguageToBcp47, r as metadataAuthors, l as normalizeForComparison, Se as openLibraryMetadataHomes, H as parseOpenLibrarySearchResponse, Ie as parseProjectGutenbergRdf, E as personNameSimilarity, L as projectGutenbergLookupFromMetadata, Re as projectGutenbergMetadataHomes, K as resolveOpenLibraryDoc, Ge as resolveProjectGutenbergRecord, M as responseErrorStatus, ce as scoreMetadataCandidate, d as textSimilarity, w 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 };
768
806
 
769
807
  //# sourceMappingURL=index.js.map