@infinito/id3
Version:
ID3 Tag Reader/Writer
75 lines (70 loc) • 2.07 kB
JavaScript
import {TextEncoder} from 'text-encoding';
import {constants} from './constants.js';
import id3Tag from './classes/id3tag.js';
import genID3v2_3 from './gen/id3.2.3.js';
import setSyncSafe from './set.syncsafe.js';
export default function genID3(tags) {
if(!(tags instanceof id3Tag)) {
throw new TypeError("tags not of type id3Tag");
}
var header = new Uint8Array(constants.ID3_HEADER_LENGTH_BYTES);
for(var i=0;i<constants.ID3_HEADER_IDENTIFIER_LENGTH_BYTES;i++) {
header[i] = constants.ID3_HEADER_IDENTIFIER[i];
}
var pos = constants.ID3_HEADER_IDENTIFIER_LENGTH_BYTES;
header[pos] = tags.ver;
pos++;
header[pos] = tags.subVer;
pos++;
header[pos] = tags.flags;
pos++;
switch(tags.ver) {
case 4:
throw new Error("id3v2.4."+subver+" not supported");
break;
case 3:
var frames = genID3v2_3(tags);
var len = constants.ID3_HEADER_LENGTH_BYTES;
for(var i in frames) {
len += frames[i].byteLength;
}
setSyncSafe(header,pos,len-constants.ID3_HEADER_LENGTH_BYTES,constants.ID3V2_3_FRAME_SIZE_BYTES);
pos += constants.ID3V2_3_FRAME_SIZE_BYTES;
var buf = new Uint8Array(len);
for(var i=0;i<constants.ID3_HEADER_LENGTH_BYTES;i++) {
buf[i] = header[i];
}
for(var i in frames) {
len = frames[i].byteLength;
for(var j=0;j<len;j++) {
buf[pos+j] = frames[i][j];
}
pos += len;
}
return buf;
default:
throw new Error("id3v"+tags.ver+"."+tags.subver+" not supported");
return;
}
var path = new TextEncoder().encode(tags.path);
var sz = path.byteLength;
if(sz>0xffff) {
console.error(tags);
throw new Error("Path is too long");
return;
}
var pathbuf = new Uint8Array(2+sz);
pathbuf[0] = (sz&0xff00)>>16;
pathbuf[1] = sz&0xff;
for(var i=0;i<path.byteLength;i++) {
pathbuf[2+i] = path[i];
}
var res = new Uint8Array(pathbuf.byteLength+buf.byteLength);
for(var i=0;i<pathbuf.byteLength;i++) {
res[i] = pathbuf[i];
}
for(var j=0;j<buf.byteLength;j++) {
res[i+j] = buf[j];
}
return res;
};