@gcorevideo/player 2.28.30 → 2.28.36

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.
Files changed (37) hide show
  1. package/README.md +22 -1
  2. package/assets/{subtitles → cc}/style.scss +5 -0
  3. package/dist/core.js +17 -23
  4. package/dist/index.css +241 -237
  5. package/dist/index.embed.js +79 -59
  6. package/dist/index.js +137 -119
  7. package/docs/api/player.closedcaptionspluginsettings.md +1 -0
  8. package/docs/api/player.md +9 -0
  9. package/docs/api/player.mediacontrol.md +16 -0
  10. package/docs/api/player.thumbnails.md +1 -1
  11. package/lib/Player.d.ts.map +1 -1
  12. package/lib/playback/BasePlayback.d.ts +1 -0
  13. package/lib/playback/BasePlayback.d.ts.map +1 -1
  14. package/lib/playback/BasePlayback.js +3 -0
  15. package/lib/playback/dash-playback/DashPlayback.d.ts +1 -0
  16. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  17. package/lib/playback/dash-playback/DashPlayback.js +9 -22
  18. package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
  19. package/lib/playback/hls-playback/HlsPlayback.js +4 -0
  20. package/lib/plugins/subtitles/ClosedCaptions.d.ts +7 -3
  21. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  22. package/lib/plugins/subtitles/ClosedCaptions.js +66 -42
  23. package/lib/testUtils.d.ts +1 -0
  24. package/lib/testUtils.d.ts.map +1 -1
  25. package/lib/testUtils.js +3 -0
  26. package/package.json +4 -1
  27. package/src/Player.ts +12 -12
  28. package/src/playback/BasePlayback.ts +4 -0
  29. package/src/playback/dash-playback/DashPlayback.ts +10 -27
  30. package/src/playback/hls-playback/HlsPlayback.ts +4 -0
  31. package/src/plugins/subtitles/ClosedCaptions.ts +75 -47
  32. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +277 -29
  33. package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +3 -3
  34. package/src/testUtils.ts +3 -0
  35. package/tsconfig.tsbuildinfo +1 -1
  36. /package/assets/{subtitles → cc}/combobox.ejs +0 -0
  37. /package/assets/{subtitles → cc}/string.ejs +0 -0
package/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # Gcore video player
2
+
2
3
  $
3
4
 
4
5
  ## Installation
@@ -15,7 +16,7 @@ Or use a script on the CDN directly in your HTML:
15
16
 
16
17
  ## Usage
17
18
 
18
- See the complete example app on Vercel: [https://github.com/dmitritz/gcore-videoplayer-js-nuxt](https://github.com/dmitritz/gcore-videoplayer-js-nuxt)
19
+ See the complete example app on Vercel: <https://github.com/dmitritz/gcore-videoplayer-js-nuxt>
19
20
 
20
21
  ### Plain HTML example
21
22
 
@@ -83,3 +84,23 @@ See the complete example app on Vercel: [https://github.com/dmitritz/gcore-video
83
84
  ## Documentation
84
85
 
85
86
  - [API reference](./docs/api/index.md)
87
+
88
+ ## Development
89
+
90
+ ### Log level
91
+
92
+ Detailed logs can be useful in local development while debugging or watching tests output.
93
+ Log level of the player core and components can be controlled by configuring a LogTracer:
94
+
95
+ ```ts
96
+ import { LogTracer, Logger, setTracer } from '@gcorevideo/utils'
97
+ // ...
98
+ Logger.enable('*') // log everything; you can use glob-like patterns, such as 'gplayer', 'plugins.*' or 'playback.*'
99
+ setTracer(new LogTracer('AudioTracks.test'))
100
+ ```
101
+
102
+ When debugging an app that use the player as a dependency,
103
+
104
+ ```ts
105
+ import { LogTracer, Logger, setTracer } from '@gcorevideo/player'
106
+ ```
@@ -68,6 +68,11 @@
68
68
  position: absolute;
69
69
  bottom: calc(var(--bottom-panel) + 5px);
70
70
  width: 100%;
71
+ transition: transform 0.3s ease-out;
72
+
73
+ &.media-control-cc-pulled {
74
+ transform: translateY(var(--bottom-panel));
75
+ }
71
76
 
72
77
  p {
73
78
  width: auto;
package/dist/core.js CHANGED
@@ -12807,6 +12807,9 @@ class BasePlayback extends HTML5Video$1 {
12807
12807
  super._onPlaying();
12808
12808
  this.trigger(Events$1.PLAYBACK_MEDIACONTROL_ENABLE);
12809
12809
  }
12810
+ setTextTrack(id) {
12811
+ // noop
12812
+ }
12810
12813
  }
12811
12814
 
12812
12815
  var PlaybackEvents;
@@ -12829,6 +12832,7 @@ const T$3 = 'playback.dash';
12829
12832
  class DashPlayback extends BasePlayback {
12830
12833
  _levels = [];
12831
12834
  _currentLevel = AUTO$1;
12835
+ _currentTextTrackId = -1;
12832
12836
  // true when the actual duration is longer than hlsjs's live sync point
12833
12837
  // when this is false playableRegionDuration will be the actual duration
12834
12838
  // when this is true playableRegionDuration will exclude the time after the sync point
@@ -12961,7 +12965,11 @@ class DashPlayback extends BasePlayback {
12961
12965
  streaming: {
12962
12966
  text: {
12963
12967
  defaultEnabled: false,
12964
- dispatchForManualRendering: true,
12968
+ // NOTE: dispatchForManualRendering is not correctly implemented in DASH.js;
12969
+ // it does not work when there are multiple text tracks.
12970
+ // CUE_ENTER and CUE_EXIT events might be dispatched additionally
12971
+ // for a track, other than the currently active one.
12972
+ // dispatchForManualRendering: true, // TODO only when useNativeSubtitles is not true?
12965
12973
  },
12966
12974
  },
12967
12975
  }, this.options.dash);
@@ -13005,24 +13013,6 @@ class DashPlayback extends BasePlayback {
13005
13013
  this._dash.on(_.events.PLAYBACK_RATE_CHANGED, (e) => {
13006
13014
  this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate);
13007
13015
  });
13008
- this._dash.on(_.events.TRACK_CHANGE_RENDERED, (e) => {
13009
- if (e.mediaType === 'audio') {
13010
- this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack$1(e.newMediaInfo));
13011
- }
13012
- });
13013
- this._dash.on(_.events.CUE_ENTER, (e) => {
13014
- this.oncueenter?.({
13015
- end: e.end,
13016
- id: e.id,
13017
- start: e.start,
13018
- text: e.text,
13019
- });
13020
- });
13021
- this._dash.on(_.events.CUE_EXIT, (e) => {
13022
- this.oncueexit?.({
13023
- id: e.id,
13024
- });
13025
- });
13026
13016
  }
