@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/index.js
CHANGED
|
@@ -12628,6 +12628,9 @@ var PlaybackErrorCode;
|
|
|
12628
12628
|
* @internal
|
|
12629
12629
|
*/
|
|
12630
12630
|
class BasePlayback extends HTML5Video$1 {
|
|
12631
|
+
get isHTML5Video() {
|
|
12632
|
+
return true;
|
|
12633
|
+
}
|
|
12631
12634
|
createError(errorData, options) {
|
|
12632
12635
|
const i18n = this.i18n ||
|
|
12633
12636
|
// @ts-ignore
|
|
@@ -12933,6 +12936,7 @@ class DashPlayback extends BasePlayback {
|
|
|
12933
12936
|
this.trigger(Events$1.PLAYBACK_DVR, status);
|
|
12934
12937
|
this.trigger(Events$1.PLAYBACK_STATS_ADD, { dvr: status });
|
|
12935
12938
|
}
|
|
12939
|
+
// TODO move to the base class
|
|
12936
12940
|
_updateSettings() {
|
|
12937
12941
|
if (this._playbackType === Playback.VOD) {
|
|
12938
12942
|
// @ts-expect-error
|
|
@@ -43296,7 +43300,7 @@ class Player {
|
|
|
43296
43300
|
}
|
|
43297
43301
|
}
|
|
43298
43302
|
|
|
43299
|
-
var version$1 = "2.21.
|
|
43303
|
+
var version$1 = "2.21.4";
|
|
43300
43304
|
|
|
43301
43305
|
var packages = {
|
|
43302
43306
|
"node_modules/@clappr/core": {
|
|
@@ -43320,7 +43324,7 @@ function version() {
|
|
|
43320
43324
|
};
|
|
43321
43325
|
}
|
|
43322
43326
|
|
|
43323
|
-
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";
|
|
43324
43328
|
|
|
43325
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";
|
|
43326
43330
|
|
|
@@ -43363,8 +43367,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43363
43367
|
*/
|
|
43364
43368
|
get attributes() {
|
|
43365
43369
|
return {
|
|
43366
|
-
class: 'media-control-
|
|
43367
|
-
'data-track-selector': '',
|
|
43370
|
+
class: 'media-control-audiotracks',
|
|
43368
43371
|
};
|
|
43369
43372
|
}
|
|
43370
43373
|
/**
|
|
@@ -43372,8 +43375,8 @@ class AudioSelector extends UICorePlugin {
|
|
|
43372
43375
|
*/
|
|
43373
43376
|
get events() {
|
|
43374
43377
|
return {
|
|
43375
|
-
'click [data-
|
|
43376
|
-
'click [data-
|
|
43378
|
+
'click [data-audiotracks-select]': 'onTrackSelect',
|
|
43379
|
+
'click [data-audiotracks-button]': 'onShowLevelSelectMenu',
|
|
43377
43380
|
};
|
|
43378
43381
|
}
|
|
43379
43382
|
/**
|
|
@@ -43436,7 +43439,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43436
43439
|
const mediaControl = this.core.getPlugin('media_control');
|
|
43437
43440
|
this.$el.html(AudioSelector.template({ tracks: this.tracks, title: this.getTitle() }));
|
|
43438
43441
|
this.$('.audio-arrow').append(audioArrow);
|
|
43439
|
-
mediaControl.putElement('
|
|
43442
|
+
mediaControl.putElement('audiotracks', this.el);
|
|
43440
43443
|
this.updateText();
|
|
43441
43444
|
this.highlightCurrentTrack();
|
|
43442
43445
|
return this;
|
|
@@ -43449,7 +43452,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43449
43452
|
return this.tracks.find((track) => track.id === id);
|
|
43450
43453
|
}
|
|
43451
43454
|
onTrackSelect(event) {
|
|
43452
|
-
const id = event.target?.dataset?.
|
|
43455
|
+
const id = event.target?.dataset?.audiotracksSelect;
|
|
43453
43456
|
if (id) {
|
|
43454
43457
|
this.selectAudioTrack(id);
|
|
43455
43458
|
}
|
|
@@ -43479,7 +43482,7 @@ class AudioSelector extends UICorePlugin {
|
|
|
43479
43482
|
}
|
|
43480
43483
|
trackElement(id) {
|
|
43481
43484
|
return this.$('ul a' +
|
|
43482
|
-
(id !== undefined ? '[data-
|
|
43485
|
+
(id !== undefined ? '[data-audiotracks-select="' + id + '"]' : '')).parent();
|
|
43483
43486
|
}
|
|
43484
43487
|
getTitle() {
|
|
43485
43488
|
return this.currentTrack?.label || '';
|
|
@@ -43655,7 +43658,7 @@ class BigMuteButton extends UICorePlugin {
|
|
|
43655
43658
|
}
|
|
43656
43659
|
}
|
|
43657
43660
|
|
|
43658
|
-
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>";
|
|
43659
43662
|
|
|
43660
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";
|
|
43661
43664
|
|
|
@@ -43918,7 +43921,7 @@ function getPageX(event) {
|
|
|
43918
43921
|
return 0;
|
|
43919
43922
|
}
|
|
43920
43923
|
|
|
43921
|
-
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
|
|
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";
|
|
43922
43925
|
|
|
43923
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";
|
|
43924
43927
|
|
|
@@ -43971,7 +43974,7 @@ function orderByOrderPattern(arr, order) {
|
|
|
43971
43974
|
* The methods exposed are to be used by the other plugins that extend the media control UI.
|
|
43972
43975
|
*/
|
|
43973
43976
|
class MediaControl extends UICorePlugin {
|
|
43974
|
-
advertisementPlaying = false
|
|
43977
|
+
// private advertisementPlaying = false
|
|
43975
43978
|
buttonsColor = null;
|
|
43976
43979
|
currentDurationValue = 0;
|
|
43977
43980
|
currentPositionValue = 0;
|
|
@@ -43993,7 +43996,7 @@ class MediaControl extends UICorePlugin {
|
|
|
43993
43996
|
lastMouseY = 0;
|
|
43994
43997
|
persistConfig;
|
|
43995
43998
|
rendered = false;
|
|
43996
|
-
settings = {};
|
|
43999
|
+
settings = {}; // TODO & seekEnabled: boolean, ...
|
|
43997
44000
|
userDisabled = false;
|
|
43998
44001
|
userKeepVisible = false;
|
|
43999
44002
|
verticalVolume = false;
|
|
@@ -44013,7 +44016,6 @@ class MediaControl extends UICorePlugin {
|
|
|
44013
44016
|
$seekBarLoaded = null;
|
|
44014
44017
|
$seekBarPosition = null;
|
|
44015
44018
|
$seekBarScrubber = null;
|
|
44016
|
-
$subtitlesSelector = null;
|
|
44017
44019
|
$volumeBarContainer = null;
|
|
44018
44020
|
$volumeBarBackground = null;
|
|
44019
44021
|
$volumeBarFill = null;
|
|
@@ -44034,7 +44036,8 @@ class MediaControl extends UICorePlugin {
|
|
|
44034
44036
|
return { min: CLAPPR_VERSION };
|
|
44035
44037
|
}
|
|
44036
44038
|
get disabled() {
|
|
44037
|
-
const playbackIsNOOP = this.core.activeContainer &&
|
|
44039
|
+
const playbackIsNOOP = this.core.activeContainer &&
|
|
44040
|
+
this.core.activeContainer.getPlaybackType() === Playback.NO_OP;
|
|
44038
44041
|
return this.userDisabled || playbackIsNOOP;
|
|
44039
44042
|
}
|
|
44040
44043
|
/**
|
|
@@ -44174,18 +44177,16 @@ class MediaControl extends UICorePlugin {
|
|
|
44174
44177
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_DBLCLICK, this.toggleFullscreen);
|
|
44175
44178
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
|
|
44176
44179
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PROGRESS, this.updateProgressBar);
|
|
44177
|
-
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_SETTINGSUPDATE, this.
|
|
44178
|
-
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.
|
|
44180
|
+
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_SETTINGSUPDATE, this.updateSettings);
|
|
44181
|
+
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.updateSettings);
|
|
44179
44182
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);
|
|
44180
44183
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_MEDIACONTROL_DISABLE, this.disable);
|
|
44181
44184
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_MEDIACONTROL_ENABLE, this.enable);
|
|
44182
44185
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_ENDED, this.ended);
|
|
44183
44186
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_VOLUME, this.onVolumeChanged);
|
|
44184
44187
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_OPTIONS_CHANGE, this.setInitialVolume);
|
|
44185
|
-
if
|
|
44186
|
-
|
|
44187
|
-
this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_LOADEDMETADATA, this.onLoadedMetadataOnVideoTag);
|
|
44188
|
-
}
|
|
44188
|
+
// wait until the metadata has loaded and then check if fullscreen on video tag is supported
|
|
44189
|
+
this.listenToOnce(this.core.activeContainer, Events$1.CONTAINER_LOADEDMETADATA, this.onLoadedMetadata);
|
|
44189
44190
|
}
|
|
44190
44191
|
/**
|
|
44191
44192
|
* Hides the media control UI
|
|
@@ -44220,13 +44221,13 @@ class MediaControl extends UICorePlugin {
|
|
|
44220
44221
|
onVolumeChanged() {
|
|
44221
44222
|
this.updateVolumeUI();
|
|
44222
44223
|
}
|
|
44223
|
-
|
|
44224
|
+
onLoadedMetadata() {
|
|
44224
44225
|
const video = this.core.activePlayback?.el;
|
|
44225
44226
|
// video.webkitSupportsFullscreen is deprecated but iOS appears to only use this
|
|
44226
44227
|
// see https://github.com/clappr/clappr/issues/1127
|
|
44227
44228
|
if (!Fullscreen.fullscreenEnabled() && video.webkitSupportsFullscreen) {
|
|
44228
44229
|
this.fullScreenOnVideoTagSupported = true;
|
|
44229
|
-
this.
|
|
44230
|
+
this.updateSettings();
|
|
44230
44231
|
}
|
|
44231
44232
|
}
|
|
44232
44233
|
updateVolumeUI() {
|
|
@@ -44456,7 +44457,7 @@ class MediaControl extends UICorePlugin {
|
|
|
44456
44457
|
this.setInitialVolume();
|
|
44457
44458
|
this.changeTogglePlay();
|
|
44458
44459
|
this.bindContainerEvents();
|
|
44459
|
-
this.
|
|
44460
|
+
this.updateSettings();
|
|
44460
44461
|
this.core.activeContainer.trigger(Events$1.CONTAINER_PLAYBACKDVRSTATECHANGED, this.core.activeContainer.isDvrInUse());
|
|
44461
44462
|
// TODO test
|
|
44462
44463
|
if (this.core.activeContainer.mediaControlDisabled) {
|
|
@@ -44637,18 +44638,19 @@ class MediaControl extends UICorePlugin {
|
|
|
44637
44638
|
this.core.$el.addClass('nocursor');
|
|
44638
44639
|
}
|
|
44639
44640
|
}
|
|
44640
|
-
|
|
44641
|
+
updateSettings() {
|
|
44641
44642
|
const newSettings = $.extend(true, {
|
|
44642
44643
|
left: [],
|
|
44643
44644
|
default: [],
|
|
44644
44645
|
right: [],
|
|
44645
|
-
}, this.core.activeContainer
|
|
44646
|
+
}, this.core.activeContainer.settings);
|
|
44646
44647
|
newSettings.left = orderByOrderPattern([...newSettings.left, 'clipsText', 'volume'], LEFT_ORDER);
|
|
44648
|
+
// actual order of the items appear rendered is controlled by CSS
|
|
44647
44649
|
newSettings.right = [
|
|
44648
44650
|
'fullscreen',
|
|
44649
44651
|
'pip',
|
|
44650
|
-
'
|
|
44651
|
-
'
|
|
44652
|
+
'gear',
|
|
44653
|
+
'cc',
|
|
44652
44654
|
'multicamera',
|
|
44653
44655
|
'playbackrate',
|
|
44654
44656
|
'vr',
|
|
@@ -44657,7 +44659,7 @@ class MediaControl extends UICorePlugin {
|
|
|
44657
44659
|
if ((!this.fullScreenOnVideoTagSupported &&
|
|
44658
44660
|
!Fullscreen.fullscreenEnabled()) ||
|
|
44659
44661
|
this.options.fullscreenDisable) {
|
|
44660
|
-
// remove fullscreen from settings if it is
|
|
44662
|
+
// remove fullscreen from settings if it is not available
|
|
44661
44663
|
removeArrayItem(newSettings.default, 'fullscreen');
|
|
44662
44664
|
removeArrayItem(newSettings.left, 'fullscreen');
|
|
44663
44665
|
removeArrayItem(newSettings.right, 'fullscreen');
|
|
@@ -44694,10 +44696,9 @@ class MediaControl extends UICorePlugin {
|
|
|
44694
44696
|
this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
|
|
44695
44697
|
this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
|
|
44696
44698
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
44697
|
-
this.$subtitlesSelector = this.$el.find('.media-control-subtitles[data-subtitles]');
|
|
44698
44699
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
44699
44700
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
44700
|
-
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]');
|
|
44701
|
+
this.$clipText = this.$el.find('.media-clip-text[data-clipstext]'); // TODO
|
|
44701
44702
|
this.$clipTextContainer = this.$el.find('.media-clip-container[data-clipstext]');
|
|
44702
44703
|
this.resetIndicators();
|
|
44703
44704
|
this.initializeIcons();
|
|
@@ -44723,33 +44724,32 @@ class MediaControl extends UICorePlugin {
|
|
|
44723
44724
|
*/
|
|
44724
44725
|
getElement(name) {
|
|
44725
44726
|
switch (name) {
|
|
44726
|
-
case '
|
|
44727
|
+
case 'audiotracks':
|
|
44727
44728
|
return null;
|
|
44728
44729
|
case 'clipText':
|
|
44729
44730
|
return this.$clipText;
|
|
44730
|
-
case 'gear':
|
|
44731
|
-
return null;
|
|
44732
|
-
case 'pip':
|
|
44733
|
-
return null;
|
|
44734
44731
|
case 'playbackRate':
|
|
44735
44732
|
return this.$playbackRate;
|
|
44736
44733
|
case 'seekBarContainer':
|
|
44737
44734
|
return this.$seekBarContainer;
|
|
44738
|
-
case 'subtitlesSelector':
|
|
44739
|
-
return this.$subtitlesSelector;
|
|
44740
44735
|
}
|
|
44741
44736
|
}
|
|
44742
44737
|
putElement(name, element) {
|
|
44743
|
-
|
|
44744
|
-
|
|
44745
|
-
|
|
44746
|
-
|
|
44747
|
-
|
|
44748
|
-
|
|
44749
|
-
|
|
44750
|
-
|
|
44751
|
-
|
|
44752
|
-
|
|
44738
|
+
const panel = this.getElementLocation(name);
|
|
44739
|
+
trace(`${T$e} putElement`, { name, panel: !!panel });
|
|
44740
|
+
if (panel) {
|
|
44741
|
+
const current = panel.find(`[data-${name}]`);
|
|
44742
|
+
element.setAttribute(`data-${name}`, "");
|
|
44743
|
+
// TODO test
|
|
44744
|
+
if (current.length) {
|
|
44745
|
+
if (current[0] === element) {
|
|
44746
|
+
return;
|
|
44747
|
+
}
|
|
44748
|
+
current.replaceWith(element);
|
|
44749
|
+
}
|
|
44750
|
+
else {
|
|
44751
|
+
panel.append(element);
|
|
44752
|
+
}
|
|
44753
44753
|
}
|
|
44754
44754
|
}
|
|
44755
44755
|
/**
|
|
@@ -44987,12 +44987,12 @@ class MediaControl extends UICorePlugin {
|
|
|
44987
44987
|
}
|
|
44988
44988
|
// TODO manage by the ads plugin
|
|
44989
44989
|
onStartAd() {
|
|
44990
|
-
this.advertisementPlaying = true
|
|
44990
|
+
// this.advertisementPlaying = true
|
|
44991
44991
|
this.disable();
|
|
44992
44992
|
}
|
|
44993
44993
|
// TODO manage by the ads plugin
|
|
44994
44994
|
onFinishAd() {
|
|
44995
|
-
this.advertisementPlaying = false
|
|
44995
|
+
// this.advertisementPlaying = false
|
|
44996
44996
|
this.enable();
|
|
44997
44997
|
}
|
|
44998
44998
|
// TODO remove
|
|
@@ -45036,6 +45036,18 @@ class MediaControl extends UICorePlugin {
|
|
|
45036
45036
|
}
|
|
45037
45037
|
return isFinite(this.core.activePlayback.getDuration());
|
|
45038
45038
|
}
|
|
45039
|
+
getElementLocation(name) {
|
|
45040
|
+
if (this.settings.right?.includes(name)) {
|
|
45041
|
+
return this.getRightPanel();
|
|
45042
|
+
}
|
|
45043
|
+
if (this.settings.left?.includes(name)) {
|
|
45044
|
+
return this.getLeftPanel();
|
|
45045
|
+
}
|
|
45046
|
+
if (this.settings.default?.includes(name)) {
|
|
45047
|
+
return this.getCenterPanel();
|
|
45048
|
+
}
|
|
45049
|
+
return null;
|
|
45050
|
+
}
|
|
45039
45051
|
}
|
|
45040
45052
|
MediaControl.extend = function (properties) {
|
|
45041
45053
|
return extend(MediaControl, properties);
|
|
@@ -45043,6 +45055,7 @@ MediaControl.extend = function (properties) {
|
|
|
45043
45055
|
|
|
45044
45056
|
const VERSION$5 = '2.19.12';
|
|
45045
45057
|
const T$d = 'plugins.bottom_gear';
|
|
45058
|
+
// TODO disabled if no items added
|
|
45046
45059
|
/**
|
|
45047
45060
|
* `PLUGIN` that adds the gear button with an extra options menu on the right side of the {@link MediaControl | media control} UI
|
|
45048
45061
|
* @beta
|
|
@@ -45051,7 +45064,7 @@ const T$d = 'plugins.bottom_gear';
|
|
|
45051
45064
|
*
|
|
45052
45065
|
* Depends on:
|
|
45053
45066
|
*
|
|
45054
|
-
* - {@link MediaControl
|
|
45067
|
+
* - {@link MediaControl}
|
|
45055
45068
|
*/
|
|
45056
45069
|
class BottomGear extends UICorePlugin {
|
|
45057
45070
|
isHd = false;
|
|
@@ -45104,6 +45117,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45104
45117
|
getElement(name) {
|
|
45105
45118
|
return this.$el.find(`.gear-options-list [data-${name}]`);
|
|
45106
45119
|
}
|
|
45120
|
+
// TODO implement putElement/addElement method
|
|
45107
45121
|
/**
|
|
45108
45122
|
* Replaces the content of the gear menu
|
|
45109
45123
|
* @param content - Zepto result of the element
|
|
@@ -45137,7 +45151,7 @@ class BottomGear extends UICorePlugin {
|
|
|
45137
45151
|
];
|
|
45138
45152
|
const icon = this.isHd ? gearHdIcon : gearIcon;
|
|
45139
45153
|
this.$el.html(BottomGear.template({ icon, items }));
|
|
45140
|
-
mediaControl.putElement('gear', this
|
|
45154
|
+
mediaControl.putElement('gear', this.el);
|
|
45141
45155
|
mediaControl.trigger(MediaControlEvents.MEDIACONTROL_GEAR_RENDERED);
|
|
45142
45156
|
return this;
|
|
45143
45157
|
}
|
|
@@ -49637,6 +49651,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49637
49651
|
static get version() {
|
|
49638
49652
|
return VERSION$2;
|
|
49639
49653
|
}
|
|
49654
|
+
static buttonTemplate = tmpl(buttonHtml$1);
|
|
49640
49655
|
/**
|
|
49641
49656
|
* @internal
|
|
49642
49657
|
*/
|
|
@@ -49661,8 +49676,8 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49661
49676
|
}
|
|
49662
49677
|
isPiPSupported() {
|
|
49663
49678
|
trace(`${T$7} isPiPSupported`, {
|
|
49664
|
-
pictureInPictureEnabled: document.pictureInPictureEnabled,
|
|
49665
|
-
requestPictureInPicture: HTMLVideoElement.prototype.requestPictureInPicture,
|
|
49679
|
+
pictureInPictureEnabled: !!document.pictureInPictureEnabled,
|
|
49680
|
+
requestPictureInPicture: !!HTMLVideoElement.prototype.requestPictureInPicture,
|
|
49666
49681
|
});
|
|
49667
49682
|
return document.pictureInPictureEnabled && !!HTMLVideoElement.prototype.requestPictureInPicture;
|
|
49668
49683
|
}
|
|
@@ -49673,8 +49688,7 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49673
49688
|
if (!this.isPiPSupported()) {
|
|
49674
49689
|
return this;
|
|
49675
49690
|
}
|
|
49676
|
-
|
|
49677
|
-
this.$el.html(t({ pipIcon }));
|
|
49691
|
+
this.$el.html(PictureInPicture.buttonTemplate({ pipIcon }));
|
|
49678
49692
|
const mediaControl = this.core.getPlugin('media_control');
|
|
49679
49693
|
if (mediaControl) {
|
|
49680
49694
|
mediaControl.putElement('pip', this.el);
|
|
@@ -49702,9 +49716,9 @@ class PictureInPicture extends UICorePlugin {
|
|
|
49702
49716
|
}
|
|
49703
49717
|
}
|
|
49704
49718
|
|
|
49705
|
-
const buttonHtml = "<button class='gplayer-lite-btn gcore-skin-text-color gear-option'>\n <span class=\"gear-option_speed-icon\"><%= speedIcon %></span>\n <span
|
|
49719
|
+
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";
|
|
49706
49720
|
|
|
49707
|
-
const listHtml = "<button class=\"gplayer-lite-btn go-back gcore-skin-text-color\">\n <span class=\"arrow-left-icon\"><%= arrowLeftIcon %></span>\n
|
|
49721
|
+
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";
|
|
49708
49722
|
|
|
49709
49723
|
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";
|
|
49710
49724
|
|
|
@@ -49715,7 +49729,7 @@ const DEFAULT_PLAYBACK_RATES = [
|
|
|
49715
49729
|
{ value: '1.25', label: '1.25x' },
|
|
49716
49730
|
{ value: '1.5', label: '1.5x' },
|
|
49717
49731
|
{ value: '1.75', label: '1.75x' },
|
|
49718
|
-
{ value: '2.0', label: '2x' }
|
|
49732
|
+
{ value: '2.0', label: '2x' },
|
|
49719
49733
|
];
|
|
49720
49734
|
const DEFAULT_PLAYBACK_RATE = '1.0';
|
|
49721
49735
|
const T$6 = 'plugins.playback_rate';
|
|
@@ -49731,6 +49745,7 @@ const T$6 = 'plugins.playback_rate';
|
|
|
49731
49745
|
* - {@link BottomGear | bottom_gear}
|
|
49732
49746
|
*
|
|
49733
49747
|
* It renders a button in the gear menu, which opens a dropdown with the options to change the playback rate.
|
|
49748
|
+
* Note that the playback rate change is supported only for VOD or DVR enabled live streams.
|
|
49734
49749
|
*/
|
|
49735
49750
|
class PlaybackRate extends UICorePlugin {
|
|
49736
49751
|
playbackRates = DEFAULT_PLAYBACK_RATES;
|
|
@@ -49754,16 +49769,17 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49754
49769
|
static listTemplate = tmpl(listHtml);
|
|
49755
49770
|
constructor(core) {
|
|
49756
49771
|
super(core);
|
|
49757
|
-
this.playbackRates =
|
|
49758
|
-
|
|
49772
|
+
this.playbackRates =
|
|
49773
|
+
core.options.playbackRate?.options || DEFAULT_PLAYBACK_RATES;
|
|
49774
|
+
this.selectedRate =
|
|
49775
|
+
core.options.playbackRate?.defaultValue || DEFAULT_PLAYBACK_RATE;
|
|
49759
49776
|
}
|
|
49760
49777
|
/**
|
|
49761
49778
|
* @internal
|
|
49762
49779
|
*/
|
|
49763
49780
|
get attributes() {
|
|
49764
49781
|
return {
|
|
49765
|
-
|
|
49766
|
-
'data-playback-rate-select': ''
|
|
49782
|
+
class: 'media-control-playbackrate',
|
|
49767
49783
|
};
|
|
49768
49784
|
}
|
|
49769
49785
|
/**
|
|
@@ -49784,6 +49800,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49784
49800
|
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onActiveContainerChange);
|
|
49785
49801
|
}
|
|
49786
49802
|
onCoreReady() {
|
|
49803
|
+
trace(`${T$6} onCoreReady`);
|
|
49787
49804
|
const mediaControl = this.core.getPlugin('media_control');
|
|
49788
49805
|
assert(mediaControl, 'media_control plugin is required');
|
|
49789
49806
|
const gear = this.core.getPlugin('bottom_gear');
|
|
@@ -49791,6 +49808,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49791
49808
|
this.listenTo(mediaControl, MediaControlEvents.MEDIACONTROL_GEAR_RENDERED, this.onGearRendered);
|
|
49792
49809
|
}
|
|
49793
49810
|
onActiveContainerChange() {
|
|
49811
|
+
trace(`${T$6} onActiveContainerChange`);
|
|
49794
49812
|
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_STOP, this.onStop);
|
|
49795
49813
|
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_PLAY, this.onPlay);
|
|
49796
49814
|
this.listenTo(this.core.activePlayback, PlaybackEvents.PLAYBACK_RATE_CHANGED, this.onPlaybackRateChange);
|
|
@@ -49814,7 +49832,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49814
49832
|
allRateElements() {
|
|
49815
49833
|
return this.$('ul.gear-sub-menu li');
|
|
49816
49834
|
}
|
|
49817
|
-
rateElement(rate =
|
|
49835
|
+
rateElement(rate = '1') {
|
|
49818
49836
|
return this.$(`ul.gear-sub-menu a[data-rate="${rate}"]`).parent();
|
|
49819
49837
|
}
|
|
49820
49838
|
onPlaybackRateChange(playbackRate) {
|
|
@@ -49829,10 +49847,11 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49829
49847
|
}
|
|
49830
49848
|
}
|
|
49831
49849
|
shouldRender() {
|
|
49832
|
-
if (!this.core.
|
|
49850
|
+
if (!this.core.activePlayback) {
|
|
49833
49851
|
return false;
|
|
49834
49852
|
}
|
|
49835
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
49853
|
+
if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
|
|
49854
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
49836
49855
|
return false;
|
|
49837
49856
|
}
|
|
49838
49857
|
return 'setPlaybackRate' in this.core.activePlayback;
|
|
@@ -49855,9 +49874,12 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49855
49874
|
title: this.getTitle(),
|
|
49856
49875
|
speedIcon,
|
|
49857
49876
|
arrowRightIcon,
|
|
49877
|
+
i18n: this.core.i18n,
|
|
49858
49878
|
});
|
|
49859
49879
|
this.$el.html(button);
|
|
49860
|
-
this.core.getPlugin('bottom_gear')
|
|
49880
|
+
this.core.getPlugin('bottom_gear')
|
|
49881
|
+
?.getElement('rate')
|
|
49882
|
+
?.html(this.el);
|
|
49861
49883
|
this.rendered = true;
|
|
49862
49884
|
return this;
|
|
49863
49885
|
}
|
|
@@ -49872,7 +49894,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49872
49894
|
}
|
|
49873
49895
|
}
|
|
49874
49896
|
onPlay() {
|
|
49875
|
-
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
49897
|
+
if (this.core.getPlaybackType() === Playback.LIVE &&
|
|
49898
|
+
!this.core.activePlayback.dvrEnabled) {
|
|
49876
49899
|
this.resetPlaybackRate();
|
|
49877
49900
|
}
|
|
49878
49901
|
else {
|
|
@@ -49882,8 +49905,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49882
49905
|
resetPlaybackRate() {
|
|
49883
49906
|
this.setSelectedRate(DEFAULT_PLAYBACK_RATE);
|
|
49884
49907
|
}
|
|
49885
|
-
onStop() {
|
|
49886
|
-
}
|
|
49908
|
+
onStop() { }
|
|
49887
49909
|
onRateSelect(event) {
|
|
49888
49910
|
event.stopPropagation();
|
|
49889
49911
|
const rate = event.currentTarget.dataset.rate;
|
|
@@ -49898,6 +49920,7 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49898
49920
|
playbackRates: this.playbackRates,
|
|
49899
49921
|
arrowLeftIcon,
|
|
49900
49922
|
checkIcon,
|
|
49923
|
+
i18n: this.core.i18n,
|
|
49901
49924
|
}));
|
|
49902
49925
|
this.core.getPlugin('bottom_gear')?.setContent(this.el);
|
|
49903
49926
|
this.highlightCurrentRate();
|
|
@@ -49913,7 +49936,8 @@ class PlaybackRate extends UICorePlugin {
|
|
|
49913
49936
|
this.selectedRate = rate;
|
|
49914
49937
|
}
|
|
49915
49938
|
getTitle() {
|
|
49916
|
-
return this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
49939
|
+
return (this.playbackRates.find((r) => r.value === this.selectedRate)?.label ||
|
|
49940
|
+
this.selectedRate);
|
|
49917
49941
|
}
|
|
49918
49942
|
highlightCurrentRate() {
|
|
49919
49943
|
this.allRateElements().removeClass('current');
|
|
@@ -50943,53 +50967,51 @@ const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
|
|
|
50943
50967
|
|
|
50944
50968
|
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";
|
|
50945
50969
|
|
|
50946
|
-
const comboboxHTML = "<button data-
|
|
50970
|
+
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";
|
|
50947
50971
|
|
|
50948
|
-
const stringHTML = "<div class=\"
|
|
50972
|
+
const stringHTML = "<div class=\"cc-line\" id=\"cc-line\">\n <p></p>\n</div>\n";
|
|
50949
50973
|
|
|
50950
50974
|
const VERSION = '2.19.14';
|
|
50951
|
-
const
|
|
50952
|
-
const T$2 = 'plugins.
|
|
50953
|
-
const NO_TRACK = { language: 'off' };
|
|
50975
|
+
const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
|
|
50976
|
+
const T$2 = 'plugins.cc';
|
|
50954
50977
|
/**
|
|
50955
50978
|
* `PLUGIN` that provides a UI to select the subtitles when available.
|
|
50956
50979
|
* @beta
|
|
50957
50980
|
*
|
|
50958
50981
|
* @remarks
|
|
50982
|
+
* The plugin is activated when closed captions tracks are provided with the media source.
|
|
50983
|
+
* It shows a familiar "CC" button with a dropdown menu to select the subtitles language.
|
|
50984
|
+
*
|
|
50959
50985
|
* Depends on:
|
|
50960
50986
|
*
|
|
50961
50987
|
* - {@link MediaControl}
|
|
50962
50988
|
*
|
|
50963
|
-
* Configuration options
|
|
50964
|
-
*
|
|
50965
|
-
* - subtitles.language - The language of the subtitles to select by default.
|
|
50966
|
-
*
|
|
50989
|
+
* Configuration options - {@link ClosedCaptionsPluginSettings}
|
|
50967
50990
|
* @example
|
|
50968
50991
|
* ```ts
|
|
50969
|
-
* import {
|
|
50992
|
+
* import { ClosedCaptions } from '@gcorevideo/player'
|
|
50970
50993
|
*
|
|
50971
|
-
* Player.registerPlugin(
|
|
50994
|
+
* Player.registerPlugin(ClosedCaptions)
|
|
50972
50995
|
*
|
|
50973
50996
|
* new Player({
|
|
50974
50997
|
* ...
|
|
50975
|
-
*
|
|
50998
|
+
* cc: {
|
|
50976
50999
|
* language: 'en',
|
|
50977
51000
|
* },
|
|
50978
51001
|
* })
|
|
50979
51002
|
* ```
|
|
50980
51003
|
*/
|
|
50981
|
-
class
|
|
50982
|
-
currentLevel = null;
|
|
51004
|
+
class ClosedCaptions extends UICorePlugin {
|
|
50983
51005
|
isPreselectedApplied = false;
|
|
50984
51006
|
isShowing = false;
|
|
50985
|
-
track =
|
|
50986
|
-
tracks =
|
|
50987
|
-
$
|
|
51007
|
+
track = null;
|
|
51008
|
+
tracks = [];
|
|
51009
|
+
$line = null;
|
|
50988
51010
|
/**
|
|
50989
51011
|
* @internal
|
|
50990
51012
|
*/
|
|
50991
51013
|
get name() {
|
|
50992
|
-
return '
|
|
51014
|
+
return 'cc';
|
|
50993
51015
|
}
|
|
50994
51016
|
/**
|
|
50995
51017
|
* @internal
|
|
@@ -51010,8 +51032,7 @@ class Subtitles extends UICorePlugin {
|
|
|
51010
51032
|
*/
|
|
51011
51033
|
get attributes() {
|
|
51012
51034
|
return {
|
|
51013
|
-
class:
|
|
51014
|
-
'data-subtitles': '',
|
|
51035
|
+
class: 'media-control-cc',
|
|
51015
51036
|
};
|
|
51016
51037
|
}
|
|
51017
51038
|
/**
|
|
@@ -51019,28 +51040,34 @@ class Subtitles extends UICorePlugin {
|
|
|
51019
51040
|
*/
|
|
51020
51041
|
get events() {
|
|
51021
51042
|
return {
|
|
51022
|
-
'click [data-
|
|
51023
|
-
'click [data-
|
|
51043
|
+
'click [data-cc-select]': 'onItemSelect',
|
|
51044
|
+
'click [data-cc-button]': 'toggleMenu',
|
|
51024
51045
|
};
|
|
51025
51046
|
}
|
|
51026
51047
|
get preselectedLanguage() {
|
|
51027
|
-
return this.core.options.subtitles?.language ?? '
|
|
51048
|
+
return this.core.options.cc?.language ?? this.core.options.subtitles?.language ?? '';
|
|
51028
51049
|
}
|
|
51029
51050
|
/**
|
|
51030
51051
|
* @internal
|
|
51031
51052
|
*/
|
|
51032
51053
|
bindEvents() {
|
|
51054
|
+
this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
|
|
51055
|
+
this.listenTo(this.core, Events$1.CORE_RESIZE, this.playerResize);
|
|
51056
|
+
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
|
|
51057
|
+
}
|
|
51058
|
+
onCoreReady() {
|
|
51059
|
+
trace(`${T$2} onCoreReady`);
|
|
51033
51060
|
const mediaControl = this.core.getPlugin('media_control');
|
|
51034
51061
|
assert(mediaControl, 'media_control plugin is required');
|
|
51035
|
-
this.listenTo(this.core, Events$1.CORE_RESIZE, this.playerResize);
|
|
51036
|
-
this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.bindPlaybackEvents);
|
|
51037
51062
|
this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render);
|
|
51038
|
-
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.
|
|
51063
|
+
this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideMenu);
|
|
51039
51064
|
}
|
|
51040
|
-
|
|
51065
|
+
onContainerChanged() {
|
|
51066
|
+
trace(`${T$2} onContainerChanged`);
|
|
51041
51067
|
this.listenTo(this.core.activeContainer, Events$1.CONTAINER_FULLSCREEN, this.playerResize);
|
|
51042
|
-
this.listenToOnce(this.core.activePlayback, Events$1.PLAYBACK_PLAY, this.getTracks);
|
|
51043
51068
|
this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
|
|
51069
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
|
|
51070
|
+
this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
|
|
51044
51071
|
// fix for iOS
|
|
51045
51072
|
const video = this.core.activePlayback.el;
|
|
51046
51073
|
assert(video, 'video element is required');
|
|
@@ -51055,20 +51082,50 @@ class Subtitles extends UICorePlugin {
|
|
|
51055
51082
|
}
|
|
51056
51083
|
});
|
|
51057
51084
|
}
|
|
51058
|
-
|
|
51059
|
-
|
|
51060
|
-
|
|
51061
|
-
|
|
51062
|
-
|
|
51063
|
-
|
|
51064
|
-
|
|
51065
|
-
|
|
51085
|
+
onSubtitleAvailable() {
|
|
51086
|
+
trace(`${T$2} onSubtitleAvailable`);
|
|
51087
|
+
this.applyTracks();
|
|
51088
|
+
}
|
|
51089
|
+
onSubtitleChanged({ id }) {
|
|
51090
|
+
trace(`${T$2} onSubtitleChanged`, { id });
|
|
51091
|
+
if (id === -1) {
|
|
51092
|
+
this.clearSubtitleText();
|
|
51093
|
+
}
|
|
51094
|
+
for (const track of this.tracks) {
|
|
51095
|
+
if (track.id === id) {
|
|
51096
|
+
track.track.mode = 'showing';
|
|
51097
|
+
this.setSubtitleText(this.getSubtitleText(track.track));
|
|
51098
|
+
track.track.oncuechange = (e) => {
|
|
51099
|
+
try {
|
|
51100
|
+
if (track.track.activeCues?.length) {
|
|
51101
|
+
const html = track.track.activeCues[0].getCueAsHTML();
|
|
51102
|
+
this.setSubtitleText(html);
|
|
51103
|
+
}
|
|
51104
|
+
else {
|
|
51105
|
+
this.clearSubtitleText();
|
|
51106
|
+
}
|
|
51107
|
+
}
|
|
51108
|
+
catch (error) {
|
|
51109
|
+
reportError(error);
|
|
51110
|
+
}
|
|
51111
|
+
};
|
|
51066
51112
|
}
|
|
51067
|
-
|
|
51068
|
-
|
|
51113
|
+
else {
|
|
51114
|
+
track.track.oncuechange = null;
|
|
51115
|
+
track.track.mode = 'hidden';
|
|
51069
51116
|
}
|
|
51070
51117
|
}
|
|
51071
51118
|
}
|
|
51119
|
+
applyTracks() {
|
|
51120
|
+
try {
|
|
51121
|
+
this.tracks = this.core.activePlayback.closedCaptionsTracks;
|
|
51122
|
+
this.applyPreselectedSubtitles();
|
|
51123
|
+
this.render();
|
|
51124
|
+
}
|
|
51125
|
+
catch (error) {
|
|
51126
|
+
reportError(error);
|
|
51127
|
+
}
|
|
51128
|
+
}
|
|
51072
51129
|
onStartAd() {
|
|
51073
51130
|
if (this.isShowing && this.core.activeContainer) {
|
|
51074
51131
|
this.hide();
|
|
@@ -51080,10 +51137,11 @@ class Subtitles extends UICorePlugin {
|
|
|
51080
51137
|
this.stopListening(this.core.activeContainer, 'container:advertisement:finish', this.onFinishAd);
|
|
51081
51138
|
}
|
|
51082
51139
|
playerResize() {
|
|
51140
|
+
trace(`${T$2} playerResize`);
|
|
51083
51141
|
const shouldShow = this.core.activeContainer &&
|
|
51084
51142
|
isFullscreen(this.core.activeContainer.el) &&
|
|
51085
|
-
this.
|
|
51086
|
-
this.
|
|
51143
|
+
this.track &&
|
|
51144
|
+
this.track.track.mode &&
|
|
51087
51145
|
Browser.isiOS &&
|
|
51088
51146
|
this.isShowing;
|
|
51089
51147
|
if (shouldShow) {
|
|
@@ -51102,10 +51160,10 @@ class Subtitles extends UICorePlugin {
|
|
|
51102
51160
|
hide() {
|
|
51103
51161
|
this.isShowing = false;
|
|
51104
51162
|
this.renderIcon();
|
|
51105
|
-
this.$
|
|
51163
|
+
this.$line.hide();
|
|
51106
51164
|
if (this.tracks) {
|
|
51107
51165
|
for (const t of this.tracks) {
|
|
51108
|
-
t.mode = 'hidden';
|
|
51166
|
+
t.track.mode = 'hidden';
|
|
51109
51167
|
}
|
|
51110
51168
|
}
|
|
51111
51169
|
}
|
|
@@ -51117,28 +51175,25 @@ class Subtitles extends UICorePlugin {
|
|
|
51117
51175
|
this.renderIcon();
|
|
51118
51176
|
if (this.core.activeContainer &&
|
|
51119
51177
|
isFullscreen(this.core.activeContainer.el) &&
|
|
51120
|
-
this.
|
|
51121
|
-
this.
|
|
51178
|
+
this.track &&
|
|
51179
|
+
this.track.track.mode &&
|
|
51122
51180
|
Browser.isiOS) {
|
|
51123
|
-
this.$
|
|
51124
|
-
this.
|
|
51181
|
+
this.$line.hide();
|
|
51182
|
+
this.track.track.mode = 'showing';
|
|
51125
51183
|
}
|
|
51126
51184
|
else {
|
|
51127
|
-
this.$
|
|
51185
|
+
this.$line.show();
|
|
51128
51186
|
}
|
|
51129
51187
|
}
|
|
51130
51188
|
shouldRender() {
|
|
51131
|
-
return
|
|
51189
|
+
return this.tracks?.length > 0;
|
|
51132
51190
|
}
|
|
51133
51191
|
resizeFont() {
|
|
51134
|
-
if (!this
|
|
51135
|
-
return;
|
|
51136
|
-
}
|
|
51137
|
-
if (!this.$string) {
|
|
51192
|
+
if (!this.$line) {
|
|
51138
51193
|
return;
|
|
51139
51194
|
}
|
|
51140
51195
|
const skinWidth = this.core.activeContainer.$el.width();
|
|
51141
|
-
this.$
|
|
51196
|
+
this.$line.find('p').css('font-size', skinWidth * 0.03);
|
|
51142
51197
|
}
|
|
51143
51198
|
/**
|
|
51144
51199
|
* @internal
|
|
@@ -51150,142 +51205,82 @@ class Subtitles extends UICorePlugin {
|
|
|
51150
51205
|
if (!this.shouldRender()) {
|
|
51151
51206
|
return this;
|
|
51152
51207
|
}
|
|
51153
|
-
trace(`${T$2} render`, {
|
|
51154
|
-
tracks: this.tracks?.length,
|
|
51155
|
-
track: this.track?.language,
|
|
51156
|
-
});
|
|
51157
51208
|
const mediaControl = this.core.getPlugin('media_control');
|
|
51158
|
-
|
|
51159
|
-
this.$el.
|
|
51160
|
-
this
|
|
51161
|
-
this.$string = $(Subtitles.templateString());
|
|
51209
|
+
this.$el.html(ClosedCaptions.template({ tracks: this.tracks }));
|
|
51210
|
+
this.core.activeContainer.$el.find('#cc-line').remove();
|
|
51211
|
+
this.$line = $(ClosedCaptions.templateString());
|
|
51162
51212
|
this.resizeFont();
|
|
51163
|
-
this.core.activeContainer.$el.append(this.$
|
|
51164
|
-
|
|
51165
|
-
|
|
51166
|
-
ss.append(this.el);
|
|
51167
|
-
}
|
|
51168
|
-
else {
|
|
51169
|
-
mediaControl.getRightPanel().append(this.el);
|
|
51170
|
-
}
|
|
51171
|
-
this.updateCurrentLevel(this.track);
|
|
51172
|
-
this.highlightCurrentSubtitles();
|
|
51173
|
-
this.applyPreselectedSubtitles();
|
|
51213
|
+
this.core.activeContainer.$el.append(this.$line);
|
|
51214
|
+
mediaControl.putElement('cc', this.el);
|
|
51215
|
+
this.updateSelection();
|
|
51174
51216
|
this.renderIcon();
|
|
51175
51217
|
return this;
|
|
51176
51218
|
}
|
|
51177
|
-
|
|
51178
|
-
this.tracks
|
|
51179
|
-
this.render();
|
|
51180
|
-
}
|
|
51181
|
-
findLevelBy(id) {
|
|
51182
|
-
if (this.tracks) {
|
|
51183
|
-
for (const track of this.tracks) {
|
|
51184
|
-
if (track.language === id) {
|
|
51185
|
-
return track; // TODO TrackInfo?
|
|
51186
|
-
}
|
|
51187
|
-
}
|
|
51188
|
-
}
|
|
51219
|
+
findById(id) {
|
|
51220
|
+
return this.tracks.find((track) => track.id === id) ?? null;
|
|
51189
51221
|
}
|
|
51190
|
-
|
|
51222
|
+
selectItem(item) {
|
|
51191
51223
|
this.clearSubtitleText();
|
|
51192
|
-
this.track =
|
|
51193
|
-
this.
|
|
51194
|
-
|
|
51195
|
-
|
|
51196
|
-
|
|
51197
|
-
|
|
51198
|
-
|
|
51199
|
-
|
|
51200
|
-
|
|
51201
|
-
if (id) {
|
|
51202
|
-
localStorage.setItem(LOCAL_STORAGE_SUBTITLES_ID, id);
|
|
51203
|
-
this.selectLevel(id);
|
|
51204
|
-
}
|
|
51224
|
+
this.track = item;
|
|
51225
|
+
this.hideMenu();
|
|
51226
|
+
this.updateSelection();
|
|
51227
|
+
}
|
|
51228
|
+
onItemSelect(event) {
|
|
51229
|
+
const id = event.target.dataset.ccSelect ?? '-1';
|
|
51230
|
+
trace(`${T$2} onItemSelect`, { id });
|
|
51231
|
+
localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
|
|
51232
|
+
this.selectItem(this.findById(Number(id)));
|
|
51205
51233
|
return false;
|
|
51206
51234
|
}
|
|
51207
51235
|
applyPreselectedSubtitles() {
|
|
51208
51236
|
if (!this.isPreselectedApplied) {
|
|
51209
51237
|
this.isPreselectedApplied = true;
|
|
51238
|
+
if (!this.preselectedLanguage) {
|
|
51239
|
+
return;
|
|
51240
|
+
}
|
|
51210
51241
|
setTimeout(() => {
|
|
51211
|
-
this.
|
|
51212
|
-
}, 300);
|
|
51242
|
+
this.selectItem(this.tracks.find((t) => t.track.language === this.preselectedLanguage) ?? null);
|
|
51243
|
+
}, 300); // TODO why delay?
|
|
51213
51244
|
}
|
|
51214
51245
|
}
|
|
51215
|
-
|
|
51216
|
-
|
|
51217
|
-
this.toggleContextMenu();
|
|
51218
|
-
}
|
|
51219
|
-
hideSelectLevelMenu() {
|
|
51220
|
-
this.$('[data-subtitles] ul').hide();
|
|
51246
|
+
hideMenu() {
|
|
51247
|
+
this.$('[data-cc] ul').hide();
|
|
51221
51248
|
}
|
|
51222
|
-
|
|
51223
|
-
|
|
51249
|
+
toggleMenu() {
|
|
51250
|
+
trace(`${T$2} toggleMenu`);
|
|
51251
|
+
this.$('[data-cc] ul').toggle();
|
|
51224
51252
|
}
|
|
51225
|
-
|
|
51226
|
-
return this.$(
|
|
51253
|
+
itemElement(id) {
|
|
51254
|
+
return this.$(`ul li a[data-cc-select="${id}"]`).parent();
|
|
51227
51255
|
}
|
|
51228
|
-
|
|
51229
|
-
return this.$('[data-
|
|
51230
|
-
}
|
|
51231
|
-
startLevelSwitch() {
|
|
51232
|
-
this.buttonElement().addClass('changing');
|
|
51233
|
-
}
|
|
51234
|
-
stopLevelSwitch() {
|
|
51235
|
-
this.buttonElement().removeClass('changing');
|
|
51256
|
+
allItemElements() {
|
|
51257
|
+
return this.$('[data-cc] li');
|
|
51236
51258
|
}
|
|
51237
51259
|
selectSubtitles() {
|
|
51238
|
-
|
|
51239
|
-
|
|
51240
|
-
|
|
51241
|
-
|
|
51242
|
-
|
|
51243
|
-
|
|
51244
|
-
|
|
51245
|
-
|
|
51246
|
-
|
|
51247
|
-
|
|
51248
|
-
|
|
51249
|
-
if (cues && cues.length) {
|
|
51250
|
-
for (const cue of cues) {
|
|
51251
|
-
if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
|
|
51252
|
-
subtitleText +=
|
|
51253
|
-
cue.getCueAsHTML().textContent + '\n';
|
|
51254
|
-
}
|
|
51255
|
-
}
|
|
51256
|
-
}
|
|
51257
|
-
this.setSubtitleText(subtitleText);
|
|
51258
|
-
track.oncuechange = (e) => {
|
|
51259
|
-
try {
|
|
51260
|
-
if (track.activeCues?.length) {
|
|
51261
|
-
const html = track.activeCues[0].getCueAsHTML();
|
|
51262
|
-
this.setSubtitleText(html);
|
|
51263
|
-
}
|
|
51264
|
-
else {
|
|
51265
|
-
this.clearSubtitleText();
|
|
51266
|
-
}
|
|
51267
|
-
}
|
|
51268
|
-
catch (error) {
|
|
51269
|
-
// console.error(error);
|
|
51270
|
-
reportError(error);
|
|
51271
|
-
}
|
|
51272
|
-
};
|
|
51273
|
-
continue;
|
|
51260
|
+
const trackId = this.track ? this.track.id : -1;
|
|
51261
|
+
this.core.activePlayback.closedCaptionsTrackId = trackId;
|
|
51262
|
+
}
|
|
51263
|
+
getSubtitleText(track) {
|
|
51264
|
+
const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
|
|
51265
|
+
const cues = track.cues;
|
|
51266
|
+
const lines = [];
|
|
51267
|
+
if (cues && cues.length) {
|
|
51268
|
+
for (const cue of cues) {
|
|
51269
|
+
if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
|
|
51270
|
+
lines.push(cue.getCueAsHTML().textContent);
|
|
51274
51271
|
}
|
|
51275
|
-
this.tracks[i].oncuechange = null;
|
|
51276
|
-
this.tracks[i].mode = 'hidden';
|
|
51277
51272
|
}
|
|
51278
51273
|
}
|
|
51274
|
+
return lines.join('\n');
|
|
51279
51275
|
}
|
|
51280
51276
|
setSubtitleText(text) {
|
|
51281
|
-
this.$
|
|
51277
|
+
this.$line.find('p').html(text);
|
|
51282
51278
|
}
|
|
51283
51279
|
clearSubtitleText() {
|
|
51284
51280
|
this.setSubtitleText('');
|
|
51285
51281
|
}
|
|
51286
|
-
|
|
51287
|
-
this.
|
|
51288
|
-
if (track.language === 'off') {
|
|
51282
|
+
updateSelection() {
|
|
51283
|
+
if (!this.track) {
|
|
51289
51284
|
this.hide();
|
|
51290
51285
|
}
|
|
51291
51286
|
else {
|
|
@@ -51295,21 +51290,22 @@ class Subtitles extends UICorePlugin {
|
|
|
51295
51290
|
this.highlightCurrentSubtitles();
|
|
51296
51291
|
}
|
|
51297
51292
|
highlightCurrentSubtitles() {
|
|
51298
|
-
this.
|
|
51299
|
-
|
|
51300
|
-
|
|
51301
|
-
|
|
51302
|
-
|
|
51303
|
-
|
|
51304
|
-
}
|
|
51293
|
+
this.allItemElements()
|
|
51294
|
+
.removeClass('current')
|
|
51295
|
+
.find('a')
|
|
51296
|
+
.removeClass('gcore-skin-active');
|
|
51297
|
+
trace(`${T$2} highlightCurrentSubtitles`, {
|
|
51298
|
+
track: this.track?.id,
|
|
51299
|
+
});
|
|
51300
|
+
const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
|
|
51301
|
+
currentLevelElement
|
|
51302
|
+
.addClass('current')
|
|
51303
|
+
.find('a')
|
|
51304
|
+
.addClass('gcore-skin-active');
|
|
51305
51305
|
}
|
|
51306
51306
|
renderIcon() {
|
|
51307
51307
|
const icon = this.isShowing ? subtitlesOnIcon : subtitlesOffIcon;
|
|
51308
|
-
this.
|
|
51309
|
-
.getPlugin('media_control')
|
|
51310
|
-
.getElement('subtitlesSelector')
|
|
51311
|
-
?.find('span.subtitle-text')
|
|
51312
|
-
.html(icon);
|
|
51308
|
+
this.$el.find('span.cc-text').html(icon);
|
|
51313
51309
|
}
|
|
51314
51310
|
}
|
|
51315
51311
|
|
|
@@ -52153,4 +52149,4 @@ class VolumeFade extends UICorePlugin {
|
|
|
52153
52149
|
}
|
|
52154
52150
|
}
|
|
52155
52151
|
|
|
52156
|
-
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 };
|
|
52152
|
+
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 };
|