UNPKG

@infinito/id3

Version:
75 lines (70 loc) 2.07 kB
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; };