UNPKG

taglib-wasm

Version:

TagLib-Wasm is the universal tagging library for TypeScript/JavaScript platforms: Browsers, Node.js, Deno, Bun, Cloudflare Workers, and Electron apps

44 lines (43 loc) 1.78 kB
import { FileOperationError, InvalidFormatError } from "../errors.js"; import { readFileData } from "../utils/file.js"; import { writeFileData } from "../utils/write.js"; import { wrapEmbindHandle } from "./embind-adapter.js"; import { copyExtraState } from "./extra-state-registry.js"; import { mp4FreeformAtomNames } from "../constants/properties.js"; import { MP4_ITEM_NAMES_KEY } from "./mp4-item-names.js"; function copyEditedState(target, source, sourceComplete, deletedKeys) { target.setTagData(source.getTagData()); const merged = sourceComplete ? source.getProperties() : { ...target.getProperties(), ...source.getProperties() }; for (const key of deletedKeys) delete merged[key]; const atomNames = mp4FreeformAtomNames(Object.keys(merged)); if (atomNames.length > 0) merged[MP4_ITEM_NAMES_KEY] = atomNames; target.setProperties(merged); copyExtraState(target, source, sourceComplete); } async function saveViaFreshHandle(module, editing, source, targetPath, sourceComplete, deletedKeys = /* @__PURE__ */ new Set()) { const rawFullHandle = module.createFileHandle(); const fullFileHandle = module.isWasi ? rawFullHandle : wrapEmbindHandle(rawFullHandle); try { { const data = await readFileData(source); if (!fullFileHandle.loadFromBuffer(data)) { throw new InvalidFormatError( "Failed to load full audio file for saving" ); } } copyEditedState(fullFileHandle, editing, sourceComplete, deletedKeys); if (!fullFileHandle.save()) { throw new FileOperationError( "save", "Failed to save changes to full file" ); } await writeFileData(targetPath, fullFileHandle.getBuffer()); } finally { fullFileHandle.destroy(); } } export { saveViaFreshHandle };