UNPKG

m3u8parse

Version:

Structural parsing of Apple HTTP Live Streaming .m3u8 format

69 lines (68 loc) 2.21 kB
import { AttrList } from './attrlist.js'; import { cloneAttrArray, isStringish, rewriteAttr, rewriteAttrs } from './playlist-base.js'; export class MediaSegment { constructor(uri, meta, version) { if (URL && uri instanceof URL) { uri = uri.href; } if (uri && typeof uri === 'object') { meta = uri; uri = meta.uri; version = 10000; } meta = meta || {}; this.duration = meta.duration; this.title = meta.title; this.uri = uri; this.discontinuity = !!meta.discontinuity; // optional if (meta.program_time) { this.program_time = new Date(meta.program_time); } if (meta.keys) { this.keys = cloneAttrArray(meta.keys); } if (version >= 4 && meta.byterange) { this.byterange = { ...meta.byterange }; } if (version >= 5 && meta.map) { this.map = new AttrList(meta.map); } if (meta.bitrate) { this.bitrate = meta.bitrate; } if (meta.gap) { this.gap = true; // V8 - ignoreable } if (meta.parts) { this.parts = cloneAttrArray(meta.parts); } // custom vendor extensions if (meta.vendor) { if (typeof meta.vendor[Symbol.iterator] !== 'function') { // Convert from old style serialized format this.vendor = Object.entries(meta.vendor); } else { const set = this.vendor = []; for (const [ext, value] of meta.vendor) { set.push([ext, value]); } } } } isPartial() { const full = (this.uri || this.uri === '') && this.duration >= 0; return !full; } rewriteUris(mapFn) { rewriteAttrs(mapFn, this.keys, 'segment-key'); rewriteAttr(mapFn, this.map, 'segment-map'); rewriteAttrs(mapFn, this.parts, 'segment-part'); const newUri = mapFn(this.uri, 'segment', this); if (isStringish(newUri)) { this.uri = newUri; } return this; } }