taglib-wasm 1.1.2 → 1.2.1

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 (61) hide show
  1. package/README.md +512 -38
  2. package/dist/index.browser.js +293 -3
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2 -0
  6. package/dist/simple.browser.js +293 -3
  7. package/dist/src/bwf/bext.d.ts +28 -0
  8. package/dist/src/bwf/bext.d.ts.map +1 -0
  9. package/dist/src/bwf/bext.js +126 -0
  10. package/dist/src/constants/complex-properties.d.ts +1 -14
  11. package/dist/src/constants/complex-properties.d.ts.map +1 -1
  12. package/dist/src/msgpack/encoder.d.ts.map +1 -1
  13. package/dist/src/msgpack/encoder.js +11 -1
  14. package/dist/src/msgpack/index.d.ts +0 -1
  15. package/dist/src/msgpack/index.d.ts.map +1 -1
  16. package/dist/src/msgpack/index.js +1 -11
  17. package/dist/src/runtime/unified-loader/module-loading.js +1 -1
  18. package/dist/src/runtime/wasi-adapter/file-handle.d.ts +15 -1
  19. package/dist/src/runtime/wasi-adapter/file-handle.d.ts.map +1 -1
  20. package/dist/src/runtime/wasi-adapter/file-handle.js +62 -2
  21. package/dist/src/runtime/wasi-host-loader.d.ts +1 -1
  22. package/dist/src/runtime/wasi-host-loader.js +1 -1
  23. package/dist/src/taglib/audio-file-bwf.d.ts +14 -0
  24. package/dist/src/taglib/audio-file-bwf.d.ts.map +1 -0
  25. package/dist/src/taglib/audio-file-bwf.js +41 -0
  26. package/dist/src/taglib/audio-file-impl.d.ts +18 -0
  27. package/dist/src/taglib/audio-file-impl.d.ts.map +1 -1
  28. package/dist/src/taglib/audio-file-impl.js +74 -1
  29. package/dist/src/taglib/audio-file-interface.d.ts +44 -0
  30. package/dist/src/taglib/audio-file-interface.d.ts.map +1 -1
  31. package/dist/src/taglib/embind-adapter.d.ts +2 -0
  32. package/dist/src/taglib/embind-adapter.d.ts.map +1 -1
  33. package/dist/src/taglib/embind-adapter.js +36 -2
  34. package/dist/src/types/audio-formats.d.ts +18 -0
  35. package/dist/src/types/audio-formats.d.ts.map +1 -1
  36. package/dist/src/types/bwf.d.ts +43 -0
  37. package/dist/src/types/bwf.d.ts.map +1 -0
  38. package/dist/src/types/bwf.js +0 -0
  39. package/dist/src/types/chapters.d.ts +47 -0
  40. package/dist/src/types/chapters.d.ts.map +1 -0
  41. package/dist/src/types/chapters.js +0 -0
  42. package/dist/src/types/index.d.ts +2 -0
  43. package/dist/src/types/index.d.ts.map +1 -1
  44. package/dist/src/types/index.js +2 -0
  45. package/dist/src/types/metadata-mappings.d.ts +1 -1
  46. package/dist/src/types/metadata-mappings.d.ts.map +1 -1
  47. package/dist/src/types/tags.d.ts +11 -7
  48. package/dist/src/types/tags.d.ts.map +1 -1
  49. package/dist/src/version.d.ts +1 -1
  50. package/dist/src/version.js +1 -1
  51. package/dist/src/wasm.d.ts +22 -52
  52. package/dist/src/wasm.d.ts.map +1 -1
  53. package/dist/taglib-wasi.wasm +0 -0
  54. package/dist/taglib-web.wasm +0 -0
  55. package/dist/taglib-wrapper.d.ts +0 -2
  56. package/dist/taglib-wrapper.js +1 -1
  57. package/package.json +5 -6
  58. package/dist/src/msgpack/processor.d.ts +0 -37
  59. package/dist/src/msgpack/processor.d.ts.map +0 -1
  60. package/dist/src/msgpack/processor.js +0 -69
  61. package/dist/taglib_wasi.wasm +0 -0
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @fileoverview WASI-based FileHandle implementation
3
3
  */
4
- import type { FileHandle, RawPicture } from "../../wasm.js";
4
+ import type { FileHandle, RawChapter, RawPicture } from "../../wasm.js";
5
5
  import type { BasicTagData } from "../../types/tags.js";
6
6
  import type { AudioProperties } from "../../types.js";
7
7
  import type { WasiModule } from "../wasmer-sdk-loader/types.js";
