taglib-wasm 2.2.1 → 2.2.3

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 (88) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -3
  3. package/dist/disc-folder.d.ts +3 -1
  4. package/dist/disc-folder.d.ts.map +1 -1
  5. package/dist/disc-folder.js +187 -152
  6. package/dist/index.browser.js +17 -10
  7. package/dist/index.d.ts +1 -1
  8. package/dist/simple.browser.js +13 -8
  9. package/dist/src/constants/properties.d.ts +2 -2
  10. package/dist/src/constants/specialized-properties.d.ts +2 -2
  11. package/dist/src/constants/specialized-properties.js +2 -2
  12. package/dist/src/folder-api/album-corroborate.d.ts +13 -0
  13. package/dist/src/folder-api/album-corroborate.d.ts.map +1 -0
  14. package/dist/src/folder-api/album-corroborate.js +36 -0
  15. package/dist/src/folder-api/album-discs.d.ts +13 -0
  16. package/dist/src/folder-api/album-discs.d.ts.map +1 -0
  17. package/dist/src/folder-api/album-discs.js +122 -0
  18. package/dist/src/folder-api/album-grouping.d.ts +24 -0
  19. package/dist/src/folder-api/album-grouping.d.ts.map +1 -0
  20. package/dist/src/folder-api/album-grouping.js +118 -0
  21. package/dist/src/folder-api/album-identity.d.ts +27 -0
  22. package/dist/src/folder-api/album-identity.d.ts.map +1 -0
  23. package/dist/src/folder-api/album-identity.js +151 -0
  24. package/dist/src/folder-api/{group-albums.d.ts → album-types.d.ts} +55 -26
  25. package/dist/src/folder-api/album-types.d.ts.map +1 -0
  26. package/dist/src/folder-api/album-types.js +0 -0
  27. package/dist/src/folder-api/folder-disc.d.ts +24 -0
  28. package/dist/src/folder-api/folder-disc.d.ts.map +1 -0
  29. package/dist/src/folder-api/folder-disc.js +169 -0
  30. package/dist/src/folder-api/index.d.ts +3 -1
  31. package/dist/src/folder-api/index.d.ts.map +1 -1
  32. package/dist/src/folder-api/index.js +2 -4
  33. package/dist/src/folder-api/scan-for-albums.d.ts +1 -1
  34. package/dist/src/folder-api/scan-for-albums.d.ts.map +1 -1
  35. package/dist/src/folder-api/scan-for-albums.js +1 -3
  36. package/dist/src/runtime/detector.d.ts +16 -1
  37. package/dist/src/runtime/detector.d.ts.map +1 -1
  38. package/dist/src/runtime/detector.js +58 -52
  39. package/dist/src/runtime/platform-io.d.ts +8 -0
  40. package/dist/src/runtime/platform-io.d.ts.map +1 -1
  41. package/dist/src/runtime/platform-io.js +11 -11
  42. package/dist/src/runtime/unified-loader/module-selection.d.ts +2 -2
  43. package/dist/src/runtime/unified-loader/module-selection.d.ts.map +1 -1
  44. package/dist/src/runtime/unified-loader/module-selection.js +3 -5
  45. package/dist/src/runtime/wasi-adapter/audio-properties.d.ts +20 -0
  46. package/dist/src/runtime/wasi-adapter/audio-properties.d.ts.map +1 -0
  47. package/dist/src/runtime/wasi-adapter/audio-properties.js +85 -0
  48. package/dist/src/runtime/wasi-adapter/file-handle.d.ts +5 -19
  49. package/dist/src/runtime/wasi-adapter/file-handle.d.ts.map +1 -1
  50. package/dist/src/runtime/wasi-adapter/file-handle.js +67 -389
  51. package/dist/src/runtime/wasi-adapter/handle-state.d.ts +28 -0
  52. package/dist/src/runtime/wasi-adapter/handle-state.d.ts.map +1 -0
  53. package/dist/src/runtime/wasi-adapter/handle-state.js +58 -0
  54. package/dist/src/runtime/wasi-adapter/mp4-items.d.ts +34 -0
  55. package/dist/src/runtime/wasi-adapter/mp4-items.d.ts.map +1 -0
  56. package/dist/src/runtime/wasi-adapter/mp4-items.js +80 -0
  57. package/dist/src/runtime/wasi-adapter/property-surface.d.ts +25 -0
  58. package/dist/src/runtime/wasi-adapter/property-surface.d.ts.map +1 -0
  59. package/dist/src/runtime/wasi-adapter/property-surface.js +104 -0
  60. package/dist/src/runtime/wasi-adapter/structured-fields.d.ts +44 -0
  61. package/dist/src/runtime/wasi-adapter/structured-fields.d.ts.map +1 -0
  62. package/dist/src/runtime/wasi-adapter/structured-fields.js +139 -0
  63. package/dist/src/runtime/wasi-adapter/tag-keys.d.ts +28 -0
  64. package/dist/src/runtime/wasi-adapter/tag-keys.d.ts.map +1 -0
  65. package/dist/src/runtime/wasi-adapter/tag-keys.js +46 -0
  66. package/dist/src/taglib/audio-file-impl.d.ts.map +1 -1
  67. package/dist/src/taglib/audio-file-impl.js +2 -2
  68. package/dist/src/taglib/embind-adapter.d.ts.map +1 -1
  69. package/dist/src/taglib/embind-adapter.js +4 -1
  70. package/dist/src/taglib/id3v2-frames.d.ts.map +1 -1
  71. package/dist/src/taglib/id3v2-frames.js +2 -2
  72. package/dist/src/types/audio-formats.d.ts +5 -5
  73. package/dist/src/types/audio-formats.d.ts.map +1 -1
  74. package/dist/src/types/format-property-keys.d.ts +1 -1
  75. package/dist/src/types/format-property-keys.d.ts.map +1 -1
  76. package/dist/src/types/tags.d.ts +8 -1
  77. package/dist/src/types/tags.d.ts.map +1 -1
  78. package/dist/src/utils/tag-mapping.d.ts.map +1 -1
  79. package/dist/src/utils/tag-mapping.js +2 -0
  80. package/dist/src/version.d.ts +1 -1
  81. package/dist/src/version.js +1 -1
  82. package/dist/src/web-utils/data-url.d.ts.map +1 -1
  83. package/dist/src/web-utils/data-url.js +4 -2
  84. package/dist/taglib-wasi.wasm +0 -0
  85. package/dist/taglib-web.wasm +0 -0
  86. package/package.json +8 -13
  87. package/dist/src/folder-api/group-albums.d.ts.map +0 -1
  88. package/dist/src/folder-api/group-albums.js +0 -544
