m3u8parse
Version:
Structural parsing of Apple HTTP Live Streaming .m3u8 format
69 lines (68 loc) • 2.21 kB
JavaScript
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;
}
}