@clearmist-labs/comic-archive-handler 1.2.0 → 1.4.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 +2 -1
- package/dist/index.d.mts +38 -16
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +200 -73
- package/dist/index.mjs.map +1 -1
- package/docs/API.md +59 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ A toolkit for detecting, converting, and manipulating comic book archives (CBAS/
|
|
|
11
11
|
- **Re-encode** page images to different formats
|
|
12
12
|
- **Hash** archives perceptually and by content
|
|
13
13
|
- **Rename** pages sequentially
|
|
14
|
-
- **Strip** non-essential files from archives
|
|
14
|
+
- **Strip** non-essential files from archives, or **remove** a single named entry
|
|
15
15
|
- **Extract** archives to a plain directory of files
|
|
16
16
|
- **Benchmark** archive/image format combinations for creation speed, random read speed, and size
|
|
17
17
|
|
|
@@ -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
|
@@ -61,6 +61,7 @@ export interface RenameOptions extends ArchiveWriteOptions {
|
|
|
61
61
|
export interface StripOptions extends ArchiveWriteOptions {
|
|
62
62
|
extraKeepExtensions?: string[];
|
|
63
63
|
}
|
|
64
|
+
export type RemoveEntryOptions = ArchiveWriteOptions;
|
|
64
65
|
export interface ComicCredit {
|
|
65
66
|
name: string;
|
|
66
67
|
role: string;
|
|
@@ -343,14 +344,14 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
343
344
|
/**
|
|
344
345
|
* Authoritative field-mapping table between the canonical ComicMetadata
|
|
345
346
|
* shape and each external XML schema (ComicInfo.xml v2.1, MetronInfo.xml
|
|
346
|
-
* v1.1
|
|
347
|
+
* v1.1. See `schemas/`). Conversion is intentionally lossy in both
|
|
347
348
|
* directions; a field with no equivalent in the target schema is dropped
|
|
348
349
|
* unless the source and target schema happen to be the same one (in which
|
|
349
350
|
* case `comicInfoExtra`/`metronInfoExtra` round-trips it).
|
|
350
351
|
*
|
|
351
352
|
* | Canonical field | ComicInfo.xml | MetronInfo.xml |
|
|
352
353
|
* |-------------------------|-----------------------------------------------------|------------------------------------------------|
|
|
353
|
-
* | title | Title | (no equivalent
|
|
354
|
+
* | title | Title | (no equivalent; dropped) |
|
|
354
355
|
* | series | Series | Series > Name |
|
|
355
356
|
* | seriesSort | (no equivalent) | Series > SortName |
|
|
356
357
|
* | seriesId / seriesLang | (no equivalent) | Series `id`/`lang` attributes |
|
|
@@ -358,18 +359,18 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
358
359
|
* | seriesIssueCount | (no equivalent) | Series > IssueCount |
|
|
359
360
|
* | seriesVolumeCount | (no equivalent) | Series > VolumeCount |
|
|
360
361
|
* | seriesAlternativeNames | (no equivalent) | Series > AlternativeNames > AlternativeName[] |
|
|
361
|
-
* | seriesGroup | SeriesGroup | (no equivalent
|
|
362
|
+
* | seriesGroup | SeriesGroup | (no equivalent; dropped) |
|
|
362
363
|
* | volume | Volume | Series > Volume |
|
|
363
364
|
* | number | Number | Number |
|
|
364
365
|
* | alternateNumber | AlternateNumber | AlternativeNumber |
|
|
365
|
-
* | alternateSeries | AlternateSeries | (no equivalent
|
|
366
|
-
* | alternateCount | AlternateCount | (no equivalent
|
|
366
|
+
* | alternateSeries | AlternateSeries | (no equivalent; dropped) |
|
|
367
|
+
* | alternateCount | AlternateCount | (no equivalent; dropped) |
|
|
367
368
|
* | count | Count | (no equivalent) |
|
|
368
369
|
* | pageCount | PageCount | PageCount |
|
|
369
370
|
* | summary | Summary | Summary |
|
|
370
371
|
* | notes | Notes | Notes |
|
|
371
|
-
* | review | Review | (no equivalent
|
|
372
|
-
* | scanInformation | ScanInformation | (no equivalent
|
|
372
|
+
* | review | Review | (no equivalent; dropped) |
|
|
373
|
+
* | scanInformation | ScanInformation | (no equivalent; dropped) |
|
|
373
374
|
* | publisher / publisherId | Publisher | Publisher > Name / `id` attribute |
|
|
374
375
|
* | imprint / imprintId | Imprint | Publisher > Imprint / `id` attribute |
|
|
375
376
|
* | collectionTitle | (no equivalent) | CollectionTitle |
|
|
@@ -387,7 +388,7 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
387
388
|
* | teams | Teams (comma-separated string) | Teams > Team[] (`id` attribute) |
|
|
388
389
|
* | locations | Locations (comma-separated string) | Locations > Location[] (`id` attribute) |
|
|
389
390
|
* | storyArcs | StoryArc / StoryArcNumber (parallel comma lists) | Arcs > Arc[] (Name + Number + `id`) |
|
|
390
|
-
* | mainCharacterOrTeam | MainCharacterOrTeam | (no equivalent
|
|
391
|
+
* | mainCharacterOrTeam | MainCharacterOrTeam | (no equivalent; dropped) |
|
|
391
392
|
* | stories | (no equivalent) | Stories > Story[] |
|
|
392
393
|
* | reprints | (no equivalent) | Reprints > Reprint[] |
|
|
393
394
|
* | universes | (no equivalent) | Universes > Universe[] |
|
|
@@ -397,9 +398,9 @@ export declare function validateMetadataXml(xml: string | Buffer, schema: Metada
|
|
|
397
398
|
* | web | Web (single URL) | URLs > URL[] (`primary` attribute) |
|
|
398
399
|
* | gtin | GTIN | GTIN > ISBN |
|
|
399
400
|
* | gtinUpc | (no equivalent) | GTIN > UPC |
|
|
400
|
-
* | blackAndWhite | BlackAndWhite (Yes/No) | (no equivalent
|
|
401
|
-
* | manga | Manga | (no equivalent
|
|
402
|
-
* | pages | Pages > Page[] (Image/Type/DoublePage/... attrs) | (no equivalent
|
|
401
|
+
* | blackAndWhite | BlackAndWhite (Yes/No) | (no equivalent; ComicInfo-only) |
|
|
402
|
+
* | manga | Manga | (no equivalent; ComicInfo-only) |
|
|
403
|
+
* | pages | Pages > Page[] (Image/Type/DoublePage/... attrs) | (no equivalent; ComicInfo-only) |
|
|
403
404
|
*/
|
|
404
405
|
export declare const COMIC_INFO_CREDIT_ROLES: readonly ["Writer", "Penciller", "Inker", "Colorist", "Letterer", "CoverArtist", "Editor", "Translator"];
|
|
405
406
|
type ComicInfoCreditRole = (typeof COMIC_INFO_CREDIT_ROLES)[number];
|
|
@@ -427,7 +428,7 @@ export declare function resourceName(item: string | MetronResource): string;
|
|
|
427
428
|
export declare function resourceId(item: string | MetronResource): string | undefined;
|
|
428
429
|
export declare function joinResourceNames(values?: (string | MetronResource)[]): string | undefined;
|
|
429
430
|
declare namespace index_d_exports {
|
|
430
|
-
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 };
|
|
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, removeComicMetadata, resourceId, resourceName, splitCommaList, validateMetadataXml, xmlToMetadata };
|
|
431
432
|
}
|
|
432
433
|
export declare function metadataToXml(metadata: ComicMetadata, schema: MetadataSchema): string;
|
|
433
434
|
export declare function xmlToMetadata(xml: string | Buffer, schema: MetadataSchema): ComicMetadata;
|
|
@@ -435,12 +436,27 @@ export declare function hasComicMetadata(input: ArchiveInput): Promise<{
|
|
|
435
436
|
present: boolean;
|
|
436
437
|
schema?: MetadataSchema;
|
|
437
438
|
path?: string;
|
|
439
|
+
bothPresent?: boolean;
|
|
438
440
|
}>;
|
|
439
|
-
|
|
441
|
+
/**
|
|
442
|
+
* Reads embedded comic metadata. With no `schema`, returns whichever schema
|
|
443
|
+
* `hasComicMetadata` finds first (asar prefers ComicInfo when both are
|
|
444
|
+
* present). Pass `schema` to read that specific one regardless of which is
|
|
445
|
+
* preferred. The only way to read a non-preferred schema back out of an
|
|
446
|
+
* asar archive that has both, since its metadata isn't addressable by path.
|
|
447
|
+
*/
|
|
448
|
+
export declare function readArchiveMetadata(input: ArchiveInput, schema?: MetadataSchema): Promise<{
|
|
440
449
|
schema: MetadataSchema;
|
|
441
450
|
metadata: ComicMetadata;
|
|
442
451
|
} | null>;
|
|
443
452
|
export declare function addMetadataToArchive(input: ArchiveInput, metadata: ComicMetadata, schema: MetadataSchema, options?: AddMetadataOptions): Promise<Buffer | void>;
|
|
453
|
+
/**
|
|
454
|
+
* Removes the embedded `{schema}` metadata, if present; an asar header key
|
|
455
|
+
* removal; or the matching `{schema}.xml` entry for every other format.
|
|
456
|
+
* Throws `ArchiveFormatError` if the archive has no such metadata; a caller
|
|
457
|
+
* that wants a no-op instead should check `hasComicMetadata` first.
|
|
458
|
+
*/
|
|
459
|
+
export declare function removeComicMetadata(input: ArchiveInput, schema: MetadataSchema, options?: ArchiveWriteOptions): Promise<Buffer | void>;
|
|
444
460
|
//#endregion
|
|
445
461
|
//#region src/images/convert.d.ts
|
|
446
462
|
export declare function convertImageBuffer(image: Buffer, format: ImageOutputFormat, options?: ImageConvertOptions): Promise<Buffer>;
|
|
@@ -467,7 +483,7 @@ export declare function isImagePath(entryPath: string): boolean;
|
|
|
467
483
|
//#region src/hashing/sha256.d.ts
|
|
468
484
|
export declare function sha256ArchiveEntry(input: ArchiveInput, entryPath: string): Promise<string>;
|
|
469
485
|
/**
|
|
470
|
-
* SHA256 of the whole archive file
|
|
486
|
+
* SHA256 of the whole archive file, except for asar, where only the
|
|
471
487
|
* content region (bytes after the header) is hashed, so header/index
|
|
472
488
|
* reordering never changes the content hash.
|
|
473
489
|
*/
|
|
@@ -510,7 +526,7 @@ export interface ReadArchiveEntriesResult {
|
|
|
510
526
|
* Reads every entry's bytes and SHA256 in a single pass over the archive.
|
|
511
527
|
* Calling `readArchiveEntry`/`sha256ArchiveEntry` once per entry instead
|
|
512
528
|
* means re-running `listEntries` and re-locating the target entry on every
|
|
513
|
-
* call
|
|
529
|
+
* call: cheap for zip (backed by real central-directory random access) and
|
|
514
530
|
* tar/asar, but for the sequential/CLI-driven formats (rar, 7z, ace) each
|
|
515
531
|
* call re-reads the archive from the start, so reading every entry that way
|
|
516
532
|
* costs O(n^2). This also does half the I/O of calling both
|
|
@@ -519,6 +535,9 @@ export interface ReadArchiveEntriesResult {
|
|
|
519
535
|
*/
|
|
520
536
|
export declare function readArchiveEntries(input: ArchiveInput): AsyncGenerator<ReadArchiveEntriesResult>;
|
|
521
537
|
//#endregion
|
|
538
|
+
//#region src/removeArchiveEntry.d.ts
|
|
539
|
+
export declare function removeArchiveEntry(input: ArchiveInput, entryPath: string, options?: RemoveEntryOptions): Promise<Buffer | void>;
|
|
540
|
+
//#endregion
|
|
522
541
|
//#region src/benchmark/benchmarkArchive.d.ts
|
|
523
542
|
/**
|
|
524
543
|
* Extracts a comic archive, validates it contains image files, then
|
|
@@ -559,6 +578,7 @@ declare const comicArchiveHandler: {
|
|
|
559
578
|
listArchiveFiles: typeof listArchiveFiles;
|
|
560
579
|
readArchiveEntry: typeof readArchiveEntry;
|
|
561
580
|
readArchiveEntries: typeof readArchiveEntries;
|
|
581
|
+
removeArchiveEntry: typeof removeArchiveEntry;
|
|
562
582
|
benchmarkArchive: typeof benchmarkArchive;
|
|
563
583
|
renderBenchmarkReportMarkdown: typeof renderBenchmarkReportMarkdown;
|
|
564
584
|
WRITABLE_ARCHIVE_TYPES: readonly WritableArchiveType[];
|
|
@@ -570,12 +590,14 @@ declare const comicArchiveHandler: {
|
|
|
570
590
|
present: boolean;
|
|
571
591
|
schema?: MetadataSchema;
|
|
572
592
|
path?: string;
|
|
593
|
+
bothPresent?: boolean;
|
|
573
594
|
}>;
|
|
574
|
-
readArchiveMetadata(input: ArchiveInput): Promise<{
|
|
595
|
+
readArchiveMetadata(input: ArchiveInput, schema?: MetadataSchema): Promise<{
|
|
575
596
|
schema: MetadataSchema;
|
|
576
597
|
metadata: ComicMetadata;
|
|
577
598
|
} | null>;
|
|
578
599
|
addMetadataToArchive(input: ArchiveInput, metadata: ComicMetadata, schema: MetadataSchema, options?: AddMetadataOptions): Promise<Buffer | void>;
|
|
600
|
+
removeComicMetadata(input: ArchiveInput, schema: MetadataSchema, options?: ArchiveWriteOptions): Promise<Buffer | void>;
|
|
579
601
|
metadataToComicInfoXml: typeof metadataToComicInfoXml;
|
|
580
602
|
comicInfoXmlToMetadata: typeof comicInfoXmlToMetadata;
|
|
581
603
|
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/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;;;iBAGhC,2BAA2B;EAC1C;;iBAGe,sBAAsB;EACrC;EACA;;iBAGe,qBAAqB;EACpC;;
|
|
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":"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"}
|