@infinito/id3
Version:
ID3 Tag Reader/Writer
107 lines (77 loc) • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = genID3;
var _textEncoding = require("text-encoding");
var _constants = require("./constants.js");
var _id3tag = _interopRequireDefault(require("./classes/id3tag.js"));
var _id = _interopRequireDefault(require("./gen/id3.2.3.js"));
var _setSyncsafe = _interopRequireDefault(require("./set.syncsafe.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function genID3(tags) {
if (!(tags instanceof _id3tag.default)) {
throw new TypeError("tags not of type id3Tag");
}
var header = new Uint8Array(_constants.constants.ID3_HEADER_LENGTH_BYTES);
for (var i = 0; i < _constants.constants.ID3_HEADER_IDENTIFIER_LENGTH_BYTES; i++) {
header[i] = _constants.constants.ID3_HEADER_IDENTIFIER[i];
}
var pos = _constants.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 = (0, _id.default)(tags);
var len = _constants.constants.ID3_HEADER_LENGTH_BYTES;
for (var i in frames) {
len += frames[i].byteLength;
}
(0, _setSyncsafe.default)(header, pos, len - _constants.constants.ID3_HEADER_LENGTH_BYTES, _constants.constants.ID3V2_3_FRAME_SIZE_BYTES);
pos += _constants.constants.ID3V2_3_FRAME_SIZE_BYTES;
var buf = new Uint8Array(len);
for (var i = 0; i < _constants.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 _textEncoding.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;
}
;