@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/fetchMetadata.d.ts +6 -12
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.js +244 -206
- package/dist/index.js.map +1 -1
- package/dist/match/scoreMetadataCandidate.d.ts +5 -6
- package/dist/metadataInputFromResolvedArchive.d.ts +9 -0
- package/dist/metadataInputFromResolvedArchive.test.d.ts +1 -0
- package/dist/providers/projectGutenberg/identifier.d.ts +3 -6
- package/dist/types/fetchMetadataInput.d.ts +30 -0
- package/dist/types/fetchedMetadata.d.ts +2 -1
- package/dist/types/match.d.ts +1 -1
- package/dist/types/provider.d.ts +10 -14
- package/dist/utils/hasSearchTerms.d.ts +2 -2
- package/package.json +4 -4
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
|
-
},
|
|
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
|
-
},
|
|
110
|
-
if (
|
|
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
|
-
},
|
|
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
|
-
|
|
118
|
+
authors: .5,
|
|
119
119
|
series: .3,
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
130
|
-
let n =
|
|
131
|
-
return n !== void 0 && n ===
|
|
132
|
-
},
|
|
133
|
-
if (!
|
|
134
|
-
let n =
|
|
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
|
-
},
|
|
137
|
-
if (!
|
|
138
|
-
let n =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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:
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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) =>
|
|
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) =>
|
|
177
|
-
query: m.map(
|
|
178
|
-
candidate: h.map(
|
|
179
|
-
}), a("title", e.title, t.title,
|
|
180
|
-
let _ = r(t), v =
|
|
181
|
-
|
|
182
|
-
|
|
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 =
|
|
187
|
-
|
|
188
|
-
|
|
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: +!!
|
|
199
|
-
query:
|
|
200
|
-
candidate:
|
|
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:
|
|
225
|
+
score: ce(e.numberOfPages, t.numberOfPages),
|
|
205
226
|
query: String(e.numberOfPages),
|
|
206
227
|
candidate: String(t.numberOfPages)
|
|
207
228
|
});
|
|
208
|
-
let
|
|
209
|
-
if (
|
|
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 ||
|
|
234
|
+
if (g || x.some((e) => e.score === 1)) return {
|
|
214
235
|
score: 1,
|
|
215
236
|
signals: n
|
|
216
237
|
};
|
|
217
|
-
let
|
|
218
|
-
return
|
|
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) /
|
|
243
|
+
score: n.reduce((e, t) => e + t.score * t.weight, 0) / S,
|
|
223
244
|
signals: n
|
|
224
245
|
};
|
|
225
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
}),
|
|
247
|
-
let n =
|
|
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:
|
|
251
|
-
candidates: await
|
|
252
|
-
limit:
|
|
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 (
|
|
258
|
-
if (t.signal?.aborted === !0) throw
|
|
259
|
-
return
|
|
260
|
-
provider:
|
|
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:
|
|
263
|
-
id:
|
|
264
|
-
status:
|
|
283
|
+
failure: N({
|
|
284
|
+
id: r.id,
|
|
285
|
+
status: j(e)
|
|
265
286
|
})
|
|
266
287
|
};
|
|
267
288
|
}
|
|
268
|
-
})),
|
|
269
|
-
for (let { provider:
|
|
270
|
-
if (
|
|
271
|
-
let
|
|
272
|
-
let { score:
|
|
273
|
-
return
|
|
274
|
-
candidate:
|
|
275
|
-
providerId:
|
|
276
|
-
score:
|
|
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:
|
|
279
|
-
includeRaw:
|
|
299
|
+
accepted: a >= r,
|
|
300
|
+
includeRaw: i
|
|
280
301
|
});
|
|
281
|
-
}).sort((e, t) => t.score - e.score).slice(0,
|
|
282
|
-
|
|
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:
|
|
285
|
-
name:
|
|
305
|
+
id: t.id,
|
|
306
|
+
name: t.name
|
|
286
307
|
},
|
|
287
|
-
matches:
|
|
288
|
-
},
|
|
308
|
+
matches: a
|
|
309
|
+
}, c.push(...a);
|
|
289
310
|
}
|
|
290
311
|
return {
|
|
291
|
-
version:
|
|
292
|
-
matches: [...
|
|
293
|
-
sources:
|
|
294
|
-
failedProviders:
|
|
312
|
+
version: me,
|
|
313
|
+
matches: [...c].sort((e, t) => t.score - e.score),
|
|
314
|
+
sources: s,
|
|
315
|
+
failedProviders: o
|
|
295
316
|
};
|
|
296
|
-
},
|
|
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
|
-
],
|
|
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
|
-
},
|
|
344
|
+
}, be = (e) => {
|
|
307
345
|
try {
|
|
308
346
|
let t = new URL(e.trim());
|
|
309
|
-
if (t.protocol !== "http:" && t.protocol !== "https:" || !
|
|
310
|
-
for (let e of
|
|
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
|
|
350
|
+
if (n !== void 0) return F(n);
|
|
313
351
|
}
|
|
314
352
|
} catch {
|
|
315
353
|
return;
|
|
316
354
|
}
|
|
317
|
-
},
|
|
355
|
+
}, I = (e) => {
|
|
318
356
|
for (let t of e.identifiers ?? []) {
|
|
319
|
-
let e = t.scheme?.trim().toLowerCase(), n = e === "projectgutenberg" ?
|
|
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
|
-
},
|
|
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
|
-
},
|
|
371
|
+
}, z = (e, t) => {
|
|
334
372
|
let n = e[t];
|
|
335
373
|
return typeof n == "number" && Number.isFinite(n) ? n : void 0;
|
|
336
|
-
},
|
|
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
|
-
},
|
|
379
|
+
}, xe = (e, t) => {
|
|
342
380
|
let n = e[t];
|
|
343
|
-
return Array.isArray(n) ? n.filter(
|
|
344
|
-
},
|
|
345
|
-
key:
|
|
346
|
-
title:
|
|
347
|
-
subtitle:
|
|
348
|
-
author_name:
|
|
349
|
-
first_publish_year:
|
|
350
|
-
language:
|
|
351
|
-
subject:
|
|
352
|
-
number_of_pages_median:
|
|
353
|
-
cover_i:
|
|
354
|
-
id_project_gutenberg:
|
|
355
|
-
}),
|
|
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
|
-
},
|
|
498
|
+
}, we = /* @__PURE__ */ new Set([
|
|
461
499
|
"mul",
|
|
462
500
|
"und",
|
|
463
501
|
"zxx",
|
|
464
502
|
"sgn"
|
|
465
|
-
]),
|
|
503
|
+
]), H = (e) => {
|
|
466
504
|
let t = e.trim().toLowerCase();
|
|
467
|
-
if (t.length !== 0 && !
|
|
468
|
-
},
|
|
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
|
-
},
|
|
480
|
-
let n = e.title !== void 0 && e.subtitle !== void 0 ? `${e.title}: ${e.subtitle}` : e.title, r =
|
|
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:
|
|
526
|
+
scheme: De
|
|
489
527
|
})),
|
|
490
528
|
...e.key === void 0 ? [] : [{
|
|
491
529
|
value: e.key,
|
|
492
|
-
scheme:
|
|
530
|
+
scheme: U
|
|
493
531
|
}]
|
|
494
532
|
];
|
|
495
|
-
return
|
|
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:
|
|
505
|
-
contributors:
|
|
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:
|
|
549
|
+
identifiers: W(i)
|
|
512
550
|
});
|
|
513
|
-
},
|
|
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(","),
|
|
562
|
+
].join(","), Me = (e) => {
|
|
525
563
|
let t = e.title?.trim();
|
|
526
564
|
if (t === void 0 || t.length === 0) return;
|
|
527
|
-
let n =
|
|
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
|
-
},
|
|
533
|
-
let t = e.baseUrl ??
|
|
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",
|
|
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
|
|
545
|
-
return
|
|
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:
|
|
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:
|
|
595
|
+
id: Oe,
|
|
558
596
|
name: "Open Library",
|
|
559
597
|
search: async (e, t) => {
|
|
560
|
-
let n = e.isbn?.trim() || void 0, a =
|
|
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 =
|
|
607
|
+
let o = Me(e);
|
|
570
608
|
return o === void 0 ? [] : i(await r(o, t));
|
|
571
609
|
}
|
|
572
610
|
};
|
|
573
|
-
},
|
|
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
|
-
},
|
|
614
|
+
}, X = (e, t) => {
|
|
577
615
|
for (let [n, r] of Object.entries(e.attr)) {
|
|
578
|
-
if (
|
|
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
|
-
},
|
|
583
|
-
let t =
|
|
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
|
-
}),
|
|
586
|
-
let t =
|
|
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
|
-
},
|
|
628
|
+
}, Le = (e) => {
|
|
591
629
|
let t = [];
|
|
592
630
|
for (let n of e.children) {
|
|
593
|
-
if (!
|
|
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 =
|
|
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" :
|
|
637
|
+
role: e ? "aut" : K(n.name).toLowerCase()
|
|
600
638
|
});
|
|
601
639
|
}
|
|
602
640
|
return t;
|
|
603
|
-
},
|
|
604
|
-
let t =
|
|
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
|
-
}),
|
|
607
|
-
let t =
|
|
608
|
-
let t =
|
|
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 =
|
|
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
|
-
},
|
|
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 (
|
|
626
|
-
let r =
|
|
663
|
+
if (K(t.name).toLowerCase() !== "rdf") return;
|
|
664
|
+
let r = J(t, "ebook");
|
|
627
665
|
if (r === void 0) return;
|
|
628
|
-
let i =
|
|
666
|
+
let i = Ie(r);
|
|
629
667
|
if (i === void 0) return;
|
|
630
|
-
let a = [...new Set(
|
|
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:
|
|
634
|
-
publisher:
|
|
635
|
-
issued:
|
|
636
|
-
originalPublication:
|
|
637
|
-
rights:
|
|
638
|
-
description:
|
|
639
|
-
summary:
|
|
640
|
-
languages:
|
|
641
|
-
subjects:
|
|
642
|
-
bookshelves:
|
|
643
|
-
contributors:
|
|
644
|
-
cover:
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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:
|
|
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 :
|
|
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 =
|
|
712
|
-
date:
|
|
749
|
+
}, o = N({
|
|
750
|
+
date: Ge(e.issued),
|
|
713
751
|
publisher: e.publisher
|
|
714
|
-
}), s =
|
|
715
|
-
original:
|
|
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
|
|
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:
|
|
724
|
-
subjects:
|
|
725
|
-
contributors:
|
|
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
|
-
},
|
|
730
|
-
let t = e.baseUrl ??
|
|
767
|
+
}, $ = "projectGutenberg", Xe = "https://www.gutenberg.org", Ze = (e = {}) => {
|
|
768
|
+
let t = e.baseUrl ?? Xe;
|
|
731
769
|
return {
|
|
732
|
-
id:
|
|
770
|
+
id: $,
|
|
733
771
|
name: "Project Gutenberg",
|
|
734
772
|
search: async (n, r) => {
|
|
735
|
-
let i =
|
|
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
|
|
746
|
-
let s =
|
|
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:
|
|
791
|
+
metadata: Ye(s, {
|
|
754
792
|
baseUrl: t,
|
|
755
793
|
matchedIdentifier: i.identifier
|
|
756
794
|
})
|
|
757
795
|
}];
|
|
758
796
|
}
|
|
759
797
|
};
|
|
760
|
-
},
|
|
798
|
+
}, Qe = (e) => [
|
|
761
799
|
e.title,
|
|
762
800
|
e.isbn,
|
|
763
801
|
e.gtin,
|
|
764
|
-
e.
|
|
765
|
-
].some((e) => e !== void 0 && e.trim().length > 0) || (e.identifiers ?? []).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 {
|
|
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
|