taglib-wasm
Version:
TagLib-Wasm is the universal tagging library for TypeScript/JavaScript platforms: Browsers, Node.js, Deno, Bun, Cloudflare Workers, and Electron apps
52 lines (51 loc) • 1.91 kB
JavaScript
import {
getFileSize,
readFileData,
readPartialFileData
} from "../utils/file.js";
import {
metadataFitsInHeader,
trailerFitsInFooter
} from "./metadata-extent.js";
async function loadAudioData(input, opts) {
if (opts.partial && typeof File !== "undefined" && input instanceof File) {
const headerSize = Math.min(opts.maxHeaderSize, input.size);
const footerSize = Math.min(opts.maxFooterSize, input.size);
if (input.size <= headerSize + footerSize) {
return { data: await readFileData(input), isPartiallyLoaded: false };
}
const header = new Uint8Array(
await input.slice(0, headerSize).arrayBuffer()
);
if (!metadataFitsInHeader(header, headerSize)) {
return { data: await readFileData(input), isPartiallyLoaded: false };
}
const footerStart = Math.max(0, input.size - footerSize);
const footer = new Uint8Array(await input.slice(footerStart).arrayBuffer());
if (!trailerFitsInFooter(footer, footerSize)) {
return { data: await readFileData(input), isPartiallyLoaded: false };
}
const combined = new Uint8Array(header.byteLength + footer.byteLength);
combined.set(header, 0);
combined.set(footer, header.byteLength);
return { data: combined, isPartiallyLoaded: true };
}
if (opts.partial && typeof input === "string") {
const fileSize = await getFileSize(input);
if (fileSize > opts.maxHeaderSize + opts.maxFooterSize) {
const data = await readPartialFileData(
input,
opts.maxHeaderSize,
opts.maxFooterSize
);
if (metadataFitsInHeader(data, opts.maxHeaderSize) && trailerFitsInFooter(data, opts.maxFooterSize)) {
return { data, isPartiallyLoaded: true };
}
}
return { data: await readFileData(input), isPartiallyLoaded: false };
}
return { data: await readFileData(input), isPartiallyLoaded: false };
}
export {
loadAudioData
};