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