1 | module.exports = ID3FrameBuilder
|
2 |
|
3 | const ID3Util = require('./ID3Util')
|
4 |
|
5 | function ID3FrameBuilder(identifier) {
|
6 | this._identifier = identifier
|
7 | this._buffer = Buffer.alloc(0)
|
8 | }
|
9 |
|
10 | ID3FrameBuilder.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 |
|
16 | ID3FrameBuilder.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 |
|
27 | ID3FrameBuilder.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 |
|
33 | ID3FrameBuilder.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 |
|
43 | function 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 |
|
55 | function 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 |
|
64 | function nullTerminatedValueToBuffer(buffer, encoding) {
|
65 | return Buffer.concat([buffer, ID3Util.terminationBuffer(encoding)])
|
66 | }
|