13027
13017
  render() {
13028
13018
  this._ready();
@@ -13332,14 +13322,14 @@ class DashPlayback extends BasePlayback {
13332
13322
  this._dash?.setTextTrack(this.closedCaptionsTrackId);
13333
13323
  }
13334
13324
  setTextTrack(id) {
13325
+ this._currentTextTrackId = id;
13335
13326
  this._dash?.setTextTrack(id);
13336
13327
  }
13337
13328
  /**
13338
13329
  * @override
13339
13330
  */
13340
13331
  get closedCaptionsTracks() {
13341
- const tt = this.getTextTracks();
13342
- return tt;
13332
+ return this.getTextTracks();
13343
13333
  }
13344
13334
  getTextTracks() {
13345
13335
  return this._dash?.getTracksFor('text').map((t, index) => ({
@@ -13349,7 +13339,7 @@ class DashPlayback extends BasePlayback {
13349
13339
  id: index,
13350
13340
  label: getTextTrackLabel(t) || "",
13351
13341
  language: t.lang,
13352
- mode: "hidden",
13342
+ mode: this._currentTextTrackId === index ? "showing" : "hidden",
13353
13343
  },
13354
13344
  })) || [];
13355
13345
  }
@@ -50861,7 +50851,11 @@ class HlsPlayback extends BasePlayback {
50861
50851
  this.trigger(Events$1.PLAYBACK_AUDIO_CHANGED, toClapprTrack(track));
50862
50852
  }
50863
50853
  setTextTrack(id) {
50854
+ if (id === this._hls.subtitleTrack) {
50855
+ return;
50856
+ }
50864
50857
  this._hls.subtitleTrack = id;
50858
+ this.cues = [];
50865
50859
  }
50866
50860
  /**
50867
50861
  * @override
@@ -51481,7 +51475,7 @@ class Player {
51481
51475
  }
51482
51476
  }
51483
51477
 
51484
- var version$1 = "2.28.30";
51478
+ var version$1 = "2.28.36";
51485
51479
 
51486
51480
  var packages = {
51487
51481
  "node_modules/@clappr/core": {
package/dist/index.css CHANGED
@@ -666,76 +666,6 @@
666
666
  }
667
667
  .gplayer-mc-clips .gplayer-mc-clips-text.compact {
668
668
  max-width: 100px;
669
- }.context-menu {
670
- z-index: 999;
671
- position: absolute;
672
- top: 0;
673
- left: 0;
674
- text-align: center;
675
- }
676
- .context-menu .context-menu-list {
677
- font-family: "Proxima Nova", sans-serif;
678
- font-size: 12px;
679
- line-height: 12px;
680
- list-style-type: none;
681
- text-align: left;
682
- padding: 5px;
683
- margin-left: auto;
684
- margin-right: auto;
685
- background-color: rgba(0, 0, 0, 0.75);
686
- border: 1px solid #666;
687
- border-radius: 4px;
688
- }
689
- .context-menu .context-menu-list-item button {
690
- border: none;
691
- background-color: transparent;
692
- padding: 0;
693
- color: white;
694
- display: flex;
695
- gap: 8px;
696
- align-items: center;
697
- justify-content: center;
698
- cursor: pointer;
699
- padding: 5px;
700
- width: 100%;
701
- }
702
- .context-menu .context-menu-list-item_icon {
703
- width: 20px;
704
- height: 20px;
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
669
  }.dvr-controls {
740
670
  --disabled-opacity: 0.3;
741
671
  --circle-radius: 5px;
@@ -793,149 +723,76 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
793
723
  .dvr-controls .live-button:hover {
794
724
  opacity: 1;
795
725
  text-shadow: rgba(255, 255, 255, 0.75) 0 0 5px;
796
- }*,
797
- :focus,
798
- :visited {
799
- outline: none !important;
726
+ }.context-menu {
727
+ z-index: 999;
728
+ position: absolute;
729
+ top: 0;
730
+ left: 0;
731
+ text-align: center;
800
732
  }
801
-
802
- .multicamera[data-multicamera] {
803
- float: right;
804
- margin-top: 4px;
805
- position: relative;
806
- margin-right: 20px;
807
- width: 20px;
733
+ .context-menu .context-menu-list {
734
+ font-family: "Proxima Nova", sans-serif;
735
+ font-size: 12px;
736
+ line-height: 12px;
737
+ list-style-type: none;
738
+ text-align: left;
739
+ padding: 5px;
740
+ margin-left: auto;
741
+ margin-right: auto;
742
+ background-color: rgba(0, 0, 0, 0.75);
743
+ border: 1px solid #666;
744
+ border-radius: 4px;
808
745
  }
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;
746
+ .context-menu .context-menu-list-item button {
814
747
  border: none;
815
- font-size: 14px;
748
+ background-color: transparent;
816
749
  padding: 0;
750
+ color: white;
751
+ display: flex;
752
+ gap: 8px;
753
+ align-items: center;
754
+ justify-content: center;
755
+ cursor: pointer;
756
+ padding: 5px;
757
+ width: 100%;
817
758
  }
818
- .multicamera[data-multicamera] button svg {
759
+ .context-menu .context-menu-list-item_icon {
760
+ width: 20px;
819
761
  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
773
  }
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
- }
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;
@@ -1591,6 +1591,45 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
1591
1591
  }
1592
1592
  .player-poster .play-wrapper svg path {
1593
1593
  fill: #fff;
1594
+ }.quality-levels li.disabled {
1595
+ opacity: 0.5;
1596
+ pointer-events: none;
1597
+ }
1598
+ .quality-levels li.current {
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;
1594
1633
  }.share_plugin[data-share] {
1595
1634
  pointer-events: auto;
1596
1635
  z-index: 5;
@@ -1674,39 +1713,6 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
1674
1713
  display: inline-block;
1675
1714
  margin-right: 5px;
1676
1715
  cursor: pointer;
1677
- }.seek-time {
1678
- position: absolute;
1679
- white-space: nowrap;
1680
- height: 20px;
1681
- line-height: 20px;
1682
- font-size: 0;
1683
- left: -100%;
1684
- bottom: 55px;
1685
- background-color: rgba(2, 2, 2, 0.5);
1686
- z-index: 9999;
1687
- transition: opacity 0.1s ease;
1688
- }
1689
- .seek-time.hidden {
1690
- opacity: 0;
1691
- }
1692
- .seek-time .seek-time__pos {
1693
- display: inline-block;
1694
- color: white;
1695
- font-size: 10px;
1696
- padding-left: 7px;
1697
- padding-right: 7px;
1698
- vertical-align: top;
1699
- }
1700
- .seek-time .seek-time__duration {
1701
- display: inline-block;
1702
- color: rgba(255, 255, 255, 0.5);
1703
- font-size: 10px;
1704
- padding-right: 7px;
1705
- vertical-align: top;
1706
- }
1707
- .seek-time .seek-time__duration::before {
1708
- content: "|";
1709
- margin-right: 7px;
1710
1716
  }.spinner-three-bounce[data-spinner] {
1711
1717
  position: absolute;
1712
1718
  width: 70px;
@@ -1745,12 +1751,6 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
1745
1751
  40% {
1746
1752
  transform: scale(1);
1747
1753
  }
1748
- }.quality-levels li.disabled {
1749
- opacity: 0.5;
1750
- pointer-events: none;
1751
- }
1752
- .quality-levels li.current {
1753
- background-color: #000;
1754
1754
  }.container-with-poster-clickable .mc-skip-time {
1755
1755
  height: 0;
1756
1756
  }
@@ -1886,6 +1886,10 @@ div.player-error-screen__reload, [data-player] div.player-error-screen__reload {
1886
1886
  position: absolute;
1887
1887
  bottom: calc(var(--bottom-panel) + 5px);
1888
1888
  width: 100%;
1889
+ transition: transform 0.3s ease-out;
1890
+ }
1891
+ .container .gplayer-cc-line.media-control-cc-pulled {
1892
+ transform: translateY(var(--bottom-panel));
1889
1893
  }
1890
1894
  .container .gplayer-cc-line p {
1891
1895
  width: auto;