react-native-theoplayer 1.7.1 → 1.7.2

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 (38) hide show
  1. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +148 -12
  2. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +11 -0
  3. package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +11 -0
  4. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +2 -1
  5. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +123 -101
  6. package/ios/THEOplayerRCTAdAggregator.swift +3 -0
  7. package/ios/THEOplayerRCTBridge.m +2 -0
  8. package/ios/THEOplayerRCTMetadataAggregator.swift +59 -45
  9. package/ios/THEOplayerRCTTrackEventTypes.swift +17 -0
  10. package/ios/THEOplayerRCTView.swift +27 -3
  11. package/ios/THEOplayerRCTViewAdEventHandler.swift +7 -5
  12. package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +185 -0
  13. package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +26 -9
  14. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  15. package/lib/commonjs/api/event/TrackEvent.js +17 -1
  16. package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
  17. package/lib/commonjs/internal/THEOplayerView.js +14 -0
  18. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  19. package/lib/commonjs/internal/THEOplayerView.web.js +71 -20
  20. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  21. package/lib/module/api/THEOplayerView.js.map +1 -1
  22. package/lib/module/api/event/TrackEvent.js +14 -0
  23. package/lib/module/api/event/TrackEvent.js.map +1 -1
  24. package/lib/module/internal/THEOplayerView.js +14 -0
  25. package/lib/module/internal/THEOplayerView.js.map +1 -1
  26. package/lib/module/internal/THEOplayerView.web.js +72 -21
  27. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  28. package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +4 -0
  29. package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
  30. package/lib/typescript/src/api/THEOplayerView.d.ts +11 -3
  31. package/lib/typescript/src/api/event/TrackEvent.d.ts +49 -3
  32. package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
  33. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +4 -1
  34. package/package.json +1 -1
  35. package/src/api/THEOplayerView.ts +13 -3
  36. package/src/api/event/TrackEvent.ts +58 -2
  37. package/src/internal/THEOplayerView.tsx +18 -0
  38. package/src/internal/THEOplayerView.web.tsx +80 -19
@@ -1,8 +1,15 @@
1
1
  import React, { PureComponent } from 'react';
2
2
 
3
- import type { AdEvent, AdsAPI, PlayerError, TextTrack, THEOplayerViewProps, TimeRange } from 'react-native-theoplayer';
4
- import { AdEventNames, TextTrackEventType, THEOplayerViewComponent, TrackListEventType } from 'react-native-theoplayer';
5
- import type { Event, TextTrackCue as NativeTextTrackCue } from 'theoplayer';
3
+ import type { AdEvent, AdsAPI, MediaTrack, PlayerError, TextTrack, THEOplayerViewProps, TimeRange } from 'react-native-theoplayer';
4
+ import {
5
+ AdEventNames,
6
+ MediaTrackEventType,
7
+ MediaTrackType,
8
+ TextTrackEventType,
9
+ THEOplayerViewComponent,
10
+ TrackListEventType,
11
+ } from 'react-native-theoplayer';
12
+ import type { Event, TextTrackCue as NativeTextTrackCue, TrackChangeEvent } from 'theoplayer';
6
13
 
7
14
  import type {
8
15
  AddTrackEvent,
@@ -23,7 +30,7 @@ interface THEOplayerRCTViewState {
23
30
 
24
31
  export class THEOplayerView extends PureComponent<THEOplayerViewProps, THEOplayerRCTViewState> implements THEOplayerViewComponent {
25
32
  private _player: THEOplayer.ChromelessPlayer | null = null;
26
- private _adsApi: THEOplayerWebAdsAPI;
33
+ private readonly _adsApi: THEOplayerWebAdsAPI;
27
34
 
28
35
  private static initialState: THEOplayerRCTViewState = {
29
36
  isBuffering: false,
@@ -206,6 +213,19 @@ export class THEOplayerView extends PureComponent<THEOplayerViewProps, THEOplaye
206
213
  }
207
214
  };
208
215
 
216
+ private onActiveQualityChanged = (trackType: MediaTrackType, track: NativeMediaTrack) => () => {
217
+ const { onMediaTrackEvent } = this.props;
218
+ if (onMediaTrackEvent) {
219
+ const quality = track.activeQuality;
220
+ onMediaTrackEvent({
221
+ type: MediaTrackEventType.ActiveQualityChanged,
222
+ trackType,
223
+ trackUid: track.uid,
224
+ qualities: quality ? [quality] : undefined,
225
+ });
226
+ }
227
+ };
228
+
209
229
  private addEventListeners() {
210
230
  const player = this._player;
211
231
  if (!player) {
@@ -369,6 +389,7 @@ export class THEOplayerView extends PureComponent<THEOplayerViewProps, THEOplaye
369
389
  });
370
390
  }
371
391
  });
392
+
372
393
  player.presentation.addEventListener('presentationmodechange', (event: PresentationModeChangeEvent) => {
373
394
  const { presentationMode } = event;
374
395
  const { onFullscreenPlayerDidPresent, onFullscreenPlayerDidDismiss } = this.props;
@@ -382,32 +403,51 @@ export class THEOplayerView extends PureComponent<THEOplayerViewProps, THEOplaye
382
403
  }
383
404
  }
