@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 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 — see `schemas/`). Conversion is intentionally lossy in both
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 — dropped) |
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 — dropped) |
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 — dropped) |
366
- * | alternateCount | AlternateCount | (no equivalent — dropped) |
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 — dropped) |
372
- * | scanInformation | ScanInformation | (no equivalent — dropped) |
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 — dropped) |
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 — ComicInfo-only) |
401
- * | manga | Manga | (no equivalent — ComicInfo-only) |
402
- * | pages | Pages > Page[] (Image/Type/DoublePage/... attrs) | (no equivalent — ComicInfo-only) |
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
- export declare function readArchiveMetadata(input: ArchiveInput): Promise<{
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 — except for asar, where only the
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 — cheap for zip (backed by real central-directory random access) and
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;
@@ -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":"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"}
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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"}