@prose-reader/metadata-fetcher 1.341.0 → 1.343.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,59 @@ 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);
570
- return o === void 0 ? [] : i(await r(o, t));
607
+ let o = Me(e);
608
+ if (o === void 0) return [];
609
+ let s = await r(o, t);
610
+ if (s.length > 0) return i(s);
611
+ let c = o.author === void 0 ? o.title : `${o.title} ${o.author}`;
612
+ return i(await r({ q: c }, t));
571
613
  }
572
614
  };
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) => {
615
+ }, K = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, Pe = (e) => e.type === "element", q = (e, t) => e.children.filter((e) => Pe(e) && K(e.name).toLowerCase() === t.toLowerCase()), J = (e, t) => q(e, t)[0], Y = (e) => {
574
616
  let t = e?.val.trim();
575
617
  return t !== void 0 && t.length > 0 ? t : void 0;
576
- }, Z = (e, t) => {
618
+ }, X = (e, t) => {
577
619
  for (let [n, r] of Object.entries(e.attr)) {
578
- if (q(n).toLowerCase() !== t.toLowerCase()) continue;
620
+ if (K(n).toLowerCase() !== t.toLowerCase()) continue;
579
621
  let e = r.trim();
580
622
  if (e.length > 0) return e;
581
623
  }
582
- }, je = (e, t) => J(e, t).flatMap((e) => {
583
- let t = X(Y(Y(e, "Description") ?? e, "value"));
624
+ }, Fe = (e, t) => q(e, t).flatMap((e) => {
625
+ let t = Y(J(J(e, "Description") ?? e, "value"));
584
626
  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];
627
+ }), Ie = (e) => {
628
+ let t = X(e, "about"), n = t === void 0 ? void 0 : /(?:^|\/)ebooks\/(\d+)$/.exec(t)?.[1];
587
629
  if (n === void 0) return;
588
630
  let r = n.replace(/^0+(?=\d)/, "");
589
631
  return r === "0" ? void 0 : r;
590
- }, Ne = (e) => {
632
+ }, Le = (e) => {
591
633
  let t = [];
592
634
  for (let n of e.children) {
593
- if (!Ae(n)) continue;
635
+ if (!Pe(n)) continue;
594
636
  let e = n.name.toLowerCase() === "dcterms:creator", r = n.name.toLowerCase().startsWith("marcrel:");
595
637
  if (!e && !r) continue;
596
- let i = X(Y(Y(n, "agent") ?? n, "name"));
638
+ let i = Y(J(J(n, "agent") ?? n, "name"));
597
639
  i !== void 0 && t.push({
598
640
  name: i,
599
- role: e ? "aut" : q(n.name).toLowerCase()
641
+ role: e ? "aut" : K(n.name).toLowerCase()
600
642
  });
601
643
  }
602
644
  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"));
645
+ }, Re = (e) => q(e, "subject").flatMap((e) => {
646
+ let t = J(e, "Description"), n = t === void 0 ? void 0 : X(J(t, "memberOf") ?? t, "resource"), r = Y(t === void 0 ? void 0 : J(t, "value"));
605
647
  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");
648
+ }), ze = (e) => {
649
+ let t = q(e, "hasFormat").flatMap((e) => {
650
+ let t = J(e, "file");
609
651
  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);
652
+ let n = X(t, "about"), r = q(t, "format").map((e) => Y(J(J(e, "Description") ?? e, "value"))).find((e) => e?.startsWith("image/") === !0);
611
653
  return n === void 0 || r === void 0 || !/\.cover\.(?:medium|small)\.[a-z0-9]+(?:$|[?#])/i.test(n) ? [] : [{
612
654
  uri: n,
613
655
  mediaType: r
614
656
  }];
615
657
  });
616
658
  return t.find((e) => /\.cover\.medium\./i.test(e.uri)) ?? t[0];
