UNPKG

@infinito/id3

Version:
64 lines (59 loc) 1.75 kB
import {constants} from '../constants.js'; import id3Tag from '../classes/id3tag.js'; import id3v2_4Frame from '../classes/id3.2.4.frame.js'; import getSyncSafe from '../get.syncsafe.js'; export default function getID3v2_4(path,buf,subver,flags,size) { if(!(buf instanceof ArrayBuffer)) { throw new TypeError('parameter buf must be an instance of an ArrayBuffer'); } var pos = constants.ID3_HEADER_LENGTH_BYTES; /* Check flags */ if(flags&0x80>0) {//Unsynchronization Flag } if(flags&0x40>0) {//Extended Header Flag console.error(path); console.log(flags); console.log(flags&0x80); throw new Error("Extended header flag not implemented"); return false; } if(flags&0x20>0) {//Experimental Flag set } if(flags&0x10>0) {//Footer present console.error(path); console.log(flags); throw new Error("Footer present flag not implemented"); return false; } const {FRAME_ID_SIZE_BYTES,FRAME_SIZE_BYTES,FRAME_HEADER_SIZE_BYTES} = new id3v2_4Frame('default'); var tags = new id3Tag(path); while(pos<size) { try { var frame = new id3v2_4Frame(buf,pos); } catch(error) { let skip = getSyncSafe(new Uint8Array(buf,pos+FRAME_ID_SIZE_BYTES,FRAME_SIZE_BYTES)); if(skip==0) {//Check for padding let tempbuf = new Uint8Array(buf,pos,(size-pos)); for(let i=0;i<tempbuf.length;i++) { if(tempbuf[i]!=0) { throw new Error(error); return false; } } pos = size; break; } else { pos += skip+FRAME_HEADER_SIZE_BYTES; continue; } } pos += frame.size+FRAME_HEADER_SIZE_BYTES; try { frame.add_to_ID3(tags); } catch(error) { throw new Error(error); return false; } } return tags; }