Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 1x 1x 1x 4x 3x 4x 4x 4x 12x 16x 4x | import {
M3uDirectives,
M3uMedia,
M3uPlaylist,
M3uAttributes,
DEFAULT_MEDIA_DURATION
} from "./m3u-playlist";
export class M3uGenerator {
static generate(playlist: M3uPlaylist): string {
const pls = playlist.title ? `${M3uDirectives.PLAYLIST}:${playlist.title}` : undefined;
const medias = playlist.medias.map(item => this.getMedia(item)).join('\n');
return [M3uDirectives.EXTM3U, pls, medias].filter(item => item).join('\n');
}
private static getMedia(media: M3uMedia): string {
const attributesString = this.getAttributes(media.attributes);
const info = this.shouldAddInfoDirective(media, attributesString) ? `${M3uDirectives.EXTINF}:${media.duration} ${attributesString},${media.name}` : null;
const group = media.group ? `${M3uDirectives.EXTGRP}:${media.group}` : null;
return [info, group, media.location].filter(item => item).join('\n');
}
private static getAttributes(attributes: M3uAttributes): string {
return Object.keys(attributes).map(key => `${key}="${attributes[key]}"`).join(' ');
}
private static shouldAddInfoDirective(media: M3uMedia, attributesString: string): boolean {
return media.duration !== DEFAULT_MEDIA_DURATION || attributesString !== '' || media.name !== undefined;
}
}
|