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.
- package/README.md +512 -38
- package/dist/index.browser.js +293 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/simple.browser.js +293 -3
- package/dist/src/bwf/bext.d.ts +28 -0
- package/dist/src/bwf/bext.d.ts.map +1 -0
- package/dist/src/bwf/bext.js +126 -0
- package/dist/src/constants/complex-properties.d.ts +1 -14
- package/dist/src/constants/complex-properties.d.ts.map +1 -1
- package/dist/src/msgpack/encoder.d.ts.map +1 -1
- package/dist/src/msgpack/encoder.js +11 -1
- package/dist/src/msgpack/index.d.ts +0 -1
- package/dist/src/msgpack/index.d.ts.map +1 -1
- package/dist/src/msgpack/index.js +1 -11
- package/dist/src/runtime/unified-loader/module-loading.js +1 -1
- package/dist/src/runtime/wasi-adapter/file-handle.d.ts +15 -1
- package/dist/src/runtime/wasi-adapter/file-handle.d.ts.map +1 -1
- package/dist/src/runtime/wasi-adapter/file-handle.js +62 -2
- package/dist/src/runtime/wasi-host-loader.d.ts +1 -1
- package/dist/src/runtime/wasi-host-loader.js +1 -1
- package/dist/src/taglib/audio-file-bwf.d.ts +14 -0
- package/dist/src/taglib/audio-file-bwf.d.ts.map +1 -0
- package/dist/src/taglib/audio-file-bwf.js +41 -0
- package/dist/src/taglib/audio-file-impl.d.ts +18 -0
- package/dist/src/taglib/audio-file-impl.d.ts.map +1 -1
- package/dist/src/taglib/audio-file-impl.js +74 -1
- package/dist/src/taglib/audio-file-interface.d.ts +44 -0
- package/dist/src/taglib/audio-file-interface.d.ts.map +1 -1
- package/dist/src/taglib/embind-adapter.d.ts +2 -0
- package/dist/src/taglib/embind-adapter.d.ts.map +1 -1
- package/dist/src/taglib/embind-adapter.js +36 -2
- package/dist/src/types/audio-formats.d.ts +18 -0
- package/dist/src/types/audio-formats.d.ts.map +1 -1
- package/dist/src/types/bwf.d.ts +43 -0
- package/dist/src/types/bwf.d.ts.map +1 -0
- package/dist/src/types/bwf.js +0 -0
- package/dist/src/types/chapters.d.ts +47 -0
- package/dist/src/types/chapters.d.ts.map +1 -0
- package/dist/src/types/chapters.js +0 -0
- package/dist/src/types/index.d.ts +2 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +2 -0
- package/dist/src/types/metadata-mappings.d.ts +1 -1
- package/dist/src/types/metadata-mappings.d.ts.map +1 -1
- package/dist/src/types/tags.d.ts +11 -7
- package/dist/src/types/tags.d.ts.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/wasm.d.ts +22 -52
- package/dist/src/wasm.d.ts.map +1 -1
- package/dist/taglib-wasi.wasm +0 -0
- package/dist/taglib-web.wasm +0 -0
- package/dist/taglib-wrapper.d.ts +0 -2
- package/dist/taglib-wrapper.js +1 -1
- package/package.json +5 -6
- package/dist/src/msgpack/processor.d.ts +0 -37
- package/dist/src/msgpack/processor.d.ts.map +0 -1
- package/dist/src/msgpack/processor.js +0 -69
- 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;
|
|
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([
|
|
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
|
|
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("../../
|
|
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,
|
|
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
|
|
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;
|
|
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
|
|
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":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,UAAU,GACV,WAAW,GACX,IAAI,GACJ,eAAe,CAAC;AAEpB,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,GACpB,KAAK,IAAI,eAAe,CAU1B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,QAAQ,GAChB,KAAK,GACL,KAAK,GACL,MAAM,GACN,KAAK,GACL,MAAM,GACN,KAAK,GACL,MAAM,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,QAAQ,GACR,IAAI,GACJ,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,SAAS,GACT,OAAO,GACP,UAAU,GACV,SAAS,CAAC;AAEd;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,eAAe,GACvB,KAAK,GACL,KAAK,GACL,MAAM,GACN,KAAK,GACL,KAAK,GACL,MAAM,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,QAAQ,GACR,SAAS,GACT,KAAK,GACL,KAAK,GACL,SAAS,GACT,KAAK,GACL,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,UAAU,GACV,SAAS,CAAC;AAEd;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,MAAM,GACN,KAAK,GACL,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,GACP,KAAK,GACL,WAAW,GACX,KAAK,GACL,KAAK,GACL,aAAa,GACb,KAAK,GACL,KAAK,GACL,SAAS,GACT,KAAK,GACL,KAAK,GACL,SAAS,GACT,KAAK,GACL,KAAK,GACL,IAAI,GACJ,IAAI,GACJ,SAAS,CAAC;AAEd;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,sCAAsC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
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
|