Zazama /
node-id3
| 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
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
|
|||
| 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 | } |