617
- }, Q = (e) => e.length > 0 ? e : void 0, Ie = (e) => {
659
+ }, Z = (e) => e.length > 0 ? e : void 0, Be = (e) => {
618
660
  let t;
619
661
  try {
620
662
  t = new n(e);
@@ -622,28 +664,28 @@ var r = (e) => {
622
664
  let t = e instanceof Error ? e.message : String(e);
623
665
  throw Error(`Project Gutenberg RDF is malformed: ${t}`, { cause: e });
624
666
  }
625
- if (q(t.name).toLowerCase() !== "rdf") return;
626
- let r = Y(t, "ebook");
667
+ if (K(t.name).toLowerCase() !== "rdf") return;
668
+ let r = J(t, "ebook");
627
669
  if (r === void 0) return;
628
- let i = Me(r);
670
+ let i = Ie(r);
629
671
  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);
672
+ let a = [...new Set(Fe(r, "language"))], o = [...new Set(Re(r))], s = [...new Set(Fe(r, "bookshelf"))], c = Le(r);
631
673
  return {
632
674
  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)
675
+ title: Y(J(r, "title")),
676
+ publisher: Y(J(r, "publisher")),
677
+ issued: Y(J(r, "issued")),
678
+ originalPublication: Y(J(r, "marc260")),
679
+ rights: Y(J(r, "rights")),
680
+ description: Y(J(r, "description")),
681
+ summary: Y(J(r, "marc520")),
682
+ languages: Z(a),
683
+ subjects: Z(o),
684
+ bookshelves: Z(s),
685
+ contributors: Z(c),
686
+ cover: ze(r)
645
687
  };