384
405
  });
406
+
385
407
  player.textTracks.addEventListener('addtrack', (event: AddTrackEvent) => {
386
- const { onTextTrackListEvent } = this.props;
387
408
  const track = event.track as NativeTextTrack;
388
409
  track.addEventListener('addcue', this.onAddTextTrackCue(track));
389
410
  track.addEventListener('removecue', this.onRemoveTextTrackCue(track));
390
-
391
- if (onTextTrackListEvent) {
392
- onTextTrackListEvent({
393
- type: TrackListEventType.AddTrack,
394
- track: track as TextTrack,
395
- });
396
- }
411
+ this.dispatchTextTrackListEvent(TrackListEventType.AddTrack, track as TextTrack);
397
412
  });
413
+
398
414
  player.textTracks.addEventListener('removetrack', (event: RemoveTrackEvent) => {
399
- const { onTextTrackListEvent } = this.props;
400
415
  const track = event.track as NativeTextTrack;
401
416
  track.removeEventListener('addcue', this.onAddTextTrackCue(track));
402
417
  track.removeEventListener('removecue', this.onRemoveTextTrackCue(track));
418
+ this.dispatchTextTrackListEvent(TrackListEventType.RemoveTrack, track as NativeTextTrack as TextTrack);
419
+ });
403
420
 
404
- if (onTextTrackListEvent) {
405
- onTextTrackListEvent({
406
- type: TrackListEventType.RemoveTrack,
407
- track: event.track as unknown as TextTrack,
408
- });
409
- }
421
+ player.textTracks.addEventListener('change', (event: TrackChangeEvent) => {
422
+ this.dispatchTextTrackListEvent(TrackListEventType.ChangeTrack, event.track as NativeTextTrack as TextTrack);
423
+ });
424
+
425
+ [MediaTrackType.Audio, MediaTrackType.Video].forEach((trackType) => {
426
+ const mediaTracks = trackType === MediaTrackType.Audio ? player.audioTracks : player.videoTracks;
427
+ mediaTracks.addEventListener('addtrack', (event: AddTrackEvent) => {
428
+ const track = event.track as NativeMediaTrack;
429
+ track.addEventListener('activequalitychanged', this.onActiveQualityChanged(trackType, track));
430
+ this.dispatchMediaTrackListEvent(TrackListEventType.AddTrack, trackType, track as MediaTrack);
431
+ });
410
432
  });
433
+
434
+ [MediaTrackType.Audio, MediaTrackType.Video].forEach((trackType) => {
435
+ const mediaTracks = trackType === MediaTrackType.Audio ? player.audioTracks : player.videoTracks;
436
+ mediaTracks.addEventListener('removetrack', (event: RemoveTrackEvent) => {
437
+ const track = event.track as NativeMediaTrack;
438
+ track.removeEventListener('activequalitychanged', this.onActiveQualityChanged(trackType, track));
439
+ this.dispatchMediaTrackListEvent(TrackListEventType.RemoveTrack, trackType, track as MediaTrack);
440
+ });
441
+ });
442
+
443
+ [MediaTrackType.Audio, MediaTrackType.Video].forEach((trackType) => {
444
+ const mediaTracks = trackType === MediaTrackType.Audio ? player.audioTracks : player.videoTracks;
445
+ mediaTracks.addEventListener('change', (event: TrackChangeEvent) => {
446
+ const track = event.track as NativeMediaTrack;
447
+ this.dispatchMediaTrackListEvent(TrackListEventType.ChangeTrack, trackType, track as MediaTrack);
448
+ });
449
+ });
450
+
411
451
  player.ads?.addEventListener(AdEventNames, (event) => {
412
452
  const { onAdEvent } = this.props;
413
453
  if (onAdEvent) {
@@ -416,6 +456,27 @@ export class THEOplayerView extends PureComponent<THEOplayerViewProps, THEOplaye
416
456
  });
417
457
  }
418
458
 
459
+ private dispatchTextTrackListEvent = (type: TrackListEventType, track: TextTrack) => {
460
+ const { onTextTrackListEvent } = this.props;
461
+ if (onTextTrackListEvent) {
462
+ onTextTrackListEvent({
463
+ type,
464
+ track,
465
+ });
466
+ }
467
+ };
468
+
469
+ private dispatchMediaTrackListEvent = (type: TrackListEventType, trackType: MediaTrackType, track: MediaTrack) => {
470
+ const { onMediaTrackListEvent } = this.props;
471
+ if (onMediaTrackListEvent) {
472
+ onMediaTrackListEvent({
473
+ type,
474
+ trackType,
475
+ track: track as MediaTrack,
476
+ });
477
+ }
478
+ };
479
+
419
480
  public render(): JSX.Element {
420
481
  const { config } = this.props;
421
482
  const chromeless = config?.chromeless === undefined || config?.chromeless === true;