src/lib/id3v2/id3v2.builder.ts

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
import {IID3V2} from './id3v2.types';
import {ID3V2FramesCollect} from './id3v2.builder.collect';

export class ID3V2RawBuilder extends ID3V2FramesCollect {

    audioEncryption(key: string, id: string, previewStart: number, previewLength: number, bin: Buffer) {
        this.addFrame<IID3V2.FrameValue.AudioEncryption>(key, {id, previewStart, previewLength, bin});
    }

    bool(key: string, bool: boolean) {
        if (bool !== undefined) {
            this.replaceFrame<IID3V2.FrameValue.Bool>(key, {bool});
        }
    }

    chapter(key: string, chapterID: string, start: number, end: number, offset: number, offsetEnd: number, subframes?: Array<IID3V2.Frame>) {
        const frame: IID3V2.Frames.ChapterFrame = {
            id: key,
            value: {id: chapterID, start, end, offset, offsetEnd},
            subframes,
            head: this.head()
        };
        this.add(key, frame);
    }

    chapterTOC(key: string, id: string, ordered: boolean, topLevel: boolean, children: Array<string>) {
        this.addFrame<IID3V2.FrameValue.ChapterToc>(key, {id, ordered, topLevel, children});
    }

    eventTimingCodes(key: string, timeStampFormat: number, events: Array<{ type: number; timestamp: number }>) {
        this.addFrame<IID3V2.FrameValue.EventTimingCodes>(key, {format: timeStampFormat, events});
    }

    idBin(key: string, id: string, binary: Buffer) {
        this.addFrame<IID3V2.FrameValue.IdBin>(key, {id, bin: binary});
    }

    idLangText(key: string, value: string | undefined, lang: string | undefined, id: string | undefined) {
        if (value) {
            this.addIDFrame<IID3V2.FrameValue.LangDescText>(key, {id: id || '', language: lang || '', text: value});
        }
    }

    idText(key: string, id: string, value: string | undefined) {
        if (value) {
            this.addIDFrame<IID3V2.FrameValue.IdText>(key, {id: id || '', text: value});
        }
    }

    keyTextList(key: string, group: string, value?: string) {
        if (value) {
            const frames = <Array<IID3V2.Frames.TextListFrame>>(this.frameValues[key] || []);
            const frame: IID3V2.Frames.TextListFrame = (frames.length > 0) ? frames[0] : {id: key, value: {list: []}, head: this.head()};
            frame.value.list.push(group);
            frame.value.list.push(value);
            this.replace(key, frame);
        }
    }

    langText(key: string, language: string, text: string) {
        this.addFrame<IID3V2.FrameValue.LangText>(key, {language, text});
    }

    linkedInformation(key: string, id: string, url: string, additional: Array<string>) {
        this.addFrame<IID3V2.FrameValue.LinkedInfo>(key, {id, url, additional});
    }

    nrAndTotal(key: string, value: number | string | undefined, total: number | string | undefined) {
        if (value) {
            const text = value.toString() + (total ? '/' + total.toString() : '');
            this.replaceFrame<IID3V2.FrameValue.Text>(key, {text});
        }
    }

    number(key: string, num: number | undefined) {
        if (num !== undefined) {
            this.replaceFrame<IID3V2.FrameValue.Number>(key, {num});
        }
    }

    object(key: string, filename: string, mimeType: string, contentDescription: string, bin: Buffer) {
        this.addFrame<IID3V2.FrameValue.GEOB>(key, {filename, mimeType, contentDescription, bin});
    }

    picture(key: string, pictureType: number, description: string, mimeType: string, binary: Buffer) {
        this.addFrame<IID3V2.FrameValue.Pic>(key, {description: description || '', pictureType, bin: binary, mimeType: mimeType});
    }

    popularimeter(key: string, email: string, rating: number, count: number) {
        this.addFrame<IID3V2.FrameValue.Popularimeter>(key, {email, rating, count});
    }

    relativeVolumeAdjustment(
        key: string, right: number, left: number, peakRight?: number, peakLeft?: number, rightBack?: number, leftBack?: number, peakRightBack?: number, peakLeftBack?: number,
        center?: number, peakCenter?: number, bass?: number, peakBass?: number) {
        this.addFrame<IID3V2.FrameValue.RVA>(key, {
            right, left, peakRight, peakLeft,
            rightBack, leftBack, peakRightBack, peakLeftBack,
            center, peakCenter, bass, peakBass
        });
    }

    relativeVolumeAdjustment2(key: string, id: string, channels: Array<{ type: number; adjustment: number; peak?: number }>) {
        this.addFrame<IID3V2.FrameValue.RVA2>(key, {id, channels});
    }

    replayGainAdjustment(key: string, peak: number, radioAdjustment: number, audiophileAdjustment: number) {
        this.addFrame<IID3V2.FrameValue.ReplayGainAdjustment>(key, {peak, radioAdjustment, audiophileAdjustment});
    }

    synchronisedLyrics(key: string, id: string, language: string, timestampFormat: number, contentType: number, events: Array<{ timestamp: number; text: string }>) {
        this.addFrame<IID3V2.FrameValue.SynchronisedLyrics>(key, {id, language, timestampFormat, contentType, events});
    }

    text(key: string, text: string | undefined) {
        if (text) {
            this.replaceFrame<IID3V2.FrameValue.Text>(key, {text});
        }
    }

    unknown(key: string, binary: Buffer) {
        this.addFrame<IID3V2.FrameValue.Bin>(key, {bin: binary});
    }

}