@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/index.js
CHANGED
|
@@ -12936,6 +12936,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12936
12936
|
this.trigger(Events$1.PLAYBACK_DVR, status);
|
|
12937
12937
|
this.trigger(Events$1.PLAYBACK_STATS_ADD, { dvr: status });
|
|
12938
12938
|
}
|
|
12939
|
+
// TODO move to the base class
|
|
12939
12940
|
_updateSettings() {
|
|
12940
12941
|
if (this._playbackType === Playback.VOD) {
|
|
12941
12942
|
// @ts-expect-error
|
|
@@ -43299,7 +43300,7 @@ class Player {
|
|
|
43299
43300
|
}
|
|
43300
43301
|
}
|
|
43301
43302
|
|
|
43302
|
-
var version$1 = "2.21.
|
|
43303
|
+
var version$1 = "2.21.6";
|
|
43303
43304
|
|
|
43304
43305
|
var packages = {
|
|
43305
43306
|
"node_modules/@clappr/core": {
|
|
@@ -43323,7 +43324,7 @@ function version() {
|
|
|
43323
43324
|
};
|
|
43324
43325
|
}
|
|
43325
43326
|
|
|
43326
|
-
const pluginHtml$7 = "<button data-
|
|
43327
|
+
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";
|
|
43327
43328
|
|
|
43328
43329
|
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";
|
|
43329
43330
|
|
|
@@ -43366,8 +43367,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43366
43367
|
*/
|
|
43367
43368
|
get attributes() {
|
|
43368
43369
|
return {
|
|
43369
|
-
class: 'media-control-
|
|
43370
|
-
'data-track-selector': '',
|
|
43370
|
+
class: 'media-control-audiotracks',
|
|
43371
43371
|
};
|
|
43372
43372
|
}
|
|
43373
43373
|
/**
|
|
@@ -43375,8 +43375,8 @@ class AudioSelector extends UICorePlugin {
|
|
|
43375
43375
|
*/
|
|
43376
43376
|
get events() {
|
|
43377
43377
|
return {
|
|
43378
|
-
'click [data-
|
|
43379
|
-
'click [data-
|
|
43378
|
+
'click [data-audiotracks-select]': 'onTrackSelect',
|
|
43379
|
+
'click [data-audiotracks-button]': 'onShowLevelSelectMenu',
|
|
43380
43380
|
};
|
|
43381
43381
|
}
|
|
43382
43382
|
/**
|
|
@@ -43439,7 +43439,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43439
43439
|
const mediaControl = this.core.getPlugin('media_control');
|
|
43440
43440
|
this.$el.html(AudioSelector.template({ tracks: this.tracks, title: this.getTitle() }));
|
|
43441
43441
|
this.$('.audio-arrow').append(audioArrow);
|
|
43442
|
-
mediaControl.putElement('
|
|
43442
|
+
mediaControl.putElement('audiotracks', this.el);
|
|
43443
43443
|
this.updateText();
|
|
43444
43444
|
this.highlightCurrentTrack();
|
|
43445
43445
|
return this;
|
|
@@ -43452,7 +43452,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43452
43452
|
return this.tracks.find((track) => track.id === id);
|
|
43453
43453
|
}
|
|
43454
43454
|
onTrackSelect(event) {
|
|
43455
|
-
const id = event.target?.dataset?.
|
|
43455
|
+
const id = event.target?.dataset?.audiotracksSelect;
|
|
43456
43456
|
if (id) {
|
|
43457
43457
|
this.selectAudioTrack(id);
|
|
43458
43458
|
}
|
|
@@ -43482,7 +43482,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43482
43482
|
}
|
|
43483
43483
|
trackElement(id) {
|
|
43484
43484
|
return this.$('ul a' +
|
|
43485
|
-
(id !== undefined ? '[data-
|
|
43485
|
+
(id !== undefined ? '[data-audiotracks-select="' + id + '"]' : '')).parent();
|
|
43486
43486
|
}
|
|
43487
43487
|
getTitle() {
|
|
43488
43488
|
return this.currentTrack?.label || '';
|
|
@@ -43658,7 +43658,7 @@ class BigMuteButton extends UICorePlugin {
|
|
|
43658
43658
|
}
|
|
43659
43659
|
}
|
|
43660
43660
|
|
|
43661
|
-
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>";
|
|
43661
|
+
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>";
|
|
43662
43662
|
|
|
43663
43663
|
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";
|
|
43664
43664
|
|
|
@@ -43921,7 +43921,7 @@ function getPageX(event) {
|
|
|
43921
43921
|
return 0;
|
|
43922
43922
|
}
|
|
43923
43923
|
|
|
43924
|
-
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
|
|
43924
|
+
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";
|
|
43925
43925
|
|
|
43926
43926
|
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";
|
|
43927
43927
|
|
|
@@ -43940,6 +43940,12 @@ const fullscreenOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
|
|
|
43940
43940
|
// Copyright 2014 Globo.com Player authors. All rights reserved.
|
|
43941
43941
|
// Use of this source code is governed by a BSD-style
|
|
43942
43942
|
// license that can be found in the {@link https://github.com/clappr/clappr-plugins/blob/master/LICENSE | LICENSE}.
|
|
43943
|
+
const DEFAULT_SETTINGS = {
|
|
43944
|
+
left: [],
|
|
43945
|
+
right: [],
|
|
43946
|
+
default: [],
|
|
43947
|
+
seekEnabled: true,
|
|
43948
|
+
};
|
|
43943
43949
|
/**
|
|
43944
43950
|
* Custom events emitted by the plugins to communicate with one another
|
|
43945
43951
|
* @beta
|
|
@@ -43955,7 +43961,8 @@ const T$e = 'plugins.media_control';
|
|
|
43955
43961
|
const LEFT_ORDER = [
|
|
43956
43962
|
'playpause',
|
|
43957
43963
|
'playstop',
|
|
43958
|
-
'live',
|
|
43964
|
+
// 'live',
|
|
43965
|
+
'dvr',
|
|
43959
43966
|
'volume',
|
|
43960
43967
|
'position',
|
|
43961
43968
|
'duration',
|
|
@@ -43974,7 +43981,7 @@ function orderByOrderPattern(arr, order) {
|
|
|
43974
43981
|
* The methods exposed are to be used by the other plugins that extend the media control UI.
|
|
43975
43982
|
*/
|
|
43976
43983
|
class MediaControl extends UICorePlugin {
|
|
43977
|
-
advertisementPlaying = false
|
|
43984
|
+
// private advertisementPlaying = false
|
|
43978
43985
|
buttonsColor = null;
|
|
43979
43986
|
currentDurationValue = 0;
|
|
43980
43987
|
currentPositionValue = 0;
|
|
@@ -43989,14 +43996,13 @@ class MediaControl extends UICorePlugin {
|
|
|
43989
43996
|
hideId = null;
|
|
43990
43997
|
hideVolumeId = null;
|
|
43991
43998
|
intendedVolume = 100;
|
|
43992
|
-
isHD = false;
|
|
43993
43999
|
keepVisible = false;
|
|
43994
44000
|
kibo;
|
|
43995
44001
|
lastMouseX = 0;
|
|
43996
44002
|
lastMouseY = 0;
|
|
43997
44003
|
persistConfig;
|
|
43998
44004
|
rendered = false;
|
|
43999
|
-
settings =
|
|
44005
|
+
settings = DEFAULT_SETTINGS;
|
|
44000
44006
|
userDisabled = false;
|
|
44001
44007
|
userKeepVisible = false;
|
|
44002
44008
|
verticalVolume = false;
|
|
@@ -44140,8 +44146,6 @@ class MediaControl extends UICorePlugin {
|
|
|
44140
44146
|
* @internal
|
|
44141
44147
|
*/
|
|
44142
44148
|
bindEvents() {
|
|
44143
|
-
// @ts-ignore
|
|
44144
|
-
this.stopListening();
|
|
44145
44149
|
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChanged);
|
|
44146
44150
|
this.listenTo(this.core, Events$1.CORE_MOUSE_MOVE, this.show);
|
|
44147
44151
|
this.listenTo(this.core, Events$1.CORE_MOUSE_LEAVE, () => this.hide(this.options.hideMediaControlDelay));
|
|
@@ -44177,18 +44181,16 @@ class MediaControl extends UICorePlugin {
|
|
|
44177
44181
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_DBLCLICK, this.toggleFullscreen);
|
|
44178
44182
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
|
|
44179
44183
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PROGRESS, this.updateProgressBar);
|
|
44180
|
-
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_SETTINGSUPDATE, this.
|
|
44181
|
-
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.
|
|
44182
|
-
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_HIGHDEFINITIONUPDATE, this.
|
|
44184
|
+
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_SETTINGSUPDATE, this.updateSettings);
|
|
44185
|
+
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrStateChanged);
|
|
44186
|
+
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_HIGHDEFINITIONUPDATE, this.onHdUpdate);
|
|
44183
44187
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_MEDIACONTROL_DISABLE, this.disable);
|
|
44184
44188
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_MEDIACONTROL_ENABLE, this.enable);
|
|
44185
44189
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_ENDED, this.ended);
|
|
44186
44190
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_VOLUME, this.onVolumeChanged);
|
|
44187
44191
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
|
|
44188
|
-
if
|
|
44189
|
-
|
|
44190
|
-
this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_LOADEDMETADATA, this.onLoadedMetadataOnVideoTag);
|
|
44191
|
-
}
|
|
44192
|
+
// wait until the metadata has loaded and then check if fullscreen on video tag is supported
|
|
44193
|
+
this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
|
|
44192
44194
|
}
|
|
44193
44195
|
/**
|
|
44194
44196
|
* Hides the media control UI
|
|
@@ -44223,13 +44225,19 @@ class MediaControl extends UICorePlugin {
|
|
|
44223
44225
|
onVolumeChanged() {
|
|
44224
44226
|
this.updateVolumeUI();
|
|
44225
44227
|
}
|
|
44226
|
-
|
|
44228
|
+
onLoadedMetadata() {
|
|
44227
44229
|
const video = this.core.activePlayback?.el;
|
|
44228
44230
|
// video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
|
|
44229
44231
|
// see https://github.com/clappr/clappr/issues/1127
|
|
44230
44232
|
if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
|
|
44231
44233
|
this.fullScreenOnVideoTagSupported = true;
|
|
44232
|
-
|
|
44234
|
+
}
|
|
44235
|
+
this.updateSettings();
|
|
44236
|
+
if (this.core.activeContainer.getPlaybackType() === Playback.LIVE) {
|
|
44237
|
+
this.$el.addClass('live');
|
|
44238
|
+
}
|
|
44239
|
+
else {
|
|
44240
|
+
this.$el.removeClass('live');
|
|
44233
44241
|
}
|
|
44234
44242
|
}
|
|
44235
44243
|
updateVolumeUI() {
|
|
@@ -44238,8 +44246,6 @@ class MediaControl extends UICorePlugin {
|
|
|
44238
44246
|
return;
|
|
44239
44247
|
}
|
|
44240
44248
|
assert.ok(this.$volumeBarContainer, 'volume bar container must be present');
|
|
44241
|
-
// update volume bar scrubber/fill on bar mode
|
|
44242
|
-
// this.$volumeBarContainer.find('.bar-fill-2').css({});
|
|
44243
44249
|
const containerWidth = this.$volumeBarContainer.width();
|
|
44244
44250
|
assert.ok(this.$volumeBarBackground, 'volume bar background must be present');
|
|
44245
44251
|
const barWidth = this.$volumeBarBackground.width();
|
|
@@ -44428,17 +44434,18 @@ class MediaControl extends UICorePlugin {
|
|
|
44428
44434
|
// if the container is not ready etc
|
|
44429
44435
|
this.intendedVolume = value;
|
|
44430
44436
|
this.persistConfig && !isInitialVolume && Config.persist('volume', value);
|
|
44437
|
+
// TODO
|
|
44431
44438
|
const setWhenContainerReady = () => {
|
|
44432
|
-
if (this.
|
|
44433
|
-
this.
|
|
44439
|
+
if (this.core.activeContainer && this.core.activeContainer.isReady) {
|
|
44440
|
+
this.core.activeContainer.setVolume(value);
|
|
44434
44441
|
}
|
|
44435
44442
|
else {
|
|
44436
|
-
this.listenToOnce(this.
|
|
44437
|
-
this.
|
|
44443
|
+
this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_READY, () => {
|
|
44444
|
+
this.core.activeContainer.setVolume(value);
|
|
44438
44445
|
});
|
|
44439
44446
|
}
|
|
44440
44447
|
};
|
|
44441
|
-
if (!this.
|
|
44448
|
+
if (!this.core.activeContainer) {
|
|
44442
44449
|
this.listenToOnce(this, Events$1.MEDIACONTROL_CONTAINERCHANGED, () => setWhenContainerReady());
|
|
44443
44450
|
}
|
|
44444
44451
|
else {
|
|
@@ -44448,7 +44455,7 @@ class MediaControl extends UICorePlugin {
|
|
|
44448
44455
|
toggleFullscreen() {
|
|
44449
44456
|
if (!Browser.isMobile) {
|
|
44450
44457
|
this.trigger(Events$1.MEDIACONTROL_FULLSCREEN, this.name);
|
|
44451
|
-
this.
|
|
44458
|
+
this.core.activeContainer.fullscreen();
|
|
44452
44459
|
this.core.toggleFullscreen();
|
|
44453
44460
|
this.resetUserKeepVisible();
|
|
44454
44461
|
}
|
|
@@ -44459,7 +44466,8 @@ class MediaControl extends UICorePlugin {
|
|
|
44459
44466
|
this.setInitialVolume();
|
|
44460
44467
|
this.changeTogglePlay();
|
|
44461
44468
|
this.bindContainerEvents();
|
|
44462
|
-
this.
|
|
44469
|
+
this.updateSettings();
|
|
44470
|
+
// TODO remove
|
|
44463
44471
|
this.core.activeContainer.trigger(Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
|
|
44464
44472
|
// TODO test
|
|
44465
44473
|
if (this.core.activeContainer.mediaControlDisabled) {
|
|
@@ -44530,9 +44538,9 @@ class MediaControl extends UICorePlugin {
|
|
|
44530
44538
|
}
|
|
44531
44539
|
// default to 100%
|
|
44532
44540
|
this.currentSeekBarPercentage = 100;
|
|
44533
|
-
if (this.
|
|
44534
|
-
(this.
|
|
44535
|
-
this.
|
|
44541
|
+
if (this.core.activeContainer &&
|
|
44542
|
+
(this.core.activeContainer.getPlaybackType() !== Playback.LIVE ||
|
|
44543
|
+
this.core.activeContainer.isDvrInUse())) {
|
|
44536
44544
|
this.currentSeekBarPercentage =
|
|
44537
44545
|
(this.currentPositionValue / this.currentDurationValue) * 100;
|
|
44538
44546
|
}
|
|
@@ -44559,16 +44567,10 @@ class MediaControl extends UICorePlugin {
|
|
|
44559
44567
|
const offsetX = MediaControl.getPageX(event) - this.$seekBarContainer.offset().left;
|
|
44560
44568
|
let pos = (offsetX / this.$seekBarContainer.width()) * 100;
|
|
44561
44569
|
pos = Math.min(100, Math.max(pos, 0));
|
|
44562
|
-
this.
|
|
44570
|
+
this.core.activeContainer && this.core.activeContainer.seekPercentage(pos);
|
|
44563
44571
|
this.setSeekPercentage(pos);
|
|
44564
44572
|
return false;
|
|
44565
44573
|
}
|
|
44566
|
-
setKeepVisible() {
|
|
44567
|
-
this.keepVisible = true;
|
|
44568
|
-
}
|
|
44569
|
-
resetKeepVisible() {
|
|
44570
|
-
this.keepVisible = false;
|
|
44571
|
-
}
|
|
44572
44574
|
setUserKeepVisible() {
|
|
44573
44575
|
this.userKeepVisible = true;
|
|
44574
44576
|
}
|
|
@@ -44640,18 +44642,24 @@ class MediaControl extends UICorePlugin {
|
|
|
44640
44642
|
this.core.$el.addClass('nocursor');
|
|
44641
44643
|
}
|
|
44642
44644
|
}
|
|
44643
|
-
|
|
44645
|
+
updateSettings() {
|
|
44644
44646
|
const newSettings = $.extend(true, {
|
|
44645
44647
|
left: [],
|
|
44646
44648
|
default: [],
|
|
44647
44649
|
right: [],
|
|
44648
|
-
}, this.core.activeContainer
|
|
44650
|
+
}, this.core.activeContainer.settings);
|
|
44651
|
+
// TODO make order controlled via CSS
|
|
44649
44652
|
newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
|
|
44653
|
+
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
44654
|
+
this.core.activePlayback.dvrEnabled) {
|
|
44655
|
+
newSettings.left.push('dvr');
|
|
44656
|
+
}
|
|
44657
|
+
// actual order of the items appear rendered is controlled by CSS
|
|
44650
44658
|
newSettings.right = [
|
|
44651
44659
|
'fullscreen',
|
|
44652
44660
|
'pip',
|
|
44653
|
-
'
|
|
44654
|
-
'
|
|
44661
|
+
'gear',
|
|
44662
|
+
'cc',
|
|
44655
44663
|
'multicamera',
|
|
44656
44664
|
'playbackrate',
|
|
44657
44665
|
'vr',
|
|
@@ -44660,24 +44668,25 @@ class MediaControl extends UICorePlugin {
|
|
|
44660
44668
|
if ((!this.fullScreenOnVideoTagSupported &&
|
|
44661
44669
|
!Fullscreen.fullscreenEnabled()) ||
|
|
44662
44670
|
this.options.fullscreenDisable) {
|
|
44663
|
-
// remove fullscreen from settings if it is
|
|
44671
|
+
// remove fullscreen from settings if it is not available
|
|
44664
44672
|
removeArrayItem(newSettings.default, 'fullscreen');
|
|
44665
44673
|
removeArrayItem(newSettings.left, 'fullscreen');
|
|
44666
44674
|
removeArrayItem(newSettings.right, 'fullscreen');
|
|
44667
44675
|
}
|
|
44668
44676
|
removeArrayItem(newSettings.default, 'hd-indicator');
|
|
44669
44677
|
removeArrayItem(newSettings.left, 'hd-indicator');
|
|
44678
|
+
// TODO get from container's settings
|
|
44670
44679
|
if (this.core.activePlayback.name === 'html5_video') {
|
|
44671
44680
|
newSettings.seekEnabled = this.isSeekEnabledForHtml5Playback();
|
|
44672
44681
|
}
|
|
44673
|
-
const settingsChanged =
|
|
44682
|
+
const settingsChanged = serializeSettings(this.settings) !== serializeSettings(newSettings);
|
|
44674
44683
|
if (settingsChanged) {
|
|
44675
44684
|
this.settings = newSettings;
|
|
44676
44685
|
this.render();
|
|
44677
44686
|
}
|
|
44678
44687
|
}
|
|
44679
|
-
|
|
44680
|
-
|
|
44688
|
+
onHdUpdate(isHD) {
|
|
44689
|
+
// TODO render?
|
|
44681
44690
|
}
|
|
44682
44691
|
createCachedElements() {
|
|
44683
44692
|
const $layer = this.$el.find('.media-control-layer');
|
|
@@ -44699,7 +44708,7 @@ class MediaControl extends UICorePlugin {
|
|
|
44699
44708
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
44700
44709
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
44701
44710
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
44702
|
-
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
|
|
44711
|
+
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
|
|
44703
44712
|
this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
|
|
44704
44713
|
this.resetIndicators();
|
|
44705
44714
|
this.initializeIcons();
|
|
@@ -44725,49 +44734,45 @@ class MediaControl extends UICorePlugin {
|
|
|
44725
44734
|
*/
|
|
44726
44735
|
getElement(name) {
|
|
44727
44736
|
switch (name) {
|
|
44728
|
-
case '
|
|
44737
|
+
case 'audiotracks':
|
|
44729
44738
|
return null;
|
|
44730
44739
|
case 'clipText':
|
|
44731
44740
|
return this.$clipText;
|
|
44732
|
-
case 'gear':
|
|
44733
|
-
return null;
|
|
44734
|
-
case 'pip':
|
|
44735
|
-
return null;
|
|
44736
44741
|
case 'playbackRate':
|
|
44737
44742
|
return this.$playbackRate;
|
|
44738
44743
|
case 'seekBarContainer':
|
|
44739
44744
|
return this.$seekBarContainer;
|
|
44740
|
-
case 'subtitlesSelector':
|
|
44741
|
-
return null;
|
|
44742
44745
|
}
|
|
44743
44746
|
}
|
|
44744
44747
|
putElement(name, element) {
|
|
44745
|
-
|
|
44746
|
-
|
|
44747
|
-
|
|
44748
|
-
|
|
44749
|
-
|
|
44750
|
-
|
|
44751
|
-
|
|
44752
|
-
|
|
44753
|
-
|
|
44754
|
-
|
|
44755
|
-
|
|
44756
|
-
|
|
44757
|
-
|
|
44748
|
+
const panel = this.getElementLocation(name);
|
|
44749
|
+
trace(`${T$e} putElement`, { name, panel: !!panel });
|
|
44750
|
+
if (panel) {
|
|
44751
|
+
const current = panel.find(`[data-${name}]`);
|
|
44752
|
+
element.setAttribute(`data-${name}`, '');
|
|
44753
|
+
// TODO test
|
|
44754
|
+
if (current.length) {
|
|
44755
|
+
if (current[0] === element) {
|
|
44756
|
+
return;
|
|
44757
|
+
}
|
|
44758
|
+
current.replaceWith(element);
|
|
44759
|
+
}
|
|
44760
|
+
else {
|
|
44761
|
+
panel.append(element);
|
|
44762
|
+
}
|
|
44758
44763
|
}
|
|
44759
44764
|
}
|
|
44760
44765
|
/**
|
|
44761
|
-
*
|
|
44762
|
-
* @
|
|
44766
|
+
* Toggle the visibility of a media control element
|
|
44767
|
+
* @param name - The name of the media control element
|
|
44768
|
+
* @param show - Whether to show or hide the element
|
|
44763
44769
|
*/
|
|
44770
|
+
toggleElement(name, show) {
|
|
44771
|
+
this.$el.find(`[data-${name}]`).toggle(show);
|
|
44772
|
+
}
|
|
44764
44773
|
getRightPanel() {
|
|
44765
44774
|
return this.$el.find('.media-control-right-panel');
|
|
44766
44775
|
}
|
|
44767
|
-
/**
|
|
44768
|
-
* Get the left panel area to append custom elements to
|
|
44769
|
-
* @returns ZeptoSelector of the left panel element
|
|
44770
|
-
*/
|
|
44771
44776
|
getLeftPanel() {
|
|
44772
44777
|
return this.$el.find('.media-control-left-panel');
|
|
44773
44778
|
}
|
|
@@ -44966,7 +44971,6 @@ class MediaControl extends UICorePlugin {
|
|
|
44966
44971
|
this.hideVolumeBar(0);
|
|
44967
44972
|
}, 0);
|
|
44968
44973
|
this.parseColors();
|
|
44969
|
-
this.highDefinitionUpdate(this.isHD);
|
|
44970
44974
|
this.core.$el.append(this.el);
|
|
44971
44975
|
this.rendered = true;
|
|
44972
44976
|
this.updateVolumeUI();
|
|
@@ -44992,12 +44996,12 @@ class MediaControl extends UICorePlugin {
|
|
|
44992
44996
|
}
|
|
44993
44997
|
// TODO manage by the ads plugin
|
|
44994
44998
|
onStartAd() {
|
|
44995
|
-
this.advertisementPlaying = true
|
|
44999
|
+
// this.advertisementPlaying = true
|
|
44996
45000
|
this.disable();
|
|
44997
45001
|
}
|
|
44998
45002
|
// TODO manage by the ads plugin
|
|
44999
45003
|
onFinishAd() {
|
|
45000
|
-
this.advertisementPlaying = false
|
|
45004
|
+
// this.advertisementPlaying = false
|
|
45001
45005
|
this.enable();
|
|
45002
45006
|
}
|
|
45003
45007
|
// TODO remove
|
|
@@ -45041,10 +45045,39 @@ class MediaControl extends UICorePlugin {
|
|
|
45041
45045
|
}
|
|
45042
45046
|
return isFinite(this.core.activePlayback.getDuration());
|
|
45043
45047
|
}
|
|
45048
|
+
getElementLocation(name) {
|
|
45049
|
+
if (this.settings.right?.includes(name)) {
|
|
45050
|
+
return this.getRightPanel();
|
|
45051
|
+
}
|
|
45052
|
+
if (this.settings.left?.includes(name)) {
|
|
45053
|
+
return this.getLeftPanel();
|
|
45054
|
+
}
|
|
45055
|
+
if (this.settings.default?.includes(name)) {
|
|
45056
|
+
return this.getCenterPanel();
|
|
45057
|
+
}
|
|
45058
|
+
return null;
|
|
45059
|
+
}
|
|
45060
|
+
onDvrStateChanged(dvrInUse) {
|
|
45061
|
+
if (dvrInUse) {
|
|
45062
|
+
this.$el.addClass('dvr');
|
|
45063
|
+
}
|
|
45064
|
+
else {
|
|
45065
|
+
this.$el.removeClass('dvr');
|
|
45066
|
+
}
|
|
45067
|
+
}
|
|
45044
45068
|
}
|
|
45045
45069
|
MediaControl.extend = function (properties) {
|
|
45046
45070
|
return extend(MediaControl, properties);
|
|
45047
45071
|
};
|
|
45072
|
+
function serializeSettings(s) {
|
|
45073
|
+
return s.left
|
|
45074
|
+
.slice()
|
|
45075
|
+
.sort()
|
|
45076
|
+
.concat(s.right.slice().sort())
|
|
45077
|
+
.concat(s.default.slice().sort())
|
|
45078
|
+
.concat([s.seekEnabled])
|
|
45079
|
+
.join(',');
|
|
45080
|
+
}
|
|
45048
45081
|
|
|
45049
45082
|
const VERSION$5 = '2.19.12';
|
|
45050
45083
|
const T$d = 'plugins.bottom_gear';
|
|
@@ -45110,6 +45143,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45110
45143
|
getElement(name) {
|
|
45111
45144
|
return this.$el.find(`.gear-options-list [data-${name}]`);
|
|
45112
45145
|
}
|
|
45146
|
+
// TODO implement putElement/addElement method
|
|
45113
45147
|
/**
|
|
45114
45148
|
* Replaces the content of the gear menu
|
|
45115
45149
|
* @param content - Zepto result of the element
|
|
@@ -45143,7 +45177,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45143
45177
|
];
|
|
45144
45178
|
const icon = this.isHd ? gearHdIcon : gearIcon;
|
|
45145
45179
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
45146
|
-
mediaControl.putElement('gear', this
|
|
45180
|
+
mediaControl.putElement('gear', this.el);
|
|
45147
45181
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
45148
45182
|
return this;
|
|
45149
45183
|
}
|
|
@@ -48267,7 +48301,7 @@ class ContextMenu extends UIContainerPlugin {
|
|
|
48267
48301
|
};
|
|
48268
48302
|
}
|
|
48269
48303
|
|
|
48270
|
-
const dvrHTML = "<div class=\"live-info\"><%= live %></div>\n<button type=\"button\" class=\"live-button\" aria-label=\"<%=
|
|
48304
|
+
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";
|
|
48271
48305
|
|
|
48272
48306
|
const T$b = 'plugins.dvr_controls';
|
|
48273
48307
|
/**
|
|
@@ -48312,7 +48346,6 @@ class DvrControls extends UICorePlugin {
|
|
|
48312
48346
|
get attributes() {
|
|
48313
48347
|
return {
|
|
48314
48348
|
class: 'dvr-controls',
|
|
48315
|
-
'data-dvr-controls': '',
|
|
48316
48349
|
};
|
|
48317
48350
|
}
|
|
48318
48351
|
/**
|
|
@@ -48320,40 +48353,18 @@ class DvrControls extends UICorePlugin {
|
|
|
48320
48353
|
*/
|
|
48321
48354
|
bindEvents() {
|
|
48322
48355
|
this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
|
|
48323
|
-
this.listenTo(this.core, Events$1.CORE_OPTIONS_CHANGE, this.render);
|
|
48324
48356
|
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.bindContainerEvents);
|
|
48325
48357
|
}
|
|
48326
48358
|
onCoreReady() {
|
|
48327
48359
|
const mediaControl = this.core.getPlugin('media_control');
|
|
48328
48360
|
assert(mediaControl, 'media_control plugin is required');
|
|
48329
|
-
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.
|
|
48330
|
-
|
|
48361
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
48362
|
+
// MediaControl has been rendered
|
|
48363
|
+
this.render();
|
|
48331
48364
|
}
|
|
48332
48365
|
bindContainerEvents() {
|
|
48366
|
+
trace(`${T$b} bindContainerEvents`);
|
|
48333
48367
|
this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.render);
|
|
48334
|
-
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.onDvrChanged);
|
|
48335
|
-
}
|
|
48336
|
-
onDvrChanged(dvrInUse) {
|
|
48337
|
-
trace(`${T$b} onDvrChanged`, {
|
|
48338
|
-
dvrInUse,
|
|
48339
|
-
});
|
|
48340
|
-
if (this.core.getPlaybackType() !== Playback.LIVE) {
|
|
48341
|
-
return;
|
|
48342
|
-
}
|
|
48343
|
-
this.render();
|
|
48344
|
-
const mediaControl = this.core.getPlugin('media_control');
|
|
48345
|
-
mediaControl.$el.addClass('live');
|
|
48346
|
-
if (dvrInUse) {
|
|
48347
|
-
mediaControl.$el
|
|
48348
|
-
.addClass('dvr')
|
|
48349
|
-
.find(
|
|
48350
|
-
// TODO add API, test
|
|
48351
|
-
'.media-control-indicator[data-position], .media-control-indicator[data-duration]')
|
|
48352
|
-
.hide();
|
|
48353
|
-
}
|
|
48354
|
-
else {
|
|
48355
|
-
mediaControl.$el.removeClass('dvr');
|
|
48356
|
-
}
|
|
48357
48368
|
}
|
|
48358
48369
|
click() {
|
|
48359
48370
|
const container = this.core.activeContainer;
|
|
@@ -48362,13 +48373,8 @@ class DvrControls extends UICorePlugin {
|
|
|
48362
48373
|
}
|
|
48363
48374
|
container.seek(container.getDuration());
|
|
48364
48375
|
}
|
|
48365
|
-
settingsUpdate() {
|
|
48366
|
-
this.core.getPlugin('media_control').$el.removeClass('live');
|
|
48367
|
-
this.render();
|
|
48368
|
-
}
|
|
48369
48376
|
shouldRender() {
|
|
48370
|
-
|
|
48371
|
-
return useDvrControls && this.core.getPlaybackType() === Playback.LIVE;
|
|
48377
|
+
return this.core.getPlaybackType() === Playback.LIVE;
|
|
48372
48378
|
}
|
|
48373
48379
|
/**
|
|
48374
48380
|
* @internal
|
|
@@ -48378,16 +48384,19 @@ class DvrControls extends UICorePlugin {
|
|
|
48378
48384
|
dvrEnabled: this.core.activePlayback?.dvrEnabled,
|
|
48379
48385
|
playbackType: this.core.getPlaybackType(),
|
|
48380
48386
|
});
|
|
48387
|
+
const mediaControl = this.core.getPlugin('media_control');
|
|
48388
|
+
if (!mediaControl) {
|
|
48389
|
+
return this;
|
|
48390
|
+
}
|
|
48381
48391
|
if (!this.shouldRender()) {
|
|
48382
48392
|
return this;
|
|
48383
48393
|
}
|
|
48394
|
+
mediaControl.toggleElement('duration', false);
|
|
48395
|
+
mediaControl.toggleElement('position', false);
|
|
48384
48396
|
this.$el.html(DvrControls.template({
|
|
48385
|
-
|
|
48386
|
-
backToLive: this.core.i18n.t('back_to_live'),
|
|
48397
|
+
i18n: this.core.i18n,
|
|
48387
48398
|
}));
|
|
48388
|
-
|
|
48389
|
-
mediaControl.$el.addClass('live');
|
|
48390
|
-
mediaControl.getLeftPanel().append(this.$el);
|
|
48399
|
+
mediaControl.putElement('dvr', this.el);
|
|
48391
48400
|
return this;
|
|
48392
48401
|
}
|
|
48393
48402
|
}
|
|
@@ -49643,6 +49652,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49643
49652
|
static get version() {
|
|
49644
49653
|
return VERSION$2;
|
|
49645
49654
|
}
|
|
49655
|
+
static buttonTemplate = tmpl(buttonHtml$1);
|
|
49646
49656
|
/**
|
|
49647
49657
|
* @internal
|
|
49648
49658
|
*/
|
|
@@ -49667,8 +49677,8 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49667
49677
|
}
|
|
49668
49678
|
isPiPSupported() {
|
|
49669
49679
|
trace(`${T$7} isPiPSupported`, {
|
|
49670
|
-
pictureInPictureEnabled: document.pictureInPictureEnabled,
|
|
49671
|
-
requestPictureInPicture: HTMLVideoElement.prototype.requestPictureInPicture,
|
|
49680
|
+
pictureInPictureEnabled: !!document.pictureInPictureEnabled,
|
|
49681
|
+
requestPictureInPicture: !!HTMLVideoElement.prototype.requestPictureInPicture,
|
|
49672
49682
|
});
|
|
49673
49683
|
return document.pictureInPictureEnabled && !!HTMLVideoElement.prototype.requestPictureInPicture;
|
|
49674
49684
|
}
|
|
@@ -49679,8 +49689,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49679
49689
|
if (!this.isPiPSupported()) {
|
|
49680
49690
|
return this;
|
|
49681
49691
|
}
|
|
49682
|
-
|
|
49683
|
-
this.$el.html(t({ pipIcon }));
|
|
49692
|
+
this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
|
|
49684
49693
|
const mediaControl = this.core.getPlugin('media_control');
|
|
49685
49694
|
if (mediaControl) {
|
|
49686
49695
|
mediaControl.putElement('pip', this.el);
|
|
@@ -49708,9 +49717,9 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49708
49717
|
}
|
|
49709
49718
|
}
|
|
49710
49719
|
|
|
49711
|
-
const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option'>\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span
|
|
49720
|
+
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";
|
|
49712
49721
|
|
|
49713
|
-
const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n
|
|
49722
|
+
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";
|
|
49714
49723
|
|
|
49715
49724
|
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";
|
|
49716
49725
|
|
|
@@ -49721,7 +49730,7 @@ const DEFAULT_PLAYBACK_RATES = [
|
|
|
49721
49730
|
{ value: '1.25', label: '1.25x' },
|
|
49722
49731
|
{ value: '1.5', label: '1.5x' },
|
|
49723
49732
|
{ value: '1.75', label: '1.75x' },
|
|
49724
|
-
{ value: '2.0', label: '2x' }
|
|
49733
|
+
{ value: '2.0', label: '2x' },
|
|
49725
49734
|
];
|
|
49726
49735
|
const DEFAULT_PLAYBACK_RATE = '1.0';
|
|
49727
49736
|
const T$6 = 'plugins.playback_rate';
|
|
@@ -49761,16 +49770,17 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49761
49770
|
static listTemplate = tmpl(listHtml);
|
|
49762
49771
|
constructor(core) {
|
|
49763
49772
|
super(core);
|
|
49764
|
-
this.playbackRates =
|
|
49765
|
-
|
|
49773
|
+
this.playbackRates =
|
|
49774
|
+
core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
|
|
49775
|
+
this.selectedRate =
|
|
49776
|
+
core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
|
|
49766
49777
|
}
|
|
49767
49778
|
/**
|
|
49768
49779
|
* @internal
|
|
49769
49780
|
*/
|
|
49770
49781
|
get attributes() {
|
|
49771
49782
|
return {
|
|
49772
|
-
|
|
49773
|
-
'data-playback-rate-select': ''
|
|
49783
|
+
class: 'media-control-playbackrate',
|
|
49774
49784
|
};
|
|
49775
49785
|
}
|
|
49776
49786
|
/**
|
|
@@ -49791,6 +49801,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49791
49801
|
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
|
|
49792
49802
|
}
|
|
49793
49803
|
onCoreReady() {
|
|
49804
|
+
trace(`${T$6} onCoreReady`);
|
|
49794
49805
|
const mediaControl = this.core.getPlugin('media_control');
|
|
49795
49806
|
assert(mediaControl, 'media_control plugin is required');
|
|
49796
49807
|
const gear = this.core.getPlugin('bottom_gear');
|
|
@@ -49798,6 +49809,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49798
49809
|
this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
|
|
49799
49810
|
}
|
|
49800
49811
|
onActiveContainerChange() {
|
|
49812
|
+
trace(`${T$6} onActiveContainerChange`);
|
|
49801
49813
|
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_STOP, this.onStop);
|
|
49802
49814
|
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_PLAY, this.onPlay);
|
|
49803
49815
|
this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
|
|
@@ -49821,7 +49833,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49821
49833
|
allRateElements() {
|
|
49822
49834
|
return this.$('ul.gear-sub-menu li');
|
|
49823
49835
|
}
|
|
49824
|
-
rateElement(rate =
|
|
49836
|
+
rateElement(rate = '1') {
|
|
49825
49837
|
return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
|
|
49826
49838
|
}
|
|
49827
49839
|
onPlaybackRateChange(playbackRate) {
|
|
@@ -49836,10 +49848,11 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49836
49848
|
}
|
|
49837
49849
|
}
|
|
49838
49850
|
shouldRender() {
|
|
49839
|
-
if (!this.core.
|
|
49851
|
+
if (!this.core.activePlayback) {
|
|
49840
49852
|
return false;
|
|
49841
49853
|
}
|
|
49842
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
49854
|
+
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
49855
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
49843
49856
|
return false;
|
|
49844
49857
|
}
|
|
49845
49858
|
return 'setPlaybackRate' in this.core.activePlayback;
|
|
@@ -49862,9 +49875,12 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49862
49875
|
title: this.getTitle(),
|
|
49863
49876
|
speedIcon,
|
|
49864
49877
|
arrowRightIcon,
|
|
49878
|
+
i18n: this.core.i18n,
|
|
49865
49879
|
});
|
|
49866
49880
|
this.$el.html(button);
|
|
49867
|
-
this.core.getPlugin('bottom_gear')
|
|
49881
|
+
this.core.getPlugin('bottom_gear')
|
|
49882
|
+
?.getElement('rate')
|
|
49883
|
+
?.html(this.el);
|
|
49868
49884
|
this.rendered = true;
|
|
49869
49885
|
return this;
|
|
49870
49886
|
}
|
|
@@ -49879,7 +49895,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49879
49895
|
}
|
|
49880
49896
|
}
|
|
49881
49897
|
onPlay() {
|
|
49882
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
49898
|
+
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
49899
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
49883
49900
|
this.resetPlaybackRate();
|
|
49884
49901
|
}
|
|
49885
49902
|
else {
|
|
@@ -49889,8 +49906,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49889
49906
|
resetPlaybackRate() {
|
|
49890
49907
|
this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
|
|
49891
49908
|
}
|
|
49892
|
-
onStop() {
|
|
49893
|
-
}
|
|
49909
|
+
onStop() { }
|
|
49894
49910
|
onRateSelect(event) {
|
|
49895
49911
|
event.stopPropagation();
|
|
49896
49912
|
const rate = event.currentTarget.dataset.rate;
|
|
@@ -49905,6 +49921,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49905
49921
|
playbackRates: this.playbackRates,
|
|
49906
49922
|
arrowLeftIcon,
|
|
49907
49923
|
checkIcon,
|
|
49924
|
+
i18n: this.core.i18n,
|
|
49908
49925
|
}));
|
|
49909
49926
|
this.core.getPlugin('bottom_gear')?.setContent(this.el);
|
|
49910
49927
|
this.highlightCurrentRate();
|
|
@@ -49920,7 +49937,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49920
49937
|
this.selectedRate = rate;
|
|
49921
49938
|
}
|
|
49922
49939
|
getTitle() {
|
|
49923
|
-
return this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
49940
|
+
return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
49941
|
+
this.selectedRate);
|
|
49924
49942
|
}
|
|
49925
49943
|
highlightCurrentRate() {
|
|
49926
49944
|
this.allRateElements().removeClass('current');
|
|
@@ -50950,48 +50968,51 @@ const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
|
|
|
50950
50968
|
|
|
50951
50969
|
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";
|
|
50952
50970
|
|
|
50953
|
-
const comboboxHTML = "<button data-
|
|
50971
|
+
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";
|
|
50954
50972
|
|
|
50955
|
-
const stringHTML = "<div class=\"
|
|
50973
|
+
const stringHTML = "<div class=\"cc-line\" id=\"cc-line\">\n <p></p>\n</div>\n";
|
|
50956
50974
|
|
|
50957
50975
|
const VERSION = '2.19.14';
|
|
50958
|
-
const
|
|
50959
|
-
const T$2 = 'plugins.
|
|
50976
|
+
const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
|
|
50977
|
+
const T$2 = 'plugins.cc';
|
|
50960
50978
|
/**
|
|
50961
50979
|
* `PLUGIN` that provides a UI to select the subtitles when available.
|
|
50962
50980
|
* @beta
|
|
50963
50981
|
*
|
|
50964
50982
|
* @remarks
|
|
50983
|
+
* The plugin is activated when closed captions tracks are provided with the media source.
|
|
50984
|
+
* It shows a familiar "CC" button with a dropdown menu to select the subtitles language.
|
|
50985
|
+
*
|
|
50965
50986
|
* Depends on:
|
|
50966
50987
|
*
|
|
50967
50988
|
* - {@link MediaControl}
|
|
50968
50989
|
*
|
|
50969
|
-
* Configuration options - {@link
|
|
50990
|
+
* Configuration options - {@link ClosedCaptionsPluginSettings}
|
|
50970
50991
|
* @example
|
|
50971
50992
|
* ```ts
|
|
50972
|
-
* import {
|
|
50993
|
+
* import { ClosedCaptions } from '@gcorevideo/player'
|
|
50973
50994
|
*
|
|
50974
|
-
* Player.registerPlugin(
|
|
50995
|
+
* Player.registerPlugin(ClosedCaptions)
|
|
50975
50996
|
*
|
|
50976
50997
|
* new Player({
|
|
50977
50998
|
* ...
|
|
50978
|
-
*
|
|
50999
|
+
* cc: {
|
|
50979
51000
|
* language: 'en',
|
|
50980
51001
|
* },
|
|
50981
51002
|
* })
|
|
50982
51003
|
* ```
|
|
50983
51004
|
*/
|
|
50984
|
-
class
|
|
51005
|
+
class ClosedCaptions extends UICorePlugin {
|
|
50985
51006
|
isPreselectedApplied = false;
|
|
50986
51007
|
isShowing = false;
|
|
50987
51008
|
track = null;
|
|
50988
51009
|
tracks = [];
|
|
50989
|
-
$
|
|
51010
|
+
$line = null;
|
|
50990
51011
|
/**
|
|
50991
51012
|
* @internal
|
|
50992
51013
|
*/
|
|
50993
51014
|
get name() {
|
|
50994
|
-
return '
|
|
51015
|
+
return 'cc';
|
|
50995
51016
|
}
|
|
50996
51017
|
/**
|
|
50997
51018
|
* @internal
|
|
@@ -51012,8 +51033,7 @@ class Subtitles extends UICorePlugin {
|
|
|
51012
51033
|
*/
|
|
51013
51034
|
get attributes() {
|
|
51014
51035
|
return {
|
|
51015
|
-
class: 'media-control-
|
|
51016
|
-
'data-subtitles': '',
|
|
51036
|
+
class: 'media-control-cc',
|
|
51017
51037
|
};
|
|
51018
51038
|
}
|
|
51019
51039
|
/**
|
|
@@ -51021,12 +51041,12 @@ class Subtitles extends UICorePlugin {
|
|
|
51021
51041
|
*/
|
|
51022
51042
|
get events() {
|
|
51023
51043
|
return {
|
|
51024
|
-
'click [data-
|
|
51025
|
-
'click [data-
|
|
51044
|
+
'click [data-cc-select]': 'onItemSelect',
|
|
51045
|
+
'click [data-cc-button]': 'toggleMenu',
|
|
51026
51046
|
};
|
|
51027
51047
|
}
|
|
51028
51048
|
get preselectedLanguage() {
|
|
51029
|
-
return this.core.options.subtitles?.language ?? '';
|
|
51049
|
+
return this.core.options.cc?.language ?? this.core.options.subtitles?.language ?? '';
|
|
51030
51050
|
}
|
|
51031
51051
|
/**
|
|
51032
51052
|
* @internal
|
|
@@ -51141,7 +51161,7 @@ class Subtitles extends UICorePlugin {
|
|
|
51141
51161
|
hide() {
|
|
51142
51162
|
this.isShowing = false;
|
|
51143
51163
|
this.renderIcon();
|
|
51144
|
-
this.$
|
|
51164
|
+
this.$line.hide();
|
|
51145
51165
|
if (this.tracks) {
|
|
51146
51166
|
for (const t of this.tracks) {
|
|
51147
51167
|
t.track.mode = 'hidden';
|
|
@@ -51159,22 +51179,22 @@ class Subtitles extends UICorePlugin {
|
|
|
51159
51179
|
this.track &&
|
|
51160
51180
|
this.track.track.mode &&
|
|
51161
51181
|
Browser.isiOS) {
|
|
51162
|
-
this.$
|
|
51182
|
+
this.$line.hide();
|
|
51163
51183
|
this.track.track.mode = 'showing';
|
|
51164
51184
|
}
|
|
51165
51185
|
else {
|
|
51166
|
-
this.$
|
|
51186
|
+
this.$line.show();
|
|
51167
51187
|
}
|
|
51168
51188
|
}
|
|
51169
51189
|
shouldRender() {
|
|
51170
|
-
return this.tracks
|
|
51190
|
+
return this.tracks?.length > 0;
|
|
51171
51191
|
}
|
|
51172
51192
|
resizeFont() {
|
|
51173
|
-
if (!this.$
|
|
51193
|
+
if (!this.$line) {
|
|
51174
51194
|
return;
|
|
51175
51195
|
}
|
|
51176
51196
|
const skinWidth = this.core.activeContainer.$el.width();
|
|
51177
|
-
this.$
|
|
51197
|
+
this.$line.find('p').css('font-size', skinWidth * 0.03);
|
|
51178
51198
|
}
|
|
51179
51199
|
/**
|
|
51180
51200
|
* @internal
|
|
@@ -51187,12 +51207,12 @@ class Subtitles extends UICorePlugin {
|
|
|
51187
51207
|
return this;
|
|
51188
51208
|
}
|
|
51189
51209
|
const mediaControl = this.core.getPlugin('media_control');
|
|
51190
|
-
this.$el.html(
|
|
51191
|
-
this.core.activeContainer.$el.find('
|
|
51192
|
-
this.$
|
|
51210
|
+
this.$el.html(ClosedCaptions.template({ tracks: this.tracks }));
|
|
51211
|
+
this.core.activeContainer.$el.find('#cc-line').remove();
|
|
51212
|
+
this.$line = $(ClosedCaptions.templateString());
|
|
51193
51213
|
this.resizeFont();
|
|
51194
|
-
this.core.activeContainer.$el.append(this.$
|
|
51195
|
-
mediaControl.putElement('
|
|
51214
|
+
this.core.activeContainer.$el.append(this.$line);
|
|
51215
|
+
mediaControl.putElement('cc', this.el);
|
|
51196
51216
|
this.updateSelection();
|
|
51197
51217
|
this.renderIcon();
|
|
51198
51218
|
return this;
|
|
@@ -51207,9 +51227,9 @@ class Subtitles extends UICorePlugin {
|
|
|
51207
51227
|
this.updateSelection();
|
|
51208
51228
|
}
|
|
51209
51229
|
onItemSelect(event) {
|
|
51210
|
-
const id = event.target.dataset.
|
|
51230
|
+
const id = event.target.dataset.ccSelect ?? '-1';
|
|
51211
51231
|
trace(`${T$2} onItemSelect`, { id });
|
|
51212
|
-
localStorage.setItem(
|
|
51232
|
+
localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
|
|
51213
51233
|
this.selectItem(this.findById(Number(id)));
|
|
51214
51234
|
return false;
|
|
51215
51235
|
}
|
|
@@ -51225,16 +51245,17 @@ class Subtitles extends UICorePlugin {
|
|
|
51225
51245
|
}
|
|
51226
51246
|
}
|
|
51227
51247
|
hideMenu() {
|
|
51228
|
-
this.$('[data-
|
|
51248
|
+
this.$('[data-cc] ul').hide();
|
|
51229
51249
|
}
|
|
51230
51250
|
toggleMenu() {
|
|
51231
|
-
|
|
51251
|
+
trace(`${T$2} toggleMenu`);
|
|
51252
|
+
this.$('[data-cc] ul').toggle();
|
|
51232
51253
|
}
|
|
51233
51254
|
itemElement(id) {
|
|
51234
|
-
return this.$(`ul li a[data-
|
|
51255
|
+
return this.$(`ul li a[data-cc-select="${id}"]`).parent();
|
|
51235
51256
|
}
|
|
51236
51257
|
allItemElements() {
|
|
51237
|
-
return this.$('[data-
|
|
51258
|
+
return this.$('[data-cc] li');
|
|
51238
51259
|
}
|
|
51239
51260
|
selectSubtitles() {
|
|
51240
51261
|
const trackId = this.track ? this.track.id : -1;
|
|
@@ -51254,7 +51275,7 @@ class Subtitles extends UICorePlugin {
|
|
|
51254
51275
|
return lines.join('\n');
|
|
51255
51276
|
}
|
|
51256
51277
|
setSubtitleText(text) {
|
|
51257
|
-
this.$
|
|
51278
|
+
this.$line.find('p').html(text);
|
|
51258
51279
|
}
|
|
51259
51280
|
clearSubtitleText() {
|
|
51260
51281
|
this.setSubtitleText('');
|
|
@@ -51285,7 +51306,7 @@ class Subtitles extends UICorePlugin {
|
|
|
51285
51306
|
}
|
|
51286
51307
|
renderIcon() {
|
|
51287
51308
|
const icon = this.isShowing ? subtitlesOnIcon : subtitlesOffIcon;
|
|
51288
|
-
this.$el.find('span.
|
|
51309
|
+
this.$el.find('span.cc-text').html(icon);
|
|
51289
51310
|
}
|
|
51290
51311
|
}
|
|
51291
51312
|
|
|
@@ -52129,4 +52150,4 @@ class VolumeFade extends UICorePlugin {
|
|
|
52129
52150
|
}
|
|
52130
52151
|
}
|
|
52131
52152
|
|
|
52132
|
-
export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ContextMenu, DvrControls, ErrorScreen, Favicon, GoogleAnalytics, LevelSelector, LogTracer, Logger, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };
|
|
52153
|
+
export { AudioSelector, BigMuteButton, BottomGear, ClapprNerdStats, ClapprStats, ClickToPause, ClipsPlugin, ClosedCaptions, ContextMenu, DvrControls, ErrorScreen, Favicon, GoogleAnalytics, LevelSelector, LogTracer, Logger, Logo, MediaControl, MediaControlEvents, MultiCamera, PictureInPicture, PlaybackErrorCode, PlaybackRate, Player, PlayerEvent, Poster, SeekTime, SentryTracer, Share, SkipTime, SourceController, SpinnerEvents, SpinnerThreeBounce, ClosedCaptions as Subtitles, Telemetry, TelemetryEvent, Thumbnails, VolumeFade, VolumeFadeEvents, reportError, setTracer, trace, version };
|