646
- }, Le = 25, Re = {
688
+ }, Ve = 25, He = {
647
689
  id: "identifiers",
648
690
  title: "title",
649
691
  publisher: "publication.edition.publisher",
@@ -657,7 +699,7 @@ var r = (e) => {
657
699
  bookshelves: "subjects",
658
700
  contributors: "contributors",
659
701
  cover: "cover"
660
- }, ze = {
702
+ }, Ue = {
661
703
  art: "artist",
662
704
  aut: "author",
663
705
  clr: "colorist",
@@ -666,17 +708,17 @@ var r = (e) => {
666
708
  ill: "illustrator",
667
709
  nrt: "narrator",
668
710
  trl: "translator"
669
- }, Be = (e) => {
711
+ }, We = (e) => {
670
712
  let t = /* @__PURE__ */ new Map();
671
713
  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);
714
+ let e = n.name.trim().toLowerCase(), r = Ue[n.role.trim().toLowerCase()] ?? n.role, i = t.get(e);
673
715
  i === void 0 ? t.set(e, {
674
716
  name: n.name,
675
717
  roles: [r]
676
718
  }) : i.roles.includes(r) || i.roles.push(r);
677
719
  }
678
720
  return t.size > 0 ? [...t.values()] : void 0;
679
- }, Ve = (e) => {
721
+ }, Ge = (e) => {
680
722
  if (e === void 0) return;
681
723
  let t = /^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$/.exec(e.trim());
682
724
  if (t === null) return;
@@ -686,53 +728,53 @@ var r = (e) => {
686
728
  ...r === void 0 ? {} : { month: r },
687
729
  ...i === void 0 ? {} : { day: i }
688
730
  };
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) => {
731
+ }, Q = (e, t) => e.split("$").slice(1).flatMap((e) => e[0]?.toLowerCase() === t.toLowerCase() ? [e.slice(1).trim()] : []).filter((e) => e.length > 0), Ke = (e) => {
690
732
  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({
733
+ let t = Q(e, "b"), n = (t.length === 1 ? t[0] : void 0)?.replace(/[\s,;:/]+$/u, "").trim(), r = Q(e, "c"), i = [...new Set(r.flatMap((e) => [...e.matchAll(/\d{4}/g)].flatMap((e) => e[0] === void 0 ? [] : [Number(e[0])])))], a = N({
692
734
  date: i.length === 1 ? { year: i[0] } : void 0,
693
735
  publisher: n !== void 0 && n.length > 0 && !/^\[?s\.n\.?\]?$/i.test(n) ? n : void 0
694
736
  });
695
737
  return a.date !== void 0 || a.publisher !== void 0 ? a : void 0;
696
- }, Ue = (e, t) => {
738
+ }, qe = (e, t) => {
697
739
  try {
698
740
  let n = new URL(e, t);
699
741
  return n.protocol === "http:" || n.protocol === "https:" ? n.toString() : void 0;
700
742
  } catch {
701
743
  return;
702
744
  }
703
- }, We = (e) => e.length > 0 ? e : void 0, Ge = (e, t) => {
745
+ }, Je = (e) => e.length > 0 ? e : void 0, Ye = (e, t) => {
704
746
  let n = [t.matchedIdentifier, {
705
747
  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 : {
748
+ scheme: P
749
+ }].filter((e, t, n) => n.findIndex((t) => t.value.trim().toLowerCase() === e.value.trim().toLowerCase() && t.scheme?.trim().toLowerCase() === e.scheme?.trim().toLowerCase()) === t), r = [.../* @__PURE__ */ new Set([...e.subjects ?? [], ...e.bookshelves ?? []])].slice(0, 25), i = e.cover === void 0 ? void 0 : qe(e.cover.uri, t.baseUrl), a = i === void 0 ? void 0 : {
708
750
  uri: i,
709
751
  mediaType: e.cover?.mediaType,
710
752
  confidence: "derived"
711
- }, o = P({
712
- date: Ve(e.issued),
753
+ }, o = N({
754
+ date: Ge(e.issued),
713
755
  publisher: e.publisher
714
- }), s = P({
715
- original: He(e.originalPublication),
756
+ }), s = N({
757
+ original: Ke(e.originalPublication),
716
758
  edition: o.date !== void 0 || o.publisher !== void 0 ? o : void 0
717
759
  });
718
- return P({
760
+ return N({
719
761
  title: e.title,
720
762
  publication: s.original !== void 0 || s.edition !== void 0 ? s : void 0,
721
763
  description: e.summary ?? e.description,
722
764
  rights: e.rights,
723
- languages: We([...new Set(e.languages ?? [])]),
724
- subjects: We(r),
725
- contributors: Be(e),
765
+ languages: Je([...new Set(e.languages ?? [])]),
766
+ subjects: Je(r),
767
+ contributors: We(e),
726
768
  identifiers: n,
727
769
  cover: a
728
770
  });
729
- }, Ke = "projectGutenberg", qe = "https://www.gutenberg.org", Je = (e = {}) => {
730
- let t = e.baseUrl ?? qe;
771
+ }, $ = "projectGutenberg", Xe = "https://www.gutenberg.org", Ze = (e = {}) => {
772
+ let t = e.baseUrl ?? Xe;
731
773
  return {
732
- id: Ke,
774
+ id: $,
733
775
  name: "Project Gutenberg",
734
776
  search: async (n, r) => {
735
- let i = L(n);
777
+ let i = I(n);
736
778
  if (i === void 0) return [];
737
779
  let a = new URL(`/cache/epub/${i.id}/pg${i.id}.rdf`, t), o = await (e.fetch ?? globalThis.fetch)(a.toString(), {
738
780
  signal: r.signal,
@@ -742,28 +784,28 @@ var r = (e) => {
742
784
  }
743
785
  });
744
786
  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());
787
+ if (!o.ok) throw new A(o.status, `Project Gutenberg metadata lookup failed with status ${o.status}`);
788
+ let s = Be(await o.text());
747
789
  if (s === void 0 || s.id !== i.id) throw Error(`Project Gutenberg RDF did not contain the requested eBook ${i.id}`);
748
790
  let c = new URL(`/ebooks/${i.id}`, t).toString();
749
791
  return [{
750
792
  id: s.id,
751
793
  url: c,
752
794
  raw: s,
753
- metadata: Ge(s, {
795
+ metadata: Ye(s, {
754
796
  baseUrl: t,
755
797
  matchedIdentifier: i.identifier
756
798
  })
757
799
  }];
758
800
  }
759
801
  };
760
- }, Ye = (e) => [
802
+ }, Qe = (e) => [
761
803
  e.title,
762
804
  e.isbn,
763
805
  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;
806
+ e.series
807
+ ].some((e) => e !== void 0 && e.trim().length > 0) || (e.identifiers ?? []).some((e) => e.value.trim().length > 0) || (e.authors ?? []).some((e) => e.trim().length > 0);
766
808
  //#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 };
809
+ export { T as METADATA_MATCH_WEIGHTS, A as MetadataProviderResponseError, U as OPEN_LIBRARY_IDENTIFIER_SCHEME, Te as OPEN_LIBRARY_MAX_SUBJECTS, Oe as OPEN_LIBRARY_PROVIDER_ID, P as PROJECT_GUTENBERG_IDENTIFIER_SCHEME, Ve as PROJECT_GUTENBERG_MAX_SUBJECTS, $ as PROJECT_GUTENBERG_PROVIDER_ID, Ne as createOpenLibraryProvider, Ze as createProjectGutenbergProvider, ge as fetchMetadata, Qe as hasSearchTerms, H as marcLanguageToBcp47, r as metadataAuthors, _e as metadataInputFromResolvedArchive, l as normalizeForComparison, Ee as openLibraryMetadataHomes, V as parseOpenLibrarySearchResponse, Be as parseProjectGutenbergRdf, w as personNameSimilarity, I as projectGutenbergLookupFromInput, He as projectGutenbergMetadataHomes, G as resolveOpenLibraryDoc, Ye as resolveProjectGutenbergRecord, j as responseErrorStatus, k as scoreMetadataCandidate, d as textSimilarity, te as titleSimilarity, o as toIsbn13 };
768
810
 
769
811
  //# sourceMappingURL=index.js.map