Passed
Pull Request — master (#133)
by Jan
01:31
created

ID3FrameHeader.getBuffer   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
1
const ID3Util = require('./ID3Util')
2
const ID3Definitions = require("./ID3Definitions")
3
4
class ID3FrameHeader {
5
    constructor(identifier, frameSize, flags = {}) {
6
        this.identifier = identifier
7
        this.frameSize = frameSize
8
        this.flags = flags
9
    }
10
11
    static createFromBuffer(headerBuffer, version) {
12
        const identifierSize = (version === 2) ? 3 : 4
13
        let identifier = headerBuffer.toString('utf8', 0, identifierSize)
14
        const frameSize = this.getFrameSizeFromBuffer(headerBuffer, version)
15
        const flags = this.getFlagsFromBytes(headerBuffer[8], headerBuffer[9], version)
16
17
        // Try to convert identifier for older versions
18
        if(version === 2) {
19
            const alias = ID3Definitions.FRAME_INTERNAL_IDENTIFIERS.v2[identifier]
20
            if(alias) {
21
                identifier = ID3Definitions.FRAME_IDENTIFIERS.v3[alias]
22
            }
23
        }
24
25
        return new ID3FrameHeader(identifier, frameSize, flags)
26
    }
27
28
    getBuffer() {
29
        const buffer = Buffer.alloc(10)
30
        buffer.write(this.identifier, 0)
31
        buffer.writeUInt32BE(this.frameSize, 4)
32
        return buffer
33
    }
34
35
    static getSizeByVersion(version) {
36
        return (version === 2) ? 6 : 10
37
    }
38
39
    static getFrameSizeFromBuffer(headerBuffer, version) {
40
        const isDecoded = version === 4
41
        let bytes
42
        if(version === 2) {
43
            bytes = [headerBuffer[3], headerBuffer[4], headerBuffer[5]]
44
        } else {
45
            bytes = [headerBuffer[4], headerBuffer[5], headerBuffer[6], headerBuffer[7]]
46
        }
47
        if(isDecoded) {
48
            return ID3Util.decodeSize(Buffer.from(bytes))
49
        }
50
51
        return Buffer.from(bytes).readUIntBE(0, bytes.length)
52
    }
53
54
    static getFlagsFromBytes(statusFlag, encodingFlag, version) {
55
        if(version === 2) {
56
            return {}
57
        }
58
59 View Code Duplication
        if(version === 3) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
60
            return {
61
                tagAlterPreservation: !!(statusFlag & 128),
62
                fileAlterPreservation: !!(statusFlag & 64),
63
                readOnly: !!(statusFlag & 32),
64
                compression: !!(encodingFlag & 128),
65
                encryption: !!(encodingFlag & 64),
66
                groupingIdentity: !!(encodingFlag & 32),
67
                dataLengthIndicator: !!(encodingFlag & 128)
68
            }
69
        }
70
71 View Code Duplication
        if(version === 4) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
72
            return {
73
                tagAlterPreservation: !!(statusFlag & 64),
74
                fileAlterPreservation: !!(statusFlag & 32),
75
                readOnly: !!(statusFlag & 16),
76
                groupingIdentity: !!(encodingFlag & 64),
77
                compression: !!(encodingFlag & 8),
78
                encryption: !!(encodingFlag & 4),
79
                unsynchronisation: !!(encodingFlag & 2),
80
                dataLengthIndicator: !!(encodingFlag & 1)
81
            }
82
        }
83
84
        return {}
85
    }
86
}
87
88
module.exports = ID3FrameHeader