@gcorevideo/player 2.28.22 → 2.28.23

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/core.js CHANGED
@@ -51319,7 +51319,7 @@ class Player {
51319
51319
  }
51320
51320
  }
51321
51321
 
51322
- var version$1 = "2.28.22";
51322
+ var version$1 = "2.28.23";
51323
51323
 
51324
51324
  var packages = {
51325
51325
  "node_modules/@clappr/core": {
package/dist/index.css CHANGED
@@ -702,40 +702,6 @@
702
702
  }
703
703
  .gplayer-mc-clips .gplayer-mc-clips-text.compact {
704
704
  max-width: 100px;
705
- }div.player-error-screen, [data-player] div.player-error-screen {
706
- color: #CCCACA;
707
- position: absolute;
708
- top: 0;
709
- height: 100%;
710
- width: 100%;
711
- background-color: rgba(0, 0, 0, 0.7);
712
- z-index: 2000;
713
- display: flex;
714
- flex-direction: column;
715
- justify-content: center;
716
- }
717
- div.player-error-screen__content[data-error-screen], [data-player] div.player-error-screen__content[data-error-screen] {
718
- font-size: 14px;
719
- color: #CCCACA;
720
- margin-top: 45px;
721
- }
722
- div.player-error-screen__title[data-error-screen], [data-player] div.player-error-screen__title[data-error-screen] {
723
- font-weight: bold;
724
- line-height: 30px;
725
- font-size: 18px;
726
- }
727
- div.player-error-screen__message[data-error-screen], [data-player] div.player-error-screen__message[data-error-screen] {
728
- width: 90%;
729
- margin: 0 auto;
730
- }
731
- div.player-error-screen__code[data-error-screen], [data-player] div.player-error-screen__code[data-error-screen] {
732
- font-size: 13px;
733
- margin-top: 15px;
734
- }
735
- div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
736
- cursor: pointer;
737
- width: 30px;
738
- margin: 15px auto 0;
739
705
  }.dvr-controls {
740
706
  --disabled-opacity: 0.3;
741
707
  --circle-radius: 5px;
@@ -793,149 +759,40 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
793
759
  .dvr-controls .live-button:hover {
794
760
  opacity: 1;
795
761
  text-shadow: rgba(255, 255, 255, 0.75) 0 0 5px;
796
- }*,
797
- :focus,
798
- :visited {
799
- outline: none !important;
800
- }
801
-
802
- .multicamera[data-multicamera] {
803
- float: right;
804
- margin-top: 4px;
805
- position: relative;
806
- margin-right: 20px;
807
- width: 20px;
808
- }
809
- .multicamera[data-multicamera] button {
810
- background-color: transparent;
811
- color: #fff;
812
- font-family: Roboto, "Open Sans", Arial, sans-serif;
813
- -webkit-font-smoothing: antialiased;
814
- border: none;
815
- font-size: 14px;
816
- padding: 0;
817
- }
818
- .multicamera[data-multicamera] button svg {
819
- height: 20px;
820
- position: relative;
821
- margin-top: 6px;
822
- }
823
- .multicamera[data-multicamera] button:hover {
824
- color: #c9c9c9;
825
- }
826
- .multicamera[data-multicamera] button.changing {
827
- animation: pulse 0.5s infinite alternate;
828
- }
829
- .multicamera[data-multicamera] button span.quality-arrow {
830
- width: 9px;
831
- height: 6px;
832
- margin-top: 11px;
833
- margin-left: 5px;
834
- }
835
- .multicamera[data-multicamera] > ul {
836
- padding: 6px 0;
837
- right: -24px;
838
- width: 245px;
839
- list-style-type: none;
840
- position: absolute;
841
- bottom: 48px;
842
- border-radius: 4px;
843
- display: none;
844
- background-color: rgba(74, 74, 74, 0.9);
845
- }
846
- .multicamera[data-multicamera] > ul::after {
847
- content: "";
762
+ }div.player-error-screen, [data-player] div.player-error-screen {
763
+ color: #CCCACA;
848
764
  position: absolute;
849
- top: 100%;
850
- left: 85%;
851
- margin-left: -10px;
852
- width: 0;
853
- height: 0;
854
- border-top: 10px solid rgba(74, 74, 74, 0.9);
855
- border-right: 10px solid transparent;
856
- border-left: 10px solid transparent;
857
- }
858
- .multicamera[data-multicamera] li {
859
- font-size: 10px;
860
- cursor: pointer;
861
- }
862
- .multicamera[data-multicamera] li .multicamera-item {
765
+ top: 0;
766
+ height: 100%;
767
+ width: 100%;
768
+ background-color: rgba(0, 0, 0, 0.7);
769
+ z-index: 2000;
863
770
  display: flex;
864
- padding: 10px 0;
771
+ flex-direction: column;
865
772
  justify-content: center;
866
- position: relative;
867
- }
868
- .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-screenshot {
869
- opacity: 0.5;
870
- }
871
- .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-text {
872
- opacity: 0.5;
873
- }
874
- .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false]:hover {
875
- background-color: rgba(0, 0, 0, 0);
876
- }
877
- .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] {
878
- pointer-events: none;
879
- }
880
- .multicamera[data-multicamera] li .multicamera-item:hover, .multicamera[data-multicamera] li .multicamera-item.multicamera-active {
881
- background-color: rgba(0, 0, 0, 0.3);
882
- }
883
- .multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot {
884
- width: 80px;
885
- height: 60px;
886
- }
887
- .multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot img {
888
- width: 80px;
889
- height: 60px;
890
773
  }
