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
JavaScript
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
};