taglib-wasm 1.3.0 → 1.4.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.
@@ -1333,12 +1333,15 @@ var init_properties = __esm({
1333
1333
  });
1334
1334
 
1335
1335
  // src/taglib/audio-file-base.ts
1336
- var BaseAudioFileImpl;
1336
+ var LYRICS_PROPERTY_KEY, LYRICS_WIRE_KEY, EMPTY_KEY_SET, BaseAudioFileImpl;
1337
1337
  var init_audio_file_base = __esm({
1338
1338
  "src/taglib/audio-file-base.ts"() {
1339
1339
  "use strict";
1340
1340
  init_properties();
1341
1341
  init_errors2();
1342
+ LYRICS_PROPERTY_KEY = "lyrics";
1343
+ LYRICS_WIRE_KEY = toTagLibKey(LYRICS_PROPERTY_KEY);
1344
+ EMPTY_KEY_SET = /* @__PURE__ */ new Set();
1342
1345
  BaseAudioFileImpl = class {
1343
1346
  constructor(module, fileHandle, sourcePath, originalSource, isPartiallyLoaded = false, partialLoadOptions) {
1344
1347
  __publicField(this, "module", module);
@@ -1348,11 +1351,30 @@ var init_audio_file_base = __esm({
1348
1351
  __publicField(this, "originalSource");
1349
1352
  __publicField(this, "isPartiallyLoaded", false);
1350
1353
  __publicField(this, "partialLoadOptions");
1354
+ /** Text-property wire keys in the partial header at load; undefined if full. */
1355
+ __publicField(this, "partialKeysAtLoad");
1351
1356
  this.fileHandle = fileHandle;
1352
1357
  this.sourcePath = sourcePath;
1353
1358
  this.originalSource = originalSource;
1354
1359
  this.isPartiallyLoaded = isPartiallyLoaded;
1355
1360
  this.partialLoadOptions = partialLoadOptions;
1361
+ this.partialKeysAtLoad = isPartiallyLoaded ? new Set(Object.keys(fileHandle.getProperties())) : void 0;
1362
+ }
1363
+ /**
1364
+ * Wire-key text properties present in the partial header at load but now
1365
+ * absent — the user deleted them. The partial-load reconstruct subtracts these
1366
+ * from its preserve-the-original merge so a deletion persists without wiping
1367
+ * frames beyond the loaded header (taglib-d14). Lyrics are excluded (they ride
1368
+ * their own reconstruct path); empty for a full load.
1369
+ */
1370
+ partialDeletedPropertyKeys() {
1371
+ if (!this.partialKeysAtLoad) return EMPTY_KEY_SET;
1372
+ const current = new Set(Object.keys(this.handle.getProperties()));
1373
+ const deleted = /* @__PURE__ */ new Set();
1374
+ for (const key of this.partialKeysAtLoad) {
1375
+ if (key !== LYRICS_WIRE_KEY && !current.has(key)) deleted.add(key);
1376
+ }
1377
+ return deleted;
1356
1378
  }
1357
1379
  get handle() {
1358
1380
  if (!this.fileHandle) {
@@ -1448,13 +1470,19 @@ var init_audio_file_base = __esm({
1448
1470
  return this.cachedAudioProperties ?? void 0;
1449
1471
  }
1450
1472
  properties() {
1451
- return remapKeysFromTagLib(this.handle.getProperties());
1473
+ const remapped = remapKeysFromTagLib(this.handle.getProperties());
1474
+ delete remapped[LYRICS_PROPERTY_KEY];
1475
+ return remapped;
1452
1476
  }
1453
1477
  setProperties(properties) {
1454
1478
  const translated = {};
1455
1479
  for (const [key, values] of Object.entries(properties)) {
1456
1480
  if (values !== void 0) translated[toTagLibKey(key)] = values;
1457
1481
  }
1482
+ if (!(LYRICS_WIRE_KEY in translated)) {
1483
+ const existing = this.handle.getProperties()[LYRICS_WIRE_KEY];
1484
+ if (existing !== void 0) translated[LYRICS_WIRE_KEY] = existing;
1485
+ }
1458
1486
  this.handle.setProperties(translated);
1459
1487
  }
1460
1488
  getProperty(key) {
@@ -1734,14 +1762,14 @@ var init_extra_state_registry = __esm({
1734
1762
  });
1735
1763
 
1736
1764
  // src/taglib/save-reconstruct.ts
1737
- function copyEditedState(target, source, sourceComplete) {
1765
+ function copyEditedState(target, source, sourceComplete, deletedKeys) {
1738
1766
  target.setTagData(source.getTagData());
1739
- target.setProperties(
1740
- sourceComplete ? source.getProperties() : { ...target.getProperties(), ...source.getProperties() }
1741
- );
1767
+ const merged = sourceComplete ? source.getProperties() : { ...target.getProperties(), ...source.getProperties() };
1768
+ for (const key of deletedKeys) delete merged[key];
1769
+ target.setProperties(merged);
1742
1770
  copyExtraState(target, source, sourceComplete);
1743
1771
  }
1744
- async function saveViaFreshHandle(module, editing, source, targetPath, sourceComplete) {
1772
+ async function saveViaFreshHandle(module, editing, source, targetPath, sourceComplete, deletedKeys = /* @__PURE__ */ new Set()) {
1745
1773
  const rawFullHandle = module.createFileHandle();
1746
1774
  const fullFileHandle = module.isWasi ? rawFullHandle : wrapEmbindHandle(rawFullHandle);
1747
1775
  try {
@@ -1753,7 +1781,7 @@ async function saveViaFreshHandle(module, editing, source, targetPath, sourceCom
1753
1781
  );
1754
1782
  }
1755
1783
  }
1756
- copyEditedState(fullFileHandle, editing, sourceComplete);
1784
+ copyEditedState(fullFileHandle, editing, sourceComplete, deletedKeys);
1757
1785
  if (!fullFileHandle.save()) {
1758
1786
  throw new FileOperationError(
1759
1787
  "save",
@@ -1858,7 +1886,8 @@ var init_audio_file_impl = __esm({
1858
1886
  this.handle,
1859
1887
  this.originalSource,
1860
1888
  targetPath,
1861
- false
1889
+ false,
1890
+ this.partialDeletedPropertyKeys()
1862
1891
  );
1863
1892
  this.isPartiallyLoaded = false;
1864
1893
  this.originalSource = void 0;
@@ -1976,6 +2005,21 @@ var init_audio_file_impl = __esm({
1976
2005
  counter: r.counter ?? 0
1977
2006
  })));
1978
2007
  }
2008
+ getLyrics() {
2009
+ return this.handle.getLyrics().map((l) => {
2010
+ const out = { text: l.text };
2011
+ if (l.description) out.description = l.description;
2012
+ if (l.language) out.language = l.language;
2013
+ return out;
2014
+ });
2015
+ }
2016
+ setLyrics(lyrics) {
2017
+ this.handle.setLyrics(lyrics.map((l) => ({
2018
+ text: l.text,
2019
+ description: l.description ?? "",
2020
+ language: l.language ?? ""
2021
+ })));
2022
+ }
1979
2023
  getRating() {
1980
2024
  const ratings = this.getRatings();
1981
2025
  return ratings.length > 0 ? ratings[0].rating : void 0;
@@ -2038,6 +2082,24 @@ function parseNumeric(value) {
2038
2082
  const parsed = Number.parseInt(value, 10);
2039
2083
  return Number.isNaN(parsed) ? void 0 : parsed;
2040
2084
  }
2085
+ function readExtendedTag(audioFile) {
2086
+ const tag = mapPropertiesToExtendedTag(audioFile.properties());
2087
+ const pictures = audioFile.getPictures();
2088
+ if (pictures.length > 0) tag.pictures = pictures;
2089
+ const ratings = audioFile.getRatings();
2090
+ if (ratings.length > 0) tag.ratings = ratings;
2091
+ const lyrics = audioFile.getLyrics();
2092
+ if (lyrics.length > 0) tag.lyrics = lyrics;
2093
+ const chapters = audioFile.getChapters();
2094
+ if (chapters.length > 0) tag.chapters = chapters;
2095
+ const bext = audioFile.getBext();
2096
+ if (bext !== void 0) tag.bext = bext;
2097
+ const bextData = audioFile.getBextData();
2098
+ if (bextData !== void 0) tag.bextData = bextData;
2099
+ const ixml = audioFile.getIxml();
2100
+ if (ixml !== void 0) tag.ixml = ixml;
2101
+ return tag;
2102
+ }
2041
2103
  function mapPropertiesToExtendedTag(props) {
2042
2104
  const tag = {};
2043
2105
  for (const [propKey, tagField] of Object.entries(BASIC_PROPERTY_KEYS)) {
@@ -2149,7 +2211,7 @@ var VERSION;
2149
2211
  var init_version = __esm({
2150
2212
  "src/version.ts"() {
2151
2213
  "use strict";
2152
- VERSION = "1.3.0";
2214
+ VERSION = "1.4.0";
2153
2215
  }
2154
2216
  });
2155
2217
 
@@ -2504,10 +2566,7 @@ async function withAudioFileSaveToFile(file, fn) {
2504
2566
 
2505
2567
  // src/simple/tag-operations.ts
2506
2568
  async function readTags(file) {
2507
- return withAudioFile(
2508
- file,
2509
- (audioFile) => mapPropertiesToExtendedTag(audioFile.properties())
2510
- );
2569
+ return withAudioFile(file, (audioFile) => readExtendedTag(audioFile));
2511
2570
  }
2512
2571
  async function applyTags(file, tags) {
2513
2572
  return withAudioFileSave(file, (audioFile) => {
@@ -2565,8 +2624,15 @@ async function readFormat(file) {
2565
2624
  }
2566
2625
  async function clearTags(file) {
2567
2626
  return withAudioFileSave(file, (audioFile) => {
2568
- audioFile.setProperties({});
2627
+ const cleared = {};
2628
+ for (const key of Object.keys(audioFile.properties())) cleared[key] = [];
2629
+ audioFile.setProperties(cleared);
2569
2630
  audioFile.removePictures();
2631
+ audioFile.setLyrics([]);
2632
+ audioFile.setRatings([]);
2633
+ if (audioFile.getChapters().length > 0) audioFile.setChapters([]);
2634
+ if (audioFile.getBextData() !== void 0) audioFile.setBextData(null);
2635
+ if (audioFile.getIxml() !== void 0) audioFile.setIxml(null);
2570
2636
  });
2571
2637
  }
2572
2638
 
@@ -2678,7 +2744,7 @@ async function readTagsBatch(files, options = {}) {
2678
2744
  return executeBatch(
2679
2745
  files,
2680
2746
  options,
2681
- (audioFile) => mapPropertiesToExtendedTag(audioFile.properties())
2747
+ (audioFile) => readExtendedTag(audioFile)
2682
2748
  );
2683
2749
  }
2684
2750
  async function readPropertiesBatch(files, options = {}) {
@@ -2727,7 +2793,7 @@ async function readMetadata(file) {
2727
2793
  );
2728
2794
  }
2729
2795
  return {
2730
- tags: mapPropertiesToExtendedTag(audioFile.properties()),
2796
+ tags: readExtendedTag(audioFile),
2731
2797
  properties: audioFile.audioProperties(),
2732
2798
  hasCoverArt: audioFile.getPictures().length > 0,
2733
2799
  dynamics: extractDynamics(audioFile)
@@ -2738,7 +2804,7 @@ async function readMetadata(file) {
2738
2804
  }
2739
2805
  async function readMetadataBatch(files, options = {}) {
2740
2806
  return executeBatch(files, options, (audioFile) => ({
2741
- tags: mapPropertiesToExtendedTag(audioFile.properties()),
2807
+ tags: readExtendedTag(audioFile),
2742
2808
  properties: audioFile.audioProperties(),
2743
2809
  hasCoverArt: audioFile.getPictures().length > 0,
2744
2810
  dynamics: extractDynamics(audioFile)
@@ -1321,12 +1321,15 @@ var init_properties = __esm({
1321
1321
  });
1322
1322
 
1323
1323
  // src/taglib/audio-file-base.ts
1324
- var BaseAudioFileImpl;
1324
+ var LYRICS_PROPERTY_KEY, LYRICS_WIRE_KEY, EMPTY_KEY_SET, BaseAudioFileImpl;
1325
1325
  var init_audio_file_base = __esm({
1326
1326
  "src/taglib/audio-file-base.ts"() {
1327
1327
  "use strict";
1328
1328
  init_properties();
1329
1329
  init_errors2();
1330
+ LYRICS_PROPERTY_KEY = "lyrics";
1331
+ LYRICS_WIRE_KEY = toTagLibKey(LYRICS_PROPERTY_KEY);
1332
+ EMPTY_KEY_SET = /* @__PURE__ */ new Set();
1330
1333
  BaseAudioFileImpl = class {
1331
1334
  constructor(module, fileHandle, sourcePath, originalSource, isPartiallyLoaded = false, partialLoadOptions) {
1332
1335
  __publicField(this, "module", module);
@@ -1336,11 +1339,30 @@ var init_audio_file_base = __esm({
1336
1339
  __publicField(this, "originalSource");
1337
1340
  __publicField(this, "isPartiallyLoaded", false);
1338
1341
  __publicField(this, "partialLoadOptions");
1342
+ /** Text-property wire keys in the partial header at load; undefined if full. */
1343
+ __publicField(this, "partialKeysAtLoad");
1339
1344
  this.fileHandle = fileHandle;
1340
1345
  this.sourcePath = sourcePath;
1341
1346
  this.originalSource = originalSource;
1342
1347
  this.isPartiallyLoaded = isPartiallyLoaded;
1343
1348
  this.partialLoadOptions = partialLoadOptions;
1349
+ this.partialKeysAtLoad = isPartiallyLoaded ? new Set(Object.keys(fileHandle.getProperties())) : void 0;
1350
+ }
1351
+ /**
1352
+ * Wire-key text properties present in the partial header at load but now
1353
+ * absent — the user deleted them. The partial-load reconstruct subtracts these
1354
+ * from its preserve-the-original merge so a deletion persists without wiping
1355
+ * frames beyond the loaded header (taglib-d14). Lyrics are excluded (they ride
1356
+ * their own reconstruct path); empty for a full load.
1357
+ */
1358
+ partialDeletedPropertyKeys() {
1359
+ if (!this.partialKeysAtLoad) return EMPTY_KEY_SET;
1360
+ const current = new Set(Object.keys(this.handle.getProperties()));
1361
+ const deleted = /* @__PURE__ */ new Set();
1362
+ for (const key of this.partialKeysAtLoad) {
1363
+ if (key !== LYRICS_WIRE_KEY && !current.has(key)) deleted.add(key);
1364
+ }
1365
+ return deleted;
1344
1366
  }
1345
1367
  get handle() {
1346
1368
  if (!this.fileHandle) {
@@ -1436,13 +1458,19 @@ var init_audio_file_base = __esm({
1436
1458
  return this.cachedAudioProperties ?? void 0;
1437
1459
  }
1438
1460
  properties() {
1439
- return remapKeysFromTagLib(this.handle.getProperties());
1461
+ const remapped = remapKeysFromTagLib(this.handle.getProperties());
1462
+ delete remapped[LYRICS_PROPERTY_KEY];
1463
+ return remapped;
1440
1464
  }
1441
1465
  setProperties(properties) {
1442
1466
  const translated = {};
1443
1467
  for (const [key, values] of Object.entries(properties)) {
1444
1468
  if (values !== void 0) translated[toTagLibKey(key)] = values;
1445
1469
  }
1470
+ if (!(LYRICS_WIRE_KEY in translated)) {
1471
+ const existing = this.handle.getProperties()[LYRICS_WIRE_KEY];
1472
+ if (existing !== void 0) translated[LYRICS_WIRE_KEY] = existing;
1473
+ }
1446
1474
  this.handle.setProperties(translated);
1447
1475
  }
1448
1476
  getProperty(key) {
@@ -1722,14 +1750,14 @@ var init_extra_state_registry = __esm({
1722
1750
  });
1723
1751
 
1724
1752
  // src/taglib/save-reconstruct.ts
1725
- function copyEditedState(target, source, sourceComplete) {
1753
+ function copyEditedState(target, source, sourceComplete, deletedKeys) {
1726
1754
  target.setTagData(source.getTagData());
1727
- target.setProperties(
1728
- sourceComplete ? source.getProperties() : { ...target.getProperties(), ...source.getProperties() }
1729
- );
1755
+ const merged = sourceComplete ? source.getProperties() : { ...target.getProperties(), ...source.getProperties() };
1756
+ for (const key of deletedKeys) delete merged[key];
1757
+ target.setProperties(merged);
1730
1758
  copyExtraState(target, source, sourceComplete);
1731
1759
  }
1732
- async function saveViaFreshHandle(module, editing, source, targetPath, sourceComplete) {
1760
+ async function saveViaFreshHandle(module, editing, source, targetPath, sourceComplete, deletedKeys = /* @__PURE__ */ new Set()) {
1733
1761
  const rawFullHandle = module.createFileHandle();
1734
1762
  const fullFileHandle = module.isWasi ? rawFullHandle : wrapEmbindHandle(rawFullHandle);
1735
1763
  try {
@@ -1741,7 +1769,7 @@ async function saveViaFreshHandle(module, editing, source, targetPath, sourceCom
1741
1769
  );
1742
1770
  }
1743
1771
  }
1744
- copyEditedState(fullFileHandle, editing, sourceComplete);
1772
+ copyEditedState(fullFileHandle, editing, sourceComplete, deletedKeys);
1745
1773
  if (!fullFileHandle.save()) {
1746
1774
  throw new FileOperationError(
1747
1775
  "save",
@@ -1846,7 +1874,8 @@ var init_audio_file_impl = __esm({
1846
1874
  this.handle,
1847
1875
  this.originalSource,
1848
1876
  targetPath,
1849
- false
1877
+ false,
1878
+ this.partialDeletedPropertyKeys()
1850
1879
  );
1851
1880
  this.isPartiallyLoaded = false;
1852
1881
  this.originalSource = void 0;
@@ -1964,6 +1993,21 @@ var init_audio_file_impl = __esm({
1964
1993
  counter: r.counter ?? 0
1965
1994
  })));
1966
1995
  }
1996
+ getLyrics() {
1997
+ return this.handle.getLyrics().map((l) => {
1998
+ const out = { text: l.text };
1999
+ if (l.description) out.description = l.description;
2000
+ if (l.language) out.language = l.language;
2001
+ return out;
2002
+ });
2003
+ }
2004
+ setLyrics(lyrics) {
2005
+ this.handle.setLyrics(lyrics.map((l) => ({
2006
+ text: l.text,
2007
+ description: l.description ?? "",
2008
+ language: l.language ?? ""
2009
+ })));
2010
+ }
1967
2011
  getRating() {
1968
2012
  const ratings = this.getRatings();
1969
2013
  return ratings.length > 0 ? ratings[0].rating : void 0;
@@ -2026,6 +2070,24 @@ function parseNumeric(value) {
2026
2070
  const parsed = Number.parseInt(value, 10);
2027
2071
  return Number.isNaN(parsed) ? void 0 : parsed;
2028
2072
  }
2073
+ function readExtendedTag(audioFile) {
2074
+ const tag = mapPropertiesToExtendedTag(audioFile.properties());
2075
+ const pictures = audioFile.getPictures();
2076
+ if (pictures.length > 0) tag.pictures = pictures;
2077
+ const ratings = audioFile.getRatings();
2078
+ if (ratings.length > 0) tag.ratings = ratings;
2079
+ const lyrics = audioFile.getLyrics();
2080
+ if (lyrics.length > 0) tag.lyrics = lyrics;
2081
+ const chapters = audioFile.getChapters();
2082
+ if (chapters.length > 0) tag.chapters = chapters;
2083
+ const bext = audioFile.getBext();
2084
+ if (bext !== void 0) tag.bext = bext;
2085
+ const bextData = audioFile.getBextData();
2086
+ if (bextData !== void 0) tag.bextData = bextData;
2087
+ const ixml = audioFile.getIxml();
2088
+ if (ixml !== void 0) tag.ixml = ixml;
2089
+ return tag;
2090
+ }
2029
2091
  function mapPropertiesToExtendedTag(props) {
2030
2092
  const tag = {};
2031
2093
  for (const [propKey, tagField] of Object.entries(BASIC_PROPERTY_KEYS)) {
@@ -2137,7 +2199,7 @@ var VERSION;
2137
2199
  var init_version = __esm({
2138
2200
  "src/version.ts"() {
2139
2201
  "use strict";
2140
- VERSION = "1.3.0";
2202
+ VERSION = "1.4.0";
2141
2203
  }
2142
2204
  });
2143
2205
 
@@ -2486,10 +2548,7 @@ async function withAudioFileSaveToFile(file, fn) {
2486
2548
 
2487
2549
  // src/simple/tag-operations.ts
2488
2550
  async function readTags(file) {
2489
- return withAudioFile(
2490
- file,
2491
- (audioFile) => mapPropertiesToExtendedTag(audioFile.properties())
2492
- );
2551
+ return withAudioFile(file, (audioFile) => readExtendedTag(audioFile));
2493
2552
  }
2494
2553
  async function applyTags(file, tags) {
2495
2554
  return withAudioFileSave(file, (audioFile) => {
@@ -2547,8 +2606,15 @@ async function readFormat(file) {
2547
2606
  }
2548
2607
  async function clearTags(file) {
2549
2608
  return withAudioFileSave(file, (audioFile) => {
2550
- audioFile.setProperties({});
2609
+ const cleared = {};
2610
+ for (const key of Object.keys(audioFile.properties())) cleared[key] = [];
2611
+ audioFile.setProperties(cleared);
2551
2612
  audioFile.removePictures();
2613
+ audioFile.setLyrics([]);
2614
+ audioFile.setRatings([]);
2615
+ if (audioFile.getChapters().length > 0) audioFile.setChapters([]);
2616
+ if (audioFile.getBextData() !== void 0) audioFile.setBextData(null);
2617
+ if (audioFile.getIxml() !== void 0) audioFile.setIxml(null);
2552
2618
  });
2553
2619
  }
2554
2620
 
@@ -2660,7 +2726,7 @@ async function readTagsBatch(files, options = {}) {
2660
2726
  return executeBatch(
2661
2727
  files,
2662
2728
  options,
2663
- (audioFile) => mapPropertiesToExtendedTag(audioFile.properties())
2729
+ (audioFile) => readExtendedTag(audioFile)
2664
2730
  );
2665
2731
  }
2666
2732
  async function readPropertiesBatch(files, options = {}) {
@@ -2709,7 +2775,7 @@ async function readMetadata(file) {
2709
2775
  );
2710
2776
  }
2711
2777
  return {
2712
- tags: mapPropertiesToExtendedTag(audioFile.properties()),
2778
+ tags: readExtendedTag(audioFile),
2713
2779
  properties: audioFile.audioProperties(),
2714
2780
  hasCoverArt: audioFile.getPictures().length > 0,
2715
2781
  dynamics: extractDynamics(audioFile)
@@ -2720,7 +2786,7 @@ async function readMetadata(file) {
2720
2786
  }
2721
2787
  async function readMetadataBatch(files, options = {}) {
2722
2788
  return executeBatch(files, options, (audioFile) => ({
2723
- tags: mapPropertiesToExtendedTag(audioFile.properties()),
2789
+ tags: readExtendedTag(audioFile),
2724
2790
  properties: audioFile.audioProperties(),
2725
2791
  hasCoverArt: audioFile.getPictures().length > 0,
2726
2792
  dynamics: extractDynamics(audioFile)
@@ -1 +1 @@
1
- {"version":3,"file":"file-handle.d.ts","sourceRoot":"","sources":["../../../../src/runtime/wasi-adapter/file-handle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-handle.d.ts","sourceRoot":"","sources":["../../../../src/runtime/wasi-adapter/file-handle.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ import {
12
12
  } from "./wasm-io.js";
13
13
  const AUDIO_KEYS = /* @__PURE__ */ new Set([
14
14
  "bitrate",
15
+ "bitrateMode",
15
16
  "bitsPerSample",
16
17
  "channels",
17
18
  "codec",
@@ -59,6 +60,12 @@ function firstString(v) {
59
60
  if (Array.isArray(v)) return v[0] ?? "";
60
61
  return v || "";
61
62
  }
63
+ function mp4ItemPropertyKey(key) {
64
+ if (key.startsWith("----:")) {
65
+ return key.slice(key.lastIndexOf(":") + 1).toUpperCase();
66
+ }
67
+ return key;
68
+ }
62
69
  class WasiFileHandle {
63
70
  constructor(wasiModule) {
64
71
  __publicField(this, "wasi");
@@ -219,22 +226,25 @@ class WasiFileHandle {
219
226
  }
220
227
  setProperties(props) {
221
228
  this.checkNotDestroyed();
222
- const mapped = {};
229
+ const next = { ...this.tagData };
223
230
  for (const [key, values] of Object.entries(props)) {
224
231
  const camelKey = fromTagLibKey(key);
225
232
  const storeKey = NUMERIC_FIELD_ALIASES[camelKey] ?? camelKey;
226
- if (storeKey === "track") {
233
+ if (values.length === 0) {
234
+ delete next[storeKey];
235
+ if (camelKey === "date") delete next.year;
236
+ } else if (storeKey === "track") {
227
237
  const parsed = Number.parseInt(values[0] ?? "", 10);
228
- if (!Number.isNaN(parsed)) mapped[storeKey] = parsed;
238
+ if (!Number.isNaN(parsed)) next[storeKey] = parsed;
229
239
  } else if (camelKey === "date") {
230
- mapped.date = values;
240
+ next.date = values;
231
241
  const year = Number.parseInt(values[0] ?? "", 10);
232
- if (!Number.isNaN(year)) mapped.year = year;
242
+ if (!Number.isNaN(year)) next.year = year;
233
243
  } else {
234
- mapped[camelKey] = values;
244
+ next[camelKey] = values;
235
245
  }
236
246
  }
237
- this.tagData = { ...this.tagData, ...mapped };
247
+ this.tagData = next;
238
248
  }
239
249
  getProperty(key) {
240
250
  this.checkNotDestroyed();
@@ -273,16 +283,16 @@ class WasiFileHandle {
273
283
  }
274
284
  getMP4Item(key) {
275
285
  this.checkNotDestroyed();
276
- return this.getProperty(key);
286
+ return this.getProperty(mp4ItemPropertyKey(key));
277
287
  }
278
288
  setMP4Item(key, value) {
279
289
  this.checkNotDestroyed();
280
- this.setProperty(key, value);
290
+ this.setProperty(mp4ItemPropertyKey(key), value);
281
291
  }
282
292
  removeMP4Item(key) {
283
293
  this.checkNotDestroyed();
284
294
  if (this.tagData) {
285
- const mappedKey = fromTagLibKey(key);
295
+ const mappedKey = fromTagLibKey(mp4ItemPropertyKey(key));
286
296
  const storeKey = NUMERIC_FIELD_ALIASES[mappedKey] ?? mappedKey;
287
297
  delete this.tagData[storeKey];
288
298
  }
@@ -1,6 +1,6 @@
1
1
  import { isNamedAudioInput } from "../types/audio-formats.js";
2
2
  import { InvalidFormatError } from "../errors.js";
3
- import { mapPropertiesToExtendedTag } from "../utils/tag-mapping.js";
3
+ import { readExtendedTag } from "../utils/tag-mapping.js";
4
4
  import { getTagLib } from "./config.js";
5
5
  async function executeBatch(files, options, processor) {
6
6
  if (files.length === 0) return { items: [], duration: 0 };
@@ -48,7 +48,7 @@ async function readTagsBatch(files, options = {}) {
48
48
  return executeBatch(
49
49
  files,
50
50
  options,
51
- (audioFile) => mapPropertiesToExtendedTag(audioFile.properties())
51
+ (audioFile) => readExtendedTag(audioFile)
52
52
  );
53
53
  }
54
54
  async function readPropertiesBatch(files, options = {}) {
@@ -97,7 +97,7 @@ async function readMetadata(file) {
97
97
  );
98
98
  }
99
99
  return {
100
- tags: mapPropertiesToExtendedTag(audioFile.properties()),
100
+ tags: readExtendedTag(audioFile),
101
101
  properties: audioFile.audioProperties(),
102
102
  hasCoverArt: audioFile.getPictures().length > 0,
103
103
  dynamics: extractDynamics(audioFile)
@@ -108,7 +108,7 @@ async function readMetadata(file) {
108
108
  }
109
109
  async function readMetadataBatch(files, options = {}) {
110
110
  return executeBatch(files, options, (audioFile) => ({
111
- tags: mapPropertiesToExtendedTag(audioFile.properties()),
111
+ tags: readExtendedTag(audioFile),
112
112
  properties: audioFile.audioProperties(),
113
113
  hasCoverArt: audioFile.getPictures().length > 0,
114
114
  dynamics: extractDynamics(audioFile)
@@ -1 +1 @@
1
- {"version":3,"file":"tag-operations.d.ts","sourceRoot":"","sources":["../../../src/simple/tag-operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,WAAW,EACX,QAAQ,EACR,QAAQ,EACT,MAAM,aAAa,CAAC;AAcrB;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CAKtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GACtB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,eAAe,CAAC,CAY1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAW/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC,CAKrB"}
1
+ {"version":3,"file":"tag-operations.d.ts","sourceRoot":"","sources":["../../../src/simple/tag-operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,WAAW,EACX,QAAQ,EAER,QAAQ,EACT,MAAM,aAAa,CAAC;AAWrB;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CAEtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GACtB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,eAAe,CAAC,CAY1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAW/B;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC,CAsBrB"}
@@ -1,8 +1,5 @@
1
1
  import { FileOperationError, MetadataError } from "../errors.js";
2
- import {
3
- mapPropertiesToExtendedTag,
4
- mergeTagUpdates
5
- } from "../utils/tag-mapping.js";
2
+ import { mergeTagUpdates, readExtendedTag } from "../utils/tag-mapping.js";
6
3
  import { getTagLib } from "./config.js";
7
4
  import {
8
5
  withAudioFile,
@@ -10,10 +7,7 @@ import {
10
7
  withAudioFileSaveToFile
11
8
  } from "./with-audio-file.js";
12
9
  async function readTags(file) {
13
- return withAudioFile(
14
- file,
15
- (audioFile) => mapPropertiesToExtendedTag(audioFile.properties())
16
- );
10
+ return withAudioFile(file, (audioFile) => readExtendedTag(audioFile));
17
11
  }
18
12
  async function applyTags(file, tags) {
19
13
  return withAudioFileSave(file, (audioFile) => {
@@ -71,8 +65,15 @@ async function readFormat(file) {
71
65
  }
72
66
  async function clearTags(file) {
73
67
  return withAudioFileSave(file, (audioFile) => {
74
- audioFile.setProperties({});
68
+ const cleared = {};
69
+ for (const key of Object.keys(audioFile.properties())) cleared[key] = [];
70
+ audioFile.setProperties(cleared);
75
71
  audioFile.removePictures();
72
+ audioFile.setLyrics([]);
73
+ audioFile.setRatings([]);
74
+ if (audioFile.getChapters().length > 0) audioFile.setChapters([]);
75
+ if (audioFile.getBextData() !== void 0) audioFile.setBextData(null);
76
+ if (audioFile.getIxml() !== void 0) audioFile.setIxml(null);
76
77
  });
77
78
  }
78
79
  export {
@@ -16,7 +16,17 @@ export declare abstract class BaseAudioFileImpl {
16
16
  protected originalSource?: string | Uint8Array | ArrayBuffer | File;
17
17
  protected isPartiallyLoaded: boolean;
18
18
  protected readonly partialLoadOptions?: OpenOptions;
19
+ /** Text-property wire keys in the partial header at load; undefined if full. */
20
+ protected readonly partialKeysAtLoad?: ReadonlySet<string>;
19
21
  constructor(module: TagLibModule, fileHandle: FileHandle, sourcePath?: string, originalSource?: string | Uint8Array | ArrayBuffer | File, isPartiallyLoaded?: boolean, partialLoadOptions?: OpenOptions);
22
+ /**
23
+ * Wire-key text properties present in the partial header at load but now
24
+ * absent — the user deleted them. The partial-load reconstruct subtracts these
25
+ * from its preserve-the-original merge so a deletion persists without wiping
26
+ * frames beyond the loaded header (taglib-d14). Lyrics are excluded (they ride
27
+ * their own reconstruct path); empty for a full load.
28
+ */
29
+ protected partialDeletedPropertyKeys(): ReadonlySet<string>;
20
30
  protected get handle(): FileHandle;
21
31
  getFormat(): FileType;
22
32
  isFormat<F extends FileType>(format: F): this is TypedAudioFile<F>;
@@ -1 +1 @@
1
- {"version":3,"file":"audio-file-base.d.ts","sourceRoot":"","sources":["../../../src/taglib/audio-file-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;;;;GAKG;AACH,8BAAsB,iBAAiB;IASnC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY;IARzC,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,SAAS,CAAC,qBAAqB,EAAE,eAAe,GAAG,IAAI,CAAQ;IAC/D,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IACvC,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC;IACpE,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAS;IAC7C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC;gBAG/B,MAAM,EAAE,YAAY,EACvC,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;IASlC,SAAS,KAAK,MAAM,IAAI,UAAU,CAKjC;IAED,SAAS,IAAI,QAAQ;IAIrB,QAAQ,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC;IAIlE,GAAG,IAAI,UAAU;IA4EjB,eAAe,IAAI,eAAe,GAAG,SAAS;IAO9C,UAAU,IAAI,WAAW;IAIzB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI;IAQ5C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK5C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7C,KAAK,IAAI,OAAO;IAIhB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ3C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOhC,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,IAAI;IAQf,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGzB"}
1
+ {"version":3,"file":"audio-file-base.d.ts","sourceRoot":"","sources":["../../../src/taglib/audio-file-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,WAAW,EACX,WAAW,EACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAchE;;;;;GAKG;AACH,8BAAsB,iBAAiB;IAWnC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY;IAVzC,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,SAAS,CAAC,qBAAqB,EAAE,eAAe,GAAG,IAAI,CAAQ;IAC/D,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IACvC,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC;IACpE,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAS;IAC7C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACpD,gFAAgF;IAChF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAGtC,MAAM,EAAE,YAAY,EACvC,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;;;;;;OAMG;IACH,SAAS,CAAC,0BAA0B,IAAI,WAAW,CAAC,MAAM,CAAC;IAU3D,SAAS,KAAK,MAAM,IAAI,UAAU,CAKjC;IAED,SAAS,IAAI,QAAQ;IAIrB,QAAQ,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC;IAIlE,GAAG,IAAI,UAAU;IA4EjB,eAAe,IAAI,eAAe,GAAG,SAAS;IAO9C,UAAU,IAAI,WAAW;IAMzB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI;IAiB5C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK5C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7C,KAAK,IAAI,OAAO;IAIhB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ3C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOhC,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,IAAI;IAQf,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGzB"}