taglib-wasm 1.8.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/disc-folder.d.ts +19 -0
- package/dist/disc-folder.d.ts.map +1 -0
- package/dist/disc-folder.js +550 -0
- package/dist/index.browser.d.ts +3 -4
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +187 -176
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -12
- package/dist/simple.browser.js +172 -33
- package/dist/src/constants/complex-properties.d.ts +0 -114
- package/dist/src/constants/complex-properties.d.ts.map +1 -1
- package/dist/src/constants/complex-properties.js +0 -55
- package/dist/src/constants/index.d.ts +0 -1
- package/dist/src/constants/index.d.ts.map +1 -1
- package/dist/src/constants/index.js +0 -1
- package/dist/src/constants/utilities.d.ts +13 -0
- package/dist/src/constants/utilities.d.ts.map +1 -1
- package/dist/src/constants/utilities.js +9 -1
- package/dist/src/file-utils/import-operations.d.ts.map +1 -1
- package/dist/src/file-utils/import-operations.js +1 -1
- package/dist/src/folder-api/file-processors.d.ts.map +1 -1
- package/dist/src/folder-api/file-processors.js +6 -5
- package/dist/src/folder-api/scan-for-albums.js +3 -3
- package/dist/src/folder-api/scan-operations.js +2 -2
- package/dist/src/msgpack/decoder.d.ts +2 -2
- package/dist/src/msgpack/decoder.d.ts.map +1 -1
- package/dist/src/msgpack/decoder.js +5 -6
- package/dist/src/msgpack/encoder.d.ts.map +1 -1
- package/dist/src/msgpack/encoder.js +9 -6
- package/dist/src/msgpack/index.d.ts +1 -1
- package/dist/src/msgpack/index.d.ts.map +1 -1
- package/dist/src/msgpack/types.d.ts +10 -0
- package/dist/src/msgpack/types.d.ts.map +1 -1
- package/dist/src/msgpack/utils.d.ts +2 -1
- package/dist/src/msgpack/utils.d.ts.map +1 -1
- package/dist/src/runtime/module-loader-browser.d.ts.map +1 -1
- package/dist/src/runtime/module-loader.d.ts.map +1 -1
- package/dist/src/runtime/module-loader.js +3 -3
- package/dist/src/runtime/platform-io.js +1 -1
- package/dist/src/runtime/unified-loader/module-loading.d.ts.map +1 -1
- package/dist/src/runtime/unified-loader/module-loading.js +1 -1
- package/dist/src/runtime/wasi-adapter/file-handle.d.ts +8 -0
- package/dist/src/runtime/wasi-adapter/file-handle.d.ts.map +1 -1
- package/dist/src/runtime/wasi-adapter/file-handle.js +44 -4
- package/dist/src/runtime/wasi-fs-deno.d.ts.map +1 -1
- package/dist/src/runtime/wasi-fs-deno.js +1 -1
- package/dist/src/simple/batch-operations.d.ts.map +1 -1
- package/dist/src/simple/batch-operations.js +14 -10
- package/dist/src/simple/picture-operations.js +1 -1
- package/dist/src/taglib/audio-file-base.d.ts +15 -9
- package/dist/src/taglib/audio-file-base.d.ts.map +1 -1
- package/dist/src/taglib/audio-file-base.js +35 -4
- package/dist/src/taglib/audio-file-impl.d.ts +2 -2
- package/dist/src/taglib/audio-file-impl.d.ts.map +1 -1
- package/dist/src/taglib/audio-file-impl.js +25 -13
- package/dist/src/taglib/audio-file-interface.d.ts +27 -6
- package/dist/src/taglib/audio-file-interface.d.ts.map +1 -1
- package/dist/src/taglib/auto-dispose.d.ts +6 -0
- package/dist/src/taglib/auto-dispose.d.ts.map +1 -0
- package/dist/src/taglib/auto-dispose.js +13 -0
- package/dist/src/taglib/embind-adapter.d.ts +2 -2
- package/dist/src/taglib/embind-adapter.d.ts.map +1 -1
- package/dist/src/taglib/embind-adapter.js +17 -0
- package/dist/src/taglib/extra-state-registry.d.ts.map +1 -1
- package/dist/src/taglib/extra-state-registry.js +9 -0
- package/dist/src/taglib/metadata-extent.d.ts.map +1 -1
- package/dist/src/taglib/metadata-extent.js +44 -1
- package/dist/src/taglib/mutable-tag.d.ts +15 -15
- package/dist/src/taglib/mutable-tag.d.ts.map +1 -1
- package/dist/src/taglib/save-reconstruct.d.ts.map +1 -1
- package/dist/src/taglib/taglib-class.d.ts.map +1 -1
- package/dist/src/types/tags.d.ts +0 -4
- package/dist/src/types/tags.d.ts.map +1 -1
- package/dist/src/utils/mirror-fields.d.ts +2 -0
- package/dist/src/utils/mirror-fields.d.ts.map +1 -1
- package/dist/src/utils/mirror-fields.js +11 -3
- package/dist/src/utils/node-fs.d.ts +10 -10
- package/dist/src/utils/node-fs.d.ts.map +1 -1
- package/dist/src/utils/node-fs.js +2 -1
- package/dist/src/utils/tag-mapping.d.ts.map +1 -1
- package/dist/src/utils/tag-mapping.js +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/wasm.d.ts +20 -1
- package/dist/src/wasm.d.ts.map +1 -1
- package/dist/src/web-utils/canvas.d.ts.map +1 -1
- package/dist/src/web-utils/canvas.js +6 -1
- package/dist/src/web-utils/data-url.js +1 -1
- package/dist/taglib-wasi.wasm +0 -0
- package/dist/taglib-web.wasm +0 -0
- package/dist/taglib-wrapper.js +1 -1
- package/package.json +23 -15
- package/dist/src/constants/tags.d.ts +0 -81
- package/dist/src/constants/tags.d.ts.map +0 -1
- package/dist/src/constants/tags.js +0 -86
package/dist/index.browser.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
-
var __esm = (fn, res) => function __init() {
|
|
5
|
-
|
|
4
|
+
var __esm = (fn, res, err) => function __init() {
|
|
5
|
+
if (err) throw err[0];
|
|
6
|
+
try {
|
|
7
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
+
} catch (e) {
|
|
9
|
+
throw err = [e], e;
|
|
10
|
+
}
|
|
6
11
|
};
|
|
7
12
|
var __export = (target, all) => {
|
|
8
13
|
for (var name in all)
|
|
@@ -1716,6 +1721,23 @@ var init_mutable_tag_impl = __esm({
|
|
|
1716
1721
|
}
|
|
1717
1722
|
});
|
|
1718
1723
|
|
|
1724
|
+
// src/taglib/auto-dispose.ts
|
|
1725
|
+
function registerAutoDispose(target, handle) {
|
|
1726
|
+
registry.register(target, handle, target);
|
|
1727
|
+
}
|
|
1728
|
+
function unregisterAutoDispose(target) {
|
|
1729
|
+
registry.unregister(target);
|
|
1730
|
+
}
|
|
1731
|
+
var registry;
|
|
1732
|
+
var init_auto_dispose = __esm({
|
|
1733
|
+
"src/taglib/auto-dispose.ts"() {
|
|
1734
|
+
"use strict";
|
|
1735
|
+
registry = new FinalizationRegistry((handle) => {
|
|
1736
|
+
handle.destroy();
|
|
1737
|
+
});
|
|
1738
|
+
}
|
|
1739
|
+
});
|
|
1740
|
+
|
|
1719
1741
|
// src/taglib/audio-file-base.ts
|
|
1720
1742
|
var LYRICS_PROPERTY_KEY, LYRICS_WIRE_KEY, EMPTY_KEY_SET, BaseAudioFileImpl;
|
|
1721
1743
|
var init_audio_file_base = __esm({
|
|
@@ -1725,6 +1747,7 @@ var init_audio_file_base = __esm({
|
|
|
1725
1747
|
init_errors2();
|
|
1726
1748
|
init_mp4_item_names();
|
|
1727
1749
|
init_mutable_tag_impl();
|
|
1750
|
+
init_auto_dispose();
|
|
1728
1751
|
LYRICS_PROPERTY_KEY = "lyrics";
|
|
1729
1752
|
LYRICS_WIRE_KEY = toTagLibKey(LYRICS_PROPERTY_KEY);
|
|
1730
1753
|
EMPTY_KEY_SET = /* @__PURE__ */ new Set();
|
|
@@ -1745,6 +1768,7 @@ var init_audio_file_base = __esm({
|
|
|
1745
1768
|
this.isPartiallyLoaded = isPartiallyLoaded;
|
|
1746
1769
|
this.partialLoadOptions = partialLoadOptions;
|
|
1747
1770
|
this.partialKeysAtLoad = isPartiallyLoaded ? new Set(Object.keys(fileHandle.getProperties())) : void 0;
|
|
1771
|
+
registerAutoDispose(this, fileHandle);
|
|
1748
1772
|
}
|
|
1749
1773
|
/**
|
|
1750
1774
|
* Wire-key text properties present in the partial header at load but now
|
|
@@ -1804,16 +1828,36 @@ var init_audio_file_base = __esm({
|
|
|
1804
1828
|
this.handle.setProperties(translated);
|
|
1805
1829
|
}
|
|
1806
1830
|
getProperty(key) {
|
|
1807
|
-
const
|
|
1808
|
-
|
|
1831
|
+
const wireKey = toTagLibKey(fromTagLibKey(key));
|
|
1832
|
+
const values = this.handle.getProperties()[wireKey]?.filter(
|
|
1833
|
+
(v) => v !== ""
|
|
1834
|
+
);
|
|
1835
|
+
if (values !== void 0 && values.length > 0) return values;
|
|
1809
1836
|
if (!this.isMP4()) return void 0;
|
|
1810
|
-
const remapped = this.properties()[key]?.
|
|
1811
|
-
return remapped
|
|
1837
|
+
const remapped = this.properties()[key]?.filter((v) => v !== "");
|
|
1838
|
+
return remapped !== void 0 && remapped.length > 0 ? remapped : void 0;
|
|
1812
1839
|
}
|
|
1813
1840
|
setProperty(key, value) {
|
|
1814
1841
|
const wireKey = toTagLibKey(fromTagLibKey(key));
|
|
1815
1842
|
const atomNames = mp4FreeformAtomNames([wireKey]);
|
|
1816
1843
|
if (atomNames.length > 0 && this.isMP4()) {
|
|
1844
|
+
if (value === "") {
|
|
1845
|
+
const prior = this.handle.getMp4ItemRemovals?.() ?? [];
|
|
1846
|
+
this.handle.setMp4ItemRemovals?.([
|
|
1847
|
+
.../* @__PURE__ */ new Set([...prior, ...atomNames])
|
|
1848
|
+
]);
|
|
1849
|
+
if (this.module.isWasi) {
|
|
1850
|
+
this.handle.setProperties({
|
|
1851
|
+
...this.handle.getProperties(),
|
|
1852
|
+
[wireKey]: []
|
|
1853
|
+
});
|
|
1854
|
+
} else {
|
|
1855
|
+
const rest = { ...this.handle.getProperties() };
|
|
1856
|
+
delete rest[wireKey];
|
|
1857
|
+
this.handle.setProperties(rest);
|
|
1858
|
+
}
|
|
1859
|
+
return;
|
|
1860
|
+
}
|
|
1817
1861
|
this.handle.setProperties({
|
|
1818
1862
|
...this.handle.getProperties(),
|
|
1819
1863
|
[wireKey]: [value],
|
|
@@ -1823,6 +1867,14 @@ var init_audio_file_base = __esm({
|
|
|
1823
1867
|
}
|
|
1824
1868
|
this.handle.setProperty(wireKey, value);
|
|
1825
1869
|
}
|
|
1870
|
+
/**
|
|
1871
|
+
* The empty-string clearing contract, named (taglib-qyw2): both backends
|
|
1872
|
+
* remove the property when the written value is empty, and setProperty's
|
|
1873
|
+
* wire-key normalization + MP4 freeform atom-name handling apply unchanged.
|
|
1874
|
+
*/
|
|
1875
|
+
removeProperty(key) {
|
|
1876
|
+
this.setProperty(key, "");
|
|
1877
|
+
}
|
|
1826
1878
|
isMP4() {
|
|
1827
1879
|
return this.handle.isMP4();
|
|
1828
1880
|
}
|
|
@@ -1855,6 +1907,7 @@ var init_audio_file_base = __esm({
|
|
|
1855
1907
|
return this.handle.isValid();
|
|
1856
1908
|
}
|
|
1857
1909
|
dispose() {
|
|
1910
|
+
unregisterAutoDispose(this);
|
|
1858
1911
|
if (this.fileHandle) {
|
|
1859
1912
|
this.fileHandle.destroy();
|
|
1860
1913
|
this.fileHandle = null;
|
|
@@ -1928,6 +1981,7 @@ function isValidBitrateMode(value) {
|
|
|
1928
1981
|
}
|
|
1929
1982
|
function wrapEmbindHandle(raw) {
|
|
1930
1983
|
const stagedId3v2Frames = {};
|
|
1984
|
+
let destroyed = false;
|
|
1931
1985
|
const overrides = {
|
|
1932
1986
|
getTagData() {
|
|
1933
1987
|
const tw = raw.getTag();
|
|
@@ -2007,6 +2061,22 @@ function wrapEmbindHandle(raw) {
|
|
|
2007
2061
|
stripId3Tags(opts) {
|
|
2008
2062
|
raw.stripId3Tags(opts);
|
|
2009
2063
|
},
|
|
2064
|
+
destroy() {
|
|
2065
|
+
if (destroyed) return;
|
|
2066
|
+
destroyed = true;
|
|
2067
|
+
raw.destroy();
|
|
2068
|
+
},
|
|
2069
|
+
get destroyed() {
|
|
2070
|
+
return destroyed;
|
|
2071
|
+
},
|
|
2072
|
+
// taglib-qyw2: the PropertyMap erase pass computes freeform item names
|
|
2073
|
+
// from the property table (upper-cased) and misses the restored exact-case
|
|
2074
|
+
// atom (taglib-bnhl), so clears queue the exact name here; the imperative
|
|
2075
|
+
// Embind model applies removeItem immediately, before setProperties.
|
|
2076
|
+
setMp4ItemRemovals(removals) {
|
|
2077
|
+
const handle = raw;
|
|
2078
|
+
for (const name of removals) handle.removeMP4Item(name);
|
|
2079
|
+
},
|
|
2010
2080
|
getAudioProperties() {
|
|
2011
2081
|
const pw = raw.getAudioProperties();
|
|
2012
2082
|
if (!pw) return null;
|
|
@@ -2106,6 +2176,15 @@ var init_extra_state_registry = __esm({
|
|
|
2106
2176
|
else if (complete) target.setIxml(null);
|
|
2107
2177
|
}
|
|
2108
2178
|
},
|
|
2179
|
+
{
|
|
2180
|
+
name: "_mp4ItemRemovals",
|
|
2181
|
+
copy(target, source, complete) {
|
|
2182
|
+
const v = source.getMp4ItemRemovals?.();
|
|
2183
|
+
if (complete || v !== void 0 && v.length > 0) {
|
|
2184
|
+
target.setMp4ItemRemovals?.(v ?? []);
|
|
2185
|
+
}
|
|
2186
|
+
}
|
|
2187
|
+
},
|
|
2109
2188
|
{
|
|
2110
2189
|
name: "id3v2Frames",
|
|
2111
2190
|
copy(target, source) {
|
|
@@ -2294,7 +2373,7 @@ var init_audio_file_impl = __esm({
|
|
|
2294
2373
|
mimeType: pic.mimeType,
|
|
2295
2374
|
data: pic.data,
|
|
2296
2375
|
type: PICTURE_TYPE_NAMES[pic.type] ?? "Other",
|
|
2297
|
-
description: pic.description
|
|
2376
|
+
...pic.description !== void 0 ? { description: pic.description } : {}
|
|
2298
2377
|
}));
|
|
2299
2378
|
}
|
|
2300
2379
|
setPictures(pictures) {
|
|
@@ -2319,13 +2398,20 @@ var init_audio_file_impl = __esm({
|
|
|
2319
2398
|
getChapters() {
|
|
2320
2399
|
const sorted = sortChapters(this.handle.getChapters());
|
|
2321
2400
|
const trackEndMs = this.audioProperties()?.durationMs;
|
|
2322
|
-
return sorted.map((c, i) =>
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2401
|
+
return sorted.map((c, i) => {
|
|
2402
|
+
const endTimeMs = inferEndTimeMs(sorted, i, trackEndMs);
|
|
2403
|
+
return {
|
|
2404
|
+
startTimeMs: c.startTimeMs,
|
|
2405
|
+
...endTimeMs !== void 0 ? { endTimeMs } : {},
|
|
2406
|
+
// Truthiness, not !== undefined: an empty CHAP title/id must read back
|
|
2407
|
+
// as ABSENT (the old `c.title || undefined` contract; the Embind
|
|
2408
|
+
// reader emits "" unconditionally, WASI omits — coalescing keeps the
|
|
2409
|
+
// backends agreeing).
|
|
2410
|
+
...c.title ? { title: c.title } : {},
|
|
2411
|
+
...c.id ? { id: c.id } : {},
|
|
2412
|
+
...c.source !== void 0 ? { source: c.source } : {}
|
|
2413
|
+
};
|
|
2414
|
+
});
|
|
2329
2415
|
}
|
|
2330
2416
|
setChapters(chapters, options) {
|
|
2331
2417
|
const fmt = this.getFormat();
|
|
@@ -2339,10 +2425,10 @@ var init_audio_file_impl = __esm({
|
|
|
2339
2425
|
const style = options?.mp4ChapterStyle ?? "quicktime";
|
|
2340
2426
|
const source = fmt === "MP4" ? style : "id3";
|
|
2341
2427
|
const raw = sorted.map((c, i) => ({
|
|
2342
|
-
id: c.id,
|
|
2428
|
+
...c.id !== void 0 ? { id: c.id } : {},
|
|
2343
2429
|
startTimeMs: c.startTimeMs,
|
|
2344
2430
|
endTimeMs: inferEndTimeMs(sorted, i, trackEndMs) ?? c.startTimeMs,
|
|
2345
|
-
title: c.title,
|
|
2431
|
+
...c.title !== void 0 ? { title: c.title } : {},
|
|
2346
2432
|
source
|
|
2347
2433
|
}));
|
|
2348
2434
|
this.handle.setChapters(raw, style);
|
|
@@ -2369,8 +2455,9 @@ var init_audio_file_impl = __esm({
|
|
|
2369
2455
|
return this.handle.getRatings().map(
|
|
2370
2456
|
(r) => ({
|
|
2371
2457
|
rating: r.rating,
|
|
2372
|
-
email: r.email
|
|
2373
|
-
|
|
2458
|
+
...r.email !== void 0 && r.email !== "" ? { email: r.email } : {},
|
|
2459
|
+
// 0 must read back as ABSENT (old `r.counter || undefined` contract).
|
|
2460
|
+
...r.counter !== 0 ? { counter: r.counter } : {}
|
|
2374
2461
|
})
|
|
2375
2462
|
);
|
|
2376
2463
|
}
|
|
@@ -2401,7 +2488,11 @@ var init_audio_file_impl = __esm({
|
|
|
2401
2488
|
return ratings.length > 0 ? normalized(ratings[0].rating) : void 0;
|
|
2402
2489
|
}
|
|
2403
2490
|
setRating(rating, email) {
|
|
2404
|
-
this.setRatings([{
|
|
2491
|
+
this.setRatings([{
|
|
2492
|
+
rating,
|
|
2493
|
+
...email !== void 0 ? { email } : {},
|
|
2494
|
+
counter: 0
|
|
2495
|
+
}]);
|
|
2405
2496
|
}
|
|
2406
2497
|
getId3v2Frames(id) {
|
|
2407
2498
|
assertMp3(this.getFormat());
|
|
@@ -2514,7 +2605,24 @@ function isMpegFrameSync(bytes, at = 0) {
|
|
|
2514
2605
|
if (version === 1 || layer === 0) return false;
|
|
2515
2606
|
const bitrateIndex = bytes[at + 2] >> 4 & 15;
|
|
2516
2607
|
const sampleRateIndex = bytes[at + 2] >> 2 & 3;
|
|
2517
|
-
|
|
2608
|
+
if (bitrateIndex === 0 || bitrateIndex === 15 || sampleRateIndex === 3) {
|
|
2609
|
+
return false;
|
|
2610
|
+
}
|
|
2611
|
+
const mpeg1 = version === 3;
|
|
2612
|
+
const layerIndex = layer ^ 3;
|
|
2613
|
+
const bitrate = MPEG_BITRATES[mpeg1 ? 0 : 1][layerIndex][bitrateIndex];
|
|
2614
|
+
const sampleRateTable = mpeg1 ? 0 : version === 2 ? 1 : 2;
|
|
2615
|
+
const sampleRate = MPEG_SAMPLE_RATES[sampleRateTable][sampleRateIndex];
|
|
2616
|
+
const samplesPerFrame = layerIndex === 2 ? mpeg1 ? 1152 : 576 : layerIndex === 1 ? 1152 : 384;
|
|
2617
|
+
let frameLength = Math.floor(samplesPerFrame * bitrate * 125 / sampleRate);
|
|
2618
|
+
if ((bytes[at + 2] & 2) !== 0) frameLength += layerIndex === 0 ? 4 : 1;
|
|
2619
|
+
if (frameLength === 0) return false;
|
|
2620
|
+
const next = at + frameLength;
|
|
2621
|
+
if (bytes.length < next + 4) return false;
|
|
2622
|
+
const mask = 4294839296;
|
|
2623
|
+
const header = ((bytes[at] << 24 | bytes[at + 1] << 16 | bytes[at + 2] << 8 | bytes[at + 3]) >>> 0 & mask) >>> 0;
|
|
2624
|
+
const nextHeader = ((bytes[next] << 24 | bytes[next + 1] << 16 | bytes[next + 2] << 8 | bytes[next + 3]) >>> 0 & mask) >>> 0;
|
|
2625
|
+
return header === nextHeader;
|
|
2518
2626
|
}
|
|
2519
2627
|
function containerEnd(bytes, at, limit) {
|
|
2520
2628
|
if (at >= bytes.length) return bytes.length < limit ? null : void 0;
|
|
@@ -2557,9 +2665,36 @@ function trailerFitsInFooter(tail, footerSize) {
|
|
|
2557
2665
|
}
|
|
2558
2666
|
return true;
|
|
2559
2667
|
}
|
|
2668
|
+
var MPEG_BITRATES, MPEG_SAMPLE_RATES;
|
|
2560
2669
|
var init_metadata_extent = __esm({
|
|
2561
2670
|
"src/taglib/metadata-extent.ts"() {
|
|
2562
2671
|
"use strict";
|
|
2672
|
+
MPEG_BITRATES = [
|
|
2673
|
+
[
|
|
2674
|
+
[0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0],
|
|
2675
|
+
// Layer I
|
|
2676
|
+
[0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0],
|
|
2677
|
+
// Layer II
|
|
2678
|
+
[0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0]
|
|
2679
|
+
// Layer III
|
|
2680
|
+
],
|
|
2681
|
+
[
|
|
2682
|
+
[0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0],
|
|
2683
|
+
// Layer I
|
|
2684
|
+
[0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0],
|
|
2685
|
+
// Layer II
|
|
2686
|
+
[0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0]
|
|
2687
|
+
// Layer III
|
|
2688
|
+
]
|
|
2689
|
+
];
|
|
2690
|
+
MPEG_SAMPLE_RATES = [
|
|
2691
|
+
[44100, 48e3, 32e3],
|
|
2692
|
+
// MPEG-1
|
|
2693
|
+
[22050, 24e3, 16e3],
|
|
2694
|
+
// MPEG-2
|
|
2695
|
+
[11025, 12e3, 8e3]
|
|
2696
|
+
// MPEG-2.5
|
|
2697
|
+
];
|
|
2563
2698
|
}
|
|
2564
2699
|
});
|
|
2565
2700
|
|
|
@@ -2694,7 +2829,7 @@ function mapPropertiesToExtendedTag(props) {
|
|
|
2694
2829
|
const num = parseLeadingInt(values[0]);
|
|
2695
2830
|
if (num !== void 0) tag[camelKey] = num;
|
|
2696
2831
|
} else if (camelKey === "compilation") {
|
|
2697
|
-
tag[camelKey] = values[0] === "1";
|
|
2832
|
+
tag[camelKey] = values[0] === "1" || values[0] === "true";
|
|
2698
2833
|
} else if (camelKey === "itunesAdvisory") {
|
|
2699
2834
|
tag[camelKey] = values;
|
|
2700
2835
|
if (values[0] === "1") tag.advisory = "explicit";
|
|
@@ -2831,7 +2966,7 @@ var VERSION;
|
|
|
2831
2966
|
var init_version = __esm({
|
|
2832
2967
|
"src/version.ts"() {
|
|
2833
2968
|
"use strict";
|
|
2834
|
-
VERSION = "1.
|
|
2969
|
+
VERSION = "2.1.0";
|
|
2835
2970
|
}
|
|
2836
2971
|
});
|
|
2837
2972
|
|
|
@@ -3310,7 +3445,7 @@ async function readPictureMetadata(file) {
|
|
|
3310
3445
|
return pictures.map((pic) => ({
|
|
3311
3446
|
type: pic.type,
|
|
3312
3447
|
mimeType: pic.mimeType,
|
|
3313
|
-
description: pic.description,
|
|
3448
|
+
...pic.description !== void 0 ? { description: pic.description } : {},
|
|
3314
3449
|
size: pic.data.length
|
|
3315
3450
|
}));
|
|
3316
3451
|
}
|
|
@@ -3384,10 +3519,10 @@ function extractDynamics(audioFile) {
|
|
|
3384
3519
|
"replayGainAlbumPeak"
|
|
3385
3520
|
];
|
|
3386
3521
|
for (const field of fields) {
|
|
3387
|
-
const val = audioFile.getProperty(field);
|
|
3388
|
-
if (val) dynamics[field] = val;
|
|
3522
|
+
const val = audioFile.getProperty(field)?.[0];
|
|
3523
|
+
if (val !== void 0) dynamics[field] = val;
|
|
3389
3524
|
}
|
|
3390
|
-
let appleSoundCheck = audioFile.getProperty("appleSoundCheck");
|
|
3525
|
+
let appleSoundCheck = audioFile.getProperty("appleSoundCheck")?.[0];
|
|
3391
3526
|
if (!appleSoundCheck && audioFile.isMP4()) {
|
|
3392
3527
|
appleSoundCheck = audioFile.getMP4Item("----:com.apple.iTunes:iTunNORM");
|
|
3393
3528
|
}
|
|
@@ -3413,23 +3548,27 @@ async function readMetadata(file) {
|
|
|
3413
3548
|
`File may be corrupted or in an unsupported format. File: ${name}`
|
|
3414
3549
|
);
|
|
3415
3550
|
}
|
|
3551
|
+
const dynamics = extractDynamics(audioFile);
|
|
3416
3552
|
return {
|
|
3417
3553
|
tags: readExtendedTag(audioFile),
|
|
3418
3554
|
properties: audioFile.audioProperties(),
|
|
3419
3555
|
hasCoverArt: audioFile.getPictures().length > 0,
|
|
3420
|
-
dynamics:
|
|
3556
|
+
...dynamics !== void 0 ? { dynamics } : {}
|
|
3421
3557
|
};
|
|
3422
3558
|
} finally {
|
|
3423
3559
|
audioFile.dispose();
|
|
3424
3560
|
}
|
|
3425
3561
|
}
|
|
3426
3562
|
async function readMetadataBatch(files, options = {}) {
|
|
3427
|
-
return executeBatch(files, options, (audioFile) =>
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
|
|
3432
|
-
|
|
3563
|
+
return executeBatch(files, options, (audioFile) => {
|
|
3564
|
+
const dynamics = extractDynamics(audioFile);
|
|
3565
|
+
return {
|
|
3566
|
+
tags: readExtendedTag(audioFile),
|
|
3567
|
+
properties: audioFile.audioProperties(),
|
|
3568
|
+
hasCoverArt: audioFile.getPictures().length > 0,
|
|
3569
|
+
...dynamics !== void 0 ? { dynamics } : {}
|
|
3570
|
+
};
|
|
3571
|
+
});
|
|
3433
3572
|
}
|
|
3434
3573
|
|
|
3435
3574
|
// src/simple/index.ts
|
|
@@ -3438,89 +3577,6 @@ init_types2();
|
|
|
3438
3577
|
// src/constants/index.ts
|
|
3439
3578
|
init_properties();
|
|
3440
3579
|
|
|
3441
|
-
// src/constants/tags.ts
|
|
3442
|
-
var Tags = {
|
|
3443
|
-
// Basic Properties
|
|
3444
|
-
Title: "title",
|
|
3445
|
-
Artist: "artist",
|
|
3446
|
-
Album: "album",
|
|
3447
|
-
Date: "date",
|
|
3448
|
-
TrackNumber: "trackNumber",
|
|
3449
|
-
Genre: "genre",
|
|
3450
|
-
Comment: "comment",
|
|
3451
|
-
// Extended Properties
|
|
3452
|
-
AlbumArtist: "albumArtist",
|
|
3453
|
-
Composer: "composer",
|
|
3454
|
-
Copyright: "copyright",
|
|
3455
|
-
EncodedBy: "encodedBy",
|
|
3456
|
-
DiscNumber: "discNumber",
|
|
3457
|
-
TotalTracks: "totalTracks",
|
|
3458
|
-
TotalDiscs: "totalDiscs",
|
|
3459
|
-
Compilation: "compilation",
|
|
3460
|
-
Bpm: "bpm",
|
|
3461
|
-
Lyricist: "lyricist",
|
|
3462
|
-
Conductor: "conductor",
|
|
3463
|
-
Remixer: "remixedBy",
|
|
3464
|
-
Language: "language",
|
|
3465
|
-
Publisher: "publisher",
|
|
3466
|
-
Mood: "mood",
|
|
3467
|
-
Media: "media",
|
|
3468
|
-
RadioStationOwner: "radioStationOwner",
|
|
3469
|
-
Producer: "producer",
|
|
3470
|
-
Subtitle: "subtitle",
|
|
3471
|
-
Label: "label",
|
|
3472
|
-
// Sorting Properties
|
|
3473
|
-
TitleSort: "titleSort",
|
|
3474
|
-
ArtistSort: "artistSort",
|
|
3475
|
-
AlbumArtistSort: "albumArtistSort",
|
|
3476
|
-
AlbumSort: "albumSort",
|
|
3477
|
-
ComposerSort: "composerSort",
|
|
3478
|
-
// Identifiers
|
|
3479
|
-
Isrc: "isrc",
|
|
3480
|
-
Asin: "asin",
|
|
3481
|
-
CatalogNumber: "catalogNumber",
|
|
3482
|
-
Barcode: "barcode",
|
|
3483
|
-
// MusicBrainz Identifiers
|
|
3484
|
-
MusicBrainzArtistId: "musicbrainzArtistId",
|
|
3485
|
-
MusicBrainzReleaseArtistId: "musicbrainzReleaseArtistId",
|
|
3486
|
-
MusicBrainzWorkId: "musicbrainzWorkId",
|
|
3487
|
-
MusicBrainzReleaseId: "musicbrainzReleaseId",
|
|
3488
|
-
MusicBrainzRecordingId: "musicbrainzTrackId",
|
|
3489
|
-
MusicBrainzTrackId: "musicbrainzTrackId",
|
|
3490
|
-
MusicBrainzReleaseGroupId: "musicbrainzReleaseGroupId",
|
|
3491
|
-
MusicBrainzReleaseTrackId: "musicbrainzReleaseTrackId",
|
|
3492
|
-
// AcoustID
|
|
3493
|
-
AcoustidFingerprint: "acoustidFingerprint",
|
|
3494
|
-
AcoustidId: "acoustidId",
|
|
3495
|
-
// Podcast Properties
|
|
3496
|
-
PodcastId: "podcastId",
|
|
3497
|
-
PodcastUrl: "podcastUrl",
|
|
3498
|
-
// Grouping and Work
|
|
3499
|
-
Grouping: "grouping",
|
|
3500
|
-
Work: "work",
|
|
3501
|
-
// Additional Metadata
|
|
3502
|
-
Lyrics: "lyrics",
|
|
3503
|
-
AlbumGain: "replayGainAlbumGain",
|
|
3504
|
-
AlbumPeak: "replayGainAlbumPeak",
|
|
3505
|
-
TrackGain: "replayGainTrackGain",
|
|
3506
|
-
TrackPeak: "replayGainTrackPeak",
|
|
3507
|
-
// Original release
|
|
3508
|
-
OriginalArtist: "originalArtist",
|
|
3509
|
-
OriginalAlbum: "originalAlbum",
|
|
3510
|
-
OriginalDate: "originalDate",
|
|
3511
|
-
// Miscellaneous
|
|
3512
|
-
Script: "script",
|
|
3513
|
-
InvolvedPeople: "involvedPeople",
|
|
3514
|
-
Encoding: "encoding"
|
|
3515
|
-
};
|
|
3516
|
-
var VALID_TAG_NAMES = new Set(Object.values(Tags));
|
|
3517
|
-
function isValidTagName(name) {
|
|
3518
|
-
return VALID_TAG_NAMES.has(name);
|
|
3519
|
-
}
|
|
3520
|
-
function getAllTagNames() {
|
|
3521
|
-
return Object.values(Tags);
|
|
3522
|
-
}
|
|
3523
|
-
|
|
3524
3580
|
// src/constants/format-mappings.ts
|
|
3525
3581
|
var FormatMappings = {
|
|
3526
3582
|
Title: {
|
|
@@ -3593,59 +3649,12 @@ function getPropertiesByFormat(format) {
|
|
|
3593
3649
|
(key) => PROPERTIES[key].supportedFormats.includes(format)
|
|
3594
3650
|
);
|
|
3595
3651
|
}
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3602
|
-
type: "binary",
|
|
3603
|
-
supportedFormats: ["ID3v2", "MP4", "Vorbis", "FLAC"],
|
|
3604
|
-
mappings: {
|
|
3605
|
-
id3v2: { frame: "APIC" },
|
|
3606
|
-
mp4: "covr",
|
|
3607
|
-
vorbis: "METADATA_BLOCK_PICTURE",
|
|
3608
|
-
flac: "PICTURE"
|
|
3609
|
-
}
|
|
3610
|
-
},
|
|
3611
|
-
RATING: {
|
|
3612
|
-
key: "RATING",
|
|
3613
|
-
description: "Track rating (normalized 0.0-1.0)",
|
|
3614
|
-
type: "object",
|
|
3615
|
-
supportedFormats: ["ID3v2", "Vorbis", "MP4"],
|
|
3616
|
-
mappings: {
|
|
3617
|
-
id3v2: { frame: "POPM" },
|
|
3618
|
-
vorbis: "RATING",
|
|
3619
|
-
mp4: "----:com.apple.iTunes:RATING"
|
|
3620
|
-
}
|
|
3621
|
-
},
|
|
3622
|
-
LYRICS: {
|
|
3623
|
-
key: "LYRICS",
|
|
3624
|
-
description: "Unsynchronized lyrics text",
|
|
3625
|
-
type: "object",
|
|
3626
|
-
supportedFormats: ["ID3v2", "Vorbis", "MP4"],
|
|
3627
|
-
mappings: {
|
|
3628
|
-
id3v2: { frame: "USLT" },
|
|
3629
|
-
vorbis: "LYRICS",
|
|
3630
|
-
mp4: "\xA9lyr"
|
|
3631
|
-
}
|
|
3632
|
-
},
|
|
3633
|
-
CHAPTER: {
|
|
3634
|
-
key: "CHAPTER",
|
|
3635
|
-
description: "Chapter markers with time ranges",
|
|
3636
|
-
type: "object",
|
|
3637
|
-
supportedFormats: ["ID3v2"],
|
|
3638
|
-
mappings: {
|
|
3639
|
-
id3v2: { frame: "CHAP" }
|
|
3640
|
-
}
|
|
3641
|
-
}
|
|
3642
|
-
};
|
|
3643
|
-
var COMPLEX_PROPERTY_KEY = {
|
|
3644
|
-
PICTURE: "PICTURE",
|
|
3645
|
-
RATING: "RATING",
|
|
3646
|
-
LYRICS: "LYRICS",
|
|
3647
|
-
CHAPTER: "CHAPTER"
|
|
3648
|
-
};
|
|
3652
|
+
function propertyValues(props, key) {
|
|
3653
|
+
return props[key] ?? [];
|
|
3654
|
+
}
|
|
3655
|
+
function propertyValue(props, key) {
|
|
3656
|
+
return props[key]?.[0];
|
|
3657
|
+
}
|
|
3649
3658
|
|
|
3650
3659
|
// src/web-utils/data-url.ts
|
|
3651
3660
|
init_classes();
|
|
@@ -3673,7 +3682,7 @@ function dataURLToPicture(dataURL, type = "FrontCover", description) {
|
|
|
3673
3682
|
mimeType,
|
|
3674
3683
|
data,
|
|
3675
3684
|
type,
|
|
3676
|
-
description
|
|
3685
|
+
...description !== void 0 ? { description } : {}
|
|
3677
3686
|
};
|
|
3678
3687
|
}
|
|
3679
3688
|
|
|
@@ -3706,7 +3715,12 @@ async function canvasToPicture(canvas, options = {}) {
|
|
|
3706
3715
|
blob.arrayBuffer().then(
|
|
3707
3716
|
(arrayBuffer) => {
|
|
3708
3717
|
const data = new Uint8Array(arrayBuffer);
|
|
3709
|
-
resolve({
|
|
3718
|
+
resolve({
|
|
3719
|
+
mimeType: format,
|
|
3720
|
+
data,
|
|
3721
|
+
type,
|
|
3722
|
+
...description !== void 0 ? { description } : {}
|
|
3723
|
+
});
|
|
3710
3724
|
},
|
|
3711
3725
|
reject
|
|
3712
3726
|
);
|
|
@@ -3784,8 +3798,6 @@ export {
|
|
|
3784
3798
|
AudioFileImpl,
|
|
3785
3799
|
BITRATE_CONTROL_MODE_NAMES,
|
|
3786
3800
|
BITRATE_CONTROL_MODE_VALUES,
|
|
3787
|
-
COMPLEX_PROPERTIES,
|
|
3788
|
-
COMPLEX_PROPERTY_KEY,
|
|
3789
3801
|
EnvironmentError,
|
|
3790
3802
|
FileOperationError,
|
|
3791
3803
|
FormatMappings,
|
|
@@ -3800,7 +3812,6 @@ export {
|
|
|
3800
3812
|
TagLib,
|
|
3801
3813
|
TagLibError,
|
|
3802
3814
|
TagLibInitializationError,
|
|
3803
|
-
Tags,
|
|
3804
3815
|
UnsupportedFormatError,
|
|
3805
3816
|
addPicture,
|
|
3806
3817
|
applyCoverArt,
|
|
@@ -3818,7 +3829,6 @@ export {
|
|
|
3818
3829
|
findPictureByType,
|
|
3819
3830
|
getAllProperties,
|
|
3820
3831
|
getAllPropertyKeys,
|
|
3821
|
-
getAllTagNames,
|
|
3822
3832
|
getPropertiesByFormat,
|
|
3823
3833
|
getPropertyMetadata,
|
|
3824
3834
|
imageFileToPicture,
|
|
@@ -3832,9 +3842,10 @@ export {
|
|
|
3832
3842
|
isUnsupportedFormatError,
|
|
3833
3843
|
isValidAudioFile,
|
|
3834
3844
|
isValidProperty,
|
|
3835
|
-
isValidTagName,
|
|
3836
3845
|
loadTagLibModule,
|
|
3837
3846
|
pictureToDataURL,
|
|
3847
|
+
propertyValue,
|
|
3848
|
+
propertyValues,
|
|
3838
3849
|
readCoverArt,
|
|
3839
3850
|
readFormat,
|
|
3840
3851
|
readMetadata,
|
package/dist/index.d.ts
CHANGED
|
@@ -40,18 +40,17 @@ export { EnvironmentError, FileOperationError, InvalidFormatError, isEnvironment
|
|
|
40
40
|
export type { TagLibErrorCode } from "./src/errors.js";
|
|
41
41
|
export { initializeForDenoCompile, isDenoCompiled, prepareWasmForEmbedding, } from "./src/deno-compile.js";
|
|
42
42
|
export { addPicture, applyCoverArt, applyPictures, applyTags, applyTagsToFile, type BatchItem, type BatchOptions, type BatchResult, clearPictures, clearTags, type FileMetadata, findPictureByType, isValidAudioFile, readCoverArt, readFormat, readMetadata, readMetadataBatch, readPictureMetadata, readPictures, readProperties, readPropertiesBatch, readTags, readTagsBatch, replacePictureByType, setBufferMode, } from "./src/simple/index.js";
|
|
43
|
-
export { FormatMappings, getAllProperties, getAllPropertyKeys,
|
|
43
|
+
export { FormatMappings, getAllProperties, getAllPropertyKeys, getPropertiesByFormat, getPropertyMetadata, isValidProperty, PROPERTIES, propertyValue, propertyValues, } from "./src/constants.js";
|
|
44
44
|
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 AlbumDisc, type AlbumGroup, type AlbumGroupingResult, type AlbumGroupItem, type AlbumGroupKey, type AudioDynamics, type AudioFileMetadata, type DiscConfidence, type DiscFolderInfo, discFolderInfo, type DuplicateGroup, exportFolderMetadata, findDuplicates, type FolderScanItem, type FolderScanOptions, type FolderScanResult, type FolderUpdateItem, type FolderUpdateResult, groupAlbums, type GroupAlbumsOptions, scanFolder, scanForAlbums, type ScanForAlbumsOptions, 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, BroadcastAudioExtension, Chapter, ContainerFormat, ExtendedTag, FieldMapping, FileType, NamedAudioInput, OpenOptions, Picture, PictureType, PropertyMap, SetChaptersOptions, Tag, TagInput,
|
|
48
|
+
export type { AudioCodec, AudioFileInput, AudioProperties, BitrateControlMode, BroadcastAudioExtension, Chapter, ContainerFormat, ExtendedTag, FieldMapping, FileType, NamedAudioInput, OpenOptions, Picture, PictureType, PropertyMap, SetChaptersOptions, Tag, TagInput, } 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";
|
|
52
52
|
export type { TypedAudioProperties } from "./src/types/audio-formats.js";
|
|
53
|
-
export {
|
|
54
|
-
export type { ComplexPropertyKey, ComplexPropertyKeyMap, ComplexPropertyValueMap, Id3v2Frame, Rating, UnsyncedLyrics, VariantMap, } from "./src/constants/complex-properties.js";
|
|
53
|
+
export type { Id3v2Frame, Rating, UnsyncedLyrics, VariantMap, } from "./src/constants/complex-properties.js";
|
|
55
54
|
export { RatingUtils } from "./src/utils/rating.js";
|
|
56
55
|
export type { NormalizedRating, PopmRating } from "./src/utils/rating.js";
|
|
57
56
|
export * as bwf from "./src/bwf/bext.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,YAAY,EACV,SAAS,EACT,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,aAAa,EACb,SAAS,EACT,KAAK,YAAY,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|