src/frames/frame-chap.ts   A
last analyzed

Complexity

Total Complexity 4
Complexity/F 0

Size

Lines of Code 49
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 4
eloc 38
mnd 4
bc 4
fnc 0
dl 0
loc 49
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import { FrameBuilder } from "../FrameBuilder"
2
import { FrameReader } from "../FrameReader"
3
import { getTags } from '../frames-reader'
4
import { buildFramesBuffer } from "../frames-builder"
5
import type { Chapter } from "../types/TagFrames"
6
import type { Tags, WriteTags } from "../types/Tags"
7
8
export const CHAP = {
9
    create: (chap: Chapter<WriteTags>): Buffer => {
10
        if (chap.elementID == undefined
11
            || chap.startTimeMs == undefined
12
            || chap.endTimeMs == undefined
13
        ) {
14
            throw new TypeError(
15
                "elementID, startTimeMs, endTimeMs must all be provided"
16
            )
17
        }
18
        const getOffset = (offset?: number) => offset ?? 0xFFFFFFFF
19
        return new FrameBuilder("CHAP")
20
            .appendTerminatedText(chap.elementID)
21
            .appendNumber(chap.startTimeMs, {size: 4})
22
            .appendNumber(chap.endTimeMs, {size: 4})
23
            .appendNumber(getOffset(chap.startOffsetBytes), {size: 4})
24
            .appendNumber(getOffset(chap.endOffsetBytes), {size: 4})
25
            .appendBuffer(buildFramesBuffer(chap.tags))
26
            .getBufferWithPartialHeader()
27
    },
28
    read: (buffer: Buffer, version: number): Chapter<Tags> => {
29
        const reader = new FrameReader(buffer)
30
31
        // Returns a spreadable object to insert an optional offset property
32
        // when the consumed offset is valid.
33
        const consumeOffset= <Key extends keyof Chapter<never>>(key: Key) => {
34
            const offset = reader.consumeNumber({size: 4})
35
            return offset === 0xFFFFFFFF ? {} : {[key]: offset}
36
        }
37
        return {
38
            elementID: reader.consumeTerminatedText(),
39
            startTimeMs: reader.consumeNumber({size: 4}),
40
            endTimeMs: reader.consumeNumber({size: 4}),
41
            ...consumeOffset("startOffsetBytes"),
42
            ...consumeOffset("endOffsetBytes"),
43
            tags: getTags(
44
                { buffer: reader.consumePossiblyEmptyBuffer(), version }
45
            ) as Tags
46
        }
47
    }
48
}
49