@@ -0,0 +1,85 @@
1
+ const CONTAINER_TO_FORMAT = {
2
+ MP3: "MP3",
3
+ ADTS: "AAC",
4
+ MP4: "MP4",
5
+ FLAC: "FLAC",
6
+ OGG: "OGG",
7
+ WAV: "WAV",
8
+ AIFF: "AIFF",
9
+ WavPack: "WV",
10
+ TTA: "TTA",
11
+ ASF: "ASF",
12
+ Matroska: "MATROSKA"
13
+ };
14
+ function getAudioProperties(tagData) {
15
+ if (!tagData || !("sampleRate" in tagData)) return null;
16
+ const d = tagData;
17
+ const containerFormat = d.containerFormat || "unknown";
18
+ const mpegVersion = d.mpegVersion ?? 0;
19
+ const formatVersion = d.formatVersion ?? 0;
20
+ return {
21
+ duration: d.length ?? 0,
22
+ durationMs: d.lengthMs ?? 0,
23
+ bitrate: d.bitrate ?? 0,
24
+ sampleRate: d.sampleRate ?? 0,
25
+ channels: d.channels ?? 0,
26
+ bitsPerSample: d.bitsPerSample ?? 0,
27
+ codec: d.codec || "unknown",
28
+ containerFormat,
29
+ isLossless: d.isLossless ?? false,
30
+ ...mpegVersion > 0 ? { mpegVersion, mpegLayer: d.mpegLayer ?? 0 } : {},
31
+ ...containerFormat === "MP4" || containerFormat === "ASF" ? { isEncrypted: d.isEncrypted ?? false } : {},
32
+ ...formatVersion > 0 ? { formatVersion } : {},
33
+ ...d.outputGainDb !== void 0 ? { outputGainDb: d.outputGainDb } : {}
34
+ };
35
+ }
36
+ function detectOggCodec(fileData) {
37
+ if (fileData.length < 37) return "OGG";
38
+ const segCount = fileData[26];
39
+ if (segCount === void 0) return "OGG";
40
+ const payloadStart = 27 + segCount;
41
+ if (fileData.length < payloadStart + 8) return "OGG";
42
+ const sig = String.fromCharCode(
43
+ ...fileData.slice(payloadStart, payloadStart + 8)
44
+ );
45
+ if (sig === "OpusHead") return "OPUS";
46
+ return "OGG";
47
+ }
48
+ function getFormat(tagData, fileData) {
49
+ const container = tagData?.containerFormat;
50
+ if (container) {
51
+ const codec = tagData?.codec;
52
+ if (container === "OGG" && codec === "Opus") return "OPUS";
53
+ if (CONTAINER_TO_FORMAT[container]) return CONTAINER_TO_FORMAT[container];
54
+ }
55
+ if (!fileData || fileData.length < 8) return "unknown";
56
+ const magic = fileData.slice(0, 4);
57
+ if (magic[0] === 255 && (magic[1] & 224) === 224) return "MP3";
58
+ if (magic[0] === 73 && magic[1] === 68 && magic[2] === 51) {
59
+ return "MP3";
60
+ }
61
+ if (magic[0] === 102 && magic[1] === 76 && magic[2] === 97 && magic[3] === 67) return "FLAC";
62
+ if (magic[0] === 79 && magic[1] === 103 && magic[2] === 103 && magic[3] === 83) return detectOggCodec(fileData);
63
+ if (magic[0] === 82 && magic[1] === 73 && magic[2] === 70 && magic[3] === 70) return "WAV";
64
+ if (magic[0] === 119 && magic[1] === 118 && magic[2] === 112 && magic[3] === 107) return "WV";
65
+ if (magic[0] === 84 && magic[1] === 84 && magic[2] === 65 && magic[3] === 49) return "TTA";
66
+ if (fileData.length >= 16 && magic[0] === 48 && magic[1] === 38 && magic[2] === 178 && magic[3] === 117) return "ASF";
67
+ if (magic[0] === 26 && magic[1] === 69 && magic[2] === 223 && magic[3] === 163) return "MATROSKA";
68
+ const ftyp = fileData.slice(4, 8);
69
+ if (ftyp[0] === 102 && ftyp[1] === 116 && ftyp[2] === 121 && ftyp[3] === 112) return "MP4";
70
+ return "unknown";
71
+ }
72
+ function isMP4(tagData, fileData) {
73
+ if (!fileData) {
74
+ return tagData?.containerFormat === "MP4";
75
+ }
76
+ if (fileData.length < 8) return false;
77
+ const magic = fileData.slice(4, 8);
78
+ return magic[0] === 102 && magic[1] === 116 && magic[2] === 121 && magic[3] === 112;
79
+ }
80
+ export {
81
+ detectOggCodec,
82
+ getAudioProperties,
83
+ getFormat,
84
+ isMP4
85
+ };
@@ -1,15 +1,10 @@
1
- /**
2
- * @fileoverview WASI-based FileHandle implementation
3
- */
1
+ /** WASI-based FileHandle implementation (taglib-1dfc split). */
4
2
  import type { FileHandle, RawChapter, RawId3v2Frame, RawLyrics, RawPicture } from "../../wasm.js";
