@gcorevideo/player 2.20.21 → 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.
Files changed (76) hide show
  1. package/assets/audio-selector/style.scss +48 -82
  2. package/assets/audio-selector/track-selector.ejs +3 -3
  3. package/assets/bottom-gear/bottomgear.ejs +10 -12
  4. package/assets/bottom-gear/gear-sub-menu.scss +0 -15
  5. package/assets/bottom-gear/gear.scss +3 -32
  6. package/assets/media-control/media-control.ejs +5 -20
  7. package/assets/media-control/media-control.scss +124 -34
  8. package/assets/media-control/width370.scss +32 -104
  9. package/assets/picture-in-picture/button.ejs +1 -1
  10. package/assets/picture-in-picture/button.scss +5 -4
  11. package/dist/core.js +151 -24
  12. package/dist/index.css +1063 -1149
  13. package/dist/index.js +287 -283
  14. package/dist/player.d.ts +19 -16
  15. package/dist/plugins/index.css +953 -1039
  16. package/dist/plugins/index.js +709 -23402
  17. package/docs/api/player.audioselector.md +4 -59
  18. package/docs/api/player.md +1 -1
  19. package/docs/api/player.mediacontrol.getelement.md +5 -0
  20. package/docs/api/player.mediacontrol.md +14 -0
  21. package/docs/api/{player.audioselector.updatecurrenttrack.md → player.mediacontrol.putelement.md} +7 -7
  22. package/docs/api/player.mediacontrolelement.md +1 -1
  23. package/docs/api/{player.audioselector.starttrackswitch.md → player.pictureinpicture.attributes.md} +5 -7
  24. package/docs/api/player.pictureinpicture.md +45 -0
  25. package/lib/playback/BasePlayback.d.ts +0 -1
  26. package/lib/playback/BasePlayback.d.ts.map +1 -1
  27. package/lib/playback/BasePlayback.js +0 -1
  28. package/lib/playback/HTML5Video.d.ts +4 -0
  29. package/lib/playback/HTML5Video.d.ts.map +1 -1
  30. package/lib/playback/HTML5Video.js +57 -6
  31. package/lib/playback/dash-playback/DashPlayback.d.ts +5 -0
  32. package/lib/playback/dash-playback/DashPlayback.d.ts.map +1 -1
  33. package/lib/playback/dash-playback/DashPlayback.js +48 -4
  34. package/lib/playback/hls-playback/HlsPlayback.d.ts +31 -25
  35. package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
  36. package/lib/playback/hls-playback/HlsPlayback.js +47 -14
  37. package/lib/plugins/audio-selector/AudioSelector.d.ts +12 -11
  38. package/lib/plugins/audio-selector/AudioSelector.d.ts.map +1 -1
  39. package/lib/plugins/audio-selector/AudioSelector.js +65 -185
  40. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
  41. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  42. package/lib/plugins/bottom-gear/BottomGear.js +10 -9
  43. package/lib/plugins/level-selector/LevelSelector.js +1 -1
  44. package/lib/plugins/media-control/MediaControl.d.ts +3 -3
  45. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  46. package/lib/plugins/media-control/MediaControl.js +17 -9
  47. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts +3 -0
  48. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
  49. package/lib/plugins/picture-in-picture/PictureInPicture.js +6 -1
  50. package/lib/plugins/source-controller/SourceController.d.ts.map +1 -1
  51. package/lib/plugins/source-controller/SourceController.js +0 -1
  52. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +0 -2
  53. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
  54. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +1 -18
  55. package/lib/testUtils.d.ts.map +1 -1
  56. package/lib/testUtils.js +2 -0
  57. package/package.json +1 -1
  58. package/src/playback/BasePlayback.ts +0 -1
  59. package/src/playback/HTML5Video.ts +61 -6
  60. package/src/playback/dash-playback/DashPlayback.ts +64 -6
  61. package/src/playback/hls-playback/HlsPlayback.ts +82 -40
  62. package/src/plugins/audio-selector/AudioSelector.ts +84 -278
  63. package/src/plugins/bottom-gear/BottomGear.ts +11 -10
  64. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -3
  65. package/src/plugins/bottom-gear/__tests__/__snapshots__/BottomGear.test.ts.snap +14 -37
  66. package/src/plugins/level-selector/LevelSelector.ts +1 -1
  67. package/src/plugins/media-control/MediaControl.ts +18 -13
  68. package/src/plugins/picture-in-picture/PictureInPicture.ts +7 -1
  69. package/src/plugins/source-controller/SourceController.ts +0 -1
  70. package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +1 -20
  71. package/src/testUtils.ts +2 -0
  72. package/src/typings/globals.d.ts +19 -0
  73. package/temp/player.api.json +102 -143
  74. package/tsconfig.tsbuildinfo +1 -1
  75. package/assets/media-control/plugins.scss +0 -94
  76. 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' | 'bottomGear' | 'clipText' | 'gear' | 'pip' | 'playbackRate' | 'seekBarContainer' | 'subtitlesSelector';
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":"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"}
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 this.$audioTracksSelector;
809
+ return null;
814
810
  case 'clipText':
