@gcorevideo/player 2.20.22 → 2.21.1
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 +48 -82
- package/assets/audio-selector/track-selector.ejs +3 -3
- package/assets/bottom-gear/bottomgear.ejs +10 -12
- package/assets/bottom-gear/gear-sub-menu.scss +0 -15
- package/assets/bottom-gear/gear.scss +3 -32
- package/assets/media-control/media-control.ejs +5 -20
- package/assets/media-control/media-control.scss +124 -34
- package/assets/media-control/width370.scss +32 -104
- package/assets/picture-in-picture/button.ejs +1 -1
- package/assets/picture-in-picture/button.scss +5 -4
- package/dist/core.js +148 -23
- package/dist/index.css +530 -616
- package/dist/index.js +284 -282
- package/dist/player.d.ts +19 -16
- package/dist/plugins/index.css +1009 -1095
- package/dist/plugins/index.js +709 -23402
- package/docs/api/player.audioselector.md +4 -59
- package/docs/api/player.md +1 -1
- package/docs/api/player.mediacontrol.getelement.md +5 -0
- package/docs/api/player.mediacontrol.md +14 -0
- package/docs/api/{player.audioselector.updatecurrenttrack.md → player.mediacontrol.putelement.md} +7 -7
- package/docs/api/player.mediacontrolelement.md +1 -1
- package/docs/api/{player.audioselector.starttrackswitch.md → player.pictureinpicture.attributes.md} +5 -7
- package/docs/api/player.pictureinpicture.md +45 -0
- package/lib/playback/BasePlayback.d.ts +0 -1
- package/lib/playback/BasePlayback.d.ts.map +1 -1
- package/lib/playback/BasePlayback.js +0 -1
- package/lib/playback/HTML5Video.d.ts +4 -0
- package/lib/playback/HTML5Video.d.ts.map +1 -1
- package/lib/playback/HTML5Video.js +53 -4
- package/lib/playback/dash-playback/DashPlayback.d.ts +5 -0
- package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
- package/lib/playback/dash-playback/DashPlayback.js +48 -4
- package/lib/playback/hls-playback/HlsPlayback.d.ts +31 -25
- package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/playback/hls-playback/HlsPlayback.js +47 -14
- package/lib/plugins/audio-selector/AudioSelector.d.ts +12 -11
- package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
- package/lib/plugins/audio-selector/AudioSelector.js +65 -185
- package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/bottom-gear/BottomGear.js +10 -9
- package/lib/plugins/level-selector/LevelSelector.js +1 -1
- package/lib/plugins/media-control/MediaControl.d.ts +3 -3
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +17 -9
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +3 -0
- package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
- package/lib/plugins/picture-in-picture/PictureInPicture.js +6 -1
- package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
- package/lib/plugins/source-controller/SourceController.js +0 -1
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +0 -2
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +1 -18
- package/lib/testUtils.d.ts.map +1 -1
- package/lib/testUtils.js +2 -0
- package/package.json +1 -1
- package/src/playback/BasePlayback.ts +0 -1
- package/src/playback/HTML5Video.ts +57 -4
- package/src/playback/dash-playback/DashPlayback.ts +64 -6
- package/src/playback/hls-playback/HlsPlayback.ts +82 -40
- package/src/plugins/audio-selector/AudioSelector.ts +84 -278
- package/src/plugins/bottom-gear/BottomGear.ts +11 -10
- package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -3
- package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +14 -37
- package/src/plugins/level-selector/LevelSelector.ts +1 -1
- package/src/plugins/media-control/MediaControl.ts +18 -13
- package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -1
- package/src/plugins/source-controller/SourceController.ts +0 -1
- package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +1 -20
- package/src/testUtils.ts +2 -0
- package/src/typings/globals.d.ts +19 -0
- package/temp/player.api.json +102 -143
- package/tsconfig.tsbuildinfo +1 -1
- package/assets/media-control/plugins.scss +0 -94
- package/docs/api/player.audioselector.highlightcurrenttrack.md +0 -18
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { UICorePlugin, Core } from '@clappr/core';
|
|
2
2
|
import { ZeptoResult } from '../../types.js';
|
|
3
3
|
import '../../../assets/media-control/media-control.scss';
|
|
4
|
-
import '../../../assets/media-control/plugins.scss';
|
|
5
4
|
/**
|
|
6
5
|
* Media control elements, mount points for additional plugins
|
|
7
6
|
* @beta
|
|
8
7
|
*/
|
|
9
|
-
export type MediaControlElement = 'audioTracksSelector' | '
|
|
8
|
+
export type MediaControlElement = 'audioTracksSelector' | 'clipText' | 'gear' | 'pip' | 'playbackRate' | 'seekBarContainer' | 'subtitlesSelector';
|
|
10
9
|
/**
|
|
11
10
|
* Custom events emitted by the plugins to communicate with one another
|
|
12
11
|
* @beta
|
|
@@ -51,7 +50,6 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
51
50
|
private userKeepVisible;
|
|
52
51
|
private verticalVolume;
|
|
53
52
|
private $audioTracksSelector;
|
|
54
|
-
private $bottomGear;
|
|
55
53
|
private $clipText;
|
|
56
54
|
private $clipTextContainer;
|
|
57
55
|
private $duration;
|
|
@@ -217,6 +215,7 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
217
215
|
* Get a media control element DOM node
|
|
218
216
|
* @param name - The name of the media control element
|
|
219
217
|
* @returns The DOM node to render to or extend
|
|
218
|
+
* @deprecated Use {@link MediaControl.putElement} instead
|
|
220
219
|
* @remarks
|
|
221
220
|
* Use this method to render custom media control UI in a plugin
|
|
222
221
|
* @example
|
|
@@ -232,6 +231,7 @@ export declare class MediaControl extends UICorePlugin {
|
|
|
232
231
|
* ```
|
|
233
232
|
*/
|
|
234
233
|
getElement(name: MediaControlElement): ZeptoResult | null;
|
|
234
|
+
putElement(name: MediaControlElement, element: ZeptoResult): void;
|
|
235
235
|
/**
|
|
236
236
|
* Get the right panel area to append custom elements to
|
|
237
237
|
* @returns ZeptoSelector of the right panel element
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,YAAY,EAMZ,IAAI,EACL,MAAM,cAAc,CAAA;AASrB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C,OAAO,kDAAkD,CAAA;
|
|
1
|
+
{"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,6 @@ import { Kibo } from '../kibo/index.js';
|
|
|
11
11
|
import { CLAPPR_VERSION } from '../../build.js';
|
|
12
12
|
import { getPageX, isFullscreen } from '../utils.js';
|
|
13
13
|
import '../../../assets/media-control/media-control.scss';
|
|
14
|
-
import '../../../assets/media-control/plugins.scss';
|
|
15
14
|
import mediaControlHTML from '../../../assets/media-control/media-control.ejs';
|
|
16
15
|
import playIcon from '../../../assets/icons/new/play.svg';
|
|
17
16
|
import pauseIcon from '../../../assets/icons/new/pause.svg';
|
|
@@ -81,7 +80,6 @@ export class MediaControl extends UICorePlugin {
|
|
|
81
80
|
userKeepVisible = false;
|
|
82
81
|
verticalVolume = false;
|
|
83
82
|
$audioTracksSelector = null;
|
|
84
|
-
$bottomGear = null;
|
|
85
83
|
$clipText = null;
|
|
86
84
|
$clipTextContainer = null;
|
|
87
85
|
$duration = null;
|
|
@@ -778,9 +776,6 @@ export class MediaControl extends UICorePlugin {
|
|
|
778
776
|
this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
|
|
779
777
|
this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
|
|
780
778
|
this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
|
|
781
|
-
this.$bottomGear = this.$el.find('.media-control-bottomgear');
|
|
782
|
-
this.$pip = this.$el.find('.media-control-pip');
|
|
783
|
-
this.$audioTracksSelector = this.$el.find('.media-control-audio-tracks[data-audiotracks]');
|
|
784
779
|
this.$subtitlesSelector = this.$el.find('.media-control-subtitles[data-subtitles]');
|
|
785
780
|
this.$playbackRate = this.$el.find('.media-control-playbackrate[data-playbackrate]');
|
|
786
781
|
this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
|
|
@@ -793,6 +788,7 @@ export class MediaControl extends UICorePlugin {
|
|
|
793
788
|
* Get a media control element DOM node
|
|
794
789
|
* @param name - The name of the media control element
|
|
795
790
|
* @returns The DOM node to render to or extend
|
|
791
|
+
* @deprecated Use {@link MediaControl.putElement} instead
|
|
796
792
|
* @remarks
|
|
797
793
|
* Use this method to render custom media control UI in a plugin
|
|
798
794
|
* @example
|
|
@@ -810,14 +806,13 @@ export class MediaControl extends UICorePlugin {
|
|
|
810
806
|
getElement(name) {
|
|
811
807
|
switch (name) {
|
|
812
808
|
case 'audioTracksSelector':
|
|
813
|
-
return
|
|
809
|
+
return null;
|
|
814
810
|
case 'clipText':
|
|
815
811
|
return this.$clipText;
|
|
816
|
-
case 'bottomGear':
|
|
817
812
|
case 'gear':
|
|
818
|
-
return
|
|
813
|
+
return null;
|
|
819
814
|
case 'pip':
|
|
820
|
-
return
|
|
815
|
+
return null;
|
|
821
816
|
case 'playbackRate':
|
|
822
817
|
return this.$playbackRate;
|
|
823
818
|
case 'seekBarContainer':
|
|
@@ -826,6 +821,19 @@ export class MediaControl extends UICorePlugin {
|
|
|
826
821
|
return this.$subtitlesSelector;
|
|
827
822
|
}
|
|
828
823
|
}
|
|
824
|
+
putElement(name, element) {
|
|
825
|
+
switch (name) {
|
|
826
|
+
case 'audioTracksSelector':
|
|
827
|
+
this.getRightPanel().append(element);
|
|
828
|
+
break;
|
|
829
|
+
case 'pip':
|
|
830
|
+
this.getRightPanel().append(element);
|
|
831
|
+
break;
|
|
832
|
+
case 'gear':
|
|
833
|
+
this.getRightPanel().append(element);
|
|
834
|
+
break;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
829
837
|
/**
|
|
830
838
|
* Get the right panel area to append custom elements to
|
|
831
839
|
* @returns ZeptoSelector of the right panel element
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;AAMxD;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACM,UAAU;IAInB,OAAO,CAAC,cAAc;IAStB;;OAEG;IACM,MAAM;IAiBf,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;CAI7B"}
|
|
1
|
+
{"version":3,"file":"PictureInPicture.d.ts","sourceRoot":"","sources":["../../../src/plugins/picture-in-picture/PictureInPicture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAO9D,OAAO,gDAAgD,CAAC;AAMxD;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED,IAAa,UAAU;;MAItB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACM,UAAU;IAInB,OAAO,CAAC,cAAc;IAStB;;OAEG;IACM,MAAM;IAiBf,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;CAI7B"}
|
|
@@ -43,6 +43,11 @@ export class PictureInPicture extends UICorePlugin {
|
|
|
43
43
|
'click button': 'togglePictureInPicture',
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
+
get attributes() {
|
|
47
|
+
return {
|
|
48
|
+
'class': 'media-control-pip',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
46
51
|
get videoElement() {
|
|
47
52
|
return this.core.activePlayback.el;
|
|
48
53
|
}
|
|
@@ -70,7 +75,7 @@ export class PictureInPicture extends UICorePlugin {
|
|
|
70
75
|
this.$el.html(t({ pipIcon }));
|
|
71
76
|
const mediaControl = this.core.getPlugin('media_control');
|
|
72
77
|
if (mediaControl) {
|
|
73
|
-
mediaControl.
|
|
78
|
+
mediaControl.putElement('pip', this.el);
|
|
74
79
|
}
|
|
75
80
|
return this;
|
|
76
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SourceController.d.ts","sourceRoot":"","sources":["../../../src/plugins/source-controller/SourceController.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,KAAK,IAAI,IAAI,UAAU,EACxB,MAAM,cAAc,CAAA;AAwBrB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAuC9C,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,IAAI,CAAiB;IAE7B;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;gBACS,IAAI,EAAE,UAAU;IAW5B;;OAEG;IACM,UAAU;IAWnB,OAAO,CAAC,WAAW;
|
|
1
|
+
{"version":3,"file":"SourceController.d.ts","sourceRoot":"","sources":["../../../src/plugins/source-controller/SourceController.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,KAAK,IAAI,IAAI,UAAU,EACxB,MAAM,cAAc,CAAA;AAwBrB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAuC9C,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,IAAI,CAAiB;IAE7B;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;gBACS,IAAI,EAAE,UAAU;IAW5B;;OAEG;IACM,UAAU;IAWnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,wBAAwB;IAoBhC,OAAO,CAAC,2BAA2B;IAwCnC,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;CACF"}
|
|
@@ -110,7 +110,6 @@ export class SourceController extends CorePlugin {
|
|
|
110
110
|
onCoreReady() {
|
|
111
111
|
trace(`${T} onCoreReady`);
|
|
112
112
|
this.core.getPlugin('error_screen')?.disable(); // TODO test
|
|
113
|
-
// this.core.getPlugin('spinner')?.showOnError()
|
|
114
113
|
}
|
|
115
114
|
onActiveContainerChanged() {
|
|
116
115
|
trace(`${T} onActiveContainerChanged`, {
|
|
@@ -42,9 +42,7 @@ export declare class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
42
42
|
private template;
|
|
43
43
|
private hasFatalError;
|
|
44
44
|
private hasBuffering;
|
|
45
|
-
private _showOnError;
|
|
46
45
|
constructor(container: Container);
|
|
47
|
-
showOnError(): void;
|
|
48
46
|
private onBuffering;
|
|
49
47
|
private onBufferFull;
|
|
50
48
|
private onPlay;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpinnerThreeBounce.d.ts","sourceRoot":"","sources":["../../../src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,SAAS,EAET,iBAAiB,EAElB,MAAM,cAAc,CAAA;AAKrB,OAAO,mDAAmD,CAAA;AAM1D;;;GAGG;AACH,oBAAY,aAAa;IACvB;;;OAGG;IACH,IAAI,yBAAyB;CAC9B;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;IACvD,OAAO,CAAC,SAAS,CAAQ;IAEzB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,QAAQ,CAAwB;IAExC,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO,CAAC,YAAY,CAAQ;
|
|
1
|
+
{"version":3,"file":"SpinnerThreeBounce.d.ts","sourceRoot":"","sources":["../../../src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,SAAS,EAET,iBAAiB,EAElB,MAAM,cAAc,CAAA;AAKrB,OAAO,mDAAmD,CAAA;AAM1D;;;GAGG;AACH,oBAAY,aAAa;IACvB;;;OAGG;IACH,IAAI,yBAAyB;CAC9B;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;IACvD,OAAO,CAAC,SAAS,CAAQ;IAEzB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,IAAa,UAAU;;;MAKtB;IAED,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,QAAQ,CAAwB;IAExC,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO,CAAC,YAAY,CAAQ;gBAEhB,SAAS,EAAE,SAAS;IAmBhC,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,OAAO;IAUf;;;;OAIG;IACH,IAAI,CAAC,KAAK,SAAM;IAMhB;;OAEG;IACH,IAAI;IAKJ,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,KAAK;IAeb;;OAEG;IACM,MAAM;CAiBhB"}
|
|
@@ -55,7 +55,6 @@ export class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
55
55
|
template = template(spinnerHTML);
|
|
56
56
|
hasFatalError = false;
|
|
57
57
|
hasBuffering = false;
|
|
58
|
-
_showOnError = false;
|
|
59
58
|
constructor(container) {
|
|
60
59
|
super(container);
|
|
61
60
|
this.listenTo(this.container, ClapprEvents.CONTAINER_STATE_BUFFERING, this.onBuffering);
|
|
@@ -66,9 +65,6 @@ export class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
66
65
|
this.listenTo(this.container, ClapprEvents.CONTAINER_ERROR, this.onError);
|
|
67
66
|
this.listenTo(this.container, ClapprEvents.CONTAINER_READY, this.render);
|
|
68
67
|
}
|
|
69
|
-
showOnError() {
|
|
70
|
-
this._showOnError = true;
|
|
71
|
-
}
|
|
72
68
|
onBuffering() {
|
|
73
69
|
this.hasBuffering = true;
|
|
74
70
|
this._show();
|
|
@@ -85,27 +81,17 @@ export class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
85
81
|
}
|
|
86
82
|
onStop() {
|
|
87
83
|
trace(`${T} onStop`, {
|
|
88
|
-
showOnError: this._showOnError,
|
|
89
84
|
hasFatalError: this.hasFatalError,
|
|
90
85
|
});
|
|
91
|
-
// if (!(this.hasFatalError && this._showOnError)) {
|
|
92
|
-
// this._hide()
|
|
93
|
-
// }
|
|
94
86
|
this._hide();
|
|
95
87
|
}
|
|
96
88
|
onError(e) {
|
|
97
89
|
this.hasFatalError = e.code === PlaybackErrorCode.MediaSourceUnavailable;
|
|
98
90
|
trace(`${T} onError`, {
|
|
99
91
|
e,
|
|
100
|
-
showOnError: this._showOnError,
|
|
101
92
|
hasFatalError: this.hasFatalError,
|
|
102
93
|
error: e.code,
|
|
103
94
|
});
|
|
104
|
-
// if (this._showOnError) {
|
|
105
|
-
// this._show()
|
|
106
|
-
// } else {
|
|
107
|
-
// this._hide()
|
|
108
|
-
// }
|
|
109
95
|
this._hide();
|
|
110
96
|
}
|
|
111
97
|
/**
|
|
@@ -151,18 +137,15 @@ export class SpinnerThreeBounce extends UIContainerPlugin {
|
|
|
151
137
|
* @internal
|
|
152
138
|
*/
|
|
153
139
|
render() {
|
|
154
|
-
// TODO control via sourcecontroller instead
|
|
155
|
-
const showOnStart = this.options.spinner?.showOnStart;
|
|
156
140
|
trace(`${T} render`, {
|
|
157
141
|
buffering: this.container.buffering,
|
|
158
|
-
showOnStart,
|
|
159
142
|
});
|
|
160
143
|
this.$el.html(this.template());
|
|
161
144
|
this.el.firstElementChild?.addEventListener('animationiteration', () => {
|
|
162
145
|
this.trigger(SpinnerEvents.SYNC);
|
|
163
146
|
});
|
|
164
147
|
this.container.$el.append(this.$el[0]);
|
|
165
|
-
if (
|
|
148
|
+
if (this.container.buffering) {
|
|
166
149
|
this._show();
|
|
167
150
|
}
|
|
168
151
|
else {
|
package/lib/testUtils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAElC;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,MAAM;IAErC,SAAS,CAAC,OAAO,EAAE,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,GAAG;IAClB,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG;gBAFjB,OAAO,EAAE,GAAG,EACb,IAAI,EAAE,GAAG,EACR,WAAW,CAAC,EAAE,GAAG,YAAA;IAK7B,IAAI,IAAI,WAEP;IAED,OAAO;IAEP,IAAI;IAEJ,KAAK;IAEL,IAAI;IAEJ,OAAO;IAEP,IAAI;IAEJ,cAAc;IAEd,WAAW;IAIX,QAAQ;IAER,OAAO;IAEP,eAAe;IAIf,kBAAkB;IAIlB,cAAc;IAId,qBAAqB;IAIrB,IAAI;IAEJ,MAAM;IAEN,MAAM;IAEN,SAAS;IAET,eAAe;IAIf,WAAW;IAIX,QAAQ;IAIR,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGtC;AAED,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAA2B;;;;;;;;;;;;;;;;EAqBvC;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;mBA2C7B,MAAM,WAAW,GAAG,EAAE;EAIxC;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,GAA0B;;;;;;;;;;EAcvE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,MAAM,MAAM,eAAe,CAAA;AAElC;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,MAAM;IAErC,SAAS,CAAC,OAAO,EAAE,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,GAAG;IAClB,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG;gBAFjB,OAAO,EAAE,GAAG,EACb,IAAI,EAAE,GAAG,EACR,WAAW,CAAC,EAAE,GAAG,YAAA;IAK7B,IAAI,IAAI,WAEP;IAED,OAAO;IAEP,IAAI;IAEJ,KAAK;IAEL,IAAI;IAEJ,OAAO;IAEP,IAAI;IAEJ,cAAc;IAEd,WAAW;IAIX,QAAQ;IAER,OAAO;IAEP,eAAe;IAIf,kBAAkB;IAIlB,cAAc;IAId,qBAAqB;IAIrB,IAAI;IAEJ,MAAM;IAEN,MAAM;IAEN,SAAS;IAET,eAAe;IAIf,WAAW;IAIX,QAAQ;IAIR,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGtC;AAED,wBAAgB,cAAc,CAC5B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,SAAS,GAAE,GAA2B;;;;;;;;;;;;;;;;EAqBvC;AAED,wBAAgB,gBAAgB;;;EAK/B;AAED,wBAAgB,mBAAmB;;;;;;EAKlC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;mBA2C7B,MAAM,WAAW,GAAG,EAAE;EAIxC;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,GAA0B;;;;;;;;;;EAcvE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,gBAqB/C"}
|
package/lib/testUtils.js
CHANGED
|
@@ -167,6 +167,8 @@ export function createMockMediaControl(core) {
|
|
|
167
167
|
// @ts-ignore
|
|
168
168
|
mediaControl.getElement = vi.fn().mockImplementation((name) => elements[name]);
|
|
169
169
|
// @ts-ignore
|
|
170
|
+
mediaControl.putElement = vi.fn();
|
|
171
|
+
// @ts-ignore
|
|
170
172
|
mediaControl.getLeftPanel = vi.fn().mockImplementation(() => mediaControl.$el.find('.media-control-left-panel'));
|
|
171
173
|
// @ts-ignore
|
|
172
174
|
mediaControl.getRightPanel = vi.fn().mockImplementation(() => mediaControl.$el.find('.media-control-right-panel'));
|
package/package.json
CHANGED
|
@@ -5,7 +5,6 @@ import { PlaybackErrorCode } from '../playback.types.js'
|
|
|
5
5
|
/**
|
|
6
6
|
* This class adds common behaviors to all playback modules.
|
|
7
7
|
* @internal
|
|
8
|
-
* TODO use custom HTML5Video playback with this layer applied
|
|
9
8
|
*/
|
|
10
9
|
export class BasePlayback extends HTML5Video {
|
|
11
10
|
createError(errorData: any, options?: ErrorOptions) {
|
|
@@ -5,6 +5,7 @@ import { PlaybackErrorCode } from '../playback.types.js'
|
|
|
5
5
|
import { BasePlayback } from './BasePlayback.js'
|
|
6
6
|
import { trace } from '@gcorevideo/utils'
|
|
7
7
|
import { TimerId } from '../utils/types.js'
|
|
8
|
+
import { AudioTrack } from '@clappr/core/types/base/playback/playback.js'
|
|
8
9
|
|
|
9
10
|
const T = 'playback.html5_video'
|
|
10
11
|
|
|
@@ -32,10 +33,6 @@ export default class HTML5Video extends BasePlayback {
|
|
|
32
33
|
!errorData.UI &&
|
|
33
34
|
errorData.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED
|
|
34
35
|
) {
|
|
35
|
-
// errorData.UI = {
|
|
36
|
-
// title: i18n.t('no_broadcast'),
|
|
37
|
-
// message: errorData.message,
|
|
38
|
-
// }
|
|
39
36
|
errorData.code = PlaybackErrorCode.MediaSourceUnavailable
|
|
40
37
|
}
|
|
41
38
|
return super.createError(errorData, { ...options, useCodePrefix: false })
|
|
@@ -96,4 +93,60 @@ export default class HTML5Video extends BasePlayback {
|
|
|
96
93
|
this.stallTimerId = null
|
|
97
94
|
}
|
|
98
95
|
}
|
|
96
|
+
|
|
97
|
+
get audioTracks(): AudioTrack[] {
|
|
98
|
+
const tracks = (this.el as HTMLMediaElement).audioTracks
|
|
99
|
+
const supported = !!tracks
|
|
100
|
+
trace(`${T} get audioTracks`, { supported })
|
|
101
|
+
const retval: AudioTrack[] = []
|
|
102
|
+
if (supported) {
|
|
103
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
104
|
+
const track = tracks[i]
|
|
105
|
+
retval.push({
|
|
106
|
+
id: track.id,
|
|
107
|
+
label: track.label,
|
|
108
|
+
language: track.language,
|
|
109
|
+
kind: track.kind as 'main' | 'description', // TODO check
|
|
110
|
+
} as AudioTrack)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return retval
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// @ts-expect-error
|
|
117
|
+
get currentAudioTrack() {
|
|
118
|
+
const tracks = (this.el as HTMLMediaElement).audioTracks
|
|
119
|
+
const supported = !!tracks
|
|
120
|
+
trace(`${T} get currentAudioTrack`, {
|
|
121
|
+
supported,
|
|
122
|
+
})
|
|
123
|
+
if (supported) {
|
|
124
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
125
|
+
const track = tracks[i]
|
|
126
|
+
if (track.enabled) {
|
|
127
|
+
return {
|
|
128
|
+
id: track.id,
|
|
129
|
+
label: track.label,
|
|
130
|
+
language: track.language,
|
|
131
|
+
kind: track.kind,
|
|
132
|
+
} as AudioTrack
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return null
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
switchAudioTrack(id: string) {
|
|
140
|
+
const tracks = (this.el as HTMLMediaElement).audioTracks
|
|
141
|
+
const supported = !!tracks
|
|
142
|
+
trace(`${T} switchAudioTrack`, {
|
|
143
|
+
supported,
|
|
144
|
+
})
|
|
145
|
+
if (supported) {
|
|
146
|
+
for (let i = 0; i < tracks.length; i++) {
|
|
147
|
+
const track = tracks[i]
|
|
148
|
+
track.enabled = track.id === id
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
99
152
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// license
|
|
1
|
+
// This code is derived on works by Globo.com.
|
|
2
|
+
// This code is distributed under the terms of the Apache License 2.0.
|
|
3
|
+
// Original code's license can be found on
|
|
4
|
+
// https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
|
|
4
5
|
|
|
5
6
|
import { Events, Log, Playback, PlayerError, Utils, $ } from '@clappr/core'
|
|
6
7
|
import { trace } from '@gcorevideo/utils'
|
|
@@ -25,6 +26,7 @@ import {
|
|
|
25
26
|
import { isDashSource } from '../../utils/mediaSources.js'
|
|
26
27
|
import { BasePlayback } from '../BasePlayback.js'
|
|
27
28
|
import { PlaybackEvents } from '../types.js'
|
|
29
|
+
import { AudioTrack } from '@clappr/core/types/base/playback/playback.js'
|
|
28
30
|
|
|
29
31
|
const AUTO = -1
|
|
30
32
|
|
|
@@ -45,7 +47,6 @@ type LocalTimeCorrelation = {
|
|
|
45
47
|
|
|
46
48
|
const T = 'playback.dash'
|
|
47
49
|
|
|
48
|
-
// @ts-expect-error
|
|
49
50
|
export default class DashPlayback extends BasePlayback {
|
|
50
51
|
_levels: QualityLevel[] | null = null
|
|
51
52
|
|
|
@@ -271,6 +272,8 @@ export default class DashPlayback extends BasePlayback {
|
|
|
271
272
|
const newLevel = this.getLevel(evt.newQuality)
|
|
272
273
|
this.onLevelSwitch(newLevel)
|
|
273
274
|
})
|
|
275
|
+
|
|
276
|
+
this.checkAudioTracks()
|
|
274
277
|
})
|
|
275
278
|
|
|
276
279
|
this._dash.on(
|
|
@@ -300,8 +303,20 @@ export default class DashPlayback extends BasePlayback {
|
|
|
300
303
|
},
|
|
301
304
|
)
|
|
302
305
|
|
|
303
|
-
this._dash.on(
|
|
304
|
-
|
|
306
|
+
this._dash.on(
|
|
307
|
+
DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED,
|
|
308
|
+
(e: DASHJS.PlaybackRateChangedEvent) => {
|
|
309
|
+
this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate)
|
|
310
|
+
},
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
this._dash.on(DASHJS.MediaPlayer.events.TRACK_CHANGE_RENDERED, (e: any) => {
|
|
314
|
+
if ((e as DASHJS.TrackChangeRenderedEvent).mediaType === 'audio') {
|
|
315
|
+
this.trigger(
|
|
316
|
+
Events.PLAYBACK_AUDIO_CHANGED,
|
|
317
|
+
toClapprTrack(e.newMediaInfo),
|
|
318
|
+
)
|
|
319
|
+
}
|
|
305
320
|
})
|
|
306
321
|
}
|
|
307
322
|
|
|
@@ -642,6 +657,40 @@ export default class DashPlayback extends BasePlayback {
|
|
|
642
657
|
setPlaybackRate(rate: number) {
|
|
643
658
|
this._dash?.setPlaybackRate(rate)
|
|
644
659
|
}
|
|
660
|
+
|
|
661
|
+
get audioTracks(): AudioTrack[] {
|
|
662
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized')
|
|
663
|
+
const tracks = this._dash.getTracksFor('audio')
|
|
664
|
+
trace(`${T} get audioTracks`, { tracks })
|
|
665
|
+
return tracks.map(toClapprTrack)
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// @ts-expect-error
|
|
669
|
+
get currentAudioTrack(): AudioTrack | null {
|
|
670
|
+
trace(`${T} get currentAudioTrack`)
|
|
671
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized')
|
|
672
|
+
const t = this._dash.getCurrentTrackFor('audio')
|
|
673
|
+
if (!t) {
|
|
674
|
+
return null
|
|
675
|
+
}
|
|
676
|
+
return toClapprTrack(t)
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
switchAudioTrack(id: string): void {
|
|
680
|
+
assert.ok(this._dash, 'DASH.js MediaPlayer is not initialized')
|
|
681
|
+
const tracks = this._dash.getTracksFor('audio')
|
|
682
|
+
const track = tracks.find((t) => t.id === id)
|
|
683
|
+
assert.ok(track, 'Invalid audio track ID')
|
|
684
|
+
this._dash.setCurrentTrack(track)
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
private checkAudioTracks() {
|
|
688
|
+
// @ts-ignore
|
|
689
|
+
const tracks = this._dash.getTracksFor('audio')
|
|
690
|
+
if (tracks.length) {
|
|
691
|
+
this.trigger(Events.PLAYBACK_AUDIO_AVAILABLE, tracks.map(toClapprTrack))
|
|
692
|
+
}
|
|
693
|
+
}
|
|
645
694
|
}
|
|
646
695
|
|
|
647
696
|
DashPlayback.canPlay = function (resource, mimeType) {
|
|
@@ -656,3 +705,12 @@ DashPlayback.canPlay = function (resource, mimeType) {
|
|
|
656
705
|
const ctor = ms || mms || wms
|
|
657
706
|
return typeof ctor === 'function'
|
|
658
707
|
}
|
|
708
|
+
|
|
709
|
+
function toClapprTrack(t: DASHJS.MediaInfo): AudioTrack {
|
|
710
|
+
return {
|
|
711
|
+
id: t.id,
|
|
712
|
+
kind: t.roles && t.roles?.length > 0 ? t.roles[0] : 'main', // TODO
|
|
713
|
+
label: t.labels.map((l) => l.text).join(' '), // TODO
|
|
714
|
+
language: t.lang,
|
|
715
|
+
} as AudioTrack
|
|
716
|
+
}
|