mirror of
https://git.fuwafuwa.moe/SMLoadrDev/SMLoadr
synced 2024-11-16 21:24:31 +01:00
109 lines
2.7 KiB
JavaScript
109 lines
2.7 KiB
JavaScript
|
var util = require("util");
|
||
|
var MetaDataBlock = require("./MetaDataBlock");
|
||
|
|
||
|
var MetaDataBlockVorbisComment = module.exports = function(isLast) {
|
||
|
MetaDataBlock.call(this, isLast, 4);
|
||
|
|
||
|
this.vendor = "";
|
||
|
this.comments = [];
|
||
|
}
|
||
|
|
||
|
util.inherits(MetaDataBlockVorbisComment, MetaDataBlock);
|
||
|
|
||
|
MetaDataBlockVorbisComment.create = function(isLast, vendor, comments) {
|
||
|
var mdb = new MetaDataBlockVorbisComment(isLast);
|
||
|
mdb.vendor = vendor;
|
||
|
mdb.comments = comments;
|
||
|
mdb.hasData = true;
|
||
|
return mdb;
|
||
|
}
|
||
|
|
||
|
MetaDataBlockVorbisComment.prototype.parse = function(buffer) {
|
||
|
try {
|
||
|
|
||
|
var pos = 0;
|
||
|
|
||
|
var vendorLen = buffer.readUInt32LE(pos);
|
||
|
var vendor = buffer.toString("utf8", pos + 4, pos + 4 + vendorLen);
|
||
|
this.vendor = vendor;
|
||
|
pos += 4 + vendorLen;
|
||
|
|
||
|
var commentCount = buffer.readUInt32LE(pos);
|
||
|
pos += 4;
|
||
|
|
||
|
while (commentCount-- > 0) {
|
||
|
var commentLen = buffer.readUInt32LE(pos);
|
||
|
var comment = buffer.toString("utf8", pos + 4, pos + 4 + commentLen);
|
||
|
this.comments.push(comment);
|
||
|
pos += 4 + commentLen;
|
||
|
}
|
||
|
|
||
|
this.hasData = true;
|
||
|
|
||
|
}
|
||
|
catch (e) {
|
||
|
this.error = e;
|
||
|
this.hasData = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MetaDataBlockVorbisComment.prototype.publish = function() {
|
||
|
var pos = 0;
|
||
|
var size = this.getSize();
|
||
|
var buffer = new Buffer(4 + size);
|
||
|
|
||
|
var header = size;
|
||
|
header |= (this.type << 24);
|
||
|
header |= (this.isLast ? 0x80000000 : 0);
|
||
|
buffer.writeUInt32BE(header >>> 0, pos);
|
||
|
pos += 4;
|
||
|
|
||
|
var vendorLen = Buffer.byteLength(this.vendor);
|
||
|
buffer.writeUInt32LE(vendorLen, pos);
|
||
|
buffer.write(this.vendor, pos + 4);
|
||
|
pos += 4 + vendorLen;
|
||
|
|
||
|
var commentCount = this.comments.length;
|
||
|
buffer.writeUInt32LE(commentCount, pos);
|
||
|
pos += 4;
|
||
|
|
||
|
for (var i = 0; i < commentCount; i++) {
|
||
|
var comment = this.comments[i];
|
||
|
var commentLen = Buffer.byteLength(comment);
|
||
|
buffer.writeUInt32LE(commentLen, pos);
|
||
|
buffer.write(comment, pos + 4);
|
||
|
pos += 4 + commentLen;
|
||
|
}
|
||
|
|
||
|
return buffer;
|
||
|
}
|
||
|
|
||
|
MetaDataBlockVorbisComment.prototype.getSize = function() {
|
||
|
var size = 8 + Buffer.byteLength(this.vendor);
|
||
|
for (var i = 0; i < this.comments.length; i++) {
|
||
|
size += 4 + Buffer.byteLength(this.comments[i]);
|
||
|
}
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
MetaDataBlockVorbisComment.prototype.toString = function() {
|
||
|
var str = "[MetaDataBlockVorbisComment]";
|
||
|
str += " type: " + this.type;
|
||
|
str += ", isLast: " + this.isLast;
|
||
|
if (this.error) {
|
||
|
str += "\n ERROR: " + this.error;
|
||
|
}
|
||
|
if (this.hasData) {
|
||
|
str += "\n vendor: " + this.vendor;
|
||
|
if (this.comments.length) {
|
||
|
str += "\n comments:";
|
||
|
for (var i = 0; i < this.comments.length; i++) {
|
||
|
str += "\n " + this.comments[i].split("=").join(": ");
|
||
|
}
|
||
|
} else {
|
||
|
str += "\n comments: none";
|
||
|
}
|
||
|
}
|
||
|
return str;
|
||
|
}
|