@gcorevideo/player 2.21.3 → 2.21.6
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/assets/audio-selector/style.scss +1 -1
- package/assets/audio-selector/track-selector.ejs +3 -3
- package/assets/bottom-gear/bottomgear.ejs +2 -2
- package/assets/dvr-controls/dvr_controls.scss +7 -25
- package/assets/dvr-controls/index.ejs +2 -2
- package/assets/media-control/container.scss +1 -1
- package/assets/media-control/media-control.ejs +1 -6
- package/assets/media-control/media-control.scss +14 -7
- package/assets/media-control/width270.scss +1 -1
- package/assets/media-control/width370.scss +5 -5
- package/assets/playback-rate/button.ejs +2 -2
- package/assets/playback-rate/list.ejs +4 -4
- package/assets/style/theme.scss +1 -1
- package/assets/subtitles/combobox.ejs +5 -5
- package/assets/subtitles/string.ejs +1 -1
- package/assets/subtitles/style.scss +2 -2
- package/dist/core.js +2 -1
- package/dist/index.css +993 -993
- package/dist/index.js +199 -178
- package/dist/player.d.ts +141 -119
- package/dist/plugins/index.css +1118 -1118
- package/dist/plugins/index.js +191 -173
- package/docs/api/player.bottomgear.getelement.md +2 -2
- package/docs/api/player.bottomgear.md +1 -1
- package/docs/api/{player.subtitles.hide.md → player.closedcaptions.hide.md} +2 -2
- package/docs/api/{player.subtitles.md → player.closedcaptions.md} +11 -11
- package/docs/api/{player.subtitles.show.md → player.closedcaptions.show.md} +2 -2
- package/docs/api/player.closedcaptionspluginsettings.md +13 -0
- package/docs/api/player.gearitemelement.md +6 -4
- package/docs/api/player.gearoptionsitem.md +16 -0
- package/docs/api/player.md +48 -12
- package/docs/api/player.mediacontrol.putelement.md +2 -2
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/docs/api/player.playbackrate.md +1 -1
- package/docs/api/player.subtitlespluginsettings.md +18 -0
- package/docs/api/player.texttrackitem.id.md +11 -0
- package/docs/api/player.texttrackitem.md +87 -0
- package/docs/api/player.texttrackitem.name.md +11 -0
- package/docs/api/player.texttrackitem.track.md +11 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.plugins.d.ts +2 -1
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +2 -1
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +1 -0
- package/lib/plugins/audio-selector/AudioSelector.d.ts +2 -3
- package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.js +6 -7
- package/lib/plugins/bottom-gear/BottomGear.d.ts +6 -2
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +2 -1
- package/lib/plugins/dvr-controls/DvrControls.d.ts +0 -3
- package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
- package/lib/plugins/dvr-controls/DvrControls.js +13 -38
- package/lib/plugins/media-control/MediaControl.d.ts +14 -18
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +105 -72
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +1 -0
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
- package/lib/plugins/picture-in-picture/PictureInPicture.js +4 -4
- package/lib/plugins/playback-rate/PlaybackRate.d.ts +0 -1
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +23 -14
- package/lib/plugins/subtitles/ClosedCaptions.d.ts +118 -0
- package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -0
- package/lib/plugins/subtitles/ClosedCaptions.js +348 -0
- package/lib/plugins/subtitles/Subtitles.d.ts +12 -9
- package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -1
- package/lib/plugins/subtitles/Subtitles.js +31 -32
- package/lib/testUtils.d.ts +26 -19
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +30 -45
- package/package.json +1 -1
- package/src/index.plugins.ts +2 -1
- package/src/index.ts +1 -1
- package/src/playback/dash-playback/DashPlayback.ts +1 -0
- package/src/plugins/audio-selector/AudioSelector.ts +9 -8
- package/src/plugins/bottom-gear/BottomGear.ts +11 -4
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -1
- package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +2 -2
- package/src/plugins/dvr-controls/DvrControls.ts +16 -44
- package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +18 -22
- package/src/plugins/dvr-controls/__tests__/__snapshots__/DvrControls.test.ts.snap +6 -30
- package/src/plugins/media-control/MediaControl.ts +130 -85
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +132 -0
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +299 -0
- package/src/plugins/picture-in-picture/PictureInPicture.ts +5 -5
- package/src/plugins/playback-rate/PlaybackRate.ts +142 -100
- package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +65 -0
- package/src/plugins/playback-rate/__tests__/__snapshots__/PlaybackRate.test.ts.snap +11 -0
- package/src/plugins/subtitles/{Subtitles.ts → ClosedCaptions.ts} +42 -34
- package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +58 -0
- package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +25 -0
- package/src/testUtils.ts +30 -45
- package/temp/player.api.json +269 -89
- package/tsconfig.tsbuildinfo +1 -1
- package/src/plugins/index.ts +0 -39
package/dist/plugins/index.js
CHANGED
|
@@ -9775,7 +9775,7 @@ function ifError(err) {
|
|
|
9775
9775
|
// export const CLAPPR_VERSION: string = process.env.CLAPPR_VERSION || '0.11.3';
|
|
9776
9776
|
const CLAPPR_VERSION = '0.11.3';
|
|
9777
9777
|
|
|
9778
|
-
const pluginHtml$7 = "<button data-
|
|
9778
|
+
const pluginHtml$7 = "<button data-audiotracks-button class='gcore-skin-button-color' id=\"audiotracks-button\">\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"></span>\n</button>\n<ul class='gcore-skin-bg-color' id=\"audiotracks-select\">\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-audiotracks-select=\"<%= track.id %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
|
|
9779
9779
|
|
|
9780
9780
|
const audioArrow = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg width=\"9px\" height=\"6px\" viewBox=\"0 0 9 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <!-- Generator: Sketch 49 (51002) - http://www.bohemiancoding.com/sketch -->\n <title>quality-arrow</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"quality-arrow\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M5.07079194,5.78553848 C4.91457318,5.94277844 4.70551573,6.00941824 4.50028717,5.99893557 C4.2950586,6.00941824 4.08676693,5.94277844 3.92978239,5.78553848 L0.221118462,1.2997069 C-0.0737061539,1.00469478 -0.0737061539,0.526236029 0.221118462,0.231972666 C0.515177299,-0.0630394586 1.23500883,0.00734414472 1.64852907,0.00734414472 L7.77475484,0.00734414472 C8.21201421,0.00734414472 8.48539703,-0.0630394586 8.77945587,0.231972666 C9.07351471,0.526236029 9.07351471,1.00469478 8.77945587,1.2997069 L5.07079194,5.78553848 Z\"\n fill=\"#FFFFFE\"></path>\n </g>\n</svg>\n";
|
|
9781
9781
|
|
|
@@ -9817,8 +9817,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
9817
9817
|
*/
|
|
9818
9818
|
get attributes() {
|
|
9819
9819
|
return {
|
|
9820
|
-
class: 'media-control-
|
|
9821
|
-
'data-track-selector': '',
|
|
9820
|
+
class: 'media-control-audiotracks',
|
|
9822
9821
|
};
|
|
9823
9822
|
}
|
|
9824
9823
|
/**
|
|
@@ -9826,8 +9825,8 @@ class AudioSelector extends UICorePlugin {
|
|
|
9826
9825
|
*/
|
|
9827
9826
|
get events() {
|
|
9828
9827
|
return {
|
|
9829
|
-
'click [data-
|
|
9830
|
-
'click [data-
|
|
9828
|
+
'click [data-audiotracks-select]': 'onTrackSelect',
|
|
9829
|
+
'click [data-audiotracks-button]': 'onShowLevelSelectMenu',
|
|
9831
9830
|
};
|
|
9832
9831
|
}
|
|
9833
9832
|
/**
|
|
@@ -9884,7 +9883,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
9884
9883
|
const mediaControl = this.core.getPlugin('media_control');
|
|
9885
9884
|
this.$el.html(AudioSelector.template({ tracks: this.tracks, title: this.getTitle() }));
|
|
9886
9885
|
this.$('.audio-arrow').append(audioArrow);
|
|
9887
|
-
mediaControl.putElement('
|
|
9886
|
+
mediaControl.putElement('audiotracks', this.el);
|
|
9888
9887
|
this.updateText();
|
|
9889
9888
|
this.highlightCurrentTrack();
|
|
9890
9889
|
return this;
|
|
@@ -9897,7 +9896,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
9897
9896
|
return this.tracks.find((track) => track.id === id);
|
|
9898
9897
|
}
|
|
9899
9898
|
onTrackSelect(event) {
|
|
9900
|
-
const id = event.target?.dataset?.
|
|
9899
|
+
const id = event.target?.dataset?.audiotracksSelect;
|
|
9901
9900
|
if (id) {
|
|
9902
9901
|
this.selectAudioTrack(id);
|
|
9903
9902
|
}
|
|
@@ -9927,7 +9926,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
9927
9926
|
}
|
|
9928
9927
|
trackElement(id) {
|
|
9929
9928
|
return this.$('ul a' +
|
|
9930
|
-
(id !== undefined ? '[data-
|
|
9929
|
+
(id !== undefined ? '[data-audiotracks-select="' + id + '"]' : '')).parent();
|
|
9931
9930
|
}
|
|
9932
9931
|
getTitle() {
|
|
9933
9932
|
return this.currentTrack?.label || '';
|
|
@@ -10094,7 +10093,7 @@ class BigMuteButton extends UICorePlugin {
|
|
|
10094
10093
|
}
|
|
10095
10094
|
}
|
|
10096
10095
|
|
|
10097
|
-
const pluginHtml$5 = "<button type=\"button\" class=\"button-gear media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" data-gear-button=\"-1\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\">\n <% for (const item of items) { %>\n <li data-<%= item %>></li>\n <% } %>\n </ul>\n</div>";
|
|
10096
|
+
const pluginHtml$5 = "<button type=\"button\" class=\"button-gear media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\" data-gear-button=\"-1\" id=\"gear-button\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\">\n <ul class=\"gear-options-list\" id=\"gear-options\">\n <% for (const item of items) { %>\n <li data-<%= item %>></li>\n <% } %>\n </ul>\n</div>";
|
|
10098
10097
|
|
|
10099
10098
|
const gearIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_660_1503)\">\n <path\n d=\"M19.14 12.94C19.18 12.64 19.2 12.33 19.2 12C19.2 11.68 19.18 11.36 19.13 11.06L21.16 9.47999C21.34 9.33999 21.39 9.06999 21.28 8.86999L19.36 5.54999C19.24 5.32999 18.99 5.25999 18.77 5.32999L16.38 6.28999C15.88 5.90999 15.35 5.58999 14.76 5.34999L14.4 2.80999C14.36 2.56999 14.16 2.39999 13.92 2.39999H10.08C9.83999 2.39999 9.64999 2.56999 9.60999 2.80999L9.24999 5.34999C8.65999 5.58999 8.11999 5.91999 7.62999 6.28999L5.23999 5.32999C5.01999 5.24999 4.76999 5.32999 4.64999 5.54999L2.73999 8.86999C2.61999 9.07999 2.65999 9.33999 2.85999 9.47999L4.88999 11.06C4.83999 11.36 4.79999 11.69 4.79999 12C4.79999 12.31 4.81999 12.64 4.86999 12.94L2.83999 14.52C2.65999 14.66 2.60999 14.93 2.71999 15.13L4.63999 18.45C4.75999 18.67 5.00999 18.74 5.22999 18.67L7.61999 17.71C8.11999 18.09 8.64999 18.41 9.23999 18.65L9.59999 21.19C9.64999 21.43 9.83999 21.6 10.08 21.6H13.92C14.16 21.6 14.36 21.43 14.39 21.19L14.75 18.65C15.34 18.41 15.88 18.09 16.37 17.71L18.76 18.67C18.98 18.75 19.23 18.67 19.35 18.45L21.27 15.13C21.39 14.91 21.34 14.66 21.15 14.52L19.14 12.94ZM12 15.6C10.02 15.6 8.39999 13.98 8.39999 12C8.39999 10.02 10.02 8.39999 12 8.39999C13.98 8.39999 15.6 10.02 15.6 12C15.6 13.98 13.98 15.6 12 15.6Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_660_1503\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
|
|
10100
10099
|
|
|
@@ -10356,7 +10355,7 @@ function getPageX(event) {
|
|
|
10356
10355
|
return 0;
|
|
10357
10356
|
}
|
|
10358
10357
|
|
|
10359
|
-
const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderClipsText = function(name) { %>\n\n <div class=\"media-clip-container gcore-skin-text-color\" data-<%= name %>>\n <div class=\"media-clip-point gcore-skin-text-color\" data-<%= name %>>•</div>\n <div class=\"media-clip-text gcore-skin-text-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var
|
|
10358
|
+
const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderClipsText = function(name) { %>\n\n <div class=\"media-clip-container gcore-skin-text-color\" data-<%= name %>>\n <div class=\"media-clip-point gcore-skin-text-color\" data-<%= name %>>•</div>\n <div class=\"media-clip-text gcore-skin-text-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if (setting === \"clipsText\") {\n renderClipsText(setting)\n } else if (setting === \"fullscreen\") {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
|
|
10360
10359
|
|
|
10361
10360
|
const playIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1564)\">\n <path d=\"M6 3V20L19.3571 11.5L6 3Z\" fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1564\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
|
|
10362
10361
|
|
|
@@ -10375,6 +10374,12 @@ const fullscreenOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
|
|
|
10375
10374
|
// Copyright 2014 Globo.com Player authors. All rights reserved.
|
|
10376
10375
|
// Use of this source code is governed by a BSD-style
|
|
10377
10376
|
// license that can be found in the {@link https://github.com/clappr/clappr-plugins/blob/master/LICENSE | LICENSE}.
|
|
10377
|
+
const DEFAULT_SETTINGS = {
|
|
10378
|
+
left: [],
|
|
10379
|
+
right: [],
|
|
10380
|
+
default: [],
|
|
10381
|
+
seekEnabled: true,
|
|
10382
|
+
};
|
|
10378
10383
|
/**
|
|
10379
10384
|
* Custom events emitted by the plugins to communicate with one another
|
|
10380
10385
|
* @beta
|
|
@@ -10389,7 +10394,8 @@ var MediaControlEvents;
|
|
|
10389
10394
|
const LEFT_ORDER = [
|
|
10390
10395
|
'playpause',
|
|
10391
10396
|
'playstop',
|
|
10392
|
-
'live',
|
|
10397
|
+
// 'live',
|
|
10398
|
+
'dvr',
|
|
10393
10399
|
'volume',
|
|
10394
10400
|
'position',
|
|
10395
10401
|
'duration',
|
|
@@ -10408,7 +10414,7 @@ function orderByOrderPattern(arr, order) {
|
|
|
10408
10414
|
* The methods exposed are to be used by the other plugins that extend the media control UI.
|
|
10409
10415
|
*/
|
|
10410
10416
|
class MediaControl extends UICorePlugin {
|
|
10411
|
-
advertisementPlaying = false
|
|
10417
|
+
// private advertisementPlaying = false
|
|
10412
10418
|
buttonsColor = null;
|
|
10413
10419
|
currentDurationValue = 0;
|
|
10414
10420
|
currentPositionValue = 0;
|
|
@@ -10423,14 +10429,13 @@ class MediaControl extends UICorePlugin {
|
|
|
10423
10429
|
hideId = null;
|
|
10424
10430
|
hideVolumeId = null;
|
|
10425
10431
|
intendedVolume = 100;
|
|
10426
|
-
isHD = false;
|
|
10427
10432
|
keepVisible = false;
|
|
10428
10433
|
kibo;
|
|
10429
10434
|
lastMouseX = 0;
|
|
10430
10435
|
lastMouseY = 0;
|
|
10431
10436
|
persistConfig;
|
|
10432
10437
|
rendered = false;
|
|
10433
|
-
settings =
|
|
10438
|
+
settings = DEFAULT_SETTINGS;
|
|
10434
10439
|
userDisabled = false;
|
|
10435
10440
|
userKeepVisible = false;
|
|
10436
10441
|
verticalVolume = false;
|
|
@@ -10574,8 +10579,6 @@ class MediaControl extends UICorePlugin {
|
|
|
10574
10579
|
* @internal
|
|
10575
10580
|
*/
|
|
10576
10581
|
bindEvents() {
|
|
10577
|
-
// @ts-ignore
|
|
10578
|
-
this.stopListening();
|
|
10579
10582
|
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
10580
10583
|
this.listenTo(this.core, Events.CORE_MOUSE_MOVE, this.show);
|
|
10581
10584
|
this.listenTo(this.core, Events.CORE_MOUSE_LEAVE, () => this.hide(this.options.hideMediaControlDelay));
|
|
@@ -10611,18 +10614,16 @@ class MediaControl extends UICorePlugin {
|
|
|
10611
10614
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_DBLCLICK, this.toggleFullscreen);
|
|
10612
10615
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
|
|
10613
10616
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_PROGRESS, this.updateProgressBar);
|
|
10614
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.
|
|
10615
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.
|
|
10616
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_HIGHDEFINITIONUPDATE, this.
|
|
10617
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.updateSettings);
|
|
10618
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
|
|
10619
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_HIGHDEFINITIONUPDATE, this.onHdUpdate);
|
|
10617
10620
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_DISABLE, this.disable);
|
|
10618
10621
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_ENABLE, this.enable);
|
|
10619
10622
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_ENDED, this.ended);
|
|
10620
10623
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_VOLUME, this.onVolumeChanged);
|
|
10621
10624
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
|
|
10622
|
-
if
|
|
10623
|
-
|
|
10624
|
-
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadataOnVideoTag);
|
|
10625
|
-
}
|
|
10625
|
+
// wait until the metadata has loaded and then check if fullscreen on video tag is supported
|
|
10626
|
+
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
|
|
10626
10627
|
}
|
|
10627
10628
|
/**
|
|
10628
10629
|
* Hides the media control UI
|
|
@@ -10655,13 +10656,19 @@ class MediaControl extends UICorePlugin {
|
|
|
10655
10656
|
onVolumeChanged() {
|
|
10656
10657
|
this.updateVolumeUI();
|
|
10657
10658
|
}
|
|
10658
|
-
|
|
10659
|
+
onLoadedMetadata() {
|
|
10659
10660
|
const video = this.core.activePlayback?.el;
|
|
10660
10661
|
// video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
|
|
10661
10662
|
// see https://github.com/clappr/clappr/issues/1127
|
|
10662
10663
|
if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
|
|
10663
10664
|
this.fullScreenOnVideoTagSupported = true;
|
|
10664
|
-
|
|
10665
|
+
}
|
|
10666
|
+
this.updateSettings();
|
|
10667
|
+
if (this.core.activeContainer.getPlaybackType() === Playback.LIVE) {
|
|
10668
|
+
this.$el.addClass('live');
|
|
10669
|
+
}
|
|
10670
|
+
else {
|
|
10671
|
+
this.$el.removeClass('live');
|
|
10665
10672
|
}
|
|
10666
10673
|
}
|
|
10667
10674
|
updateVolumeUI() {
|
|
@@ -10670,8 +10677,6 @@ class MediaControl extends UICorePlugin {
|
|
|
10670
10677
|
return;
|
|
10671
10678
|
}
|
|
10672
10679
|
assert.ok(this.$volumeBarContainer, 'volume bar container must be present');
|
|
10673
|
-
// update volume bar scrubber/fill on bar mode
|
|
10674
|
-
// this.$volumeBarContainer.find('.bar-fill-2').css({});
|
|
10675
10680
|
const containerWidth = this.$volumeBarContainer.width();
|
|
10676
10681
|
assert.ok(this.$volumeBarBackground, 'volume bar background must be present');
|
|
10677
10682
|
const barWidth = this.$volumeBarBackground.width();
|
|
@@ -10859,17 +10864,18 @@ class MediaControl extends UICorePlugin {
|
|
|
10859
10864
|
// if the container is not ready etc
|
|
10860
10865
|
this.intendedVolume = value;
|
|
10861
10866
|
this.persistConfig && !isInitialVolume && Config.persist('volume', value);
|
|
10867
|
+
// TODO
|
|
10862
10868
|
const setWhenContainerReady = () => {
|
|
10863
|
-
if (this.
|
|
10864
|
-
this.
|
|
10869
|
+
if (this.core.activeContainer && this.core.activeContainer.isReady) {
|
|
10870
|
+
this.core.activeContainer.setVolume(value);
|
|
10865
10871
|
}
|
|
10866
10872
|
else {
|
|
10867
|
-
this.listenToOnce(this.
|
|
10868
|
-
this.
|
|
10873
|
+
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_READY, () => {
|
|
10874
|
+
this.core.activeContainer.setVolume(value);
|
|
10869
10875
|
});
|
|
10870
10876
|
}
|
|
10871
10877
|
};
|
|
10872
|
-
if (!this.
|
|
10878
|
+
if (!this.core.activeContainer) {
|
|
10873
10879
|
this.listenToOnce(this, Events.MEDIACONTROL_CONTAINERCHANGED, () => setWhenContainerReady());
|
|
10874
10880
|
}
|
|
10875
10881
|
else {
|
|
@@ -10879,7 +10885,7 @@ class MediaControl extends UICorePlugin {
|
|
|
10879
10885
|
toggleFullscreen() {
|
|
10880
10886
|
if (!Browser.isMobile) {
|
|
10881
10887
|
this.trigger(Events.MEDIACONTROL_FULLSCREEN, this.name);
|
|
10882
|
-
this.
|
|
10888
|
+
this.core.activeContainer.fullscreen();
|
|
10883
10889
|
this.core.toggleFullscreen();
|
|
10884
10890
|
this.resetUserKeepVisible();
|
|
10885
10891
|
}
|
|
@@ -10890,7 +10896,8 @@ class MediaControl extends UICorePlugin {
|
|
|
10890
10896
|
this.setInitialVolume();
|
|
10891
10897
|
this.changeTogglePlay();
|
|
10892
10898
|
this.bindContainerEvents();
|
|
10893
|
-
this.
|
|
10899
|
+
this.updateSettings();
|
|
10900
|
+
// TODO remove
|
|
10894
10901
|
this.core.activeContainer.trigger(Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
|
|
10895
10902
|
// TODO test
|
|
10896
10903
|
if (this.core.activeContainer.mediaControlDisabled) {
|
|
@@ -10961,9 +10968,9 @@ class MediaControl extends UICorePlugin {
|
|
|
10961
10968
|
}
|
|
10962
10969
|
// default to 100%
|
|
10963
10970
|
this.currentSeekBarPercentage = 100;
|
|
10964
|
-
if (this.
|
|
10965
|
-
(this.
|
|
10966
|
-
this.
|
|
10971
|
+
if (this.core.activeContainer &&
|
|
10972
|
+
(this.core.activeContainer.getPlaybackType() !== Playback.LIVE ||
|
|
10973
|
+
this.core.activeContainer.isDvrInUse())) {
|
|
10967
10974
|
this.currentSeekBarPercentage =
|
|
10968
10975
|
(this.currentPositionValue / this.currentDurationValue) * 100;
|
|
10969
10976
|
}
|
|
@@ -10990,16 +10997,10 @@ class MediaControl extends UICorePlugin {
|
|
|
10990
10997
|
const offsetX = MediaControl.getPageX(event) - this.$seekBarContainer.offset().left;
|
|
10991
10998
|
let pos = (offsetX / this.$seekBarContainer.width()) * 100;
|
|
10992
10999
|
pos = Math.min(100, Math.max(pos, 0));
|
|
10993
|
-
this.
|
|
11000
|
+
this.core.activeContainer && this.core.activeContainer.seekPercentage(pos);
|
|
10994
11001
|
this.setSeekPercentage(pos);
|
|
10995
11002
|
return false;
|
|
10996
11003
|
}
|
|
10997
|
-
setKeepVisible() {
|
|
10998
|
-
this.keepVisible = true;
|
|
10999
|
-
}
|
|
11000
|
-
resetKeepVisible() {
|
|
11001
|
-
this.keepVisible = false;
|
|
11002
|
-
}
|
|
11003
11004
|
setUserKeepVisible() {
|
|
11004
11005
|
this.userKeepVisible = true;
|
|
11005
11006
|
}
|
|
@@ -11071,18 +11072,24 @@ class MediaControl extends UICorePlugin {
|
|
|
11071
11072
|
this.core.$el.addClass('nocursor');
|
|
11072
11073
|
}
|
|
11073
11074
|
}
|
|
11074
|
-
|
|
11075
|
+
updateSettings() {
|
|
11075
11076
|
const newSettings = $.extend(true, {
|
|
11076
11077
|
left: [],
|
|
11077
11078
|
default: [],
|
|
11078
11079
|
right: [],
|
|
11079
|
-
}, this.core.activeContainer
|
|
11080
|
+
}, this.core.activeContainer.settings);
|
|
11081
|
+
// TODO make order controlled via CSS
|
|
11080
11082
|
newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
|
|
11083
|
+
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
11084
|
+
this.core.activePlayback.dvrEnabled) {
|
|
11085
|
+
newSettings.left.push('dvr');
|
|
11086
|
+
}
|
|
11087
|
+
// actual order of the items appear rendered is controlled by CSS
|
|
11081
11088
|
newSettings.right = [
|
|
11082
11089
|
'fullscreen',
|
|
11083
11090
|
'pip',
|
|
11084
|
-
'
|
|
11085
|
-
'
|
|
11091
|
+
'gear',
|
|
11092
|
+
'cc',
|
|
11086
11093
|
'multicamera',
|
|
11087
11094
|
'playbackrate',
|
|
11088
11095
|
'vr',
|
|
@@ -11091,24 +11098,25 @@ class MediaControl extends UICorePlugin {
|
|
|
11091
11098
|
if ((!this.fullScreenOnVideoTagSupported &&
|
|
11092
11099
|
!Fullscreen.fullscreenEnabled()) ||
|
|
11093
11100
|
this.options.fullscreenDisable) {
|
|
11094
|
-
// remove fullscreen from settings if it is
|
|
11101
|
+
// remove fullscreen from settings if it is not available
|
|
11095
11102
|
removeArrayItem(newSettings.default, 'fullscreen');
|
|
11096
11103
|
removeArrayItem(newSettings.left, 'fullscreen');
|
|
11097
11104
|
removeArrayItem(newSettings.right, 'fullscreen');
|
|
11098
11105
|
}
|
|
11099
11106
|
removeArrayItem(newSettings.default, 'hd-indicator');
|
|
11100
11107
|
removeArrayItem(newSettings.left, 'hd-indicator');
|
|
11108
|
+
// TODO get from container's settings
|
|
11101
11109
|
if (this.core.activePlayback.name === 'html5_video') {
|
|
11102
11110
|
newSettings.seekEnabled = this.isSeekEnabledForHtml5Playback();
|
|
11103
11111
|
}
|
|
11104
|
-
const settingsChanged =
|
|
11112
|
+
const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
|
|
11105
11113
|
if (settingsChanged) {
|
|
11106
11114
|
this.settings = newSettings;
|
|
11107
11115
|
this.render();
|
|
11108
11116
|
}
|
|
11109
11117
|
}
|
|
11110
|
-
|
|
11111
|
-
|
|
11118
|
+
onHdUpdate(isHD) {
|
|
11119
|
+
// TODO render?
|
|
11112
11120
|
}
|
|
11113
11121
|
createCachedElements() {
|
|
11114
11122
|
const $layer = this.$el.find('.media-control-layer');
|
|
@@ -11130,7 +11138,7 @@ class MediaControl extends UICorePlugin {
|
|
|
11130
11138
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
11131
11139
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
11132
11140
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
11133
|
-
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
|
|
11141
|
+
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
|
|
11134
11142
|
this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
|
|
11135
11143
|
this.resetIndicators();
|
|
11136
11144
|
this.initializeIcons();
|
|
@@ -11156,49 +11164,44 @@ class MediaControl extends UICorePlugin {
|
|
|
11156
11164
|
*/
|
|
11157
11165
|
getElement(name) {
|
|
11158
11166
|
switch (name) {
|
|
11159
|
-
case '
|
|
11167
|
+
case 'audiotracks':
|
|
11160
11168
|
return null;
|
|
11161
11169
|
case 'clipText':
|
|
11162
11170
|
return this.$clipText;
|
|
11163
|
-
case 'gear':
|
|
11164
|
-
return null;
|
|
11165
|
-
case 'pip':
|
|
11166
|
-
return null;
|
|
11167
11171
|
case 'playbackRate':
|
|
11168
11172
|
return this.$playbackRate;
|
|
11169
11173
|
case 'seekBarContainer':
|
|
11170
11174
|
return this.$seekBarContainer;
|
|
11171
|
-
case 'subtitlesSelector':
|
|
11172
|
-
return null;
|
|
11173
11175
|
}
|
|
11174
11176
|
}
|
|
11175
11177
|
putElement(name, element) {
|
|
11176
|
-
|
|
11177
|
-
|
|
11178
|
-
|
|
11179
|
-
|
|
11180
|
-
|
|
11181
|
-
|
|
11182
|
-
|
|
11183
|
-
|
|
11184
|
-
|
|
11185
|
-
|
|
11186
|
-
|
|
11187
|
-
|
|
11188
|
-
|
|
11178
|
+
const panel = this.getElementLocation(name);
|
|
11179
|
+
if (panel) {
|
|
11180
|
+
const current = panel.find(`[data-${name}]`);
|
|
11181
|
+
element.setAttribute(`data-${name}`, '');
|
|
11182
|
+
// TODO test
|
|
11183
|
+
if (current.length) {
|
|
11184
|
+
if (current[0] === element) {
|
|
11185
|
+
return;
|
|
11186
|
+
}
|
|
11187
|
+
current.replaceWith(element);
|
|
11188
|
+
}
|
|
11189
|
+
else {
|
|
11190
|
+
panel.append(element);
|
|
11191
|
+
}
|
|
11189
11192
|
}
|
|
11190
11193
|
}
|
|
11191
11194
|
/**
|
|
11192
|
-
*
|
|
11193
|
-
* @
|
|
11195
|
+
* Toggle the visibility of a media control element
|
|
11196
|
+
* @param name - The name of the media control element
|
|
11197
|
+
* @param show - Whether to show or hide the element
|
|
11194
11198
|
*/
|
|
11199
|
+
toggleElement(name, show) {
|
|
11200
|
+
this.$el.find(`[data-${name}]`).toggle(show);
|
|
11201
|
+
}
|
|
11195
11202
|
getRightPanel() {
|
|
11196
11203
|
return this.$el.find('.media-control-right-panel');
|
|
11197
11204
|
}
|
|
11198
|
-
/**
|
|
11199
|
-
* Get the left panel area to append custom elements to
|
|
11200
|
-
* @returns ZeptoSelector of the left panel element
|
|
11201
|
-
*/
|
|
11202
11205
|
getLeftPanel() {
|
|
11203
11206
|
return this.$el.find('.media-control-left-panel');
|
|
11204
11207
|
}
|
|
@@ -11397,7 +11400,6 @@ class MediaControl extends UICorePlugin {
|
|
|
11397
11400
|
this.hideVolumeBar(0);
|
|
11398
11401
|
}, 0);
|
|
11399
11402
|
this.parseColors();
|
|
11400
|
-
this.highDefinitionUpdate(this.isHD);
|
|
11401
11403
|
this.core.$el.append(this.el);
|
|
11402
11404
|
this.rendered = true;
|
|
11403
11405
|
this.updateVolumeUI();
|
|
@@ -11423,12 +11425,12 @@ class MediaControl extends UICorePlugin {
|
|
|
11423
11425
|
}
|
|
11424
11426
|
// TODO manage by the ads plugin
|
|
11425
11427
|
onStartAd() {
|
|
11426
|
-
this.advertisementPlaying = true
|
|
11428
|
+
// this.advertisementPlaying = true
|
|
11427
11429
|
this.disable();
|
|
11428
11430
|
}
|
|
11429
11431
|
// TODO manage by the ads plugin
|
|
11430
11432
|
onFinishAd() {
|
|
11431
|
-
this.advertisementPlaying = false
|
|
11433
|
+
// this.advertisementPlaying = false
|
|
11432
11434
|
this.enable();
|
|
11433
11435
|
}
|
|
11434
11436
|
// TODO remove
|
|
@@ -11472,10 +11474,39 @@ class MediaControl extends UICorePlugin {
|
|
|
11472
11474
|
}
|
|
11473
11475
|
return isFinite(this.core.activePlayback.getDuration());
|
|
11474
11476
|
}
|
|
11477
|
+
getElementLocation(name) {
|
|
11478
|
+
if (this.settings.right?.includes(name)) {
|
|
11479
|
+
return this.getRightPanel();
|
|
11480
|
+
}
|
|
11481
|
+
if (this.settings.left?.includes(name)) {
|
|
11482
|
+
return this.getLeftPanel();
|
|
11483
|
+
}
|
|
11484
|
+
if (this.settings.default?.includes(name)) {
|
|
11485
|
+
return this.getCenterPanel();
|
|
11486
|
+
}
|
|
11487
|
+
return null;
|
|
11488
|
+
}
|
|
11489
|
+
onDvrStateChanged(dvrInUse) {
|
|
11490
|
+
if (dvrInUse) {
|
|
11491
|
+
this.$el.addClass('dvr');
|
|
11492
|
+
}
|
|
11493
|
+
else {
|
|
11494
|
+
this.$el.removeClass('dvr');
|
|
11495
|
+
}
|
|
11496
|
+
}
|
|
11475
11497
|
}
|
|
11476
11498
|
MediaControl.extend = function (properties) {
|
|
11477
11499
|
return extend(MediaControl, properties);
|
|
11478
11500
|
};
|
|
11501
|
+
function serializeSettings(s) {
|
|
11502
|
+
return s.left
|
|
11503
|
+
.slice()
|
|
11504
|
+
.sort()
|
|
11505
|
+
.concat(s.right.slice().sort())
|
|
11506
|
+
.concat(s.default.slice().sort())
|
|
11507
|
+
.concat([s.seekEnabled])
|
|
11508
|
+
.join(',');
|
|
11509
|
+
}
|
|
11479
11510
|
|
|
11480
11511
|
const VERSION$5 = '2.19.12';
|
|
11481
11512
|
// TODO disabled if no items added
|
|
@@ -11540,6 +11571,7 @@ class BottomGear extends UICorePlugin {
|
|
|
11540
11571
|
getElement(name) {
|
|
11541
11572
|
return this.$el.find(`.gear-options-list [data-${name}]`);
|
|
11542
11573
|
}
|
|
11574
|
+
// TODO implement putElement/addElement method
|
|
11543
11575
|
/**
|
|
11544
11576
|
* Replaces the content of the gear menu
|
|
11545
11577
|
* @param content - Zepto result of the element
|
|
@@ -11570,7 +11602,7 @@ class BottomGear extends UICorePlugin {
|
|
|
11570
11602
|
];
|
|
11571
11603
|
const icon = this.isHd ? gearHdIcon : gearIcon;
|
|
11572
11604
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
11573
|
-
mediaControl.putElement('gear', this
|
|
11605
|
+
mediaControl.putElement('gear', this.el);
|
|
11574
11606
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
11575
11607
|
return this;
|
|
11576
11608
|
}
|
|
@@ -14570,7 +14602,7 @@ class ClipsPlugin extends UICorePlugin {
|
|
|
14570
14602
|
|
|
14571
14603
|
const templateHtml$1 = "<ul class=\"context-menu-list\">\n <% if(options) { %>\n <% for (var i = 0; i < options.length; i++) { %>\n <li class=\"context-menu-list-item <%= options[i].class %>\"\n data-<%= options[i].name %>><%= options[i].label %></li>\n <% } %>\n <% } %>\n</ul>\n";
|
|
14572
14604
|
|
|
14573
|
-
var version$1 = "2.21.
|
|
14605
|
+
var version$1 = "2.21.6";
|
|
14574
14606
|
|
|
14575
14607
|
var packages = {
|
|
14576
14608
|
"node_modules/@clappr/core": {
|
|
@@ -14703,7 +14735,7 @@ class ContextMenu extends UIContainerPlugin {
|
|
|
14703
14735
|
};
|
|
14704
14736
|
}
|
|
14705
14737
|
|
|
14706
|
-
const dvrHTML = "<div class=\"live-info\"><%= live %></div>\n<button type=\"button\" class=\"live-button\" aria-label=\"<%=
|
|
14738
|
+
const dvrHTML = "<div class=\"live-info\" id=\"media-control-live\"><%= i18n.t('live') %></div>\n<button type=\"button\" class=\"live-button\" aria-label=\"<%= i18n.t('back_to_live') %>\" id=\"media-control-back-to-live\"><%= i18n.t('back_to_live') %></button>\n";
|
|
14707
14739
|
|
|
14708
14740
|
const T$b = 'plugins.dvr_controls';
|
|
14709
14741
|
/**
|
|
@@ -14748,7 +14780,6 @@ class DvrControls extends UICorePlugin {
|
|
|
14748
14780
|
get attributes() {
|
|
14749
14781
|
return {
|
|
14750
14782
|
class: 'dvr-controls',
|
|
14751
|
-
'data-dvr-controls': '',
|
|
14752
14783
|
};
|
|
14753
14784
|
}
|
|
14754
14785
|
/**
|
|
@@ -14756,37 +14787,17 @@ class DvrControls extends UICorePlugin {
|
|
|
14756
14787
|
*/
|
|
14757
14788
|
bindEvents() {
|
|
14758
14789
|
this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
|
|
14759
|
-
this.listenTo(this.core, Events.CORE_OPTIONS_CHANGE, this.render);
|
|
14760
14790
|
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.bindContainerEvents);
|
|
14761
14791
|
}
|
|
14762
14792
|
onCoreReady() {
|
|
14763
14793
|
const mediaControl = this.core.getPlugin('media_control');
|
|
14764
14794
|
assert(mediaControl, 'media_control plugin is required');
|
|
14765
|
-
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.
|
|
14766
|
-
|
|
14795
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
|
|
14796
|
+
// MediaControl has been rendered
|
|
14797
|
+
this.render();
|
|
14767
14798
|
}
|
|
14768
14799
|
bindContainerEvents() {
|
|
14769
14800
|
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.render);
|
|
14770
|
-
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrChanged);
|
|
14771
|
-
}
|
|
14772
|
-
onDvrChanged(dvrInUse) {
|
|
14773
|
-
if (this.core.getPlaybackType() !== Playback.LIVE) {
|
|
14774
|
-
return;
|
|
14775
|
-
}
|
|
14776
|
-
this.render();
|
|
14777
|
-
const mediaControl = this.core.getPlugin('media_control');
|
|
14778
|
-
mediaControl.$el.addClass('live');
|
|
14779
|
-
if (dvrInUse) {
|
|
14780
|
-
mediaControl.$el
|
|
14781
|
-
.addClass('dvr')
|
|
14782
|
-
.find(
|
|
14783
|
-
// TODO add API, test
|
|
14784
|
-
'.media-control-indicator[data-position], .media-control-indicator[data-duration]')
|
|
14785
|
-
.hide();
|
|
14786
|
-
}
|
|
14787
|
-
else {
|
|
14788
|
-
mediaControl.$el.removeClass('dvr');
|
|
14789
|
-
}
|
|
14790
14801
|
}
|
|
14791
14802
|
click() {
|
|
14792
14803
|
const container = this.core.activeContainer;
|
|
@@ -14795,13 +14806,8 @@ class DvrControls extends UICorePlugin {
|
|
|
14795
14806
|
}
|
|
14796
14807
|
container.seek(container.getDuration());
|
|
14797
14808
|
}
|
|
14798
|
-
settingsUpdate() {
|
|
14799
|
-
this.core.getPlugin('media_control').$el.removeClass('live');
|
|
14800
|
-
this.render();
|
|
14801
|
-
}
|
|
14802
14809
|
shouldRender() {
|
|
14803
|
-
|
|
14804
|
-
return useDvrControls && this.core.getPlaybackType() === Playback.LIVE;
|
|
14810
|
+
return this.core.getPlaybackType() === Playback.LIVE;
|
|
14805
14811
|
}
|
|
14806
14812
|
/**
|
|
14807
14813
|
* @internal
|
|
@@ -14811,16 +14817,19 @@ class DvrControls extends UICorePlugin {
|
|
|
14811
14817
|
dvrEnabled: this.core.activePlayback?.dvrEnabled,
|
|
14812
14818
|
playbackType: this.core.getPlaybackType(),
|
|
14813
14819
|
});
|
|
14820
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
14821
|
+
if (!mediaControl) {
|
|
14822
|
+
return this;
|
|
14823
|
+
}
|
|
14814
14824
|
if (!this.shouldRender()) {
|
|
14815
14825
|
return this;
|
|
14816
14826
|
}
|
|
14827
|
+
mediaControl.toggleElement('duration', false);
|
|
14828
|
+
mediaControl.toggleElement('position', false);
|
|
14817
14829
|
this.$el.html(DvrControls.template({
|
|
14818
|
-
|
|
14819
|
-
backToLive: this.core.i18n.t('back_to_live'),
|
|
14830
|
+
i18n: this.core.i18n,
|
|
14820
14831
|
}));
|
|
14821
|
-
|
|
14822
|
-
mediaControl.$el.addClass('live');
|
|
14823
|
-
mediaControl.getLeftPanel().append(this.$el);
|
|
14832
|
+
mediaControl.putElement('dvr', this.el);
|
|
14824
14833
|
return this;
|
|
14825
14834
|
}
|
|
14826
14835
|
}
|
|
@@ -16053,6 +16062,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
16053
16062
|
static get version() {
|
|
16054
16063
|
return VERSION$2;
|
|
16055
16064
|
}
|
|
16065
|
+
static buttonTemplate = tmpl(buttonHtml$1);
|
|
16056
16066
|
/**
|
|
16057
16067
|
* @internal
|
|
16058
16068
|
*/
|
|
@@ -16085,8 +16095,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
16085
16095
|
if (!this.isPiPSupported()) {
|
|
16086
16096
|
return this;
|
|
16087
16097
|
}
|
|
16088
|
-
|
|
16089
|
-
this.$el.html(t({ pipIcon }));
|
|
16098
|
+
this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
|
|
16090
16099
|
const mediaControl = this.core.getPlugin('media_control');
|
|
16091
16100
|
if (mediaControl) {
|
|
16092
16101
|
mediaControl.putElement('pip', this.el);
|
|
@@ -16112,9 +16121,9 @@ class PictureInPicture extends UICorePlugin {
|
|
|
16112
16121
|
}
|
|
16113
16122
|
}
|
|
16114
16123
|
|
|
16115
|
-
const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option'>\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span
|
|
16124
|
+
const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option' id=\"playback-rate-button\">\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span class=\"gear-option_label\"><%= i18n.t('playback_rate') %></span>\n <span class=\"gear-option_arrow-right-icon\"><%= arrowRightIcon %></span>\n <span class='gear-option_value'><%= title %></span>\n</button>\n";
|
|
16116
16125
|
|
|
16117
|
-
const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n
|
|
16126
|
+
const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n <%= i18n.t('playback_rate') %>\n</button>\n<ul class=\"gear-sub-menu\">\n <% for (const item of playbackRates) { %>\n <li>\n <a href=\"#\" class='gear-sub-menu_btn gcore-skin-text-color' data-rate=\"<%= item.value %>\">\n <span class=\"check-icon\"><%= checkIcon %></span>\n <%= item.label %>\n </a>\n </li>\n <% } %>\n</ul>\n";
|
|
16118
16127
|
|
|
16119
16128
|
const speedIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.9854 23.9999C11.4272 23.9999 10.9571 23.5293 10.9571 22.9704C10.9571 22.4115 11.4272 21.9409 11.9854 21.9409C17.4492 21.9409 21.9143 17.4704 21.9143 11.9999C21.9143 6.52948 17.4492 2.05899 11.9854 2.05899C11.4272 2.05899 10.9571 1.58836 10.9571 1.02949C10.9571 0.470625 11.4272 0 11.9854 0C18.5949 0 24 5.38224 24 12.0291C24 18.6766 18.5949 24 11.9854 24V23.9999ZM10.2227 17.853L17.4785 13.4413C18.0072 13.1178 18.301 12.5885 18.301 11.9707C18.301 11.353 17.9779 10.8237 17.4785 10.5002L10.2227 6.08852C9.69405 5.76499 9.01826 5.76499 8.4896 6.05919C7.96094 6.35338 7.60828 6.94157 7.60828 7.5591V16.3824C7.60828 17.0002 7.93142 17.5883 8.4896 17.8824C8.75393 18.0294 9.04779 18.1177 9.34139 18.1177C9.63523 18.1177 9.95838 18.0294 10.2227 17.853V17.853ZM15.9216 11.9707L9.66457 15.7647V8.17661L15.9216 11.9707ZM8.22516 22.3529C8.4602 21.8236 8.25447 21.2058 7.7258 20.9705C7.19714 20.7353 6.69755 20.4413 6.2277 20.0882C5.75764 19.7646 5.11137 19.8822 4.78824 20.3235C4.46509 20.7941 4.58251 21.4412 5.02327 21.7647C5.58146 22.1764 6.19819 22.5293 6.81519 22.8235C6.96211 22.8824 7.10903 22.9117 7.25574 22.9117C7.66699 22.941 8.04893 22.7057 8.22513 22.3528L8.22516 22.3529ZM3.58381 19.0882C4.05387 18.7647 4.17127 18.1177 3.84814 17.647C3.52502 17.1764 3.23115 16.6765 2.99635 16.1471C2.76132 15.6178 2.14456 15.4118 1.6157 15.6472C1.08704 15.8825 0.881306 16.5 1.11634 17.0295C1.41018 17.6472 1.7626 18.2648 2.14459 18.8236C2.35032 19.1178 2.67325 19.2646 2.99638 19.2646C3.20191 19.2942 3.40763 19.2353 3.58384 19.0882L3.58381 19.0882ZM1.14563 13.9707C1.70382 13.9118 2.14435 13.4118 2.08576 12.853C2.05645 12.5588 2.05645 12.2648 2.05645 11.9706C2.05645 11.6764 2.05645 11.4117 2.08576 11.1178C2.14456 10.5589 1.70381 10.059 1.14563 10.0001C0.587439 9.94122 0.0881057 10.3825 0.0293019 10.9414C1.96979e-07 11.2942 0 11.6178 0 11.9709C0 12.3237 0.0293018 12.6768 0.0588091 13.0297C0.117618 13.5589 0.558169 13.9709 1.08706 13.9709C1.08686 13.9707 1.11636 13.9707 1.14567 13.9707L1.14563 13.9707ZM2.96687 7.79432C3.2019 7.26502 3.49553 6.76482 3.81866 6.2944C4.1418 5.82377 4.02439 5.17672 3.55432 4.8532C3.08427 4.52967 2.438 4.64722 2.11486 5.11786C1.73292 5.67672 1.38047 6.2942 1.08661 6.91193C0.851579 7.44123 1.08661 8.05897 1.58597 8.29426C1.73289 8.35314 1.87981 8.38247 2.02652 8.38247C2.40888 8.41181 2.7906 8.1767 2.96686 7.7943L2.96687 7.79432ZM6.22757 3.85328C6.69762 3.52974 7.19696 3.23554 7.69635 2.97089C8.22501 2.73558 8.43074 2.11807 8.19571 1.58857C7.96068 1.05927 7.34392 0.85329 6.81505 1.08861C6.19806 1.3828 5.58128 1.73565 5.02314 2.14741C4.55308 2.47094 4.43568 3.11797 4.78811 3.5886C4.99384 3.8828 5.31676 4.02969 5.6399 4.02969C5.84583 4.05902 6.05135 4.00014 6.22757 3.85325V3.85328Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
|
|
16120
16129
|
|
|
@@ -16135,7 +16144,7 @@ const DEFAULT_PLAYBACK_RATES = [
|
|
|
16135
16144
|
{ value: '1.25', label: '1.25x' },
|
|
16136
16145
|
{ value: '1.5', label: '1.5x' },
|
|
16137
16146
|
{ value: '1.75', label: '1.75x' },
|
|
16138
|
-
{ value: '2.0', label: '2x' }
|
|
16147
|
+
{ value: '2.0', label: '2x' },
|
|
16139
16148
|
];
|
|
16140
16149
|
const DEFAULT_PLAYBACK_RATE = '1.0';
|
|
16141
16150
|
const T$6 = 'plugins.playback_rate';
|
|
@@ -16175,16 +16184,17 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16175
16184
|
static listTemplate = tmpl(listHtml);
|
|
16176
16185
|
constructor(core) {
|
|
16177
16186
|
super(core);
|
|
16178
|
-
this.playbackRates =
|
|
16179
|
-
|
|
16187
|
+
this.playbackRates =
|
|
16188
|
+
core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
|
|
16189
|
+
this.selectedRate =
|
|
16190
|
+
core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
|
|
16180
16191
|
}
|
|
16181
16192
|
/**
|
|
16182
16193
|
* @internal
|
|
16183
16194
|
*/
|
|
16184
16195
|
get attributes() {
|
|
16185
16196
|
return {
|
|
16186
|
-
|
|
16187
|
-
'data-playback-rate-select': ''
|
|
16197
|
+
class: 'media-control-playbackrate',
|
|
16188
16198
|
};
|
|
16189
16199
|
}
|
|
16190
16200
|
/**
|
|
@@ -16232,7 +16242,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16232
16242
|
allRateElements() {
|
|
16233
16243
|
return this.$('ul.gear-sub-menu li');
|
|
16234
16244
|
}
|
|
16235
|
-
rateElement(rate =
|
|
16245
|
+
rateElement(rate = '1') {
|
|
16236
16246
|
return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
|
|
16237
16247
|
}
|
|
16238
16248
|
onPlaybackRateChange(playbackRate) {
|
|
@@ -16243,10 +16253,11 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16243
16253
|
}
|
|
16244
16254
|
}
|
|
16245
16255
|
shouldRender() {
|
|
16246
|
-
if (!this.core.
|
|
16256
|
+
if (!this.core.activePlayback) {
|
|
16247
16257
|
return false;
|
|
16248
16258
|
}
|
|
16249
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
16259
|
+
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
16260
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
16250
16261
|
return false;
|
|
16251
16262
|
}
|
|
16252
16263
|
return 'setPlaybackRate' in this.core.activePlayback;
|
|
@@ -16269,9 +16280,12 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16269
16280
|
title: this.getTitle(),
|
|
16270
16281
|
speedIcon,
|
|
16271
16282
|
arrowRightIcon,
|
|
16283
|
+
i18n: this.core.i18n,
|
|
16272
16284
|
});
|
|
16273
16285
|
this.$el.html(button);
|
|
16274
|
-
this.core.getPlugin('bottom_gear')
|
|
16286
|
+
this.core.getPlugin('bottom_gear')
|
|
16287
|
+
?.getElement('rate')
|
|
16288
|
+
?.html(this.el);
|
|
16275
16289
|
this.rendered = true;
|
|
16276
16290
|
return this;
|
|
16277
16291
|
}
|
|
@@ -16286,7 +16300,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16286
16300
|
}
|
|
16287
16301
|
}
|
|
16288
16302
|
onPlay() {
|
|
16289
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
16303
|
+
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
16304
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
16290
16305
|
this.resetPlaybackRate();
|
|
16291
16306
|
}
|
|
16292
16307
|
else {
|
|
@@ -16296,8 +16311,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16296
16311
|
resetPlaybackRate() {
|
|
16297
16312
|
this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
|
|
16298
16313
|
}
|
|
16299
|
-
onStop() {
|
|
16300
|
-
}
|
|
16314
|
+
onStop() { }
|
|
16301
16315
|
onRateSelect(event) {
|
|
16302
16316
|
event.stopPropagation();
|
|
16303
16317
|
const rate = event.currentTarget.dataset.rate;
|
|
@@ -16312,6 +16326,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16312
16326
|
playbackRates: this.playbackRates,
|
|
16313
16327
|
arrowLeftIcon,
|
|
16314
16328
|
checkIcon,
|
|
16329
|
+
i18n: this.core.i18n,
|
|
16315
16330
|
}));
|
|
16316
16331
|
this.core.getPlugin('bottom_gear')?.setContent(this.el);
|
|
16317
16332
|
this.highlightCurrentRate();
|
|
@@ -16327,7 +16342,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16327
16342
|
this.selectedRate = rate;
|
|
16328
16343
|
}
|
|
16329
16344
|
getTitle() {
|
|
16330
|
-
return this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
16345
|
+
return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
16346
|
+
this.selectedRate);
|
|
16331
16347
|
}
|
|
16332
16348
|
highlightCurrentRate() {
|
|
16333
16349
|
this.allRateElements().removeClass('current');
|
|
@@ -17360,48 +17376,51 @@ const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
|
|
|
17360
17376
|
|
|
17361
17377
|
const subtitlesOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.238 16.1C13.979 16.1 12.578 14.538 12.578 11.997C12.578 9.462 13.973 7.9 16.238 7.9C18.087 7.9 19.5029 9.127 19.6219 10.824H18.032C17.876 9.927 17.168 9.338 16.238 9.338C15.011 9.338 14.249 10.354 14.249 11.997C14.249 13.641 15.011 14.662 16.243 14.662C17.178 14.662 17.881 14.111 18.038 13.251H19.627C19.492 14.938 18.119 16.1 16.238 16.1ZM8.03198 16.1C5.77298 16.1 4.37299 14.538 4.37299 11.997C4.37299 9.462 5.76798 7.9 8.03198 7.9C9.88098 7.9 11.298 9.127 11.416 10.824H9.82697C9.67097 9.927 8.96198 9.338 8.03198 9.338C6.80598 9.338 6.04297 10.354 6.04297 11.997C6.04297 13.641 6.80596 14.662 8.03796 14.662C8.97296 14.662 9.67601 14.111 9.83301 13.251H11.422C11.287 14.938 9.91398 16.1 8.03198 16.1ZM22.5 3H1.5C0.672 3 0 3.671 0 4.5V19.5C0 20.329 0.672 21 1.5 21H22.5C23.329 21 24 20.329 24 19.5V4.5C24 3.671 23.329 3 22.5 3Z\"\n fill=\"#C9C9C9\"/>\n <rect y=\"22\" width=\"24\" height=\"2\" rx=\"1\" fill=\"#F6413B\"/>\n</svg>\n";
|
|
17362
17378
|
|
|
17363
|
-
const comboboxHTML = "<button data-
|
|
17379
|
+
const comboboxHTML = "<button data-cc-button class='media-control-button media-control-icon gcore-skin-button-color' id=\"cc-button\">\n <span class='cc-text'></span>\n</button>\n\n<ul class='gcore-skin-bg-color' id=\"cc-select\">\n <% for (const t of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-cc-select=\"<%= t.id %>\">\n <%= t.name %>\n </a>\n </li>\n <% } %>\n <li><a href=\"#\" class='gcore-skin-text-color' data-cc-select=\"-1\">Off</a></li>\n</ul>\n";
|
|
17364
17380
|
|
|
17365
|
-
const stringHTML = "<div class=\"
|
|
17381
|
+
const stringHTML = "<div class=\"cc-line\" id=\"cc-line\">\n <p></p>\n</div>\n";
|
|
17366
17382
|
|
|
17367
17383
|
const VERSION = '2.19.14';
|
|
17368
|
-
const
|
|
17369
|
-
const T$2 = 'plugins.
|
|
17384
|
+
const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
|
|
17385
|
+
const T$2 = 'plugins.cc';
|
|
17370
17386
|
/**
|
|
17371
17387
|
* `PLUGIN` that provides a UI to select the subtitles when available.
|
|
17372
17388
|
* @beta
|
|
17373
17389
|
*
|
|
17374
17390
|
* @remarks
|
|
17391
|
+
* The plugin is activated when closed captions tracks are provided with the media source.
|
|
17392
|
+
* It shows a familiar "CC" button with a dropdown menu to select the subtitles language.
|
|
17393
|
+
*
|
|
17375
17394
|
* Depends on:
|
|
17376
17395
|
*
|
|
17377
17396
|
* - {@link MediaControl}
|
|
17378
17397
|
*
|
|
17379
|
-
* Configuration options - {@link
|
|
17398
|
+
* Configuration options - {@link ClosedCaptionsPluginSettings}
|
|
17380
17399
|
* @example
|
|
17381
17400
|
* ```ts
|
|
17382
|
-
* import {
|
|
17401
|
+
* import { ClosedCaptions } from '@gcorevideo/player'
|
|
17383
17402
|
*
|
|
17384
|
-
* Player.registerPlugin(
|
|
17403
|
+
* Player.registerPlugin(ClosedCaptions)
|
|
17385
17404
|
*
|
|
17386
17405
|
* new Player({
|
|
17387
17406
|
* ...
|
|
17388
|
-
*
|
|
17407
|
+
* cc: {
|
|
17389
17408
|
* language: 'en',
|
|
17390
17409
|
* },
|
|
17391
17410
|
* })
|
|
17392
17411
|
* ```
|
|
17393
17412
|
*/
|
|
17394
|
-
class
|
|
17413
|
+
class ClosedCaptions extends UICorePlugin {
|
|
17395
17414
|
isPreselectedApplied = false;
|
|
17396
17415
|
isShowing = false;
|
|
17397
17416
|
track = null;
|
|
17398
17417
|
tracks = [];
|
|
17399
|
-
$
|
|
17418
|
+
$line = null;
|
|
17400
17419
|
/**
|
|
17401
17420
|
* @internal
|
|
17402
17421
|
*/
|
|
17403
17422
|
get name() {
|
|
17404
|
-
return '
|
|
17423
|
+
return 'cc';
|
|
17405
17424
|
}
|
|
17406
17425
|
/**
|
|
17407
17426
|
* @internal
|
|
@@ -17422,8 +17441,7 @@ class Subtitles extends UICorePlugin {
|
|
|
17422
17441
|
*/
|
|
17423
17442
|
get attributes() {
|
|
17424
17443
|
return {
|
|
17425
|
-
class: 'media-control-
|
|
17426
|
-
'data-subtitles': '',
|
|
17444
|
+
class: 'media-control-cc',
|
|
17427
17445
|
};
|
|
17428
17446
|
}
|
|
17429
17447
|
/**
|
|
@@ -17431,12 +17449,12 @@ class Subtitles extends UICorePlugin {
|
|
|
17431
17449
|
*/
|
|
17432
17450
|
get events() {
|
|
17433
17451
|
return {
|
|
17434
|
-
'click [data-
|
|
17435
|
-
'click [data-
|
|
17452
|
+
'click [data-cc-select]': 'onItemSelect',
|
|
17453
|
+
'click [data-cc-button]': 'toggleMenu',
|
|
17436
17454
|
};
|
|
17437
17455
|
}
|
|
17438
17456
|
get preselectedLanguage() {
|
|
17439
|
-
return this.core.options.subtitles?.language ?? '';
|
|
17457
|
+
return this.core.options.cc?.language ?? this.core.options.subtitles?.language ?? '';
|
|
17440
17458
|
}
|
|
17441
17459
|
/**
|
|
17442
17460
|
* @internal
|
|
@@ -17543,7 +17561,7 @@ class Subtitles extends UICorePlugin {
|
|
|
17543
17561
|
hide() {
|
|
17544
17562
|
this.isShowing = false;
|
|
17545
17563
|
this.renderIcon();
|
|
17546
|
-
this.$
|
|
17564
|
+
this.$line.hide();
|
|
17547
17565
|
if (this.tracks) {
|
|
17548
17566
|
for (const t of this.tracks) {
|
|
17549
17567
|
t.track.mode = 'hidden';
|
|
@@ -17561,22 +17579,22 @@ class Subtitles extends UICorePlugin {
|
|
|
17561
17579
|
this.track &&
|
|
17562
17580
|
this.track.track.mode &&
|
|
17563
17581
|
Browser.isiOS) {
|
|
17564
|
-
this.$
|
|
17582
|
+
this.$line.hide();
|
|
17565
17583
|
this.track.track.mode = 'showing';
|
|
17566
17584
|
}
|
|
17567
17585
|
else {
|
|
17568
|
-
this.$
|
|
17586
|
+
this.$line.show();
|
|
17569
17587
|
}
|
|
17570
17588
|
}
|
|
17571
17589
|
shouldRender() {
|
|
17572
|
-
return this.tracks
|
|
17590
|
+
return this.tracks?.length > 0;
|
|
17573
17591
|
}
|
|
17574
17592
|
resizeFont() {
|
|
17575
|
-
if (!this.$
|
|
17593
|
+
if (!this.$line) {
|
|
17576
17594
|
return;
|
|
17577
17595
|
}
|
|
17578
17596
|
const skinWidth = this.core.activeContainer.$el.width();
|
|
17579
|
-
this.$
|
|
17597
|
+
this.$line.find('p').css('font-size', skinWidth * 0.03);
|
|
17580
17598
|
}
|
|
17581
17599
|
/**
|
|
17582
17600
|
* @internal
|
|
@@ -17589,12 +17607,12 @@ class Subtitles extends UICorePlugin {
|
|
|
17589
17607
|
return this;
|
|
17590
17608
|
}
|
|
17591
17609
|
const mediaControl = this.core.getPlugin('media_control');
|
|
17592
|
-
this.$el.html(
|
|
17593
|
-
this.core.activeContainer.$el.find('
|
|
17594
|
-
this.$
|
|
17610
|
+
this.$el.html(ClosedCaptions.template({ tracks: this.tracks }));
|
|
17611
|
+
this.core.activeContainer.$el.find('#cc-line').remove();
|
|
17612
|
+
this.$line = $(ClosedCaptions.templateString());
|
|
17595
17613
|
this.resizeFont();
|
|
17596
|
-
this.core.activeContainer.$el.append(this.$
|
|
17597
|
-
mediaControl.putElement('
|
|
17614
|
+
this.core.activeContainer.$el.append(this.$line);
|
|
17615
|
+
mediaControl.putElement('cc', this.el);
|
|
17598
17616
|
this.updateSelection();
|
|
17599
17617
|
this.renderIcon();
|
|
17600
17618
|
return this;
|
|
@@ -17609,8 +17627,8 @@ class Subtitles extends UICorePlugin {
|
|
|
17609
17627
|
this.updateSelection();
|
|
17610
17628
|
}
|
|
17611
17629
|
onItemSelect(event) {
|
|
17612
|
-
const id = event.target.dataset.
|
|
17613
|
-
localStorage.setItem(
|
|
17630
|
+
const id = event.target.dataset.ccSelect ?? '-1';
|
|
17631
|
+
localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
|
|
17614
17632
|
this.selectItem(this.findById(Number(id)));
|
|
17615
17633
|
return false;
|
|
17616
17634
|
}
|
|
@@ -17626,16 +17644,16 @@ class Subtitles extends UICorePlugin {
|
|
|
17626
17644
|
}
|
|
17627
17645
|
}
|
|
17628
17646
|
hideMenu() {
|
|
17629
|
-
this.$('[data-
|
|
17647
|
+
this.$('[data-cc] ul').hide();
|
|
17630
17648
|
}
|
|
17631
17649
|
toggleMenu() {
|
|
17632
|
-
this.$('[data-
|
|
17650
|
+
this.$('[data-cc] ul').toggle();
|
|
17633
17651
|
}
|
|
17634
17652
|
itemElement(id) {
|
|
17635
|
-
return this.$(`ul li a[data-
|
|
17653
|
+
return this.$(`ul li a[data-cc-select="${id}"]`).parent();
|
|
17636
17654
|
}
|
|
17637
17655
|
allItemElements() {
|
|
17638
|
-
return this.$('[data-
|
|
17656
|
+
return this.$('[data-cc] li');
|
|
17639
17657
|
}
|
|
17640
17658
|
selectSubtitles() {
|
|
17641
17659
|
const trackId = this.track ? this.track.id : -1;
|
|
@@ -17655,7 +17673,7 @@ class Subtitles extends UICorePlugin {
|
|
|
17655
17673
|
return lines.join('\n');
|
|
17656
17674
|
}
|
|
17657
17675
|
setSubtitleText(text) {
|
|
17658
|
-
this.$
|
|
17676
|
+
this.$line.find('p').html(text);
|
|
17659
17677
|
}
|
|
17660
17678
|
clearSubtitleText() {
|
|
17661
17679
|
this.setSubtitleText('');
|
|
@@ -17686,7 +17704,7 @@ class Subtitles extends UICorePlugin {
|
|
|
17686
17704
|
}
|
|
17687
17705
|
renderIcon() {
|
|
17688
17706
|
const icon = this.isShowing ? subtitlesOnIcon : subtitlesOffIcon;
|
|
17689
|
-
this.$el.find('span.
|
|
17707
|
+
this.$el.find('span.cc-text').html(icon);
|
|
17690
17708
|
}
|
|
17691
17709
|
}
|
|
17692
17710
|
|
|
@@ -18525,4 +18543,4 @@ class VolumeFade extends UICorePlugin {
|
|
|
18525
18543
|
}
|
|
18526
18544
|
}
|
|
18527
18545
|
|
|
18528
|
-
export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ContextMenu, DvrControls, ErrorScreen, Favicon, GoogleAnalytics, LevelSelector, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackRate, Poster, SeekTime, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents };
|
|
18546
|
+
export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, Favicon, GoogleAnalytics, LevelSelector, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackRate, Poster, SeekTime, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents };
|