@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.
@@ -1,4 +1,4 @@
1
- /*! @name @transmitlive/m3u8-parser @version 7.1.0-1 @license Apache-2.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
- const result = {};
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:([0-9\.]*)?,?(.*)?$/.exec(newLine);
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:([0-9.]*)?/.exec(newLine);
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:([0-9.]*)?/.exec(newLine);
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:(\-?[0-9.]*)?/.exec(newLine);
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:(\-?[0-9.]*)?/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(YES|NO)?/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
543
+ match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
553
544
 
554
545
  if (match) {
555
546
  event = {
@@ -1,4 +1,4 @@
1
- /*! @name @transmitlive/m3u8-parser @version 7.1.0-1 @license Apache-2.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
- const result = {};
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:([0-9\.]*)?,?(.*)?$/.exec(newLine);
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:([0-9.]*)?/.exec(newLine);
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:([0-9.]*)?/.exec(newLine);
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:(\-?[0-9.]*)?/.exec(newLine);
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:(\-?[0-9.]*)?/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(YES|NO)?/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
533
+ match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
543
534
 
544
535
  if (match) {
545
536
  event = {
@@ -1,4 +1,4 @@
1
- /*! @name @transmitlive/m3u8-parser @version 7.1.0-1 @license Apache-2.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
- const result = {};
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:([0-9\.]*)?,?(.*)?$/.exec(newLine);
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:([0-9.]*)?/.exec(newLine);
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:([0-9.]*)?/.exec(newLine);
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:(\-?[0-9.]*)?/.exec(newLine);
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:(\-?[0-9.]*)?/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(YES|NO)?/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
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:(.*)?$/.exec(newLine);
676
+ match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
686
677
 
687
678
  if (match) {
688
679
  event = {
@@ -1,2 +1,2 @@
1
- /*! @name @transmitlive/m3u8-parser @version 7.1.0-1 @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),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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transmitlive/m3u8-parser",
3
- "version": "7.1.0-1",
3
+ "version": "7.1.0-3",
4
4
  "description": "m3u8 parser",
5
5
  "main": "dist/m3u8-parser.cjs.js",
6
6
  "module": "dist/m3u8-parser.es.js",
@@ -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:([0-9\.]*)?,?(.*)?$/).exec(newLine);
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:([0-9.]*)?/).exec(newLine);
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:([0-9.]*)?/).exec(newLine);
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:(\-?[0-9.]*)?/).exec(newLine);
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:(\-?[0-9.]*)?/).exec(newLine);
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:(.*)?$/).exec(newLine);
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:(.*)?$/).exec(newLine);
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:(YES|NO)?/).exec(newLine);
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:(.*)$/).exec(newLine);
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:(.*)$/).exec(newLine);
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:(.*)$/).exec(newLine);
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:(.*)$/).exec(newLine);
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:(.*)$/).exec(newLine);
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:(.*)$/).exec(newLine);
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:(.*)?$/).exec(newLine);
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:(.*)?$/).exec(newLine);
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:(.*)?$/).exec(newLine);
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:\n';
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:\n';
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:\n';
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:\n';
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:\n';
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:\n';
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);
@@ -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) {