@infinito/id3
Version:
ID3 Tag Reader/Writer
61 lines (57 loc) • 1.63 kB
JavaScript
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;
}