jsmediatags
Version:
Media Tags Reader (ID3, MP4)
131 lines (104 loc) • 4.27 kB
JavaScript
;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var InternalDecodedString = /*#__PURE__*/function () {
function InternalDecodedString(value, bytesReadCount) {
_classCallCheck(this, InternalDecodedString);
_defineProperty(this, "_value", void 0);
_defineProperty(this, "bytesReadCount", void 0);
_defineProperty(this, "length", void 0);
this._value = value;
this.bytesReadCount = bytesReadCount;
this.length = value.length;
}
_createClass(InternalDecodedString, [{
key: "toString",
value: function toString() {
return this._value;
}
}]);
return InternalDecodedString;
}();
var StringUtils = {
readUTF16String: function readUTF16String(bytes, bigEndian, maxBytes) {
var ix = 0;
var offset1 = 1,
offset2 = 0;
maxBytes = Math.min(maxBytes || bytes.length, bytes.length);
if (bytes[0] == 0xFE && bytes[1] == 0xFF) {
bigEndian = true;
ix = 2;
} else if (bytes[0] == 0xFF && bytes[1] == 0xFE) {
bigEndian = false;
ix = 2;
}
if (bigEndian) {
offset1 = 0;
offset2 = 1;
}
var arr = [];
for (var j = 0; ix < maxBytes; j++) {
var byte1 = bytes[ix + offset1];
var byte2 = bytes[ix + offset2];
var word1 = (byte1 << 8) + byte2;
ix += 2;
if (word1 == 0x0000) {
break;
} else if (byte1 < 0xD8 || byte1 >= 0xE0) {
arr[j] = String.fromCharCode(word1);
} else {
var byte3 = bytes[ix + offset1];
var byte4 = bytes[ix + offset2];
var word2 = (byte3 << 8) + byte4;
ix += 2;
arr[j] = String.fromCharCode(word1, word2);
}
}
return new InternalDecodedString(arr.join(""), ix);
},
readUTF8String: function readUTF8String(bytes, maxBytes) {
var ix = 0;
maxBytes = Math.min(maxBytes || bytes.length, bytes.length);
if (bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
ix = 3;
}
var arr = [];
for (var j = 0; ix < maxBytes; j++) {
var byte1 = bytes[ix++];
if (byte1 == 0x00) {
break;
} else if (byte1 < 0x80) {
arr[j] = String.fromCharCode(byte1);
} else if (byte1 >= 0xC2 && byte1 < 0xE0) {
var byte2 = bytes[ix++];
arr[j] = String.fromCharCode(((byte1 & 0x1F) << 6) + (byte2 & 0x3F));
} else if (byte1 >= 0xE0 && byte1 < 0xF0) {
var byte2 = bytes[ix++];
var byte3 = bytes[ix++];
arr[j] = String.fromCharCode(((byte1 & 0xFF) << 12) + ((byte2 & 0x3F) << 6) + (byte3 & 0x3F));
} else if (byte1 >= 0xF0 && byte1 < 0xF5) {
var byte2 = bytes[ix++];
var byte3 = bytes[ix++];
var byte4 = bytes[ix++];
var codepoint = ((byte1 & 0x07) << 18) + ((byte2 & 0x3F) << 12) + ((byte3 & 0x3F) << 6) + (byte4 & 0x3F) - 0x10000;
arr[j] = String.fromCharCode((codepoint >> 10) + 0xD800, (codepoint & 0x3FF) + 0xDC00);
}
}
return new InternalDecodedString(arr.join(""), ix);
},
readNullTerminatedString: function readNullTerminatedString(bytes, maxBytes) {
var arr = [];
maxBytes = maxBytes || bytes.length;
for (var i = 0; i < maxBytes;) {
var byte1 = bytes[i++];
if (byte1 == 0x00) {
break;
}
arr[i - 1] = String.fromCharCode(byte1);
}
return new InternalDecodedString(arr.join(""), i);
}
};
module.exports = StringUtils;