815
811
  return this.$clipText;
816
- case 'bottomGear':
817
812
  case 'gear':
818
- return this.$bottomGear;
813
+ return null;
819
814
  case 'pip':
820
- return this.$pip;
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
@@ -31,6 +31,9 @@ export declare class PictureInPicture extends UICorePlugin {
31
31
  get events(): {
32
32
  'click button': string;
33
33
  };
34
+ get attributes(): {
35
+ class: string;
36
+ };
34
37
  private get videoElement();
35
38
  /**
36
39
  * @internal
@@ -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.getElement('pip')?.html(this.el);
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;IAMnB,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"}
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;IAE5B,OAAO,CAAC,YAAY,CAAQ;gBAEhB,SAAS,EAAE,SAAS;IAmBzB,WAAW;IAIlB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,OAAO;IAgBf;;;;OAIG;IACH,IAAI,CAAC,KAAK,SAAM;IAMhB;;OAEG;IACH,IAAI;IAKJ,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,KAAK;IAeb;;OAEG;IACM,MAAM;CAoBhB"}
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 (showOnStart || this.container.buffering) {
148
+ if (this.container.buffering) {
166
149
  this._show();
167
150
  }
168
151
  else {
@@ -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,gBAmB/C"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "2.20.21",
3
+ "version": "2.21.1",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -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) {
@@ -1,10 +1,11 @@
1
- import { PlayerError } from '@clappr/core'
1
+ import { PlayerError, Events as ClapprEvents } from '@clappr/core'
2
2
  import { ErrorOptions } from '@clappr/core'
3
3
 
4
4
  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 })
@@ -66,12 +63,14 @@ export default class HTML5Video extends BasePlayback {
66
63
  ended: this.ended,
67
64
  })
68
65
  this.stallTimerId = null
69
- this.createError({
66
+ const error = this.createError({
70
67
  code: PlaybackErrorCode.MediaSourceUnavailable,
71
68
  level: PlayerError.Levels.FATAL,
72
69
  message: 'Stall timeout',
73
70
  description: 'Playback stalled for too long',
74
71
  })
72
+ this.trigger(ClapprEvents.PLAYBACK_ERROR, error)
73
+ setTimeout(() => this.stop(), 0)
75
74
  }, STALL_TIMEOUT)
76
75
  }
77
76
  super._handleBufferingEvents()
@@ -94,4 +93,60 @@ export default class HTML5Video extends BasePlayback {
94
93
  this.stallTimerId = null
95
94
  }
96
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
+ }
97
152
  }
@@ -1,6 +1,7 @@
1
- // Copyright 2014 Globo.com Player authors. All rights reserved.
2
- // Use of this source code is governed by a BSD-style
3
- // license that can be found in the LICENSE file.
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(DASHJS.MediaPlayer.events.PLAYBACK_RATE_CHANGED, (e: DASHJS.PlaybackRateChangedEvent) => {
304
- this.trigger(PlaybackEvents.PLAYBACK_RATE_CHANGED, e.playbackRate)
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
+ }