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