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.
Files changed (97) hide show
  1. package/README.md +8 -1
  2. package/dist/disc-folder.d.ts +19 -0
  3. package/dist/disc-folder.d.ts.map +1 -0
  4. package/dist/disc-folder.js +550 -0
  5. package/dist/index.browser.d.ts +3 -4
  6. package/dist/index.browser.d.ts.map +1 -1
  7. package/dist/index.browser.js +187 -176
  8. package/dist/index.d.ts +3 -4
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +4 -12
  11. package/dist/simple.browser.js +172 -33
  12. package/dist/src/constants/complex-properties.d.ts +0 -114
  13. package/dist/src/constants/complex-properties.d.ts.map +1 -1
  14. package/dist/src/constants/complex-properties.js +0 -55
  15. package/dist/src/constants/index.d.ts +0 -1
  16. package/dist/src/constants/index.d.ts.map +1 -1
  17. package/dist/src/constants/index.js +0 -1
  18. package/dist/src/constants/utilities.d.ts +13 -0
  19. package/dist/src/constants/utilities.d.ts.map +1 -1
  20. package/dist/src/constants/utilities.js +9 -1
  21. package/dist/src/file-utils/import-operations.d.ts.map +1 -1
  22. package/dist/src/file-utils/import-operations.js +1 -1
  23. package/dist/src/folder-api/file-processors.d.ts.map +1 -1
  24. package/dist/src/folder-api/file-processors.js +6 -5
  25. package/dist/src/folder-api/scan-for-albums.js +3 -3
  26. package/dist/src/folder-api/scan-operations.js +2 -2
  27. package/dist/src/msgpack/decoder.d.ts +2 -2
  28. package/dist/src/msgpack/decoder.d.ts.map +1 -1
  29. package/dist/src/msgpack/decoder.js +5 -6
  30. package/dist/src/msgpack/encoder.d.ts.map +1 -1
  31. package/dist/src/msgpack/encoder.js +9 -6
  32. package/dist/src/msgpack/index.d.ts +1 -1
  33. package/dist/src/msgpack/index.d.ts.map +1 -1
  34. package/dist/src/msgpack/types.d.ts +10 -0
  35. package/dist/src/msgpack/types.d.ts.map +1 -1
  36. package/dist/src/msgpack/utils.d.ts +2 -1
  37. package/dist/src/msgpack/utils.d.ts.map +1 -1
  38. package/dist/src/runtime/module-loader-browser.d.ts.map +1 -1
  39. package/dist/src/runtime/module-loader.d.ts.map +1 -1
  40. package/dist/src/runtime/module-loader.js +3 -3
  41. package/dist/src/runtime/platform-io.js +1 -1
  42. package/dist/src/runtime/unified-loader/module-loading.d.ts.map +1 -1
  43. package/dist/src/runtime/unified-loader/module-loading.js +1 -1
  44. package/dist/src/runtime/wasi-adapter/file-handle.d.ts +8 -0
  45. package/dist/src/runtime/wasi-adapter/file-handle.d.ts.map +1 -1
  46. package/dist/src/runtime/wasi-adapter/file-handle.js +44 -4
  47. package/dist/src/runtime/wasi-fs-deno.d.ts.map +1 -1
  48. package/dist/src/runtime/wasi-fs-deno.js +1 -1
  49. package/dist/src/simple/batch-operations.d.ts.map +1 -1
  50. package/dist/src/simple/batch-operations.js +14 -10
  51. package/dist/src/simple/picture-operations.js +1 -1
  52. package/dist/src/taglib/audio-file-base.d.ts +15 -9
  53. package/dist/src/taglib/audio-file-base.d.ts.map +1 -1
  54. package/dist/src/taglib/audio-file-base.js +35 -4
  55. package/dist/src/taglib/audio-file-impl.d.ts +2 -2
  56. package/dist/src/taglib/audio-file-impl.d.ts.map +1 -1
  57. package/dist/src/taglib/audio-file-impl.js +25 -13
  58. package/dist/src/taglib/audio-file-interface.d.ts +27 -6
  59. package/dist/src/taglib/audio-file-interface.d.ts.map +1 -1
  60. package/dist/src/taglib/auto-dispose.d.ts +6 -0
  61. package/dist/src/taglib/auto-dispose.d.ts.map +1 -0
  62. package/dist/src/taglib/auto-dispose.js +13 -0
  63. package/dist/src/taglib/embind-adapter.d.ts +2 -2
  64. package/dist/src/taglib/embind-adapter.d.ts.map +1 -1
  65. package/dist/src/taglib/embind-adapter.js +17 -0
  66. package/dist/src/taglib/extra-state-registry.d.ts.map +1 -1
  67. package/dist/src/taglib/extra-state-registry.js +9 -0
  68. package/dist/src/taglib/metadata-extent.d.ts.map +1 -1
  69. package/dist/src/taglib/metadata-extent.js +44 -1
  70. package/dist/src/taglib/mutable-tag.d.ts +15 -15
  71. package/dist/src/taglib/mutable-tag.d.ts.map +1 -1
  72. package/dist/src/taglib/save-reconstruct.d.ts.map +1 -1
  73. package/dist/src/taglib/taglib-class.d.ts.map +1 -1
  74. package/dist/src/types/tags.d.ts +0 -4
  75. package/dist/src/types/tags.d.ts.map +1 -1
  76. package/dist/src/utils/mirror-fields.d.ts +2 -0
  77. package/dist/src/utils/mirror-fields.d.ts.map +1 -1
  78. package/dist/src/utils/mirror-fields.js +11 -3
  79. package/dist/src/utils/node-fs.d.ts +10 -10
  80. package/dist/src/utils/node-fs.d.ts.map +1 -1
  81. package/dist/src/utils/node-fs.js +2 -1
  82. package/dist/src/utils/tag-mapping.d.ts.map +1 -1
  83. package/dist/src/utils/tag-mapping.js +1 -1
  84. package/dist/src/version.d.ts +1 -1
  85. package/dist/src/version.js +1 -1
  86. package/dist/src/wasm.d.ts +20 -1
  87. package/dist/src/wasm.d.ts.map +1 -1
  88. package/dist/src/web-utils/canvas.d.ts.map +1 -1
  89. package/dist/src/web-utils/canvas.js +6 -1
  90. package/dist/src/web-utils/data-url.js +1 -1
  91. package/dist/taglib-wasi.wasm +0 -0
  92. package/dist/taglib-web.wasm +0 -0
  93. package/dist/taglib-wrapper.js +1 -1
  94. package/package.json +23 -15
  95. package/dist/src/constants/tags.d.ts +0 -81
  96. package/dist/src/constants/tags.d.ts.map +0 -1
  97. package/dist/src/constants/tags.js +0 -86