5
3
  import type { BasicTagData } from "../../types/tags.js";
6
4
  import type { AudioProperties } from "../../types.js";
7
5
  import type { WasiModule } from "../wasmer-sdk-loader/types.js";
8
6
  export declare class WasiFileHandle implements FileHandle {
9
- private readonly wasi;
10
- private fileData;
11
- private filePath;
12
- private tagData;
7
+ private readonly state;
13
8
  private destroyed;
14
9
  constructor(wasiModule: WasiModule);
15
10
  private checkNotDestroyed;
@@ -17,27 +12,18 @@ export declare class WasiFileHandle implements FileHandle {
17
12
  loadFromPath(path: string): boolean;
18
13
  isValid(): boolean;
19
14
  save(): boolean;
15
+ getBuffer(): Uint8Array;
20
16
  getTagData(): BasicTagData;
21
17
  setTagData(data: Partial<BasicTagData>): void;
22
18
  getAudioProperties(): AudioProperties | null;
23
19
  getFormat(): string;
24
- private detectOggCodec;
25
- getBuffer(): Uint8Array;
20
+ isMP4(): boolean;
26
21
  getProperties(): Record<string, string[]>;
27
- setProperties(props: Record<string, string[]>): void;
22
+ setProperties(properties: Record<string, string[]>): void;
28
23
  getProperty(key: string): string;
29
24
  setProperty(key: string, value: string): void;
30
- isMP4(): boolean;
31
25
  getMP4Item(key: string): string;
32
26
  setMP4Item(key: string, value: string): void;
33
- /** Record an exact atom name to be repaired after the PropertyMap write. */
34
- private registerMp4ItemName;
35
- /**
36
- * Record a foreign-mean freeform atom for deletion at save (taglib-65nm).
37
- * The PropertyMap erase pass cannot express foreign atoms, so the C++ shim
38
- * consumes this list and calls removeItem on each exact atom name.
39
- */
40
- private registerMp4ItemRemoval;
41
27
  getMp4ItemRemovals(): string[] | undefined;
42
28
  setMp4ItemRemovals(removals: string[]): void;
43
29
  removeMP4Item(key: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"file-handle.d.ts","sourceRoot":"","sources":["../../../../src/runtime/wasi-adapter/file-handle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACX,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAuHhE,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,SAAS,CAAS;gBAEd,UAAU,EAAE,UAAU;IAIlC,OAAO,CAAC,iBAAiB;IAQzB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAU3C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAUnC,OAAO,IAAI,OAAO;IAMlB,IAAI,IAAI,OAAO;IAqBf,UAAU,IAAI,YAAY;IAc1B,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAgB7C,kBAAkB,IAAI,eAAe,GAAG,IAAI;IA+B5C,SAAS,IAAI,MAAM;IA2DnB,OAAO,CAAC,cAAc;IAiBtB,SAAS,IAAI,UAAU;IAKvB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAyCzC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAmCpD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAWhC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiB7C,KAAK,IAAI,OAAO;IAehB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAoB/B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAkB5C,4EAA4E;IAC5E,OAAO,CAAC,mBAAmB;IAU3B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAU9B,kBAAkB,IAAI,MAAM,EAAE,GAAG,SAAS;IAK1C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAQ5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAqBhC,WAAW,IAAI,UAAU,EAAE;IAK3B,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI;IAKzC,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAOrC,cAAc,IAAI,IAAI;IAKtB,WAAW,IAAI,UAAU,EAAE;IAK3B,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IASlE,WAAW,IAAI,UAAU,GAAG,SAAS;IAKrC,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;IAM1C,OAAO,IAAI,MAAM,GAAG,SAAS;IAM7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKlC,UAAU,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE;IAQ1C,YAAY,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA+BtD,UAAU,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;IAOlE,UAAU,CACR,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAC9D,IAAI;IAaP,SAAS,IAAI,SAAS,EAAE;IAoBxB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI;IAKpC,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,EAAE;IAsB3C,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI;IAUpD,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAInC,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,GAAG,SAAS;IAMhE,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"file-handle.d.ts","sourceRoot":"","sources":["../../../../src/runtime/wasi-adapter/file-handle.ts"],"names":[],"mappings":"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"}