@gcorevideo/player 2.21.1 → 2.21.4
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/media-control/container.scss +1 -1
- package/assets/media-control/media-control.ejs +1 -11
- package/assets/media-control/media-control.scss +49 -57
- package/assets/media-control/width270.scss +1 -1
- package/assets/media-control/width370.scss +7 -9
- package/assets/playback-rate/button.ejs +2 -2
- package/assets/playback-rate/list.ejs +4 -4
- package/assets/subtitles/combobox.ejs +10 -12
- package/assets/subtitles/string.ejs +1 -1
- package/assets/subtitles/style.scss +9 -16
- package/dist/core.js +5 -1
- package/dist/index.css +782 -794
- package/dist/index.js +240 -244
- package/dist/player.d.ts +141 -119
- package/dist/plugins/index.css +862 -874
- package/dist/plugins/index.js +222 -238
- 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/BasePlayback.d.ts +1 -0
- package/lib/playback/BasePlayback.d.ts.map +1 -1
- package/lib/playback/BasePlayback.js +3 -0
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +1 -0
- package/lib/playback.types.d.ts +5 -0
- package/lib/playback.types.d.ts.map +1 -1
- 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 +7 -3
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +4 -2
- package/lib/plugins/media-control/MediaControl.d.ts +5 -6
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +48 -39
- 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 +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.d.ts.map +1 -1
- package/lib/plugins/playback-rate/PlaybackRate.js +24 -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 +31 -26
- package/lib/plugins/subtitles/Subtitles.d.ts.map +1 -1
- package/lib/plugins/subtitles/Subtitles.js +138 -169
- package/lib/testUtils.d.ts +22 -18
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +22 -36
- package/package.json +1 -1
- package/src/index.plugins.ts +2 -1
- package/src/index.ts +1 -1
- package/src/playback/BasePlayback.ts +4 -0
- package/src/playback/dash-playback/DashPlayback.ts +1 -0
- package/src/playback.types.ts +6 -0
- package/src/plugins/audio-selector/AudioSelector.ts +9 -8
- package/src/plugins/bottom-gear/BottomGear.ts +14 -5
- 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/media-control/MediaControl.ts +84 -60
- package/src/plugins/media-control/__tests__/MediaControl.test.ts +43 -0
- package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +175 -0
- package/src/plugins/picture-in-picture/PictureInPicture.ts +5 -5
- package/src/plugins/playback-rate/PlaybackRate.ts +143 -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/ClosedCaptions.ts +469 -0
- 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 +22 -36
- package/temp/player.api.json +269 -89
- package/tsconfig.tsbuildinfo +1 -1
- package/src/plugins/index.ts +0 -39
- package/src/plugins/subtitles/Subtitles.ts +0 -496
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
|
|
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
|
|
|
@@ -10408,7 +10407,7 @@ function orderByOrderPattern(arr, order) {
|
|
|
10408
10407
|
* The methods exposed are to be used by the other plugins that extend the media control UI.
|
|
10409
10408
|
*/
|
|
10410
10409
|
class MediaControl extends UICorePlugin {
|
|
10411
|
-
advertisementPlaying = false
|
|
10410
|
+
// private advertisementPlaying = false
|
|
10412
10411
|
buttonsColor = null;
|
|
10413
10412
|
currentDurationValue = 0;
|
|
10414
10413
|
currentPositionValue = 0;
|
|
@@ -10430,7 +10429,7 @@ class MediaControl extends UICorePlugin {
|
|
|
10430
10429
|
lastMouseY = 0;
|
|
10431
10430
|
persistConfig;
|
|
10432
10431
|
rendered = false;
|
|
10433
|
-
settings = {};
|
|
10432
|
+
settings = {}; // TODO & seekEnabled: boolean, ...
|
|
10434
10433
|
userDisabled = false;
|
|
10435
10434
|
userKeepVisible = false;
|
|
10436
10435
|
verticalVolume = false;
|
|
@@ -10450,7 +10449,6 @@ class MediaControl extends UICorePlugin {
|
|
|
10450
10449
|
$seekBarLoaded = null;
|
|
10451
10450
|
$seekBarPosition = null;
|
|
10452
10451
|
$seekBarScrubber = null;
|
|
10453
|
-
$subtitlesSelector = null;
|
|
10454
10452
|
$volumeBarContainer = null;
|
|
10455
10453
|
$volumeBarBackground = null;
|
|
10456
10454
|
$volumeBarFill = null;
|
|
@@ -10471,7 +10469,8 @@ class MediaControl extends UICorePlugin {
|
|
|
10471
10469
|
return { min: CLAPPR_VERSION };
|
|
10472
10470
|
}
|
|
10473
10471
|
get disabled() {
|
|
10474
|
-
const playbackIsNOOP = this.core.activeContainer &&
|
|
10472
|
+
const playbackIsNOOP = this.core.activeContainer &&
|
|
10473
|
+
this.core.activeContainer.getPlaybackType() === Playback.NO_OP;
|
|
10475
10474
|
return this.userDisabled || playbackIsNOOP;
|
|
10476
10475
|
}
|
|
10477
10476
|
/**
|
|
@@ -10611,18 +10610,16 @@ class MediaControl extends UICorePlugin {
|
|
|
10611
10610
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_DBLCLICK, this.toggleFullscreen);
|
|
10612
10611
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
|
|
10613
10612
|
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.
|
|
10613
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_SETTINGSUPDATE, this.updateSettings);
|
|
10614
|
+
this.listenTo(this.core.activeContainer, Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.updateSettings);
|
|
10616
10615
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
|
|
10617
10616
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_DISABLE, this.disable);
|
|
10618
10617
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_MEDIACONTROL_ENABLE, this.enable);
|
|
10619
10618
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_ENDED, this.ended);
|
|
10620
10619
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_VOLUME, this.onVolumeChanged);
|
|
10621
10620
|
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
|
-
}
|
|
10621
|
+
// wait until the metadata has loaded and then check if fullscreen on video tag is supported
|
|
10622
|
+
this.listenToOnce(this.core.activeContainer, Events.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
|
|
10626
10623
|
}
|
|
10627
10624
|
/**
|
|
10628
10625
|
* Hides the media control UI
|
|
@@ -10655,13 +10652,13 @@ class MediaControl extends UICorePlugin {
|
|
|
10655
10652
|
onVolumeChanged() {
|
|
10656
10653
|
this.updateVolumeUI();
|
|
10657
10654
|
}
|
|
10658
|
-
|
|
10655
|
+
onLoadedMetadata() {
|
|
10659
10656
|
const video = this.core.activePlayback?.el;
|
|
10660
10657
|
// video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
|
|
10661
10658
|
// see https://github.com/clappr/clappr/issues/1127
|
|
10662
10659
|
if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
|
|
10663
10660
|
this.fullScreenOnVideoTagSupported = true;
|
|
10664
|
-
this.
|
|
10661
|
+
this.updateSettings();
|
|
10665
10662
|
}
|
|
10666
10663
|
}
|
|
10667
10664
|
updateVolumeUI() {
|
|
@@ -10890,7 +10887,7 @@ class MediaControl extends UICorePlugin {
|
|
|
10890
10887
|
this.setInitialVolume();
|
|
10891
10888
|
this.changeTogglePlay();
|
|
10892
10889
|
this.bindContainerEvents();
|
|
10893
|
-
this.
|
|
10890
|
+
this.updateSettings();
|
|
10894
10891
|
this.core.activeContainer.trigger(Events.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
|
|
10895
10892
|
// TODO test
|
|
10896
10893
|
if (this.core.activeContainer.mediaControlDisabled) {
|
|
@@ -11071,18 +11068,19 @@ class MediaControl extends UICorePlugin {
|
|
|
11071
11068
|
this.core.$el.addClass('nocursor');
|
|
11072
11069
|
}
|
|
11073
11070
|
}
|
|
11074
|
-
|
|
11071
|
+
updateSettings() {
|
|
11075
11072
|
const newSettings = $.extend(true, {
|
|
11076
11073
|
left: [],
|
|
11077
11074
|
default: [],
|
|
11078
11075
|
right: [],
|
|
11079
|
-
}, this.core.activeContainer
|
|
11076
|
+
}, this.core.activeContainer.settings);
|
|
11080
11077
|
newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
|
|
11078
|
+
// actual order of the items appear rendered is controlled by CSS
|
|
11081
11079
|
newSettings.right = [
|
|
11082
11080
|
'fullscreen',
|
|
11083
11081
|
'pip',
|
|
11084
|
-
'
|
|
11085
|
-
'
|
|
11082
|
+
'gear',
|
|
11083
|
+
'cc',
|
|
11086
11084
|
'multicamera',
|
|
11087
11085
|
'playbackrate',
|
|
11088
11086
|
'vr',
|
|
@@ -11091,7 +11089,7 @@ class MediaControl extends UICorePlugin {
|
|
|
11091
11089
|
if ((!this.fullScreenOnVideoTagSupported &&
|
|
11092
11090
|
!Fullscreen.fullscreenEnabled()) ||
|
|
11093
11091
|
this.options.fullscreenDisable) {
|
|
11094
|
-
// remove fullscreen from settings if it is
|
|
11092
|
+
// remove fullscreen from settings if it is not available
|
|
11095
11093
|
removeArrayItem(newSettings.default, 'fullscreen');
|
|
11096
11094
|
removeArrayItem(newSettings.left, 'fullscreen');
|
|
11097
11095
|
removeArrayItem(newSettings.right, 'fullscreen');
|
|
@@ -11128,10 +11126,9 @@ class MediaControl extends UICorePlugin {
|
|
|
11128
11126
|
this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
|
|
11129
11127
|
this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
|
|
11130
11128
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
11131
|
-
this.$subtitlesSelector = this.$el.find('.media-control-subtitles[data-subtitles]');
|
|
11132
11129
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
11133
11130
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
11134
|
-
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
|
|
11131
|
+
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
|
|
11135
11132
|
this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
|
|
11136
11133
|
this.resetIndicators();
|
|
11137
11134
|
this.initializeIcons();
|
|
@@ -11157,33 +11154,31 @@ class MediaControl extends UICorePlugin {
|
|
|
11157
11154
|
*/
|
|
11158
11155
|
getElement(name) {
|
|
11159
11156
|
switch (name) {
|
|
11160
|
-
case '
|
|
11157
|
+
case 'audiotracks':
|
|
11161
11158
|
return null;
|
|
11162
11159
|
case 'clipText':
|
|
11163
11160
|
return this.$clipText;
|
|
11164
|
-
case 'gear':
|
|
11165
|
-
return null;
|
|
11166
|
-
case 'pip':
|
|
11167
|
-
return null;
|
|
11168
11161
|
case 'playbackRate':
|
|
11169
11162
|
return this.$playbackRate;
|
|
11170
11163
|
case 'seekBarContainer':
|
|
11171
11164
|
return this.$seekBarContainer;
|
|
11172
|
-
case 'subtitlesSelector':
|
|
11173
|
-
return this.$subtitlesSelector;
|
|
11174
11165
|
}
|
|
11175
11166
|
}
|
|
11176
11167
|
putElement(name, element) {
|
|
11177
|
-
|
|
11178
|
-
|
|
11179
|
-
|
|
11180
|
-
|
|
11181
|
-
|
|
11182
|
-
|
|
11183
|
-
|
|
11184
|
-
|
|
11185
|
-
|
|
11186
|
-
|
|
11168
|
+
const panel = this.getElementLocation(name);
|
|
11169
|
+
if (panel) {
|
|
11170
|
+
const current = panel.find(`[data-${name}]`);
|
|
11171
|
+
element.setAttribute(`data-${name}`, "");
|
|
11172
|
+
// TODO test
|
|
11173
|
+
if (current.length) {
|
|
11174
|
+
if (current[0] === element) {
|
|
11175
|
+
return;
|
|
11176
|
+
}
|
|
11177
|
+
current.replaceWith(element);
|
|
11178
|
+
}
|
|
11179
|
+
else {
|
|
11180
|
+
panel.append(element);
|
|
11181
|
+
}
|
|
11187
11182
|
}
|
|
11188
11183
|
}
|
|
11189
11184
|
/**
|
|
@@ -11421,12 +11416,12 @@ class MediaControl extends UICorePlugin {
|
|
|
11421
11416
|
}
|
|
11422
11417
|
// TODO manage by the ads plugin
|
|
11423
11418
|
onStartAd() {
|
|
11424
|
-
this.advertisementPlaying = true
|
|
11419
|
+
// this.advertisementPlaying = true
|
|
11425
11420
|
this.disable();
|
|
11426
11421
|
}
|
|
11427
11422
|
// TODO manage by the ads plugin
|
|
11428
11423
|
onFinishAd() {
|
|
11429
|
-
this.advertisementPlaying = false
|
|
11424
|
+
// this.advertisementPlaying = false
|
|
11430
11425
|
this.enable();
|
|
11431
11426
|
}
|
|
11432
11427
|
// TODO remove
|
|
@@ -11470,12 +11465,25 @@ class MediaControl extends UICorePlugin {
|
|
|
11470
11465
|
}
|
|
11471
11466
|
return isFinite(this.core.activePlayback.getDuration());
|
|
11472
11467
|
}
|
|
11468
|
+
getElementLocation(name) {
|
|
11469
|
+
if (this.settings.right?.includes(name)) {
|
|
11470
|
+
return this.getRightPanel();
|
|
11471
|
+
}
|
|
11472
|
+
if (this.settings.left?.includes(name)) {
|
|
11473
|
+
return this.getLeftPanel();
|
|
11474
|
+
}
|
|
11475
|
+
if (this.settings.default?.includes(name)) {
|
|
11476
|
+
return this.getCenterPanel();
|
|
11477
|
+
}
|
|
11478
|
+
return null;
|
|
11479
|
+
}
|
|
11473
11480
|
}
|
|
11474
11481
|
MediaControl.extend = function (properties) {
|
|
11475
11482
|
return extend(MediaControl, properties);
|
|
11476
11483
|
};
|
|
11477
11484
|
|
|
11478
11485
|
const VERSION$5 = '2.19.12';
|
|
11486
|
+
// TODO disabled if no items added
|
|
11479
11487
|
/**
|
|
11480
11488
|
* `PLUGIN` that adds the gear button with an extra options menu on the right side of the {@link MediaControl | media control} UI
|
|
11481
11489
|
* @beta
|
|
@@ -11484,7 +11492,7 @@ const VERSION$5 = '2.19.12';
|
|
|
11484
11492
|
*
|
|
11485
11493
|
* Depends on:
|
|
11486
11494
|
*
|
|
11487
|
-
* - {@link MediaControl
|
|
11495
|
+
* - {@link MediaControl}
|
|
11488
11496
|
*/
|
|
11489
11497
|
class BottomGear extends UICorePlugin {
|
|
11490
11498
|
isHd = false;
|
|
@@ -11537,6 +11545,7 @@ class BottomGear extends UICorePlugin {
|
|
|
11537
11545
|
getElement(name) {
|
|
11538
11546
|
return this.$el.find(`.gear-options-list [data-${name}]`);
|
|
11539
11547
|
}
|
|
11548
|
+
// TODO implement putElement/addElement method
|
|
11540
11549
|
/**
|
|
11541
11550
|
* Replaces the content of the gear menu
|
|
11542
11551
|
* @param content - Zepto result of the element
|
|
@@ -11567,7 +11576,7 @@ class BottomGear extends UICorePlugin {
|
|
|
11567
11576
|
];
|
|
11568
11577
|
const icon = this.isHd ? gearHdIcon : gearIcon;
|
|
11569
11578
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
11570
|
-
mediaControl.putElement('gear', this
|
|
11579
|
+
mediaControl.putElement('gear', this.el);
|
|
11571
11580
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
11572
11581
|
return this;
|
|
11573
11582
|
}
|
|
@@ -14567,7 +14576,7 @@ class ClipsPlugin extends UICorePlugin {
|
|
|
14567
14576
|
|
|
14568
14577
|
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";
|
|
14569
14578
|
|
|
14570
|
-
var version$1 = "2.21.
|
|
14579
|
+
var version$1 = "2.21.4";
|
|
14571
14580
|
|
|
14572
14581
|
var packages = {
|
|
14573
14582
|
"node_modules/@clappr/core": {
|
|
@@ -16050,6 +16059,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
16050
16059
|
static get version() {
|
|
16051
16060
|
return VERSION$2;
|
|
16052
16061
|
}
|
|
16062
|
+
static buttonTemplate = tmpl(buttonHtml$1);
|
|
16053
16063
|
/**
|
|
16054
16064
|
* @internal
|
|
16055
16065
|
*/
|
|
@@ -16082,8 +16092,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
16082
16092
|
if (!this.isPiPSupported()) {
|
|
16083
16093
|
return this;
|
|
16084
16094
|
}
|
|
16085
|
-
|
|
16086
|
-
this.$el.html(t({ pipIcon }));
|
|
16095
|
+
this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
|
|
16087
16096
|
const mediaControl = this.core.getPlugin('media_control');
|
|
16088
16097
|
if (mediaControl) {
|
|
16089
16098
|
mediaControl.putElement('pip', this.el);
|
|
@@ -16109,9 +16118,9 @@ class PictureInPicture extends UICorePlugin {
|
|
|
16109
16118
|
}
|
|
16110
16119
|
}
|
|
16111
16120
|
|
|
16112
|
-
const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option'>\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span
|
|
16121
|
+
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";
|
|
16113
16122
|
|
|
16114
|
-
const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n
|
|
16123
|
+
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";
|
|
16115
16124
|
|
|
16116
16125
|
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";
|
|
16117
16126
|
|
|
@@ -16132,7 +16141,7 @@ const DEFAULT_PLAYBACK_RATES = [
|
|
|
16132
16141
|
{ value: '1.25', label: '1.25x' },
|
|
16133
16142
|
{ value: '1.5', label: '1.5x' },
|
|
16134
16143
|
{ value: '1.75', label: '1.75x' },
|
|
16135
|
-
{ value: '2.0', label: '2x' }
|
|
16144
|
+
{ value: '2.0', label: '2x' },
|
|
16136
16145
|
];
|
|
16137
16146
|
const DEFAULT_PLAYBACK_RATE = '1.0';
|
|
16138
16147
|
const T$6 = 'plugins.playback_rate';
|
|
@@ -16148,6 +16157,7 @@ const T$6 = 'plugins.playback_rate';
|
|
|
16148
16157
|
* - {@link BottomGear | bottom_gear}
|
|
16149
16158
|
*
|
|
16150
16159
|
* It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
|
|
16160
|
+
* Note that the playback rate change is supported only for VOD or DVR enabled live streams.
|
|
16151
16161
|
*/
|
|
16152
16162
|
class PlaybackRate extends UICorePlugin {
|
|
16153
16163
|
playbackRates = DEFAULT_PLAYBACK_RATES;
|
|
@@ -16171,16 +16181,17 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16171
16181
|
static listTemplate = tmpl(listHtml);
|
|
16172
16182
|
constructor(core) {
|
|
16173
16183
|
super(core);
|
|
16174
|
-
this.playbackRates =
|
|
16175
|
-
|
|
16184
|
+
this.playbackRates =
|
|
16185
|
+
core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
|
|
16186
|
+
this.selectedRate =
|
|
16187
|
+
core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
|
|
16176
16188
|
}
|
|
16177
16189
|
/**
|
|
16178
16190
|
* @internal
|
|
16179
16191
|
*/
|
|
16180
16192
|
get attributes() {
|
|
16181
16193
|
return {
|
|
16182
|
-
|
|
16183
|
-
'data-playback-rate-select': ''
|
|
16194
|
+
class: 'media-control-playbackrate',
|
|
16184
16195
|
};
|
|
16185
16196
|
}
|
|
16186
16197
|
/**
|
|
@@ -16228,7 +16239,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16228
16239
|
allRateElements() {
|
|
16229
16240
|
return this.$('ul.gear-sub-menu li');
|
|
16230
16241
|
}
|
|
16231
|
-
rateElement(rate =
|
|
16242
|
+
rateElement(rate = '1') {
|
|
16232
16243
|
return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
|
|
16233
16244
|
}
|
|
16234
16245
|
onPlaybackRateChange(playbackRate) {
|
|
@@ -16239,10 +16250,11 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16239
16250
|
}
|
|
16240
16251
|
}
|
|
16241
16252
|
shouldRender() {
|
|
16242
|
-
if (!this.core.
|
|
16253
|
+
if (!this.core.activePlayback) {
|
|
16243
16254
|
return false;
|
|
16244
16255
|
}
|
|
16245
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
16256
|
+
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
16257
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
16246
16258
|
return false;
|
|
16247
16259
|
}
|
|
16248
16260
|
return 'setPlaybackRate' in this.core.activePlayback;
|
|
@@ -16265,9 +16277,12 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16265
16277
|
title: this.getTitle(),
|
|
16266
16278
|
speedIcon,
|
|
16267
16279
|
arrowRightIcon,
|
|
16280
|
+
i18n: this.core.i18n,
|
|
16268
16281
|
});
|
|
16269
16282
|
this.$el.html(button);
|
|
16270
|
-
this.core.getPlugin('bottom_gear')
|
|
16283
|
+
this.core.getPlugin('bottom_gear')
|
|
16284
|
+
?.getElement('rate')
|
|
16285
|
+
?.html(this.el);
|
|
16271
16286
|
this.rendered = true;
|
|
16272
16287
|
return this;
|
|
16273
16288
|
}
|
|
@@ -16282,7 +16297,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16282
16297
|
}
|
|
16283
16298
|
}
|
|
16284
16299
|
onPlay() {
|
|
16285
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
16300
|
+
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
16301
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
16286
16302
|
this.resetPlaybackRate();
|
|
16287
16303
|
}
|
|
16288
16304
|
else {
|
|
@@ -16292,8 +16308,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16292
16308
|
resetPlaybackRate() {
|
|
16293
16309
|
this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
|
|
16294
16310
|
}
|
|
16295
|
-
onStop() {
|
|
16296
|
-
}
|
|
16311
|
+
onStop() { }
|
|
16297
16312
|
onRateSelect(event) {
|
|
16298
16313
|
event.stopPropagation();
|
|
16299
16314
|
const rate = event.currentTarget.dataset.rate;
|
|
@@ -16308,6 +16323,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16308
16323
|
playbackRates: this.playbackRates,
|
|
16309
16324
|
arrowLeftIcon,
|
|
16310
16325
|
checkIcon,
|
|
16326
|
+
i18n: this.core.i18n,
|
|
16311
16327
|
}));
|
|
16312
16328
|
this.core.getPlugin('bottom_gear')?.setContent(this.el);
|
|
16313
16329
|
this.highlightCurrentRate();
|
|
@@ -16323,7 +16339,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
16323
16339
|
this.selectedRate = rate;
|
|
16324
16340
|
}
|
|
16325
16341
|
getTitle() {
|
|
16326
|
-
return this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
16342
|
+
return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
16343
|
+
this.selectedRate);
|
|
16327
16344
|
}
|
|
16328
16345
|
highlightCurrentRate() {
|
|
16329
16346
|
this.allRateElements().removeClass('current');
|
|
@@ -17356,53 +17373,51 @@ const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
|
|
|
17356
17373
|
|
|
17357
17374
|
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";
|
|
17358
17375
|
|
|
17359
|
-
const comboboxHTML = "<button data-
|
|
17376
|
+
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";
|
|
17360
17377
|
|
|
17361
|
-
const stringHTML = "<div class=\"
|
|
17378
|
+
const stringHTML = "<div class=\"cc-line\" id=\"cc-line\">\n <p></p>\n</div>\n";
|
|
17362
17379
|
|
|
17363
17380
|
const VERSION = '2.19.14';
|
|
17364
|
-
const
|
|
17365
|
-
const T$2 = 'plugins.
|
|
17366
|
-
const NO_TRACK = { language: 'off' };
|
|
17381
|
+
const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
|
|
17382
|
+
const T$2 = 'plugins.cc';
|
|
17367
17383
|
/**
|
|
17368
17384
|
* `PLUGIN` that provides a UI to select the subtitles when available.
|
|
17369
17385
|
* @beta
|
|
17370
17386
|
*
|
|
17371
17387
|
* @remarks
|
|
17388
|
+
* The plugin is activated when closed captions tracks are provided with the media source.
|
|
17389
|
+
* It shows a familiar "CC" button with a dropdown menu to select the subtitles language.
|
|
17390
|
+
*
|
|
17372
17391
|
* Depends on:
|
|
17373
17392
|
*
|
|
17374
17393
|
* - {@link MediaControl}
|
|
17375
17394
|
*
|
|
17376
|
-
* Configuration options
|
|
17377
|
-
*
|
|
17378
|
-
* - subtitles.language - The language of the subtitles to select by default.
|
|
17379
|
-
*
|
|
17395
|
+
* Configuration options - {@link ClosedCaptionsPluginSettings}
|
|
17380
17396
|
* @example
|
|
17381
17397
|
* ```ts
|
|
17382
|
-
* import {
|
|
17398
|
+
* import { ClosedCaptions } from '@gcorevideo/player'
|
|
17383
17399
|
*
|
|
17384
|
-
* Player.registerPlugin(
|
|
17400
|
+
* Player.registerPlugin(ClosedCaptions)
|
|
17385
17401
|
*
|
|
17386
17402
|
* new Player({
|
|
17387
17403
|
* ...
|
|
17388
|
-
*
|
|
17404
|
+
* cc: {
|
|
17389
17405
|
* language: 'en',
|
|
17390
17406
|
* },
|
|
17391
17407
|
* })
|
|
17392
17408
|
* ```
|
|
17393
17409
|
*/
|
|
17394
|
-
class
|
|
17395
|
-
currentLevel = null;
|
|
17410
|
+
class ClosedCaptions extends UICorePlugin {
|
|
17396
17411
|
isPreselectedApplied = false;
|
|
17397
17412
|
isShowing = false;
|
|
17398
|
-
track =
|
|
17399
|
-
tracks =
|
|
17400
|
-
$
|
|
17413
|
+
track = null;
|
|
17414
|
+
tracks = [];
|
|
17415
|
+
$line = null;
|
|
17401
17416
|
/**
|
|
17402
17417
|
* @internal
|
|
17403
17418
|
*/
|
|
17404
17419
|
get name() {
|
|
17405
|
-
return '
|
|
17420
|
+
return 'cc';
|
|
17406
17421
|
}
|
|
17407
17422
|
/**
|
|
17408
17423
|
* @internal
|
|
@@ -17423,8 +17438,7 @@ class Subtitles extends UICorePlugin {
|
|
|
17423
17438
|
*/
|
|
17424
17439
|
get attributes() {
|
|
17425
17440
|
return {
|
|
17426
|
-
class:
|
|
17427
|
-
'data-subtitles': '',
|
|
17441
|
+
class: 'media-control-cc',
|
|
17428
17442
|
};
|
|
17429
17443
|
}
|
|
17430
17444
|
/**
|
|
@@ -17432,28 +17446,32 @@ class Subtitles extends UICorePlugin {
|
|
|
17432
17446
|
*/
|
|
17433
17447
|
get events() {
|
|
17434
17448
|
return {
|
|
17435
|
-
'click [data-
|
|
17436
|
-
'click [data-
|
|
17449
|
+
'click [data-cc-select]': 'onItemSelect',
|
|
17450
|
+
'click [data-cc-button]': 'toggleMenu',
|
|
17437
17451
|
};
|
|
17438
17452
|
}
|
|
17439
17453
|
get preselectedLanguage() {
|
|
17440
|
-
return this.core.options.subtitles?.language ?? '
|
|
17454
|
+
return this.core.options.cc?.language ?? this.core.options.subtitles?.language ?? '';
|
|
17441
17455
|
}
|
|
17442
17456
|
/**
|
|
17443
17457
|
* @internal
|
|
17444
17458
|
*/
|
|
17445
17459
|
bindEvents() {
|
|
17460
|
+
this.listenTo(this.core, Events.CORE_READY, this.onCoreReady);
|
|
17461
|
+
this.listenTo(this.core, Events.CORE_RESIZE, this.playerResize);
|
|
17462
|
+
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
|
|
17463
|
+
}
|
|
17464
|
+
onCoreReady() {
|
|
17446
17465
|
const mediaControl = this.core.getPlugin('media_control');
|
|
17447
17466
|
assert(mediaControl, 'media_control plugin is required');
|
|
17448
|
-
this.listenTo(this.core, Events.CORE_RESIZE, this.playerResize);
|
|
17449
|
-
this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.bindPlaybackEvents);
|
|
17450
17467
|
this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render);
|
|
17451
|
-
this.listenTo(mediaControl, Events.MEDIACONTROL_HIDE, this.
|
|
17468
|
+
this.listenTo(mediaControl, Events.MEDIACONTROL_HIDE, this.hideMenu);
|
|
17452
17469
|
}
|
|
17453
|
-
|
|
17470
|
+
onContainerChanged() {
|
|
17454
17471
|
this.listenTo(this.core.activeContainer, Events.CONTAINER_FULLSCREEN, this.playerResize);
|
|
17455
|
-
this.listenToOnce(this.core.activePlayback, Events.PLAYBACK_PLAY, this.getTracks);
|
|
17456
17472
|
this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
|
|
17473
|
+
this.listenTo(this.core.activePlayback, Events.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
|
|
17474
|
+
this.listenTo(this.core.activePlayback, Events.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
|
|
17457
17475
|
// fix for iOS
|
|
17458
17476
|
const video = this.core.activePlayback.el;
|
|
17459
17477
|
assert(video, 'video element is required');
|
|
@@ -17468,19 +17486,46 @@ class Subtitles extends UICorePlugin {
|
|
|
17468
17486
|
}
|
|
17469
17487
|
});
|
|
17470
17488
|
}
|
|
17471
|
-
|
|
17472
|
-
|
|
17473
|
-
|
|
17474
|
-
|
|
17475
|
-
|
|
17476
|
-
|
|
17477
|
-
|
|
17478
|
-
|
|
17489
|
+
onSubtitleAvailable() {
|
|
17490
|
+
this.applyTracks();
|
|
17491
|
+
}
|
|
17492
|
+
onSubtitleChanged({ id }) {
|
|
17493
|
+
if (id === -1) {
|
|
17494
|
+
this.clearSubtitleText();
|
|
17495
|
+
}
|
|
17496
|
+
for (const track of this.tracks) {
|
|
17497
|
+
if (track.id === id) {
|
|
17498
|
+
track.track.mode = 'showing';
|
|
17499
|
+
this.setSubtitleText(this.getSubtitleText(track.track));
|
|
17500
|
+
track.track.oncuechange = (e) => {
|
|
17501
|
+
try {
|
|
17502
|
+
if (track.track.activeCues?.length) {
|
|
17503
|
+
const html = track.track.activeCues[0].getCueAsHTML();
|
|
17504
|
+
this.setSubtitleText(html);
|
|
17505
|
+
}
|
|
17506
|
+
else {
|
|
17507
|
+
this.clearSubtitleText();
|
|
17508
|
+
}
|
|
17509
|
+
}
|
|
17510
|
+
catch (error) {
|
|
17511
|
+
}
|
|
17512
|
+
};
|
|
17479
17513
|
}
|
|
17480
|
-
|
|
17514
|
+
else {
|
|
17515
|
+
track.track.oncuechange = null;
|
|
17516
|
+
track.track.mode = 'hidden';
|
|
17481
17517
|
}
|
|
17482
17518
|
}
|
|
17483
17519
|
}
|
|
17520
|
+
applyTracks() {
|
|
17521
|
+
try {
|
|
17522
|
+
this.tracks = this.core.activePlayback.closedCaptionsTracks;
|
|
17523
|
+
this.applyPreselectedSubtitles();
|
|
17524
|
+
this.render();
|
|
17525
|
+
}
|
|
17526
|
+
catch (error) {
|
|
17527
|
+
}
|
|
17528
|
+
}
|
|
17484
17529
|
onStartAd() {
|
|
17485
17530
|
if (this.isShowing && this.core.activeContainer) {
|
|
17486
17531
|
this.hide();
|
|
@@ -17494,8 +17539,8 @@ class Subtitles extends UICorePlugin {
|
|
|
17494
17539
|
playerResize() {
|
|
17495
17540
|
const shouldShow = this.core.activeContainer &&
|
|
17496
17541
|
isFullscreen(this.core.activeContainer.el) &&
|
|
17497
|
-
this.
|
|
17498
|
-
this.
|
|
17542
|
+
this.track &&
|
|
17543
|
+
this.track.track.mode &&
|
|
17499
17544
|
Browser.isiOS &&
|
|
17500
17545
|
this.isShowing;
|
|
17501
17546
|
if (shouldShow) {
|
|
@@ -17513,10 +17558,10 @@ class Subtitles extends UICorePlugin {
|
|
|
17513
17558
|
hide() {
|
|
17514
17559
|
this.isShowing = false;
|
|
17515
17560
|
this.renderIcon();
|
|
17516
|
-
this.$
|
|
17561
|
+
this.$line.hide();
|
|
17517
17562
|
if (this.tracks) {
|
|
17518
17563
|
for (const t of this.tracks) {
|
|
17519
|
-
t.mode = 'hidden';
|
|
17564
|
+
t.track.mode = 'hidden';
|
|
17520
17565
|
}
|
|
17521
17566
|
}
|
|
17522
17567
|
}
|
|
@@ -17528,28 +17573,25 @@ class Subtitles extends UICorePlugin {
|
|
|
17528
17573
|
this.renderIcon();
|
|
17529
17574
|
if (this.core.activeContainer &&
|
|
17530
17575
|
isFullscreen(this.core.activeContainer.el) &&
|
|
17531
|
-
this.
|
|
17532
|
-
this.
|
|
17576
|
+
this.track &&
|
|
17577
|
+
this.track.track.mode &&
|
|
17533
17578
|
Browser.isiOS) {
|
|
17534
|
-
this.$
|
|
17535
|
-
this.
|
|
17579
|
+
this.$line.hide();
|
|
17580
|
+
this.track.track.mode = 'showing';
|
|
17536
17581
|
}
|
|
17537
17582
|
else {
|
|
17538
|
-
this.$
|
|
17583
|
+
this.$line.show();
|
|
17539
17584
|
}
|
|
17540
17585
|
}
|
|
17541
17586
|
shouldRender() {
|
|
17542
|
-
return
|
|
17587
|
+
return this.tracks?.length > 0;
|
|
17543
17588
|
}
|
|
17544
17589
|
resizeFont() {
|
|
17545
|
-
if (!this
|
|
17546
|
-
return;
|
|
17547
|
-
}
|
|
17548
|
-
if (!this.$string) {
|
|
17590
|
+
if (!this.$line) {
|
|
17549
17591
|
return;
|
|
17550
17592
|
}
|
|
17551
17593
|
const skinWidth = this.core.activeContainer.$el.width();
|
|
17552
|
-
this.$
|
|
17594
|
+
this.$line.find('p').css('font-size', skinWidth * 0.03);
|
|
17553
17595
|
}
|
|
17554
17596
|
/**
|
|
17555
17597
|
* @internal
|
|
@@ -17561,139 +17603,80 @@ class Subtitles extends UICorePlugin {
|
|
|
17561
17603
|
if (!this.shouldRender()) {
|
|
17562
17604
|
return this;
|
|
17563
17605
|
}
|
|
17564
|
-
trace(`${T$2} render`, {
|
|
17565
|
-
tracks: this.tracks?.length,
|
|
17566
|
-
track: this.track?.language,
|
|
17567
|
-
});
|
|
17568
17606
|
const mediaControl = this.core.getPlugin('media_control');
|
|
17569
|
-
|
|
17570
|
-
this.$el.
|
|
17571
|
-
this
|
|
17572
|
-
this.$string = $(Subtitles.templateString());
|
|
17607
|
+
this.$el.html(ClosedCaptions.template({ tracks: this.tracks }));
|
|
17608
|
+
this.core.activeContainer.$el.find('#cc-line').remove();
|
|
17609
|
+
this.$line = $(ClosedCaptions.templateString());
|
|
17573
17610
|
this.resizeFont();
|
|
17574
|
-
this.core.activeContainer.$el.append(this.$
|
|
17575
|
-
|
|
17576
|
-
|
|
17577
|
-
ss.append(this.el);
|
|
17578
|
-
}
|
|
17579
|
-
else {
|
|
17580
|
-
mediaControl.getRightPanel().append(this.el);
|
|
17581
|
-
}
|
|
17582
|
-
this.updateCurrentLevel(this.track);
|
|
17583
|
-
this.highlightCurrentSubtitles();
|
|
17584
|
-
this.applyPreselectedSubtitles();
|
|
17611
|
+
this.core.activeContainer.$el.append(this.$line);
|
|
17612
|
+
mediaControl.putElement('cc', this.el);
|
|
17613
|
+
this.updateSelection();
|
|
17585
17614
|
this.renderIcon();
|
|
17586
17615
|
return this;
|
|
17587
17616
|
}
|
|
17588
|
-
|
|
17589
|
-
this.tracks
|
|
17590
|
-
this.render();
|
|
17617
|
+
findById(id) {
|
|
17618
|
+
return this.tracks.find((track) => track.id === id) ?? null;
|
|
17591
17619
|
}
|
|
17592
|
-
|
|
17593
|
-
if (this.tracks) {
|
|
17594
|
-
for (const track of this.tracks) {
|
|
17595
|
-
if (track.language === id) {
|
|
17596
|
-
return track; // TODO TrackInfo?
|
|
17597
|
-
}
|
|
17598
|
-
}
|
|
17599
|
-
}
|
|
17600
|
-
}
|
|
17601
|
-
selectLevel(id) {
|
|
17620
|
+
selectItem(item) {
|
|
17602
17621
|
this.clearSubtitleText();
|
|
17603
|
-
this.track =
|
|
17604
|
-
this.
|
|
17605
|
-
|
|
17606
|
-
|
|
17607
|
-
|
|
17608
|
-
|
|
17609
|
-
|
|
17610
|
-
|
|
17611
|
-
const id = event.target.dataset.subtitlesSelect;
|
|
17612
|
-
if (id) {
|
|
17613
|
-
localStorage.setItem(LOCAL_STORAGE_SUBTITLES_ID, id);
|
|
17614
|
-
this.selectLevel(id);
|
|
17615
|
-
}
|
|
17622
|
+
this.track = item;
|
|
17623
|
+
this.hideMenu();
|
|
17624
|
+
this.updateSelection();
|
|
17625
|
+
}
|
|
17626
|
+
onItemSelect(event) {
|
|
17627
|
+
const id = event.target.dataset.ccSelect ?? '-1';
|
|
17628
|
+
localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
|
|
17629
|
+
this.selectItem(this.findById(Number(id)));
|
|
17616
17630
|
return false;
|
|
17617
17631
|
}
|
|
17618
17632
|
applyPreselectedSubtitles() {
|
|
17619
17633
|
if (!this.isPreselectedApplied) {
|
|
17620
17634
|
this.isPreselectedApplied = true;
|
|
17635
|
+
if (!this.preselectedLanguage) {
|
|
17636
|
+
return;
|
|
17637
|
+
}
|
|
17621
17638
|
setTimeout(() => {
|
|
17622
|
-
this.
|
|
17623
|
-
}, 300);
|
|
17639
|
+
this.selectItem(this.tracks.find((t) => t.track.language === this.preselectedLanguage) ?? null);
|
|
17640
|
+
}, 300); // TODO why delay?
|
|
17624
17641
|
}
|
|
17625
17642
|
}
|
|
17626
|
-
|
|
17627
|
-
this.
|
|
17628
|
-
}
|
|
17629
|
-
hideSelectLevelMenu() {
|
|
17630
|
-
this.$('[data-subtitles] ul').hide();
|
|
17643
|
+
hideMenu() {
|
|
17644
|
+
this.$('[data-cc] ul').hide();
|
|
17631
17645
|
}
|
|
17632
|
-
|
|
17633
|
-
this.$('[data-
|
|
17646
|
+
toggleMenu() {
|
|
17647
|
+
this.$('[data-cc] ul').toggle();
|
|
17634
17648
|
}
|
|
17635
|
-
|
|
17636
|
-
return this.$(
|
|
17649
|
+
itemElement(id) {
|
|
17650
|
+
return this.$(`ul li a[data-cc-select="${id}"]`).parent();
|
|
17637
17651
|
}
|
|
17638
|
-
|
|
17639
|
-
return this.$('[data-
|
|
17640
|
-
}
|
|
17641
|
-
startLevelSwitch() {
|
|
17642
|
-
this.buttonElement().addClass('changing');
|
|
17643
|
-
}
|
|
17644
|
-
stopLevelSwitch() {
|
|
17645
|
-
this.buttonElement().removeClass('changing');
|
|
17652
|
+
allItemElements() {
|
|
17653
|
+
return this.$('[data-cc] li');
|
|
17646
17654
|
}
|
|
17647
17655
|
selectSubtitles() {
|
|
17648
|
-
|
|
17649
|
-
|
|
17650
|
-
|
|
17651
|
-
|
|
17652
|
-
|
|
17653
|
-
|
|
17654
|
-
|
|
17655
|
-
|
|
17656
|
-
|
|
17657
|
-
|
|
17658
|
-
|
|
17659
|
-
if (cues && cues.length) {
|
|
17660
|
-
for (const cue of cues) {
|
|
17661
|
-
if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
|
|
17662
|
-
subtitleText +=
|
|
17663
|
-
cue.getCueAsHTML().textContent + '\n';
|
|
17664
|
-
}
|
|
17665
|
-
}
|
|
17666
|
-
}
|
|
17667
|
-
this.setSubtitleText(subtitleText);
|
|
17668
|
-
track.oncuechange = (e) => {
|
|
17669
|
-
try {
|
|
17670
|
-
if (track.activeCues?.length) {
|
|
17671
|
-
const html = track.activeCues[0].getCueAsHTML();
|
|
17672
|
-
this.setSubtitleText(html);
|
|
17673
|
-
}
|
|
17674
|
-
else {
|
|
17675
|
-
this.clearSubtitleText();
|
|
17676
|
-
}
|
|
17677
|
-
}
|
|
17678
|
-
catch (error) {
|
|
17679
|
-
}
|
|
17680
|
-
};
|
|
17681
|
-
continue;
|
|
17656
|
+
const trackId = this.track ? this.track.id : -1;
|
|
17657
|
+
this.core.activePlayback.closedCaptionsTrackId = trackId;
|
|
17658
|
+
}
|
|
17659
|
+
getSubtitleText(track) {
|
|
17660
|
+
const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
|
|
17661
|
+
const cues = track.cues;
|
|
17662
|
+
const lines = [];
|
|
17663
|
+
if (cues && cues.length) {
|
|
17664
|
+
for (const cue of cues) {
|
|
17665
|
+
if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
|
|
17666
|
+
lines.push(cue.getCueAsHTML().textContent);
|
|
17682
17667
|
}
|
|
17683
|
-
this.tracks[i].oncuechange = null;
|
|
17684
|
-
this.tracks[i].mode = 'hidden';
|
|
17685
17668
|
}
|
|
17686
17669
|
}
|
|
17670
|
+
return lines.join('\n');
|
|
17687
17671
|
}
|
|
17688
17672
|
setSubtitleText(text) {
|
|
17689
|
-
this.$
|
|
17673
|
+
this.$line.find('p').html(text);
|
|
17690
17674
|
}
|
|
17691
17675
|
clearSubtitleText() {
|
|
17692
17676
|
this.setSubtitleText('');
|
|
17693
17677
|
}
|
|
17694
|
-
|
|
17695
|
-
this.
|
|
17696
|
-
if (track.language === 'off') {
|
|
17678
|
+
updateSelection() {
|
|
17679
|
+
if (!this.track) {
|
|
17697
17680
|
this.hide();
|
|
17698
17681
|
}
|
|
17699
17682
|
else {
|
|
@@ -17703,21 +17686,22 @@ class Subtitles extends UICorePlugin {
|
|
|
17703
17686
|
this.highlightCurrentSubtitles();
|
|
17704
17687
|
}
|
|
17705
17688
|
highlightCurrentSubtitles() {
|
|
17706
|
-
this.
|
|
17707
|
-
|
|
17708
|
-
|
|
17709
|
-
|
|
17710
|
-
|
|
17711
|
-
|
|
17712
|
-
}
|
|
17689
|
+
this.allItemElements()
|
|
17690
|
+
.removeClass('current')
|
|
17691
|
+
.find('a')
|
|
17692
|
+
.removeClass('gcore-skin-active');
|
|
17693
|
+
trace(`${T$2} highlightCurrentSubtitles`, {
|
|
17694
|
+
track: this.track?.id,
|
|
17695
|
+
});
|
|
17696
|
+
const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
|
|
17697
|
+
currentLevelElement
|
|
17698
|
+
.addClass('current')
|
|
17699
|
+
.find('a')
|
|
17700
|
+
.addClass('gcore-skin-active');
|
|
17713
17701
|
}
|
|
17714
17702
|
renderIcon() {
|
|
17715
17703
|
const icon = this.isShowing ? subtitlesOnIcon : subtitlesOffIcon;
|
|
17716
|
-
this.
|
|
17717
|
-
.getPlugin('media_control')
|
|
17718
|
-
.getElement('subtitlesSelector')
|
|
17719
|
-
?.find('span.subtitle-text')
|
|
17720
|
-
.html(icon);
|
|
17704
|
+
this.$el.find('span.cc-text').html(icon);
|
|
17721
17705
|
}
|
|
17722
17706
|
}
|
|
17723
17707
|
|
|
@@ -18556,4 +18540,4 @@ class VolumeFade extends UICorePlugin {
|
|
|
18556
18540
|
}
|
|
18557
18541
|
}
|
|
18558
18542
|
|
|
18559
|
-
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 };
|
|
18543
|
+
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 };
|