Completed
Push — master ( 00d23f...d25395 )
by Jan
15s queued 12s
created

src/ID3FrameHeader.js   A

Complexity

Total Complexity 16
Complexity/F 2.29

Size

Lines of Code 97
Function Count 7

Duplication

Duplicated Lines 23
Ratio 23.71 %

Importance

Changes 0
Metric Value
wmc 16
eloc 63
mnd 9
bc 9
fnc 7
dl 23
loc 97
rs 10
bpm 1.2857
cpm 2.2857
noi 0
c 0
b 0
f 0

7 Functions

Rating   Name   Duplication   Size   Complexity  
A ID3FrameHeader.constructor 0 5 1
A ID3FrameHeader.js ➔ getBodySize 0 14 3
A ID3FrameHeader.js ➔ getHeaderSize 0 3 2
A ID3FrameHeader.js ➔ getFrameSize 0 3 1
A ID3FrameHeader.js ➔ extractFlags 23 32 4
A ID3FrameHeader.js ➔ createFromBuffer 0 16 4
A ID3FrameHeader.getBuffer 0 6 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

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