UNPKG

@infinito/id3

Version:
61 lines (57 loc) 1.63 kB
import {constants} from '../constants.js'; import id3Tag from '../classes/id3tag.js'; import id3v2_3Frame from '../classes/id3.2.3.frame.js'; export default function getID3v2_3(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 } const {FRAME_ID_SIZE_BYTES,FRAME_SIZE_BYTES,FRAME_HEADER_SIZE_BYTES} = new id3v2_3Frame('default'); var tags = new id3Tag(path); while(pos<size) { try { var frame = new id3v2_3Frame(buf,pos); } catch(error) { let skip = 0; let tempbuf = new Uint8Array(buf,pos+FRAME_ID_SIZE_BYTES,FRAME_SIZE_BYTES); for(let i=0;i<FRAME_SIZE_BYTES;i++) { skip<<=8; skip += tempbuf[i]; } 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; }