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
package/dist/index.browser.js
CHANGED
|
@@ -100,6 +100,20 @@ var init_pictures = __esm({
|
|
|
100
100
|
}
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
+
// src/types/chapters.ts
|
|
104
|
+
var init_chapters = __esm({
|
|
105
|
+
"src/types/chapters.ts"() {
|
|
106
|
+
"use strict";
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// src/types/bwf.ts
|
|
111
|
+
var init_bwf = __esm({
|
|
112
|
+
"src/types/bwf.ts"() {
|
|
113
|
+
"use strict";
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
103
117
|
// src/types/config.ts
|
|
104
118
|
var init_config = __esm({
|
|
105
119
|
"src/types/config.ts"() {
|
|
@@ -122,6 +136,8 @@ var init_types = __esm({
|
|
|
122
136
|
init_tags();
|
|
123
137
|
init_metadata_mappings();
|
|
124
138
|
init_pictures();
|
|
139
|
+
init_chapters();
|
|
140
|
+
init_bwf();
|
|
125
141
|
init_config();
|
|
126
142
|
init_format_property_keys();
|
|
127
143
|
}
|
|
@@ -135,6 +151,136 @@ var init_types2 = __esm({
|
|
|
135
151
|
}
|
|
136
152
|
});
|
|
137
153
|
|
|
154
|
+
// src/bwf/bext.ts
|
|
155
|
+
function readFixedString(bytes, offset, len) {
|
|
156
|
+
let end = offset;
|
|
157
|
+
const max = Math.min(offset + len, bytes.length);
|
|
158
|
+
while (end < max && bytes[end] !== 0) end++;
|
|
159
|
+
let s = "";
|
|
160
|
+
for (let i = offset; i < end; i++) s += String.fromCharCode(bytes[i]);
|
|
161
|
+
return s;
|
|
162
|
+
}
|
|
163
|
+
function writeFixedString(bytes, offset, len, value) {
|
|
164
|
+
for (let i = 0; i < len; i++) {
|
|
165
|
+
bytes[offset + i] = i < value.length ? value.charCodeAt(i) & 255 : 0;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function clampInt16(n) {
|
|
169
|
+
return Math.max(-32768, Math.min(32767, Math.round(n)));
|
|
170
|
+
}
|
|
171
|
+
function loudnessRaw(v) {
|
|
172
|
+
return v === void 0 ? LOUDNESS_UNSET : clampInt16(v * 100);
|
|
173
|
+
}
|
|
174
|
+
function loudnessFromRaw(raw) {
|
|
175
|
+
return raw === LOUDNESS_UNSET ? void 0 : raw / 100;
|
|
176
|
+
}
|
|
177
|
+
function bytesToHex(bytes) {
|
|
178
|
+
let s = "";
|
|
179
|
+
for (const b of bytes) s += b.toString(16).padStart(2, "0");
|
|
180
|
+
return s;
|
|
181
|
+
}
|
|
182
|
+
function hexToBytes(hex, outLen) {
|
|
183
|
+
const clean = hex.replace(/[^0-9a-fA-F]/g, "");
|
|
184
|
+
const out = new Uint8Array(outLen);
|
|
185
|
+
for (let i = 0; i + 1 < clean.length + 1 && i / 2 < outLen; i += 2) {
|
|
186
|
+
const pair = clean.slice(i, i + 2);
|
|
187
|
+
if (pair.length === 2) out[i / 2] = parseInt(pair, 16);
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
function decodeBext(bytes) {
|
|
192
|
+
if (bytes.length < VERSION_OFFSET + 2) return void 0;
|
|
193
|
+
const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
194
|
+
const timeRefLow = dv.getUint32(338, true);
|
|
195
|
+
const timeRefHigh = dv.getUint32(342, true);
|
|
196
|
+
const version = dv.getUint16(VERSION_OFFSET, true);
|
|
197
|
+
const result = {
|
|
198
|
+
description: readFixedString(bytes, 0, 256),
|
|
199
|
+
originator: readFixedString(bytes, 256, 32),
|
|
200
|
+
originatorReference: readFixedString(bytes, 288, 32),
|
|
201
|
+
originationDate: readFixedString(bytes, 320, 10),
|
|
202
|
+
originationTime: readFixedString(bytes, 330, 8),
|
|
203
|
+
timeReferenceSamples: BigInt(timeRefHigh) << 32n | BigInt(timeRefLow),
|
|
204
|
+
version,
|
|
205
|
+
codingHistory: bytes.length > FIXED_PREFIX_LEN ? readFixedString(
|
|
206
|
+
bytes,
|
|
207
|
+
FIXED_PREFIX_LEN,
|
|
208
|
+
bytes.length - FIXED_PREFIX_LEN
|
|
209
|
+
) : ""
|
|
210
|
+
};
|
|
211
|
+
if (version >= 1 && bytes.length >= UMID_OFFSET + UMID_LEN) {
|
|
212
|
+
result.umid = bytesToHex(
|
|
213
|
+
bytes.subarray(UMID_OFFSET, UMID_OFFSET + UMID_LEN)
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
if (version >= 2 && bytes.length >= LOUDNESS_OFFSET + 10) {
|
|
217
|
+
const lv = loudnessFromRaw(dv.getInt16(LOUDNESS_OFFSET, true));
|
|
218
|
+
const lr = loudnessFromRaw(dv.getInt16(LOUDNESS_OFFSET + 2, true));
|
|
219
|
+
const mtp = loudnessFromRaw(dv.getInt16(LOUDNESS_OFFSET + 4, true));
|
|
220
|
+
const mml = loudnessFromRaw(dv.getInt16(LOUDNESS_OFFSET + 6, true));
|
|
221
|
+
const msl = loudnessFromRaw(dv.getInt16(LOUDNESS_OFFSET + 8, true));
|
|
222
|
+
if (lv !== void 0) result.loudnessValueDb = lv;
|
|
223
|
+
if (lr !== void 0) result.loudnessRangeDb = lr;
|
|
224
|
+
if (mtp !== void 0) result.maxTruePeakLevelDbtp = mtp;
|
|
225
|
+
if (mml !== void 0) result.maxMomentaryLoudnessDb = mml;
|
|
226
|
+
if (msl !== void 0) result.maxShortTermLoudnessDb = msl;
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
function encodeBext(b) {
|
|
231
|
+
const codingHistory = b.codingHistory ?? "";
|
|
232
|
+
const bytes = new Uint8Array(FIXED_PREFIX_LEN + codingHistory.length);
|
|
233
|
+
const dv = new DataView(bytes.buffer);
|
|
234
|
+
const hasLoudness = b.loudnessValueDb !== void 0 || b.loudnessRangeDb !== void 0 || b.maxTruePeakLevelDbtp !== void 0 || b.maxMomentaryLoudnessDb !== void 0 || b.maxShortTermLoudnessDb !== void 0;
|
|
235
|
+
const version = Number.isInteger(b.version) ? b.version : hasLoudness ? 2 : b.umid ? 1 : 0;
|
|
236
|
+
writeFixedString(bytes, 0, 256, b.description ?? "");
|
|
237
|
+
writeFixedString(bytes, 256, 32, b.originator ?? "");
|
|
238
|
+
writeFixedString(bytes, 288, 32, b.originatorReference ?? "");
|
|
239
|
+
writeFixedString(bytes, 320, 10, b.originationDate ?? "");
|
|
240
|
+
writeFixedString(bytes, 330, 8, b.originationTime ?? "");
|
|
241
|
+
const tr = b.timeReferenceSamples ?? 0n;
|
|
242
|
+
dv.setUint32(338, Number(tr & 0xffffffffn), true);
|
|
243
|
+
dv.setUint32(342, Number(tr >> 32n & 0xffffffffn), true);
|
|
244
|
+
dv.setUint16(VERSION_OFFSET, version, true);
|
|
245
|
+
if (version >= 1 && b.umid) {
|
|
246
|
+
bytes.set(hexToBytes(b.umid, UMID_LEN), UMID_OFFSET);
|
|
247
|
+
}
|
|
248
|
+
if (version >= 2) {
|
|
249
|
+
dv.setInt16(LOUDNESS_OFFSET, loudnessRaw(b.loudnessValueDb), true);
|
|
250
|
+
dv.setInt16(LOUDNESS_OFFSET + 2, loudnessRaw(b.loudnessRangeDb), true);
|
|
251
|
+
dv.setInt16(LOUDNESS_OFFSET + 4, loudnessRaw(b.maxTruePeakLevelDbtp), true);
|
|
252
|
+
dv.setInt16(
|
|
253
|
+
LOUDNESS_OFFSET + 6,
|
|
254
|
+
loudnessRaw(b.maxMomentaryLoudnessDb),
|
|
255
|
+
true
|
|
256
|
+
);
|
|
257
|
+
dv.setInt16(
|
|
258
|
+
LOUDNESS_OFFSET + 8,
|
|
259
|
+
loudnessRaw(b.maxShortTermLoudnessDb),
|
|
260
|
+
true
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
writeFixedString(
|
|
264
|
+
bytes,
|
|
265
|
+
FIXED_PREFIX_LEN,
|
|
266
|
+
codingHistory.length,
|
|
267
|
+
codingHistory
|
|
268
|
+
);
|
|
269
|
+
return bytes;
|
|
270
|
+
}
|
|
271
|
+
var FIXED_PREFIX_LEN, VERSION_OFFSET, UMID_OFFSET, UMID_LEN, LOUDNESS_OFFSET, LOUDNESS_UNSET;
|
|
272
|
+
var init_bext = __esm({
|
|
273
|
+
"src/bwf/bext.ts"() {
|
|
274
|
+
"use strict";
|
|
275
|
+
FIXED_PREFIX_LEN = 602;
|
|
276
|
+
VERSION_OFFSET = 346;
|
|
277
|
+
UMID_OFFSET = 348;
|
|
278
|
+
UMID_LEN = 64;
|
|
279
|
+
LOUDNESS_OFFSET = 412;
|
|
280
|
+
LOUDNESS_UNSET = 32767;
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
|
|
138
284
|
// src/errors/base.ts
|
|
139
285
|
var SUPPORTED_FORMATS, TagLibError;
|
|
140
286
|
var init_base = __esm({
|
|
@@ -377,6 +523,47 @@ var init_errors2 = __esm({
|
|
|
377
523
|
}
|
|
378
524
|
});
|
|
379
525
|
|
|
526
|
+
// src/taglib/audio-file-bwf.ts
|
|
527
|
+
function requireBwf(format) {
|
|
528
|
+
if (!BWF_FORMATS.has(format)) {
|
|
529
|
+
throw new UnsupportedFormatError(format, ["WAV", "FLAC"], {
|
|
530
|
+
operation: "BWF metadata"
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
function getBextData(handle) {
|
|
535
|
+
const raw = handle.getBextData();
|
|
536
|
+
return raw && raw.length > 0 ? raw : void 0;
|
|
537
|
+
}
|
|
538
|
+
function setBextData(handle, format, data) {
|
|
539
|
+
requireBwf(format);
|
|
540
|
+
handle.setBextData(data);
|
|
541
|
+
}
|
|
542
|
+
function getBext(handle) {
|
|
543
|
+
const raw = handle.getBextData();
|
|
544
|
+
return raw && raw.length > 0 ? decodeBext(raw) : void 0;
|
|
545
|
+
}
|
|
546
|
+
function setBext(handle, format, bext) {
|
|
547
|
+
requireBwf(format);
|
|
548
|
+
handle.setBextData(encodeBext(bext));
|
|
549
|
+
}
|
|
550
|
+
function getIxml(handle) {
|
|
551
|
+
return handle.getIxml();
|
|
552
|
+
}
|
|
553
|
+
function setIxml(handle, format, data) {
|
|
554
|
+
requireBwf(format);
|
|
555
|
+
handle.setIxml(data);
|
|
556
|
+
}
|
|
557
|
+
var BWF_FORMATS;
|
|
558
|
+
var init_audio_file_bwf = __esm({
|
|
559
|
+
"src/taglib/audio-file-bwf.ts"() {
|
|
560
|
+
"use strict";
|
|
561
|
+
init_bext();
|
|
562
|
+
init_errors2();
|
|
563
|
+
BWF_FORMATS = /* @__PURE__ */ new Set(["WAV", "FLAC"]);
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
|
|
380
567
|
// browser-stub:platform-io-browser-stub
|
|
381
568
|
function getPlatformIO() {
|
|
382
569
|
throw new Error("Filesystem operations are not available in the browser.");
|
|
@@ -1359,6 +1546,9 @@ var init_audio_file_base = __esm({
|
|
|
1359
1546
|
});
|
|
1360
1547
|
|
|
1361
1548
|
// src/taglib/embind-adapter.ts
|
|
1549
|
+
function isValidBitrateMode(value) {
|
|
1550
|
+
return value === "CBR" || value === "VBR" || value === "ABR";
|
|
1551
|
+
}
|
|
1362
1552
|
function wrapEmbindHandle(raw) {
|
|
1363
1553
|
const overrides = {
|
|
1364
1554
|
getTagData() {
|
|
@@ -1383,12 +1573,41 @@ function wrapEmbindHandle(raw) {
|
|
|
1383
1573
|
if (data.year !== void 0) tw.setYear(data.year);
|
|
1384
1574
|
if (data.track !== void 0) tw.setTrack(data.track);
|
|
1385
1575
|
},
|
|
1576
|
+
getBextData() {
|
|
1577
|
+
const v = raw.getBextData();
|
|
1578
|
+
if (v === void 0 || v === null) return void 0;
|
|
1579
|
+
const u8 = v instanceof Uint8Array ? v : new Uint8Array(v);
|
|
1580
|
+
return u8.length > 0 ? u8 : void 0;
|
|
1581
|
+
},
|
|
1582
|
+
setBextData(data) {
|
|
1583
|
+
raw.setBextData(data ?? null);
|
|
1584
|
+
},
|
|
1585
|
+
getIxml() {
|
|
1586
|
+
const v = raw.getIxml();
|
|
1587
|
+
return typeof v === "string" && v.length > 0 ? v : void 0;
|
|
1588
|
+
},
|
|
1589
|
+
setIxml(data) {
|
|
1590
|
+
raw.setIxml(
|
|
1591
|
+
data ?? null
|
|
1592
|
+
);
|
|
1593
|
+
},
|
|
1594
|
+
hasId3Tags() {
|
|
1595
|
+
const v = raw.hasId3Tags();
|
|
1596
|
+
if (!v || typeof v !== "object") return { v1: false, v2: false };
|
|
1597
|
+
const o = v;
|
|
1598
|
+
return { v1: o.v1 === true, v2: o.v2 === true };
|
|
1599
|
+
},
|
|
1600
|
+
stripId3Tags(opts) {
|
|
1601
|
+
raw.stripId3Tags(opts);
|
|
1602
|
+
},
|
|
1386
1603
|
getAudioProperties() {
|
|
1387
1604
|
const pw = raw.getAudioProperties();
|
|
1388
1605
|
if (!pw) return null;
|
|
1389
1606
|
const containerFormat = pw.containerFormat() || "unknown";
|
|
1607
|
+
const codec = pw.codec() || "unknown";
|
|
1390
1608
|
const mpegVersion = pw.mpegVersion();
|
|
1391
1609
|
const formatVersion = pw.formatVersion();
|
|
1610
|
+
const bitrateMode = pw.bitrateMode();
|
|
1392
1611
|
return {
|
|
1393
1612
|
duration: pw.lengthInSeconds(),
|
|
1394
1613
|
durationMs: pw.lengthInMilliseconds(),
|
|
@@ -1396,12 +1615,14 @@ function wrapEmbindHandle(raw) {
|
|
|
1396
1615
|
sampleRate: pw.sampleRate(),
|
|
1397
1616
|
channels: pw.channels(),
|
|
1398
1617
|
bitsPerSample: pw.bitsPerSample(),
|
|
1399
|
-
codec
|
|
1618
|
+
codec,
|
|
1400
1619
|
containerFormat,
|
|
1401
1620
|
isLossless: pw.isLossless(),
|
|
1402
1621
|
...mpegVersion > 0 ? { mpegVersion, mpegLayer: pw.mpegLayer() } : {},
|
|
1403
1622
|
...containerFormat === "MP4" || containerFormat === "ASF" ? { isEncrypted: pw.isEncrypted() } : {},
|
|
1404
|
-
...formatVersion > 0 ? { formatVersion } : {}
|
|
1623
|
+
...formatVersion > 0 ? { formatVersion } : {},
|
|
1624
|
+
...isValidBitrateMode(bitrateMode) ? { bitrateMode } : {},
|
|
1625
|
+
...codec === "Opus" ? { outputGainDb: pw.outputGainDb() } : {}
|
|
1405
1626
|
};
|
|
1406
1627
|
}
|
|
1407
1628
|
};
|
|
@@ -1420,6 +1641,15 @@ var init_embind_adapter = __esm({
|
|
|
1420
1641
|
});
|
|
1421
1642
|
|
|
1422
1643
|
// src/taglib/audio-file-impl.ts
|
|
1644
|
+
function sortChapters(list) {
|
|
1645
|
+
return [...list].sort((a, b) => a.startTimeMs - b.startTimeMs);
|
|
1646
|
+
}
|
|
1647
|
+
function inferEndTimeMs(sorted, index, trackEndMs) {
|
|
1648
|
+
const own = sorted[index].endTimeMs;
|
|
1649
|
+
if (own !== void 0) return own;
|
|
1650
|
+
const next = sorted[index + 1];
|
|
1651
|
+
return next ? next.startTimeMs : trackEndMs;
|
|
1652
|
+
}
|
|
1423
1653
|
function readFileSync(path) {
|
|
1424
1654
|
if (typeof Deno !== "undefined") return Deno.readFileSync(path);
|
|
1425
1655
|
if (_nodeFs === void 0) {
|
|
@@ -1437,6 +1667,7 @@ var init_audio_file_impl = __esm({
|
|
|
1437
1667
|
"src/taglib/audio-file-impl.ts"() {
|
|
1438
1668
|
"use strict";
|
|
1439
1669
|
init_types2();
|
|
1670
|
+
init_audio_file_bwf();
|
|
1440
1671
|
init_errors2();
|
|
1441
1672
|
init_file();
|
|
1442
1673
|
init_write();
|
|
@@ -1502,6 +1733,10 @@ var init_audio_file_impl = __esm({
|
|
|
1502
1733
|
fullFileHandle.setTagData(this.handle.getTagData());
|
|
1503
1734
|
fullFileHandle.setProperties(this.handle.getProperties());
|
|
1504
1735
|
fullFileHandle.setPictures(this.handle.getPictures());
|
|
1736
|
+
const bextBytes = this.handle.getBextData();
|
|
1737
|
+
if (bextBytes !== void 0) fullFileHandle.setBextData(bextBytes);
|
|
1738
|
+
const ixmlStr = this.handle.getIxml();
|
|
1739
|
+
if (ixmlStr !== void 0) fullFileHandle.setIxml(ixmlStr);
|
|
1505
1740
|
if (!fullFileHandle.save()) {
|
|
1506
1741
|
throw new FileOperationError(
|
|
1507
1742
|
"save",
|
|
@@ -1556,6 +1791,52 @@ var init_audio_file_impl = __esm({
|
|
|
1556
1791
|
removePictures() {
|
|
1557
1792
|
this.handle.removePictures();
|
|
1558
1793
|
}
|
|
1794
|
+
getChapters() {
|
|
1795
|
+
const sorted = sortChapters(this.handle.getChapters());
|
|
1796
|
+
const trackEndMs = this.audioProperties()?.durationMs;
|
|
1797
|
+
return sorted.map((c, i) => ({
|
|
1798
|
+
startTimeMs: c.startTimeMs,
|
|
1799
|
+
endTimeMs: inferEndTimeMs(sorted, i, trackEndMs),
|
|
1800
|
+
title: c.title || void 0,
|
|
1801
|
+
id: c.id || void 0,
|
|
1802
|
+
source: c.source
|
|
1803
|
+
}));
|
|
1804
|
+
}
|
|
1805
|
+
setChapters(chapters, options) {
|
|
1806
|
+
const fmt = this.getFormat();
|
|
1807
|
+
if (fmt !== "MP3" && fmt !== "MP4") {
|
|
1808
|
+
throw new UnsupportedFormatError(fmt, ["MP3", "MP4"], {
|
|
1809
|
+
operation: "setChapters"
|
|
1810
|
+
});
|
|
1811
|
+
}
|
|
1812
|
+
const sorted = sortChapters(chapters);
|
|
1813
|
+
const trackEndMs = this.audioProperties()?.durationMs;
|
|
1814
|
+
const raw = sorted.map((c, i) => ({
|
|
1815
|
+
id: c.id,
|
|
1816
|
+
startTimeMs: c.startTimeMs,
|
|
1817
|
+
endTimeMs: inferEndTimeMs(sorted, i, trackEndMs) ?? c.startTimeMs,
|
|
1818
|
+
title: c.title
|
|
1819
|
+
}));
|
|
1820
|
+
this.handle.setChapters(raw, options?.mp4ChapterStyle ?? "quicktime");
|
|
1821
|
+
}
|
|
1822
|
+
getBext() {
|
|
1823
|
+
return getBext(this.handle);
|
|
1824
|
+
}
|
|
1825
|
+
setBext(bext) {
|
|
1826
|
+
setBext(this.handle, this.getFormat(), bext);
|
|
1827
|
+
}
|
|
1828
|
+
getBextData() {
|
|
1829
|
+
return getBextData(this.handle);
|
|
1830
|
+
}
|
|
1831
|
+
setBextData(data) {
|
|
1832
|
+
setBextData(this.handle, this.getFormat(), data);
|
|
1833
|
+
}
|
|
1834
|
+
getIxml() {
|
|
1835
|
+
return getIxml(this.handle);
|
|
1836
|
+
}
|
|
1837
|
+
setIxml(data) {
|
|
1838
|
+
setIxml(this.handle, this.getFormat(), data);
|
|
1839
|
+
}
|
|
1559
1840
|
getRatings() {
|
|
1560
1841
|
return this.handle.getRatings().map(
|
|
1561
1842
|
(r) => ({
|
|
@@ -1579,6 +1860,15 @@ var init_audio_file_impl = __esm({
|
|
|
1579
1860
|
setRating(rating, email) {
|
|
1580
1861
|
this.setRatings([{ rating, email, counter: 0 }]);
|
|
1581
1862
|
}
|
|
1863
|
+
hasId3Tags() {
|
|
1864
|
+
return this.handle.hasId3Tags();
|
|
1865
|
+
}
|
|
1866
|
+
stripId3Tags(opts) {
|
|
1867
|
+
this.handle.stripId3Tags({
|
|
1868
|
+
v1: opts?.v1 ?? true,
|
|
1869
|
+
v2: opts?.v2 ?? true
|
|
1870
|
+
});
|
|
1871
|
+
}
|
|
1582
1872
|
};
|
|
1583
1873
|
}
|
|
1584
1874
|
});
|
|
@@ -1729,7 +2019,7 @@ var VERSION;
|
|
|
1729
2019
|
var init_version = __esm({
|
|
1730
2020
|
"src/version.ts"() {
|
|
1731
2021
|
"use strict";
|
|
1732
|
-
VERSION = "1.1
|
|
2022
|
+
VERSION = "1.2.1";
|
|
1733
2023
|
}
|
|
1734
2024
|
});
|
|
1735
2025
|
|
package/dist/index.d.ts
CHANGED
|
@@ -45,7 +45,7 @@ export type { PropertyMetadata } from "./src/constants/property-types.js";
|
|
|
45
45
|
export { copyCoverArt, exportAllPictures, exportCoverArt, exportPictureByType, findCoverArtFiles, importCoverArt, importPictureWithType, loadPictureFromFile, savePictureToFile, } from "./src/file-utils/index.js";
|
|
46
46
|
export { type AudioDynamics, type AudioFileMetadata, type DuplicateGroup, exportFolderMetadata, findDuplicates, type FolderScanItem, type FolderScanOptions, type FolderScanResult, type FolderUpdateItem, type FolderUpdateResult, scanFolder, updateFolderTags, } from "./src/folder-api/index.js";
|
|
47
47
|
export { canvasToPicture, createPictureDownloadURL, createPictureGallery, dataURLToPicture, displayPicture, imageFileToPicture, pictureToDataURL, setCoverArtFromCanvas, } from "./src/web-utils/index.js";
|
|
48
|
-
export type { AudioCodec, AudioFileInput, AudioProperties, BitrateControlMode, ContainerFormat, ExtendedTag, FieldMapping, FileType, NamedAudioInput, OpenOptions, Picture, PictureType, PropertyMap, Tag, TagInput, TagName, } from "./src/types.js";
|
|
48
|
+
export type { AudioCodec, AudioFileInput, AudioProperties, BitrateControlMode, BroadcastAudioExtension, Chapter, ContainerFormat, ExtendedTag, FieldMapping, FileType, NamedAudioInput, OpenOptions, Picture, PictureType, PropertyMap, SetChaptersOptions, Tag, TagInput, TagName, } from "./src/types.js";
|
|
49
49
|
export { BITRATE_CONTROL_MODE_NAMES, BITRATE_CONTROL_MODE_VALUES, PICTURE_TYPE_NAMES, PICTURE_TYPE_VALUES, } from "./src/types.js";
|
|
50
50
|
export type { PropertyKey, PropertyValue } from "./src/constants.js";
|
|
51
51
|
export type { FormatPropertyKey, TagFormat, } from "./src/types/format-property-keys.js";
|
|
@@ -54,6 +54,7 @@ export { COMPLEX_PROPERTIES, COMPLEX_PROPERTY_KEY, } from "./src/constants/compl
|
|
|
54
54
|
export type { ComplexPropertyKey, ComplexPropertyKeyMap, ComplexPropertyValueMap, Rating, UnsyncedLyrics, VariantMap, } from "./src/constants/complex-properties.js";
|
|
55
55
|
export { RatingUtils } from "./src/utils/rating.js";
|
|
56
56
|
export type { NormalizedRating, PopmRating } from "./src/utils/rating.js";
|
|
57
|
+
export * as bwf from "./src/bwf/bext.js";
|
|
57
58
|
export type { TagLibModule, WasmModule } from "./src/wasm.js";
|
|
58
59
|
export type { LoadTagLibOptions } from "./src/runtime/loader-types.js";
|
|
59
60
|
export { loadTagLibModule } from "./src/runtime/module-loader.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -97,6 +97,7 @@ import {
|
|
|
97
97
|
COMPLEX_PROPERTY_KEY
|
|
98
98
|
} from "./src/constants/complex-properties.js";
|
|
99
99
|
import { RatingUtils } from "./src/utils/rating.js";
|
|
100
|
+
import * as bwf from "./src/bwf/bext.js";
|
|
100
101
|
import { loadTagLibModule } from "./src/runtime/module-loader.js";
|
|
101
102
|
export {
|
|
102
103
|
AudioFileImpl,
|
|
@@ -125,6 +126,7 @@ export {
|
|
|
125
126
|
applyPictures,
|
|
126
127
|
applyTags,
|
|
127
128
|
applyTagsToFile,
|
|
129
|
+
bwf,
|
|
128
130
|
canvasToPicture,
|
|
129
131
|
clearPictures,
|
|
130
132
|
clearTags,
|