@gcorevideo/player 0.0.4 → 0.1.0

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/lib/Player.d.ts CHANGED
@@ -9,6 +9,13 @@ export declare enum PlayerEvent {
9
9
  Ended = "ended"
10
10
  }
11
11
  type PlayerEventHandler<T extends PlayerEvent> = () => void;
12
+ export type PlaybackModule = 'dash' | 'hls' | 'native';
13
+ type BitrateInfo = {
14
+ height: number;
15
+ width: number;
16
+ bitrate: number;
17
+ level: number;
18
+ };
12
19
  /**
13
20
  * @beta
14
21
  */
@@ -21,6 +28,10 @@ export declare class Player {
21
28
  private tuneInEntered;
22
29
  private supportedMediaTransports;
23
30
  private config;
31
+ private bitrateInfo;
32
+ get playbackModule(): PlaybackModule | null;
33
+ get bitrate(): BitrateInfo | null;
34
+ get hd(): any;
24
35
  get playing(): boolean;
25
36
  get ready(): boolean;
26
37
  constructor(config: PlayerConfig);
@@ -45,6 +56,7 @@ export declare class Player {
45
56
  private getAvailableTransportsPreference;
46
57
  private checkMediaTransportsSupport;
47
58
  private processMultisources;
59
+ private bindBitrateChangeHandler;
48
60
  }
49
61
  export {};
50
62
  //# sourceMappingURL=Player.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAWA,OAAO,2BAA2B,CAAC;AAQnC,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EAGb,MAAM,YAAY,CAAC;AAEpB,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAID,KAAK,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAC;AAY5D;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAmB;IAElC,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO,CAAC,aAAa,CAAkC;IAEvD,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,KAAK,CAA8C;IAE3D,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,wBAAwB,CAAwB;IAExD,OAAO,CAAC,MAAM,CAAe;IAE7B,IAAI,OAAO,YAEV;IAED,IAAI,KAAK,YAER;gBAGC,MAAM,EAAE,YAAY;IAKtB,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIlE,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAI7D,IAAI,CAAC,aAAa,EAAE,WAAW;IA6BrC,OAAO;IAQP,KAAK;IAKL,IAAI;IAKJ,MAAM,CAAC,IAAI,EAAE,MAAM;IAKnB,IAAI;IAKJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY;IAI1C,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;YA0BJ,MAAM;IA4BpB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,MAAM,CA8CZ;IAEF,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,gCAAgC;IAaxC,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,mBAAmB;CAM5B"}
1
+ {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"AAYA,OAAO,2BAA2B,CAAC;AAQnC,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EAGb,MAAM,YAAY,CAAC;AAKpB,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAID,KAAK,kBAAkB,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,IAAI,CAAC;AAU5D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AASvD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAA;AAID;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAmB;IAElC,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO,CAAC,aAAa,CAAkC;IAEvD,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,KAAK,CAA8C;IAE3D,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,wBAAwB,CAAwB;IAExD,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,WAAW,CAA4B;IAE/C,IAAI,cAAc,IAAI,cAAc,GAAG,IAAI,CAY1C;IAED,IAAI,OAAO,IAAI,WAAW,GAAG,IAAI,CAEhC;IAED,IAAI,EAAE,QAEL;IAED,IAAI,OAAO,YAEV;IAED,IAAI,KAAK,YAER;gBAGC,MAAM,EAAE,YAAY;IAKtB,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAIlE,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAI7D,IAAI,CAAC,aAAa,EAAE,WAAW;IA4BrC,OAAO;IAQP,KAAK;IAKL,IAAI;IAKJ,MAAM,CAAC,IAAI,EAAE,MAAM;IAKnB,IAAI;IAKJ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY;IAI1C,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;YA0BJ,MAAM;IAwCpB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,MAAM,CA6CZ;IAEF,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,gCAAgC;IAaxC,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,wBAAwB;CAOjC"}
package/lib/Player.js CHANGED
@@ -1,9 +1,11 @@
1
- import { Browser, Log, Player as PlayerClappr, $, Loader, } from '@clappr/core';
1
+ import { Browser, Events as ClapprEvents, Log, Player as PlayerClappr, $, Loader, } from '@clappr/core';
2
2
  import assert from 'assert';
3
3
  import Hls from 'hls.js';
4
4
  import EventLite from "event-lite";
5
5
  import '../assets/style/main.scss'; // TODO check if needed
6
6
  import { reportError, trace } from "./trace/index.js";
7
+ import DashPlayback from './plugins/dash-playback/DashPlayback.js';
8
+ import HlsPlayback from './plugins/hls-playback/HlsPlayback.js';
7
9
  export var PlayerEvent;
8
10
  (function (PlayerEvent) {
9
11
  PlayerEvent["Ready"] = "ready";
@@ -30,6 +32,26 @@ export class Player {
30
32
  tuneInEntered = false;
31
33
  supportedMediaTransports = [];
32
34
  config;
35
+ bitrateInfo = null;
36
+ get playbackModule() {
37
+ if (!this.player?.core.activePlayback) {
38
+ return null;
39
+ }
40
+ switch (this.player.core.activePlayback.name) {
41
+ case 'dash':
42
+ return 'dash';
43
+ case 'hls':
44
+ return 'hls';
45
+ default:
46
+ return 'native';
47
+ }
48
+ }
49
+ get bitrate() {
50
+ return this.bitrateInfo;
51
+ }
52
+ get hd() {
53
+ return this.player?.core.activePlayback?.isHighDefinitionInUse || false;
54
+ }
33
55
  get playing() {
34
56
  return this.player ? this.player.isPlaying() : false;
35
57
  }
@@ -62,7 +84,6 @@ export class Player {
62
84
  container: Object.values(container),
63
85
  playback: Loader.registeredPlaybacks,
64
86
  };
65
- console.log('plugins', coreOpts.plugins);
66
87
  return this.initPlayer(coreOpts);
67
88
  });
68
89
  }
@@ -126,6 +147,19 @@ export class Player {
126
147
  }
127
148
  this.tuneInEntered = true;
128
149
  const player = this.player;
150
+ try {
151
+ this.emitter.emit(PlayerEvent.Ready);
152
+ }
153
+ catch (e) {
154
+ reportError(e);
155
+ }
156
+ if (player.core.activeContainer) {
157
+ this.bindBitrateChangeHandler();
158
+ }
159
+ player.core.on(ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, () => {
160
+ trace(`${T} onActiveContainerChanged`);
161
+ this.bindBitrateChangeHandler();
162
+ }, null);
129
163
  if (Browser.isiOS &&
130
164
  player.core.activePlayback) {
131
165
  player.core.activePlayback.$el.on('webkitendfullscreen', () => {
@@ -139,7 +173,9 @@ export class Player {
139
173
  }
140
174
  }
141
175
  configurePlugins() {
142
- if (!Browser.isiOS && this.config.multisources.some((el) => el.sourceDash)) {
176
+ // TODO remove !isiOS?
177
+ const useDash = !Browser.isiOS && this.config.multisources.some((el) => el.sourceDash && DashPlayback.canPlay(el.sourceDash));
178
+ if (useDash) {
143
179
  this.scheduleLoad(async () => {
144
180
  const module = await import('./plugins/dash-playback/DashPlayback.js');
145
181
  Loader.registerPlayback(module.default);
@@ -147,7 +183,8 @@ export class Player {
147
183
  }
148
184
  // TODO remove !isiOS?
149
185
  // if (!Browser.isiOS && this.config.multisources.some((el) => el.hls_mpegts_url)) {
150
- if (this.config.multisources.some((el) => el.hlsMpegtsUrl || el.hlsCmafUrl || el.source.endsWith('.m3u8'))) {
186
+ const useHls = this.config.multisources.some((el) => HlsPlayback.canPlay(el.hlsCmafUrl || el.hlsMpegtsUrl || el.source));
187
+ if (useHls) {
151
188
  this.scheduleLoad(async () => {
152
189
  const module = await import('./plugins/hls-playback/HlsPlayback.js');
153
190
  Loader.registerPlayback(module.default);
@@ -156,22 +193,20 @@ export class Player {
156
193
  }
157
194
  events = {
158
195
  onReady: () => {
196
+ trace(`${T} onReady`, { clapprReady: this.clapprReady, player: !!this.player, core: !!this.player?.core, activeContainer: !!this.player?.core.activeContainer });
159
197
  if (this.clapprReady) {
160
198
  return;
161
199
  }
162
200
  this.clapprReady = true;
201
+ // TODO figure out what's for
163
202
  if (this.timer) {
164
203
  clearTimeout(this.timer);
165
204
  this.timer = null;
166
205
  }
167
- trace(`${T} onReady`);
206
+ // trace(`${T} onReady`, {
207
+ // activeContainer: !!this.player?.core.activeContainer,
208
+ // });
168
209
  setTimeout(() => this.tuneIn(), 0);
169
- try {
170
- this.emitter.emit(PlayerEvent.Ready);
171
- }
172
- catch (e) {
173
- reportError(e);
174
- }
175
210
  },
176
211
  onPlay: () => {
177
212
  try {
@@ -301,6 +336,13 @@ export class Player {
301
336
  source: this.selectMediaTransport(ms, transport),
302
337
  })).filter((el) => !!el.source);
303
338
  }
339
+ bindBitrateChangeHandler() {
340
+ trace(`${T} bindBitrateChangeHandler`, { activePlayback: !!this.player?.core.activePlayback });
341
+ this.player?.core.activeContainer.on(ClapprEvents.CONTAINER_BITRATE, (bitrate) => {
342
+ trace(`${T} onPlaybackBitrate`, { bitrate });
343
+ this.bitrateInfo = bitrate;
344
+ });
345
+ }
304
346
  }
305
347
  function unwrapSource(s) {
306
348
  if (!s) {
@@ -1 +1 @@
1
- {"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,UAAU,EAAO,QAAQ,EAA4B,MAAM,cAAc,CAAC;AAE3F,OAAO,MAAM,EAAG,EACd,UAAU,IAAI,cAAc,EAC5B,kBAAkB,IAAI,sBAAsB,EAC5C,KAAK,WAAW,EAEhB,aAAa,EACd,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAM5E,KAAK,YAAY,GACb,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,IAAI,GACpB,OAAO,QAAQ,CAAC,GAAG,GACnB,OAAO,QAAQ,CAAC,KAAK,CAAC;AAE1B,KAAK,YAAY,GAAG,MAAM,CAAC;AAE3B,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAID,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU;IAClD,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAQ;IAEtC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,mCAAmC,EAAE,OAAO,CAAS;IAErD,aAAa,EAAE,OAAO,CAAS;IAE/B,uBAAuB,EAAE,MAAM,CAAK;IAEpC,wBAAwB,EAAE,MAAM,CAAK;IAErC,aAAa,EAAE,YAAY,CAAgB;IAE3C,aAAa,EAAE,YAAY,GAAG,IAAI,CAAQ;IAG1C,gBAAgB,EAAE,SAAS,CAAK;IAEhC,KAAK,EAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAQ;IAE7C,2BAA2B,EAAE,MAAM,CAAK;IAExC,8BAA8B,EAAE,MAAM,CAAK;IAE3C,aAAa,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAEtC,eAAe,EAAE,YAAY,CAA4B;IAEzD,0BAA0B,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE/D,wBAAwB,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE7D,yBAAyB,EAAE,MAAM,CAAK;IAEtC,yBAAyB,UAAS;IAElC,uBAAuB,UAAS;IAEhC,kBAAkB,UAAS;IAE3B,YAAY,EAAE,aAAa,GAAG,IAAI,CAAQ;IAG1C,sBAAsB,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAE/C,gBAAgB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAQ;IAE/D,IAAI,IAAI,WAEP;IAED,IAAI,MAAM,IAAI,YAAY,EAAE,CAE3B;IAED,IAAI,YAAY,IAAI,MAAM,CAMzB;IAED,IAAI,OAAO,YAEV;IAED,IAAI,YAAY,CAAC,EAAE,EAZC,MAYD,EAgClB;IAED,IAAI,UAAU,WAMb;IAED,IAAI,IAAI,WAEP;IAID,IAAI,sBAAsB,WAWzB;IAID,IAAI,oBAAoB,WAYvB;IAED,IAAI,SAAS,kBAMZ;gBAEW,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG;IAiDzD,MAAM;IAwDN,MAAM;IAMN,MAAM;IA8BN,SAAS;IAKT,qBAAqB;IAQrB,oBAAoB;IAMpB,kBAAkB;IAOlB,WAAW,IAAI,QAAQ;IAKvB,cAAc,IAAI,SAAS;IAU3B,kBAAkB,IAAI,SAAS;IAI/B,cAAc,CAAC,UAAU,EAAE,MAAM;IAYjC,IAAI,CAAC,IAAI,EAAE,SAAS;IAWpB,eAAe;IAIf,UAAU,CAAC,MAAM,EAAE,OAAO;IAK1B,eAAe;IAcf,gBAAgB,UAAW,sBAAsB,UAEhD;IAED,eAAe,UAAW,cAAc,UA2FvC;IAED,aAAa;IAoBb,iBAAiB;IAWjB,IAAI,UAAU,YAGb;IAED,WAAW;IAmBX,IAAI;IAUJ,KAAK;IAWL,IAAI;IASJ,OAAO;IAYP,mBAAmB;IAQnB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE;IAsJjC,OAAO,CAAC,aAAa;IAUrB,eAAe;IAIf,aAAa;CAGd"}
1
+ {"version":3,"file":"DashPlayback.d.ts","sourceRoot":"","sources":["../../../src/plugins/dash-playback/DashPlayback.ts"],"names":[],"mappings":"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"}
@@ -193,13 +193,10 @@ export default class DashPlayback extends HTML5Video {
193
193
  });
194
194
  });
195
195
  this._dash.on(DASHJS.MediaPlayer.events.METRIC_ADDED, (e) => {
196
- // console.log(`${T} onMetricAdded`, e);
197
- // TODO
198
196
  // Listen for the first manifest request in order to update player UI
199
197
  if (e.metric === 'DVRInfo') { // TODO fix typings
200
198
  assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to get metrics');
201
199
  const dvrInfo = this._dash.getDashMetrics().getCurrentDVRInfo('video');
202
- // trace(`${T} onMetricAdded DVRInfo`, {metric: e.metric, dvrInfo});
203
200
  if (dvrInfo) {
204
201
  // Extract time info
205
202
  this.manifestInfo = dvrInfo.manifestInfo;
@@ -647,12 +644,12 @@ export default class DashPlayback extends HTML5Video {
647
644
  }
648
645
  }
649
646
  DashPlayback.canPlay = function (resource, mimeType) {
650
- console.log(`${T} canPlay resource:%s mimeType:%s`, resource, mimeType);
647
+ trace(`${T} canPlay resource:%s mimeType:%s`, { resource, mimeType });
651
648
  const resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || [];
652
649
  const isDash = ((resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'mpd') ||
653
650
  mimeType === 'application/dash+xml' || mimeType === 'video/mp4');
654
651
  const ctor = window.MediaSource || ('WebKitMediaSource' in window ? window.WebKitMediaSource : undefined);
655
- const isSupportByBrowser = typeof ctor === 'function';
656
- console.log(`${T} canPlay isSupportByBrowser:%s isDash:%s`, isSupportByBrowser, isDash);
657
- return !!(isSupportByBrowser && isDash);
652
+ const hasBrowserSupport = typeof ctor === 'function';
653
+ trace(`${T} canPlay isSupportByBrowser:%s isDash:%s`, { isSupportByBrowser: hasBrowserSupport, isDash });
654
+ return !!(hasBrowserSupport && isDash);
658
655
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gcorevideo/player",
3
- "version": "0.0.4",
3
+ "version": "0.1.0",
4
4
  "description": "Gcore JavaScript video player",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -32,26 +32,20 @@
32
32
  "devDependencies": {
33
33
  "@rollup/plugin-commonjs": "^28.0.1",
34
34
  "@rollup/plugin-node-resolve": "^15.3.0",
35
- "@types/can-autoplay": "^3.0.5",
36
35
  "@types/node": "^22.10.1",
37
- "@types/ua-parser-js": "^0.7.39",
38
36
  "assert": "^2.1.0",
39
37
  "rollup": "^4.27.4",
40
38
  "rollup-plugin-polyfill-node": "^0.13.0",
41
39
  "rollup-plugin-sass": "^1.14.0",
42
- "rollup-plugin-scss": "^4.0.1",
43
40
  "rollup-plugin-string": "^3.0.0",
44
41
  "sass": "^1.83.0",
45
42
  "typescript": "^5.7.2"
46
43
  },
47
44
  "dependencies": {
48
45
  "@clappr/core": "^0.11.3",
49
- "@clappr/plugins": "^0.8.3",
50
- "@sentry/browser": "^8.41.0",
51
- "can-autoplay": "^3.0.2",
46
+ "@sentry/types": "^8.47.0",
52
47
  "dashjs": "^4.7.4",
53
48
  "event-lite": "^1.0.0",
54
- "hls.js": "^1.5.17",
55
- "ua-parser-js": "^2.0.0"
49
+ "hls.js": "^1.5.17"
56
50
  }
57
51
  }
package/src/Player.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Browser,
3
+ Events as ClapprEvents,
3
4
  Log,
4
5
  Player as PlayerClappr,
5
6
  $,
@@ -28,6 +29,9 @@ import {
28
29
  MediaTransport,
29
30
  TransportPreference,
30
31
  } from "./types.js";
32
+ import DashPlayback from './plugins/dash-playback/DashPlayback.js';
33
+ import HlsPlayback from './plugins/hls-playback/HlsPlayback.js';
34
+ import Playback from '@clappr/core/types/base/playback/playback';
31
35
 
32
36
  export enum PlayerEvent {
33
37
  Ready = 'ready',
@@ -49,6 +53,22 @@ const DEFAULT_OPTIONS: Partial<PlayerConfig> = {
49
53
  loop: false,
50
54
  }
51
55
 
56
+ export type PlaybackModule = 'dash' | 'hls' | 'native';
57
+
58
+ // TODO drop
59
+ // export type PlaybackInfo = {
60
+ // bitrate: number;
61
+ // hd: boolean;
62
+ // latency: number;
63
+ // }
64
+
65
+ type BitrateInfo = {
66
+ height: number;
67
+ width: number;
68
+ bitrate: number;
69
+ level: number;
70
+ }
71
+
52
72
  type PluginOptions = Record<string, unknown>;
53
73
 
54
74
  /**
@@ -71,6 +91,30 @@ export class Player {
71
91
 
72
92
  private config: PlayerConfig;
73
93
 
94
+ private bitrateInfo: BitrateInfo | null = null;
95
+
96
+ get playbackModule(): PlaybackModule | null {
97
+ if (!this.player?.core.activePlayback) {
98
+ return null;
99
+ }
100
+ switch (this.player.core.activePlayback.name) {
101
+ case 'dash':
102
+ return 'dash';
103
+ case 'hls':
104
+ return 'hls';
105
+ default:
106
+ return 'native';
107
+ }
108
+ }
109
+
110
+ get bitrate(): BitrateInfo | null {
111
+ return this.bitrateInfo;
112
+ }
113
+
114
+ get hd() {
115
+ return this.player?.core.activePlayback?.isHighDefinitionInUse || false;
116
+ }
117
+
74
118
  get playing() {
75
119
  return this.player ? this.player.isPlaying() : false;
76
120
  }
@@ -117,7 +161,6 @@ export class Player {
117
161
  container: Object.values(container),
118
162
  playback: Loader.registeredPlaybacks,
119
163
  } as CorePluginOptions;
120
- console.log('plugins', coreOpts.plugins);
121
164
  return this.initPlayer(coreOpts);
122
165
  });
123
166
  }
@@ -195,6 +238,18 @@ export class Player {
195
238
  }
196
239
  this.tuneInEntered = true;
197
240
  const player = this.player;
241
+ try {
242
+ this.emitter.emit(PlayerEvent.Ready);
243
+ } catch (e) {
244
+ reportError(e);
245
+ }
246
+ if (player.core.activeContainer) {
247
+ this.bindBitrateChangeHandler();
248
+ }
249
+ player.core.on(ClapprEvents.CORE_ACTIVE_CONTAINER_CHANGED, () => {
250
+ trace(`${T} onActiveContainerChanged`);
251
+ this.bindBitrateChangeHandler();
252
+ }, null);
198
253
  if (
199
254
  Browser.isiOS &&
200
255
  player.core.activePlayback
@@ -213,7 +268,11 @@ export class Player {
213
268
  }
214
269
 
215
270
  private configurePlugins() {
216
- if (!Browser.isiOS && this.config.multisources.some((el) => el.sourceDash)) {
271
+ // TODO remove !isiOS?
272
+ const useDash = !Browser.isiOS && this.config.multisources.some(
273
+ (el) => el.sourceDash && DashPlayback.canPlay(el.sourceDash)
274
+ );
275
+ if (useDash) {
217
276
  this.scheduleLoad(async () => {
218
277
  const module = await import('./plugins/dash-playback/DashPlayback.js');
219
278
  Loader.registerPlayback(module.default);
@@ -221,7 +280,10 @@ export class Player {
221
280
  }
222
281
  // TODO remove !isiOS?
223
282
  // if (!Browser.isiOS && this.config.multisources.some((el) => el.hls_mpegts_url)) {
224
- if (this.config.multisources.some((el) => el.hlsMpegtsUrl || el.hlsCmafUrl || el.source.endsWith('.m3u8'))) {
283
+ const useHls = this.config.multisources.some(
284
+ (el) => HlsPlayback.canPlay(el.hlsCmafUrl || el.hlsMpegtsUrl || el.source)
285
+ );
286
+ if (useHls) {
225
287
  this.scheduleLoad(async () => {
226
288
  const module = await import('./plugins/hls-playback/HlsPlayback.js');
227
289
  Loader.registerPlayback(module.default);
@@ -231,21 +293,20 @@ export class Player {
231
293
 
232
294
  private events: CorePlayerEvents = {
233
295
  onReady: () => {
296
+ trace(`${T} onReady`, { clapprReady: this.clapprReady, player: !!this.player, core: !!this.player?.core, activeContainer: !!this.player?.core.activeContainer });
234
297
  if (this.clapprReady) {
235
298
  return;
236
299
  }
237
300
  this.clapprReady = true;
301
+ // TODO figure out what's for
238
302
  if (this.timer) {
239
303
  clearTimeout(this.timer);
240
304
  this.timer = null;
241
305
  }
242
- trace(`${T} onReady`);
306
+ // trace(`${T} onReady`, {
307
+ // activeContainer: !!this.player?.core.activeContainer,
308
+ // });
243
309
  setTimeout(() => this.tuneIn(), 0);
244
- try {
245
- this.emitter.emit(PlayerEvent.Ready);
246
- } catch (e) {
247
- reportError(e);
248
- }
249
310
  },
250
311
  onPlay: () => {
251
312
  try {
@@ -380,6 +441,14 @@ export class Player {
380
441
  source: this.selectMediaTransport(ms, transport),
381
442
  })).filter((el): el is StreamMediaSource => !!el.source);
382
443
  }
444
+
445
+ private bindBitrateChangeHandler() {
446
+ trace(`${T} bindBitrateChangeHandler`, { activePlayback: !!this.player?.core.activePlayback });
447
+ this.player?.core.activeContainer.on(ClapprEvents.CONTAINER_BITRATE, (bitrate: BitrateInfo) => {
448
+ trace(`${T} onPlaybackBitrate`, { bitrate });
449
+ this.bitrateInfo = bitrate;
450
+ });
451
+ }
383
452
  }
384
453
 
385
454
  function unwrapSource(s: PlayerMediaSource | undefined): string | undefined {
@@ -279,13 +279,10 @@ export default class DashPlayback extends HTML5Video {
279
279
  });
280
280
 
281
281
  this._dash.on(DASHJS.MediaPlayer.events.METRIC_ADDED, (e: DashMetricEvent) => {
282
- // console.log(`${T} onMetricAdded`, e);
283
- // TODO
284
282
  // Listen for the first manifest request in order to update player UI
285
283
  if ((e.metric as string) === 'DVRInfo') { // TODO fix typings
286
284
  assert.ok(this._dash, 'An instance of dashjs MediaPlayer is required to get metrics');
287
285
  const dvrInfo = this._dash.getDashMetrics().getCurrentDVRInfo('video');
288
- // trace(`${T} onMetricAdded DVRInfo`, {metric: e.metric, dvrInfo});
289
286
  if (dvrInfo) {
290
287
  // Extract time info
291
288
  this.manifestInfo = dvrInfo.manifestInfo;
@@ -797,12 +794,12 @@ export default class DashPlayback extends HTML5Video {
797
794
  }
798
795
 
799
796
  DashPlayback.canPlay = function (resource, mimeType) {
800
- console.log(`${T} canPlay resource:%s mimeType:%s`, resource, mimeType);
797
+ trace(`${T} canPlay resource:%s mimeType:%s`, {resource, mimeType});
801
798
  const resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || [];
802
799
  const isDash = ((resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'mpd') ||
803
800
  mimeType === 'application/dash+xml' || mimeType === 'video/mp4');
804
801
  const ctor = window.MediaSource || ('WebKitMediaSource' in window ? window.WebKitMediaSource : undefined);
805
- const isSupportByBrowser = typeof ctor === 'function';
806
- console.log(`${T} canPlay isSupportByBrowser:%s isDash:%s`, isSupportByBrowser, isDash);
807
- return !!(isSupportByBrowser && isDash);
802
+ const hasBrowserSupport = typeof ctor === 'function';
803
+ trace(`${T} canPlay isSupportByBrowser:%s isDash:%s`, {isSupportByBrowser: hasBrowserSupport, isDash});
804
+ return !!(hasBrowserSupport && isDash);
808
805
  };