@@ -35,6 +35,20 @@ export declare class WasiFileHandle implements FileHandle {
35
35
  setPictures(pictures: RawPicture[]): void;
36
36
  addPicture(picture: RawPicture): void;
37
37
  removePictures(): void;
38
+ getChapters(): RawChapter[];
39
+ setChapters(chapters: RawChapter[], mp4ChapterStyle: string): void;
40
+ getBextData(): Uint8Array | undefined;
41
+ setBextData(data: Uint8Array | null): void;
42
+ getIxml(): string | undefined;
43
+ setIxml(data: string | null): void;
44
+ hasId3Tags(): {
45
+ v1: boolean;
46
+ v2: boolean;
47
+ };
48
+ stripId3Tags(opts: {
49
+ v1: boolean;
50
+ v2: boolean;
51
+ }): void;
38
52
  getRatings(): {
39
53
  rating: number;
40
54
  email: string;
@@ -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,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5D,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;AAqDhE,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;IAW3C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnC,OAAO,IAAI,OAAO;IAMlB,IAAI,IAAI,OAAO;IAqBf,UAAU,IAAI,YAAY;IAc1B,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAK7C,kBAAkB,IAAI,eAAe,GAAG,IAAI;IA4B5C,SAAS,IAAI,MAAM;IA2DnB,OAAO,CAAC,cAAc;IAiBtB,SAAS,IAAI,UAAU;IAKvB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAuBzC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAgBpD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOhC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAc7C,KAAK,IAAI,OAAO;IAehB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAK/B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAShC,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,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,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"file-handle.d.ts","sourceRoot":"","sources":["../../../../src/runtime/wasi-adapter/file-handle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACxE,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;AA8DhE,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;IAW3C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnC,OAAO,IAAI,OAAO;IAMlB,IAAI,IAAI,OAAO;IAqBf,UAAU,IAAI,YAAY;IAc1B,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAK7C,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;IAuBzC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAgBpD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOhC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAc7C,KAAK,IAAI,OAAO;IAehB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAK/B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAShC,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;IAS1C,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,OAAO,IAAI,IAAI;CAKhB"}
@@ -24,9 +24,18 @@ const AUDIO_KEYS = /* @__PURE__ */ new Set([
24
24
  "lengthMs",
25
25
  "mpegLayer",
26
26
  "mpegVersion",
27
+ "outputGainDb",
27
28
  "sampleRate"
28
29
  ]);
29
- const INTERNAL_KEYS = /* @__PURE__ */ new Set(["pictures", "ratings"]);
30
+ const INTERNAL_KEYS = /* @__PURE__ */ new Set([
31
+ "pictures",
32
+ "ratings",
33
+ "lyrics",
34
+ "chapters",
35
+ "_mp4ChapterStyle",
36
+ "bextData",
37
+ "ixml"
38
+ ]);
30
39
  const CONTAINER_TO_FORMAT = {
31
40
  MP3: "MP3",
32
41
  MP4: "MP4",
@@ -135,7 +144,8 @@ class WasiFileHandle {
135
144
  isLossless: d.isLossless ?? false,
136
145
  ...mpegVersion > 0 ? { mpegVersion, mpegLayer: d.mpegLayer ?? 0 } : {},
137
146
  ...containerFormat === "MP4" || containerFormat === "ASF" ? { isEncrypted: d.isEncrypted ?? false } : {},
138
- ...formatVersion > 0 ? { formatVersion } : {}
147
+ ...formatVersion > 0 ? { formatVersion } : {},
148
+ ...d.outputGainDb !== void 0 ? { outputGainDb: d.outputGainDb } : {}
139
149
  };
140
150
  }
141
151
  getFormat() {
@@ -275,6 +285,56 @@ class WasiFileHandle {
275
285
  this.checkNotDestroyed();
276
286
  this.tagData = { ...this.tagData, pictures: [] };
277
287
  }
288
+ getChapters() {
289
+ this.checkNotDestroyed();
290
+ return this.tagData?.chapters ?? [];
291
+ }
292
+ setChapters(chapters, mp4ChapterStyle) {
293
+ this.checkNotDestroyed();
294
+ this.tagData = {
295
+ ...this.tagData,
296
+ _mp4ChapterStyle: mp4ChapterStyle,
297
+ chapters
298
+ };
299
+ }
300
+ getBextData() {
301
+ this.checkNotDestroyed();
302
+ return this.tagData?.bextData ?? void 0;
303
+ }
304
+ setBextData(data) {
305
+ this.checkNotDestroyed();
306
+ this.tagData = { ...this.tagData, bextData: data };
307
+ }
308
+ getIxml() {
309
+ this.checkNotDestroyed();
310
+ const v = this.tagData?.ixml;
311
+ return typeof v === "string" && v.length > 0 ? v : void 0;
312
+ }
313
+ setIxml(data) {
314
+ this.checkNotDestroyed();
315
+ this.tagData = { ...this.tagData, ixml: data };
316
+ }
317
+ hasId3Tags() {
318
+ this.checkNotDestroyed();
319
+ const t = this.tagData?.id3Tags;
320
+ return { v1: t?.v1 ?? false, v2: t?.v2 ?? false };
321
+ }
322
+ stripId3Tags(opts) {
323
+ this.checkNotDestroyed();
324
+ const current = this.tagData?.id3Tags;
325
+ if (!current) return;
326
+ const prior = this.tagData?._stripId3;
327
+ const stripV1 = (prior?.v1 ?? false) || opts.v1;
328
+ const stripV2 = (prior?.v2 ?? false) || opts.v2;
329
+ this.tagData = {
330
+ ...this.tagData,
331
+ _stripId3: { v1: stripV1, v2: stripV2 },
332
+ id3Tags: {
333
+ v1: (current.v1 ?? false) && !stripV1,
334
+ v2: (current.v2 ?? false) && !stripV2
335
+ }
336
+ };
337
+ }
278
338
  getRatings() {
279
339
  this.checkNotDestroyed();
280
340
  return this.tagData?.ratings ?? [];
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @fileoverview WASI host loader for in-process filesystem access
3
3
  *
4
- * Loads the taglib_wasi.wasm binary with real WASI filesystem
4
+ * Loads the taglib-wasi.wasm binary with real WASI filesystem
5
5
  * implementations, enabling efficient seek-based file I/O.
6
6
  */
7
7
  import type { FileSystemProvider } from "./wasi-fs-provider.js";
@@ -22,7 +22,7 @@ async function resolveFs(provided) {
22
22
  }
23
23
  async function loadWasiHost(config) {
24
24
  const defaultPath = (() => {
25
- const url = new URL("../../taglib_wasi.wasm", import.meta.url);
25
+ const url = new URL("../../taglib-wasi.wasm", import.meta.url);
26
26
  return url.protocol === "file:" ? fileUrlToPath(url) : url.href;
27
27
  })();
28
28
  const wasmPath = config.wasmPath ?? defaultPath;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview BWF (`bext` + iXML) operations, factored out of AudioFileImpl
3
+ * to keep that file under the size limit. Each function takes the raw FileHandle
4
+ * plus the already-resolved format string (for the unsupported-format guard).
5
+ */
6
+ import type { FileHandle } from "../wasm.js";
7
+ import type { BroadcastAudioExtension } from "../types/bwf.js";
8
+ export declare function getBextData(handle: FileHandle): Uint8Array | undefined;
9
+ export declare function setBextData(handle: FileHandle, format: string, data: Uint8Array | null): void;
10
+ export declare function getBext(handle: FileHandle): BroadcastAudioExtension | undefined;
11
+ export declare function setBext(handle: FileHandle, format: string, bext: BroadcastAudioExtension): void;
12
+ export declare function getIxml(handle: FileHandle): string | undefined;
13
+ export declare function setIxml(handle: FileHandle, format: string, data: string | null): void;
14
+ //# sourceMappingURL=audio-file-bwf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-file-bwf.d.ts","sourceRoot":"","sources":["../../../src/taglib/audio-file-bwf.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAc/D,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAGtE;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,GAAG,IAAI,GACtB,IAAI,CAGN;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,UAAU,GACjB,uBAAuB,GAAG,SAAS,CAGrC;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,uBAAuB,GAC5B,IAAI,CAGN;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAE9D;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,IAAI,CAGN"}
@@ -0,0 +1,41 @@
1
+ import { decodeBext, encodeBext } from "../bwf/bext.js";
2
+ import { UnsupportedFormatError } from "../errors.js";
3
+ const BWF_FORMATS = /* @__PURE__ */ new Set(["WAV", "FLAC"]);
4
+ function requireBwf(format) {
5
+ if (!BWF_FORMATS.has(format)) {
6
+ throw new UnsupportedFormatError(format, ["WAV", "FLAC"], {
7
+ operation: "BWF metadata"
8
+ });
9
+ }
10
+ }
11
+ function getBextData(handle) {
12
+ const raw = handle.getBextData();
13
+ return raw && raw.length > 0 ? raw : void 0;
14
+ }
15
+ function setBextData(handle, format, data) {
16
+ requireBwf(format);
17
+ handle.setBextData(data);
18
+ }
19
+ function getBext(handle) {
20
+ const raw = handle.getBextData();
21
+ return raw && raw.length > 0 ? decodeBext(raw) : void 0;
22
+ }
23
+ function setBext(handle, format, bext) {
24
+ requireBwf(format);
25
+ handle.setBextData(encodeBext(bext));
26
+ }
27
+ function getIxml(handle) {
28
+ return handle.getIxml();
29
+ }
30
+ function setIxml(handle, format, data) {
31
+ requireBwf(format);
32
+ handle.setIxml(data);
33
+ }
34
+ export {
35
+ getBext,
36
+ getBextData,
37
+ getIxml,
38
+ setBext,
39
+ setBextData,
40
+ setIxml
41
+ };
@@ -1,5 +1,7 @@
1
1
  import type { FileHandle, TagLibModule } from "../wasm.js";
2
2
  import type { OpenOptions, Picture } from "../types.js";
3
+ import type { Chapter, SetChaptersOptions } from "../types/chapters.js";
4
+ import type { BroadcastAudioExtension } from "../types/bwf.js";
3
5
  import type { Rating } from "../constants/complex-properties.js";
4
6
  import type { AudioFile } from "./audio-file-interface.js";
5
7
  import { BaseAudioFileImpl } from "./audio-file-base.js";
@@ -19,9 +21,25 @@ export declare class AudioFileImpl extends BaseAudioFileImpl implements AudioFil
19
21
  setPictures(pictures: Picture[]): void;
20
22
  addPicture(picture: Picture): void;
21
23
  removePictures(): void;
24
+ getChapters(): Chapter[];
25
+ setChapters(chapters: Chapter[], options?: SetChaptersOptions): void;
26
+ getBext(): BroadcastAudioExtension | undefined;
27
+ setBext(bext: BroadcastAudioExtension): void;
28
+ getBextData(): Uint8Array | undefined;
29
+ setBextData(data: Uint8Array | null): void;
30
+ getIxml(): string | undefined;
31
+ setIxml(data: string | null): void;
22
32
  getRatings(): Rating[];
23
33
  setRatings(ratings: Rating[]): void;
24
34
  getRating(): number | undefined;
25
35
  setRating(rating: number, email?: string): void;
36
+ hasId3Tags(): {
37
+ v1: boolean;
38
+ v2: boolean;
39
+ };
40
+ stripId3Tags(opts?: {
41
+ v1?: boolean;
42
+ v2?: boolean;
43
+ }): void;
26
44
  }
27
45
  //# sourceMappingURL=audio-file-impl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-file-impl.d.ts","sourceRoot":"","sources":["../../../src/taglib/audio-file-impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAIjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAoBzD;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,iBAAkB,YAAW,SAAS;IACvE,OAAO,CAAC,cAAc,CAA2B;gBAG/C,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,UAAU,CAAC,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,EACzD,iBAAiB,GAAE,OAAe,EAClC,kBAAkB,CAAC,EAAE,WAAW;IAYlC,IAAI,IAAI,OAAO;IAYf,aAAa,IAAI,UAAU;IAgBrB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+D9C,WAAW,IAAI,OAAO,EAAE;IAUxB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAStC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASlC,cAAc,IAAI,IAAI;IAItB,UAAU,IAAI,MAAM,EAAE;IAUtB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAQnC,SAAS,IAAI,MAAM,GAAG,SAAS;IAK/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;CAGhD"}
1
+ {"version":3,"file":"audio-file-impl.d.ts","sourceRoot":"","sources":["../../../src/taglib/audio-file-impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAc,YAAY,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAQjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAqCzD;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,iBAAkB,YAAW,SAAS;IACvE,OAAO,CAAC,cAAc,CAA2B;gBAG/C,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,UAAU,CAAC,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,EACzD,iBAAiB,GAAE,OAAe,EAClC,kBAAkB,CAAC,EAAE,WAAW;IAYlC,IAAI,IAAI,OAAO;IAYf,aAAa,IAAI,UAAU;IAgBrB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmE9C,WAAW,IAAI,OAAO,EAAE;IAUxB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAStC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASlC,cAAc,IAAI,IAAI;IAItB,WAAW,IAAI,OAAO,EAAE;IAYxB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAkBpE,OAAO,IAAI,uBAAuB,GAAG,SAAS;IAI9C,OAAO,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI;IAI5C,WAAW,IAAI,UAAU,GAAG,SAAS;IAIrC,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;IAI1C,OAAO,IAAI,MAAM,GAAG,SAAS;IAI7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIlC,UAAU,IAAI,MAAM,EAAE;IAUtB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAQnC,SAAS,IAAI,MAAM,GAAG,SAAS;IAK/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAI/C,UAAU,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE;IAI1C,YAAY,CAAC,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;CAM1D"}
@@ -2,12 +2,26 @@ var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { PICTURE_TYPE_NAMES, PICTURE_TYPE_VALUES } from "../types.js";
5
- import { FileOperationError, InvalidFormatError } from "../errors.js";
5
+ import * as bwf from "./audio-file-bwf.js";
6
+ import {
7
+ FileOperationError,
8
+ InvalidFormatError,
9
+ UnsupportedFormatError
10
+ } from "../errors.js";
6
11
  import { readFileData } from "../utils/file.js";
7
12
  import { writeFileData } from "../utils/write.js";
8
13
  import { BaseAudioFileImpl } from "./audio-file-base.js";
9
14
  import { wrapEmbindHandle } from "./embind-adapter.js";
10
15
  let _nodeFs;
16
+ function sortChapters(list) {
17
+ return [...list].sort((a, b) => a.startTimeMs - b.startTimeMs);
18
+ }
19
+ function inferEndTimeMs(sorted, index, trackEndMs) {
20
+ const own = sorted[index].endTimeMs;
21
+ if (own !== void 0) return own;
22
+ const next = sorted[index + 1];
23
+ return next ? next.startTimeMs : trackEndMs;
24
+ }
11
25
  function readFileSync(path) {
12
26
  if (typeof Deno !== "undefined") return Deno.readFileSync(path);
13
27
  if (_nodeFs === void 0) {
@@ -80,6 +94,10 @@ class AudioFileImpl extends BaseAudioFileImpl {
80
94
  fullFileHandle.setTagData(this.handle.getTagData());
81
95
  fullFileHandle.setProperties(this.handle.getProperties());
82
96
  fullFileHandle.setPictures(this.handle.getPictures());
97
+ const bextBytes = this.handle.getBextData();
98
+ if (bextBytes !== void 0) fullFileHandle.setBextData(bextBytes);
99
+ const ixmlStr = this.handle.getIxml();
100
+ if (ixmlStr !== void 0) fullFileHandle.setIxml(ixmlStr);
83
101
  if (!fullFileHandle.save()) {
84
102
  throw new FileOperationError(
85
103
  "save",
@@ -134,6 +152,52 @@ class AudioFileImpl extends BaseAudioFileImpl {
134
152
  removePictures() {
135
153
  this.handle.removePictures();
136
154
  }
155
+ getChapters() {
156
+ const sorted = sortChapters(this.handle.getChapters());
157
+ const trackEndMs = this.audioProperties()?.durationMs;
158
+ return sorted.map((c, i) => ({
159
+ startTimeMs: c.startTimeMs,
160
+ endTimeMs: inferEndTimeMs(sorted, i, trackEndMs),
161
+ title: c.title || void 0,
162
+ id: c.id || void 0,
163
+ source: c.source
164
+ }));
165
+ }
166
+ setChapters(chapters, options) {
167
+ const fmt = this.getFormat();
168
+ if (fmt !== "MP3" && fmt !== "MP4") {
169
+ throw new UnsupportedFormatError(fmt, ["MP3", "MP4"], {
170
+ operation: "setChapters"
171
+ });
172
+ }
173
+ const sorted = sortChapters(chapters);
174
+ const trackEndMs = this.audioProperties()?.durationMs;
175
+ const raw = sorted.map((c, i) => ({
176
+ id: c.id,
177
+ startTimeMs: c.startTimeMs,
178
+ endTimeMs: inferEndTimeMs(sorted, i, trackEndMs) ?? c.startTimeMs,
179
+ title: c.title
180
+ }));
181
+ this.handle.setChapters(raw, options?.mp4ChapterStyle ?? "quicktime");
182
+ }
183
+ getBext() {
184
+ return bwf.getBext(this.handle);
185
+ }
186
+ setBext(bext) {
187
+ bwf.setBext(this.handle, this.getFormat(), bext);
188
+ }
189
+ getBextData() {
190
+ return bwf.getBextData(this.handle);
191
+ }
192
+ setBextData(data) {
193
+ bwf.setBextData(this.handle, this.getFormat(), data);
194
+ }
195
+ getIxml() {
196
+ return bwf.getIxml(this.handle);
197
+ }
198
+ setIxml(data) {
199
+ bwf.setIxml(this.handle, this.getFormat(), data);
200
+ }
137
201
  getRatings() {
138
202
  return this.handle.getRatings().map(
139
203
  (r) => ({
@@ -157,6 +221,15 @@ class AudioFileImpl extends BaseAudioFileImpl {
157
221
  setRating(rating, email) {
158
222
  this.setRatings([{ rating, email, counter: 0 }]);
159
223
  }
224
+ hasId3Tags() {
225
+ return this.handle.hasId3Tags();
226
+ }
227
+ stripId3Tags(opts) {
228
+ this.handle.stripId3Tags({
229
+ v1: opts?.v1 ?? true,
230
+ v2: opts?.v2 ?? true
231
+ });
232
+ }
160
233
  }
161
234
  export {
162
235
  AudioFileImpl
@@ -56,6 +56,33 @@ export interface AudioFile {
56
56
  addPicture(picture: Picture): void;
57
57
  /** Remove all pictures from the audio file. */
58
58
  removePictures(): void;
59
+ /**
60
+ * Get all chapter markers, ordered by start time. Empty array if the file
61
+ * has none. Read from ID3v2 CHAP frames (MP3) or, for MP4, QuickTime chapter
62
+ * tracks (preferred) or Nero `chpl` atoms.
63
+ */
64
+ getChapters(): import("../types/chapters.js").Chapter[];
65
+ /**
66
+ * Replace all chapter markers in the file with `chapters`. Only MP3 (ID3v2
67
+ * CHAP) and MP4 are supported; other formats throw. See
68
+ * {@link import("../types/chapters.js").SetChaptersOptions} for MP4 options.
69
+ */
70
+ setChapters(chapters: import("../types/chapters.js").Chapter[], options?: import("../types/chapters.js").SetChaptersOptions): void;
71
+ /**
72
+ * Parsed BWF `bext` (Broadcast Audio Extension) chunk, or `undefined` if the
73
+ * file has none / the chunk is too short to parse. WAV and FLAC only.
74
+ */
75
+ getBext(): import("../types/bwf.js").BroadcastAudioExtension | undefined;
76
+ /** Encode and write a `bext` chunk. Throws UnsupportedFormatError for non-WAV/FLAC. */
77
+ setBext(bext: import("../types/bwf.js").BroadcastAudioExtension): void;
78
+ /** Raw `bext` chunk bytes (escape hatch for vendor extensions), or `undefined` if absent. */
79
+ getBextData(): Uint8Array | undefined;
80
+ /** Write raw `bext` chunk bytes; `null` removes the chunk. Throws for non-WAV/FLAC. */
81
+ setBextData(data: Uint8Array | null): void;
82
+ /** Raw iXML chunk as a string, or `undefined` if absent. WAV and FLAC only. */
83
+ getIxml(): string | undefined;
84
+ /** Write the iXML chunk; `null` removes it. Throws for non-WAV/FLAC. */
85
+ setIxml(data: string | null): void;
59
86
  /** Get all ratings (normalized 0.0-1.0) from the audio file. */
60
87
  getRatings(): Rating[];
61
88
  /** Set ratings in the audio file (replaces all existing). */
@@ -64,6 +91,23 @@ export interface AudioFile {
64
91
  getRating(): number | undefined;
65
92
  /** Set the primary rating (normalized 0.0-1.0). */
66
93
  setRating(rating: number, email?: string): void;
94
+ /**
95
+ * Detect spurious ID3v1/ID3v2 tags on a FLAC file. Returns
96
+ * `{ v1: false, v2: false }` for non-FLAC files (their ID3 tags, if any,
97
+ * are the native format and should not be stripped).
98
+ */
99
+ hasId3Tags(): {
100
+ v1: boolean;
101
+ v2: boolean;
102
+ };
103
+ /**
104
+ * Remove ID3v1 and/or ID3v2 tags from a FLAC file, preserving Vorbis
105
+ * Comments and audio. No-op on non-FLAC files. Defaults to stripping both.
106
+ */
107
+ stripId3Tags(opts?: {
108
+ v1?: boolean;
109
+ v2?: boolean;
110
+ }): void;
67
111
  /** Release all resources associated with this file. */
68
112
  dispose(): void;
69
113
  /** Enable `using file = ...` for automatic cleanup. */
@@ -1 +1 @@
1
- {"version":3,"file":"audio-file-interface.d.ts","sourceRoot":"","sources":["../../../src/taglib/audio-file-interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio-file-interface.d.ts","sourceRoot":"","sources":["../../../src/taglib/audio-file-interface.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,8 @@ interface EmbindAudioPropertiesWrapper {
38
38
  mpegLayer(): number;
39
39
  isEncrypted(): boolean;
40
40
  formatVersion(): number;
41
+ bitrateMode(): string;
42
+ outputGainDb(): number;
41
43
  }
42
44
  /** @internal The raw Embind FileHandle before adaptation. */
43
45
  export interface EmbindFileHandle {
@@ -1 +1 @@
1
- {"version":3,"file":"embind-adapter.d.ts","sourceRoot":"","sources":["../../../src/taglib/embind-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,wEAAwE;AACxE,UAAU,gBAAgB;IACxB,KAAK,IAAI,MAAM,CAAC;IAChB,MAAM,IAAI,MAAM,CAAC;IACjB,KAAK,IAAI,MAAM,CAAC;IAChB,OAAO,IAAI,MAAM,CAAC;IAClB,KAAK,IAAI,MAAM,CAAC;IAChB,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,IAAI,MAAM,CAAC;IAChB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,oFAAoF;AACpF,UAAU,4BAA4B;IACpC,eAAe,IAAI,MAAM,CAAC;IAC1B,oBAAoB,IAAI,MAAM,CAAC;IAC/B,OAAO,IAAI,MAAM,CAAC;IAClB,UAAU,IAAI,MAAM,CAAC;IACrB,QAAQ,IAAI,MAAM,CAAC;IACnB,aAAa,IAAI,MAAM,CAAC;IACxB,KAAK,IAAI,MAAM,CAAC;IAChB,eAAe,IAAI,MAAM,CAAC;IAC1B,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,MAAM,CAAC;IACtB,SAAS,IAAI,MAAM,CAAC;IACpB,WAAW,IAAI,OAAO,CAAC;IACvB,aAAa,IAAI,MAAM,CAAC;CACzB;AAED,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,IAAI,gBAAgB,CAAC;IAC3B,kBAAkB,IAAI,4BAA4B,GAAG,IAAI,CAAC;IAC1D,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CAyDlE"}
1
+ {"version":3,"file":"embind-adapter.d.ts","sourceRoot":"","sources":["../../../src/taglib/embind-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAc7C,wEAAwE;AACxE,UAAU,gBAAgB;IACxB,KAAK,IAAI,MAAM,CAAC;IAChB,MAAM,IAAI,MAAM,CAAC;IACjB,KAAK,IAAI,MAAM,CAAC;IAChB,OAAO,IAAI,MAAM,CAAC;IAClB,KAAK,IAAI,MAAM,CAAC;IAChB,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,IAAI,MAAM,CAAC;IAChB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,oFAAoF;AACpF,UAAU,4BAA4B;IACpC,eAAe,IAAI,MAAM,CAAC;IAC1B,oBAAoB,IAAI,MAAM,CAAC;IAC/B,OAAO,IAAI,MAAM,CAAC;IAClB,UAAU,IAAI,MAAM,CAAC;IACrB,QAAQ,IAAI,MAAM,CAAC;IACnB,aAAa,IAAI,MAAM,CAAC;IACxB,KAAK,IAAI,MAAM,CAAC;IAChB,eAAe,IAAI,MAAM,CAAC;IAC1B,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,MAAM,CAAC;IACtB,SAAS,IAAI,MAAM,CAAC;IACpB,WAAW,IAAI,OAAO,CAAC;IACvB,aAAa,IAAI,MAAM,CAAC;IACxB,WAAW,IAAI,MAAM,CAAC;IACtB,YAAY,IAAI,MAAM,CAAC;CACxB;AAED,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,IAAI,gBAAgB,CAAC;IAC3B,kBAAkB,IAAI,4BAA4B,GAAG,IAAI,CAAC;IAC1D,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CA6FlE"}
@@ -1,3 +1,6 @@
1
+ function isValidBitrateMode(value) {
2
+ return value === "CBR" || value === "VBR" || value === "ABR";
3
+ }
1
4
  function wrapEmbindHandle(raw) {
2
5
  const overrides = {
3
6
  getTagData() {
@@ -22,12 +25,41 @@ function wrapEmbindHandle(raw) {
22
25
  if (data.year !== void 0) tw.setYear(data.year);
23
26
  if (data.track !== void 0) tw.setTrack(data.track);
24
27
  },
28
+ getBextData() {
29
+ const v = raw.getBextData();
30
+ if (v === void 0 || v === null) return void 0;
31
+ const u8 = v instanceof Uint8Array ? v : new Uint8Array(v);
32
+ return u8.length > 0 ? u8 : void 0;
33
+ },
34
+ setBextData(data) {
35
+ raw.setBextData(data ?? null);
36
+ },
37
+ getIxml() {
38
+ const v = raw.getIxml();
39
+ return typeof v === "string" && v.length > 0 ? v : void 0;
40
+ },
41
+ setIxml(data) {
42
+ raw.setIxml(
43
+ data ?? null
44
+ );
45
+ },
46
+ hasId3Tags() {
47
+ const v = raw.hasId3Tags();
48
+ if (!v || typeof v !== "object") return { v1: false, v2: false };
49
+ const o = v;
50
+ return { v1: o.v1 === true, v2: o.v2 === true };
51
+ },
52
+ stripId3Tags(opts) {
53
+ raw.stripId3Tags(opts);
54
+ },
25
55
  getAudioProperties() {
26
56
  const pw = raw.getAudioProperties();
27
57
  if (!pw) return null;
28
58
  const containerFormat = pw.containerFormat() || "unknown";
59
+ const codec = pw.codec() || "unknown";
29
60
  const mpegVersion = pw.mpegVersion();
30
61
  const formatVersion = pw.formatVersion();
62
+ const bitrateMode = pw.bitrateMode();
31
63
  return {
32
64
  duration: pw.lengthInSeconds(),
33
65
  durationMs: pw.lengthInMilliseconds(),
@@ -35,12 +67,14 @@ function wrapEmbindHandle(raw) {
35
67
  sampleRate: pw.sampleRate(),
36
68
  channels: pw.channels(),
37
69
  bitsPerSample: pw.bitsPerSample(),
38
- codec: pw.codec() || "unknown",
70
+ codec,
39
71
  containerFormat,
40
72
  isLossless: pw.isLossless(),
41
73
  ...mpegVersion > 0 ? { mpegVersion, mpegLayer: pw.mpegLayer() } : {},
42
74
  ...containerFormat === "MP4" || containerFormat === "ASF" ? { isEncrypted: pw.isEncrypted() } : {},
43
- ...formatVersion > 0 ? { formatVersion } : {}
75
+ ...formatVersion > 0 ? { formatVersion } : {},
76
+ ...isValidBitrateMode(bitrateMode) ? { bitrateMode } : {},
77
+ ...codec === "Opus" ? { outputGainDb: pw.outputGainDb() } : {}
44
78
  };
45
79
  }
46
80
  };
@@ -55,6 +55,13 @@ export type ContainerFormat = "MP3" | "MP4" | "FLAC" | "OGG" | "WAV" | "AIFF" |
55
55
  * ```
56
56
  */
57
57
  export type AudioCodec = "AAC" | "ALAC" | "MP3" | "FLAC" | "Vorbis" | "Opus" | "Speex" | "PCM" | "IEEEFloat" | "WAV" | "WMA" | "WMALossless" | "APE" | "DSD" | "WavPack" | "MPC" | "TTA" | "Shorten" | "MOD" | "S3M" | "IT" | "XM" | "unknown";
58
+ /**
59
+ * Bitrate mode for MP3 audio.
60
+ *
61
+ * Detected by parsing the LAME extension header in the first MPEG frame.
62
+ * Undefined for non-MP3 formats and for MP3 files lacking Xing/Info/VBRI headers.
63
+ */
64
+ export type BitrateMode = "CBR" | "VBR" | "ABR";
58
65
  /**
59
66
  * Audio properties containing technical information about the file.
60
67
  * All properties are read-only and represent the actual audio stream data.
@@ -97,6 +104,14 @@ export interface AudioProperties {
97
104
  readonly isEncrypted?: boolean;
98
105
  /** Format-specific version number (APE, WavPack, TTA, etc.) */
99
106
  readonly formatVersion?: number;
107
+ /** Bitrate mode (MP3 only — undefined for formats where it is not meaningful or detectable) */
108
+ readonly bitrateMode?: BitrateMode;
109
+ /**
110
+ * OpusHead output gain in decibels (Opus only, RFC 7845 §5.1). Players apply
111
+ * this unconditionally; it is independent of, and stacks with, ReplayGain /
112
+ * R128 *tags*. Almost always 0.
113
+ */
114
+ readonly outputGainDb?: number;
100
115
  }
101
116
  /**
102
117
  * AudioProperties narrowed by file format, making format-specific fields required.
@@ -105,6 +120,7 @@ export interface AudioProperties {
105
120
  * for a given format become required:
106
121
  * - MP3: `mpegVersion`, `mpegLayer`
107
122
  * - MP4/ASF: `isEncrypted`
123
+ * - OPUS: `outputGainDb`
108
124
  * - APE/WV/TTA/MPC/SHN: `formatVersion`
109
125
  *
110
126
  * @example
@@ -120,6 +136,8 @@ export type TypedAudioProperties<F extends FileType> = F extends "MP3" ? AudioPr
120
136
  readonly mpegLayer: number;
121
137
  } : F extends "MP4" | "ASF" ? AudioProperties & {
122
138
  readonly isEncrypted: boolean;
139
+ } : F extends "OPUS" ? AudioProperties & {
140
+ readonly outputGainDb: number;
123
141
  } : F extends "APE" | "WV" | "TTA" | "MPC" | "SHN" ? AudioProperties & {
124
142
  readonly formatVersion: number;
125
143
  } : AudioProperties;
@@ -1 +1 @@
1
- {"version":3,"file":"audio-formats.d.ts","sourceRoot":"","sources":["../../../src/types/audio-formats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio-formats.d.ts","sourceRoot":"","sources":["../../../src/types/audio-formats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @fileoverview BWF (Broadcast Wave Format) metadata types — the `bext` chunk
3
+ * (EBU Tech 3285). The iXML chunk is exposed as a raw string, not modeled here.
4
+ */
5
+ /**
6
+ * Parsed BWF `bext` (Broadcast Audio Extension) chunk. Available on WAV and
7
+ * FLAC files via {@link AudioFile.getBext} / {@link AudioFile.setBext}.
8
+ *
9
+ * `version` governs which optional fields are meaningful: 0 = none; 1 = `umid`;
10
+ * 2 = `umid` plus the loudness fields. Encoding always writes the full
11
+ * 602-byte fixed prefix regardless of version (unused fields are zeroed).
12
+ */
13
+ export interface BroadcastAudioExtension {
14
+ /** Free-text description. Truncated to 256 ASCII bytes on write. */
15
+ description: string;
16
+ /** Producer / recording device. Truncated to 32 ASCII bytes on write. */
17
+ originator: string;
18
+ /** Unambiguous reference (e.g. original tape ID). 32 bytes on write. */
19
+ originatorReference: string;
20
+ /** Origination date, "YYYY-MM-DD" (10 bytes). */
21
+ originationDate: string;
22
+ /** Origination time, "HH:MM:SS" (8 bytes). */
23
+ originationTime: string;
24
+ /** Sample count from midnight to the start of the recorded sequence. */
25
+ timeReferenceSamples: bigint;
26
+ /** bext chunk version: 0, 1, or 2. */
27
+ version: number;
28
+ /** SMPTE UMID as a lowercase hex string (the 64-byte field). Present when version ≥ 1. */
29
+ umid?: string;
30
+ /** Integrated loudness (LUFS). Present when version ≥ 2. */
31
+ loudnessValueDb?: number;
32
+ /** Loudness range (LU). Present when version ≥ 2. */
33
+ loudnessRangeDb?: number;
34
+ /** Maximum true-peak level (dBTP). Present when version ≥ 2. */
35
+ maxTruePeakLevelDbtp?: number;
36
+ /** Maximum momentary loudness (LUFS). Present when version ≥ 2. */
37
+ maxMomentaryLoudnessDb?: number;
38
+ /** Maximum short-term loudness (LUFS). Present when version ≥ 2. */
39
+ maxShortTermLoudnessDb?: number;
40
+ /** Encoding history (the spec uses CR/LF-delimited lines; exposed verbatim). */
41
+ codingHistory: string;
42
+ }
43
+ //# sourceMappingURL=bwf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bwf.d.ts","sourceRoot":"","sources":["../../../src/types/bwf.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mEAAmE;IACnE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oEAAoE;IACpE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gFAAgF;IAChF,aAAa,EAAE,MAAM,CAAC;CACvB"}
File without changes