@clearmist-labs/comic-archive-handler 1.3.0 → 1.5.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/README.md +1 -0
- package/dist/index.d.mts +50 -16
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +282 -139
- package/dist/index.mjs.map +1 -1
- package/docs/API.md +46 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -133,6 +133,7 @@ GIF, BMP, and TIFF are intentionally not included as writable because of their p
|
|
|
133
133
|
- **RAR is read-only.** The UnRAR source license permits decompression only, not building a compatible compressor, so `convertArchive(input, 'rar')` always throws `UnsupportedOperationError`.
|
|
134
134
|
- **7z read/write** uses the standalone `7zzs` binary bundled by [`7zip-bin-full`](https://www.npmjs.com/package/7zip-bin-full), spawned directly (not through `node-7z`, which has no way to control the child process's working directory). Both directions round-trip through a temporary staging directory since the 7-Zip CLI operates on real files, not in-memory buffers.
|
|
135
135
|
- **asar** reads are fully streaming (direct byte-range reads against the archive, no extraction), but writes require a staging directory since `@electron/asar`'s `createPackage` API only accepts a source directory on disk.
|
|
136
|
+
- **asar metadata lives in the archive's own header, not as a `ComicInfo.xml`/`MetronInfo.xml` entry.** `hasComicMetadata`/`readArchiveMetadata`/`addMetadataToArchive`/`removeComicMetadata` all handle this transparently for asar inputs (metadata is set/read as a `comicMetadata` key on the header JSON alongside the existing `files` key. See `src/internal/asarHeader.ts`'s `writeAsarHeaderPatch`/`serializeAsarHeader`), so calling code doesn't need to branch on archive type. Adding metadata to an asar archive patches its header directly rather than repackaging via `createPackage`, and is correspondingly cheaper than the equivalent zip/tar/7z write. A `ComicInfo.xml`/`MetronInfo.xml` entry inside an asar archive is never read as metadata.
|
|
136
137
|
- Any operation that needs a staging directory (asar writes, any 7z operation) accepts a `tempDir` option; if omitted, a directory under `os.tmpdir()` is used, and a clear `FilesystemAccessError` is thrown if no writable directory is available.
|
|
137
138
|
- Metadata conversion between the canonical schema and ComicInfo.xml/MetronInfo.xml is intentionally lossy in both directions. See the field-mapping table in `src/metadata/schema.ts`.
|
|
138
139
|
- PNG conversion's `quality` option only has an effect when `palette: true` is also set (an upstream `sharp`/libvips behavior).
|
package/dist/index.d.mts
CHANGED
|
@@ -50,6 +50,15 @@ export interface ConvertArchiveOptions extends ArchiveWriteOptions {
|
|
|
50
50
|
format: ImageOutputFormat;
|
|
51
51
|
options?: ImageConvertOptions;
|
|
52
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* Replaces the source's embedded comic metadata in the output. The source's
|
|
55
|
+
* `ComicInfo.xml`/`MetronInfo.xml` entries (and, for an asar source, its
|
|
56
|
+
* header metadata) are dropped, then each schema given here is written the
|
|
57
|
+
* way the target format stores it: an asar header key, or a root-level
|
|
58
|
+
* `{schema}.xml` entry for every other format. When omitted, entries are
|
|
59
|
+
* copied as-is and an asar source's header metadata is not carried over.
|
|
60
|
+
*/
|
|
61
|
+
metadata?: Partial<Record<MetadataSchema, ComicMetadata>>;
|
|
53
62
|
}
|
|
54
63
|
export interface AddMetadataOptions extends ArchiveWriteOptions {
|
|
55
64
|
overwrite?: boolean;
|
|
@@ -344,14 +353,14 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
344
353
|
/**
|
|
345
354
|
* Authoritative field-mapping table between the canonical ComicMetadata
|
|
346
355
|
* shape and each external XML schema (ComicInfo.xml v2.1, MetronInfo.xml
|
|
347
|
-
* v1.1
|
|
356
|
+
* v1.1. See `schemas/`). Conversion is intentionally lossy in both
|
|
348
357
|
* directions; a field with no equivalent in the target schema is dropped
|
|
349
358
|
* unless the source and target schema happen to be the same one (in which
|
|
350
359
|
* case `comicInfoExtra`/`metronInfoExtra` round-trips it).
|
|
351
360
|
*
|
|
352
361
|
* | Canonical field | ComicInfo.xml | MetronInfo.xml |
|
|
353
362
|
* |-------------------------|-----------------------------------------------------|------------------------------------------------|
|
|
354
|
-
* | title | Title | (no equivalent
|
|
363
|
+
* | title | Title | (no equivalent; dropped) |
|
|
355
364
|
* | series | Series | Series > Name |
|
|
356
365
|
* | seriesSort | (no equivalent) | Series > SortName |
|
|
357
366
|
* | seriesId / seriesLang | (no equivalent) | Series `id`/`lang` attributes |
|
|
@@ -359,18 +368,18 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
359
368
|
* | seriesIssueCount | (no equivalent) | Series > IssueCount |
|
|
360
369
|
* | seriesVolumeCount | (no equivalent) | Series > VolumeCount |
|
|
361
370
|
* | seriesAlternativeNames | (no equivalent) | Series > AlternativeNames > AlternativeName[] |
|
|
362
|
-
* | seriesGroup | SeriesGroup | (no equivalent
|
|
371
|
+
* | seriesGroup | SeriesGroup | (no equivalent; dropped) |
|
|
363
372
|
* | volume | Volume | Series > Volume |
|
|
364
373
|
* | number | Number | Number |
|
|
365
374
|
* | alternateNumber | AlternateNumber | AlternativeNumber |
|
|
366
|
-
* | alternateSeries | AlternateSeries | (no equivalent
|
|
367
|
-
* | alternateCount | AlternateCount | (no equivalent
|
|
375
|
+
* | alternateSeries | AlternateSeries | (no equivalent; dropped) |
|
|
376
|
+
* | alternateCount | AlternateCount | (no equivalent; dropped) |
|
|
368
377
|
* | count | Count | (no equivalent) |
|
|
369
378
|
* | pageCount | PageCount | PageCount |
|
|
370
379
|
* | summary | Summary | Summary |
|
|
371
380
|
* | notes | Notes | Notes |
|
|
372
|
-
* | review | Review | (no equivalent
|
|
373
|
-
* | scanInformation | ScanInformation | (no equivalent
|
|
381
|
+
* | review | Review | (no equivalent; dropped) |
|
|
382
|
+
* | scanInformation | ScanInformation | (no equivalent; dropped) |
|
|
374
383
|
* | publisher / publisherId | Publisher | Publisher > Name / `id` attribute |
|
|
375
384
|
* | imprint / imprintId | Imprint | Publisher > Imprint / `id` attribute |
|
|
376
385
|
* | collectionTitle | (no equivalent) | CollectionTitle |
|
|
@@ -388,7 +397,7 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
388
397
|
* | teams | Teams (comma-separated string) | Teams > Team[] (`id` attribute) |
|
|
389
398
|
* | locations | Locations (comma-separated string) | Locations > Location[] (`id` attribute) |
|
|
390
399
|
* | storyArcs | StoryArc / StoryArcNumber (parallel comma lists) | Arcs > Arc[] (Name + Number + `id`) |
|
|
391
|
-
* | mainCharacterOrTeam | MainCharacterOrTeam | (no equivalent
|
|
400
|
+
* | mainCharacterOrTeam | MainCharacterOrTeam | (no equivalent; dropped) |
|
|
392
401
|
* | stories | (no equivalent) | Stories > Story[] |
|
|
393
402
|
* | reprints | (no equivalent) | Reprints > Reprint[] |
|
|
394
403
|
* | universes | (no equivalent) | Universes > Universe[] |
|
|
@@ -398,9 +407,9 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
398
407
|
* | web | Web (single URL) | URLs > URL[] (`primary` attribute) |
|
|
399
408
|
* | gtin | GTIN | GTIN > ISBN |
|
|
400
409
|
* | gtinUpc | (no equivalent) | GTIN > UPC |
|
|
401
|
-
* | blackAndWhite | BlackAndWhite (Yes/No) | (no equivalent
|
|
402
|
-
* | manga | Manga | (no equivalent
|
|
403
|
-
* | pages | Pages > Page[] (Image/Type/DoublePage/... attrs) | (no equivalent
|
|
410
|
+
* | blackAndWhite | BlackAndWhite (Yes/No) | (no equivalent; ComicInfo-only) |
|
|
411
|
+
* | manga | Manga | (no equivalent; ComicInfo-only) |
|
|
412
|
+
* | pages | Pages > Page[] (Image/Type/DoublePage/... attrs) | (no equivalent; ComicInfo-only) |
|
|
404
413
|
*/
|
|
405
414
|
export declare const COMIC_INFO_CREDIT_ROLES: readonly ["Writer", "Penciller", "Inker", "Colorist", "Letterer", "CoverArtist", "Editor", "Translator"];
|
|
406
415
|
type ComicInfoCreditRole = (typeof COMIC_INFO_CREDIT_ROLES)[number];
|
|
@@ -428,7 +437,7 @@ export declare function resourceName(item: string | MetronResource): string;
|
|
|
428
437
|
export declare function resourceId(item: string | MetronResource): string | undefined;
|
|
429
438
|
export declare function joinResourceNames(values?: (string | MetronResource)[]): string | undefined;
|
|
430
439
|
declare namespace index_d_exports {
|
|
431
|
-
export { COMIC_INFO_AGE_RATING_VALUES, COMIC_INFO_CREDIT_ROLES, COMIC_INFO_MANGA_VALUES, COMIC_INFO_PAGE_TYPE_VALUES, COMIC_INFO_YES_NO_VALUES, ComicInfoCreditRole, METRON_AGE_RATING_VALUES, METRON_FORMAT_VALUES, METRON_INFORMATION_SOURCE_VALUES, METRON_ROLE_VALUES, MetadataValidationIssue, MetadataValidationResult, addMetadataToArchive, comicInfoXmlToMetadata, hasComicMetadata, joinCommaList, joinResourceNames, metadataToComicInfoXml, metadataToMetronInfoXml, metadataToXml, metronInfoXmlToMetadata, readArchiveMetadata, resourceId, resourceName, splitCommaList, validateMetadataXml, xmlToMetadata };
|
|
440
|
+
export { COMIC_INFO_AGE_RATING_VALUES, COMIC_INFO_CREDIT_ROLES, COMIC_INFO_MANGA_VALUES, COMIC_INFO_PAGE_TYPE_VALUES, COMIC_INFO_YES_NO_VALUES, ComicInfoCreditRole, METRON_AGE_RATING_VALUES, METRON_FORMAT_VALUES, METRON_INFORMATION_SOURCE_VALUES, METRON_ROLE_VALUES, MetadataValidationIssue, MetadataValidationResult, addMetadataToArchive, comicInfoXmlToMetadata, hasComicMetadata, joinCommaList, joinResourceNames, metadataToComicInfoXml, metadataToMetronInfoXml, metadataToXml, metronInfoXmlToMetadata, readArchiveMetadata, removeComicMetadata, resourceId, resourceName, splitCommaList, validateMetadataXml, xmlToMetadata };
|
|
432
441
|
}
|
|
433
442
|
export declare function metadataToXml(metadata: ComicMetadata, schema: MetadataSchema): string;
|
|
434
443
|
export declare function xmlToMetadata(xml: string | Buffer, schema: MetadataSchema): ComicMetadata;
|
|
@@ -436,12 +445,27 @@ export declare function hasComicMetadata(input: ArchiveInput): Promise<{
|
|
|
436
445
|
present: boolean;
|
|
437
446
|
schema?: MetadataSchema;
|
|
438
447
|
path?: string;
|
|
448
|
+
bothPresent?: boolean;
|
|
439
449
|
}>;
|
|
440
|
-
|
|
450
|
+
/**
|
|
451
|
+
* Reads embedded comic metadata. With no `schema`, returns whichever schema
|
|
452
|
+
* `hasComicMetadata` finds first (asar prefers ComicInfo when both are
|
|
453
|
+
* present). Pass `schema` to read that specific one regardless of which is
|
|
454
|
+
* preferred. The only way to read a non-preferred schema back out of an
|
|
455
|
+
* asar archive that has both, since its metadata isn't addressable by path.
|
|
456
|
+
*/
|
|
457
|
+
export declare function readArchiveMetadata(input: ArchiveInput, schema?: MetadataSchema): Promise<{
|
|
441
458
|
schema: MetadataSchema;
|
|
442
459
|
metadata: ComicMetadata;
|
|
443
460
|
} | null>;
|
|
444
461
|
export declare function addMetadataToArchive(input: ArchiveInput, metadata: ComicMetadata, schema: MetadataSchema, options?: AddMetadataOptions): Promise<Buffer | void>;
|
|
462
|
+
/**
|
|
463
|
+
* Removes the embedded `{schema}` metadata, if present; an asar header key
|
|
464
|
+
* removal; or the matching `{schema}.xml` entry for every other format.
|
|
465
|
+
* Throws `ArchiveFormatError` if the archive has no such metadata; a caller
|
|
466
|
+
* that wants a no-op instead should check `hasComicMetadata` first.
|
|
467
|
+
*/
|
|
468
|
+
export declare function removeComicMetadata(input: ArchiveInput, schema: MetadataSchema, options?: ArchiveWriteOptions): Promise<Buffer | void>;
|
|
445
469
|
//#endregion
|
|
446
470
|
//#region src/images/convert.d.ts
|
|
447
471
|
export declare function convertImageBuffer(image: Buffer, format: ImageOutputFormat, options?: ImageConvertOptions): Promise<Buffer>;
|
|
@@ -460,6 +484,14 @@ export declare function phashToHex(hash: bigint): string;
|
|
|
460
484
|
export declare function hammingDistance(a: bigint, b: bigint): number;
|
|
461
485
|
export declare function computeArchiveImagePHash(input: ArchiveInput, entryPath: string): Promise<bigint>;
|
|
462
486
|
//#endregion
|
|
487
|
+
//#region src/images/dimensions.d.ts
|
|
488
|
+
export interface ImageDimensions {
|
|
489
|
+
width: number;
|
|
490
|
+
height: number;
|
|
491
|
+
}
|
|
492
|
+
/** Reads an image's pixel dimensions from its header without decoding it; `null` when the buffer isn't an image `sharp` can read. */
|
|
493
|
+
export declare function readImageDimensions(buffer: Buffer): Promise<ImageDimensions | null>;
|
|
494
|
+
//#endregion
|
|
463
495
|
//#region src/images/isImage.d.ts
|
|
464
496
|
export declare const IMAGE_EXTENSIONS: readonly ["jpg", "jpeg", "png", "gif", "webp", "bmp", "tiff", "tif"];
|
|
465
497
|
export declare function getExtension(entryPath: string): string;
|
|
@@ -468,7 +500,7 @@ export declare function isImagePath(entryPath: string): boolean;
|
|
|
468
500
|
//#region src/hashing/sha256.d.ts
|
|
469
501
|
export declare function sha256ArchiveEntry(input: ArchiveInput, entryPath: string): Promise<string>;
|
|
470
502
|
/**
|
|
471
|
-
* SHA256 of the whole archive file
|
|
503
|
+
* SHA256 of the whole archive file, except for asar, where only the
|
|
472
504
|
* content region (bytes after the header) is hashed, so header/index
|
|
473
505
|
* reordering never changes the content hash.
|
|
474
506
|
*/
|
|
@@ -511,7 +543,7 @@ export interface ReadArchiveEntriesResult {
|
|
|
511
543
|
* Reads every entry's bytes and SHA256 in a single pass over the archive.
|
|
512
544
|
* Calling `readArchiveEntry`/`sha256ArchiveEntry` once per entry instead
|
|
513
545
|
* means re-running `listEntries` and re-locating the target entry on every
|
|
514
|
-
* call
|
|
546
|
+
* call: cheap for zip (backed by real central-directory random access) and
|
|
515
547
|
* tar/asar, but for the sequential/CLI-driven formats (rar, 7z, ace) each
|
|
516
548
|
* call re-reads the archive from the start, so reading every entry that way
|
|
517
549
|
* costs O(n^2). This also does half the I/O of calling both
|
|
@@ -575,12 +607,14 @@ declare const comicArchiveHandler: {
|
|
|
575
607
|
present: boolean;
|
|
576
608
|
schema?: MetadataSchema;
|
|
577
609
|
path?: string;
|
|
610
|
+
bothPresent?: boolean;
|
|
578
611
|
}>;
|
|
579
|
-
readArchiveMetadata(input: ArchiveInput): Promise<{
|
|
612
|
+
readArchiveMetadata(input: ArchiveInput, schema?: MetadataSchema): Promise<{
|
|
580
613
|
schema: MetadataSchema;
|
|
581
614
|
metadata: ComicMetadata;
|
|
582
615
|
} | null>;
|
|
583
616
|
addMetadataToArchive(input: ArchiveInput, metadata: ComicMetadata, schema: MetadataSchema, options?: AddMetadataOptions): Promise<Buffer | void>;
|
|
617
|
+
removeComicMetadata(input: ArchiveInput, schema: MetadataSchema, options?: ArchiveWriteOptions): Promise<Buffer | void>;
|
|
584
618
|
metadataToComicInfoXml: typeof metadataToComicInfoXml;
|
|
585
619
|
comicInfoXmlToMetadata: typeof comicInfoXmlToMetadata;
|
|
586
620
|
metadataToMetronInfoXml: typeof metadataToMetronInfoXml;
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/benchmark/types.ts","../src/errors.ts","../src/detect.ts","../src/convertArchive.ts","../src/extractArchive.ts","../src/metadata/comicInfo.ts","../src/metadata/metronInfo.ts","../src/metadata/validate.ts","../src/metadata/schema.ts","../src/metadata/index.ts","../src/images/convert.ts","../src/images/phash.ts","../src/images/isImage.ts","../src/hashing/sha256.ts","../src/rename.ts","../src/strip.ts","../src/listFiles.ts","../src/readArchiveEntry.ts","../src/readArchiveEntries.ts","../src/removeArchiveEntry.ts","../src/benchmark/benchmarkArchive.ts","../src/benchmark/report.ts","../src/index.ts"],"mappings":";;YAEY;;YAGA,eAAe;YAEf;YAEA;iBAEK;;EAEf;;EAEA;;EAEA;;iBAGe;;EAEf;;iBAGe;;EAEf;;EAEA;;EAEA;;iBAGe;EACf,OAAO;EACP,OAAO;EACP,MAAM;;;iBAIS;;;;;;;EAOf;;;;;EAKA,kBAAkB;;iBAGH,8BAA8B;EAC7C;IAAU,QAAQ;IAAmB,UAAU
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/benchmark/types.ts","../src/errors.ts","../src/detect.ts","../src/convertArchive.ts","../src/extractArchive.ts","../src/metadata/comicInfo.ts","../src/metadata/metronInfo.ts","../src/metadata/validate.ts","../src/metadata/schema.ts","../src/metadata/index.ts","../src/images/convert.ts","../src/images/phash.ts","../src/images/dimensions.ts","../src/images/isImage.ts","../src/hashing/sha256.ts","../src/rename.ts","../src/strip.ts","../src/listFiles.ts","../src/readArchiveEntry.ts","../src/readArchiveEntries.ts","../src/removeArchiveEntry.ts","../src/benchmark/benchmarkArchive.ts","../src/benchmark/report.ts","../src/index.ts"],"mappings":"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"}
|