@transmitlive/m3u8-parser 7.1.0-1 → 7.1.0-2
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 -25
- package/dist/m3u8-parser.es.js +20 -25
- package/dist/m3u8-parser.js +20 -25
- package/dist/m3u8-parser.min.js +2 -2
- package/package.json +1 -1
- package/src/parse-stream.js +18 -23
- 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-2 @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 = {
|
|
@@ -413,7 +408,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
413
408
|
return;
|
|
414
409
|
}
|
|
415
410
|
|
|
416
|
-
match = /^#EXT-X-MEDIA
|
|
411
|
+
match = /^#EXT-X-MEDIA:?(.*)$/.exec(newLine);
|
|
417
412
|
|
|
418
413
|
if (match) {
|
|
419
414
|
event = {
|
|
@@ -449,7 +444,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
449
444
|
return;
|
|
450
445
|
}
|
|
451
446
|
|
|
452
|
-
match = /^#EXT-X-PROGRAM-DATE-TIME
|
|
447
|
+
match = /^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(newLine);
|
|
453
448
|
|
|
454
449
|
if (match) {
|
|
455
450
|
event = {
|
|
@@ -466,7 +461,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
466
461
|
return;
|
|
467
462
|
}
|
|
468
463
|
|
|
469
|
-
match = /^#EXT-X-KEY
|
|
464
|
+
match = /^#EXT-X-KEY:?(.*)$/.exec(newLine);
|
|
470
465
|
|
|
471
466
|
if (match) {
|
|
472
467
|
event = {
|
|
@@ -495,7 +490,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
495
490
|
return;
|
|
496
491
|
}
|
|
497
492
|
|
|
498
|
-
match = /^#EXT-X-START
|
|
493
|
+
match = /^#EXT-X-START:?(.*)$/.exec(newLine);
|
|
499
494
|
|
|
500
495
|
if (match) {
|
|
501
496
|
event = {
|
|
@@ -513,7 +508,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
513
508
|
return;
|
|
514
509
|
}
|
|
515
510
|
|
|
516
|
-
match = /^#EXT-X-CUE-OUT-CONT
|
|
511
|
+
match = /^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(newLine);
|
|
517
512
|
|
|
518
513
|
if (match) {
|
|
519
514
|
event = {
|
|
@@ -531,7 +526,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
531
526
|
return;
|
|
532
527
|
}
|
|
533
528
|
|
|
534
|
-
match = /^#EXT-X-CUE-OUT
|
|
529
|
+
match = /^#EXT-X-CUE-OUT:?(.*)?$/.exec(newLine);
|
|
535
530
|
|
|
536
531
|
if (match) {
|
|
537
532
|
event = {
|
|
@@ -549,7 +544,7 @@ class ParseStream extends Stream__default["default"] {
|
|
|
549
544
|
return;
|
|
550
545
|
}
|
|
551
546
|
|
|
552
|
-
match = /^#EXT-X-CUE-IN
|
|
547
|
+
match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
|
|
553
548
|
|
|
554
549
|
if (match) {
|
|
555
550
|
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-2 @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 = {
|
|
@@ -403,7 +398,7 @@ class ParseStream extends Stream {
|
|
|
403
398
|
return;
|
|
404
399
|
}
|
|
405
400
|
|
|
406
|
-
match = /^#EXT-X-MEDIA
|
|
401
|
+
match = /^#EXT-X-MEDIA:?(.*)$/.exec(newLine);
|
|
407
402
|
|
|
408
403
|
if (match) {
|
|
409
404
|
event = {
|
|
@@ -439,7 +434,7 @@ class ParseStream extends Stream {
|
|
|
439
434
|
return;
|
|
440
435
|
}
|
|
441
436
|
|
|
442
|
-
match = /^#EXT-X-PROGRAM-DATE-TIME
|
|
437
|
+
match = /^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(newLine);
|
|
443
438
|
|
|
444
439
|
if (match) {
|
|
445
440
|
event = {
|
|
@@ -456,7 +451,7 @@ class ParseStream extends Stream {
|
|
|
456
451
|
return;
|
|
457
452
|
}
|
|
458
453
|
|
|
459
|
-
match = /^#EXT-X-KEY
|
|
454
|
+
match = /^#EXT-X-KEY:?(.*)$/.exec(newLine);
|
|
460
455
|
|
|
461
456
|
if (match) {
|
|
462
457
|
event = {
|
|
@@ -485,7 +480,7 @@ class ParseStream extends Stream {
|
|
|
485
480
|
return;
|
|
486
481
|
}
|
|
487
482
|
|
|
488
|
-
match = /^#EXT-X-START
|
|
483
|
+
match = /^#EXT-X-START:?(.*)$/.exec(newLine);
|
|
489
484
|
|
|
490
485
|
if (match) {
|
|
491
486
|
event = {
|
|
@@ -503,7 +498,7 @@ class ParseStream extends Stream {
|
|
|
503
498
|
return;
|
|
504
499
|
}
|
|
505
500
|
|
|
506
|
-
match = /^#EXT-X-CUE-OUT-CONT
|
|
501
|
+
match = /^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(newLine);
|
|
507
502
|
|
|
508
503
|
if (match) {
|
|
509
504
|
event = {
|
|
@@ -521,7 +516,7 @@ class ParseStream extends Stream {
|
|
|
521
516
|
return;
|
|
522
517
|
}
|
|
523
518
|
|
|
524
|
-
match = /^#EXT-X-CUE-OUT
|
|
519
|
+
match = /^#EXT-X-CUE-OUT:?(.*)?$/.exec(newLine);
|
|
525
520
|
|
|
526
521
|
if (match) {
|
|
527
522
|
event = {
|
|
@@ -539,7 +534,7 @@ class ParseStream extends Stream {
|
|
|
539
534
|
return;
|
|
540
535
|
}
|
|
541
536
|
|
|
542
|
-
match = /^#EXT-X-CUE-IN
|
|
537
|
+
match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
|
|
543
538
|
|
|
544
539
|
if (match) {
|
|
545
540
|
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-2 @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 = {
|
|
@@ -546,7 +541,7 @@
|
|
|
546
541
|
return;
|
|
547
542
|
}
|
|
548
543
|
|
|
549
|
-
match = /^#EXT-X-MEDIA
|
|
544
|
+
match = /^#EXT-X-MEDIA:?(.*)$/.exec(newLine);
|
|
550
545
|
|
|
551
546
|
if (match) {
|
|
552
547
|
event = {
|
|
@@ -582,7 +577,7 @@
|
|
|
582
577
|
return;
|
|
583
578
|
}
|
|
584
579
|
|
|
585
|
-
match = /^#EXT-X-PROGRAM-DATE-TIME
|
|
580
|
+
match = /^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(newLine);
|
|
586
581
|
|
|
587
582
|
if (match) {
|
|
588
583
|
event = {
|
|
@@ -599,7 +594,7 @@
|
|
|
599
594
|
return;
|
|
600
595
|
}
|
|
601
596
|
|
|
602
|
-
match = /^#EXT-X-KEY
|
|
597
|
+
match = /^#EXT-X-KEY:?(.*)$/.exec(newLine);
|
|
603
598
|
|
|
604
599
|
if (match) {
|
|
605
600
|
event = {
|
|
@@ -628,7 +623,7 @@
|
|
|
628
623
|
return;
|
|
629
624
|
}
|
|
630
625
|
|
|
631
|
-
match = /^#EXT-X-START
|
|
626
|
+
match = /^#EXT-X-START:?(.*)$/.exec(newLine);
|
|
632
627
|
|
|
633
628
|
if (match) {
|
|
634
629
|
event = {
|
|
@@ -646,7 +641,7 @@
|
|
|
646
641
|
return;
|
|
647
642
|
}
|
|
648
643
|
|
|
649
|
-
match = /^#EXT-X-CUE-OUT-CONT
|
|
644
|
+
match = /^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(newLine);
|
|
650
645
|
|
|
651
646
|
if (match) {
|
|
652
647
|
event = {
|
|
@@ -664,7 +659,7 @@
|
|
|
664
659
|
return;
|
|
665
660
|
}
|
|
666
661
|
|
|
667
|
-
match = /^#EXT-X-CUE-OUT
|
|
662
|
+
match = /^#EXT-X-CUE-OUT:?(.*)?$/.exec(newLine);
|
|
668
663
|
|
|
669
664
|
if (match) {
|
|
670
665
|
event = {
|
|
@@ -682,7 +677,7 @@
|
|
|
682
677
|
return;
|
|
683
678
|
}
|
|
684
679
|
|
|
685
|
-
match = /^#EXT-X-CUE-IN
|
|
680
|
+
match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);
|
|
686
681
|
|
|
687
682
|
if (match) {
|
|
688
683
|
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-2 @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=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(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})}));
|
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',
|
|
@@ -322,7 +317,7 @@ export default class ParseStream extends Stream {
|
|
|
322
317
|
this.trigger('data', event);
|
|
323
318
|
return;
|
|
324
319
|
}
|
|
325
|
-
match = (/^#EXT-X-MEDIA
|
|
320
|
+
match = (/^#EXT-X-MEDIA:?(.*)$/).exec(newLine);
|
|
326
321
|
if (match) {
|
|
327
322
|
event = {
|
|
328
323
|
type: 'tag',
|
|
@@ -350,7 +345,7 @@ export default class ParseStream extends Stream {
|
|
|
350
345
|
});
|
|
351
346
|
return;
|
|
352
347
|
}
|
|
353
|
-
match = (/^#EXT-X-PROGRAM-DATE-TIME
|
|
348
|
+
match = (/^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/).exec(newLine);
|
|
354
349
|
if (match) {
|
|
355
350
|
event = {
|
|
356
351
|
type: 'tag',
|
|
@@ -363,7 +358,7 @@ export default class ParseStream extends Stream {
|
|
|
363
358
|
this.trigger('data', event);
|
|
364
359
|
return;
|
|
365
360
|
}
|
|
366
|
-
match = (/^#EXT-X-KEY
|
|
361
|
+
match = (/^#EXT-X-KEY:?(.*)$/).exec(newLine);
|
|
367
362
|
if (match) {
|
|
368
363
|
event = {
|
|
369
364
|
type: 'tag',
|
|
@@ -388,7 +383,7 @@ export default class ParseStream extends Stream {
|
|
|
388
383
|
this.trigger('data', event);
|
|
389
384
|
return;
|
|
390
385
|
}
|
|
391
|
-
match = (/^#EXT-X-START
|
|
386
|
+
match = (/^#EXT-X-START:?(.*)$/).exec(newLine);
|
|
392
387
|
if (match) {
|
|
393
388
|
event = {
|
|
394
389
|
type: 'tag',
|
|
@@ -403,7 +398,7 @@ export default class ParseStream extends Stream {
|
|
|
403
398
|
this.trigger('data', event);
|
|
404
399
|
return;
|
|
405
400
|
}
|
|
406
|
-
match = (/^#EXT-X-CUE-OUT-CONT
|
|
401
|
+
match = (/^#EXT-X-CUE-OUT-CONT:?(.*)?$/).exec(newLine);
|
|
407
402
|
if (match) {
|
|
408
403
|
event = {
|
|
409
404
|
type: 'tag',
|
|
@@ -417,7 +412,7 @@ export default class ParseStream extends Stream {
|
|
|
417
412
|
this.trigger('data', event);
|
|
418
413
|
return;
|
|
419
414
|
}
|
|
420
|
-
match = (/^#EXT-X-CUE-OUT
|
|
415
|
+
match = (/^#EXT-X-CUE-OUT:?(.*)?$/).exec(newLine);
|
|
421
416
|
if (match) {
|
|
422
417
|
event = {
|
|
423
418
|
type: 'tag',
|
|
@@ -431,7 +426,7 @@ export default class ParseStream extends Stream {
|
|
|
431
426
|
this.trigger('data', event);
|
|
432
427
|
return;
|
|
433
428
|
}
|
|
434
|
-
match = (/^#EXT-X-CUE-IN
|
|
429
|
+
match = (/^#EXT-X-CUE-IN:?(.*)?$/).exec(newLine);
|
|
435
430
|
if (match) {
|
|
436
431
|
event = {
|
|
437
432
|
type: 'tag',
|
|
@@ -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) {
|