@transmitlive/m3u8-parser 7.1.0-1 → 7.1.0-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/m3u8-parser.cjs.js +20 -29
- package/dist/m3u8-parser.es.js +20 -29
- package/dist/m3u8-parser.js +20 -29
- package/dist/m3u8-parser.min.js +2 -2
- package/package.json +1 -1
- package/src/parse-stream.js +18 -26
- package/test/fixtures/integration/master-fmp4.js +24 -24
- package/test/parse-stream.test.js +16 -6
- package/test/parser.test.js +15 -3
package/dist/m3u8-parser.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @name @transmitlive/m3u8-parser @version 7.1.0-
|
|
1
|
+
/*! @name @transmitlive/m3u8-parser @version 7.1.0-3 @license Apache-2.0 */
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
@@ -90,14 +90,9 @@ const attributeSeparator = function () {
|
|
|
90
90
|
|
|
91
91
|
|
|
92
92
|
const parseAttributes = function (attributes) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (!attributes) {
|
|
96
|
-
return result;
|
|
97
|
-
} // split the string using attributes as the separator
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
// split the string using attributes as the separator
|
|
100
94
|
const attrs = attributes.split(attributeSeparator());
|
|
95
|
+
const result = {};
|
|
101
96
|
let i = attrs.length;
|
|
102
97
|
let attr;
|
|
103
98
|
|
|
@@ -219,7 +214,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
219
214
|
return;
|
|
220
215
|
}
|
|
221
216
|
|
|
222
|
-
match = /^#EXTINF
|
|
217
|
+
match = /^#EXTINF:?([0-9\.]*)?,?(.*)?$/.exec(newLine);
|
|
223
218
|
|
|
224
219
|
if (match) {
|
|
225
220
|
event = {
|
|
@@ -239,7 +234,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
239
234
|
return;
|
|
240
235
|
}
|
|
241
236
|
|
|
242
|
-
match = /^#EXT-X-TARGETDURATION
|
|
237
|
+
match = /^#EXT-X-TARGETDURATION:?([0-9.]*)?/.exec(newLine);
|
|
243
238
|
|
|
244
239
|
if (match) {
|
|
245
240
|
event = {
|
|
@@ -255,7 +250,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
255
250
|
return;
|
|
256
251
|
}
|
|
257
252
|
|
|
258
|
-
match = /^#EXT-X-VERSION
|
|
253
|
+
match = /^#EXT-X-VERSION:?([0-9.]*)?/.exec(newLine);
|
|
259
254
|
|
|
260
255
|
if (match) {
|
|
261
256
|
event = {
|
|
@@ -271,7 +266,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
271
266
|
return;
|
|
272
267
|
}
|
|
273
268
|
|
|
274
|
-
match = /^#EXT-X-MEDIA-SEQUENCE
|
|
269
|
+
match = /^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
|
|
275
270
|
|
|
276
271
|
if (match) {
|
|
277
272
|
event = {
|
|
@@ -287,7 +282,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
287
282
|
return;
|
|
288
283
|
}
|
|
289
284
|
|
|
290
|
-
match = /^#EXT-X-DISCONTINUITY-SEQUENCE
|
|
285
|
+
match = /^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
|
|
291
286
|
|
|
292
287
|
if (match) {
|
|
293
288
|
event = {
|
|
@@ -303,7 +298,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
303
298
|
return;
|
|
304
299
|
}
|
|
305
300
|
|
|
306
|
-
match = /^#EXT-X-PLAYLIST-TYPE
|
|
301
|
+
match = /^#EXT-X-PLAYLIST-TYPE:?(.*)?$/.exec(newLine);
|
|
307
302
|
|
|
308
303
|
if (match) {
|
|
309
304
|
event = {
|
|
@@ -319,7 +314,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
319
314
|
return;
|
|
320
315
|
}
|
|
321
316
|
|
|
322
|
-
match = /^#EXT-X-BYTERANGE
|
|
317
|
+
match = /^#EXT-X-BYTERANGE:?(.*)?$/.exec(newLine);
|
|
323
318
|
|
|
324
319
|
if (match) {
|
|
325
320
|
event = _extends__default["default"](parseByterange(match[1]), {
|
|
@@ -330,7 +325,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
330
325
|
return;
|
|
331
326
|
}
|
|
332
327
|
|
|
333
|
-
match = /^#EXT-X-ALLOW-CACHE
|
|
328
|
+
match = /^#EXT-X-ALLOW-CACHE:?(YES|NO)?/.exec(newLine);
|
|
334
329
|
|
|
335
330
|
if (match) {
|
|
336
331
|
event = {
|
|
@@ -346,7 +341,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
346
341
|
return;
|
|
347
342
|
}
|
|
348
343
|
|
|
349
|
-
match = /^#EXT-X-MAP
|
|
344
|
+
match = /^#EXT-X-MAP:?(.*)$/.exec(newLine);
|
|
350
345
|
|
|
351
346
|
if (match) {
|
|
352
347
|
event = {
|
|
@@ -370,7 +365,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
370
365
|
return;
|
|
371
366
|
}
|
|
372
367
|
|
|
373
|
-
match = /^#EXT-X-STREAM-INF
|
|
368
|
+
match = /^#EXT-X-STREAM-INF:?(.*)$/.exec(newLine);
|
|
374
369
|
|
|
375
370
|
if (match) {
|
|
376
371
|
event = {
|
|
@@ -400,10 +395,6 @@ class ParseStream extends Stream__default["default"] {
|
|
|
400
395
|
event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);
|
|
401
396
|
}
|
|
402
397
|
|
|
403
|
-
if (event.attributes['FRAME-RATE']) {
|
|
404
|
-
event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);
|
|
405
|
-
}
|
|
406
|
-
|
|
407
398
|
if (event.attributes['PROGRAM-ID']) {
|
|
408
399
|
event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);
|
|
409
400
|
}
|
|
@@ -413,7 +404,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
413
404
|
return;
|
|
414
405
|
}
|
|
415
406
|
|
|
416
|
-
match = /^#EXT-X-MEDIA
|
|
407
|
+
match = /^#EXT-X-MEDIA:?(.*)$/.exec(newLine);
|
|
417
408
|
|
|
418
409
|
if (match) {
|
|
419
410
|
event = {
|
|
@@ -449,7 +440,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
449
440
|
return;
|
|
450
441
|
}
|
|
451
442
|
|
|
452
|
-
match = /^#EXT-X-PROGRAM-DATE-TIME
|
|
443
|
+
match = /^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(newLine);
|
|
453
444
|
|
|
454
445
|
if (match) {
|
|
455
446
|
event = {
|
|
@@ -466,7 +457,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
466
457
|
return;
|
|
467
458
|
}
|
|
468
459
|
|
|
469
|
-
match = /^#EXT-X-KEY
|
|
460
|
+
match = /^#EXT-X-KEY:?(.*)$/.exec(newLine);
|
|
470
461
|
|
|
471
462
|
if (match) {
|
|
472
463
|
event = {
|
|
@@ -495,7 +486,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
495
486
|
return;
|
|
496
487
|
}
|
|
497
488
|
|
|
498
|
-
match = /^#EXT-X-START
|
|
489
|
+
match = /^#EXT-X-START:?(.*)$/.exec(newLine);
|
|
499
490
|
|
|
500
491
|
if (match) {
|
|
501
492
|
event = {
|
|
@@ -513,7 +504,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
513
504
|
return;
|
|
514
505
|
}
|
|
515
506
|
|
|
516
|
-
match = /^#EXT-X-CUE-OUT-CONT
|
|
507
|
+
match = /^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(newLine);
|
|
517
508
|
|
|
518
509
|
if (match) {
|
|
519
510
|
event = {
|
|
@@ -531,7 +522,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
531
522
|
return;
|
|
532
523
|
}
|
|
533
524
|
|
|
534
|
-
match = /^#EXT-X-CUE-OUT
|
|
525
|
+
match = /^#EXT-X-CUE-OUT:?(.*)?$/.exec(newLine);
|
|
535
526
|
|
|
536
527
|
if (match) {
|
|
537
528
|
event = {
|
|
@@ -549,7 +540,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
549
540
|
return;
|
|
550
541
|
}
|
|
551
542
|
|
|
552
|
-
match = /^#EXT-X-CUE-IN
|
|
543
|
+
match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
|
|
553
544
|
|
|
554
545
|
if (match) {
|
|
555
546
|
event = {
|
package/dist/m3u8-parser.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @name @transmitlive/m3u8-parser @version 7.1.0-
|
|
1
|
+
/*! @name @transmitlive/m3u8-parser @version 7.1.0-3 @license Apache-2.0 */
|
|
2
2
|
import Stream from '@videojs/vhs-utils/es/stream.js';
|
|
3
3
|
import _extends from '@babel/runtime/helpers/extends';
|
|
4
4
|
import decodeB64ToUint8Array from '@videojs/vhs-utils/es/decode-b64-to-uint8-array.js';
|
|
@@ -80,14 +80,9 @@ const attributeSeparator = function () {
|
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
const parseAttributes = function (attributes) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (!attributes) {
|
|
86
|
-
return result;
|
|
87
|
-
} // split the string using attributes as the separator
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
// split the string using attributes as the separator
|
|
90
84
|
const attrs = attributes.split(attributeSeparator());
|
|
85
|
+
const result = {};
|
|
91
86
|
let i = attrs.length;
|
|
92
87
|
let attr;
|
|
93
88
|
|
|
@@ -209,7 +204,7 @@ class ParseStream extends Stream {
|
|
|
209
204
|
return;
|
|
210
205
|
}
|
|
211
206
|
|
|
212
|
-
match = /^#EXTINF
|
|
207
|
+
match = /^#EXTINF:?([0-9\.]*)?,?(.*)?$/.exec(newLine);
|
|
213
208
|
|
|
214
209
|
if (match) {
|
|
215
210
|
event = {
|
|
@@ -229,7 +224,7 @@ class ParseStream extends Stream {
|
|
|
229
224
|
return;
|
|
230
225
|
}
|
|
231
226
|
|
|
232
|
-
match = /^#EXT-X-TARGETDURATION
|
|
227
|
+
match = /^#EXT-X-TARGETDURATION:?([0-9.]*)?/.exec(newLine);
|
|
233
228
|
|
|
234
229
|
if (match) {
|
|
235
230
|
event = {
|
|
@@ -245,7 +240,7 @@ class ParseStream extends Stream {
|
|
|
245
240
|
return;
|
|
246
241
|
}
|
|
247
242
|
|
|
248
|
-
match = /^#EXT-X-VERSION
|
|
243
|
+
match = /^#EXT-X-VERSION:?([0-9.]*)?/.exec(newLine);
|
|
249
244
|
|
|
250
245
|
if (match) {
|
|
251
246
|
event = {
|
|
@@ -261,7 +256,7 @@ class ParseStream extends Stream {
|
|
|
261
256
|
return;
|
|
262
257
|
}
|
|
263
258
|
|
|
264
|
-
match = /^#EXT-X-MEDIA-SEQUENCE
|
|
259
|
+
match = /^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
|
|
265
260
|
|
|
266
261
|
if (match) {
|
|
267
262
|
event = {
|
|
@@ -277,7 +272,7 @@ class ParseStream extends Stream {
|
|
|
277
272
|
return;
|
|
278
273
|
}
|
|
279
274
|
|
|
280
|
-
match = /^#EXT-X-DISCONTINUITY-SEQUENCE
|
|
275
|
+
match = /^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
|
|
281
276
|
|
|
282
277
|
if (match) {
|
|
283
278
|
event = {
|
|
@@ -293,7 +288,7 @@ class ParseStream extends Stream {
|
|
|
293
288
|
return;
|
|
294
289
|
}
|
|
295
290
|
|
|
296
|
-
match = /^#EXT-X-PLAYLIST-TYPE
|
|
291
|
+
match = /^#EXT-X-PLAYLIST-TYPE:?(.*)?$/.exec(newLine);
|
|
297
292
|
|
|
298
293
|
if (match) {
|
|
299
294
|
event = {
|
|
@@ -309,7 +304,7 @@ class ParseStream extends Stream {
|
|
|
309
304
|
return;
|
|
310
305
|
}
|
|
311
306
|
|
|
312
|
-
match = /^#EXT-X-BYTERANGE
|
|
307
|
+
match = /^#EXT-X-BYTERANGE:?(.*)?$/.exec(newLine);
|
|
313
308
|
|
|
314
309
|
if (match) {
|
|
315
310
|
event = _extends(parseByterange(match[1]), {
|
|
@@ -320,7 +315,7 @@ class ParseStream extends Stream {
|
|
|
320
315
|
return;
|
|
321
316
|
}
|
|
322
317
|
|
|
323
|
-
match = /^#EXT-X-ALLOW-CACHE
|
|
318
|
+
match = /^#EXT-X-ALLOW-CACHE:?(YES|NO)?/.exec(newLine);
|
|
324
319
|
|
|
325
320
|
if (match) {
|
|
326
321
|
event = {
|
|
@@ -336,7 +331,7 @@ class ParseStream extends Stream {
|
|
|
336
331
|
return;
|
|
337
332
|
}
|
|
338
333
|
|
|
339
|
-
match = /^#EXT-X-MAP
|
|
334
|
+
match = /^#EXT-X-MAP:?(.*)$/.exec(newLine);
|
|
340
335
|
|
|
341
336
|
if (match) {
|
|
342
337
|
event = {
|
|
@@ -360,7 +355,7 @@ class ParseStream extends Stream {
|
|
|
360
355
|
return;
|
|
361
356
|
}
|
|
362
357
|
|
|
363
|
-
match = /^#EXT-X-STREAM-INF
|
|
358
|
+
match = /^#EXT-X-STREAM-INF:?(.*)$/.exec(newLine);
|
|
364
359
|
|
|
365
360
|
if (match) {
|
|
366
361
|
event = {
|
|
@@ -390,10 +385,6 @@ class ParseStream extends Stream {
|
|
|
390
385
|
event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);
|
|
391
386
|
}
|
|
392
387
|
|
|
393
|
-
if (event.attributes['FRAME-RATE']) {
|
|
394
|
-
event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
388
|
if (event.attributes['PROGRAM-ID']) {
|
|
398
389
|
event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);
|
|
399
390
|
}
|
|
@@ -403,7 +394,7 @@ class ParseStream extends Stream {
|
|
|
403
394
|
return;
|
|
404
395
|
}
|
|
405
396
|
|
|
406
|
-
match = /^#EXT-X-MEDIA
|
|
397
|
+
match = /^#EXT-X-MEDIA:?(.*)$/.exec(newLine);
|
|
407
398
|
|
|
408
399
|
if (match) {
|
|
409
400
|
event = {
|
|
@@ -439,7 +430,7 @@ class ParseStream extends Stream {
|
|
|
439
430
|
return;
|
|
440
431
|
}
|
|
441
432
|
|
|
442
|
-
match = /^#EXT-X-PROGRAM-DATE-TIME
|
|
433
|
+
match = /^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(newLine);
|
|
443
434
|
|
|
444
435
|
if (match) {
|
|
445
436
|
event = {
|
|
@@ -456,7 +447,7 @@ class ParseStream extends Stream {
|
|
|
456
447
|
return;
|
|
457
448
|
}
|
|
458
449
|
|
|
459
|
-
match = /^#EXT-X-KEY
|
|
450
|
+
match = /^#EXT-X-KEY:?(.*)$/.exec(newLine);
|
|
460
451
|
|
|
461
452
|
if (match) {
|
|
462
453
|
event = {
|
|
@@ -485,7 +476,7 @@ class ParseStream extends Stream {
|
|
|
485
476
|
return;
|
|
486
477
|
}
|
|
487
478
|
|
|
488
|
-
match = /^#EXT-X-START
|
|
479
|
+
match = /^#EXT-X-START:?(.*)$/.exec(newLine);
|
|
489
480
|
|
|
490
481
|
if (match) {
|
|
491
482
|
event = {
|
|
@@ -503,7 +494,7 @@ class ParseStream extends Stream {
|
|
|
503
494
|
return;
|
|
504
495
|
}
|
|
505
496
|
|
|
506
|
-
match = /^#EXT-X-CUE-OUT-CONT
|
|
497
|
+
match = /^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(newLine);
|
|
507
498
|
|
|
508
499
|
if (match) {
|
|
509
500
|
event = {
|
|
@@ -521,7 +512,7 @@ class ParseStream extends Stream {
|
|
|
521
512
|
return;
|
|
522
513
|
}
|
|
523
514
|
|
|
524
|
-
match = /^#EXT-X-CUE-OUT
|
|
515
|
+
match = /^#EXT-X-CUE-OUT:?(.*)?$/.exec(newLine);
|
|
525
516
|
|
|
526
517
|
if (match) {
|
|
527
518
|
event = {
|
|
@@ -539,7 +530,7 @@ class ParseStream extends Stream {
|
|
|
539
530
|
return;
|
|
540
531
|
}
|
|
541
532
|
|
|
542
|
-
match = /^#EXT-X-CUE-IN
|
|
533
|
+
match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
|
|
543
534
|
|
|
544
535
|
if (match) {
|
|
545
536
|
event = {
|
package/dist/m3u8-parser.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @name @transmitlive/m3u8-parser @version 7.1.0-
|
|
1
|
+
/*! @name @transmitlive/m3u8-parser @version 7.1.0-3 @license Apache-2.0 */
|
|
2
2
|
(function (global, factory) {
|
|
3
3
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
4
4
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
@@ -223,14 +223,9 @@
|
|
|
223
223
|
|
|
224
224
|
|
|
225
225
|
const parseAttributes = function (attributes) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if (!attributes) {
|
|
229
|
-
return result;
|
|
230
|
-
} // split the string using attributes as the separator
|
|
231
|
-
|
|
232
|
-
|
|
226
|
+
// split the string using attributes as the separator
|
|
233
227
|
const attrs = attributes.split(attributeSeparator());
|
|
228
|
+
const result = {};
|
|
234
229
|
let i = attrs.length;
|
|
235
230
|
let attr;
|
|
236
231
|
|
|
@@ -352,7 +347,7 @@
|
|
|
352
347
|
return;
|
|
353
348
|
}
|
|
354
349
|
|
|
355
|
-
match = /^#EXTINF
|
|
350
|
+
match = /^#EXTINF:?([0-9\.]*)?,?(.*)?$/.exec(newLine);
|
|
356
351
|
|
|
357
352
|
if (match) {
|
|
358
353
|
event = {
|
|
@@ -372,7 +367,7 @@
|
|
|
372
367
|
return;
|
|
373
368
|
}
|
|
374
369
|
|
|
375
|
-
match = /^#EXT-X-TARGETDURATION
|
|
370
|
+
match = /^#EXT-X-TARGETDURATION:?([0-9.]*)?/.exec(newLine);
|
|
376
371
|
|
|
377
372
|
if (match) {
|
|
378
373
|
event = {
|
|
@@ -388,7 +383,7 @@
|
|
|
388
383
|
return;
|
|
389
384
|
}
|
|
390
385
|
|
|
391
|
-
match = /^#EXT-X-VERSION
|
|
386
|
+
match = /^#EXT-X-VERSION:?([0-9.]*)?/.exec(newLine);
|
|
392
387
|
|
|
393
388
|
if (match) {
|
|
394
389
|
event = {
|
|
@@ -404,7 +399,7 @@
|
|
|
404
399
|
return;
|
|
405
400
|
}
|
|
406
401
|
|
|
407
|
-
match = /^#EXT-X-MEDIA-SEQUENCE
|
|
402
|
+
match = /^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
|
|
408
403
|
|
|
409
404
|
if (match) {
|
|
410
405
|
event = {
|
|
@@ -420,7 +415,7 @@
|
|
|
420
415
|
return;
|
|
421
416
|
}
|
|
422
417
|
|
|
423
|
-
match = /^#EXT-X-DISCONTINUITY-SEQUENCE
|
|
418
|
+
match = /^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/.exec(newLine);
|
|
424
419
|
|
|
425
420
|
if (match) {
|
|
426
421
|
event = {
|
|
@@ -436,7 +431,7 @@
|
|
|
436
431
|
return;
|
|
437
432
|
}
|
|
438
433
|
|
|
439
|
-
match = /^#EXT-X-PLAYLIST-TYPE
|
|
434
|
+
match = /^#EXT-X-PLAYLIST-TYPE:?(.*)?$/.exec(newLine);
|
|
440
435
|
|
|
441
436
|
if (match) {
|
|
442
437
|
event = {
|
|
@@ -452,7 +447,7 @@
|
|
|
452
447
|
return;
|
|
453
448
|
}
|
|
454
449
|
|
|
455
|
-
match = /^#EXT-X-BYTERANGE
|
|
450
|
+
match = /^#EXT-X-BYTERANGE:?(.*)?$/.exec(newLine);
|
|
456
451
|
|
|
457
452
|
if (match) {
|
|
458
453
|
event = _extends$1(parseByterange(match[1]), {
|
|
@@ -463,7 +458,7 @@
|
|
|
463
458
|
return;
|
|
464
459
|
}
|
|
465
460
|
|
|
466
|
-
match = /^#EXT-X-ALLOW-CACHE
|
|
461
|
+
match = /^#EXT-X-ALLOW-CACHE:?(YES|NO)?/.exec(newLine);
|
|
467
462
|
|
|
468
463
|
if (match) {
|
|
469
464
|
event = {
|
|
@@ -479,7 +474,7 @@
|
|
|
479
474
|
return;
|
|
480
475
|
}
|
|
481
476
|
|
|
482
|
-
match = /^#EXT-X-MAP
|
|
477
|
+
match = /^#EXT-X-MAP:?(.*)$/.exec(newLine);
|
|
483
478
|
|
|
484
479
|
if (match) {
|
|
485
480
|
event = {
|
|
@@ -503,7 +498,7 @@
|
|
|
503
498
|
return;
|
|
504
499
|
}
|
|
505
500
|
|
|
506
|
-
match = /^#EXT-X-STREAM-INF
|
|
501
|
+
match = /^#EXT-X-STREAM-INF:?(.*)$/.exec(newLine);
|
|
507
502
|
|
|
508
503
|
if (match) {
|
|
509
504
|
event = {
|
|
@@ -533,10 +528,6 @@
|
|
|
533
528
|
event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);
|
|
534
529
|
}
|
|
535
530
|
|
|
536
|
-
if (event.attributes['FRAME-RATE']) {
|
|
537
|
-
event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);
|
|
538
|
-
}
|
|
539
|
-
|
|
540
531
|
if (event.attributes['PROGRAM-ID']) {
|
|
541
532
|
event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);
|
|
542
533
|
}
|
|
@@ -546,7 +537,7 @@
|
|
|
546
537
|
return;
|
|
547
538
|
}
|
|
548
539
|
|
|
549
|
-
match = /^#EXT-X-MEDIA
|
|
540
|
+
match = /^#EXT-X-MEDIA:?(.*)$/.exec(newLine);
|
|
550
541
|
|
|
551
542
|
if (match) {
|
|
552
543
|
event = {
|
|
@@ -582,7 +573,7 @@
|
|
|
582
573
|
return;
|
|
583
574
|
}
|
|
584
575
|
|
|
585
|
-
match = /^#EXT-X-PROGRAM-DATE-TIME
|
|
576
|
+
match = /^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(newLine);
|
|
586
577
|
|
|
587
578
|
if (match) {
|
|
588
579
|
event = {
|
|
@@ -599,7 +590,7 @@
|
|
|
599
590
|
return;
|
|
600
591
|
}
|
|
601
592
|
|
|
602
|
-
match = /^#EXT-X-KEY
|
|
593
|
+
match = /^#EXT-X-KEY:?(.*)$/.exec(newLine);
|
|
603
594
|
|
|
604
595
|
if (match) {
|
|
605
596
|
event = {
|
|
@@ -628,7 +619,7 @@
|
|
|
628
619
|
return;
|
|
629
620
|
}
|
|
630
621
|
|
|
631
|
-
match = /^#EXT-X-START
|
|
622
|
+
match = /^#EXT-X-START:?(.*)$/.exec(newLine);
|
|
632
623
|
|
|
633
624
|
if (match) {
|
|
634
625
|
event = {
|
|
@@ -646,7 +637,7 @@
|
|
|
646
637
|
return;
|
|
647
638
|
}
|
|
648
639
|
|
|
649
|
-
match = /^#EXT-X-CUE-OUT-CONT
|
|
640
|
+
match = /^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(newLine);
|
|
650
641
|
|
|
651
642
|
if (match) {
|
|
652
643
|
event = {
|
|
@@ -664,7 +655,7 @@
|
|
|
664
655
|
return;
|
|
665
656
|
}
|
|
666
657
|
|
|
667
|
-
match = /^#EXT-X-CUE-OUT
|
|
658
|
+
match = /^#EXT-X-CUE-OUT:?(.*)?$/.exec(newLine);
|
|
668
659
|
|
|
669
660
|
if (match) {
|
|
670
661
|
event = {
|
|
@@ -682,7 +673,7 @@
|
|
|
682
673
|
return;
|
|
683
674
|
}
|
|
684
675
|
|
|
685
|
-
match = /^#EXT-X-CUE-IN
|
|
676
|
+
match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
|
|
686
677
|
|
|
687
678
|
if (match) {
|
|
688
679
|
event = {
|
package/dist/m3u8-parser.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! @name @transmitlive/m3u8-parser @version 7.1.0-
|
|
2
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).m3u8Parser={})}(this,(function(t){"use strict";var e=function(){function t(){this.listeners={}}var e=t.prototype;return e.on=function(t,e){this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(e)},e.off=function(t,e){if(!this.listeners[t])return!1;var i=this.listeners[t].indexOf(e);return this.listeners[t]=this.listeners[t].slice(0),this.listeners[t].splice(i,1),i>-1},e.trigger=function(t){var e=this.listeners[t];if(e)if(2===arguments.length)for(var i=e.length,a=0;a<i;++a)e[a].call(this,arguments[1]);else for(var s=Array.prototype.slice.call(arguments,1),r=e.length,n=0;n<r;++n)e[n].apply(this,s)},e.dispose=function(){this.listeners={}},e.pipe=function(t){this.on("data",(function(e){t.push(e)}))},t}();class i extends e{constructor(){super(),this.buffer=""}push(t){let e;for(this.buffer+=t,e=this.buffer.indexOf("\n");e>-1;e=this.buffer.indexOf("\n"))this.trigger("data",this.buffer.substring(0,e)),this.buffer=this.buffer.substring(e+1)}}function a(){return s=a=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(t[a]=i[a])}return t},a.apply(this,arguments)}var s=a,r=s;const n=String.fromCharCode(9),u=function(t){const e=/([0-9.]*)?@?([0-9.]*)?/.exec(t||""),i={};return e[1]&&(i.length=parseInt(e[1],10)),e[2]&&(i.offset=parseInt(e[2],10)),i},o=function(t){const e={};if(!t)return e;const i=t.split(new RegExp('(?:^|,)((?:[^=]*)=(?:"[^"]*"|[^,]*))'));let a,s=i.length;for(;s--;)""!==i[s]&&(a=/([^=]*)=(.*)/.exec(i[s]).slice(1),a[0]=a[0].replace(/^\s+|\s+$/g,""),a[1]=a[1].replace(/^\s+|\s+$/g,""),a[1]=a[1].replace(/^['"](.*)['"]$/g,"$1"),e[a[0]]=a[1]);return e};class g extends e{constructor(){super(),this.customParsers=[],this.tagMappers=[],this.lineNumber=0}push(t){let e,i;if(this.lineNumber=this.lineNumber+1,0===(t=t.trim()).length)return;if("#"!==t[0])return void this.trigger("data",{type:"uri",uri:t});this.tagMappers.reduce(((e,i)=>{const a=i(t);return a===t?e:e.concat([a])}),[t]).forEach((t=>{for(let e=0;e<this.customParsers.length;e++)if(this.customParsers[e].call(this,t))return;if(0===t.indexOf("#EXT"))if(t=t.replace("\r",""),e=/^#EXTM3U/.exec(t),e)this.trigger("data",{type:"tag",tagType:"m3u"});else{if(e=/^#EXTINF:([0-9\.]*)?,?(.*)?$/.exec(t),e)return i={type:"tag",tagType:"inf"},e[1]&&(i.duration=parseFloat(e[1])),e[2]&&(i.title=e[2]),void this.trigger("data",i);if(e=/^#EXT-X-TARGETDURATION:([0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"targetduration"},e[1]&&(i.duration=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-VERSION:([0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"version"},e[1]&&(i.version=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-MEDIA-SEQUENCE:(\-?[0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"media-sequence"},e[1]&&(i.number=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-DISCONTINUITY-SEQUENCE:(\-?[0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"discontinuity-sequence"},e[1]&&(i.number=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-PLAYLIST-TYPE:(.*)?$/.exec(t),e)return i={type:"tag",tagType:"playlist-type"},e[1]&&(i.playlistType=e[1]),void this.trigger("data",i);if(e=/^#EXT-X-BYTERANGE:(.*)?$/.exec(t),e)return i=r(u(e[1]),{type:"tag",tagType:"byterange"}),void this.trigger("data",i);if(e=/^#EXT-X-ALLOW-CACHE:(YES|NO)?/.exec(t),e)return i={type:"tag",tagType:"allow-cache"},e[1]&&(i.allowed=!/NO/.test(e[1])),void this.trigger("data",i);if(e=/^#EXT-X-MAP:(.*)$/.exec(t),e){if(i={type:"tag",tagType:"map"},e[1]){const t=o(e[1]);t.URI&&(i.uri=t.URI),t.BYTERANGE&&(i.byterange=u(t.BYTERANGE))}this.trigger("data",i)}else if(e=/^#EXT-X-STREAM-INF:(.*)$/.exec(t),e){if(i={type:"tag",tagType:"stream-inf"},e[1]){if(i.attributes=o(e[1]),i.attributes.RESOLUTION){const t=i.attributes.RESOLUTION.split("x"),e={};t[0]&&(e.width=parseInt(t[0],10)),t[1]&&(e.height=parseInt(t[1],10)),i.attributes.RESOLUTION=e}i.attributes.BANDWIDTH&&(i.attributes.BANDWIDTH=parseInt(i.attributes.BANDWIDTH,10)),i.attributes["FRAME-RATE"]&&(i.attributes["FRAME-RATE"]=parseFloat(i.attributes["FRAME-RATE"])),i.attributes["PROGRAM-ID"]&&(i.attributes["PROGRAM-ID"]=parseInt(i.attributes["PROGRAM-ID"],10))}this.trigger("data",i)}else{if(e=/^#EXT-X-MEDIA:(.*)$/.exec(t),e)return i={type:"tag",tagType:"media"},e[1]&&(i.attributes=o(e[1])),void this.trigger("data",i);if(e=/^#EXT-X-ENDLIST/.exec(t),e)this.trigger("data",{type:"tag",tagType:"endlist"});else if(e=/^#EXT-X-DISCONTINUITY/.exec(t),e)this.trigger("data",{type:"tag",tagType:"discontinuity"});else{if(e=/^#EXT-X-PROGRAM-DATE-TIME:(.*)$/.exec(t),e)return i={type:"tag",tagType:"program-date-time"},e[1]&&(i.dateTimeString=e[1],i.dateTimeObject=new Date(e[1])),void this.trigger("data",i);if(e=/^#EXT-X-KEY:(.*)$/.exec(t),e)return i={type:"tag",tagType:"key"},e[1]&&(i.attributes=o(e[1]),i.attributes.IV&&("0x"===i.attributes.IV.substring(0,2).toLowerCase()&&(i.attributes.IV=i.attributes.IV.substring(2)),i.attributes.IV=i.attributes.IV.match(/.{8}/g),i.attributes.IV[0]=parseInt(i.attributes.IV[0],16),i.attributes.IV[1]=parseInt(i.attributes.IV[1],16),i.attributes.IV[2]=parseInt(i.attributes.IV[2],16),i.attributes.IV[3]=parseInt(i.attributes.IV[3],16),i.attributes.IV=new Uint32Array(i.attributes.IV))),void this.trigger("data",i);if(e=/^#EXT-X-START:(.*)$/.exec(t),e)return i={type:"tag",tagType:"start"},e[1]&&(i.attributes=o(e[1]),i.attributes["TIME-OFFSET"]=parseFloat(i.attributes["TIME-OFFSET"]),i.attributes.PRECISE=/YES/.test(i.attributes.PRECISE)),void this.trigger("data",i);if(e=/^#EXT-X-CUE-OUT-CONT:(.*)?$/.exec(t),e)return i={type:"tag",tagType:"cue-out-cont"},e[1]?i.data=e[1]:i.data="",void this.trigger("data",i);if(e=/^#EXT-X-CUE-OUT:(.*)?$/.exec(t),e)return i={type:"tag",tagType:"cue-out"},e[1]?i.data=e[1]:i.data="",void this.trigger("data",i);if(e=/^#EXT-X-CUE-IN:(.*)?$/.exec(t),e)return i={type:"tag",tagType:"cue-in"},e[1]?i.data=e[1]:i.data="",void this.trigger("data",i);if(e=/^#EXT-X-SKIP:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"skip"},i.attributes=o(e[1]),i.attributes.hasOwnProperty("SKIPPED-SEGMENTS")&&(i.attributes["SKIPPED-SEGMENTS"]=parseInt(i.attributes["SKIPPED-SEGMENTS"],10)),i.attributes.hasOwnProperty("RECENTLY-REMOVED-DATERANGES")&&(i.attributes["RECENTLY-REMOVED-DATERANGES"]=i.attributes["RECENTLY-REMOVED-DATERANGES"].split(n)),void this.trigger("data",i);if(e=/^#EXT-X-PART:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"part"},i.attributes=o(e[1]),["DURATION"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),["INDEPENDENT","GAP"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=/YES/.test(i.attributes[t]))})),i.attributes.hasOwnProperty("BYTERANGE")&&(i.attributes.byterange=u(i.attributes.BYTERANGE)),void this.trigger("data",i);if(e=/^#EXT-X-SERVER-CONTROL:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"server-control"},i.attributes=o(e[1]),["CAN-SKIP-UNTIL","PART-HOLD-BACK","HOLD-BACK"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),["CAN-SKIP-DATERANGES","CAN-BLOCK-RELOAD"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=/YES/.test(i.attributes[t]))})),void this.trigger("data",i);if(e=/^#EXT-X-PART-INF:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"part-inf"},i.attributes=o(e[1]),["PART-TARGET"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),void this.trigger("data",i);if(e=/^#EXT-X-PRELOAD-HINT:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"preload-hint"},i.attributes=o(e[1]),["BYTERANGE-START","BYTERANGE-LENGTH"].forEach((function(t){if(i.attributes.hasOwnProperty(t)){i.attributes[t]=parseInt(i.attributes[t],10);const e="BYTERANGE-LENGTH"===t?"length":"offset";i.attributes.byterange=i.attributes.byterange||{},i.attributes.byterange[e]=i.attributes[t],delete i.attributes[t]}})),void this.trigger("data",i);if(e=/^#EXT-X-RENDITION-REPORT:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"rendition-report"},i.attributes=o(e[1]),["LAST-MSN","LAST-PART"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseInt(i.attributes[t],10))})),void this.trigger("data",i);if(e=/^#EXT-X-DATERANGE:(.*)$/.exec(t),e&&e[1]){i={type:"tag",tagType:"daterange"},i.attributes=o(e[1]),["ID","CLASS"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=String(i.attributes[t]))})),["START-DATE","END-DATE"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=new Date(i.attributes[t]))})),["DURATION","PLANNED-DURATION"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),["END-ON-NEXT"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=/YES/i.test(i.attributes[t]))})),["SCTE35-CMD"," SCTE35-OUT","SCTE35-IN"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=i.attributes[t].toString(16))}));const t=/^X-([A-Z]+-)+[A-Z]+$/;for(const e in i.attributes){if(!t.test(e))continue;const a=/[0-9A-Fa-f]{6}/g.test(i.attributes[e]),s=/^\d+(\.\d+)?$/.test(i.attributes[e]);i.attributes[e]=a?i.attributes[e].toString(16):s?parseFloat(i.attributes[e]):String(i.attributes[e])}this.trigger("data",i)}else if(e=/^#EXT-X-INDEPENDENT-SEGMENTS/.exec(t),e)this.trigger("data",{type:"tag",tagType:"independent-segments"});else{if(e=/^#EXT-X-CONTENT-STEERING:(.*)$/.exec(t),e)return i={type:"tag",tagType:"content-steering"},i.attributes=o(e[1]),void this.trigger("data",i);this.trigger("data",{type:"tag",data:t.slice(4)})}}}}else this.trigger("data",{type:"comment",text:t.slice(1)})}))}addParser({expression:t,customType:e,dataParser:i,segment:a}){"function"!=typeof i&&(i=t=>t),this.customParsers.push((s=>{if(t.exec(s))return this.trigger("data",{type:"custom",data:i(s),customType:e,segment:a}),!0}))}addTagMapper({expression:t,map:e}){this.tagMappers.push((i=>t.test(i)?e(i):i))}}function h(t){for(var e,i=(e=t,window.atob?window.atob(e):Buffer.from(e,"base64").toString("binary")),a=new Uint8Array(i.length),s=0;s<i.length;s++)a[s]=i.charCodeAt(s);return a}const d=function(t){const e={};return Object.keys(t).forEach((function(i){var a;e[(a=i,a.toLowerCase().replace(/-(\w)/g,(t=>t[1].toUpperCase())))]=t[i]})),e},p=function(t){const{serverControl:e,targetDuration:i,partTargetDuration:a}=t;if(!e)return;const s="#EXT-X-SERVER-CONTROL",r="holdBack",n="partHoldBack",u=i&&3*i,o=a&&2*a;i&&!e.hasOwnProperty(r)&&(e[r]=u,this.trigger("info",{message:`${s} defaulting HOLD-BACK to targetDuration * 3 (${u}).`})),u&&e[r]<u&&(this.trigger("warn",{message:`${s} clamping HOLD-BACK (${e[r]}) to targetDuration * 3 (${u})`}),e[r]=u),a&&!e.hasOwnProperty(n)&&(e[n]=3*a,this.trigger("info",{message:`${s} defaulting PART-HOLD-BACK to partTargetDuration * 3 (${e[n]}).`})),a&&e[n]<o&&(this.trigger("warn",{message:`${s} clamping PART-HOLD-BACK (${e[n]}) to partTargetDuration * 2 (${o}).`}),e[n]=o)};t.LineStream=i,t.ParseStream=g,t.Parser=class extends e{constructor(){super(),this.lineStream=new i,this.parseStream=new g,this.lineStream.pipe(this.parseStream),this.lastProgramDateTime=null;const t=this,e=[];let a,s,n={},u=!1;const o=function(){},E={AUDIO:{},VIDEO:{},"CLOSED-CAPTIONS":{},SUBTITLES:{}};let f=0;this.manifest={allowCache:!0,discontinuityStarts:[],dateRanges:[],segments:[]};let T=0,c=0;const m={};let l=0;this.on("end",(()=>{n.uri||!n.parts&&!n.preloadHints||(!n.map&&a&&(n.map=a),!n.key&&s&&(n.key=s),n.timeline||"number"!=typeof f||(n.timeline=f),this.manifest.preloadSegment=n)})),this.parseStream.on("data",(function(i){let g,b;Object.keys(n).length||(l=this.lineNumber),{tag(){({version(){i.version&&(this.manifest.version=i.version)},"allow-cache"(){this.manifest.allowCache=i.allowed,"allowed"in i||(this.trigger("info",{message:"defaulting allowCache to YES"}),this.manifest.allowCache=!0)},byterange(){const t={};"length"in i&&(n.byterange=t,t.length=i.length,"offset"in i||(i.offset=T)),"offset"in i&&(n.byterange=t,t.offset=i.offset),T=t.offset+t.length},endlist(){this.manifest.endList=!0},inf(){"mediaSequence"in this.manifest||(this.manifest.mediaSequence=0,this.trigger("info",{message:"defaulting media sequence to zero"})),"discontinuitySequence"in this.manifest||(this.manifest.discontinuitySequence=0,this.trigger("info",{message:"defaulting discontinuity sequence to zero"})),i.title&&(n.title=i.title),i.duration>0&&(n.duration=i.duration),0===i.duration&&(n.duration=.01,this.trigger("info",{message:"updating zero segment duration to a small value"})),this.manifest.segments=e},key(){if(i.attributes)if("NONE"!==i.attributes.METHOD)if(i.attributes.URI){if("com.apple.streamingkeydelivery"===i.attributes.KEYFORMAT)return this.manifest.contentProtection=this.manifest.contentProtection||{},void(this.manifest.contentProtection["com.apple.fps.1_0"]={attributes:i.attributes});if("com.microsoft.playready"===i.attributes.KEYFORMAT)return this.manifest.contentProtection=this.manifest.contentProtection||{},void(this.manifest.contentProtection["com.microsoft.playready"]={uri:i.attributes.URI});if("urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"===i.attributes.KEYFORMAT){return-1===["SAMPLE-AES","SAMPLE-AES-CTR","SAMPLE-AES-CENC"].indexOf(i.attributes.METHOD)?void this.trigger("warn",{message:"invalid key method provided for Widevine"}):("SAMPLE-AES-CENC"===i.attributes.METHOD&&this.trigger("warn",{message:"SAMPLE-AES-CENC is deprecated, please use SAMPLE-AES-CTR instead"}),"data:text/plain;base64,"!==i.attributes.URI.substring(0,23)?void this.trigger("warn",{message:"invalid key URI provided for Widevine"}):i.attributes.KEYID&&"0x"===i.attributes.KEYID.substring(0,2)?(this.manifest.contentProtection=this.manifest.contentProtection||{},void(this.manifest.contentProtection["com.widevine.alpha"]={attributes:{schemeIdUri:i.attributes.KEYFORMAT,keyId:i.attributes.KEYID.substring(2)},pssh:h(i.attributes.URI.split(",")[1])})):void this.trigger("warn",{message:"invalid key ID provided for Widevine"}))}i.attributes.METHOD||this.trigger("warn",{message:"defaulting key method to AES-128"}),s={method:i.attributes.METHOD||"AES-128",uri:i.attributes.URI},void 0!==i.attributes.IV&&(s.iv=i.attributes.IV)}else this.trigger("warn",{message:"ignoring key declaration without URI"});else s=null;else this.trigger("warn",{message:"ignoring key declaration without attribute list"})},"media-sequence"(){isFinite(i.number)?this.manifest.mediaSequence=i.number:this.trigger("warn",{message:"ignoring invalid media sequence: "+i.number})},"discontinuity-sequence"(){isFinite(i.number)?(this.manifest.discontinuitySequence=i.number,f=i.number):this.trigger("warn",{message:"ignoring invalid discontinuity sequence: "+i.number})},"playlist-type"(){/VOD|EVENT/.test(i.playlistType)?this.manifest.playlistType=i.playlistType:this.trigger("warn",{message:"ignoring unknown playlist type: "+i.playlist})},map(){a={},i.uri&&(a.uri=i.uri),i.byterange&&(a.byterange=i.byterange),s&&(a.key=s)},"stream-inf"(){this.manifest.playlists=e,this.manifest.mediaGroups=this.manifest.mediaGroups||E,i.attributes?(n.attributes||(n.attributes={}),r(n.attributes,i.attributes)):this.trigger("warn",{message:"ignoring empty stream-inf attributes"})},media(){if(this.manifest.mediaGroups=this.manifest.mediaGroups||E,!(i.attributes&&i.attributes.TYPE&&i.attributes["GROUP-ID"]&&i.attributes.NAME))return void this.trigger("warn",{message:"ignoring incomplete or missing media group"});const t=this.manifest.mediaGroups[i.attributes.TYPE];t[i.attributes["GROUP-ID"]]=t[i.attributes["GROUP-ID"]]||{},g=t[i.attributes["GROUP-ID"]],b={default:/yes/i.test(i.attributes.DEFAULT)},b.default?b.autoselect=!0:b.autoselect=/yes/i.test(i.attributes.AUTOSELECT),i.attributes.LANGUAGE&&(b.language=i.attributes.LANGUAGE),i.attributes.URI&&(b.uri=i.attributes.URI),i.attributes["INSTREAM-ID"]&&(b.instreamId=i.attributes["INSTREAM-ID"]),i.attributes.CHARACTERISTICS&&(b.characteristics=i.attributes.CHARACTERISTICS),i.attributes.FORCED&&(b.forced=/yes/i.test(i.attributes.FORCED)),g[i.attributes.NAME]=b},discontinuity(){f+=1,n.discontinuity=!0,this.manifest.discontinuityStarts.push(e.length)},"program-date-time"(){void 0===this.manifest.dateTimeString&&(this.manifest.dateTimeString=i.dateTimeString,this.manifest.dateTimeObject=i.dateTimeObject),n.dateTimeString=i.dateTimeString,n.dateTimeObject=i.dateTimeObject;const{lastProgramDateTime:t}=this;this.lastProgramDateTime=new Date(i.dateTimeString).getTime(),null===t&&this.manifest.segments.reduceRight(((t,e)=>(e.programDateTime=t-1e3*e.duration,e.programDateTime)),this.lastProgramDateTime)},targetduration(){!isFinite(i.duration)||i.duration<0?this.trigger("warn",{message:"ignoring invalid target duration: "+i.duration}):(this.manifest.targetDuration=i.duration,p.call(this,this.manifest))},start(){i.attributes&&!isNaN(i.attributes["TIME-OFFSET"])?this.manifest.start={timeOffset:i.attributes["TIME-OFFSET"],precise:i.attributes.PRECISE}:this.trigger("warn",{message:"ignoring start declaration without appropriate attribute list"})},"cue-out"(){n.cueOut=i.data},"cue-out-cont"(){n.cueOutCont=i.data},"cue-in"(){n.cueIn=i.data},skip(){this.manifest.skip=d(i.attributes),this.warnOnMissingAttributes_("#EXT-X-SKIP",i.attributes,["SKIPPED-SEGMENTS"])},part(){u=!0;const t=this.manifest.segments.length,e=d(i.attributes);n.parts=n.parts||[],n.parts.push(e),e.byterange&&(e.byterange.hasOwnProperty("offset")||(e.byterange.offset=c),c=e.byterange.offset+e.byterange.length);const a=n.parts.length-1;this.warnOnMissingAttributes_(`#EXT-X-PART #${a} for segment #${t}`,i.attributes,["URI","DURATION"]),this.manifest.renditionReports&&this.manifest.renditionReports.forEach(((t,e)=>{t.hasOwnProperty("lastPart")||this.trigger("warn",{message:`#EXT-X-RENDITION-REPORT #${e} lacks required attribute(s): LAST-PART`})}))},"server-control"(){const t=this.manifest.serverControl=d(i.attributes);t.hasOwnProperty("canBlockReload")||(t.canBlockReload=!1,this.trigger("info",{message:"#EXT-X-SERVER-CONTROL defaulting CAN-BLOCK-RELOAD to false"})),p.call(this,this.manifest),t.canSkipDateranges&&!t.hasOwnProperty("canSkipUntil")&&this.trigger("warn",{message:"#EXT-X-SERVER-CONTROL lacks required attribute CAN-SKIP-UNTIL which is required when CAN-SKIP-DATERANGES is set"})},"preload-hint"(){const t=this.manifest.segments.length,e=d(i.attributes),a=e.type&&"PART"===e.type;n.preloadHints=n.preloadHints||[],n.preloadHints.push(e),e.byterange&&(e.byterange.hasOwnProperty("offset")||(e.byterange.offset=a?c:0,a&&(c=e.byterange.offset+e.byterange.length)));const s=n.preloadHints.length-1;if(this.warnOnMissingAttributes_(`#EXT-X-PRELOAD-HINT #${s} for segment #${t}`,i.attributes,["TYPE","URI"]),e.type)for(let i=0;i<n.preloadHints.length-1;i++){const a=n.preloadHints[i];a.type&&(a.type===e.type&&this.trigger("warn",{message:`#EXT-X-PRELOAD-HINT #${s} for segment #${t} has the same TYPE ${e.type} as preload hint #${i}`}))}},"rendition-report"(){const t=d(i.attributes);this.manifest.renditionReports=this.manifest.renditionReports||[],this.manifest.renditionReports.push(t);const e=this.manifest.renditionReports.length-1,a=["LAST-MSN","URI"];u&&a.push("LAST-PART"),this.warnOnMissingAttributes_(`#EXT-X-RENDITION-REPORT #${e}`,i.attributes,a)},"part-inf"(){this.manifest.partInf=d(i.attributes),this.warnOnMissingAttributes_("#EXT-X-PART-INF",i.attributes,["PART-TARGET"]),this.manifest.partInf.partTarget&&(this.manifest.partTargetDuration=this.manifest.partInf.partTarget),p.call(this,this.manifest)},daterange(){this.manifest.dateRanges.push(d(i.attributes));const t=this.manifest.dateRanges.length-1;this.warnOnMissingAttributes_(`#EXT-X-DATERANGE #${t}`,i.attributes,["ID","START-DATE"]);const e=this.manifest.dateRanges[t];e.endDate&&e.startDate&&new Date(e.endDate)<new Date(e.startDate)&&this.trigger("warn",{message:"EXT-X-DATERANGE END-DATE must be equal to or later than the value of the START-DATE"}),e.duration&&e.duration<0&&this.trigger("warn",{message:"EXT-X-DATERANGE DURATION must not be negative"}),e.plannedDuration&&e.plannedDuration<0&&this.trigger("warn",{message:"EXT-X-DATERANGE PLANNED-DURATION must not be negative"});const a=!!e.endOnNext;if(a&&!e.class&&this.trigger("warn",{message:"EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must have a CLASS attribute"}),a&&(e.duration||e.endDate)&&this.trigger("warn",{message:"EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must not contain DURATION or END-DATE attributes"}),e.duration&&e.endDate){const i=e.startDate.getTime()+1e3*e.duration;this.manifest.dateRanges[t].endDate=new Date(i)}if(m[e.id]){for(const t in m[e.id])if(e[t]&&JSON.stringify(m[e.id][t])!==JSON.stringify(e[t])){this.trigger("warn",{message:"EXT-X-DATERANGE tags with the same ID in a playlist must have the same attributes values"});break}const t=this.manifest.dateRanges.findIndex((t=>t.id===e.id));this.manifest.dateRanges[t]=r(this.manifest.dateRanges[t],e),m[e.id]=r(m[e.id],e),this.manifest.dateRanges.pop()}else m[e.id]=e},"independent-segments"(){this.manifest.independentSegments=!0},"content-steering"(){this.manifest.contentSteering=d(i.attributes),this.warnOnMissingAttributes_("#EXT-X-CONTENT-STEERING",i.attributes,["SERVER-URI"])}}[i.tagType]||o).call(t)},uri(){n.uri=i.uri,n.lineNumberStart=l,n.lineNumberEnd=this.parseStream.lineNumber,e.push(n),this.manifest.targetDuration&&!("duration"in n)&&(this.trigger("warn",{message:"defaulting segment duration to the target duration"}),n.duration=this.manifest.targetDuration),s&&(n.key=s),n.timeline=f,a&&(n.map=a),c=0,null!==this.lastProgramDateTime&&(n.programDateTime=this.lastProgramDateTime,this.lastProgramDateTime+=1e3*n.duration),n={}},comment(){},custom(){i.segment?(n.custom=n.custom||{},n.custom[i.customType]=i.data):(this.manifest.custom=this.manifest.custom||{},this.manifest.custom[i.customType]=i.data)}}[i.type].call(t)}))}warnOnMissingAttributes_(t,e,i){const a=[];i.forEach((function(t){e.hasOwnProperty(t)||a.push(t)})),a.length&&this.trigger("warn",{message:`${t} lacks required attribute(s): ${a.join(", ")}`})}push(t){this.lineStream.push(t)}end(){this.lineStream.push("\n"),this.manifest.dateRanges.length&&null===this.lastProgramDateTime&&this.trigger("warn",{message:"A playlist with EXT-X-DATERANGE tag must contain atleast one EXT-X-PROGRAM-DATE-TIME tag"}),this.lastProgramDateTime=null,this.trigger("end")}addParser(t){this.parseStream.addParser(t)}addTagMapper(t){this.parseStream.addTagMapper(t)}},Object.defineProperty(t,"__esModule",{value:!0})}));
|
|
1
|
+
/*! @name @transmitlive/m3u8-parser @version 7.1.0-3 @license Apache-2.0 */
|
|
2
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).m3u8Parser={})}(this,(function(t){"use strict";var e=function(){function t(){this.listeners={}}var e=t.prototype;return e.on=function(t,e){this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(e)},e.off=function(t,e){if(!this.listeners[t])return!1;var i=this.listeners[t].indexOf(e);return this.listeners[t]=this.listeners[t].slice(0),this.listeners[t].splice(i,1),i>-1},e.trigger=function(t){var e=this.listeners[t];if(e)if(2===arguments.length)for(var i=e.length,a=0;a<i;++a)e[a].call(this,arguments[1]);else for(var s=Array.prototype.slice.call(arguments,1),r=e.length,n=0;n<r;++n)e[n].apply(this,s)},e.dispose=function(){this.listeners={}},e.pipe=function(t){this.on("data",(function(e){t.push(e)}))},t}();class i extends e{constructor(){super(),this.buffer=""}push(t){let e;for(this.buffer+=t,e=this.buffer.indexOf("\n");e>-1;e=this.buffer.indexOf("\n"))this.trigger("data",this.buffer.substring(0,e)),this.buffer=this.buffer.substring(e+1)}}function a(){return s=a=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(t[a]=i[a])}return t},a.apply(this,arguments)}var s=a,r=s;const n=String.fromCharCode(9),o=function(t){const e=/([0-9.]*)?@?([0-9.]*)?/.exec(t||""),i={};return e[1]&&(i.length=parseInt(e[1],10)),e[2]&&(i.offset=parseInt(e[2],10)),i},u=function(t){const e=t.split(new RegExp('(?:^|,)((?:[^=]*)=(?:"[^"]*"|[^,]*))')),i={};let a,s=e.length;for(;s--;)""!==e[s]&&(a=/([^=]*)=(.*)/.exec(e[s]).slice(1),a[0]=a[0].replace(/^\s+|\s+$/g,""),a[1]=a[1].replace(/^\s+|\s+$/g,""),a[1]=a[1].replace(/^['"](.*)['"]$/g,"$1"),i[a[0]]=a[1]);return i};class g extends e{constructor(){super(),this.customParsers=[],this.tagMappers=[],this.lineNumber=0}push(t){let e,i;if(this.lineNumber=this.lineNumber+1,0===(t=t.trim()).length)return;if("#"!==t[0])return void this.trigger("data",{type:"uri",uri:t});this.tagMappers.reduce(((e,i)=>{const a=i(t);return a===t?e:e.concat([a])}),[t]).forEach((t=>{for(let e=0;e<this.customParsers.length;e++)if(this.customParsers[e].call(this,t))return;if(0===t.indexOf("#EXT"))if(t=t.replace("\r",""),e=/^#EXTM3U/.exec(t),e)this.trigger("data",{type:"tag",tagType:"m3u"});else{if(e=/^#EXTINF:?([0-9\.]*)?,?(.*)?$/.exec(t),e)return i={type:"tag",tagType:"inf"},e[1]&&(i.duration=parseFloat(e[1])),e[2]&&(i.title=e[2]),void this.trigger("data",i);if(e=/^#EXT-X-TARGETDURATION:?([0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"targetduration"},e[1]&&(i.duration=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-VERSION:?([0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"version"},e[1]&&(i.version=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"media-sequence"},e[1]&&(i.number=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/.exec(t),e)return i={type:"tag",tagType:"discontinuity-sequence"},e[1]&&(i.number=parseInt(e[1],10)),void this.trigger("data",i);if(e=/^#EXT-X-PLAYLIST-TYPE:?(.*)?$/.exec(t),e)return i={type:"tag",tagType:"playlist-type"},e[1]&&(i.playlistType=e[1]),void this.trigger("data",i);if(e=/^#EXT-X-BYTERANGE:?(.*)?$/.exec(t),e)return i=r(o(e[1]),{type:"tag",tagType:"byterange"}),void this.trigger("data",i);if(e=/^#EXT-X-ALLOW-CACHE:?(YES|NO)?/.exec(t),e)return i={type:"tag",tagType:"allow-cache"},e[1]&&(i.allowed=!/NO/.test(e[1])),void this.trigger("data",i);if(e=/^#EXT-X-MAP:?(.*)$/.exec(t),e){if(i={type:"tag",tagType:"map"},e[1]){const t=u(e[1]);t.URI&&(i.uri=t.URI),t.BYTERANGE&&(i.byterange=o(t.BYTERANGE))}this.trigger("data",i)}else if(e=/^#EXT-X-STREAM-INF:?(.*)$/.exec(t),e){if(i={type:"tag",tagType:"stream-inf"},e[1]){if(i.attributes=u(e[1]),i.attributes.RESOLUTION){const t=i.attributes.RESOLUTION.split("x"),e={};t[0]&&(e.width=parseInt(t[0],10)),t[1]&&(e.height=parseInt(t[1],10)),i.attributes.RESOLUTION=e}i.attributes.BANDWIDTH&&(i.attributes.BANDWIDTH=parseInt(i.attributes.BANDWIDTH,10)),i.attributes["PROGRAM-ID"]&&(i.attributes["PROGRAM-ID"]=parseInt(i.attributes["PROGRAM-ID"],10))}this.trigger("data",i)}else{if(e=/^#EXT-X-MEDIA:?(.*)$/.exec(t),e)return i={type:"tag",tagType:"media"},e[1]&&(i.attributes=u(e[1])),void this.trigger("data",i);if(e=/^#EXT-X-ENDLIST/.exec(t),e)this.trigger("data",{type:"tag",tagType:"endlist"});else if(e=/^#EXT-X-DISCONTINUITY/.exec(t),e)this.trigger("data",{type:"tag",tagType:"discontinuity"});else{if(e=/^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(t),e)return i={type:"tag",tagType:"program-date-time"},e[1]&&(i.dateTimeString=e[1],i.dateTimeObject=new Date(e[1])),void this.trigger("data",i);if(e=/^#EXT-X-KEY:?(.*)$/.exec(t),e)return i={type:"tag",tagType:"key"},e[1]&&(i.attributes=u(e[1]),i.attributes.IV&&("0x"===i.attributes.IV.substring(0,2).toLowerCase()&&(i.attributes.IV=i.attributes.IV.substring(2)),i.attributes.IV=i.attributes.IV.match(/.{8}/g),i.attributes.IV[0]=parseInt(i.attributes.IV[0],16),i.attributes.IV[1]=parseInt(i.attributes.IV[1],16),i.attributes.IV[2]=parseInt(i.attributes.IV[2],16),i.attributes.IV[3]=parseInt(i.attributes.IV[3],16),i.attributes.IV=new Uint32Array(i.attributes.IV))),void this.trigger("data",i);if(e=/^#EXT-X-START:?(.*)$/.exec(t),e)return i={type:"tag",tagType:"start"},e[1]&&(i.attributes=u(e[1]),i.attributes["TIME-OFFSET"]=parseFloat(i.attributes["TIME-OFFSET"]),i.attributes.PRECISE=/YES/.test(i.attributes.PRECISE)),void this.trigger("data",i);if(e=/^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(t),e)return i={type:"tag",tagType:"cue-out-cont"},e[1]?i.data=e[1]:i.data="",void this.trigger("data",i);if(e=/^#EXT-X-CUE-OUT:?(.*)?$/.exec(t),e)return i={type:"tag",tagType:"cue-out"},e[1]?i.data=e[1]:i.data="",void this.trigger("data",i);if(e=/^#EXT-X-CUE-IN:?(.*)?$/.exec(t),e)return i={type:"tag",tagType:"cue-in"},e[1]?i.data=e[1]:i.data="",void this.trigger("data",i);if(e=/^#EXT-X-SKIP:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"skip"},i.attributes=u(e[1]),i.attributes.hasOwnProperty("SKIPPED-SEGMENTS")&&(i.attributes["SKIPPED-SEGMENTS"]=parseInt(i.attributes["SKIPPED-SEGMENTS"],10)),i.attributes.hasOwnProperty("RECENTLY-REMOVED-DATERANGES")&&(i.attributes["RECENTLY-REMOVED-DATERANGES"]=i.attributes["RECENTLY-REMOVED-DATERANGES"].split(n)),void this.trigger("data",i);if(e=/^#EXT-X-PART:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"part"},i.attributes=u(e[1]),["DURATION"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),["INDEPENDENT","GAP"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=/YES/.test(i.attributes[t]))})),i.attributes.hasOwnProperty("BYTERANGE")&&(i.attributes.byterange=o(i.attributes.BYTERANGE)),void this.trigger("data",i);if(e=/^#EXT-X-SERVER-CONTROL:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"server-control"},i.attributes=u(e[1]),["CAN-SKIP-UNTIL","PART-HOLD-BACK","HOLD-BACK"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),["CAN-SKIP-DATERANGES","CAN-BLOCK-RELOAD"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=/YES/.test(i.attributes[t]))})),void this.trigger("data",i);if(e=/^#EXT-X-PART-INF:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"part-inf"},i.attributes=u(e[1]),["PART-TARGET"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),void this.trigger("data",i);if(e=/^#EXT-X-PRELOAD-HINT:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"preload-hint"},i.attributes=u(e[1]),["BYTERANGE-START","BYTERANGE-LENGTH"].forEach((function(t){if(i.attributes.hasOwnProperty(t)){i.attributes[t]=parseInt(i.attributes[t],10);const e="BYTERANGE-LENGTH"===t?"length":"offset";i.attributes.byterange=i.attributes.byterange||{},i.attributes.byterange[e]=i.attributes[t],delete i.attributes[t]}})),void this.trigger("data",i);if(e=/^#EXT-X-RENDITION-REPORT:(.*)$/.exec(t),e&&e[1])return i={type:"tag",tagType:"rendition-report"},i.attributes=u(e[1]),["LAST-MSN","LAST-PART"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseInt(i.attributes[t],10))})),void this.trigger("data",i);if(e=/^#EXT-X-DATERANGE:(.*)$/.exec(t),e&&e[1]){i={type:"tag",tagType:"daterange"},i.attributes=u(e[1]),["ID","CLASS"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=String(i.attributes[t]))})),["START-DATE","END-DATE"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=new Date(i.attributes[t]))})),["DURATION","PLANNED-DURATION"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=parseFloat(i.attributes[t]))})),["END-ON-NEXT"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=/YES/i.test(i.attributes[t]))})),["SCTE35-CMD"," SCTE35-OUT","SCTE35-IN"].forEach((function(t){i.attributes.hasOwnProperty(t)&&(i.attributes[t]=i.attributes[t].toString(16))}));const t=/^X-([A-Z]+-)+[A-Z]+$/;for(const e in i.attributes){if(!t.test(e))continue;const a=/[0-9A-Fa-f]{6}/g.test(i.attributes[e]),s=/^\d+(\.\d+)?$/.test(i.attributes[e]);i.attributes[e]=a?i.attributes[e].toString(16):s?parseFloat(i.attributes[e]):String(i.attributes[e])}this.trigger("data",i)}else if(e=/^#EXT-X-INDEPENDENT-SEGMENTS/.exec(t),e)this.trigger("data",{type:"tag",tagType:"independent-segments"});else{if(e=/^#EXT-X-CONTENT-STEERING:(.*)$/.exec(t),e)return i={type:"tag",tagType:"content-steering"},i.attributes=u(e[1]),void this.trigger("data",i);this.trigger("data",{type:"tag",data:t.slice(4)})}}}}else this.trigger("data",{type:"comment",text:t.slice(1)})}))}addParser({expression:t,customType:e,dataParser:i,segment:a}){"function"!=typeof i&&(i=t=>t),this.customParsers.push((s=>{if(t.exec(s))return this.trigger("data",{type:"custom",data:i(s),customType:e,segment:a}),!0}))}addTagMapper({expression:t,map:e}){this.tagMappers.push((i=>t.test(i)?e(i):i))}}function h(t){for(var e,i=(e=t,window.atob?window.atob(e):Buffer.from(e,"base64").toString("binary")),a=new Uint8Array(i.length),s=0;s<i.length;s++)a[s]=i.charCodeAt(s);return a}const d=function(t){const e={};return Object.keys(t).forEach((function(i){var a;e[(a=i,a.toLowerCase().replace(/-(\w)/g,(t=>t[1].toUpperCase())))]=t[i]})),e},p=function(t){const{serverControl:e,targetDuration:i,partTargetDuration:a}=t;if(!e)return;const s="#EXT-X-SERVER-CONTROL",r="holdBack",n="partHoldBack",o=i&&3*i,u=a&&2*a;i&&!e.hasOwnProperty(r)&&(e[r]=o,this.trigger("info",{message:`${s} defaulting HOLD-BACK to targetDuration * 3 (${o}).`})),o&&e[r]<o&&(this.trigger("warn",{message:`${s} clamping HOLD-BACK (${e[r]}) to targetDuration * 3 (${o})`}),e[r]=o),a&&!e.hasOwnProperty(n)&&(e[n]=3*a,this.trigger("info",{message:`${s} defaulting PART-HOLD-BACK to partTargetDuration * 3 (${e[n]}).`})),a&&e[n]<u&&(this.trigger("warn",{message:`${s} clamping PART-HOLD-BACK (${e[n]}) to partTargetDuration * 2 (${u}).`}),e[n]=u)};t.LineStream=i,t.ParseStream=g,t.Parser=class extends e{constructor(){super(),this.lineStream=new i,this.parseStream=new g,this.lineStream.pipe(this.parseStream),this.lastProgramDateTime=null;const t=this,e=[];let a,s,n={},o=!1;const u=function(){},f={AUDIO:{},VIDEO:{},"CLOSED-CAPTIONS":{},SUBTITLES:{}};let E=0;this.manifest={allowCache:!0,discontinuityStarts:[],dateRanges:[],segments:[]};let c=0,T=0;const m={};let l=0;this.on("end",(()=>{n.uri||!n.parts&&!n.preloadHints||(!n.map&&a&&(n.map=a),!n.key&&s&&(n.key=s),n.timeline||"number"!=typeof E||(n.timeline=E),this.manifest.preloadSegment=n)})),this.parseStream.on("data",(function(i){let g,b;Object.keys(n).length||(l=this.lineNumber),{tag(){({version(){i.version&&(this.manifest.version=i.version)},"allow-cache"(){this.manifest.allowCache=i.allowed,"allowed"in i||(this.trigger("info",{message:"defaulting allowCache to YES"}),this.manifest.allowCache=!0)},byterange(){const t={};"length"in i&&(n.byterange=t,t.length=i.length,"offset"in i||(i.offset=c)),"offset"in i&&(n.byterange=t,t.offset=i.offset),c=t.offset+t.length},endlist(){this.manifest.endList=!0},inf(){"mediaSequence"in this.manifest||(this.manifest.mediaSequence=0,this.trigger("info",{message:"defaulting media sequence to zero"})),"discontinuitySequence"in this.manifest||(this.manifest.discontinuitySequence=0,this.trigger("info",{message:"defaulting discontinuity sequence to zero"})),i.title&&(n.title=i.title),i.duration>0&&(n.duration=i.duration),0===i.duration&&(n.duration=.01,this.trigger("info",{message:"updating zero segment duration to a small value"})),this.manifest.segments=e},key(){if(i.attributes)if("NONE"!==i.attributes.METHOD)if(i.attributes.URI){if("com.apple.streamingkeydelivery"===i.attributes.KEYFORMAT)return this.manifest.contentProtection=this.manifest.contentProtection||{},void(this.manifest.contentProtection["com.apple.fps.1_0"]={attributes:i.attributes});if("com.microsoft.playready"===i.attributes.KEYFORMAT)return this.manifest.contentProtection=this.manifest.contentProtection||{},void(this.manifest.contentProtection["com.microsoft.playready"]={uri:i.attributes.URI});if("urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"===i.attributes.KEYFORMAT){return-1===["SAMPLE-AES","SAMPLE-AES-CTR","SAMPLE-AES-CENC"].indexOf(i.attributes.METHOD)?void this.trigger("warn",{message:"invalid key method provided for Widevine"}):("SAMPLE-AES-CENC"===i.attributes.METHOD&&this.trigger("warn",{message:"SAMPLE-AES-CENC is deprecated, please use SAMPLE-AES-CTR instead"}),"data:text/plain;base64,"!==i.attributes.URI.substring(0,23)?void this.trigger("warn",{message:"invalid key URI provided for Widevine"}):i.attributes.KEYID&&"0x"===i.attributes.KEYID.substring(0,2)?(this.manifest.contentProtection=this.manifest.contentProtection||{},void(this.manifest.contentProtection["com.widevine.alpha"]={attributes:{schemeIdUri:i.attributes.KEYFORMAT,keyId:i.attributes.KEYID.substring(2)},pssh:h(i.attributes.URI.split(",")[1])})):void this.trigger("warn",{message:"invalid key ID provided for Widevine"}))}i.attributes.METHOD||this.trigger("warn",{message:"defaulting key method to AES-128"}),s={method:i.attributes.METHOD||"AES-128",uri:i.attributes.URI},void 0!==i.attributes.IV&&(s.iv=i.attributes.IV)}else this.trigger("warn",{message:"ignoring key declaration without URI"});else s=null;else this.trigger("warn",{message:"ignoring key declaration without attribute list"})},"media-sequence"(){isFinite(i.number)?this.manifest.mediaSequence=i.number:this.trigger("warn",{message:"ignoring invalid media sequence: "+i.number})},"discontinuity-sequence"(){isFinite(i.number)?(this.manifest.discontinuitySequence=i.number,E=i.number):this.trigger("warn",{message:"ignoring invalid discontinuity sequence: "+i.number})},"playlist-type"(){/VOD|EVENT/.test(i.playlistType)?this.manifest.playlistType=i.playlistType:this.trigger("warn",{message:"ignoring unknown playlist type: "+i.playlist})},map(){a={},i.uri&&(a.uri=i.uri),i.byterange&&(a.byterange=i.byterange),s&&(a.key=s)},"stream-inf"(){this.manifest.playlists=e,this.manifest.mediaGroups=this.manifest.mediaGroups||f,i.attributes?(n.attributes||(n.attributes={}),r(n.attributes,i.attributes)):this.trigger("warn",{message:"ignoring empty stream-inf attributes"})},media(){if(this.manifest.mediaGroups=this.manifest.mediaGroups||f,!(i.attributes&&i.attributes.TYPE&&i.attributes["GROUP-ID"]&&i.attributes.NAME))return void this.trigger("warn",{message:"ignoring incomplete or missing media group"});const t=this.manifest.mediaGroups[i.attributes.TYPE];t[i.attributes["GROUP-ID"]]=t[i.attributes["GROUP-ID"]]||{},g=t[i.attributes["GROUP-ID"]],b={default:/yes/i.test(i.attributes.DEFAULT)},b.default?b.autoselect=!0:b.autoselect=/yes/i.test(i.attributes.AUTOSELECT),i.attributes.LANGUAGE&&(b.language=i.attributes.LANGUAGE),i.attributes.URI&&(b.uri=i.attributes.URI),i.attributes["INSTREAM-ID"]&&(b.instreamId=i.attributes["INSTREAM-ID"]),i.attributes.CHARACTERISTICS&&(b.characteristics=i.attributes.CHARACTERISTICS),i.attributes.FORCED&&(b.forced=/yes/i.test(i.attributes.FORCED)),g[i.attributes.NAME]=b},discontinuity(){E+=1,n.discontinuity=!0,this.manifest.discontinuityStarts.push(e.length)},"program-date-time"(){void 0===this.manifest.dateTimeString&&(this.manifest.dateTimeString=i.dateTimeString,this.manifest.dateTimeObject=i.dateTimeObject),n.dateTimeString=i.dateTimeString,n.dateTimeObject=i.dateTimeObject;const{lastProgramDateTime:t}=this;this.lastProgramDateTime=new Date(i.dateTimeString).getTime(),null===t&&this.manifest.segments.reduceRight(((t,e)=>(e.programDateTime=t-1e3*e.duration,e.programDateTime)),this.lastProgramDateTime)},targetduration(){!isFinite(i.duration)||i.duration<0?this.trigger("warn",{message:"ignoring invalid target duration: "+i.duration}):(this.manifest.targetDuration=i.duration,p.call(this,this.manifest))},start(){i.attributes&&!isNaN(i.attributes["TIME-OFFSET"])?this.manifest.start={timeOffset:i.attributes["TIME-OFFSET"],precise:i.attributes.PRECISE}:this.trigger("warn",{message:"ignoring start declaration without appropriate attribute list"})},"cue-out"(){n.cueOut=i.data},"cue-out-cont"(){n.cueOutCont=i.data},"cue-in"(){n.cueIn=i.data},skip(){this.manifest.skip=d(i.attributes),this.warnOnMissingAttributes_("#EXT-X-SKIP",i.attributes,["SKIPPED-SEGMENTS"])},part(){o=!0;const t=this.manifest.segments.length,e=d(i.attributes);n.parts=n.parts||[],n.parts.push(e),e.byterange&&(e.byterange.hasOwnProperty("offset")||(e.byterange.offset=T),T=e.byterange.offset+e.byterange.length);const a=n.parts.length-1;this.warnOnMissingAttributes_(`#EXT-X-PART #${a} for segment #${t}`,i.attributes,["URI","DURATION"]),this.manifest.renditionReports&&this.manifest.renditionReports.forEach(((t,e)=>{t.hasOwnProperty("lastPart")||this.trigger("warn",{message:`#EXT-X-RENDITION-REPORT #${e} lacks required attribute(s): LAST-PART`})}))},"server-control"(){const t=this.manifest.serverControl=d(i.attributes);t.hasOwnProperty("canBlockReload")||(t.canBlockReload=!1,this.trigger("info",{message:"#EXT-X-SERVER-CONTROL defaulting CAN-BLOCK-RELOAD to false"})),p.call(this,this.manifest),t.canSkipDateranges&&!t.hasOwnProperty("canSkipUntil")&&this.trigger("warn",{message:"#EXT-X-SERVER-CONTROL lacks required attribute CAN-SKIP-UNTIL which is required when CAN-SKIP-DATERANGES is set"})},"preload-hint"(){const t=this.manifest.segments.length,e=d(i.attributes),a=e.type&&"PART"===e.type;n.preloadHints=n.preloadHints||[],n.preloadHints.push(e),e.byterange&&(e.byterange.hasOwnProperty("offset")||(e.byterange.offset=a?T:0,a&&(T=e.byterange.offset+e.byterange.length)));const s=n.preloadHints.length-1;if(this.warnOnMissingAttributes_(`#EXT-X-PRELOAD-HINT #${s} for segment #${t}`,i.attributes,["TYPE","URI"]),e.type)for(let i=0;i<n.preloadHints.length-1;i++){const a=n.preloadHints[i];a.type&&(a.type===e.type&&this.trigger("warn",{message:`#EXT-X-PRELOAD-HINT #${s} for segment #${t} has the same TYPE ${e.type} as preload hint #${i}`}))}},"rendition-report"(){const t=d(i.attributes);this.manifest.renditionReports=this.manifest.renditionReports||[],this.manifest.renditionReports.push(t);const e=this.manifest.renditionReports.length-1,a=["LAST-MSN","URI"];o&&a.push("LAST-PART"),this.warnOnMissingAttributes_(`#EXT-X-RENDITION-REPORT #${e}`,i.attributes,a)},"part-inf"(){this.manifest.partInf=d(i.attributes),this.warnOnMissingAttributes_("#EXT-X-PART-INF",i.attributes,["PART-TARGET"]),this.manifest.partInf.partTarget&&(this.manifest.partTargetDuration=this.manifest.partInf.partTarget),p.call(this,this.manifest)},daterange(){this.manifest.dateRanges.push(d(i.attributes));const t=this.manifest.dateRanges.length-1;this.warnOnMissingAttributes_(`#EXT-X-DATERANGE #${t}`,i.attributes,["ID","START-DATE"]);const e=this.manifest.dateRanges[t];e.endDate&&e.startDate&&new Date(e.endDate)<new Date(e.startDate)&&this.trigger("warn",{message:"EXT-X-DATERANGE END-DATE must be equal to or later than the value of the START-DATE"}),e.duration&&e.duration<0&&this.trigger("warn",{message:"EXT-X-DATERANGE DURATION must not be negative"}),e.plannedDuration&&e.plannedDuration<0&&this.trigger("warn",{message:"EXT-X-DATERANGE PLANNED-DURATION must not be negative"});const a=!!e.endOnNext;if(a&&!e.class&&this.trigger("warn",{message:"EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must have a CLASS attribute"}),a&&(e.duration||e.endDate)&&this.trigger("warn",{message:"EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must not contain DURATION or END-DATE attributes"}),e.duration&&e.endDate){const i=e.startDate.getTime()+1e3*e.duration;this.manifest.dateRanges[t].endDate=new Date(i)}if(m[e.id]){for(const t in m[e.id])if(e[t]&&JSON.stringify(m[e.id][t])!==JSON.stringify(e[t])){this.trigger("warn",{message:"EXT-X-DATERANGE tags with the same ID in a playlist must have the same attributes values"});break}const t=this.manifest.dateRanges.findIndex((t=>t.id===e.id));this.manifest.dateRanges[t]=r(this.manifest.dateRanges[t],e),m[e.id]=r(m[e.id],e),this.manifest.dateRanges.pop()}else m[e.id]=e},"independent-segments"(){this.manifest.independentSegments=!0},"content-steering"(){this.manifest.contentSteering=d(i.attributes),this.warnOnMissingAttributes_("#EXT-X-CONTENT-STEERING",i.attributes,["SERVER-URI"])}}[i.tagType]||u).call(t)},uri(){n.uri=i.uri,n.lineNumberStart=l,n.lineNumberEnd=this.parseStream.lineNumber,e.push(n),this.manifest.targetDuration&&!("duration"in n)&&(this.trigger("warn",{message:"defaulting segment duration to the target duration"}),n.duration=this.manifest.targetDuration),s&&(n.key=s),n.timeline=E,a&&(n.map=a),T=0,null!==this.lastProgramDateTime&&(n.programDateTime=this.lastProgramDateTime,this.lastProgramDateTime+=1e3*n.duration),n={}},comment(){},custom(){i.segment?(n.custom=n.custom||{},n.custom[i.customType]=i.data):(this.manifest.custom=this.manifest.custom||{},this.manifest.custom[i.customType]=i.data)}}[i.type].call(t)}))}warnOnMissingAttributes_(t,e,i){const a=[];i.forEach((function(t){e.hasOwnProperty(t)||a.push(t)})),a.length&&this.trigger("warn",{message:`${t} lacks required attribute(s): ${a.join(", ")}`})}push(t){this.lineStream.push(t)}end(){this.lineStream.push("\n"),this.manifest.dateRanges.length&&null===this.lastProgramDateTime&&this.trigger("warn",{message:"A playlist with EXT-X-DATERANGE tag must contain atleast one EXT-X-PROGRAM-DATE-TIME tag"}),this.lastProgramDateTime=null,this.trigger("end")}addParser(t){this.parseStream.addParser(t)}addTagMapper(t){this.parseStream.addTagMapper(t)}},Object.defineProperty(t,"__esModule",{value:!0})}));
|
package/package.json
CHANGED
package/src/parse-stream.js
CHANGED
|
@@ -43,14 +43,9 @@ const attributeSeparator = function() {
|
|
|
43
43
|
* @param {string} attributes the attribute line to parse
|
|
44
44
|
*/
|
|
45
45
|
const parseAttributes = function(attributes) {
|
|
46
|
-
const result = {};
|
|
47
|
-
|
|
48
|
-
if (!attributes) {
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
46
|
// split the string using attributes as the separator
|
|
53
47
|
const attrs = attributes.split(attributeSeparator());
|
|
48
|
+
const result = {};
|
|
54
49
|
let i = attrs.length;
|
|
55
50
|
let attr;
|
|
56
51
|
|
|
@@ -171,7 +166,7 @@ export default class ParseStream extends Stream {
|
|
|
171
166
|
});
|
|
172
167
|
return;
|
|
173
168
|
}
|
|
174
|
-
match = (/^#EXTINF
|
|
169
|
+
match = (/^#EXTINF:?([0-9\.]*)?,?(.*)?$/).exec(newLine);
|
|
175
170
|
if (match) {
|
|
176
171
|
event = {
|
|
177
172
|
type: 'tag',
|
|
@@ -186,7 +181,7 @@ export default class ParseStream extends Stream {
|
|
|
186
181
|
this.trigger('data', event);
|
|
187
182
|
return;
|
|
188
183
|
}
|
|
189
|
-
match = (/^#EXT-X-TARGETDURATION
|
|
184
|
+
match = (/^#EXT-X-TARGETDURATION:?([0-9.]*)?/).exec(newLine);
|
|
190
185
|
if (match) {
|
|
191
186
|
event = {
|
|
192
187
|
type: 'tag',
|
|
@@ -198,7 +193,7 @@ export default class ParseStream extends Stream {
|
|
|
198
193
|
this.trigger('data', event);
|
|
199
194
|
return;
|
|
200
195
|
}
|
|
201
|
-
match = (/^#EXT-X-VERSION
|
|
196
|
+
match = (/^#EXT-X-VERSION:?([0-9.]*)?/).exec(newLine);
|
|
202
197
|
if (match) {
|
|
203
198
|
event = {
|
|
204
199
|
type: 'tag',
|
|
@@ -210,7 +205,7 @@ export default class ParseStream extends Stream {
|
|
|
210
205
|
this.trigger('data', event);
|
|
211
206
|
return;
|
|
212
207
|
}
|
|
213
|
-
match = (/^#EXT-X-MEDIA-SEQUENCE
|
|
208
|
+
match = (/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/).exec(newLine);
|
|
214
209
|
if (match) {
|
|
215
210
|
event = {
|
|
216
211
|
type: 'tag',
|
|
@@ -222,7 +217,7 @@ export default class ParseStream extends Stream {
|
|
|
222
217
|
this.trigger('data', event);
|
|
223
218
|
return;
|
|
224
219
|
}
|
|
225
|
-
match = (/^#EXT-X-DISCONTINUITY-SEQUENCE
|
|
220
|
+
match = (/^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/).exec(newLine);
|
|
226
221
|
if (match) {
|
|
227
222
|
event = {
|
|
228
223
|
type: 'tag',
|
|
@@ -234,7 +229,7 @@ export default class ParseStream extends Stream {
|
|
|
234
229
|
this.trigger('data', event);
|
|
235
230
|
return;
|
|
236
231
|
}
|
|
237
|
-
match = (/^#EXT-X-PLAYLIST-TYPE
|
|
232
|
+
match = (/^#EXT-X-PLAYLIST-TYPE:?(.*)?$/).exec(newLine);
|
|
238
233
|
if (match) {
|
|
239
234
|
event = {
|
|
240
235
|
type: 'tag',
|
|
@@ -246,7 +241,7 @@ export default class ParseStream extends Stream {
|
|
|
246
241
|
this.trigger('data', event);
|
|
247
242
|
return;
|
|
248
243
|
}
|
|
249
|
-
match = (/^#EXT-X-BYTERANGE
|
|
244
|
+
match = (/^#EXT-X-BYTERANGE:?(.*)?$/).exec(newLine);
|
|
250
245
|
if (match) {
|
|
251
246
|
event = Object.assign(parseByterange(match[1]), {
|
|
252
247
|
type: 'tag',
|
|
@@ -255,7 +250,7 @@ export default class ParseStream extends Stream {
|
|
|
255
250
|
this.trigger('data', event);
|
|
256
251
|
return;
|
|
257
252
|
}
|
|
258
|
-
match = (/^#EXT-X-ALLOW-CACHE
|
|
253
|
+
match = (/^#EXT-X-ALLOW-CACHE:?(YES|NO)?/).exec(newLine);
|
|
259
254
|
if (match) {
|
|
260
255
|
event = {
|
|
261
256
|
type: 'tag',
|
|
@@ -267,7 +262,7 @@ export default class ParseStream extends Stream {
|
|
|
267
262
|
this.trigger('data', event);
|
|
268
263
|
return;
|
|
269
264
|
}
|
|
270
|
-
match = (/^#EXT-X-MAP
|
|
265
|
+
match = (/^#EXT-X-MAP:?(.*)$/).exec(newLine);
|
|
271
266
|
if (match) {
|
|
272
267
|
event = {
|
|
273
268
|
type: 'tag',
|
|
@@ -288,7 +283,7 @@ export default class ParseStream extends Stream {
|
|
|
288
283
|
this.trigger('data', event);
|
|
289
284
|
return;
|
|
290
285
|
}
|
|
291
|
-
match = (/^#EXT-X-STREAM-INF
|
|
286
|
+
match = (/^#EXT-X-STREAM-INF:?(.*)$/).exec(newLine);
|
|
292
287
|
if (match) {
|
|
293
288
|
event = {
|
|
294
289
|
type: 'tag',
|
|
@@ -312,9 +307,6 @@ export default class ParseStream extends Stream {
|
|
|
312
307
|
if (event.attributes.BANDWIDTH) {
|
|
313
308
|
event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);
|
|
314
309
|
}
|
|
315
|
-
if (event.attributes['FRAME-RATE']) {
|
|
316
|
-
event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);
|
|
317
|
-
}
|
|
318
310
|
if (event.attributes['PROGRAM-ID']) {
|
|
319
311
|
event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);
|
|
320
312
|
}
|
|
@@ -322,7 +314,7 @@ export default class ParseStream extends Stream {
|
|
|
322
314
|
this.trigger('data', event);
|
|
323
315
|
return;
|
|
324
316
|
}
|
|
325
|
-
match = (/^#EXT-X-MEDIA
|
|
317
|
+
match = (/^#EXT-X-MEDIA:?(.*)$/).exec(newLine);
|
|
326
318
|
if (match) {
|
|
327
319
|
event = {
|
|
328
320
|
type: 'tag',
|
|
@@ -350,7 +342,7 @@ export default class ParseStream extends Stream {
|
|
|
350
342
|
});
|
|
351
343
|
return;
|
|
352
344
|
}
|
|
353
|
-
match = (/^#EXT-X-PROGRAM-DATE-TIME
|
|
345
|
+
match = (/^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/).exec(newLine);
|
|
354
346
|
if (match) {
|
|
355
347
|
event = {
|
|
356
348
|
type: 'tag',
|
|
@@ -363,7 +355,7 @@ export default class ParseStream extends Stream {
|
|
|
363
355
|
this.trigger('data', event);
|
|
364
356
|
return;
|
|
365
357
|
}
|
|
366
|
-
match = (/^#EXT-X-KEY
|
|
358
|
+
match = (/^#EXT-X-KEY:?(.*)$/).exec(newLine);
|
|
367
359
|
if (match) {
|
|
368
360
|
event = {
|
|
369
361
|
type: 'tag',
|
|
@@ -388,7 +380,7 @@ export default class ParseStream extends Stream {
|
|
|
388
380
|
this.trigger('data', event);
|
|
389
381
|
return;
|
|
390
382
|
}
|
|
391
|
-
match = (/^#EXT-X-START
|
|
383
|
+
match = (/^#EXT-X-START:?(.*)$/).exec(newLine);
|
|
392
384
|
if (match) {
|
|
393
385
|
event = {
|
|
394
386
|
type: 'tag',
|
|
@@ -403,7 +395,7 @@ export default class ParseStream extends Stream {
|
|
|
403
395
|
this.trigger('data', event);
|
|
404
396
|
return;
|
|
405
397
|
}
|
|
406
|
-
match = (/^#EXT-X-CUE-OUT-CONT
|
|
398
|
+
match = (/^#EXT-X-CUE-OUT-CONT:?(.*)?$/).exec(newLine);
|
|
407
399
|
if (match) {
|
|
408
400
|
event = {
|
|
409
401
|
type: 'tag',
|
|
@@ -417,7 +409,7 @@ export default class ParseStream extends Stream {
|
|
|
417
409
|
this.trigger('data', event);
|
|
418
410
|
return;
|
|
419
411
|
}
|
|
420
|
-
match = (/^#EXT-X-CUE-OUT
|
|
412
|
+
match = (/^#EXT-X-CUE-OUT:?(.*)?$/).exec(newLine);
|
|
421
413
|
if (match) {
|
|
422
414
|
event = {
|
|
423
415
|
type: 'tag',
|
|
@@ -431,7 +423,7 @@ export default class ParseStream extends Stream {
|
|
|
431
423
|
this.trigger('data', event);
|
|
432
424
|
return;
|
|
433
425
|
}
|
|
434
|
-
match = (/^#EXT-X-CUE-IN
|
|
426
|
+
match = (/^#EXT-X-CUE-IN:?(.*)?$/).exec(newLine);
|
|
435
427
|
if (match) {
|
|
436
428
|
event = {
|
|
437
429
|
type: 'tag',
|
|
@@ -61,7 +61,7 @@ module.exports = {
|
|
|
61
61
|
width: 960,
|
|
62
62
|
height: 540
|
|
63
63
|
},
|
|
64
|
-
'FRAME-RATE': 59.940,
|
|
64
|
+
'FRAME-RATE': '59.940',
|
|
65
65
|
'CLOSED-CAPTIONS': 'cc1',
|
|
66
66
|
'AUDIO': 'aud1',
|
|
67
67
|
'SUBTITLES': 'sub1'
|
|
@@ -77,7 +77,7 @@ module.exports = {
|
|
|
77
77
|
'BANDWIDTH': 7976430,
|
|
78
78
|
'CLOSED-CAPTIONS': 'cc1',
|
|
79
79
|
'CODECS': 'avc1.64002a,mp4a.40.2',
|
|
80
|
-
'FRAME-RATE': 59.940,
|
|
80
|
+
'FRAME-RATE': '59.940',
|
|
81
81
|
'RESOLUTION': {
|
|
82
82
|
height: 1080,
|
|
83
83
|
width: 1920
|
|
@@ -94,7 +94,7 @@ module.exports = {
|
|
|
94
94
|
'BANDWIDTH': 6181885,
|
|
95
95
|
'CLOSED-CAPTIONS': 'cc1',
|
|
96
96
|
'CODECS': 'avc1.64002a,mp4a.40.2',
|
|
97
|
-
'FRAME-RATE': 59.940,
|
|
97
|
+
'FRAME-RATE': '59.940',
|
|
98
98
|
'RESOLUTION': {
|
|
99
99
|
height: 1080,
|
|
100
100
|
width: 1920
|
|
@@ -111,7 +111,7 @@ module.exports = {
|
|
|
111
111
|
'BANDWIDTH': 4682666,
|
|
112
112
|
'CLOSED-CAPTIONS': 'cc1',
|
|
113
113
|
'CODECS': 'avc1.64002a,mp4a.40.2',
|
|
114
|
-
'FRAME-RATE': 59.940,
|
|
114
|
+
'FRAME-RATE': '59.940',
|
|
115
115
|
'RESOLUTION': {
|
|
116
116
|
height: 1080,
|
|
117
117
|
width: 1920
|
|
@@ -128,7 +128,7 @@ module.exports = {
|
|
|
128
128
|
'BANDWIDTH': 3170746,
|
|
129
129
|
'CLOSED-CAPTIONS': 'cc1',
|
|
130
130
|
'CODECS': 'avc1.640020,mp4a.40.2',
|
|
131
|
-
'FRAME-RATE': 59.940,
|
|
131
|
+
'FRAME-RATE': '59.940',
|
|
132
132
|
'RESOLUTION': {
|
|
133
133
|
height: 720,
|
|
134
134
|
width: 1280
|
|
@@ -145,7 +145,7 @@ module.exports = {
|
|
|
145
145
|
'BANDWIDTH': 1276223,
|
|
146
146
|
'CLOSED-CAPTIONS': 'cc1',
|
|
147
147
|
'CODECS': 'avc1.64001e,mp4a.40.2',
|
|
148
|
-
'FRAME-RATE': 29.970,
|
|
148
|
+
'FRAME-RATE': '29.970',
|
|
149
149
|
'RESOLUTION': {
|
|
150
150
|
height: 432,
|
|
151
151
|
width: 768
|
|
@@ -162,7 +162,7 @@ module.exports = {
|
|
|
162
162
|
'BANDWIDTH': 904744,
|
|
163
163
|
'CLOSED-CAPTIONS': 'cc1',
|
|
164
164
|
'CODECS': 'avc1.64001e,mp4a.40.2',
|
|
165
|
-
'FRAME-RATE': 29.970,
|
|
165
|
+
'FRAME-RATE': '29.970',
|
|
166
166
|
'RESOLUTION': {
|
|
167
167
|
height: 360,
|
|
168
168
|
width: 640
|
|
@@ -179,7 +179,7 @@ module.exports = {
|
|
|
179
179
|
'BANDWIDTH': 538201,
|
|
180
180
|
'CLOSED-CAPTIONS': 'cc1',
|
|
181
181
|
'CODECS': 'avc1.640015,mp4a.40.2',
|
|
182
|
-
'FRAME-RATE': 29.970,
|
|
182
|
+
'FRAME-RATE': '29.970',
|
|
183
183
|
'RESOLUTION': {
|
|
184
184
|
height: 270,
|
|
185
185
|
width: 480
|
|
@@ -196,7 +196,7 @@ module.exports = {
|
|
|
196
196
|
'BANDWIDTH': 2440329,
|
|
197
197
|
'CLOSED-CAPTIONS': 'cc1',
|
|
198
198
|
'CODECS': 'avc1.640020,ac-3',
|
|
199
|
-
'FRAME-RATE': 59.940,
|
|
199
|
+
'FRAME-RATE': '59.940',
|
|
200
200
|
'RESOLUTION': {
|
|
201
201
|
height: 540,
|
|
202
202
|
width: 960
|
|
@@ -213,7 +213,7 @@ module.exports = {
|
|
|
213
213
|
'BANDWIDTH': 8201540,
|
|
214
214
|
'CLOSED-CAPTIONS': 'cc1',
|
|
215
215
|
'CODECS': 'avc1.64002a,ac-3',
|
|
216
|
-
'FRAME-RATE': 59.940,
|
|
216
|
+
'FRAME-RATE': '59.940',
|
|
217
217
|
'RESOLUTION': {
|
|
218
218
|
height: 1080,
|
|
219
219
|
width: 1920
|
|
@@ -230,7 +230,7 @@ module.exports = {
|
|
|
230
230
|
'BANDWIDTH': 6406995,
|
|
231
231
|
'CLOSED-CAPTIONS': 'cc1',
|
|
232
232
|
'CODECS': 'avc1.64002a,ac-3',
|
|
233
|
-
'FRAME-RATE': 59.940,
|
|
233
|
+
'FRAME-RATE': '59.940',
|
|
234
234
|
'RESOLUTION': {
|
|
235
235
|
height: 1080,
|
|
236
236
|
width: 1920
|
|
@@ -247,7 +247,7 @@ module.exports = {
|
|
|
247
247
|
'BANDWIDTH': 4907776,
|
|
248
248
|
'CLOSED-CAPTIONS': 'cc1',
|
|
249
249
|
'CODECS': 'avc1.64002a,ac-3',
|
|
250
|
-
'FRAME-RATE': 59.940,
|
|
250
|
+
'FRAME-RATE': '59.940',
|
|
251
251
|
'RESOLUTION': {
|
|
252
252
|
height: 1080,
|
|
253
253
|
width: 1920
|
|
@@ -264,7 +264,7 @@ module.exports = {
|
|
|
264
264
|
'BANDWIDTH': 3395856,
|
|
265
265
|
'CLOSED-CAPTIONS': 'cc1',
|
|
266
266
|
'CODECS': 'avc1.640020,ac-3',
|
|
267
|
-
'FRAME-RATE': 59.940,
|
|
267
|
+
'FRAME-RATE': '59.940',
|
|
268
268
|
'RESOLUTION': {
|
|
269
269
|
height: 720,
|
|
270
270
|
width: 1280
|
|
@@ -281,7 +281,7 @@ module.exports = {
|
|
|
281
281
|
'BANDWIDTH': 1501333,
|
|
282
282
|
'CLOSED-CAPTIONS': 'cc1',
|
|
283
283
|
'CODECS': 'avc1.64001e,ac-3',
|
|
284
|
-
'FRAME-RATE': 29.970,
|
|
284
|
+
'FRAME-RATE': '29.970',
|
|
285
285
|
'RESOLUTION': {
|
|
286
286
|
height: 432,
|
|
287
287
|
width: 768
|
|
@@ -298,7 +298,7 @@ module.exports = {
|
|
|
298
298
|
'BANDWIDTH': 1129854,
|
|
299
299
|
'CLOSED-CAPTIONS': 'cc1',
|
|
300
300
|
'CODECS': 'avc1.64001e,ac-3',
|
|
301
|
-
'FRAME-RATE': 29.970,
|
|
301
|
+
'FRAME-RATE': '29.970',
|
|
302
302
|
'RESOLUTION': {
|
|
303
303
|
height: 360,
|
|
304
304
|
width: 640
|
|
@@ -315,7 +315,7 @@ module.exports = {
|
|
|
315
315
|
'BANDWIDTH': 763311,
|
|
316
316
|
'CLOSED-CAPTIONS': 'cc1',
|
|
317
317
|
'CODECS': 'avc1.640015,ac-3',
|
|
318
|
-
'FRAME-RATE': 29.970,
|
|
318
|
+
'FRAME-RATE': '29.970',
|
|
319
319
|
'RESOLUTION': {
|
|
320
320
|
height: 270,
|
|
321
321
|
width: 480
|
|
@@ -332,7 +332,7 @@ module.exports = {
|
|
|
332
332
|
'BANDWIDTH': 2248329,
|
|
333
333
|
'CLOSED-CAPTIONS': 'cc1',
|
|
334
334
|
'CODECS': 'avc1.640020,ec-3',
|
|
335
|
-
'FRAME-RATE': 59.940,
|
|
335
|
+
'FRAME-RATE': '59.940',
|
|
336
336
|
'RESOLUTION': {
|
|
337
337
|
height: 540,
|
|
338
338
|
width: 960
|
|
@@ -349,7 +349,7 @@ module.exports = {
|
|
|
349
349
|
'BANDWIDTH': 8009540,
|
|
350
350
|
'CLOSED-CAPTIONS': 'cc1',
|
|
351
351
|
'CODECS': 'avc1.64002a,ec-3',
|
|
352
|
-
'FRAME-RATE': 59.940,
|
|
352
|
+
'FRAME-RATE': '59.940',
|
|
353
353
|
'RESOLUTION': {
|
|
354
354
|
height: 1080,
|
|
355
355
|
width: 1920
|
|
@@ -366,7 +366,7 @@ module.exports = {
|
|
|
366
366
|
'BANDWIDTH': 6214995,
|
|
367
367
|
'CLOSED-CAPTIONS': 'cc1',
|
|
368
368
|
'CODECS': 'avc1.64002a,ec-3',
|
|
369
|
-
'FRAME-RATE': 59.940,
|
|
369
|
+
'FRAME-RATE': '59.940',
|
|
370
370
|
'RESOLUTION': {
|
|
371
371
|
height: 1080,
|
|
372
372
|
width: 1920
|
|
@@ -383,7 +383,7 @@ module.exports = {
|
|
|
383
383
|
'BANDWIDTH': 4715776,
|
|
384
384
|
'CLOSED-CAPTIONS': 'cc1',
|
|
385
385
|
'CODECS': 'avc1.64002a,ec-3',
|
|
386
|
-
'FRAME-RATE': 59.940,
|
|
386
|
+
'FRAME-RATE': '59.940',
|
|
387
387
|
'RESOLUTION': {
|
|
388
388
|
height: 1080,
|
|
389
389
|
width: 1920
|
|
@@ -400,7 +400,7 @@ module.exports = {
|
|
|
400
400
|
'BANDWIDTH': 3203856,
|
|
401
401
|
'CLOSED-CAPTIONS': 'cc1',
|
|
402
402
|
'CODECS': 'avc1.640020,ec-3',
|
|
403
|
-
'FRAME-RATE': 59.940,
|
|
403
|
+
'FRAME-RATE': '59.940',
|
|
404
404
|
'RESOLUTION': {
|
|
405
405
|
height: 720,
|
|
406
406
|
width: 1280
|
|
@@ -417,7 +417,7 @@ module.exports = {
|
|
|
417
417
|
'BANDWIDTH': 1309333,
|
|
418
418
|
'CLOSED-CAPTIONS': 'cc1',
|
|
419
419
|
'CODECS': 'avc1.64001e,ec-3',
|
|
420
|
-
'FRAME-RATE': 29.970,
|
|
420
|
+
'FRAME-RATE': '29.970',
|
|
421
421
|
'RESOLUTION': {
|
|
422
422
|
height: 432,
|
|
423
423
|
width: 768
|
|
@@ -434,7 +434,7 @@ module.exports = {
|
|
|
434
434
|
'BANDWIDTH': 937854,
|
|
435
435
|
'CLOSED-CAPTIONS': 'cc1',
|
|
436
436
|
'CODECS': 'avc1.64001e,ec-3',
|
|
437
|
-
'FRAME-RATE': 29.970,
|
|
437
|
+
'FRAME-RATE': '29.970',
|
|
438
438
|
'RESOLUTION': {
|
|
439
439
|
height: 360,
|
|
440
440
|
width: 640
|
|
@@ -451,7 +451,7 @@ module.exports = {
|
|
|
451
451
|
'BANDWIDTH': 571311,
|
|
452
452
|
'CLOSED-CAPTIONS': 'cc1',
|
|
453
453
|
'CODECS': 'avc1.640015,ec-3',
|
|
454
|
-
'FRAME-RATE': 29.970,
|
|
454
|
+
'FRAME-RATE': '29.970',
|
|
455
455
|
'RESOLUTION': {
|
|
456
456
|
height: 270,
|
|
457
457
|
width: 480
|
|
@@ -242,7 +242,7 @@ QUnit.test('parses #EXTM3U tags', function(assert) {
|
|
|
242
242
|
|
|
243
243
|
// #EXTINF
|
|
244
244
|
QUnit.test('parses minimal #EXTINF tags', function(assert) {
|
|
245
|
-
const manifest = '#EXTINF
|
|
245
|
+
const manifest = '#EXTINF\n';
|
|
246
246
|
let element;
|
|
247
247
|
|
|
248
248
|
this.parseStream.on('data', function(elem) {
|
|
@@ -319,7 +319,7 @@ QUnit.test('parses #EXTINF tags with carriage returns', function(assert) {
|
|
|
319
319
|
|
|
320
320
|
// #EXT-X-TARGETDURATION
|
|
321
321
|
QUnit.test('parses minimal #EXT-X-TARGETDURATION tags', function(assert) {
|
|
322
|
-
const manifest = '#EXT-X-TARGETDURATION
|
|
322
|
+
const manifest = '#EXT-X-TARGETDURATION\n';
|
|
323
323
|
let element;
|
|
324
324
|
|
|
325
325
|
this.parseStream.on('data', function(elem) {
|
|
@@ -379,7 +379,7 @@ QUnit.test('parses #EXT-X-VERSION with a version', function(assert) {
|
|
|
379
379
|
|
|
380
380
|
// #EXT-X-MEDIA-SEQUENCE
|
|
381
381
|
QUnit.test('parses minimal #EXT-X-MEDIA-SEQUENCE tags', function(assert) {
|
|
382
|
-
const manifest = '#EXT-X-MEDIA-SEQUENCE
|
|
382
|
+
const manifest = '#EXT-X-MEDIA-SEQUENCE\n';
|
|
383
383
|
let element;
|
|
384
384
|
|
|
385
385
|
this.parseStream.on('data', function(elem) {
|
|
@@ -453,7 +453,7 @@ QUnit.test('parses #EXT-X-PLAYLIST-TYPE with mutability info', function(assert)
|
|
|
453
453
|
|
|
454
454
|
// #EXT-X-BYTERANGE
|
|
455
455
|
QUnit.test('parses minimal #EXT-X-BYTERANGE tags', function(assert) {
|
|
456
|
-
const manifest = '#EXT-X-BYTERANGE
|
|
456
|
+
const manifest = '#EXT-X-BYTERANGE\n';
|
|
457
457
|
let element;
|
|
458
458
|
|
|
459
459
|
this.parseStream.on('data', function(elem) {
|
|
@@ -589,7 +589,7 @@ QUnit.test('parses #EXT-X-MAP tags with arbitrary attributes', function(assert)
|
|
|
589
589
|
});
|
|
590
590
|
// #EXT-X-STREAM-INF
|
|
591
591
|
QUnit.test('parses minimal #EXT-X-STREAM-INF tags', function(assert) {
|
|
592
|
-
const manifest = '#EXT-X-STREAM-INF
|
|
592
|
+
const manifest = '#EXT-X-STREAM-INF\n';
|
|
593
593
|
let element;
|
|
594
594
|
|
|
595
595
|
this.parseStream.on('data', function(elem) {
|
|
@@ -604,7 +604,7 @@ QUnit.test('parses minimal #EXT-X-STREAM-INF tags', function(assert) {
|
|
|
604
604
|
});
|
|
605
605
|
// #EXT-X-PROGRAM-DATE-TIME
|
|
606
606
|
QUnit.test('parses minimal EXT-X-PROGRAM-DATE-TIME tags', function(assert) {
|
|
607
|
-
const manifest = '#EXT-X-PROGRAM-DATE-TIME
|
|
607
|
+
const manifest = '#EXT-X-PROGRAM-DATE-TIME\n';
|
|
608
608
|
let element;
|
|
609
609
|
|
|
610
610
|
this.parseStream.on('data', function(elem) {
|
|
@@ -817,6 +817,16 @@ QUnit.test('parses lightly-broken #EXT-X-KEY tags', function(assert) {
|
|
|
817
817
|
'parsed a single-quoted uri'
|
|
818
818
|
);
|
|
819
819
|
|
|
820
|
+
element = null;
|
|
821
|
+
manifest = '#EXT-X-KEYURI="https://example.com/key",METHOD=AES-128\n';
|
|
822
|
+
this.lineStream.push(manifest);
|
|
823
|
+
assert.strictEqual(element.tagType, 'key', 'parsed the tag type');
|
|
824
|
+
assert.strictEqual(
|
|
825
|
+
element.attributes.URI,
|
|
826
|
+
'https://example.com/key',
|
|
827
|
+
'inferred a colon after the tag type'
|
|
828
|
+
);
|
|
829
|
+
|
|
820
830
|
element = null;
|
|
821
831
|
manifest = '#EXT-X-KEY: URI = "https://example.com/key",METHOD=AES-128\n';
|
|
822
832
|
this.lineStream.push(manifest);
|
package/test/parser.test.js
CHANGED
|
@@ -108,10 +108,11 @@ QUnit.module('m3u8s', function(hooks) {
|
|
|
108
108
|
'#EXT-X-CUE-OUT:10',
|
|
109
109
|
'#EXTINF:5,',
|
|
110
110
|
'ex2.ts',
|
|
111
|
+
'#EXT-X-CUE-OUT15',
|
|
111
112
|
'#EXT-UKNOWN-TAG',
|
|
112
113
|
'#EXTINF:5,',
|
|
113
114
|
'ex3.ts',
|
|
114
|
-
'#EXT-X-CUE-OUT
|
|
115
|
+
'#EXT-X-CUE-OUT',
|
|
115
116
|
'#EXTINF:5,',
|
|
116
117
|
'ex3.ts',
|
|
117
118
|
'#EXT-X-ENDLIST'
|
|
@@ -121,6 +122,7 @@ QUnit.module('m3u8s', function(hooks) {
|
|
|
121
122
|
this.parser.end();
|
|
122
123
|
|
|
123
124
|
assert.equal(this.parser.manifest.segments[1].cueOut, '10', 'parser attached cue out tag');
|
|
125
|
+
assert.equal(this.parser.manifest.segments[2].cueOut, '15', 'cue out without : seperator');
|
|
124
126
|
assert.equal(this.parser.manifest.segments[3].cueOut, '', 'cue out without data');
|
|
125
127
|
});
|
|
126
128
|
|
|
@@ -133,10 +135,11 @@ QUnit.module('m3u8s', function(hooks) {
|
|
|
133
135
|
'#EXT-X-CUE-OUT-CONT:10/60',
|
|
134
136
|
'#EXTINF:5,',
|
|
135
137
|
'ex2.ts',
|
|
138
|
+
'#EXT-X-CUE-OUT-CONT15/30',
|
|
136
139
|
'#EXT-UKNOWN-TAG',
|
|
137
140
|
'#EXTINF:5,',
|
|
138
141
|
'ex3.ts',
|
|
139
|
-
'#EXT-X-CUE-OUT-CONT
|
|
142
|
+
'#EXT-X-CUE-OUT-CONT',
|
|
140
143
|
'#EXTINF:5,',
|
|
141
144
|
'ex3.ts',
|
|
142
145
|
'#EXT-X-ENDLIST'
|
|
@@ -149,6 +152,10 @@ QUnit.module('m3u8s', function(hooks) {
|
|
|
149
152
|
this.parser.manifest.segments[1].cueOutCont, '10/60',
|
|
150
153
|
'parser attached cue out cont tag'
|
|
151
154
|
);
|
|
155
|
+
assert.equal(
|
|
156
|
+
this.parser.manifest.segments[2].cueOutCont, '15/30',
|
|
157
|
+
'cue out cont without : seperator'
|
|
158
|
+
);
|
|
152
159
|
assert.equal(this.parser.manifest.segments[3].cueOutCont, '', 'cue out cont without data');
|
|
153
160
|
});
|
|
154
161
|
|
|
@@ -158,13 +165,14 @@ QUnit.module('m3u8s', function(hooks) {
|
|
|
158
165
|
'#EXTINF:5,',
|
|
159
166
|
'#COMMENT',
|
|
160
167
|
'ex1.ts',
|
|
161
|
-
'#EXT-X-CUE-IN
|
|
168
|
+
'#EXT-X-CUE-IN',
|
|
162
169
|
'#EXTINF:5,',
|
|
163
170
|
'ex2.ts',
|
|
164
171
|
'#EXT-X-CUE-IN:15',
|
|
165
172
|
'#EXT-UKNOWN-TAG',
|
|
166
173
|
'#EXTINF:5,',
|
|
167
174
|
'ex3.ts',
|
|
175
|
+
'#EXT-X-CUE-IN=abc',
|
|
168
176
|
'#EXTINF:5,',
|
|
169
177
|
'ex3.ts',
|
|
170
178
|
'#EXT-X-ENDLIST'
|
|
@@ -175,6 +183,10 @@ QUnit.module('m3u8s', function(hooks) {
|
|
|
175
183
|
|
|
176
184
|
assert.equal(this.parser.manifest.segments[1].cueIn, '', 'parser attached cue in tag');
|
|
177
185
|
assert.equal(this.parser.manifest.segments[2].cueIn, '15', 'cue in with data');
|
|
186
|
+
assert.equal(
|
|
187
|
+
this.parser.manifest.segments[3].cueIn, '=abc',
|
|
188
|
+
'cue in without colon seperator'
|
|
189
|
+
);
|
|
178
190
|
});
|
|
179
191
|
|
|
180
192
|
QUnit.test('parses characteristics attribute', function(assert) {
|