891
- .multicamera[data-multicamera] li .multicamera-item .multicamera-text {
892
- width: 120px;
893
- text-align: left;
894
- margin-left: 15px;
895
- }
896
- .multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-title,
897
- .multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {
898
- width: 120px;
899
- height: 20px;
900
- font-family: Roboto, "Open Sans", Arial, sans-serif;
774
+ div.player-error-screen__content[data-error-screen], [data-player] div.player-error-screen__content[data-error-screen] {
901
775
  font-size: 14px;
902
- font-weight: normal;
903
- font-style: normal;
904
- font-stretch: normal;
905
- line-height: 1.43;
906
- letter-spacing: normal;
907
- text-align: left;
908
- color: #fff;
909
- text-overflow: ellipsis;
910
- overflow: hidden;
911
- }
912
- .multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {
913
- opacity: 0.6;
914
- }
915
- .multicamera[data-multicamera] li a {
916
- color: #444;
917
- padding: 2px 10px;
918
- display: block;
919
- text-decoration: none;
920
- }
921
- .multicamera[data-multicamera] li a:hover {
922
- background-color: #555;
923
- color: white;
776
+ color: #CCCACA;
777
+ margin-top: 45px;
924
778
  }
925
- .multicamera[data-multicamera] li a:hover a {
926
- color: white;
927
- text-decoration: none;
779
+ div.player-error-screen__title[data-error-screen], [data-player] div.player-error-screen__title[data-error-screen] {
780
+ font-weight: bold;
781
+ line-height: 30px;
782
+ font-size: 18px;
928
783
  }
929
- .multicamera[data-multicamera] li.current a {
930
- color: #f00;
931
- }.media-control-skin-1 .media-control-item.media-control-pip {
932
- order: 95;
784
+ div.player-error-screen__message[data-error-screen], [data-player] div.player-error-screen__message[data-error-screen] {
785
+ width: 90%;
786
+ margin: 0 auto;
933
787
  }
934
- .media-control-skin-1 .media-control-item.media-control-pip button {
935
- height: 20px;
788
+ div.player-error-screen__code[data-error-screen], [data-player] div.player-error-screen__code[data-error-screen] {
789
+ font-size: 13px;
790
+ margin-top: 15px;
936
791
  }
937
- .media-control-skin-1 .media-control-item.media-control-pip button svg {
938
- height: 20px;
792
+ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
793
+ cursor: pointer;
794
+ width: 30px;
795
+ margin: 15px auto 0;
939
796
  }[data-player] {
940
797
  --bottom-panel: 40px;
941
798
  }
@@ -1557,6 +1414,149 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
1557
1414
  100% {
1558
1415
  color: #B80000;
1559
1416
  }
1417
+ }*,
1418
+ :focus,
1419
+ :visited {
1420
+ outline: none !important;
1421
+ }
1422
+
1423
+ .multicamera[data-multicamera] {
1424
+ float: right;
1425
+ margin-top: 4px;
1426
+ position: relative;
1427
+ margin-right: 20px;
1428
+ width: 20px;
1429
+ }
1430
+ .multicamera[data-multicamera] button {
1431
+ background-color: transparent;
1432
+ color: #fff;
1433
+ font-family: Roboto, "Open Sans", Arial, sans-serif;
1434
+ -webkit-font-smoothing: antialiased;
1435
+ border: none;
1436
+ font-size: 14px;
1437
+ padding: 0;
1438
+ }
1439
+ .multicamera[data-multicamera] button svg {
1440
+ height: 20px;
1441
+ position: relative;
1442
+ margin-top: 6px;
1443
+ }
1444
+ .multicamera[data-multicamera] button:hover {
1445
+ color: #c9c9c9;
1446
+ }
1447
+ .multicamera[data-multicamera] button.changing {
1448
+ animation: pulse 0.5s infinite alternate;
1449
+ }
1450
+ .multicamera[data-multicamera] button span.quality-arrow {
1451
+ width: 9px;
1452
+ height: 6px;
1453
+ margin-top: 11px;
1454
+ margin-left: 5px;
1455
+ }
1456
+ .multicamera[data-multicamera] > ul {
1457
+ padding: 6px 0;
1458
+ right: -24px;
1459
+ width: 245px;
1460
+ list-style-type: none;
1461
+ position: absolute;
1462
+ bottom: 48px;
1463
+ border-radius: 4px;
1464
+ display: none;
1465
+ background-color: rgba(74, 74, 74, 0.9);
1466
+ }
1467
+ .multicamera[data-multicamera] > ul::after {
1468
+ content: "";
1469
+ position: absolute;
1470
+ top: 100%;
1471
+ left: 85%;
1472
+ margin-left: -10px;
1473
+ width: 0;
1474
+ height: 0;
1475
+ border-top: 10px solid rgba(74, 74, 74, 0.9);
1476
+ border-right: 10px solid transparent;
1477
+ border-left: 10px solid transparent;
1478
+ }
1479
+ .multicamera[data-multicamera] li {
1480
+ font-size: 10px;
1481
+ cursor: pointer;
1482
+ }
1483
+ .multicamera[data-multicamera] li .multicamera-item {
1484
+ display: flex;
1485
+ padding: 10px 0;
1486
+ justify-content: center;
1487
+ position: relative;
1488
+ }
1489
+ .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-screenshot {
1490
+ opacity: 0.5;
1491
+ }
1492
+ .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-text {
1493
+ opacity: 0.5;
1494
+ }
1495
+ .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false]:hover {
1496
+ background-color: rgba(0, 0, 0, 0);
1497
+ }
1498
+ .multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] {
1499
+ pointer-events: none;
1500
+ }
1501
+ .multicamera[data-multicamera] li .multicamera-item:hover, .multicamera[data-multicamera] li .multicamera-item.multicamera-active {
1502
+ background-color: rgba(0, 0, 0, 0.3);
1503
+ }
1504
+ .multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot {
1505
+ width: 80px;
1506
+ height: 60px;
1507
+ }
1508
+ .multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot img {
1509
+ width: 80px;
1510
+ height: 60px;
1511
+ }
1512
+ .multicamera[data-multicamera] li .multicamera-item .multicamera-text {
1513
+ width: 120px;
1514
+ text-align: left;
1515
+ margin-left: 15px;
1516
+ }
1517
+ .multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-title,
1518
+ .multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {
1519
+ width: 120px;
1520
+ height: 20px;
1521
+ font-family: Roboto, "Open Sans", Arial, sans-serif;
1522
+ font-size: 14px;
1523
+ font-weight: normal;
1524
+ font-style: normal;
1525
+ font-stretch: normal;
1526
+ line-height: 1.43;
1527
+ letter-spacing: normal;
1528
+ text-align: left;
1529
+ color: #fff;
1530
+ text-overflow: ellipsis;
1531
+ overflow: hidden;
1532
+ }
1533
+ .multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {
1534
+ opacity: 0.6;
1535
+ }
1536
+ .multicamera[data-multicamera] li a {
1537
+ color: #444;
1538
+ padding: 2px 10px;
1539
+ display: block;
1540
+ text-decoration: none;
1541
+ }
1542
+ .multicamera[data-multicamera] li a:hover {
1543
+ background-color: #555;
1544
+ color: white;
1545
+ }
1546
+ .multicamera[data-multicamera] li a:hover a {
1547
+ color: white;
1548
+ text-decoration: none;
1549
+ }
1550
+ .multicamera[data-multicamera] li.current a {
1551
+ color: #f00;
1552
+ }.media-control-skin-1 .media-control-item.media-control-pip {
1553
+ order: 95;
1554
+ }
1555
+ .media-control-skin-1 .media-control-item.media-control-pip button {
1556
+ height: 20px;
1557
+ }
1558
+ .media-control-skin-1 .media-control-item.media-control-pip button svg {
1559
+ height: 20px;
1560
1560
  }.player-poster {
1561
1561
  display: flex;
1562
1562
  justify-content: center;
@@ -1597,39 +1597,6 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
1597
1597
  }
1598
1598
  .quality-levels li.current {
1599
1599
  background-color: #000;
1600
- }.seek-time {
1601
- position: absolute;
1602
- white-space: nowrap;
1603
- height: 20px;
1604
- line-height: 20px;
1605
- font-size: 0;
1606
- left: -100%;
1607
- bottom: 55px;
1608
- background-color: rgba(2, 2, 2, 0.5);
1609
- z-index: 9999;
1610
- transition: opacity 0.1s ease;
1611
- }
1612
- .seek-time.hidden {
1613
- opacity: 0;
1614
- }
1615
- .seek-time .seek-time__pos {
1616
- display: inline-block;
1617
- color: white;
1618
- font-size: 10px;
1619
- padding-left: 7px;
1620
- padding-right: 7px;
1621
- vertical-align: top;
1622
- }
1623
- .seek-time .seek-time__duration {
1624
- display: inline-block;
1625
- color: rgba(255, 255, 255, 0.5);
1626
- font-size: 10px;
1627
- padding-right: 7px;
1628
- vertical-align: top;
1629
- }
1630
- .seek-time .seek-time__duration::before {
1631
- content: "|";
1632
- margin-right: 7px;
1633
1600
  }.share_plugin[data-share] {
1634
1601
  pointer-events: auto;
1635
1602
  z-index: 5;
@@ -1734,6 +1701,39 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
1734
1701
  .mc-skip-time .skip-container .skip-item {
1735
1702
  flex: 1 0 0px;
1736
1703
  height: 100%;
1704
+ }.seek-time {
1705
+ position: absolute;
1706
+ white-space: nowrap;
1707
+ height: 20px;
1708
+ line-height: 20px;
1709
+ font-size: 0;
1710
+ left: -100%;
1711
+ bottom: 55px;
1712
+ background-color: rgba(2, 2, 2, 0.5);
1713
+ z-index: 9999;
1714
+ transition: opacity 0.1s ease;
1715
+ }
1716
+ .seek-time.hidden {
1717
+ opacity: 0;
1718
+ }
1719
+ .seek-time .seek-time__pos {
1720
+ display: inline-block;
1721
+ color: white;
1722
+ font-size: 10px;
1723
+ padding-left: 7px;
1724
+ padding-right: 7px;
1725
+ vertical-align: top;
1726
+ }
1727
+ .seek-time .seek-time__duration {
1728
+ display: inline-block;
1729
+ color: rgba(255, 255, 255, 0.5);
1730
+ font-size: 10px;
1731
+ padding-right: 7px;
1732
+ vertical-align: top;
1733
+ }
1734
+ .seek-time .seek-time__duration::before {
1735
+ content: "|";
1736
+ margin-right: 7px;
1737
1737
  }.spinner-three-bounce[data-spinner] {
1738
1738
  position: absolute;
1739
1739
  width: 70px;
@@ -1,3 +1,9 @@
1
+ /**
2
+ * @public
3
+ * @param e
4
+ */
5
+ function reportError(e) {
6
+ }
1
7
  /**
2
8
  * @public
3
9
  * @param msg
@@ -61802,7 +61808,8 @@ class Thumbnails extends UICorePlugin {
61802
61808
  }
61803
61809
  }
61804
61810
  function parseVTT(vtt) {
61805
- const correctedVTT = vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt;
61811
+ const correctedVTT = (vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt)
61812
+ .replace(/(\d+:\d+:\d+),(\d+)/g, '$1.$2');
61806
61813
  const parser = new browserIndexExports.WebVTT.Parser(window);
61807
61814
  const cues = [];
61808
61815
  parser.oncue = (cue) => {
@@ -61813,6 +61820,7 @@ function parseVTT(vtt) {
61813
61820
  text: cue.text
61814
61821
  });
61815
61822
  };
61823
+ parser.onparsingerror = reportError;
61816
61824
  // TextEncoder is available in all modern browsers and Node >=v11
61817
61825
  const uint8Array = typeof TextEncoder !== 'undefined'
61818
61826
  ? new TextEncoder().encode(correctedVTT)
package/dist/index.js CHANGED
@@ -51411,7 +51411,7 @@ class Player {
51411
51411
  }
51412
51412
  }
51413
51413
 
51414
- var version$1 = "2.28.22";
51414
+ var version$1 = "2.28.23";
51415
51415
 
51416
51416
  var packages = {
51417
51417
  "node_modules/@clappr/core": {
@@ -63338,7 +63338,8 @@ class Thumbnails extends UICorePlugin {
63338
63338
  }
63339
63339
  }
63340
63340
  function parseVTT(vtt) {
63341
- const correctedVTT = vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt;
63341
+ const correctedVTT = (vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt)
63342
+ .replace(/(\d+:\d+:\d+),(\d+)/g, '$1.$2');
63342
63343
  const parser = new browserIndexExports.WebVTT.Parser(window);
63343
63344
  const cues = [];
63344
63345
  parser.oncue = (cue) => {
@@ -63349,6 +63350,7 @@ function parseVTT(vtt) {
63349
63350
  text: cue.text
63350
63351
  });
63351
63352
  };
63353
+ parser.onparsingerror = reportError;
63352
63354
  // TextEncoder is available in all modern browsers and Node >=v11
63353
63355
  const uint8Array = typeof TextEncoder !== 'undefined'
63354
63356
  ? new TextEncoder().encode(correctedVTT)
@@ -1,5 +1,5 @@
1
1
  import { UICorePlugin, Events, template, $, } from '@clappr/core';
2
- import { trace } from '@gcorevideo/utils';
2
+ import { reportError, trace } from '@gcorevideo/utils';
3
3
  import { WebVTT } from 'videojs-vtt.js';
4
4
  import assert from 'assert';
5
5
  import { CLAPPR_VERSION } from '../../build.js';
@@ -359,7 +359,8 @@ export class Thumbnails extends UICorePlugin {
359
359
  }
360
360
  }
361
361
  function parseVTT(vtt) {
362
- const correctedVTT = vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt;
362
+ const correctedVTT = (vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt)
363
+ .replace(/(\d+:\d+:\d+),(\d+)/g, '$1.$2');
363
364
  const parser = new WebVTT.Parser(window);
364
365
  const cues = [];
365
366
  parser.oncue = (cue) => {
@@ -370,6 +371,7 @@ function parseVTT(vtt) {
370
371
  text: cue.text
371
372
  });
372
373
  };
374
+ parser.onparsingerror = reportError;
373
375
  // TextEncoder is available in all modern browsers and Node >=v11
374
376
  const uint8Array = typeof TextEncoder !== 'undefined'
375
377
  ? new TextEncoder().encode(correctedVTT)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.28.22",
3
+ "version": "2.28.23",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -6,7 +6,7 @@ import {
6
6
  Container,
7
7
  Core,
8
8
  } from '@clappr/core'
9
- import { trace } from '@gcorevideo/utils'
9
+ import { reportError, trace } from '@gcorevideo/utils'
10
10
  import { WebVTT } from 'videojs-vtt.js'
11
11
  import assert from 'assert'
12
12
 
@@ -531,7 +531,8 @@ type ParsedVTT = {
531
531
 
532
532
 
533
533
  function parseVTT(vtt: string): ParsedVTT[] {
534
- const correctedVTT = vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt;
534
+ const correctedVTT = (vtt.startsWith('WEBVTT') ? vtt : 'WEBVTT\n\n' + vtt)
535
+ .replace(/(\d+:\d+:\d+),(\d+)/g, '$1.$2');
535
536
  const parser = new WebVTT.Parser(window);
536
537
  const cues: ParsedVTT[] = [];
537
538
  (parser as any).oncue = (cue: any) => {
@@ -542,6 +543,7 @@ function parseVTT(vtt: string): ParsedVTT[] {
542
543
  text: cue.text
543
544
  });
544
545
  };
546
+ (parser as any).onparsingerror = reportError
545
547
 
546
548
  // TextEncoder is available in all modern browsers and Node >=v11
547
549
  const uint8Array = typeof TextEncoder !== 'undefined'
@@ -72,6 +72,15 @@ sprite.png#xywh=0,0,100,100
72
72
  sprite.png#xywh=100,0,100,100
73
73
  `
74
74
 
75
+ const anomalousTimestampsVTT = `WEBVTT
76
+
77
+ 00:00:00,000 --> 00:00:01,000 align:start size:100%
78
+ sprite.png#xywh=0,0,100,100
79
+
80
+ 00:00:01,000 --> 00:00:02,000 align:center size:100%
81
+ sprite.png#xywh=100,0,100,100
82
+ `
83
+
75
84
  describe('Thumbnails', () => {
76
85
  let core: any
77
86
  let mediaControl: any
@@ -82,6 +91,7 @@ describe('Thumbnails', () => {
82
91
  ['VTT with a WebVTT header', headerfulVTT],
83
92
  ['VTT with NOTE and STYLE blocks', blockfulVTT],
84
93
  ['VTT where cues have settings', richcueVTT],
94
+ ['VTT with anomalous timestamps', anomalousTimestampsVTT],
85
95
  ])('%s', (name, vtt) => {
86
96
  beforeEach(() => {
87
97
  core = createMockCore({
@@ -36,6 +36,15 @@ exports[`Thumbnails > VTT with a WebVTT header > loading > should render 1`] = `
36
36
  "
37
37
  `;
38
38
 
39
+ exports[`Thumbnails > VTT with anomalous timestamps > loading > should render 1`] = `
40
+ "<div class="thumbnails-text" id="thumbnails-text"></div>
41
+ <div class="backdrop" id="thumbnails-backdrop" style="height: 100px;">
42
+ <div class="carousel" id="thumbnails-carousel"><div class="thumbnail-container" style="width: 100px; height: 100px; background-image: url(&quot;https://example.com/sprite.png&quot;); background-size: 600px 900px; background-position: 0px 0px;"></div><div class="thumbnail-container" style="width: 100px; height: 100px; background-image: url(&quot;https://example.com/sprite.png&quot;); background-size: 600px 900px; background-position: -100px 0px;"></div></div>
43
+ </div>
44
+ <div class="spotlight" id="thumbnails-spotlight" style="height: 100px;"></div>
45
+ "
46
+ `;
47
+
39
48
  exports[`Thumbnails > baseline VTT > loading > should render 1`] = `
40
49
  "<div class="thumbnails-text" id="thumbnails-text"></div>
41
50
  <div class="backdrop" id="thumbnails-backdrop" style="height: 100px;">