m3u-parser-generator
Version:
Library to parse and generate m3u or m3u8 IPTV playlist files
92 lines (91 loc) • 4.54 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.M3uGenerator = void 0;
const m3u_playlist_1 = require("./m3u-playlist");
/**
* M3u generator class to generate m3u playlist string from playlist object
*/
class M3uGenerator {
/**
* Generate is static method to generate m3u playlist string from playlist object
* @param playlist - playlist object to generate m3u playlist string
* @returns final m3u playlist string
* @example
* ```ts
* const playlist = new M3uPlaylist();
* playlist.title = 'Test playlist';
* M3uGenerator.generate(playlist);
* ```
*/
static generate(playlist) {
const pls = playlist.title ? `${m3u_playlist_1.M3uDirectives.PLAYLIST}:${playlist.title}` : undefined;
const customData = this.getCustomDataDirective(playlist.customData);
const medias = playlist.medias.map(item => this.getMedia(item)).join('\n');
const attributesString = this.getAttributes(playlist.attributes);
return [m3u_playlist_1.M3uDirectives.EXTM3U + attributesString, pls, customData, medias].filter(item => item).join('\n');
}
/**
* Get generated media part string from m3u playlist media object
* @param media - media object
* @returns media part string with info, group and location each on separated line
* @private
*/
static getMedia(media) {
const attributesString = this.getAttributes(media.attributes);
const info = this.shouldAddInfoDirective(media, attributesString) ? `${m3u_playlist_1.M3uDirectives.EXTINF}:${media.duration}${attributesString},${media.name}` : null;
const group = media.group ? `${m3u_playlist_1.M3uDirectives.EXTGRP}:${media.group}` : null;
const bytes = media.bytes ? `${m3u_playlist_1.M3uDirectives.EXTBYT}:${media.bytes}` : null;
const image = media.image ? `${m3u_playlist_1.M3uDirectives.EXTIMG}:${media.image}` : null;
const album = media.album ? `${m3u_playlist_1.M3uDirectives.EXTALB}:${media.album}` : null;
const artist = media.artist ? `${m3u_playlist_1.M3uDirectives.EXTART}:${media.artist}` : null;
const genre = media.genre ? `${m3u_playlist_1.M3uDirectives.EXTGENRE}:${media.genre}` : null;
const extraAttributesFromUrl = media.extraAttributesFromUrl ? `${m3u_playlist_1.M3uDirectives.EXTATTRFROMURL}:${media.extraAttributesFromUrl}` : null;
const extraHttpHeaders = media.extraHttpHeaders ? `${m3u_playlist_1.M3uDirectives.EXTHTTP}:${JSON.stringify(media.extraHttpHeaders)}` : null;
const kodiProps = media.kodiProps ? [...media.kodiProps].map(([key, value]) => `${m3u_playlist_1.M3uDirectives.KODIPROP}:${key}=${value}`).join('\n') : null;
const customData = this.getCustomDataDirective(media.customData);
return [
info,
group,
bytes,
image,
album,
artist,
genre,
extraAttributesFromUrl,
extraHttpHeaders,
kodiProps,
customData,
media.location
].filter(item => item).join('\n');
}
/**
* Get generated string of custom directives for both, playlist and media
* @param customData - custom data object, that represents unknown directives
* @private
*/
static getCustomDataDirective(customData) {
return customData.map(data => `${data.directive}:${data.value}`).join('\n');
}
/**
* Get generated attributes media part string from m3u attributes object
* @param attributes - attributes object
* @returns attributes generated string (attributeName="attributeValue" ...)
* @private
*/
static getAttributes(attributes) {
const keys = Object.keys(attributes);
return keys.length ? ' ' + keys.map(key => `${key}="${attributes[key]}"`).join(' ') : '';
}
/**
* Method to determine if we need to add info directive or not based on media object and attributes string.
* At least media duration, media name or some attributes must be present to return true
* @param media - m3u media object
* @param attributesString - m3u attributes string
* @returns boolean if we should add info directive into final media
* @private
*/
static shouldAddInfoDirective(media, attributesString) {
return media.duration !== m3u_playlist_1.DEFAULT_MEDIA_DURATION || attributesString !== '' || media.name !== undefined;
}
}
exports.M3uGenerator = M3uGenerator;
;