UNPKG

2.19 kBJavaScriptView Raw
1module.exports = ID3FrameBuilder
2
3const ID3Util = require('./ID3Util')
4
5function ID3FrameBuilder(identifier) {
6 this._identifier = identifier
7 this._buffer = Buffer.alloc(0)
8}
9
10ID3FrameBuilder.prototype.appendStaticValue = function(value, size, encoding = 0x00) {
11 const convertedValue = convertValue(value, encoding)
12 this._buffer = Buffer.concat([this._buffer, staticValueToBuffer(convertedValue, size)])
13 return this
14}
15
16ID3FrameBuilder.prototype.appendStaticNumber = function(value, size) {
17 if(Number.isInteger(value)) {
18 let hexValue = value.toString(16)
19 if(hexValue.length % 2 !== 0) {
20 hexValue = "0" + hexValue
21 }
22 this._buffer = Buffer.concat([this._buffer, staticValueToBuffer(Buffer.from(hexValue, 'hex'), size)])
23 }
24 return this
25}
26
27ID3FrameBuilder.prototype.appendNullTerminatedValue = function(value, encoding = 0x00) {
28 const convertedValue = convertValue(value, encoding)
29 this._buffer = Buffer.concat([this._buffer, nullTerminatedValueToBuffer(convertedValue, encoding)])
30 return this
31}
32
33ID3FrameBuilder.prototype.getBuffer = function() {
34 const header = Buffer.alloc(10)
35 header.write(this._identifier, 0)
36 header.writeUInt32BE(this._buffer.length, 4)
37 return Buffer.concat([
38 header,
39 this._buffer
40 ])
41}
42
43function convertValue(value, encoding = 0x00) {
44 if (value instanceof Buffer) {
45 return value
46 } else if(Number.isInteger(value)) {
47 return ID3Util.stringToEncodedBuffer(value.toString(), encoding)
48 } else if (typeof value === 'string' || value instanceof String) {
49 return ID3Util.stringToEncodedBuffer(value, encoding)
50 } else {
51 return Buffer.alloc(0)
52 }
53}
54
55function staticValueToBuffer(buffer, size) {
56 if(!(buffer instanceof Buffer)) return Buffer.alloc(0)
57 if(size && buffer.length < size) {
58 return Buffer.concat([Buffer.alloc(size - buffer.length, 0x00), buffer])
59 } else {
60 return buffer
61 }
62}
63
64function nullTerminatedValueToBuffer(buffer, encoding) {
65 return Buffer.concat([buffer, ID3Util.terminationBuffer(encoding)])
66}