@gcorevideo/player 2.28.36 → 2.29.0

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 (42) hide show
  1. package/assets/media-control/media-control.scss +8 -6
  2. package/assets/multi-camera/multicamera.ejs +27 -23
  3. package/assets/multi-camera/style.scss +7 -34
  4. package/assets/style/main.scss +2 -2
  5. package/dist/core.js +8 -6
  6. package/dist/index.css +427 -449
  7. package/dist/index.embed.js +8 -45
  8. package/dist/index.js +77 -181
  9. package/docs/api/player.md +22 -9
  10. package/docs/api/player.mediacontrol.setkeepvisible.md +56 -0
  11. package/docs/api/player.multicamera.md +0 -28
  12. package/docs/api/player.multiccamerasourceinfo.md +27 -0
  13. package/docs/api/{player.multicamera.unbindevents.md → player.multisourcesmode.md} +4 -7
  14. package/docs/api/player.sourcecontroller.md +0 -37
  15. package/lib/playback/dash-playback/DashPlayback.d.ts +2 -1
  16. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  17. package/lib/playback/hls-playback/HlsPlayback.d.ts +2 -1
  18. package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
  19. package/lib/playback/types.d.ts +9 -0
  20. package/lib/playback/types.d.ts.map +1 -1
  21. package/lib/playback.types.d.ts +0 -6
  22. package/lib/playback.types.d.ts.map +1 -1
  23. package/lib/plugins/multi-camera/MultiCamera.d.ts +21 -4
  24. package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -1
  25. package/lib/plugins/multi-camera/MultiCamera.js +70 -134
  26. package/lib/plugins/source-controller/SourceController.d.ts +0 -39
  27. package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
  28. package/lib/plugins/source-controller/SourceController.js +0 -39
  29. package/lib/utils/mediaSources.d.ts +4 -0
  30. package/lib/utils/mediaSources.d.ts.map +1 -1
  31. package/lib/utils/mediaSources.js +8 -6
  32. package/package.json +1 -1
  33. package/src/playback/dash-playback/DashPlayback.ts +1 -2
  34. package/src/playback/hls-playback/HlsPlayback.ts +1 -1
  35. package/src/playback/types.ts +10 -0
  36. package/src/playback.types.ts +0 -6
  37. package/src/plugins/multi-camera/MultiCamera.ts +103 -166
  38. package/src/plugins/source-controller/SourceController.ts +0 -39
  39. package/src/plugins/subtitles/ClosedCaptions.ts +1 -1
  40. package/src/utils/mediaSources.ts +10 -6
  41. package/tsconfig.tsbuildinfo +1 -1
  42. package/docs/api/player.multicamera.activebyid.md +0 -67
@@ -12554,6 +12554,9 @@ var PlayerEvent;
12554
12554
  PlayerEvent["VolumeUpdate"] = "volumeupdate";
12555
12555
  })(PlayerEvent || (PlayerEvent = {}));
12556
12556
 
12557
+ const MIME_TYPES_HLS = ['application/x-mpegurl', 'application/vnd.apple.mpegurl'];
12558
+ const MIME_TYPE_HLS = MIME_TYPES_HLS[0];
12559
+ const MIME_TYPE_DASH = 'application/dash+xml';
12557
12560
  // TODO rewrite using the Playback classes and canPlay static methods
