export function getFromFlacBuffer(buffer: ArrayBuffer): Record { const dataView = new DataView(buffer); // Verify the FLAC signature const signature = String.fromCharCode(...new Uint8Array(buffer, 0, 4)); if (signature !== "fLaC") { console.error("Not a valid FLAC file"); return; } // Parse metadata blocks let offset = 4; let vorbisComment = null; while (offset < dataView.byteLength) { const isLastBlock = dataView.getUint8(offset) & 0x80; const blockType = dataView.getUint8(offset) & 0x7f; const blockSize = dataView.getUint32(offset, false) & 0xffffff; offset += 4; if (blockType === 4) { // Vorbis Comment block type vorbisComment = parseVorbisComment( new DataView(buffer, offset, blockSize) ); } offset += blockSize; if (isLastBlock) break; } return vorbisComment; } export function getFromFlacFile(file: File): Promise> { return new Promise((r) => { const reader = new FileReader(); reader.onload = function (event) { const arrayBuffer = event.target.result as ArrayBuffer; r(getFromFlacBuffer(arrayBuffer)); }; reader.readAsArrayBuffer(file); }); } // Function to parse the Vorbis Comment block function parseVorbisComment(dataView: DataView): Record { let offset = 0; const vendorLength = dataView.getUint32(offset, true); offset += 4; const vendorString = getString(dataView, offset, vendorLength); offset += vendorLength; const userCommentListLength = dataView.getUint32(offset, true); offset += 4; const comments = {}; for (let i = 0; i < userCommentListLength; i++) { const commentLength = dataView.getUint32(offset, true); offset += 4; const comment = getString(dataView, offset, commentLength); offset += commentLength; const [key, value] = comment.split("="); comments[key] = value; } return comments; } function getString(dataView: DataView, offset: number, length: number): string { let string = ""; for (let i = 0; i < length; i++) { string += String.fromCharCode(dataView.getUint8(offset + i)); } return string; }