@prose-reader/archive-reader 1.344.0 → 1.346.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.
Files changed (48) hide show
  1. package/dist/cover/resolveArchiveCover.d.ts +1 -1
  2. package/dist/index/index.cjs +4 -4
  3. package/dist/index/index.cjs.map +1 -1
  4. package/dist/index/index.js +534 -484
  5. package/dist/index/index.js.map +1 -1
  6. package/dist/index.d.ts +25 -24
  7. package/dist/{apple → metadata/apple}/readArchiveApple.d.ts +1 -1
  8. package/dist/{apple → metadata/apple}/resolve.d.ts +1 -1
  9. package/dist/{comicInfo → metadata/comicInfo}/getArchiveHasComicInfo.d.ts +1 -1
  10. package/dist/{comicInfo → metadata/comicInfo}/readArchiveComicInfo.d.ts +1 -1
  11. package/dist/{comicInfo → metadata/comicInfo}/resolve.d.ts +2 -2
  12. package/dist/{kobo → metadata/kobo}/readArchiveKobo.d.ts +1 -1
  13. package/dist/{kobo → metadata/kobo}/resolve.d.ts +1 -1
  14. package/dist/metadata/opf/getArchiveOpfInfo.d.ts +5 -0
  15. package/dist/{opf → metadata/opf}/getSpineItemFilesFromArchive.d.ts +2 -2
  16. package/dist/{opf → metadata/opf}/isArchiveEpub.d.ts +1 -1
  17. package/dist/{opf → metadata/opf}/parse.d.ts +5 -1
  18. package/dist/{opf → metadata/opf}/readArchiveOpf.d.ts +1 -1
  19. package/dist/{opf → metadata/opf}/resolve.d.ts +2 -2
  20. package/dist/readingOrder/resolveArchiveReadingOrder.d.ts +1 -1
  21. package/dist/resolve.d.ts +4 -4
  22. package/dist/resolveArchive.d.ts +4 -4
  23. package/dist/resolveMetadata.d.ts +4 -4
  24. package/dist/toc/nav.d.ts +1 -1
  25. package/dist/toc/ncx.d.ts +1 -1
  26. package/dist/toc/resolveArchiveToc.d.ts +1 -1
  27. package/dist/types/resolvedMetadata.d.ts +21 -9
  28. package/dist/utils/mainTitle.d.ts +2 -0
  29. package/package.json +3 -3
  30. package/dist/opf/getArchiveOpfInfo.d.ts +0 -5
  31. /package/dist/{apple → metadata/apple}/parse.d.ts +0 -0
  32. /package/dist/{apple → metadata/apple}/parse.test.d.ts +0 -0
  33. /package/dist/{apple → metadata/apple}/readArchiveApple.test.d.ts +0 -0
  34. /package/dist/{apple → metadata/apple}/resolve.test.d.ts +0 -0
  35. /package/dist/{comicInfo → metadata/comicInfo}/manga.d.ts +0 -0
  36. /package/dist/{comicInfo → metadata/comicInfo}/manga.test.d.ts +0 -0
  37. /package/dist/{comicInfo → metadata/comicInfo}/parse.d.ts +0 -0
  38. /package/dist/{comicInfo → metadata/comicInfo}/parse.test.d.ts +0 -0
  39. /package/dist/{comicInfo → metadata/comicInfo}/readArchiveComicInfo.test.d.ts +0 -0
  40. /package/dist/{comicInfo → metadata/comicInfo}/resolve.test.d.ts +0 -0
  41. /package/dist/{kobo → metadata/kobo}/parse.d.ts +0 -0
  42. /package/dist/{kobo → metadata/kobo}/parse.test.d.ts +0 -0
  43. /package/dist/{kobo → metadata/kobo}/readArchiveKobo.test.d.ts +0 -0
  44. /package/dist/{kobo → metadata/kobo}/resolve.test.d.ts +0 -0
  45. /package/dist/{opf → metadata/opf}/parse.test.d.ts +0 -0
  46. /package/dist/{opf → metadata/opf}/resolve.test.d.ts +0 -0
  47. /package/dist/{opf → metadata/opf}/spineItemrefProperties.d.ts +0 -0
  48. /package/dist/{opf → metadata/opf}/spineItemrefProperties.test.d.ts +0 -0
@@ -1,56 +1,20 @@
1
1
  import { n as e, r as t, t as n } from "../createArchiveFromEntries-BiBoi26P.js";
2
2
  import { n as r, t as i } from "../fileAccessors-etcCPnpQ.js";