12558
12561
  function buildMediaSourcesList(sources, priorityTransport = 'dash') {
12559
12562
  const playbacks = Loader.registeredPlaybacks;
@@ -12592,22 +12595,21 @@ function wrapSource(s) {
12592
12595
  }
12593
12596
  function guessMimeType(s) {
12594
12597
  if (s.endsWith('.mpd')) {
12595
- return 'application/dash+xml';
12598
+ return MIME_TYPE_DASH;
12596
12599
  }
12597
12600
  if (s.endsWith('.m3u8')) {
12598
- // return 'application/vnd.apple.mpegurl'
12599
- return 'application/x-mpegurl';
12601
+ return MIME_TYPE_HLS;
12600
12602
  }
12601
12603
  }
12602
12604
  function isDashSource(source, mimeType) {
12603
12605
  if (mimeType) {
12604
- return mimeType === 'application/dash+xml'; // TODO consider video/mp4
12606
+ return mimeType === MIME_TYPE_DASH; // TODO consider video/mp4
12605
12607
  }
12606
12608
  return source.endsWith('.mpd');
12607
12609
  }
12608
12610
  function isHlsSource(source, mimeType) {
12609
12611
  if (mimeType) {
12610
- return ['application/vnd.apple.mpegurl', 'application/x-mpegurl'].includes(mimeType.toLowerCase());
12612
+ return MIME_TYPES_HLS.includes(mimeType.toLowerCase());
12611
12613
  }
12612
12614
  return source.endsWith('.m3u8');
12613
12615
  }
@@ -57001,7 +57003,7 @@ class ErrorScreen extends UICorePlugin {
57001
57003
 
57002
57004
  insertStyle(".player-logo[data-logo] {\n position: absolute;\n z-index: 2;\n width: 100%;\n height: 100%;\n}\n\n.clappr-logo {\n position: absolute;\n}");
57003
57005
 
57004
- insertStyle("*,\n:focus,\n:visited {\n outline: none !important;\n}\n\n.multicamera[data-multicamera] {\n float: right;\n margin-top: 4px;\n position: relative;\n margin-right: 20px;\n width: 20px;\n}\n.multicamera[data-multicamera] button {\n background-color: transparent;\n color: #fff;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n border: none;\n font-size: 14px;\n padding: 0;\n}\n.multicamera[data-multicamera] button svg {\n height: 20px;\n position: relative;\n margin-top: 6px;\n}\n.multicamera[data-multicamera] button:hover {\n color: #c9c9c9;\n}\n.multicamera[data-multicamera] button.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.multicamera[data-multicamera] button span.quality-arrow {\n width: 9px;\n height: 6px;\n margin-top: 11px;\n margin-left: 5px;\n}\n.multicamera[data-multicamera] > ul {\n padding: 6px 0;\n right: -24px;\n width: 245px;\n list-style-type: none;\n position: absolute;\n bottom: 48px;\n border-radius: 4px;\n display: none;\n background-color: rgba(74, 74, 74, 0.9);\n}\n.multicamera[data-multicamera] > ul::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 85%;\n margin-left: -10px;\n width: 0;\n height: 0;\n border-top: 10px solid rgba(74, 74, 74, 0.9);\n border-right: 10px solid transparent;\n border-left: 10px solid transparent;\n}\n.multicamera[data-multicamera] li {\n font-size: 10px;\n cursor: pointer;\n}\n.multicamera[data-multicamera] li .multicamera-item {\n display: flex;\n padding: 10px 0;\n justify-content: center;\n position: relative;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-screenshot {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-text {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false]:hover {\n background-color: rgba(0, 0, 0, 0);\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] {\n pointer-events: none;\n}\n.multicamera[data-multicamera] li .multicamera-item:hover, .multicamera[data-multicamera] li .multicamera-item.multicamera-active {\n background-color: rgba(0, 0, 0, 0.3);\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot img {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text {\n width: 120px;\n text-align: left;\n margin-left: 15px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-title,\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n width: 120px;\n height: 20px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: 14px;\n font-weight: normal;\n font-style: normal;\n font-stretch: normal;\n line-height: 1.43;\n letter-spacing: normal;\n text-align: left;\n color: #fff;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n opacity: 0.6;\n}\n.multicamera[data-multicamera] li a {\n color: #444;\n padding: 2px 10px;\n display: block;\n text-decoration: none;\n}\n.multicamera[data-multicamera] li a:hover {\n background-color: #555;\n color: white;\n}\n.multicamera[data-multicamera] li a:hover a {\n color: white;\n text-decoration: none;\n}\n.multicamera[data-multicamera] li.current a {\n color: #f00;\n}");
57006
+ insertStyle("*,\n:focus,\n:visited {\n outline: none !important;\n}\n\n.multicamera[data-multicamera] {\n position: relative;\n order: 80;\n}\n.multicamera[data-multicamera] button {\n background-color: transparent;\n color: #fff;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n border: none;\n font-size: 14px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 20px;\n}\n.multicamera[data-multicamera] button svg {\n height: 20px;\n position: relative;\n}\n.multicamera[data-multicamera] button:hover {\n color: #c9c9c9;\n}\n.multicamera[data-multicamera] button.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.multicamera[data-multicamera] > ul {\n padding: 6px 0;\n right: -24px;\n width: 245px;\n list-style-type: none;\n position: absolute;\n bottom: 48px;\n border-radius: 4px;\n display: none;\n background-color: rgba(74, 74, 74, 0.9);\n}\n.multicamera[data-multicamera] > ul::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 85%;\n margin-left: -10px;\n width: 0;\n height: 0;\n border-top: 10px solid rgba(74, 74, 74, 0.9);\n border-right: 10px solid transparent;\n border-left: 10px solid transparent;\n}\n.multicamera[data-multicamera] li {\n font-size: 10px;\n cursor: pointer;\n}\n.multicamera[data-multicamera] li .multicamera-item {\n display: flex;\n padding: 10px 0;\n justify-content: center;\n position: relative;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-screenshot {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-text {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false]:hover {\n background-color: rgba(0, 0, 0, 0);\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] {\n pointer-events: none;\n}\n.multicamera[data-multicamera] li .multicamera-item:hover, .multicamera[data-multicamera] li .multicamera-item.multicamera-active {\n background-color: rgba(0, 0, 0, 0.3);\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot img {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text {\n width: 120px;\n text-align: left;\n margin-left: 15px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-title,\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n width: 120px;\n height: 20px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: 14px;\n font-weight: normal;\n font-style: normal;\n font-stretch: normal;\n line-height: 1.43;\n letter-spacing: normal;\n text-align: left;\n color: #fff;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n opacity: 0.6;\n}");
57005
57007
 
57006
57008
  const pipIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21.05 3.00001C21.302 3.00001 21.5435 3.10003 21.7217 3.27833C21.9 3.45646 22 3.69802 22 3.95003V10.6H20.1V4.90003H4.90001V18.2H10.6V20.1H3.95001C3.69802 20.1 3.45647 20 3.27832 19.8217C3.10002 19.6436 3 19.402 3 19.15V3.95001C3 3.69802 3.10002 3.45647 3.27832 3.27832C3.45644 3.10002 3.69801 3 3.95001 3L21.05 3.00001ZM21.05 12.5C21.302 12.5 21.5435 12.6 21.7217 12.7783C21.9 12.9565 22 13.198 22 13.45V19.15C22 19.402 21.9 19.6436 21.7217 19.8217C21.5436 20 21.302 20.1 21.05 20.1H13.45C13.198 20.1 12.9564 20 12.7783 19.8217C12.6 19.6436 12.5 19.402 12.5 19.15V13.45C12.5 13.198 12.6 12.9565 12.7783 12.7783C12.9564 12.6 13.198 12.5 13.45 12.5H21.05ZM7.47178 6.12823L9.60928 8.26572L11.5501 6.32492V11.5499H6.32509L8.26589 9.60911L6.12839 7.47161L7.47178 6.12823Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
57007
57009
 
@@ -58301,45 +58303,6 @@ function noSync(cb) {
58301
58303
  * `PLUGIN` that is managing the automatic failover between media sources.
58302
58304
  * @public
58303
58305
  * @remarks
58304
- * Have a look at the {@link https://miro.com/app/board/uXjVLiN15tY=/?share_link_id=390327585787 | source failover diagram} for the details
58305
- * on how sources ordering and selection works. Below is a simplified diagram:
58306
- *
58307
- * ```markdown
58308
- * sources_list:
58309
- * - a.mpd | +--------------------+
58310
- * - b.m3u8 |--->| init |
58311
- * - ... | |--------------------|
58312
- * | current_source = 0 |
58313
- * +--------------------+
58314
- * |
58315
- * | source = a.mpd
58316
- * | playback = dash.js
58317
- * v
58318
- * +------------------+
58319
- * +-->| load source |
58320
- * | +---------|--------+
58321
- * | v
58322
- * | +------------------+
58323
- * | | play |
58324
- * | +---------|--------+
58325
- * | |
58326
- * | v
58327
- * | +-----------------------+
58328
- * | | on playback_error |
58329
- * | |-----------------------|
58330
- * | | current_source = |
58331
- * | | (current_source + 1) |
58332
- * | | % len sources_list |
58333
- * | | |
58334
- * | | delay 1..3s |
58335
- * | +---------------|-------+
58336
- * | |
58337
- * | source=b.m3u8 |
58338
- * | playback=hls.js |
58339
- * +-------------------+
58340
- *
58341
- * ```
58342
- *
58343
58306
  * @example
58344
58307
  * ```ts
58345
58308
  * import { SourceController } from '@gcorevideo/player'
package/dist/index.js CHANGED
@@ -12778,6 +12778,9 @@ var PlayerEvent;
12778
12778
  PlayerEvent["VolumeUpdate"] = "volumeupdate";
12779
12779
  })(PlayerEvent || (PlayerEvent = {}));
12780
12780
 
12781
+ const MIME_TYPES_HLS = ['application/x-mpegurl', 'application/vnd.apple.mpegurl'];
12782
+ const MIME_TYPE_HLS = MIME_TYPES_HLS[0];
12783
+ const MIME_TYPE_DASH = 'application/dash+xml';
12781
12784
  // TODO rewrite using the Playback classes and canPlay static methods
12782
12785
  function buildMediaSourcesList(sources, priorityTransport = 'dash') {
12783
12786
  const playbacks = Loader.registeredPlaybacks;
@@ -12817,22 +12820,21 @@ function wrapSource(s) {
12817
12820
  }
12818
12821
  function guessMimeType(s) {
12819
12822
  if (s.endsWith('.mpd')) {
12820
- return 'application/dash+xml';
12823
+ return MIME_TYPE_DASH;
12821
12824
  }
12822
12825
  if (s.endsWith('.m3u8')) {
12823
- // return 'application/vnd.apple.mpegurl'
12824
- return 'application/x-mpegurl';
12826
+ return MIME_TYPE_HLS;
12825
12827
  }
12826
12828
  }
12827
12829
  function isDashSource(source, mimeType) {
12828
12830
  if (mimeType) {
12829
- return mimeType === 'application/dash+xml'; // TODO consider video/mp4
12831
+ return mimeType === MIME_TYPE_DASH; // TODO consider video/mp4
12830
12832
  }
12831
12833
  return source.endsWith('.mpd');
12832
12834
  }
12833
12835
  function isHlsSource(source, mimeType) {
12834
12836
  if (mimeType) {
12835
- return ['application/vnd.apple.mpegurl', 'application/x-mpegurl'].includes(mimeType.toLowerCase());
12837
+ return MIME_TYPES_HLS.includes(mimeType.toLowerCase());
12836
12838
  }
12837
12839
  return source.endsWith('.m3u8');
12838
12840
  }
@@ -51567,7 +51569,7 @@ class Player {
51567
51569
  }
51568
51570
  }
51569
51571
 
51570
- var version$1 = "2.28.36";
51572
+ var version$1 = "2.29.0";
51571
51573
 
51572
51574
  var packages = {
51573
51575
  "node_modules/@clappr/core": {
@@ -57958,14 +57960,10 @@ class Logo extends UIContainerPlugin {
57958
57960
  }
57959
57961
  }
57960
57962
 
57961
- const pluginHtml$3 = "<button data-multicamera-button class='gcore-skin-button-color'>\n <span class=\"multicamera-icon\"></span>\n</button>\n\n<ul class=\"gcore-skin-bg-color\">\n <% for (var i = 0; i < streams.length; i++) { %>\n <% if(!streams[i].live && multisources_mode === 'only_live') { %>\n <% continue; %>\n <% } %>\n <li>\n <div class=\"multicamera-item\" data-multicamera-selector-live=\"<%= streams[i].live %>\"\n data-multicamera-selector-select=\"<%= streams[i].id %>\">\n <div class=\"multicamera-screenshot\">\n <% if (streams[i].screenshot) { %>\n <img src=\"<%= streams[i].screenshot %>\" alt=\"<%= streams[i].title %>\"/>\n <% } %>\n </div>\n <div class=\"multicamera-text gcore-skin-text-color\">\n <% if (streams[i].title) { %>\n <div class=\"multicamera-title gcore-skin-text-color\"><%= streams[i].title %></div>\n <% } %>\n <% if (streams[i].description) { %>\n <div class=\"multicamera-description gcore-skin-text-color\"><%= streams[i].description %></div>\n <% } %>\n </div>\n </div>\n </li>\n <% } %>\n</ul>\n";
57963
+ const pluginHtml$3 = "<button data-multicamera-button class='gcore-skin-button-color media-control-button'>\n <span class=\"multicamera-icon\"></span>\n</button>\n\n<ul class=\"gcore-skin-bg-color\">\n <% for (var i=0; i < streams.length; i++) { %>\n <% if(!streams[i].live && multisources_mode==='only_live' ) { %>\n <% continue; %>\n <% } %>\n <li>\n <div class=\"multicamera-item\" data-multicamera-selector-live=\"<%= streams[i].live %>\"\n data-multicamera-selector-select=\"<%= streams[i].id %>\">\n <div class=\"multicamera-screenshot\">\n <% if (streams[i].screenshot) { %>\n <img src=\"<%= streams[i].screenshot %>\" alt=\"<%= streams[i].title %>\" />\n <% } %>\n </div>\n <div class=\"multicamera-text gcore-skin-text-color\">\n <% if (streams[i].title) { %>\n <div class=\"multicamera-title gcore-skin-text-color\">\n <%= streams[i].title %>\n </div>\n <% } %>\n <% if (streams[i].description) { %>\n <div class=\"multicamera-description gcore-skin-text-color\">\n <%= streams[i].description %>\n </div>\n <% } %>\n </div>\n </div>\n </li>\n <% } %>\n</ul>";
57962
57964
 
57963
57965
  const streamsIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"20\" viewBox=\"0 0 24 20\">\n <path fill=\"#FFF\" fill-rule=\"nonzero\" d=\"M24 1.5v13a1.5 1.5 0 0 1-1.5 1.5h-1a.5.5 0 0 1-.5-.5v-10A2.5 2.5 0 0 0 18.5 3h-14a.5.5 0 0 1-.5-.5v-1A1.5 1.5 0 0 1 5.5 0h17A1.5 1.5 0 0 1 24 1.5M12.724 12.447l-5 2.5a.505.505 0 0 1-.487-.021A.503.503 0 0 1 7 14.5v-5c0-.173.09-.334.237-.426a.505.505 0 0 1 .487-.021l5 2.5a.5.5 0 0 1 0 .894M18.5 4h-17C.673 4 0 4.673 0 5.5v13c0 .827.673 1.5 1.5 1.5h17c.827 0 1.5-.673 1.5-1.5v-13c0-.827-.673-1.5-1.5-1.5\"/>\n</svg>\n";
57964
57966
 
57965
- const streamsMomentoIcon = "<svg id=\"Слой_1\" data-name=\"Слой 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 230.73 173.61\"><defs><style>.cls-1{fill:#fff;}</style></defs><path class=\"cls-1\" d=\"M71.82,16.09c11.43,0,22.87-.05,34.31,0,12,.06,19.45,7.45,19.7,19.52.23,11.31.23,11.31,11.81,11.31q24.36,0,48.73,0c12.74,0,20.21,7.3,20.27,19.88q.11,24.12,0,48.23c-.06,12.66-7.12,19.65-19.75,19.77-2,0-4,0-6,0-7.78,0-7.84.05-6,7.79a59.23,59.23,0,0,0,1.95,6.67c1.44,3.95.33,7.18-2.66,9.82-3.28,2.89-6.93,2.88-10.59.76-9.31-5.4-16.95-12.73-23.55-21.11-2.29-2.93-4.66-4.2-8.35-4-5.12.28-10.28.19-15.41,0-10.39-.37-17.64-7.65-18.09-18a62.93,62.93,0,0,0-.09-6.45c-.3-2.07,1.6-5.54-1.49-6-3.62-.48-7.92-2.08-11.07,1.89-6.09,7.7-12.82,14.76-21,20.24a42,42,0,0,1-5.09,3.08,8.16,8.16,0,0,1-9.29-1.12,8.25,8.25,0,0,1-3-8.86c1-4,2-8,3-12,.59-2.51-.34-3.66-3.07-3.59-4.14.12-8.3.14-12.43-.11-9.61-.59-16.86-7.76-17-17.42-.24-17.57-.21-35.14,0-52.71.12-10.07,8-17.46,18.43-17.58C48,16,59.88,16.09,71.82,16.09ZM56.66,120.5c2.53-.3,3.87-1.89,5.38-3.08A99.31,99.31,0,0,0,79.83,98.8a8.72,8.72,0,0,1,8-3.83c6.12.18,12.25.12,18.38,0,7.31-.12,10.6-3.39,10.64-10.72q.11-24.33,0-48.68c0-7-3.5-10.51-10.36-10.53q-35-.11-70,0c-6.34,0-9.92,3.51-9.95,9.83q-.15,25.08,0,50.18c0,6.37,3.42,9.72,9.86,9.89,5.62.14,11.26.1,16.89.06,4.37,0,6.2,2,6.25,6.4C59.55,107.88,58.17,114.1,56.66,120.5ZM167.78,152c-1.93-6.72-3.37-12.44-3.41-18.4,0-6.33,1.17-7.71,7.37-7.77,5-.05,9.94.06,14.9,0,7.6-.13,10.79-3.35,10.81-11q.08-23.85,0-47.69c0-7.61-3.38-11-10.86-11.08-18.88-.07-37.76,0-56.64-.08-3.21,0-4.29.89-4.2,4.21.24,8.27.18,16.56,0,24.83-.13,8.6-4.46,16.11-11.88,17.55-6.73,1.3-7.44,4.81-6.78,10.16.14,1.14,0,2.32,0,3.48.3,6.1,3.53,9.44,9.69,9.63,5.79.18,11.6.34,17.38,0,4.81-.31,7.94,1.3,10.83,5.22A79.08,79.08,0,0,0,167.78,152Z\"/><path class=\"cls-1\" d=\"M73.07,56c-6.4,0-12.15-.06-17.9,0-3.28,0-5.76-1-5.68-4.63s2.66-4.59,5.88-4.45c1.49.06,3-.12,4.47,0,4.79.46,8.51.12,7.44-6.47-.43-2.67,1.82-4.32,4.42-4.26s4.81,1.75,4.35,4.4c-1.18,6.75,2.76,6.72,7.44,6.34a43.43,43.43,0,0,1,6.45.09,4,4,0,0,1,4,4.17c0,2.59-1.46,4.88-4.17,4.48-7-1-7.55,5.72-11.08,8.81-1.54,1.35.36,2.28,1.27,3.06,2.13,1.83,4.38,3.53,6.52,5.36s2.74,4.28.8,6.54c-1.74,2-4,2-6.27.53-.28-.18-.52-.41-.79-.6-3.22-2.29-5.94-6.88-9.46-6.66s-6.61,4-9.91,6.17a19.94,19.94,0,0,1-2.55,1.52c-2.51,1.19-5,1.29-6.46-1.44-1.42-2.57-.6-4.82,1.91-6.34A88.31,88.31,0,0,0,68.17,62.07C69.84,60.52,71.73,59.09,73.07,56Z\"/><path class=\"cls-1\" d=\"M153,104.27a43.76,43.76,0,0,1-4.91,0c-3.27-.4-5.24.75-6.27,4-.9,2.88-2.84,5.23-6.28,3.82-3.66-1.5-3.21-4.49-1.94-7.52,4.68-11.12,9.36-22.22,13.94-33.37,1-2.36,2.28-4.1,5-4.08s3.89,2,4.85,4.25c4.66,11.11,9.4,22.2,14.14,33.28,1.3,3,1.69,6-2,7.46-3.4,1.35-5.49-.73-6.29-3.74C161.49,102,156.3,105.12,153,104.27Zm-.84-20.39a64.73,64.73,0,0,1-2.78,6.37c-2.25,3.89-1.16,4.85,3.14,4.89s4.82-1.35,2.93-4.73C154.36,88.42,154.15,86,152.18,83.88Z\"/></svg>";
57966
-
57967
- const streamsWhiteNightsIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"50\" height=\"50\" viewBox=\"0 0 50 50\">\n <defs>\n <clipPath id=\"clip-Icon\">\n <rect width=\"50\" height=\"50\"/>\n </clipPath>\n </defs>\n <g id=\"Icon\" clip-path=\"url(#clip-Icon)\">\n <g id=\"icon2\" transform=\"translate(-0.041 0)\">\n <path id=\"Контур_77\" data-name=\"Контур 77\" d=\"M6.493,13v8.266h6.275V19.74H8.31V17.714h4.006V16.3H8.31V14.53h4.365V13Zm7.5,0v8.266h1.7V15.732h.023l3.438,5.534h1.818V13h-1.7v5.545h-.023L15.8,13Z\" fill=\"#fff\"/>\n <path id=\"Контур_76\" data-name=\"Контур 76\" d=\"M29.949,29.1V26.774H31.94a1.4,1.4,0,0,1,.938.272,1.1,1.1,0,0,1,.313.874,1.155,1.155,0,0,1-.313.9,1.375,1.375,0,0,1-.938.278ZM28.132,25.36v8.266h1.817V30.4h1.818a1.353,1.353,0,0,1,.984.3,1.637,1.637,0,0,1,.394.949c.046.333.079.681.1,1.042a3.2,3.2,0,0,0,.185.938h1.819a1.218,1.218,0,0,1-.191-.423,3.611,3.611,0,0,1-.093-.527c-.019-.185-.033-.367-.041-.544s-.016-.332-.023-.463a5.052,5.052,0,0,0-.087-.625,2.109,2.109,0,0,0-.2-.573,1.586,1.586,0,0,0-.359-.451,1.414,1.414,0,0,0-.556-.284v-.023a1.926,1.926,0,0,0,1-.81,2.494,2.494,0,0,0,.307-1.262,2.308,2.308,0,0,0-.165-.88,2.128,2.128,0,0,0-.486-.724,2.3,2.3,0,0,0-.764-.492,2.67,2.67,0,0,0-1-.179ZM43.506,30.5V25.36H41.689V30.5a2.065,2.065,0,0,1-.37,1.36,1.7,1.7,0,0,1-1.343.434,2.086,2.086,0,0,1-.886-.156,1.283,1.283,0,0,1-.758-.978,3.748,3.748,0,0,1-.058-.66V25.36H36.456V30.5a3.16,3.16,0,0,0,.92,2.5,3.807,3.807,0,0,0,2.6.81,3.82,3.82,0,0,0,2.593-.816,3.132,3.132,0,0,0,.937-2.492Z\" fill=\"#fff\"/>\n <path id=\"Контур_80\" data-name=\"Контур 80\" d=\"M22.646,31.2H4.689a4.505,4.505,0,0,1-4.5-4.5V8.5A4.505,4.505,0,0,1,4.689,4h18.2a4.505,4.505,0,0,1,4.5,4.5v8.445l-.893.1a3.184,3.184,0,0,0-2.846,3.177V30.5l-.465.7ZM4.689,6a2.5,2.5,0,0,0-2.5,2.5V26.7a2.5,2.5,0,0,0,2.5,2.5H21.65V20.22a5.18,5.18,0,0,1,3.739-4.992V8.5a2.5,2.5,0,0,0-2.5-2.5Z\" fill=\"#fff\"/>\n <path id=\"Контур_81\" data-name=\"Контур 81\" d=\"M30.127,47.884a1,1,0,0,1-1-1V43.267H26.846a5.206,5.206,0,0,1-5.2-5.2V20.222a5.206,5.206,0,0,1,5.2-5.2H44.692a5.206,5.206,0,0,1,5.2,5.2V38.068a5.206,5.206,0,0,1-5.2,5.2H35.058l-4.216,4.316A1,1,0,0,1,30.127,47.884ZM26.846,17.022a3.2,3.2,0,0,0-3.2,3.2V38.067a3.2,3.2,0,0,0,3.2,3.2h3.281a1,1,0,0,1,1,1v2.162l2.8-2.86a1,1,0,0,1,.715-.3H44.692a3.2,3.2,0,0,0,3.2-3.2V20.222a3.2,3.2,0,0,0-3.2-3.2Z\" fill=\"#fff\"/>\n </g>\n </g>\n</svg>\n";
57968
-
57969
57967
  const VERSION$4 = '0.0.1';
57970
57968
  const T$6 = 'plugins.multicamera';
57971
57969
  /**
@@ -58013,6 +58011,8 @@ class MultiCamera extends UICorePlugin {
58013
58011
  // Don't mutate the options, TODO check if some plugin observes the options.multicamera
58014
58012
  this.multicamera = this.options.multisources.map((item) => ({ ...item }));
58015
58013
  this.noActiveStreams = this.multicamera.every((item) => !item.live);
58014
+ // TODO filter out non-live
58015
+ this.core.options.sources = expandMediaSource(this.multicamera[0]);
58016
58016
  }
58017
58017
  bindEvents() {
58018
58018
  this.listenTo(this.core, Events$1.CORE_READY, this.bindPlaybackEvents);
@@ -58021,15 +58021,10 @@ class MultiCamera extends UICorePlugin {
58021
58021
  this.listenTo(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectLevelMenu);
58022
58022
  }
58023
58023
  unBindEvents() {
58024
- // @ts-ignore
58025
- this.stopListening(this.core, Events$1.CORE_READY);
58026
- // @ts-ignore
58027
- this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED);
58028
- // @ts-ignore
58029
- this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED);
58030
- // @ts-ignore
58031
- this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE);
58032
- // @ts-ignore
58024
+ this.stopListening(this.core, Events$1.CORE_READY, this.bindPlaybackEvents);
58025
+ this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_CONTAINERCHANGED, this.reload);
58026
+ this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
58027
+ this.stopListening(this.core.mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideSelectLevelMenu);
58033
58028
  this.stopListening(this.core.activePlayback, Events$1.PLAYBACK_PLAY, this.onPlay);
58034
58029
  }
58035
58030
  onPlay() {
@@ -58045,80 +58040,53 @@ class MultiCamera extends UICorePlugin {
58045
58040
  this.bindPlaybackEvents();
58046
58041
  }
58047
58042
  shouldRender() {
58048
- if (!this.core.activeContainer || this.noActiveStreams) {
58049
- return false;
58050
- }
58051
- if (!this.core.activePlayback) {
58043
+ if (this.noActiveStreams) {
58052
58044
  return false;
58053
58045
  }
58054
58046
  return this.multicamera.length >= 2;
58055
58047
  }
58056
58048
  render() {
58057
- if (this.shouldRender()) {
58058
- let numActiveSources = 0;
58059
- // const currentSource = this.core.options.source
58060
- const currentSource = this.core.activePlayback?.sourceMedia;
58061
- for (const item of this.multicamera) {
58062
- if (item.live) {
58063
- numActiveSources++;
58064
- }
58065
- if (!this.currentCamera && item.source === currentSource) {
58066
- this.currentCamera = item;
58067
- }
58068
- }
58069
- // const mediaControl = this.core.getPlugin('media_control')
58070
- if (this.currentTime &&
58071
- // TODO check the last active playback type instead
58072
- // !mediaControl.$el.hasClass('live') &&
58073
- this.core.getPlaybackType() !== Playback.LIVE) {
58074
- if (this.currentTime < this.core.activePlayback.getDuration()) {
58075
- this.core.activePlayback.seek(this.currentTime);
58076
- }
58077
- this.currentTime = 0;
58078
- // if (mediaControl.$el.hasClass('dvr')) {
58079
- // this.core.activeContainer.dvrInUse = true;
58080
- // }
58081
- }
58082
- // TODO current source
58083
- this.$el.html(this.template({
58084
- streams: this.multicamera,
58085
- multisources_mode: this.options.multisourcesMode,
58086
- }));
58087
- if ((numActiveSources <= 1 &&
58088
- this.options.multisourcesMode !== 'show_all') ||
58089
- this.options.multisourcesMode === 'one_first') {
58090
- this.$el.hide();
58091
- }
58092
- else {
58093
- this.$el.show();
58049
+ if (!this.core.activeContainer || !this.core.activePlayback) {
58050
+ return this;
58051
+ }
58052
+ if (!this.shouldRender()) {
58053
+ return this;
58054
+ }
58055
+ let numActiveSources = 0;
58056
+ const currentSource = this.core.activePlayback?.sourceMedia;
58057
+ for (const item of this.multicamera) {
58058
+ if (item.live) {
58059
+ numActiveSources++;
58094
58060
  }
58095
- if (this.core.mediaControl.$multiCameraSelector &&
58096
- this.core.mediaControl.$multiCameraSelector.length > 0) {
58097
- this.core.mediaControl.$multiCameraSelector.append(this.el);
58061
+ if (!this.currentCamera && item.source === currentSource) {
58062
+ this.currentCamera = item;
58098
58063
  }
58099
- else {
58100
- this.core.mediaControl.$('.media-control-right-panel').append(this.el);
58101
- }
58102
- if (Object.prototype.hasOwnProperty.call(this.core.mediaControl, '$multiCameraSelector') &&
58103
- this.core.mediaControl.$multiCameraSelector.find('span.multicamera-icon').length > 0) {
58104
- if (~window.location.href.indexOf('whitenights.gcdn.co')) {
58105
- this.core.mediaControl.$multiCameraSelector
58106
- .find('span.multicamera-icon')
58107
- .append(streamsWhiteNightsIcon);
58108
- }
58109
- else if (~window.location.href.indexOf('momentosolutions.gcdn.co')) {
58110
- this.core.mediaControl.$multiCameraSelector
58111
- .find('span.multicamera-icon')
58112
- .append(streamsMomentoIcon);
58113
- }
58114
- else {
58115
- this.core.mediaControl.$multiCameraSelector
58116
- .find('span.multicamera-icon')
58117
- .append(streamsIcon);
58118
- }
58064
+ }
58065
+ if (this.currentTime &&
58066
+ this.core.getPlaybackType() !== Playback.LIVE) {
58067
+ if (this.currentTime < this.core.activePlayback.getDuration()) {
58068
+ this.core.activePlayback.seek(this.currentTime);
58119
58069
  }
58120
- this.highlightCurrentLevel();
58070
+ this.currentTime = 0;
58071
+ }
58072
+ this.$el.html(this.template({
58073
+ streams: this.multicamera,
58074
+ multisources_mode: this.options.multisourcesMode,
58075
+ }));
58076
+ if ((numActiveSources < 2 &&
58077
+ this.options.multisourcesMode !== 'show_all') ||
58078
+ this.options.multisourcesMode === 'one_first') {
58079
+ this.$el.hide();
58121
58080
  }
58081
+ else {
58082
+ this.$el.show();
58083
+ }
58084
+ const mediaControl = this.core.getPlugin('media_control');
58085
+ mediaControl.slot('multicamera', this.$el);
58086
+ this.$el
58087
+ .find('span.multicamera-icon')
58088
+ .html(streamsIcon);
58089
+ this.highlightCurrentLevel();
58122
58090
  return this;
58123
58091
  }
58124
58092
  onCameraSelect(event) {
@@ -58131,33 +58099,6 @@ class MultiCamera extends UICorePlugin {
58131
58099
  event.stopPropagation();
58132
58100
  return false;
58133
58101
  }
58134
- activeById(id, active) {
58135
- this.setLiveStatus(id, active);
58136
- if (!this.currentCamera && !this.noActiveStreams) {
58137
- return;
58138
- }
58139
- if (this.noActiveStreams && !active) {
58140
- return;
58141
- }
58142
- if (this.currentCamera) {
58143
- if (this.options.multisourcesMode === 'only_live') {
58144
- this.behaviorLive(id, active);
58145
- }
58146
- if (this.options.multisourcesMode === 'one_first') {
58147
- this.behaviorOne(id, active);
58148
- }
58149
- if (this.options.multisourcesMode === 'show_all') {
58150
- this.behaviorAll(id, active);
58151
- }
58152
- }
58153
- else {
58154
- if (this.noActiveStreams && active) {
58155
- this.changeById(id);
58156
- this.noActiveStreams = false;
58157
- }
58158
- }
58159
- this.render();
58160
- }
58161
58102
  setLiveStatus(id, active) {
58162
58103
  try {
58163
58104
  const index = this.findIndexById(id);
@@ -58220,7 +58161,6 @@ class MultiCamera extends UICorePlugin {
58220
58161
  this.currentCamera = null;
58221
58162
  this.noActiveStreams = true;
58222
58163
  this.core.trigger('core:multicamera:no_active_translation');
58223
- // this.changeById(this.multicamera[nextIndex].id);
58224
58164
  }
58225
58165
  showError() {
58226
58166
  this.core.activePlayback.pause();
@@ -58243,7 +58183,7 @@ class MultiCamera extends UICorePlugin {
58243
58183
  }
58244
58184
  hideError() {
58245
58185
  try {
58246
- this.core.mediaControl.enableControlButton();
58186
+ this.core.getPlugin('media_control')?.enableControlButton();
58247
58187
  }
58248
58188
  catch (error) {
58249
58189
  reportError(error);
@@ -58253,14 +58193,9 @@ class MultiCamera extends UICorePlugin {
58253
58193
  trace(`${T$6} changeById`, { id });
58254
58194
  queueMicrotask(() => {
58255
58195
  const playbackOptions = this.core.options.playback || {};
58256
- // TODO figure out what this does
58196
+ // TODO figure out if it's needed
58257
58197
  playbackOptions.recycleVideo = Browser.isMobile;
58258
- this.currentCamera = this.findElementById(id) ?? null;
58259
- trace(`${T$6} changeById`, {
58260
- id,
58261
- currentCamera: this.currentCamera,
58262
- multicamera: this.multicamera,
58263
- });
58198
+ this.currentCamera = this.findElementById(id);
58264
58199
  if (!this.currentCamera) {
58265
58200
  return;
58266
58201
  }
@@ -58282,26 +58217,16 @@ class MultiCamera extends UICorePlugin {
58282
58217
  this.core.configure({
58283
58218
  playback: playbackOptions,
58284
58219
  source: this.currentCamera.source, // TODO ensure that the preferred transport is used
58285
- video360: {
58286
- // TODO
58287
- projection: this.currentCamera.projection,
58288
- },
58289
58220
  fullscreenDisable,
58290
58221
  autoPlay: this.playing,
58291
58222
  disableCanAutoPlay: true,
58292
58223
  });
58293
- this.core.activeContainer.mediaControlDisabled = false;
58224
+ this.core.activeContainer?.enableMediaControl();
58294
58225
  });
58295
58226
  this.toggleContextMenu();
58296
58227
  }
58297
- getCamerasList() {
58298
- return this.multicamera;
58299
- }
58300
- getCurrentCamera() {
58301
- return this.currentCamera;
58302
- }
58303
58228
  findElementById(id) {
58304
- return this.multicamera.find((element) => element.id === id);
58229
+ return this.multicamera.find((element) => element.id === id) ?? null;
58305
58230
  }
58306
58231
  findIndexById(id) {
58307
58232
  return this.multicamera.findIndex((element) => element.id === id);
@@ -58310,19 +58235,13 @@ class MultiCamera extends UICorePlugin {
58310
58235
  this.toggleContextMenu();
58311
58236
  }
58312
58237
  hideSelectLevelMenu() {
58313
- this.$('.multicamera ul').hide();
58238
+ this.$('ul').hide();
58314
58239
  }
58315
58240
  toggleContextMenu() {
58316
- this.$('.multicamera ul').toggle();
58241
+ this.$('ul').toggle();
58317
58242
  }
58318
- // private buttonElement(): ZeptoResult {
58319
- // return this.$('.multicamera button');
58320
- // }
58321
- // private buttonElementText(): ZeptoResult {
58322
- // return this.$('.multicamera button .quality-text');
58323
- // }
58324
58243
  levelElement(id) {
58325
- return this.$('.multicamera ul li > div' +
58244
+ return this.$('ul .multicamera-item' +
58326
58245
  (id !== undefined
58327
58246
  ? '[data-multicamera-selector-select="' + id + '"]'
58328
58247
  : ''));
@@ -58334,6 +58253,22 @@ class MultiCamera extends UICorePlugin {
58334
58253
  this.levelElement(this.currentCamera.id).addClass('multicamera-active');
58335
58254
  }
58336
58255
  }
58256
+ function expandMediaSource(source) {
58257
+ const result = [{
58258
+ source: source.source,
58259
+ mimeType: guessMimeType(source.source),
58260
+ }];
58261
+ if (source.source_dash) {
58262
+ result.push({
58263
+ source: source.source_dash,
58264
+ mimeType: MIME_TYPE_DASH,
58265
+ });
58266
+ }
58267
+ if (source.hls_mpegts_url) {
58268
+ result.push(source.hls_mpegts_url);
58269
+ }
58270
+ return result;
58271
+ }
58337
58272
 
58338
58273
  const pipIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21.05 3.00001C21.302 3.00001 21.5435 3.10003 21.7217 3.27833C21.9 3.45646 22 3.69802 22 3.95003V10.6H20.1V4.90003H4.90001V18.2H10.6V20.1H3.95001C3.69802 20.1 3.45647 20 3.27832 19.8217C3.10002 19.6436 3 19.402 3 19.15V3.95001C3 3.69802 3.10002 3.45647 3.27832 3.27832C3.45644 3.10002 3.69801 3 3.95001 3L21.05 3.00001ZM21.05 12.5C21.302 12.5 21.5435 12.6 21.7217 12.7783C21.9 12.9565 22 13.198 22 13.45V19.15C22 19.402 21.9 19.6436 21.7217 19.8217C21.5436 20 21.302 20.1 21.05 20.1H13.45C13.198 20.1 12.9564 20 12.7783 19.8217C12.6 19.6436 12.5 19.402 12.5 19.15V13.45C12.5 13.198 12.6 12.9565 12.7783 12.7783C12.9564 12.6 13.198 12.5 13.45 12.5H21.05ZM7.47178 6.12823L9.60928 8.26572L11.5501 6.32492V11.5499H6.32509L8.26589 9.60911L6.12839 7.47161L7.47178 6.12823Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
58339
58274
 
@@ -59764,45 +59699,6 @@ function noSync(cb) {
59764
59699
  * `PLUGIN` that is managing the automatic failover between media sources.
59765
59700
  * @public
59766
59701
  * @remarks
59767
- * Have a look at the {@link https://miro.com/app/board/uXjVLiN15tY=/?share_link_id=390327585787 | source failover diagram} for the details
59768
- * on how sources ordering and selection works. Below is a simplified diagram:
59769
- *
59770
- * ```markdown
59771
- * sources_list:
59772
- * - a.mpd | +--------------------+
59773
- * - b.m3u8 |--->| init |
59774
- * - ... | |--------------------|
59775
- * | current_source = 0 |
59776
- * +--------------------+
59777
- * |
59778
- * | source = a.mpd
59779
- * | playback = dash.js
59780
- * v
59781
- * +------------------+
59782
- * +-->| load source |
59783
- * | +---------|--------+
59784
- * | v
59785
- * | +------------------+
59786
- * | | play |
59787
- * | +---------|--------+
59788
- * | |
59789
- * | v
59790
- * | +-----------------------+
59791
- * | | on playback_error |
59792
- * | |-----------------------|
59793
- * | | current_source = |
59794
- * | | (current_source + 1) |
59795
- * | | % len sources_list |
59796
- * | | |
59797
- * | | delay 1..3s |
59798
- * | +---------------|-------+
59799
- * | |
59800
- * | source=b.m3u8 |
59801
- * | playback=hls.js |
59802
- * +-------------------+
59803
- *
59804
- * ```
59805
- *
59806
59702
  * @example
59807
59703
  * ```ts
59808
59704
  * import { SourceController } from '@gcorevideo/player'
@@ -909,6 +909,28 @@ Identifies a location for mounting custom media control elements.
909
909
 
910
910
 
911
911
 
912
+ </td></tr>
913
+ <tr><td>
914
+
915
+ [MulticCameraSourceInfo](./player.multiccamerasourceinfo.md)
916
+
917
+
918
+ </td><td>
919
+
920
+ **_(BETA)_** Extended media source description
921
+
922
+
923
+ </td></tr>
924
+ <tr><td>
925
+
926
+ [MultisourcesMode](./player.multisourcesmode.md)
927
+
928
+
929
+ </td><td>
930
+
931
+ **_(BETA)_**
932
+
933
+
912
934
  </td></tr>
913
935
  <tr><td>
914
936
 
@@ -1163,15 +1185,6 @@ Preferred streaming media delivery protocol
1163
1185
 
1164
1186
 
1165
1187
 
1166
- </td></tr>
1167
- <tr><td>
1168
-
1169
- [VTTCueInfo](./player.vttcueinfo.md)
1170
-
1171
-
1172
- </td><td>
1173
-
1174
-
1175
1188
  </td></tr>
1176
1189
  <tr><td>
1177
1190
 
@@ -0,0 +1,56 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@gcorevideo/player](./player.md) &gt; [MediaControl](./player.mediacontrol.md) &gt; [setKeepVisible](./player.mediacontrol.setkeepvisible.md)
4
+
5
+ ## MediaControl.setKeepVisible() method
6
+
7
+ Set or reset the keep visibility state
8
+
9
+ Keep visibility state controls whether the media control is hidden automatically after a delay, which is a default behaviour.
10
+
11
+ **Signature:**
12
+
13
+ ```typescript
14
+ setKeepVisible(keepVisible: boolean): void;
15
+ ```
16
+
17
+ ## Parameters
18
+
19
+ <table><thead><tr><th>
20
+
21
+ Parameter
22
+
23
+
24
+ </th><th>
25
+
26
+ Type
27
+
28
+
29
+ </th><th>
30
+
31
+ Description
32
+
33
+
34
+ </th></tr></thead>
35
+ <tbody><tr><td>
36
+
37
+ keepVisible
38
+
39
+
40
+ </td><td>
41
+
42
+ boolean
43
+
44
+
45
+ </td><td>
46
+
47
+ The state
48
+
49
+
50
+ </td></tr>
51
+ </tbody></table>
52
+
53
+ **Returns:**
54
+
55
+ void
56
+
@@ -223,20 +223,6 @@ Description
223
223
  </th></tr></thead>
224
224
  <tbody><tr><td>
225
225
 
226
- [activeById(id, active)](./player.multicamera.activebyid.md)
227
-
228
-
229
- </td><td>
230
-
231
-
232
- </td><td>
233
-
234
- **_(BETA)_**
235
-
236
-
237
- </td></tr>
238
- <tr><td>
239
-
240
226
  [bindEvents()](./player.multicamera.bindevents.md)
241
227
 
242
228
 
@@ -262,20 +248,6 @@ Description
262
248
  **_(BETA)_**
263
249
 
264
250
 
265
- </td></tr>
266
- <tr><td>
267
-
268
- [unBindEvents()](./player.multicamera.unbindevents.md)
269
-
270
-
271
- </td><td>
272
-
273
-
274
- </td><td>
275
-
276
- **_(BETA)_**
277
-
278
-
279
251
  </td></tr>
280
252
  </tbody></table>
281
253