@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/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 +249 -207
- 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/openLibrary/createOpenLibraryProvider.d.ts +5 -4
- 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,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 =
|
|
570
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
618
|
+
}, X = (e, t) => {
|
|
577
619
|
for (let [n, r] of Object.entries(e.attr)) {
|
|
578
|
-
if (
|
|
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
|
-
},
|
|
583
|
-
let t =
|
|
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
|
-
}),
|
|
586
|
-
let t =
|
|
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
|
-
},
|
|
632
|
+
}, Le = (e) => {
|
|
591
633
|
let t = [];
|
|
592
634
|
for (let n of e.children) {
|
|
593
|
-
if (!
|
|
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 =
|
|
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" :
|
|
641
|
+
role: e ? "aut" : K(n.name).toLowerCase()
|
|
600
642
|
});
|
|
601
643
|
}
|
|
602
644
|
return t;
|
|
603
|
-
},
|
|
604
|
-
let t =
|
|
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
|
-
}),
|
|
607
|
-
let t =
|
|
608
|
-
let t =
|
|
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 =
|
|
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
|
-
},
|
|
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 (
|
|
626
|
-
let r =
|
|
667
|
+
if (K(t.name).toLowerCase() !== "rdf") return;
|
|
668
|
+
let r = J(t, "ebook");
|
|
627
669
|
if (r === void 0) return;
|
|
628
|
-
let i =
|
|
670
|
+
let i = Ie(r);
|
|
629
671
|
if (i === void 0) return;
|
|
630
|
-
let a = [...new Set(
|
|
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:
|
|
634
|
-
publisher:
|
|
635
|
-
issued:
|
|
636
|
-
originalPublication:
|
|
637
|
-
rights:
|
|
638
|
-
description:
|
|
639
|
-
summary:
|
|
640
|
-
languages:
|
|
641
|
-
subjects:
|
|
642
|
-
bookshelves:
|
|
643
|
-
contributors:
|
|
644
|
-
cover:
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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:
|
|
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 :
|
|
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 =
|
|
712
|
-
date:
|
|
753
|
+
}, o = N({
|
|
754
|
+
date: Ge(e.issued),
|
|
713
755
|
publisher: e.publisher
|
|
714
|
-
}), s =
|
|
715
|
-
original:
|
|
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
|
|
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:
|
|
724
|
-
subjects:
|
|
725
|
-
contributors:
|
|
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
|
-
},
|
|
730
|
-
let t = e.baseUrl ??
|
|
771
|
+
}, $ = "projectGutenberg", Xe = "https://www.gutenberg.org", Ze = (e = {}) => {
|
|
772
|
+
let t = e.baseUrl ?? Xe;
|
|
731
773
|
return {
|
|
732
|
-
id:
|
|
774
|
+
id: $,
|
|
733
775
|
name: "Project Gutenberg",
|
|
734
776
|
search: async (n, r) => {
|
|
735
|
-
let i =
|
|
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
|
|
746
|
-
let s =
|
|
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:
|
|
795
|
+
metadata: Ye(s, {
|
|
754
796
|
baseUrl: t,
|
|
755
797
|
matchedIdentifier: i.identifier
|
|
756
798
|
})
|
|
757
799
|
}];
|
|
758
800
|
}
|
|
759
801
|
};
|
|
760
|
-
},
|
|
802
|
+
}, Qe = (e) => [
|
|
761
803
|
e.title,
|
|
762
804
|
e.isbn,
|
|
763
805
|
e.gtin,
|
|
764
|
-
e.
|
|
765
|
-
].some((e) => e !== void 0 && e.trim().length > 0) || (e.identifiers ?? []).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 {
|
|
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
|