3
- import { XmlDocument as a, XmlElement as o, XmlTextNode as s } from "xmldoc";
4
- import { createXmlSafeIdFactory as c, detectMimeTypeFromName as l, escapeXmlAttributeValue as u, getUriBasePath as d, getUriBasename as f, isMediaContentMimeType as p, isXmlBasedMimeType as m, parseContentType as h, sortByTitleComparator as g, urlJoin as _ } from "@prose-reader/shared";
5
- //#region src/apple/parse.ts
6
- var v = "com.apple.ibooks.display-options.xml", y = (e) => e.childrenNamed("option").map((e) => ({
7
- name: e.attr?.name,
8
- value: e.val
9
- })), b = (e) => {
10
- let t = new a(e);
11
- if (t.name?.toLowerCase() !== "display_options") return { kind: "apple" };
12
- let n = t.childNamed("platform");
13
- return {
14
- kind: "apple",
15
- displayOptions: { ...n === void 0 ? {} : { platform: { options: y(n) } } }
16
- };
17
- }, x = async (e) => new TextDecoder().decode(await e.arrayBuffer()), S = (e) => !e.dir, C = (e) => e.dir, w = (e, t) => {
18
- let n = e.recordsByUri.get(t);
19
- return n && S(n) ? n : void 0;
20
- }, T = v.toLowerCase();
21
- async function E(e) {
22
- let t = e.records.find((e) => S(e) && e.basename.toLowerCase() === T);
23
- if (t) return b(await x(t));
24
- }
25
- //#endregion
26
- //#region src/utils/omitUndefined.ts
27
- var D = (e) => {
28
- let t = Object.entries(e).filter(([, e]) => e !== void 0);
29
- return Object.fromEntries(t);
30
- }, O = { displayOptions: "apple.options" }, k = (e) => {
31
- let t = e.displayOptions?.platform?.options, n = t?.find((e) => e.name === "fixed-layout")?.value.trim().toLowerCase(), r = n === "true" || n !== "false" && void 0, i = D({
32
- fixedLayout: r,
33
- options: t !== void 0 && t.length > 0 ? t.map(({ name: e, value: t }) => D({
34
- name: e,
35
- value: t
36
- })) : void 0
37
- });
38
- return D({
39
- renditionLayout: r === !0 ? "pre-paginated" : void 0,
40
- apple: Object.keys(i).length > 0 ? i : void 0
41
- });
42
- }, ee = async (e, t = {}) => n(e, (e) => e.isDir ? {
3
+ import { createXmlSafeIdFactory as a, detectMimeTypeFromName as o, escapeXmlAttributeValue as s, getUriBasePath as c, getUriBasename as l, isMediaContentMimeType as u, isXmlBasedMimeType as d, parseContentType as f, sortByTitleComparator as p, urlJoin as m } from "@prose-reader/shared";
4
+ import { XmlDocument as h, XmlElement as g, XmlTextNode as _ } from "xmldoc";
5
+ //#region src/archives/createArchiveFromArrayBufferList.ts
6
+ var v = async (e, t = {}) => n(e, (e) => e.isDir ? {
43
7
  dir: !0,
44
8
  uri: e.name
45
9
  } : {
46
10
  dir: !1,
47
11
  uri: e.name,
48
12
  size: e.size,
49
- ...i(e.data, l(e.name) ?? "")
13
+ ...i(e.data, o(e.name) ?? "")
50
14
  }, {
51
15
  ...t,
52
16
  close: () => Promise.resolve()
53
- }), te = async (t, { mimeType: n, direction: i } = { mimeType: "text/plain" }) => {
17
+ }), y = async (t, { mimeType: n, direction: i } = { mimeType: "text/plain" }) => {
54
18
  let a = `
55
19
  <?xml version="1.0" encoding="UTF-8"?>
56
20
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
@@ -72,13 +36,13 @@ var D = (e) => {
72
36
  encodingFormat: n,
73
37
  records: [{
74
38
  dir: !1,
75
- basename: f("generated.opf"),
39
+ basename: l("generated.opf"),
76
40
  uri: "generated.opf",
77
41
  size: 0,
78
42
  ...r(async () => new Blob([a]))
79
43
  }, {
80
44
  dir: !1,
81
- basename: f("p01.txt"),
45
+ basename: l("p01.txt"),
82
46
  uri: "p01.txt",
83
47
  size: typeof t == "string" ? new Blob([t]).size : t.size,
84
48
  encodingFormat: n,
@@ -86,30 +50,30 @@ var D = (e) => {
86
50
  }],
87
51
  close: () => Promise.resolve()
88
52
  });
89
- }, ne = async (t, n) => {
90
- let i = c(), a = t.map((e) => ({
53
+ }, b = async (t, n) => {
54
+ let i = a(), c = t.map((e) => ({
91
55
  id: i(e),
92
56
  url: e
93
- })), o = `
57
+ })), u = `
94
58
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
95
59
  <metadata>
96
60
  <meta property="rendition:layout">${n?.useRenditionFlow ? "reflowable" : "pre-paginated"}</meta>
97
61
  ${n?.useRenditionFlow ? "<meta property=\"rendition:flow\">scrolled-continuous</meta>" : ""}
98
62
  </metadata>
99
63
  <manifest>
100
- ${a.map(({ id: e, url: t }) => {
101
- let n = l(t);
102
- return `<item id="${e}" href="${u(t)}" media-type="${u(n ?? "")}"/>`;
64
+ ${c.map(({ id: e, url: t }) => {
65
+ let n = o(t);
66
+ return `<item id="${e}" href="${s(t)}" media-type="${s(n ?? "")}"/>`;
103
67
  }).join("\n")}
104
68
  </manifest>
105
69
  <spine>
106
- ${a.map(({ id: e }) => `<itemref idref="${e}" />`).join("\n")}
70
+ ${c.map(({ id: e }) => `<itemref idref="${e}" />`).join("\n")}
107
71
  </spine>
108
72
  </package>
109
- `, s = t.map((e) => ({
73
+ `, d = t.map((e) => ({
110
74
  dir: !1,
111
- basename: f(e),
112
- encodingFormat: l(e),
75
+ basename: l(e),
76
+ encodingFormat: o(e),
113
77
  uri: e,
114
78
  size: 0,
115
79
  ...r(async () => (await fetch(e)).blob())
@@ -120,244 +84,21 @@ var D = (e) => {
120
84
  basename: "content.opf",
121
85
  uri: "content.opf",
122
86
  size: 0,
123
- ...r(async () => new Blob([o]))
124
- }, ...s],
87
+ ...r(async () => new Blob([u]))
88
+ }, ...d],
125
89
  close: () => Promise.resolve()
126
90
  });
127
- }, re = (e) => h(e.encodingFormat ?? "") || l(e.basename), A = (e) => S(e) && re(e)?.startsWith("image/") === !0, ie = (e) => e.records.filter(S).filter(A), j = "ComicInfo.xml", ae = /* @__PURE__ */ "AgeRating.AlternateCount.AlternateNumber.AlternateSeries.BlackAndWhite.Characters.Colorist.CommunityRating.Count.CoverArtist.Day.Editor.Format.Genre.GTIN.Imprint.Inker.LanguageISO.Letterer.Locations.MainCharacterOrTeam.Manga.Month.Notes.Number.PageCount.Penciller.Publisher.Review.ScanInformation.Series.SeriesGroup.StoryArc.StoryArcNumber.Summary.Tags.Teams.Title.Translator.Volume.Web.Writer.Year".split("."), oe = /* @__PURE__ */ new Set(["Pages", "ComicInfo"]), se = (e) => e.children.some((e) => e.type === "element"), ce = (e) => {
128
- let t = e.val.trim();
129
- return t.length > 0 ? t : void 0;
130
- }, le = (e) => {
131
- let t;
132
- try {
133
- t = new a(e);
134
- } catch (e) {
135
- let t = e instanceof Error ? e.message : String(e);
136
- throw Error(`${j} is malformed: ${t}`, { cause: e });
137
- }
138
- let n = {};
139
- return t.eachChild((e) => {
140
- if (e.type !== "element" || oe.has(e.name) || se(e)) return;
141
- let t = ce(e);
142
- t !== void 0 && n[e.name] === void 0 && (n[e.name] = t);
143
- }), {
144
- kind: "comicInfo",
145
- ...n
146
- };
147
- }, ue = j.toLowerCase(), M = (e) => e.records.find((e) => S(e) && e.basename.toLowerCase() === ue), de = [
148
- "Unknown",
149
- "No",
150
- "Yes",
151
- "YesAndRightToLeft"
152
- ], fe = (e) => {
153
- for (let t of de) if (t === e) return !0;
154
- return !1;
155
- };
156
- //#endregion
157
- //#region src/comicInfo/readArchiveComicInfo.ts
158
- async function N(e) {
159
- let t = M(e);
160
- if (t) return le(await x(t));
161
- }
162
- //#endregion
163
- //#region src/utils/normalizeGtin.ts
164
- var pe = /* @__PURE__ */ new Set([
165
- 8,
166
- 12,
167
- 13,
168
- 14
169
- ]), P = (e) => {
170
- if (e == null) return;
171
- let t = String(e).replace(/\D/g, "");
172
- if (!(t.length === 0 || !pe.has(t.length))) return t;
173
- }, me = /(?:97[89])?\d{9}[\dXx]/, F = (e) => {
174
- if (e == null) return;
175
- let t = String(e).trim().replace(/^urn:isbn:/i, "").replace(/^isbn[:\s-]*/i, ""), n = t.replace(/[^0-9Xx]/g, "");
176
- if (n.length === 10 || n.length === 13) return n.toUpperCase();
177
- let r = t.match(me);
178
- if (r) return r[0].toUpperCase();
179
- }, he = {
180
- AgeRating: "comic.ageRating",
181
- AlternateCount: "comic.alternateSeries",
182
- AlternateNumber: "comic.alternateSeries",
183
- AlternateSeries: "comic.alternateSeries",
184
- BlackAndWhite: "comic.blackAndWhite",
185
- Characters: "comic.characters",
186
- Colorist: "contributors",
187
- CommunityRating: "comic.communityRating",
188
- Count: "belongsTo.series",
189
- CoverArtist: "contributors",
190
- Day: "publication.edition.date",
191
- Editor: "contributors",
192
- Format: "comic.format",
193
- Genre: "subjects",
194
- GTIN: "identifiers",
195
- Imprint: "publication.edition.imprint",
196
- Inker: "contributors",
197
- LanguageISO: "languages",
198
- Letterer: "contributors",
199
- Locations: "comic.locations",
200
- MainCharacterOrTeam: "comic.mainCharacterOrTeam",
201
- Manga: "readingDirection",
202
- Month: "publication.edition.date",
203
- Notes: "comic.notes",
204
- Number: "belongsTo.series",
205
- PageCount: "numberOfPages",
206
- Penciller: "contributors",
207
- Publisher: "publication.edition.publisher",
208
- Review: "comic.review",
209
- ScanInformation: "comic.scanInformation",
210
- Series: "belongsTo.series",
211
- SeriesGroup: "belongsTo.collection",
212
- StoryArc: "comic.storyArcs",
213
- StoryArcNumber: "comic.storyArcs",
214
- Summary: "description",
215
- Tags: "subjects",
216
- Teams: "comic.teams",
217
- Title: "title",
218
- Translator: "contributors",
219
- Volume: "comic.volume",
220
- Web: "comic.web",
221
- Writer: "contributors",
222
- Year: "publication.edition.date"
223
- }, ge = (e) => {
224
- switch (e.Manga) {
225
- case "YesAndRightToLeft": return "rtl";
226
- case "Yes":
227
- case "No": return "ltr";
228
- default: return;
229
- }
230
- }, I = (e) => {
231
- if (e === void 0) return;
232
- let t = e.trim();
233
- return t.length > 0 ? t : void 0;
234
- }, L = (e) => e === void 0 ? [] : e.split(",").map((e) => e.trim()).filter((e) => e.length > 0), R = (e) => {
235
- let t = I(e);
236
- if (t === void 0 || !/^\d+$/.test(t)) return;
237
- let n = Number.parseInt(t, 10);
238
- return Number.isFinite(n) ? n : void 0;
239
- }, z = (e) => {
240
- let t = I(e);
241
- if (t === void 0 || !/^\d+(\.\d+)?$/.test(t)) return;
242
- let n = Number.parseFloat(t);
243
- return Number.isFinite(n) ? n : void 0;
244
- }, _e = (e) => {
245
- let t = I(e)?.toLowerCase();
246
- if (t === "yes") return !0;
247
- if (t === "no") return !1;
248
- }, ve = (e) => {
249
- switch (e.Manga) {
250
- case "Yes":
251
- case "YesAndRightToLeft": return !0;
252
- case "No": return !1;
253
- default: return;
254
- }
255
- }, ye = (e) => {
256
- let t = R(e.Year), n = R(e.Month), r = R(e.Day);
257
- if (!(t === void 0 && n === void 0 && r === void 0)) return {
258
- ...t === void 0 ? {} : { year: t },
259
- ...n === void 0 ? {} : { month: n },
260
- ...r === void 0 ? {} : { day: r }
261
- };
262
- }, be = [
263
- ["Writer", "author"],
264
- ["Penciller", "penciler"],
265
- ["Inker", "inker"],
266
- ["Colorist", "colorist"],
267
- ["Letterer", "letterer"],
268
- ["CoverArtist", "coverArtist"],
269
- ["Editor", "editor"],
270
- ["Translator", "translator"]
271
- ], xe = (e) => {
272
- let t = /* @__PURE__ */ new Map();
273
- for (let [n, r] of be) for (let i of L(e[n])) {
274
- let e = t.get(i);
275
- e ? e.roles.includes(r) || e.roles.push(r) : t.set(i, {
276
- name: i,
277
- roles: [r]
278
- });
279
- }
280
- return [...t.values()];
281
- }, Se = (e) => {
282
- let t = I(e.Series);
283
- if (t !== void 0) return D({
284
- name: t,
285
- position: z(e.Number),
286
- total: R(e.Count)
287
- });
288
- }, Ce = (e) => {
289
- let t = I(e.AlternateSeries);
290
- if (t !== void 0) return D({
291
- name: t,
292
- position: z(e.AlternateNumber),
293
- total: R(e.AlternateCount)
294
- });
295
- }, we = (e) => {
296
- let t = L(e.StoryArc);
297
- if (t.length === 0) return [];
298
- let n = L(e.StoryArcNumber);
299
- return t.map((e, t) => D({
300
- name: e,
301
- position: z(n[t])
302
- }));
303
- }, B = (e) => e.length > 0 ? e : void 0, Te = (e) => {
304
- let t = B((e.Web ?? "").split(/\s+/).filter((e) => e.length > 0)), n = D({
305
- manga: ve(e),
306
- blackAndWhite: _e(e.BlackAndWhite),
307
- volume: R(e.Volume),
308
- format: I(e.Format),
309
- ageRating: I(e.AgeRating),
310
- communityRating: z(e.CommunityRating),
311
- notes: I(e.Notes),
312
- review: I(e.Review),
313
- web: t,
314
- scanInformation: I(e.ScanInformation),
315
- mainCharacterOrTeam: I(e.MainCharacterOrTeam),
316
- characters: B(L(e.Characters)),
317
- teams: B(L(e.Teams)),
318
- locations: B(L(e.Locations)),
319
- storyArcs: B(we(e)),
320
- alternateSeries: Ce(e)
321
- });
322
- return Object.keys(n).length > 0 ? n : void 0;
323
- }, Ee = (e) => {
324
- let t = Se(e), n = B(L(e.SeriesGroup).map((e) => ({ name: e })));
325
- if (!(t === void 0 && n === void 0)) return D({
326
- series: t === void 0 ? void 0 : [t],
327
- collection: n
328
- });
329
- }, V = (e) => {
330
- let t = e.GTIN, n = I(t), r = I(e.LanguageISO), i = [...L(e.Genre), ...L(e.Tags)], a = D({
331
- date: ye(e),
332
- publisher: I(e.Publisher),
333
- imprint: I(e.Imprint)
334
- });
335
- return D({
336
- title: I(e.Title),
337
- description: I(e.Summary),
338
- publication: a.date !== void 0 || a.publisher !== void 0 || a.imprint !== void 0 ? { edition: a } : void 0,
339
- languages: r === void 0 ? void 0 : [r],
340
- subjects: B(i),
341
- contributors: B(xe(e)),
342
- readingDirection: ge(e),
343
- numberOfPages: R(e.PageCount),
344
- gtin: P(t),
345
- isbn: F(t),
346
- identifiers: n === void 0 ? void 0 : [{
347
- value: n,
348
- scheme: "GTIN"
349
- }],
350
- belongsTo: Ee(e),
351
- comic: Te(e)
352
- });
353
- }, H = (e) => {
91
+ }, x = (e) => !e.dir, S = (e) => e.dir, C = (e, t) => {
92
+ let n = e.recordsByUri.get(t);
93
+ return n && x(n) ? n : void 0;
94
+ }, w = (e) => f(e.encodingFormat ?? "") || o(e.basename), T = (e) => x(e) && w(e)?.startsWith("image/") === !0, E = (e) => e.records.filter(x).filter(T), D = async (e) => new TextDecoder().decode(await e.arrayBuffer()), O = (e) => {
354
95
  let t = e.records.filter((e) => !e.dir).find((e) => e.uri.endsWith(".opf"));
355
96
  return {
356
97
  data: t,
357
98
  basePath: t?.uri.substring(0, t.uri.lastIndexOf("/")) || ""
358
99
  };
359
- }, U = (e) => e === void 0 || e.trim().length === 0 ? [] : e.trim().split(/\s+/).filter((e) => e.length > 0), De = (e) => {
360
- let t = U(e);
100
+ }, k = (e) => e === void 0 || e.trim().length === 0 ? [] : e.trim().split(/\s+/).filter((e) => e.length > 0), ee = (e) => {
101
+ let t = k(e);
361
102
  if (t.length === 0) return {};
362
103
  let n;
363
104
  t.includes("rendition:layout-reflowable") && (n = "reflowable"), t.includes("rendition:layout-pre-paginated") && (n = "pre-paginated");
@@ -368,16 +109,16 @@ var pe = /* @__PURE__ */ new Set([
368
109
  ...t.includes("page-spread-left") ? { pageSpreadLeft: !0 } : {},
369
110
  ...t.includes("page-spread-right") ? { pageSpreadRight: !0 } : {}
370
111
  };
371
- }, W = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, Oe = (e, t) => W(e).toLowerCase() === t.toLowerCase(), ke = (e) => e.type === "element", G = (e, t) => {
372
- for (let n of e.children) if (ke(n) && Oe(n.name, t)) return n;
373
- }, K = (e, t) => {
112
+ }, A = (e) => e.includes(":") ? e.slice(e.lastIndexOf(":") + 1) : e, te = (e, t) => A(e).toLowerCase() === t.toLowerCase(), j = (e) => e.type === "element", M = (e, t) => {
113
+ for (let n of e.children) if (j(n) && te(n.name, t)) return n;
114
+ }, N = (e, t) => {
374
115
  let n = [];
375
- for (let r of e.children) ke(r) && Oe(r.name, t) && n.push(r);
116
+ for (let r of e.children) j(r) && te(r.name, t) && n.push(r);
376
117
  return n;
377
- }, Ae = (e, t) => {
118
+ }, ne = (e, t) => {
378
119
  let n = [];
379
120
  return e.eachChild((e) => {
380
- if (W(e.name).toLowerCase() !== "identifier") return;
121
+ if (A(e.name).toLowerCase() !== "identifier") return;
381
122
  let r = e.val.trim();
382
123
  if (r.length === 0) return;
383
124
  let i = (e.attr["opf:scheme"] ?? e.attr["opf:Scheme"] ?? e.attr.scheme)?.trim(), a = e.attr.id?.trim(), o = a !== void 0 && a.length > 0 ? a : void 0;
@@ -388,46 +129,58 @@ var pe = /* @__PURE__ */ new Set([
388
129
  ...o !== void 0 && o === t ? { unique: !0 } : {}
389
130
  });
390
131
  }), n;
391
- }, q = (e, t) => {
132
+ }, re = (e) => {
133
+ let t = [];
134
+ return e.eachChild((e) => {
135
+ if (A(e.name).toLowerCase() !== "title") return;
136
+ let n = e.val.trim();
137
+ if (n.length === 0) return;
138
+ let r = e.attr.id?.trim();
139
+ t.push({
140
+ value: n,
141
+ ...r !== void 0 && r.length > 0 ? { id: r } : {}
142
+ });
143
+ }), t;
144
+ }, P = (e, t) => {
392
145
  let n;
393
146
  return e.eachChild((e) => {
394
- if (n !== void 0 || W(e.name).toLowerCase() !== t.toLowerCase()) return;
147
+ if (n !== void 0 || A(e.name).toLowerCase() !== t.toLowerCase()) return;
395
148
  let r = e.val.trim();
396
149
  r.length > 0 && (n = r);
397
150
  }), n;
398
- }, J = (e, t) => {
151
+ }, F = (e, t) => {
399
152
  let n = [];
400
153
  return e.eachChild((e) => {
401
- if (W(e.name).toLowerCase() !== t.toLowerCase()) return;
154
+ if (A(e.name).toLowerCase() !== t.toLowerCase()) return;
402
155
  let r = e.val.trim();
403
156
  r.length > 0 && n.push(r);
404
157
  }), n;
405
- }, je = (e) => {
158
+ }, ie = (e) => {
406
159
  let t;
407
160
  return e.eachChild((e) => {
408
- if (t !== void 0 || W(e.name).toLowerCase() !== "meta" || e.attr.name?.toLowerCase() !== "cover") return;
161
+ if (t !== void 0 || A(e.name).toLowerCase() !== "meta" || e.attr.name?.toLowerCase() !== "cover") return;
409
162
  let n = e.attr.content?.trim();
410
163
  n !== void 0 && n.length > 0 && (t = n);
411
164
  }), t;
412
- }, Me = ({ manifestItems: e, metadataEl: t }) => {
413
- let n = (e) => e.mediaType?.toLowerCase().includes("image/") === !0, r = e.find((e) => n(e) ? U(e.properties).includes("cover-image") : !1);
165
+ }, ae = ({ manifestItems: e, metadataEl: t }) => {
166
+ let n = (e) => e.mediaType?.toLowerCase().includes("image/") === !0, r = e.find((e) => n(e) ? k(e.properties).includes("cover-image") : !1);
414
167
  if (r !== void 0) return r.href;
415
168
  if (t !== void 0) {
416
- let r = je(t);
169
+ let r = ie(t);
417
170
  if (r !== void 0) {
418
171
  let t = e.find((e) => e.id === r && n(e));
419
172
  if (t !== void 0) return t.href;
420
173
  }
421
174
  }
422
175
  return e.find((e) => e.id.toLowerCase().includes("cover") && n(e))?.href;
423
- }, Y = (e, t) => {
176
+ }, I = (e, t) => {
424
177
  let n = e.attr[t]?.trim();
425
178
  return n !== void 0 && n.length > 0 ? n : void 0;
426
- }, Ne = (e) => {
179
+ }, oe = (e) => {
427
180
  let t = [];
428
181
  return e.eachChild((e) => {
429
- if (W(e.name).toLowerCase() !== "meta") return;
430
- let n = Y(e, "property"), r = Y(e, "refines"), i = Y(e, "scheme"), a = Y(e, "id"), o = Y(e, "name"), s = Y(e, "content"), c = e.val.trim(), l = c.length > 0 ? c : void 0, u = {
182
+ if (A(e.name).toLowerCase() !== "meta") return;
183
+ let n = I(e, "property"), r = I(e, "refines"), i = I(e, "scheme"), a = I(e, "id"), o = I(e, "name"), s = I(e, "content"), c = e.val.trim(), l = c.length > 0 ? c : void 0, u = {
431
184
  ...n === void 0 ? {} : { property: n },
432
185
  ...r === void 0 ? {} : { refines: r },
433
186
  ...i === void 0 ? {} : { scheme: i },
@@ -438,14 +191,14 @@ var pe = /* @__PURE__ */ new Set([
438
191
  };
439
192
  Object.keys(u).length !== 0 && t.push(u);
440
193
  }), t;
441
- }, Pe = (e, t) => e.replace(/^#/, "") === t, Fe = (e, t) => {
194
+ }, se = (e, t) => e.replace(/^#/, "") === t, ce = (e, t) => {
442
195
  let n = [];
443
196
  return e.eachChild((e) => {
444
- let r = W(e.name).toLowerCase();
197
+ let r = A(e.name).toLowerCase();
445
198
  if (r !== "creator" && r !== "contributor") return;
446
199
  let i = e.val.trim();
447
200
  if (i.length === 0) return;
448
- let a = Y(e, "id"), o = (e) => a === void 0 ? [] : t.flatMap((t) => t.refines !== void 0 && Pe(t.refines, a) && t.property === e && t.value !== void 0 ? [t.value] : []), s = Y(e, "opf:role") ?? Y(e, "role"), c = [...s === void 0 ? [] : [s], ...o("role")], l = Y(e, "opf:file-as") ?? Y(e, "file-as") ?? o("file-as")[0];
201
+ let a = I(e, "id"), o = (e) => a === void 0 ? [] : t.flatMap((t) => t.refines !== void 0 && se(t.refines, a) && t.property === e && t.value !== void 0 ? [t.value] : []), s = I(e, "opf:role") ?? I(e, "role"), c = [...s === void 0 ? [] : [s], ...o("role")], l = I(e, "opf:file-as") ?? I(e, "file-as") ?? o("file-as")[0];
449
202
  n.push({
450
203
  name: i,
451
204
  source: r,
@@ -454,14 +207,14 @@ var pe = /* @__PURE__ */ new Set([
454
207
  ...l === void 0 ? {} : { fileAs: l }
455
208
  });
456
209
  }), n;
457
- }, X = (e, t) => {
458
- let n = K(e, "meta").find((e) => e.attr.property === t)?.val;
210
+ }, L = (e, t) => {
211
+ let n = N(e, "meta").find((e) => e.attr.property === t)?.val;
459
212
  if (!(n === void 0 || n.trim().length === 0)) return n;
460
- }, Ie = (e) => {
461
- let t = G(e, "guide");
213
+ }, le = (e) => {
214
+ let t = M(e, "guide");
462
215
  if (t === void 0) return [];
463
216
  let n = [];
464
- for (let e of K(t, "reference")) {
217
+ for (let e of N(t, "reference")) {
465
218
  let t = e.attr.href?.trim();
466
219
  t === void 0 || t.length === 0 || n.push({
467
220
  href: t,
@@ -470,7 +223,7 @@ var pe = /* @__PURE__ */ new Set([
470
223
  });
471
224
  }
472
225
  return n;
473
- }, Le = (e) => {
226
+ }, ue = (e) => {
474
227
  let t = e.attr.id, n = e.attr.href;
475
228
  if (t === void 0 || t.length === 0 || n === void 0 || n.length === 0) return;
476
229
  let r = e.attr["media-type"], i = e.attr.properties?.trim();
@@ -480,24 +233,24 @@ var pe = /* @__PURE__ */ new Set([
480
233
  ...r !== void 0 && r.length > 0 ? { mediaType: r } : {},
481
234
  ...i !== void 0 && i.length > 0 ? { properties: i } : {}
482
235
  };
483
- }, Re = (e) => {
236
+ }, de = (e) => {
484
237
  let t = [], n = /* @__PURE__ */ new Map();
485
- for (let r of K(e, "item")) {
486
- let e = Le(r);
238
+ for (let r of N(e, "item")) {
239
+ let e = ue(r);
487
240
  e !== void 0 && (t.push(e), n.set(e.id, e));
488
241
  }
489
242
  return {
490
243
  items: t,
491
244
  byId: n
492
245
  };
493
- }, ze = (e, t) => {
246
+ }, fe = (e, t) => {
494
247
  let n = [];
495
- for (let r of K(t, "itemref")) {
248
+ for (let r of N(t, "itemref")) {
496
249
  let t = r.attr.idref;
497
250
  if (t === void 0 || t.trim().length === 0) continue;
498
251
  let i = e.get(t);
499
252
  if (i === void 0) continue;
500
- let a = De(r.attr.properties);
253
+ let a = ee(r.attr.properties);
501
254
  n.push({
502
255
  idref: t,
503
256
  id: i.id,
@@ -511,28 +264,28 @@ var pe = /* @__PURE__ */ new Set([
511
264
  });
512
265
  }
513
266
  return n;
514
- }, Be = (e) => {
515
- let t = new a(e), n = G(t, "manifest"), r = G(t, "spine"), i = G(t, "metadata"), o = t.attr["unique-identifier"]?.trim(), s = o !== void 0 && o.length > 0 ? o : void 0, c = [], l = [];
267
+ }, pe = (e) => {
268
+ let t = new h(e), n = M(t, "manifest"), r = M(t, "spine"), i = M(t, "metadata"), a = t.attr["unique-identifier"]?.trim(), o = a !== void 0 && a.length > 0 ? a : void 0, s = [], c = [];
516
269
  if (n !== void 0) {
517
- let { items: e, byId: t } = Re(n);
518
- c = e, r !== void 0 && (l = ze(t, r));
270
+ let { items: e, byId: t } = de(n);
271
+ s = e, r !== void 0 && (c = fe(t, r));
519
272
  }
520
- let u = r?.attr["page-progression-direction"], d = u !== void 0 && u.trim().length > 0 ? u : void 0, f = r?.attr.toc, p = f !== void 0 && f.trim().length > 0 ? f.trim() : void 0, m, h, g, _, v, y = [], b = [], x = [], S = [], C, w, T, E = [], D = [];
521
- i !== void 0 && (m = q(i, "title"), h = q(i, "publisher"), g = q(i, "description"), _ = q(i, "rights"), v = q(i, "date"), y = J(i, "creator"), x = J(i, "language"), S = J(i, "subject"), C = X(i, "rendition:layout"), w = X(i, "rendition:flow"), T = X(i, "rendition:spread"), E = Ne(i), b = Fe(i, E), D.push(...Ae(i, s)));
522
- let O = Me({
523
- manifestItems: c,
273
+ let l = r?.attr["page-progression-direction"], u = l !== void 0 && l.trim().length > 0 ? l : void 0, d = r?.attr.toc, f = d !== void 0 && d.trim().length > 0 ? d.trim() : void 0, p = [], m, g, _, v, y = [], b = [], x = [], S = [], C, w, T, E = [], D = [];
274
+ i !== void 0 && (p = re(i), m = P(i, "publisher"), g = P(i, "description"), _ = P(i, "rights"), v = P(i, "date"), y = F(i, "creator"), x = F(i, "language"), S = F(i, "subject"), C = L(i, "rendition:layout"), w = L(i, "rendition:flow"), T = L(i, "rendition:spread"), E = oe(i), b = ce(i, E), D.push(...ne(i, o)));
275
+ let O = ae({
276
+ manifestItems: s,
524
277
  metadataEl: i
525
- }), k = Ie(t);
278
+ }), k = le(t);
526
279
  return {
527
280
  kind: "opf",
528
- manifestItems: c,
529
- spineRows: l,
530
- spineTocIdref: p,
281
+ manifestItems: s,
282
+ spineRows: c,
283
+ spineTocIdref: f,
531
284
  identifiers: D,
532
- title: m,
285
+ titles: p,
533
286
  creators: y,
534
287
  contributors: b,
535
- publisher: h,
288
+ publisher: m,
536
289
  description: g,
537
290
  rights: _,
538
291
  languages: x,
@@ -542,34 +295,68 @@ var pe = /* @__PURE__ */ new Set([
542
295
  renditionLayoutMeta: C,
543
296
  renditionFlowMeta: w,
544
297
  renditionSpreadMeta: T,
545
- pageProgressionDirection: d,
298
+ pageProgressionDirection: u,
546
299
  guide: k,
547
300
  metas: E
548
301
  };
549
302
  };
550
303
  //#endregion
551
- //#region src/opf/readArchiveOpf.ts
552
- async function Z(e) {
553
- let { data: t, basePath: n } = H(e) || {};
304
+ //#region src/metadata/opf/readArchiveOpf.ts
305
+ async function R(e) {
306
+ let { data: t, basePath: n } = O(e) || {};
554
307
  if (!(!t || t.dir)) return {
555
- opf: Be(await x(t)),
308
+ opf: pe(await D(t)),
556
309
  basePath: n
557
310
  };
558
311
  }
559
312
  //#endregion
560
- //#region src/kobo/parse.ts
561
- var Ve = "com.kobobooks.display-options.xml", He = (e) => {
313
+ //#region src/metadata/apple/parse.ts
314
+ var z = "com.apple.ibooks.display-options.xml", me = (e) => e.childrenNamed("option").map((e) => ({
315
+ name: e.attr?.name,
316
+ value: e.val
317
+ })), B = (e) => {
318
+ let t = new h(e);
319
+ if (t.name?.toLowerCase() !== "display_options") return { kind: "apple" };
320
+ let n = t.childNamed("platform");
321
+ return {
322
+ kind: "apple",
323
+ displayOptions: { ...n === void 0 ? {} : { platform: { options: me(n) } } }
324
+ };
325
+ }, V = "ComicInfo.xml", he = /* @__PURE__ */ "AgeRating.AlternateCount.AlternateNumber.AlternateSeries.BlackAndWhite.Characters.Colorist.CommunityRating.Count.CoverArtist.Day.Editor.Format.Genre.GTIN.Imprint.Inker.LanguageISO.Letterer.Locations.MainCharacterOrTeam.Manga.Month.Notes.Number.PageCount.Penciller.Publisher.Review.ScanInformation.Series.SeriesGroup.StoryArc.StoryArcNumber.Summary.Tags.Teams.Title.Translator.Volume.Web.Writer.Year".split("."), ge = /* @__PURE__ */ new Set(["Pages", "ComicInfo"]), _e = (e) => e.children.some((e) => e.type === "element"), ve = (e) => {
326
+ let t = e.val.trim();
327
+ return t.length > 0 ? t : void 0;
328
+ }, ye = (e) => {
329
+ let t;
330
+ try {
331
+ t = new h(e);
332
+ } catch (e) {
333
+ let t = e instanceof Error ? e.message : String(e);
334
+ throw Error(`${V} is malformed: ${t}`, { cause: e });
335
+ }
336
+ let n = {};
337
+ return t.eachChild((e) => {
338
+ if (e.type !== "element" || ge.has(e.name) || _e(e)) return;
339
+ let t = ve(e);
340
+ t !== void 0 && n[e.name] === void 0 && (n[e.name] = t);
341
+ }), {
342
+ kind: "comicInfo",
343
+ ...n
344
+ };
345
+ }, be = "com.kobobooks.display-options.xml", xe = (e) => {
562
346
  let t = e.childNamed("platform");
563
347
  if (!t) return {};
564
348
  for (let e of t.childrenNamed("option")) if (e.attr?.name === "fixed-layout") return e.val.trim().toLowerCase() === "true" ? { renditionLayout: "pre-paginated" } : {};
565
349
  return {};
566
- }, Ue = (e) => {
567
- let t = new a(e);
350
+ }, Se = (e) => {
351
+ let t = new h(e);
568
352
  return t.name?.toLowerCase() === "display_options" ? {
569
353
  kind: "kobo",
570
- ...He(t)
354
+ ...xe(t)
571
355
  } : { kind: "kobo" };
572
- }, We = (e) => {
356
+ }, H = (e) => {
357
+ let t = Object.entries(e).filter(([, e]) => e !== void 0);
358
+ return Object.fromEntries(t);
359
+ }, Ce = (e) => {
573
360
  let t = [];
574
361
  for (let n of e.split("/")) if (n !== ".") {
575
362
  if (n === "..") {
@@ -579,19 +366,19 @@ var Ve = "com.kobobooks.display-options.xml", He = (e) => {
579
366
  t.push(n);
580
367
  }
581
368
  return t.join("/");
582
- }, Ge = (e, t) => /^https?:\/\//.test(e) ? e : We(t ? `${t}/${e}` : e), Ke = (e) => {
369
+ }, we = (e, t) => /^https?:\/\//.test(e) ? e : Ce(t ? `${t}/${e}` : e), Te = (e) => {
583
370
  let t = e?.trim().toLowerCase();
584
371
  return t === "reflowable" || t === "pre-paginated" ? t : void 0;
585
- }, qe = (e, { opf: t, basePath: n }) => {
586
- let r = Ke(t.renditionLayoutMeta), i = t.spineRows.map((t) => {
587
- let r = Ge(t.href, n);
372
+ }, Ee = (e, { opf: t, basePath: n }) => {
373
+ let r = Te(t.renditionLayoutMeta), i = t.spineRows.map((t) => {
374
+ let r = we(t.href, n);
588
375
  return {
589
376
  row: t,
590
377
  uri: r,
591
- record: w(e, r)
378
+ record: C(e, r)
592
379
  };
593
380
  }), a = i.reduce((e, { record: t }) => e + (t?.size ?? 0), 0);
594
- return i.map(({ row: e, uri: n, record: i }) => D({
381
+ return i.map(({ row: e, uri: n, record: i }) => H({
595
382
  uri: n,
596
383
  id: e.id,
597
384
  mediaType: e.mediaType ?? i?.encodingFormat,
@@ -602,57 +389,294 @@ var Ve = "com.kobobooks.display-options.xml", He = (e) => {
602
389
  pageSpreadRight: e.pageSpreadRight,
603
390
  progressionWeight: a > 0 ? (i?.size ?? 0) / a : 1 / t.spineRows.length
604
391
  }));
605
- }, Je = j.toLowerCase(), Ye = v.toLowerCase(), Xe = (e) => {
392
+ }, De = V.toLowerCase(), Oe = z.toLowerCase(), ke = (e) => {
606
393
  let t = e.basename.toLowerCase();
607
- return t === Je || t === Ye || e.uri.endsWith("com.kobobooks.display-options.xml") || t.endsWith(".db");
608
- }, Ze = (e) => {
609
- let t = e.records.filter(S).filter((e) => !Xe(e));
394
+ return t === De || t === Oe || e.uri.endsWith("com.kobobooks.display-options.xml") || t.endsWith(".db");
395
+ }, Ae = (e) => {
396
+ let t = e.records.filter(x).filter((e) => !ke(e));
610
397
  return t.map((e) => {
611
- let n = h(e.encodingFormat ?? "") || l(e.basename);
612
- return D({
398
+ let n = f(e.encodingFormat ?? "") || o(e.basename);
399
+ return H({
613
400
  uri: e.uri,
614
401
  mediaType: n,
615
402
  size: e.size,
616
- renditionLayout: n !== void 0 && p(n) ? "pre-paginated" : void 0,
403
+ renditionLayout: n !== void 0 && u(n) ? "pre-paginated" : void 0,
617
404
  progressionWeight: 1 / t.length
618
405
  });
619
406
  });
620
- }, Q = async (e, { opf: t } = {}) => {
621
- let n = t ?? await Z(e).catch(() => void 0);
622
- return n ? qe(e, n) : Ze(e);
623
- }, Qe = (e, t) => {
624
- let n = w(e, t);
625
- if (n !== void 0) return h(n.encodingFormat ?? "") || l(n.basename);
626
- }, $e = async (e, { opf: t, readingOrder: n } = {}) => {
627
- let r = t ?? await Z(e).catch(() => void 0);
407
+ }, U = async (e, { opf: t } = {}) => {
408
+ let n = t ?? await R(e).catch(() => void 0);
409
+ return n ? Ee(e, n) : Ae(e);
410
+ }, je = (e, t) => {
411
+ let n = C(e, t);
412
+ if (n !== void 0) return f(n.encodingFormat ?? "") || o(n.basename);
413
+ }, Me = async (e, { opf: t, readingOrder: n } = {}) => {
414
+ let r = t ?? await R(e).catch(() => void 0);
628
415
  if (r !== void 0 && r.opf.coverHref !== void 0) {
629
- let t = Ge(r.opf.coverHref, r.basePath);
630
- return D({
416
+ let t = we(r.opf.coverHref, r.basePath);
417
+ return H({
631
418
  uri: t,
632
- mediaType: Qe(e, t),
419
+ mediaType: je(e, t),
633
420
  confidence: "derived"
634
421
  });
635
422
  }
636
- let i = (n ?? await Q(e, { opf: r })).find((e) => e.mediaType?.startsWith("image/") === !0);
637
- if (i !== void 0) return D({
423
+ let i = (n ?? await U(e, { opf: r })).find((e) => e.mediaType?.startsWith("image/") === !0);
424
+ if (i !== void 0) return H({
638
425
  uri: i.uri,
639
426
  mediaType: i.mediaType,
640
427
  confidence: "assumed"
641
428
  });
429
+ }, Ne = (e) => {
430
+ let t = e.descendantWithPath("head")?.childrenNamed("meta").find((e) => e.attr.name === "viewport");
431
+ return !!(t && t.attr.name === "viewport");
432
+ }, Pe = async (e, n) => {
433
+ if (n.length === 0) return !1;
434
+ for (let r of n) {
435
+ if (!d({
436
+ mimeType: r.mediaType,
437
+ uri: r.uri
438
+ })) return !1;
439
+ let n = C(e, r.uri);
440
+ if (!n || !x(n)) return !1;
441
+ try {
442
+ if (!Ne(new h(await D(n)))) return !1;
443
+ } catch (e) {
444
+ return t.error(`layout scan: unable to inspect ${r.uri}`, e), !1;
445
+ }
446
+ }
447
+ return !0;
448
+ }, Fe = z.toLowerCase();
449
+ async function Ie(e) {
450
+ let t = e.records.find((e) => x(e) && e.basename.toLowerCase() === Fe);
451
+ if (t) return B(await D(t));
452
+ }
453
+ //#endregion
454
+ //#region src/metadata/apple/resolve.ts
455
+ var Le = { displayOptions: "apple.options" }, Re = (e) => {
456
+ let t = e.displayOptions?.platform?.options, n = t?.find((e) => e.name === "fixed-layout")?.value.trim().toLowerCase(), r = n === "true" || n !== "false" && void 0, i = H({
457
+ fixedLayout: r,
458
+ options: t !== void 0 && t.length > 0 ? t.map(({ name: e, value: t }) => H({
459
+ name: e,
460
+ value: t
461
+ })) : void 0
462
+ });
463
+ return H({
464
+ renditionLayout: r === !0 ? "pre-paginated" : void 0,
465
+ apple: Object.keys(i).length > 0 ? i : void 0
466
+ });
467
+ }, ze = V.toLowerCase(), W = (e) => e.records.find((e) => x(e) && e.basename.toLowerCase() === ze), Be = [
468
+ "Unknown",
469
+ "No",
470
+ "Yes",
471
+ "YesAndRightToLeft"
472
+ ], Ve = (e) => {
473
+ for (let t of Be) if (t === e) return !0;
474
+ return !1;
475
+ };
476
+ //#endregion
477
+ //#region src/metadata/comicInfo/readArchiveComicInfo.ts
478
+ async function He(e) {
479
+ let t = W(e);
480
+ if (t) return ye(await D(t));
481
+ }
482
+ //#endregion
483
+ //#region src/metadata/comicInfo/resolve.ts
484
+ var Ue = {
485
+ AgeRating: "comic.ageRating",
486
+ AlternateCount: "comic.alternateSeries",
487
+ AlternateNumber: "comic.alternateSeries",
488
+ AlternateSeries: "comic.alternateSeries",
489
+ BlackAndWhite: "comic.blackAndWhite",
490
+ Characters: "comic.characters",
491
+ Colorist: "contributors",
492
+ CommunityRating: "comic.communityRating",
493
+ Count: "belongsTo.series",
494
+ CoverArtist: "contributors",
495
+ Day: "publication.edition.date",
496
+ Editor: "contributors",
497
+ Format: "comic.format",
498
+ Genre: "subjects",
499
+ GTIN: "identifiers",
500
+ Imprint: "publication.edition.imprint",
501
+ Inker: "contributors",
502
+ LanguageISO: "languages",
503
+ Letterer: "contributors",
504
+ Locations: "comic.locations",
505
+ MainCharacterOrTeam: "comic.mainCharacterOrTeam",
506
+ Manga: "readingDirection",
507
+ Month: "publication.edition.date",
508
+ Notes: "comic.notes",
509
+ Number: "belongsTo.series",
510
+ PageCount: "numberOfPages",
511
+ Penciller: "contributors",
512
+ Publisher: "publication.edition.publisher",
513
+ Review: "comic.review",
514
+ ScanInformation: "comic.scanInformation",
515
+ Series: "belongsTo.series",
516
+ SeriesGroup: "belongsTo.collection",
517
+ StoryArc: "comic.storyArcs",
518
+ StoryArcNumber: "comic.storyArcs",
519
+ Summary: "description",
520
+ Tags: "subjects",
521
+ Teams: "comic.teams",
522
+ Title: "titles",
523
+ Translator: "contributors",
524
+ Volume: "comic.volume",
525
+ Web: "comic.web",
526
+ Writer: "contributors",
527
+ Year: "publication.edition.date"
528
+ }, We = (e) => {
529
+ switch (e.Manga) {
530
+ case "YesAndRightToLeft": return "rtl";
531
+ case "Yes":
532
+ case "No": return "ltr";
533
+ default: return;
534
+ }
535
+ }, G = (e) => {
536
+ if (e === void 0) return;
537
+ let t = e.trim();
538
+ return t.length > 0 ? t : void 0;
539
+ }, K = (e) => e === void 0 ? [] : e.split(",").map((e) => e.trim()).filter((e) => e.length > 0), q = (e) => {
540
+ let t = G(e);
541
+ if (t === void 0 || !/^\d+$/.test(t)) return;
542
+ let n = Number.parseInt(t, 10);
543
+ return Number.isFinite(n) ? n : void 0;
544
+ }, J = (e) => {
545
+ let t = G(e);
546
+ if (t === void 0 || !/^\d+(\.\d+)?$/.test(t)) return;
547
+ let n = Number.parseFloat(t);
548
+ return Number.isFinite(n) ? n : void 0;
549
+ }, Ge = (e) => {
550
+ let t = G(e)?.toLowerCase();
551
+ if (t === "yes") return !0;
552
+ if (t === "no") return !1;
553
+ }, Ke = (e) => {
554
+ switch (e.Manga) {
555
+ case "Yes":
556
+ case "YesAndRightToLeft": return !0;
557
+ case "No": return !1;
558
+ default: return;
559
+ }
560
+ }, qe = (e) => {
561
+ let t = q(e.Year), n = q(e.Month), r = q(e.Day);
562
+ if (!(t === void 0 && n === void 0 && r === void 0)) return {
563
+ ...t === void 0 ? {} : { year: t },
564
+ ...n === void 0 ? {} : { month: n },
565
+ ...r === void 0 ? {} : { day: r }
566
+ };
567
+ }, Je = [
568
+ ["Writer", "author"],
569
+ ["Penciller", "penciler"],
570
+ ["Inker", "inker"],
571
+ ["Colorist", "colorist"],
572
+ ["Letterer", "letterer"],
573
+ ["CoverArtist", "coverArtist"],
574
+ ["Editor", "editor"],
575
+ ["Translator", "translator"]
576
+ ], Ye = (e) => {
577
+ let t = /* @__PURE__ */ new Map();
578
+ for (let [n, r] of Je) for (let i of K(e[n])) {
579
+ let e = t.get(i);
580
+ e ? e.roles.includes(r) || e.roles.push(r) : t.set(i, {
581
+ name: i,
582
+ roles: [r]
583
+ });
584
+ }
585
+ return [...t.values()];
586
+ }, Xe = (e) => {
587
+ let t = H({
588
+ name: G(e.Series),
589
+ position: J(e.Number),
590
+ total: q(e.Count)
591
+ });
592
+ return Object.keys(t).length > 0 ? t : void 0;
593
+ }, Ze = (e) => {
594
+ let t = G(e.AlternateSeries);
595
+ if (t !== void 0) return H({
596
+ name: t,
597
+ position: J(e.AlternateNumber),
598
+ total: q(e.AlternateCount)
599
+ });
600
+ }, Qe = (e) => {
601
+ let t = K(e.StoryArc);
602
+ if (t.length === 0) return [];
603
+ let n = K(e.StoryArcNumber);
604
+ return t.map((e, t) => H({
605
+ name: e,
606
+ position: J(n[t])
607
+ }));
608
+ }, Y = (e) => e.length > 0 ? e : void 0, $e = (e) => (e.Web ?? "").split(/\s+/).filter((e) => e.length > 0), et = (e) => {
609
+ try {
610
+ let t = new URL(e);
611
+ return (t.protocol === "http:" || t.protocol === "https:") && t.hostname.length > 0;
612
+ } catch {
613
+ return !1;
614
+ }
615
+ }, tt = (e) => e.filter((e, t, n) => et(e) && n.indexOf(e) === t).map((e) => ({
616
+ value: e,
617
+ scheme: "URL"
618
+ })), nt = (e, t) => {
619
+ let n = H({
620
+ manga: Ke(e),
621
+ blackAndWhite: Ge(e.BlackAndWhite),
622
+ volume: q(e.Volume),
623
+ format: G(e.Format),
624
+ ageRating: G(e.AgeRating),
625
+ communityRating: J(e.CommunityRating),
626
+ notes: G(e.Notes),
627
+ review: G(e.Review),
628
+ web: Y(t),
629
+ scanInformation: G(e.ScanInformation),
630
+ mainCharacterOrTeam: G(e.MainCharacterOrTeam),
631
+ characters: Y(K(e.Characters)),
632
+ teams: Y(K(e.Teams)),
633
+ locations: Y(K(e.Locations)),
634
+ storyArcs: Y(Qe(e)),
635
+ alternateSeries: Ze(e)
636
+ });
637
+ return Object.keys(n).length > 0 ? n : void 0;
638
+ }, rt = (e) => {
639
+ let t = Xe(e), n = Y(K(e.SeriesGroup).map((e) => ({ name: e })));
640
+ if (!(t === void 0 && n === void 0)) return H({
641
+ series: t === void 0 ? void 0 : [t],
642
+ collection: n
643
+ });
644
+ }, it = (e) => {
645
+ let t = e.GTIN, n = G(t), r = $e(e), i = [...n === void 0 ? [] : [{
646
+ value: n,
647
+ scheme: "GTIN"
648
+ }], ...tt(r)], a = G(e.LanguageISO), o = [...K(e.Genre), ...K(e.Tags)], s = H({
649
+ date: qe(e),
650
+ publisher: G(e.Publisher),
651
+ imprint: G(e.Imprint)
652
+ }), c = G(e.Title);
653
+ return H({
654
+ titles: c === void 0 ? void 0 : [{ value: c }],
655
+ description: G(e.Summary),
656
+ publication: s.date !== void 0 || s.publisher !== void 0 || s.imprint !== void 0 ? { edition: s } : void 0,
657
+ languages: a === void 0 ? void 0 : [a],
658
+ subjects: Y(o),
659
+ contributors: Y(Ye(e)),
660
+ readingDirection: We(e),
661
+ numberOfPages: q(e.PageCount),
662
+ identifiers: Y(i),
663
+ belongsTo: rt(e),
664
+ comic: nt(e, r)
665
+ });
642
666
  };
643
667
  //#endregion
644
- //#region src/kobo/readArchiveKobo.ts
645
- async function et(e) {
646
- let n = e.records.filter((e) => S(e) && e.uri.endsWith("com.kobobooks.display-options.xml"));
668
+ //#region src/metadata/kobo/readArchiveKobo.ts
669
+ async function at(e) {
670
+ let n = e.records.filter((e) => x(e) && e.uri.endsWith("com.kobobooks.display-options.xml"));
647
671
  if (n.length === 0) return;
648
672
  let r;
649
673
  for (let e of n) {
650
- let n = await x(e);
674
+ let n = await D(e);
651
675
  try {
652
- let { renditionLayout: e } = Ue(n);
676
+ let { renditionLayout: e } = Se(n);
653
677
  e && (r = e);
654
678
  } catch (n) {
655
- t.error(`Unable to parse ${Ve} (${e.uri})`, n);
679
+ t.error(`Unable to parse ${be} (${e.uri})`, n);
656
680
  }
657
681
  }
658
682
  return {
@@ -661,34 +685,30 @@ async function et(e) {
661
685
  };
662
686
  }
663
687
  //#endregion
664
- //#region src/kobo/resolve.ts
665
- var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
688
+ //#region src/metadata/kobo/resolve.ts
689
+ var ot = { renditionLayout: "renditionLayout" }, st = (e) => H({
666
690
  renditionLayout: e.renditionLayout,
667
691
  kobo: e.renditionLayout === void 0 ? void 0 : { fixedLayout: e.renditionLayout === "pre-paginated" }
668
- }), rt = (e) => {
669
- let t = e.descendantWithPath("head")?.childrenNamed("meta").find((e) => e.attr.name === "viewport");
670
- return !!(t && t.attr.name === "viewport");
671
- }, it = async (e, n) => {
672
- if (n.length === 0) return !1;
673
- for (let r of n) {
674
- if (!m({
675
- mimeType: r.mediaType,
676
- uri: r.uri
677
- })) return !1;
678
- let n = w(e, r.uri);
679
- if (!n || !S(n)) return !1;
680
- try {
681
- if (!rt(new a(await x(n)))) return !1;
682
- } catch (e) {
683
- return t.error(`layout scan: unable to inspect ${r.uri}`, e), !1;
684
- }
685
- }
686
- return !0;
687
- }, at = async ({ archive: e, archiveOpf: t }) => {
692
+ }), ct = async ({ archive: e, archiveOpf: t }) => {
688
693
  if (!t) return [];
689
694
  let { opf: n, basePath: r } = t, { spineRows: i } = n;
690
695
  return e.records.filter((e) => i.find((t) => r ? `${r}/${t.href}` === e.uri : `${t.href}` === e.uri));
691
- }, ot = (e) => e.toLowerCase().endsWith(".opf"), st = (e) => e.records.some((e) => !e.dir && (ot(e.basename) || ot(e.uri))), ct = (e) => {
696
+ }, lt = (e) => e.toLowerCase().endsWith(".opf"), ut = (e) => e.records.some((e) => !e.dir && (lt(e.basename) || lt(e.uri))), dt = /* @__PURE__ */ new Set([
697
+ 8,
698
+ 12,
699
+ 13,
700
+ 14
701
+ ]), ft = (e) => {
702
+ if (e == null) return;
703
+ let t = String(e).replace(/\D/g, "");
704
+ if (!(t.length === 0 || !dt.has(t.length))) return t;
705
+ }, pt = /(?:97[89])?\d{9}[\dXx]/, mt = (e) => {
706
+ if (e == null) return;
707
+ let t = String(e).trim().replace(/^urn:isbn:/i, "").replace(/^isbn[:\s-]*/i, ""), n = t.replace(/[^0-9Xx]/g, "");
708
+ if (n.length === 10 || n.length === 13) return n.toUpperCase();
709
+ let r = t.match(pt);
710
+ if (r) return r[0].toUpperCase();
711
+ }, ht = (e) => {
692
712
  if (e === void 0) return;
693
713
  let t = e.trim().match(/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?/);
694
714
  if (t === null) return;
@@ -698,12 +718,12 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
698
718
  ...r === void 0 ? {} : { month: Number.parseInt(r, 10) },
699
719
  ...i === void 0 ? {} : { day: Number.parseInt(i, 10) }
700
720
  };
701
- }, lt = {
721
+ }, gt = {
702
722
  manifestItems: "readingOrder",
703
723
  spineRows: "readingOrder",
704
724
  spineTocIdref: "toc",
705
725
  identifiers: "identifiers",
706
- title: "title",
726
+ titles: "titles",
707
727
  creators: "contributors",
708
728
  contributors: "contributors",
709
729
  publisher: "publication.edition.publisher",
@@ -719,18 +739,27 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
719
739
  pageProgressionDirection: "readingDirection",
720
740
  guide: "guide",
721
741
  metas: "properties"
722
- }, ut = (e) => {
723
- for (let t of e) if (t.scheme !== void 0 && t.scheme.trim().toLowerCase() === "isbn" && F(t.value) !== void 0) return t.value;
724
- for (let t of e) if (F(t.value) !== void 0) return t.value;
725
- }, dt = (e) => {
742
+ }, _t = (e) => {
726
743
  let t = e.trim();
727
744
  if (/^https?:\/\//i.test(t)) try {
728
745
  let e = new URL(t);
729
- return (e.protocol === "http:" || e.protocol === "https:") && e.hostname.length > 0 ? "URL" : void 0;
730
- } catch {
731
- return;
746
+ if ((e.protocol === "http:" || e.protocol === "https:") && e.hostname.length > 0) return "URL";
747
+ } catch {}
748
+ let n = mt(t);
749
+ return n !== void 0 && (n.length === 10 || /^97[89]/.test(n)) ? "ISBN" : ft(t) === void 0 ? "Unknown" : "GTIN";
750
+ }, vt = (e) => {
751
+ switch (e.trim().toLowerCase()) {
752
+ case "isbn": return "ISBN";
753
+ case "gtin": return "GTIN";
754
+ case "doi": return "DOI";
755
+ case "googlebooks": return "GoogleBooks";
756
+ case "openlibrary": return "OpenLibrary";
757
+ case "projectgutenberg": return "ProjectGutenberg";
758
+ case "url": return "URL";
759
+ case "unknown": return "Unknown";
760
+ default: return e.trim();
732
761
  }
733
- }, ft = {
762
+ }, yt = {
734
763
  art: "artist",
735
764
  aut: "author",
736
765
  clr: "colorist",
@@ -739,14 +768,14 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
739
768
  ill: "illustrator",
740
769
  nrt: "narrator",
741
770
  trl: "translator"
742
- }, pt = (e) => e.contributors.map((e) => {
743
- let t = e.roles.map((e) => ft[e.trim().toLowerCase()] ?? e);
744
- return D({
771
+ }, bt = (e) => e.contributors.map((e) => {
772
+ let t = e.roles.map((e) => yt[e.trim().toLowerCase()] ?? e);
773
+ return H({
745
774
  name: e.name,
746
775
  roles: t.length > 0 ? t : [e.source === "creator" ? "author" : "contributor"],
747
776
  sortAs: e.fileAs
748
777
  });
749
- }), mt = (e, t) => e.refines !== void 0 && e.refines.replace(/^#/, "") === t, ht = {
778
+ }), X = (e, t) => e.refines !== void 0 && e.refines.replace(/^#/, "") === t, xt = {
750
779
  "02": "ISBN",
751
780
  "03": "GTIN",
752
781
  "04": "UPC",
@@ -762,82 +791,105 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
762
791
  26: "DOI",
763
792
  34: "GTIN",
764
793
  35: "ARK"
765
- }, gt = (e) => {
794
+ }, St = (e) => {
766
795
  let t = e?.value?.trim();
767
- if (!(t === void 0 || t.length === 0)) return e?.scheme?.trim().toLowerCase() === "onix:codelist5" ? ht[t] ?? t : t;
768
- }, _t = (e, t) => {
796
+ if (!(t === void 0 || t.length === 0)) return e?.scheme?.trim().toLowerCase() === "onix:codelist5" ? xt[t] ?? t : t;
797
+ }, Ct = (e, t) => {
769
798
  let n = e.id;
770
- if (n !== void 0) return gt(t.find((e) => e.property === "identifier-type" && mt(e, n) && e.value !== void 0));
771
- }, vt = (e) => {
799
+ if (n !== void 0) return St(t.find((e) => e.property === "identifier-type" && X(e, n) && e.value !== void 0));
800
+ }, wt = (e) => {
772
801
  let t = e?.trim();
773
802
  if (t === void 0 || !/^\d+(\.\d+)?$/.test(t)) return;
774
803
  let n = Number.parseFloat(t);
775
804
  return Number.isFinite(n) ? n : void 0;
776
- }, yt = (e) => {
805
+ }, Tt = (e) => {
806
+ let t = e?.trim();
807
+ if (t === void 0 || !/^\d+$/.test(t)) return;
808
+ let n = Number.parseInt(t, 10);
809
+ return Number.isFinite(n) ? n : void 0;
810
+ }, Z = (e) => {
811
+ let t = e?.trim();
812
+ return t !== void 0 && t.length > 0 ? t : void 0;
813
+ }, Q = (e, t, n) => t === void 0 ? void 0 : e.find((e) => X(e, t) && e.property === n && e.value !== void 0)?.value, Et = (e) => e.titles.map((t) => H({
814
+ value: t.value,
815
+ type: Z(Q(e.metas, t.id, "title-type"))?.toLowerCase(),
816
+ displaySeq: Tt(Q(e.metas, t.id, "display-seq")),
817
+ sortAs: Z(Q(e.metas, t.id, "file-as"))
818
+ })), Dt = (e, t) => {
819
+ if (t === void 0) return;
820
+ let n = e.flatMap((n) => {
821
+ if (!X(n, t) || n.property !== "dcterms:identifier") return [];
822
+ let r = Z(n.value);
823
+ return r === void 0 ? [] : [{
824
+ value: r,
825
+ scheme: vt(St(e.find((e) => n.id !== void 0 && X(e, n.id) && e.property === "identifier-type")) ?? _t(r))
826
+ }];
827
+ });
828
+ return n.length > 0 ? n : void 0;
829
+ }, Ot = (e) => {
777
830
  let t = [], n = [];
778
831
  for (let r of e) {
779
832
  if (r.property !== "belongs-to-collection" || r.value === void 0) continue;
780
- let i = r.id, a = (t) => i === void 0 ? void 0 : e.find((e) => mt(e, i) && e.property === t && e.value !== void 0)?.value, o = a("collection-type")?.trim().toLowerCase(), s = D({
833
+ let i = r.id, a = (t) => Q(e, i, t), o = a("collection-type")?.trim().toLowerCase(), s = H({
781
834
  name: r.value,
782
- position: vt(a("group-position"))
835
+ identifiers: Dt(e, i),
836
+ position: wt(a("group-position"))
783
837
  });
784
838
  o === "series" ? t.push(s) : n.push(s);
785
839
  }
786
840
  if (t.length === 0) {
787
841
  let n = e.find((e) => e.name?.toLowerCase() === "calibre:series" && e.content !== void 0)?.content;
788
- n !== void 0 && t.push(D({
842
+ n !== void 0 && t.push(H({
789
843
  name: n,
790
- position: vt(e.find((e) => e.name?.toLowerCase() === "calibre:series_index")?.content)
844
+ position: wt(e.find((e) => e.name?.toLowerCase() === "calibre:series_index")?.content)
791
845
  }));
792
846
  }
793
847
  return {
794
848
  series: t,
795
849
  collection: n
796
850
  };
797
- }, bt = (e) => {
851
+ }, kt = (e) => {
798
852
  let t = e?.trim();
799
853
  if (t === "scrolled-continuous" || t === "scrolled-doc" || t === "paginated" || t === "auto") return t;
800
- }, xt = (e) => {
854
+ }, At = (e) => {
801
855
  let t = e?.trim();
802
856
  if (t === "none" || t === "landscape" || t === "portrait" || t === "both" || t === "auto") return t;
803
- }, St = (e) => {
804
- let t = e.pageProgressionDirection?.trim().toLowerCase(), n = t === "ltr" || t === "rtl" ? t : void 0, r = e.renditionLayoutMeta?.trim().toLowerCase(), i = r === "reflowable" || r === "pre-paginated" ? r : void 0, a = ut(e.identifiers), o = pt(e), { series: s, collection: c } = yt(e.metas), l = s.length > 0 || c.length > 0 ? D({
857
+ }, jt = (e) => {
858
+ let t = e.pageProgressionDirection?.trim().toLowerCase(), n = t === "ltr" || t === "rtl" ? t : void 0, r = e.renditionLayoutMeta?.trim().toLowerCase(), i = r === "reflowable" || r === "pre-paginated" ? r : void 0, a = bt(e), o = Et(e), { series: s, collection: c } = Ot(e.metas), l = s.length > 0 || c.length > 0 ? H({
805
859
  series: s.length > 0 ? s : void 0,
806
860
  collection: c.length > 0 ? c : void 0
807
- }) : void 0, u = D({
808
- date: ct(e.date),
861
+ }) : void 0, u = H({
862
+ date: ht(e.date),
809
863
  publisher: e.publisher
810
864
  });
811
- return D({
812
- title: e.title,
865
+ return H({
866
+ titles: o.length > 0 ? o : void 0,
813
867
  description: e.description,
814
868
  publication: u.date !== void 0 || u.publisher !== void 0 ? { edition: u } : void 0,
815
869
  rights: e.rights,
816
870
  languages: e.languages.length > 0 ? [...e.languages] : void 0,
817
871
  subjects: e.subjects.length > 0 ? [...e.subjects] : void 0,
818
- contributors: o.length > 0 ? o : void 0,
872
+ contributors: a.length > 0 ? a : void 0,
819
873
  readingDirection: n,
820
874
  renditionLayout: i,
821
- renditionFlow: bt(e.renditionFlowMeta),
822
- renditionSpread: xt(e.renditionSpreadMeta),
823
- gtin: P(a),
824
- isbn: F(a),
825
- identifiers: e.identifiers.length > 0 ? e.identifiers.map((t) => D({
875
+ renditionFlow: kt(e.renditionFlowMeta),
876
+ renditionSpread: At(e.renditionSpreadMeta),
877
+ identifiers: e.identifiers.length > 0 ? e.identifiers.map((t) => H({
826
878
  value: t.value,
827
- scheme: t.scheme ?? _t(t, e.metas) ?? dt(t.value),
879
+ scheme: vt(t.scheme ?? Ct(t, e.metas) ?? _t(t.value)),
828
880
  unique: t.unique
829
881
  })) : void 0,
830
882
  belongsTo: l,
831
883
  properties: e.metas.length > 0 ? [...e.metas] : void 0
832
884
  });
833
- }, Ct = (e) => e.kind === "comicInfo" ? V(e) : e.kind === "kobo" ? nt(e) : e.kind === "apple" ? k(e) : St(e), wt = (e) => {
834
- let t = e.opf === void 0 ? void 0 : St(e.opf), n = e.comicInfo === void 0 ? void 0 : V(e.comicInfo), r = e.apple === void 0 ? void 0 : k(e.apple), i = e.kobo === void 0 ? void 0 : nt(e.kobo), a = [...t?.identifiers ?? [], ...n?.identifiers ?? []], o = D({
885
+ }, Mt = (e) => e.kind === "comicInfo" ? it(e) : e.kind === "kobo" ? st(e) : e.kind === "apple" ? Re(e) : jt(e), Nt = (e) => {
886
+ let t = e.opf === void 0 ? void 0 : jt(e.opf), n = e.comicInfo === void 0 ? void 0 : it(e.comicInfo), r = e.apple === void 0 ? void 0 : Re(e.apple), i = e.kobo === void 0 ? void 0 : st(e.kobo), a = [...t?.identifiers ?? [], ...n?.identifiers ?? []], o = H({
835
887
  date: t?.publication?.edition?.date ?? n?.publication?.edition?.date,
836
888
  publisher: t?.publication?.edition?.publisher ?? n?.publication?.edition?.publisher,
837
889
  imprint: t?.publication?.edition?.imprint ?? n?.publication?.edition?.imprint
838
890
  });
839
- return D({
840
- title: t?.title ?? n?.title,
891
+ return H({
892
+ titles: t?.titles ?? n?.titles,
841
893
  description: t?.description ?? n?.description,
842
894
  publication: o.date !== void 0 || o.publisher !== void 0 || o.imprint !== void 0 ? { edition: o } : void 0,
843
895
  rights: t?.rights,
@@ -849,8 +901,6 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
849
901
  renditionFlow: t?.renditionFlow,
850
902
  renditionSpread: t?.renditionSpread,
851
903
  numberOfPages: n?.numberOfPages,
852
- gtin: t?.gtin ?? n?.gtin,
853
- isbn: t?.isbn ?? n?.isbn,
854
904
  identifiers: a.length > 0 ? a : void 0,
855
905
  belongsTo: t?.belongsTo ?? n?.belongsTo,
856
906
  properties: t?.properties,
@@ -858,8 +908,8 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
858
908
  apple: r?.apple,
859
909
  kobo: i?.kobo
860
910
  });
861
- }, Tt = (e) => {
862
- let t = [...e.records].sort((e, t) => g(e.uri, t.uri)), n = (e, t, r, i, a) => {
911
+ }, Pt = (e) => {
912
+ let t = [...e.records].sort((e, t) => p(e.uri, t.uri)), n = (e, t, r, i, a) => {
863
913
  let o = e.find((e) => e.title === t), [s, ...c] = r;
864
914
  return o ? s ? [...e.filter((e) => e !== o), {
865
915
  ...o,
@@ -887,71 +937,71 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
887
937
  let a = encodeURI(t.uri).replace(/#/g, "%23").replace(/\?/g, "%3F").replace(/\/$/, ""), o = t.uri.replace(/\/$/, "");
888
938
  return n(e, r, i, a, o);
889
939
  }, []);
890
- }, Et = (e) => e ? e.children.map((e) => e instanceof s ? e.text : e instanceof o ? Et(e) : "").join("").trim() : "", Dt = (e) => U(e.properties).includes("nav"), Ot = (e, { basePath: t }) => {
940
+ }, Ft = (e) => e ? e.children.map((e) => e instanceof _ ? e.text : e instanceof g ? Ft(e) : "").join("").trim() : "", It = (e) => k(e.properties).includes("nav"), Lt = (e, { basePath: t }) => {
891
941
  let n = {
892
942
  contents: [],
893
943
  path: "",
894
944
  containerHref: "",
895
945
  title: ""
896
946
  }, r = e.childNamed("span") || e.childNamed("a");
897
- n.title = (r?.attr.title || r?.val.trim() || Et(r)) ?? "";
947
+ n.title = (r?.attr.title || r?.val.trim() || Ft(r)) ?? "";
898
948
  let i = r?.name;
899
- i !== "a" && (r = e.descendantWithPath(`${i}.a`), r && (i = r.name.toLowerCase())), i === "a" && r?.attr.href && (n.path = _(t, r.attr.href), n.containerHref = n.path);
949
+ i !== "a" && (r = e.descendantWithPath(`${i}.a`), r && (i = r.name.toLowerCase())), i === "a" && r?.attr.href && (n.path = m(t, r.attr.href), n.containerHref = n.path);
900
950
  let a = e.childNamed("ol");
901
951
  if (a) {
902
952
  let e = a.childrenNamed("li");
903
- e && e.length > 0 && (n.contents = e.map((e) => Ot(e, { basePath: t })));
953
+ e && e.length > 0 && (n.contents = e.map((e) => Lt(e, { basePath: t })));
904
954
  }
905
955
  return n;
906
- }, kt = (e, { basePath: t }) => {
956
+ }, Rt = (e, { basePath: t }) => {
907
957
  let n = [], r;
908
- return e.descendantWithPath("body.nav.ol") ? r = e.descendantWithPath("body.nav.ol")?.children : e.descendantWithPath("body.section.nav.ol") && (r = e.descendantWithPath("body.section.nav.ol")?.children), r && r.length > 0 && r.filter((e) => e instanceof o && e.name === "li").forEach((e) => {
909
- n.push(Ot(e, { basePath: t }));
958
+ return e.descendantWithPath("body.nav.ol") ? r = e.descendantWithPath("body.nav.ol")?.children : e.descendantWithPath("body.section.nav.ol") && (r = e.descendantWithPath("body.section.nav.ol")?.children), r && r.length > 0 && r.filter((e) => e instanceof g && e.name === "li").forEach((e) => {
959
+ n.push(Lt(e, { basePath: t }));
910
960
  }), n;
911
- }, At = async (e, t) => {
912
- let n = e.manifestItems.find(Dt);
961
+ }, zt = async (e, t) => {
962
+ let n = e.manifestItems.find(It);
913
963
  if (n?.href) {
914
964
  let e = t.records.find((e) => e.uri.endsWith(n.href));
915
- if (e && !e.dir) return kt(new a(await x(e)), { basePath: d(e.uri) });
965
+ if (e && !e.dir) return Rt(new h(await D(e)), { basePath: c(e.uri) });
916
966
  }
917
- }, jt = (e, { basePath: t, prefix: n }) => {
918
- let r = _(t, e?.childNamed(`${n}content`)?.attr.src || ""), i = {
967
+ }, Bt = (e, { basePath: t, prefix: n }) => {
968
+ let r = m(t, e?.childNamed(`${n}content`)?.attr.src || ""), i = {
919
969
  title: e?.descendantWithPath(`${n}navLabel.${n}text`)?.val || "",
920
970
  path: r,
921
971
  containerHref: r,
922
972
  contents: []
923
973
  }, a = e.childrenNamed(`${n}navPoint`);
924
- return a && a.length > 0 && (i.contents = a.map((e) => jt(e, {
974
+ return a && a.length > 0 && (i.contents = a.map((e) => Bt(e, {
925
975
  basePath: t,
926
976
  prefix: n
927
977
  }))), i;
928
- }, Mt = (e, { basePath: t }) => {
978
+ }, Vt = (e, { basePath: t }) => {
929
979
  let n = [], r = e.name, i = "";
930
980
  return r.indexOf(":") !== -1 && (i = `${r.split(":")[0]}:`), e.childNamed(`${i}navMap`)?.childrenNamed(`${i}navPoint`).forEach((e) => {
931
- n.push(jt(e, {
981
+ n.push(Bt(e, {
932
982
  basePath: t,
933
983
  prefix: i
934
984
  }));
935
985
  }), n;
936
- }, Nt = async ({ opf: e, opfBasePath: t, archive: n }) => {
986
+ }, Ht = async ({ opf: e, opfBasePath: t, archive: n }) => {
937
987
  let r = e.spineTocIdref;
938
988
  if (r) {
939
989
  let i = e.manifestItems.find((e) => e.id === r);
940
990
  if (i) {
941
991
  let e = `${t}${t === "" ? "" : "/"}${i.href}`, r = n.records.find((t) => t.uri.endsWith(e));
942
- if (r && !r.dir) return Mt(new a(await x(r)), { basePath: d(r.uri) });
992
+ if (r && !r.dir) return Vt(new h(await D(r)), { basePath: c(r.uri) });
943
993
  }
944
994
  }
945
- }, Pt = async (e, { opf: t } = {}) => {
946
- let n = t ?? await Z(e);
947
- if (n) return await At(n.opf, e) || await Nt({
995
+ }, Ut = async (e, { opf: t } = {}) => {
996
+ let n = t ?? await R(e);
997
+ if (n) return await zt(n.opf, e) || await Ht({
948
998
  opf: n.opf,
949
999
  opfBasePath: n.basePath,
950
1000
  archive: e
951
1001
  }) || [];
952
- let r = Tt(e);
1002
+ let r = Pt(e);
953
1003
  return r.length === 0 ? void 0 : r;
954
- }, Ft = [
1004
+ }, Wt = [
955
1005
  "metadata",
956
1006
  "readingOrder",
957
1007
  "toc"
@@ -967,39 +1017,39 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
967
1017
  failed: !0
968
1018
  };
969
1019
  }
970
- }, It = (e) => {
1020
+ }, Gt = (e) => {
971
1021
  let t = (e) => e?.startsWith("audio/") === !0 || e?.startsWith("video/") === !0, n = e.filter((e) => e.renditionLayout === "pre-paginated" && !t(e.mediaType)).length;
972
1022
  return n > 0 ? n : void 0;
973
- }, Lt = ({ archive: e, opf: t, comicInfo: n, apple: r, kobo: i }) => {
1023
+ }, Kt = ({ archive: e, opf: t, comicInfo: n, apple: r, kobo: i }) => {
974
1024
  let a = [];
975
- return t !== void 0 && t.value === void 0 && (t.failed || st(e)) && a.push("opf"), n?.failed && a.push("comicInfo"), r?.failed && a.push("apple"), i?.failed && a.push("kobo"), a;
976
- }, Rt = 2, zt = async (e, t = {}) => {
977
- let n = new Set(t.include ?? Ft), r = n.has("metadata"), i = n.has("sources"), a = n.has("readingOrder"), o = n.has("toc"), s = t.layoutScan === !0 && (r || a), c = r || i || a || o ? await $(() => Z(e), "opf") : void 0, l = c?.value, u = r || i || s, d = u ? await $(() => N(e), "comicInfo") : void 0, f = d?.value, p = u ? await $(() => E(e), "apple") : void 0, m = p?.value, h = u ? await $(() => et(e), "kobo") : void 0, g = h?.value, _ = r || s ? wt({
1025
+ return t !== void 0 && t.value === void 0 && (t.failed || ut(e)) && a.push("opf"), n?.failed && a.push("comicInfo"), r?.failed && a.push("apple"), i?.failed && a.push("kobo"), a;
1026
+ }, qt = 3, Jt = async (e, t = {}) => {
1027
+ let n = new Set(t.include ?? Wt), r = n.has("metadata"), i = n.has("sources"), a = n.has("readingOrder"), o = n.has("toc"), s = t.layoutScan === !0 && (r || a), c = r || i || a || o ? await $(() => R(e), "opf") : void 0, l = c?.value, u = r || i || s, d = u ? await $(() => He(e), "comicInfo") : void 0, f = d?.value, p = u ? await $(() => Ie(e), "apple") : void 0, m = p?.value, h = u ? await $(() => at(e), "kobo") : void 0, g = h?.value, _ = r || s ? Nt({
978
1028
  opf: l?.opf,
979
1029
  comicInfo: f,
980
1030
  apple: m,
981
1031
  kobo: g
982
- }) : void 0, v = a || s ? await Q(e, { opf: l }) : void 0;
983
- if (s && _ !== void 0 && v !== void 0 && _.renditionLayout === "reflowable" && v.every((e) => e.renditionLayout === "reflowable") && await it(e, v) && (_ = {
1032
+ }) : void 0, v = a || s ? await U(e, { opf: l }) : void 0;
1033
+ if (s && _ !== void 0 && v !== void 0 && _.renditionLayout === "reflowable" && v.every((e) => e.renditionLayout === "reflowable") && await Pe(e, v) && (_ = {
984
1034
  ..._,
985
1035
  renditionLayout: "pre-paginated"
986
1036
  }, v = v.map((e) => ({
987
1037
  ...e,
988
1038
  renditionLayout: "pre-paginated"
989
1039
  }))), r && _ !== void 0) {
990
- let t = v ?? await Q(e, { opf: l }), n = await $e(e, {
1040
+ let t = v ?? await U(e, { opf: l }), n = await Me(e, {
991
1041
  opf: l,
992
1042
  readingOrder: t
993
- }), r = _.numberOfPages ?? It(t);
994
- _ = D({
1043
+ }), r = _.numberOfPages ?? Gt(t);
1044
+ _ = H({
995
1045
  ..._,
996
1046
  cover: n,
997
1047
  numberOfPages: r
998
1048
  });
999
1049
  }
1000
- let y = o ? (await $(() => Pt(e, { opf: l }), "toc")).value : void 0, b = {
1001
- version: Rt,
1002
- unreadableSources: Lt({
1050
+ let y = o ? (await $(() => Ut(e, { opf: l }), "toc")).value : void 0, b = {
1051
+ version: qt,
1052
+ unreadableSources: Kt({
1003
1053
  archive: e,
1004
1054
  opf: c,
1005
1055
  comicInfo: d,
@@ -1007,14 +1057,14 @@ var tt = { renditionLayout: "renditionLayout" }, nt = (e) => D({
1007
1057
  kobo: h
1008
1058
  })
1009
1059
  };
1010
- return r && _ !== void 0 && (b.metadata = _), a && v !== void 0 && (b.readingOrder = v), o && y !== void 0 && (b.toc = y), i && (b.sources = D({
1060
+ return r && _ !== void 0 && (b.metadata = _), a && v !== void 0 && (b.readingOrder = v), o && y !== void 0 && (b.toc = y), i && (b.sources = H({
1011
1061
  opf: l,
1012
1062
  comicInfo: f,
1013
1063
  apple: m,
1014
1064
  kobo: g
1015
1065
  })), b;
1016
- };
1066
+ }, Yt = (e) => e?.titles?.[0]?.value;
1017
1067
  //#endregion
1018
- export { v as APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME, j as COMIC_INFO_FILENAME, ae as COMIC_INFO_KNOWN_FIELDS, de as COMIC_INFO_MANGA_VALUES, Ve as KOBO_DISPLAY_OPTIONS_FILENAME, O as appleMetadataHomes, i as arrayBufferFileAccessors, r as blobFileAccessors, he as comicInfoMetadataHomes, e as createArchive, ee as createArchiveFromArrayBufferList, n as createArchiveFromEntries, te as createArchiveFromText, ne as createArchiveFromUrls, w as getArchiveFileRecordByUri, M as getArchiveHasComicInfo, ie as getArchiveImageRecords, H as getArchiveOpfInfo, at as getSpineItemFilesFromArchive, st as isArchiveEpub, fe as isComicInfoManga, C as isDirectoryRecord, S as isFileRecord, A as isImageRecord, tt as koboMetadataHomes, P as normalizeGtin, F as normalizeIsbn, lt as opfMetadataHomes, b as parseAppleDisplayOptionsXml, le as parseComicInfo, Ue as parseKoboXml, Be as parseOpf, ct as parseW3cDtfDate, E as readArchiveApple, N as readArchiveComicInfo, et as readArchiveKobo, Z as readArchiveOpf, x as readRecordAsText, it as readingOrderDocumentsAllHaveViewport, zt as resolveArchive, $e as resolveArchiveCover, Ct as resolveArchiveMetadata, Q as resolveArchiveReadingOrder, Pt as resolveArchiveToc, wt as resolveMetadata, U as tokenizeXmlSpaceSeparatedList };
1068
+ export { z as APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME, V as COMIC_INFO_FILENAME, he as COMIC_INFO_KNOWN_FIELDS, Be as COMIC_INFO_MANGA_VALUES, be as KOBO_DISPLAY_OPTIONS_FILENAME, Le as appleMetadataHomes, i as arrayBufferFileAccessors, r as blobFileAccessors, Ue as comicInfoMetadataHomes, e as createArchive, v as createArchiveFromArrayBufferList, n as createArchiveFromEntries, y as createArchiveFromText, b as createArchiveFromUrls, C as getArchiveFileRecordByUri, W as getArchiveHasComicInfo, E as getArchiveImageRecords, O as getArchiveOpfInfo, ct as getSpineItemFilesFromArchive, ut as isArchiveEpub, Ve as isComicInfoManga, S as isDirectoryRecord, x as isFileRecord, T as isImageRecord, ot as koboMetadataHomes, Yt as mainTitle, ft as normalizeGtin, mt as normalizeIsbn, gt as opfMetadataHomes, B as parseAppleDisplayOptionsXml, ye as parseComicInfo, Se as parseKoboXml, pe as parseOpf, ht as parseW3cDtfDate, Ie as readArchiveApple, He as readArchiveComicInfo, at as readArchiveKobo, R as readArchiveOpf, D as readRecordAsText, Pe as readingOrderDocumentsAllHaveViewport, Jt as resolveArchive, Me as resolveArchiveCover, Mt as resolveArchiveMetadata, U as resolveArchiveReadingOrder, Ut as resolveArchiveToc, Nt as resolveMetadata, k as tokenizeXmlSpaceSeparatedList };
1019
1069
 
1020
1070
  //# sourceMappingURL=index.js.map