@@ -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
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
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 value = this.handle.getProperty(toTagLibKey(fromTagLibKey(key)));
1808
- if (value !== "") return value;
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]?.[0];
1811
- return remapped === "" ? void 0 : 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
- startTimeMs: c.startTimeMs,
2324
- endTimeMs: inferEndTimeMs(sorted, i, trackEndMs),
2325
- title: c.title || void 0,
2326
- id: c.id || void 0,
2327
- source: c.source
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 || void 0,
2373
- counter: r.counter || void 0
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([{ rating, email, counter: 0 }]);
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
- return bitrateIndex !== 0 && bitrateIndex !== 15 && sampleRateIndex !== 3;
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.8.3";
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: extractDynamics(audioFile)
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
- tags: readExtendedTag(audioFile),
3429
- properties: audioFile.audioProperties(),
3430
- hasCoverArt: audioFile.getPictures().length > 0,
3431
- dynamics: extractDynamics(audioFile)
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
- // src/constants/complex-properties.ts
3598
- var COMPLEX_PROPERTIES = {
3599
- PICTURE: {
3600
- key: "PICTURE",
3601
- description: "Embedded album art or images",
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({ mimeType: format, data, type, description });
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, getAllTagNames, getPropertiesByFormat, getPropertyMetadata, isValidProperty, isValidTagName, PROPERTIES, Tags, } from "./src/constants.js";
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, 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, } 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 { COMPLEX_PROPERTIES, COMPLEX_PROPERTY_KEY, } from "./src/constants/complex-properties.js";
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";
@@ -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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"}