react-native-theoplayer 2.4.0 → 2.6.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +9 -15
  3. package/android/src/main/java/com/theoplayer/player/PlayerModule.kt +12 -0
  4. package/android/src/main/java/com/theoplayer/util/PayloadBuilder.kt +2 -1
  5. package/ios/THEOplayerRCTBridge.m +3 -0
  6. package/ios/THEOplayerRCTMainEventHandler.swift +1 -1
  7. package/ios/THEOplayerRCTPlayerAPI.swift +15 -0
  8. package/ios/THEOplayerRCTTypeUtils.swift +26 -0
  9. package/ios/backgroundAudio/THEOplayerRCTNowPlayingManager.swift +49 -24
  10. package/lib/commonjs/api/abr/ABRConfiguration.js +25 -0
  11. package/lib/commonjs/api/abr/ABRConfiguration.js.map +1 -1
  12. package/lib/commonjs/api/player/THEOplayer.js +18 -0
  13. package/lib/commonjs/api/player/THEOplayer.js.map +1 -1
  14. package/lib/commonjs/api/track/Track.js +5 -1
  15. package/lib/commonjs/api/track/Track.js.map +1 -1
  16. package/lib/commonjs/internal/THEOplayerView.web.js +2 -6
  17. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  18. package/lib/commonjs/internal/adapter/NativePlayerState.js.map +1 -1
  19. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +8 -0
  20. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
  21. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +112 -53
  22. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  23. package/lib/module/api/abr/ABRConfiguration.js +19 -0
  24. package/lib/module/api/abr/ABRConfiguration.js.map +1 -1
  25. package/lib/module/api/player/THEOplayer.js +16 -1
  26. package/lib/module/api/player/THEOplayer.js.map +1 -1
  27. package/lib/module/api/track/Track.js +4 -1
  28. package/lib/module/api/track/Track.js.map +1 -1
  29. package/lib/module/internal/THEOplayerView.web.js +2 -6
  30. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  31. package/lib/module/internal/adapter/NativePlayerState.js.map +1 -1
  32. package/lib/module/internal/adapter/THEOplayerAdapter.js +9 -1
  33. package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
  34. package/lib/module/internal/adapter/THEOplayerWebAdapter.js +112 -53
  35. package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  36. package/lib/typescript/api/abr/ABRConfiguration.d.ts +5 -1
  37. package/lib/typescript/api/player/THEOplayer.d.ts +22 -0
  38. package/lib/typescript/api/track/Track.d.ts +1 -0
  39. package/lib/typescript/internal/adapter/NativePlayerState.d.ts +2 -0
  40. package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts +3 -1
  41. package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts +7 -5
  42. package/package.json +9 -4
  43. package/react-native-theoplayer.podspec +1 -1
  44. package/src/api/abr/ABRConfiguration.ts +5 -1
  45. package/src/api/player/THEOplayer.ts +24 -0
  46. package/src/api/track/Track.ts +5 -1
  47. package/src/internal/THEOplayerView.web.tsx +2 -6
  48. package/src/internal/adapter/NativePlayerState.ts +2 -0
  49. package/src/internal/adapter/THEOplayerAdapter.ts +11 -0
  50. package/src/internal/adapter/THEOplayerWebAdapter.ts +106 -51
@@ -1 +1 @@
1
- {"version":3,"names":["DefaultEventDispatcher","THEOplayerWebAdsAdapter","THEOplayerWebCastAdapter","findNativeQualitiesByUid","fromNativeMediaTrackList","fromNativeTextTrackList","WebEventForwarder","WebPresentationModeManager","WebMediaSession","PresentationMode","defaultBackgroundAudioConfiguration","enabled","defaultPipConfiguration","startsAutomatically","THEOplayerWebAdapter","constructor","player","config","_config$mediaControl","_defineProperty","undefined","_this$_mediaSession","document","visibilityState","presentationMode","pip","backgroundAudioConfiguration","_player","pause","_mediaSession","updateActionHandlers","_adsAdapter","_castAdapter","_eventForwarder","_presentationModeManager","addEventListener","onVisibilityChange","mediaControl","mediaSessionEnabled","abr","source","_targetVideoQuality","play","paused","autoplay","preload","type","seekable","nativeRange","Array","length","map","_","index","start","end","buffered","playbackRate","pipConfiguration","_pipConfiguration","_backgroundAudioConfiguration","_this$_mediaSession2","volume","muted","seeking","audioTracks","videoTracks","textTracks","selectedTextTrack","_this$_player$textTra","find","textTrack","mode","uid","forEach","textTrackStyle","selectedVideoTrack","_this$_player$videoTr","videoTrack","selectedAudioTrack","_this$_player$audioTr","audioTrack","targetVideoQuality","enabledVideoTrack","targetQuality","currentTime","isNaN","duration","ads","cast","destroy","_this$_mediaSession3","unload","removeEventListener","nativeHandle"],"sources":["THEOplayerWebAdapter.ts"],"sourcesContent":["import { DefaultEventDispatcher } from './event/DefaultEventDispatcher';\nimport type {\n AdsAPI,\n CastAPI,\n MediaTrack,\n NativeHandleType,\n PlayerEventMap,\n PreloadType,\n TextTrack,\n TextTrackStyle,\n THEOplayer,\n PlayerConfiguration,\n} from 'react-native-theoplayer';\nimport { THEOplayerWebAdsAdapter } from './ads/THEOplayerWebAdsAdapter';\nimport { THEOplayerWebCastAdapter } from './cast/THEOplayerWebCastAdapter';\nimport type * as THEOplayerWeb from 'theoplayer';\nimport type { MediaTrack as NativeMediaTrack, TextTrack as NativeTextTrack } from 'theoplayer';\nimport { findNativeQualitiesByUid, fromNativeMediaTrackList, fromNativeTextTrackList } from './web/TrackUtils';\nimport type { ABRConfiguration, SourceDescription } from 'src/api/barrel';\nimport { WebEventForwarder } from './WebEventForwarder';\nimport type { PiPConfiguration } from 'src/api/pip/PiPConfiguration';\nimport type { BackgroundAudioConfiguration } from 'src/api/backgroundAudio/BackgroundAudioConfiguration';\nimport { WebPresentationModeManager } from './web/WebPresentationModeManager';\nimport { WebMediaSession } from './web/WebMediaSession';\nimport { PresentationMode } from 'react-native-theoplayer';\n\nconst defaultBackgroundAudioConfiguration: BackgroundAudioConfiguration = {\n enabled: false,\n};\n\nconst defaultPipConfiguration: PiPConfiguration = {\n startsAutomatically: false,\n};\n\nexport class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap> implements THEOplayer {\n private readonly _player: THEOplayerWeb.ChromelessPlayer;\n private readonly _adsAdapter: THEOplayerWebAdsAdapter;\n private readonly _castAdapter: THEOplayerWebCastAdapter;\n private readonly _eventForwarder: WebEventForwarder;\n private readonly _presentationModeManager: WebPresentationModeManager;\n private readonly _mediaSession: WebMediaSession | undefined = undefined;\n private _targetVideoQuality: number | number[] | undefined = undefined;\n private _backgroundAudioConfiguration: BackgroundAudioConfiguration = defaultBackgroundAudioConfiguration;\n private _pipConfiguration: PiPConfiguration = defaultPipConfiguration;\n\n constructor(player: THEOplayerWeb.ChromelessPlayer, config?: PlayerConfiguration) {\n super();\n this._player = player;\n this._adsAdapter = new THEOplayerWebAdsAdapter(this._player);\n this._castAdapter = new THEOplayerWebCastAdapter(this._player);\n this._eventForwarder = new WebEventForwarder(this._player, this);\n this._presentationModeManager = new WebPresentationModeManager(this._player, this);\n document.addEventListener('visibilitychange', this.onVisibilityChange);\n\n // Optionally create a media session connector\n if (config?.mediaControl?.mediaSessionEnabled !== false) {\n this._mediaSession = new WebMediaSession(this, player);\n }\n }\n\n get abr(): ABRConfiguration | undefined {\n return this._player.abr;\n }\n\n get source(): SourceDescription | undefined {\n return this._player.source as SourceDescription;\n }\n\n set source(source: SourceDescription | undefined) {\n this._targetVideoQuality = undefined;\n this._player.source = source;\n }\n\n play(): void {\n this._player.play();\n }\n\n pause(): void {\n this._player.pause();\n }\n\n get paused(): boolean {\n return this._player.paused;\n }\n\n get autoplay(): boolean {\n return this._player.autoplay;\n }\n\n set autoplay(autoplay: boolean) {\n this._player.autoplay = autoplay;\n }\n\n set preload(type: PreloadType) {\n this._player.preload = type;\n }\n\n get preload(): PreloadType {\n return this._player.preload;\n }\n\n get seekable() {\n const nativeRange = this._player.seekable;\n return [...Array(nativeRange.length)].map((_, index) => ({ start: 1e3 * nativeRange.start(index), end: 1e3 * nativeRange.end(index) }));\n }\n\n get buffered() {\n const nativeRange = this._player.buffered;\n return [...Array(nativeRange.length)].map((_, index) => ({ start: 1e3 * nativeRange.start(index), end: 1e3 * nativeRange.end(index) }));\n }\n\n get playbackRate(): number {\n return this._player.playbackRate;\n }\n\n set playbackRate(playbackRate: number) {\n this._player.playbackRate = playbackRate;\n }\n\n get pipConfiguration(): PiPConfiguration {\n return this._pipConfiguration;\n }\n\n set pipConfiguration(config: PiPConfiguration) {\n this._pipConfiguration = config;\n }\n\n get backgroundAudioConfiguration(): BackgroundAudioConfiguration {\n return this._backgroundAudioConfiguration;\n }\n\n set backgroundAudioConfiguration(config: BackgroundAudioConfiguration) {\n this._backgroundAudioConfiguration = config;\n\n // Notify media session\n this._mediaSession?.updateActionHandlers();\n }\n\n get volume(): number {\n return this._player.volume;\n }\n\n set volume(volume: number) {\n this._player.volume = volume;\n }\n\n get muted(): boolean {\n return this._player.muted;\n }\n\n set muted(muted: boolean) {\n this._player.muted = muted;\n }\n\n get seeking(): boolean {\n return this._player.seeking;\n }\n\n get presentationMode(): PresentationMode {\n return this._presentationModeManager.presentationMode;\n }\n\n set presentationMode(presentationMode: PresentationMode) {\n this._presentationModeManager.presentationMode = presentationMode;\n }\n\n get audioTracks(): MediaTrack[] {\n return fromNativeMediaTrackList(this._player.audioTracks);\n }\n\n get videoTracks(): MediaTrack[] {\n return fromNativeMediaTrackList(this._player.videoTracks);\n }\n\n get textTracks(): TextTrack[] {\n return fromNativeTextTrackList(this._player.textTracks);\n }\n\n get selectedTextTrack(): number | undefined {\n return this._player.textTracks.find((textTrack: NativeTextTrack) => {\n return textTrack.mode === 'showing';\n })?.uid;\n }\n\n set selectedTextTrack(selectedTextTrack: number | undefined) {\n this._player.textTracks.forEach((textTrack: NativeTextTrack) => {\n textTrack.mode = textTrack.uid === selectedTextTrack ? 'showing' : 'disabled';\n });\n }\n\n get textTrackStyle(): TextTrackStyle {\n return this._player.textTrackStyle as TextTrackStyle;\n }\n\n get selectedVideoTrack(): number | undefined {\n return this._player.videoTracks.find((videoTrack: NativeMediaTrack) => videoTrack.enabled)?.uid;\n }\n\n set selectedVideoTrack(selectedVideoTrack: number | undefined) {\n this._targetVideoQuality = undefined;\n this._player.videoTracks.forEach((videoTrack: NativeMediaTrack) => {\n videoTrack.enabled = videoTrack.uid === selectedVideoTrack;\n });\n }\n\n get selectedAudioTrack(): number | undefined {\n return this._player.audioTracks.find((audioTrack: NativeMediaTrack) => {\n return audioTrack.enabled;\n })?.uid;\n }\n\n set selectedAudioTrack(selectedAudioTrack: number | undefined) {\n this._player.audioTracks.forEach((audioTrack: NativeMediaTrack) => {\n audioTrack.enabled = audioTrack.uid === selectedAudioTrack;\n });\n }\n\n get targetVideoQuality(): number | number[] | undefined {\n return this._targetVideoQuality;\n }\n\n set targetVideoQuality(targetVideoQuality: number | number[] | undefined) {\n const enabledVideoTrack = this._player.videoTracks.find((videoTrack: NativeMediaTrack) => videoTrack.enabled);\n if (enabledVideoTrack) {\n enabledVideoTrack.targetQuality = findNativeQualitiesByUid(enabledVideoTrack, targetVideoQuality);\n }\n this._targetVideoQuality = targetVideoQuality;\n }\n\n get currentTime(): number {\n return 1e3 * this._player.currentTime;\n }\n\n set currentTime(currentTime: number) {\n if (isNaN(currentTime)) {\n return;\n }\n if (this._player) {\n this._player.currentTime = currentTime / 1e3;\n }\n }\n\n get duration(): number {\n return this._player.duration * 1e3;\n }\n\n public get ads(): AdsAPI {\n return this._adsAdapter;\n }\n\n public get cast(): CastAPI {\n return this._castAdapter;\n }\n\n destroy(): void {\n this._eventForwarder.unload();\n this._mediaSession?.destroy();\n document.removeEventListener('visibilitychange', this.onVisibilityChange);\n }\n\n get nativeHandle(): NativeHandleType {\n return this._player;\n }\n\n private readonly onVisibilityChange = () => {\n if (document.visibilityState !== 'visible') {\n // Apply background configuration: by default, pause when going to background, unless in pip\n if (this.presentationMode !== PresentationMode.pip && !this.backgroundAudioConfiguration.enabled) {\n this._player.pause();\n }\n }\n // Apply media session controls\n this._mediaSession?.updateActionHandlers();\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["DefaultEventDispatcher","AspectRatio","PlayerEventType","PresentationMode","THEOplayerWebAdsAdapter","THEOplayerWebCastAdapter","findNativeQualitiesByUid","fromNativeMediaTrackList","fromNativeTextTrackList","WebEventForwarder","WebPresentationModeManager","WebMediaSession","BaseEvent","defaultBackgroundAudioConfiguration","enabled","defaultPipConfiguration","startsAutomatically","THEOplayerWebAdapter","constructor","player","config","_config$mediaControl","_defineProperty","undefined","_this$_mediaSession","_player","document","visibilityState","presentationMode","pip","backgroundAudioConfiguration","pause","_mediaSession","updateActionHandlers","_adsAdapter","_castAdapter","_eventForwarder","_presentationModeManager","addEventListener","onVisibilityChange","mediaControl","mediaSessionEnabled","abr","_this$_player","source","_this$_player2","_targetVideoQuality","play","_this$_player3","_this$_player4","paused","autoplay","preload","type","_this$_player5","seekable","nativeRange","Array","length","map","_","index","start","end","buffered","playbackRate","pipConfiguration","_pipConfiguration","_backgroundAudioConfiguration","_this$_mediaSession2","volume","muted","seeking","audioTracks","videoTracks","textTracks","selectedTextTrack","_this$_player$textTra","find","textTrack","mode","uid","forEach","textTrackStyle","_this$_player6","selectedVideoTrack","_this$_player$videoTr","videoTrack","selectedAudioTrack","_this$_player$audioTr","audioTrack","targetVideoQuality","enabledVideoTrack","targetQuality","currentTime","NaN","isNaN","aspectRatio","FIT","_ratio","duration","ads","cast","destroy","_this$_eventForwarder","_this$_mediaSession3","_this$_player7","dispatchEvent","DESTROY","unload","removeEventListener","nativeHandle"],"sources":["THEOplayerWebAdapter.ts"],"sourcesContent":["import { DefaultEventDispatcher } from './event/DefaultEventDispatcher';\nimport type {\n AdsAPI,\n CastAPI,\n MediaTrack,\n NativeHandleType,\n PlayerConfiguration,\n PlayerEventMap,\n PreloadType,\n TextTrack,\n TextTrackStyle,\n THEOplayer,\n} from 'react-native-theoplayer';\nimport { AspectRatio, PlayerEventType, PresentationMode } from 'react-native-theoplayer';\nimport { THEOplayerWebAdsAdapter } from './ads/THEOplayerWebAdsAdapter';\nimport { THEOplayerWebCastAdapter } from './cast/THEOplayerWebCastAdapter';\nimport type * as THEOplayerWeb from 'theoplayer';\nimport type { MediaTrack as NativeMediaTrack, TextTrack as NativeTextTrack } from 'theoplayer';\nimport { findNativeQualitiesByUid, fromNativeMediaTrackList, fromNativeTextTrackList } from './web/TrackUtils';\nimport type { ABRConfiguration, SourceDescription } from 'src/api/barrel';\nimport { WebEventForwarder } from './WebEventForwarder';\nimport type { PiPConfiguration } from 'src/api/pip/PiPConfiguration';\nimport type { BackgroundAudioConfiguration } from 'src/api/backgroundAudio/BackgroundAudioConfiguration';\nimport { WebPresentationModeManager } from './web/WebPresentationModeManager';\nimport { WebMediaSession } from './web/WebMediaSession';\nimport { BaseEvent } from './event/BaseEvent';\n\nconst defaultBackgroundAudioConfiguration: BackgroundAudioConfiguration = {\n enabled: false,\n};\n\nconst defaultPipConfiguration: PiPConfiguration = {\n startsAutomatically: false,\n};\n\nexport class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap> implements THEOplayer {\n private readonly _adsAdapter: THEOplayerWebAdsAdapter;\n private readonly _castAdapter: THEOplayerWebCastAdapter;\n private readonly _presentationModeManager: WebPresentationModeManager;\n private _player: THEOplayerWeb.ChromelessPlayer | undefined;\n private _eventForwarder: WebEventForwarder | undefined;\n private _mediaSession: WebMediaSession | undefined = undefined;\n private _targetVideoQuality: number | number[] | undefined = undefined;\n private _backgroundAudioConfiguration: BackgroundAudioConfiguration = defaultBackgroundAudioConfiguration;\n private _pipConfiguration: PiPConfiguration = defaultPipConfiguration;\n\n constructor(player: THEOplayerWeb.ChromelessPlayer, config?: PlayerConfiguration) {\n super();\n this._player = player;\n this._adsAdapter = new THEOplayerWebAdsAdapter(this._player);\n this._castAdapter = new THEOplayerWebCastAdapter(this._player);\n this._eventForwarder = new WebEventForwarder(this._player, this);\n this._presentationModeManager = new WebPresentationModeManager(this._player, this);\n document.addEventListener('visibilitychange', this.onVisibilityChange);\n\n // Optionally create a media session connector\n if (config?.mediaControl?.mediaSessionEnabled !== false) {\n this._mediaSession = new WebMediaSession(this, player);\n }\n }\n\n get abr(): ABRConfiguration | undefined {\n return this._player?.abr as ABRConfiguration | undefined;\n }\n\n get source(): SourceDescription | undefined {\n return this._player?.source as SourceDescription;\n }\n\n set source(source: SourceDescription | undefined) {\n this._targetVideoQuality = undefined;\n if (this._player) {\n this._player.source = source;\n }\n }\n\n play(): void {\n this._player?.play();\n }\n\n pause(): void {\n this._player?.pause();\n }\n\n get paused(): boolean {\n return this._player ? this._player.paused : true;\n }\n\n get autoplay(): boolean {\n return this._player ? this._player.autoplay : false;\n }\n\n set autoplay(autoplay: boolean) {\n if (this._player) {\n this._player.autoplay = autoplay;\n }\n }\n\n set preload(type: PreloadType) {\n if (this._player) {\n this._player.preload = type;\n }\n }\n\n get preload(): PreloadType {\n return this._player?.preload || 'none';\n }\n\n get seekable() {\n if (!this._player) {\n return [];\n }\n const nativeRange = this._player.seekable;\n return [...Array(nativeRange.length)].map((_, index) => ({ start: 1e3 * nativeRange.start(index), end: 1e3 * nativeRange.end(index) }));\n }\n\n get buffered() {\n if (!this._player) {\n return [];\n }\n const nativeRange = this._player.buffered;\n return [...Array(nativeRange.length)].map((_, index) => ({ start: 1e3 * nativeRange.start(index), end: 1e3 * nativeRange.end(index) }));\n }\n\n get playbackRate(): number {\n return this._player ? this._player.playbackRate : 1;\n }\n\n set playbackRate(playbackRate: number) {\n if (this._player) {\n this._player.playbackRate = playbackRate;\n }\n }\n\n get pipConfiguration(): PiPConfiguration {\n return this._pipConfiguration;\n }\n\n set pipConfiguration(config: PiPConfiguration) {\n this._pipConfiguration = config;\n }\n\n get backgroundAudioConfiguration(): BackgroundAudioConfiguration {\n return this._backgroundAudioConfiguration;\n }\n\n set backgroundAudioConfiguration(config: BackgroundAudioConfiguration) {\n this._backgroundAudioConfiguration = config;\n\n // Notify media session\n this._mediaSession?.updateActionHandlers();\n }\n\n get volume(): number {\n return this._player ? this._player.volume : 1;\n }\n\n set volume(volume: number) {\n if (this._player) {\n this._player.volume = volume;\n }\n }\n\n get muted(): boolean {\n return this._player ? this._player.muted : false;\n }\n\n set muted(muted: boolean) {\n if (this._player) {\n this._player.muted = muted;\n }\n }\n\n get seeking(): boolean {\n return this._player ? this._player.seeking : false;\n }\n\n get presentationMode(): PresentationMode {\n return this._presentationModeManager.presentationMode;\n }\n\n set presentationMode(presentationMode: PresentationMode) {\n this._presentationModeManager.presentationMode = presentationMode;\n }\n\n get audioTracks(): MediaTrack[] {\n return this._player ? fromNativeMediaTrackList(this._player.audioTracks) : [];\n }\n\n get videoTracks(): MediaTrack[] {\n return this._player ? fromNativeMediaTrackList(this._player.videoTracks) : [];\n }\n\n get textTracks(): TextTrack[] {\n return this._player ? fromNativeTextTrackList(this._player.textTracks) : [];\n }\n\n get selectedTextTrack(): number | undefined {\n if (this._player) {\n return this._player.textTracks.find((textTrack: NativeTextTrack) => {\n return textTrack.mode === 'showing';\n })?.uid;\n }\n return undefined;\n }\n\n set selectedTextTrack(selectedTextTrack: number | undefined) {\n if (this._player) {\n this._player.textTracks.forEach((textTrack: NativeTextTrack) => {\n textTrack.mode = textTrack.uid === selectedTextTrack ? 'showing' : 'disabled';\n });\n }\n }\n\n get textTrackStyle(): TextTrackStyle {\n return this._player?.textTrackStyle as TextTrackStyle;\n }\n\n get selectedVideoTrack(): number | undefined {\n if (this._player) {\n return this._player.videoTracks.find((videoTrack: NativeMediaTrack) => videoTrack.enabled)?.uid;\n }\n return undefined;\n }\n\n set selectedVideoTrack(selectedVideoTrack: number | undefined) {\n if (this._player) {\n this._targetVideoQuality = undefined;\n this._player.videoTracks.forEach((videoTrack: NativeMediaTrack) => {\n videoTrack.enabled = videoTrack.uid === selectedVideoTrack;\n });\n }\n }\n\n get selectedAudioTrack(): number | undefined {\n if (this._player) {\n return this._player.audioTracks.find((audioTrack: NativeMediaTrack) => {\n return audioTrack.enabled;\n })?.uid;\n }\n return undefined;\n }\n\n set selectedAudioTrack(selectedAudioTrack: number | undefined) {\n if (this._player) {\n this._player.audioTracks.forEach((audioTrack: NativeMediaTrack) => {\n audioTrack.enabled = audioTrack.uid === selectedAudioTrack;\n });\n }\n }\n\n get targetVideoQuality(): number | number[] | undefined {\n if (this._player) {\n return this._targetVideoQuality;\n }\n return undefined;\n }\n\n set targetVideoQuality(targetVideoQuality: number | number[] | undefined) {\n if (this._player) {\n const enabledVideoTrack = this._player.videoTracks.find((videoTrack: NativeMediaTrack) => videoTrack.enabled);\n if (enabledVideoTrack) {\n enabledVideoTrack.targetQuality = findNativeQualitiesByUid(enabledVideoTrack, targetVideoQuality);\n }\n this._targetVideoQuality = targetVideoQuality;\n }\n }\n\n get currentTime(): number {\n return this._player ? 1e3 * this._player.currentTime : NaN;\n }\n\n set currentTime(currentTime: number) {\n if (isNaN(currentTime)) {\n return;\n }\n if (this._player) {\n this._player.currentTime = currentTime / 1e3;\n }\n }\n\n get aspectRatio(): AspectRatio {\n return AspectRatio.FIT;\n }\n\n set aspectRatio(_ratio: AspectRatio) {\n // unused\n }\n\n get duration(): number {\n return this._player ? this._player.duration * 1e3 : NaN;\n }\n\n public get ads(): AdsAPI {\n return this._adsAdapter;\n }\n\n public get cast(): CastAPI {\n return this._castAdapter;\n }\n\n destroy(): void {\n this.dispatchEvent(new BaseEvent(PlayerEventType.DESTROY));\n this._eventForwarder?.unload();\n this._mediaSession?.destroy();\n document.removeEventListener('visibilitychange', this.onVisibilityChange);\n this._eventForwarder = undefined;\n this._mediaSession = undefined;\n this._player?.destroy();\n this._player = undefined;\n }\n\n get nativeHandle(): NativeHandleType {\n return this._player;\n }\n\n private readonly onVisibilityChange = () => {\n if (!this._player) {\n return;\n }\n if (document.visibilityState !== 'visible') {\n // Apply background configuration: by default, pause when going to background, unless in pip\n if (this.presentationMode !== PresentationMode.pip && !this.backgroundAudioConfiguration.enabled) {\n this._player.pause();\n }\n }\n // Apply media session controls\n this._mediaSession?.updateActionHandlers();\n };\n}\n"],"mappings":"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"}
@@ -6,7 +6,11 @@
6
6
  *
7
7
  * @public
8
8
  */
9
- export declare type ABRStrategyType = 'performance' | 'quality' | 'bandwidth';
9
+ export declare enum ABRStrategyType {
10
+ performance = "performance",
11
+ quality = "quality",
12
+ bandwidth = "bandwidth"
13
+ }
10
14
  /**
11
15
  * Describes the metadata of the adaptive bitrate strategy.
12
16
  *
@@ -12,6 +12,21 @@ import type { PresentationMode } from '../presentation/PresentationMode';
12
12
  import type { PiPConfiguration } from '../pip/PiPConfiguration';
13
13
  import type { BackgroundAudioConfiguration } from '../backgroundAudio/BackgroundAudioConfiguration';
14
14
  export declare type PreloadType = 'none' | 'metadata' | 'auto' | '';
15
+ /**
16
+ * Specifies an aspect ratio for the player.
17
+ *
18
+ * <br/> - `FIT` (default): Scales the player so that all content fits inside its bounding box, keeping the original aspect ratio of the content..
19
+ * <br/> - `FILL`: Scales the player so that all content fits inside the bounding box, which will be stretched to fill it entirely.
20
+ * <br/> - `ASPECT_FILL`: Scales the player so that the content fills up the entire bounding box, keeping the original aspect ratio of the content.
21
+ *
22
+ * @public
23
+ * @defaultValue `'FIT'`
24
+ */
25
+ export declare enum AspectRatio {
26
+ FIT = "fit",
27
+ FILL = "fill",
28
+ ASPECT_FILL = "aspectFill"
29
+ }
15
30
  export declare type NativeHandleType = unknown;
16
31
  /**
17
32
  * The THEOplayer API.
@@ -127,6 +142,13 @@ export interface THEOplayer extends EventDispatcher<PlayerEventMap> {
127
142
  * The current playback position of the media, in milliseconds.
128
143
  */
129
144
  currentTime: number;
145
+ /**
146
+ * Used to set the aspect ratio of the player.
147
+ *
148
+ * @remarks
149
+ * Only available for iOS and Android.
150
+ */
151
+ aspectRatio: AspectRatio;
130
152
  /**
131
153
  * The active configuration for PiP.
132
154
  */
@@ -44,3 +44,4 @@ export interface Track {
44
44
  export declare function hasTrack<TTrack extends Track>(trackList: TTrack[], track: TTrack): boolean;
45
45
  export declare function removeTrack<TTrack extends Track>(trackList: TTrack[], track: TTrack): TTrack[];
46
46
  export declare function addTrack<TTrack extends Track>(trackList: TTrack[], track: TTrack): TTrack[];
47
+ export declare function sortTracks<TTrack extends Track>(trackList?: TTrack[]): TTrack[];
@@ -1,6 +1,7 @@
1
1
  import type { MediaTrack, PreloadType, PresentationMode, SourceDescription, TextTrack, TimeRange } from 'react-native-theoplayer';
2
2
  import type { BackgroundAudioConfiguration } from '../../api/backgroundAudio/BackgroundAudioConfiguration';
3
3
  import type { PiPConfiguration } from 'react-native-theoplayer';
4
+ import type { AspectRatio } from 'react-native-theoplayer';
4
5
  export interface NativePlayerState {
5
6
  source: SourceDescription | undefined;
6
7
  autoplay: boolean;
@@ -17,6 +18,7 @@ export interface NativePlayerState {
17
18
  duration: number;
18
19
  playbackRate: number;
19
20
  preload: PreloadType;
21
+ aspectRatio: AspectRatio;
20
22
  audioTracks: MediaTrack[];
21
23
  videoTracks: MediaTrack[];
22
24
  textTracks: TextTrack[];
@@ -1,6 +1,6 @@
1
1
  import { DefaultEventDispatcher } from './event/DefaultEventDispatcher';
2
2
  import type { ABRConfiguration, AdsAPI, CastAPI, MediaTrack, NativeHandleType, PiPConfiguration, PlayerEventMap, SourceDescription, TextTrack, THEOplayer, THEOplayerView } from 'react-native-theoplayer';
3
- import { PreloadType, PresentationMode, TextTrackStyle } from 'react-native-theoplayer';
3
+ import { AspectRatio, PreloadType, PresentationMode, TextTrackStyle } from 'react-native-theoplayer';
4
4
  import type { BackgroundAudioConfiguration } from 'src/api/backgroundAudio/BackgroundAudioConfiguration';
5
5
  import type { NativePlayerState } from './NativePlayerState';
6
6
  export declare class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> implements THEOplayer {
@@ -66,6 +66,8 @@ export declare class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEven
66
66
  set targetVideoQuality(target: number | number[] | undefined);
67
67
  get volume(): number;
68
68
  set volume(volume: number);
69
+ get aspectRatio(): AspectRatio;
70
+ set aspectRatio(ratio: AspectRatio);
69
71
  pause(): void;
70
72
  play(): void;
71
73
  get nativeHandle(): NativeHandleType;
@@ -1,17 +1,17 @@
1
1
  import { DefaultEventDispatcher } from './event/DefaultEventDispatcher';
2
- import type { AdsAPI, CastAPI, MediaTrack, NativeHandleType, PlayerEventMap, PreloadType, TextTrack, TextTrackStyle, THEOplayer, PlayerConfiguration } from 'react-native-theoplayer';
2
+ import type { AdsAPI, CastAPI, MediaTrack, NativeHandleType, PlayerConfiguration, PlayerEventMap, PreloadType, TextTrack, TextTrackStyle, THEOplayer } from 'react-native-theoplayer';
3
+ import { AspectRatio, PresentationMode } from 'react-native-theoplayer';
3
4
  import type * as THEOplayerWeb from 'theoplayer';
4
5
  import type { ABRConfiguration, SourceDescription } from 'src/api/barrel';
5
6
  import type { PiPConfiguration } from 'src/api/pip/PiPConfiguration';
6
7
  import type { BackgroundAudioConfiguration } from 'src/api/backgroundAudio/BackgroundAudioConfiguration';
7
- import { PresentationMode } from 'react-native-theoplayer';
8
8
  export declare class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap> implements THEOplayer {
9
- private readonly _player;
10
9
  private readonly _adsAdapter;
11
10
  private readonly _castAdapter;
12
- private readonly _eventForwarder;
13
11
  private readonly _presentationModeManager;
14
- private readonly _mediaSession;
12
+ private _player;
13
+ private _eventForwarder;
14
+ private _mediaSession;
15
15
  private _targetVideoQuality;
16
16
  private _backgroundAudioConfiguration;
17
17
  private _pipConfiguration;
@@ -61,6 +61,8 @@ export declare class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerE
61
61
  set targetVideoQuality(targetVideoQuality: number | number[] | undefined);
62
62
  get currentTime(): number;
63
63
  set currentTime(currentTime: number);
64
+ get aspectRatio(): AspectRatio;
65
+ set aspectRatio(_ratio: AspectRatio);
64
66
  get duration(): number;
65
67
  get ads(): AdsAPI;
66
68
  get cast(): CastAPI;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-theoplayer",
3
- "version": "2.4.0",
3
+ "version": "2.6.0",
4
4
  "description": "A THEOplayer video component for react-native.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -25,7 +25,7 @@
25
25
  "scripts": {
26
26
  "typescript": "tsc --noEmit",
27
27
  "lint": "eslint \"**/*.{ts,tsx}\"",
28
- "prepare": "bob build",
28
+ "prepare": "bob build && husky install",
29
29
  "release": "release-it",
30
30
  "pods": "cd example && pod-install --quiet"
31
31
  },
@@ -67,7 +67,13 @@
67
67
  },
68
68
  "peerDependencies": {
69
69
  "react": "*",
70
- "react-native": "*"
70
+ "react-native": "*",
71
+ "theoplayer": ">=5.0.1"
72
+ },
73
+ "peerDependenciesMeta": {
74
+ "theoplayer": {
75
+ "optional": true
76
+ }
71
77
  },
72
78
  "commitlint": {
73
79
  "extends": [
@@ -116,7 +122,6 @@
116
122
  "react-native-svg": "^13.8.0",
117
123
  "react-native-svg-web": "^1.0.0",
118
124
  "react-native-url-polyfill": "^1.3.0",
119
- "theoplayer": ">=5.0.1",
120
125
  "url-polyfill": "^1.1.12"
121
126
  }
122
127
  }
@@ -36,7 +36,7 @@ Pod::Spec.new do |s|
36
36
  }
37
37
  else
38
38
  puts "Using THEOplayer-core SDK"
39
- s.dependency "THEOplayerSDK-core", "~> 5.0.1"
39
+ s.dependency "THEOplayerSDK-core", "~> 5.1"
40
40
  if theofeatures.include?("GOOGLE_IMA")
41
41
  puts "Adding THEOplayer-Integration-GoogleIMA"
42
42
  s.dependency "THEOplayer-Integration-GoogleIMA"
@@ -6,7 +6,11 @@
6
6
  *
7
7
  * @public
8
8
  */
9
- export type ABRStrategyType = 'performance' | 'quality' | 'bandwidth';
9
+ export enum ABRStrategyType {
10
+ performance = 'performance',
11
+ quality = 'quality',
12
+ bandwidth = 'bandwidth',
13
+ }
10
14
 
11
15
  /**
12
16
  * Describes the metadata of the adaptive bitrate strategy.
@@ -14,6 +14,22 @@ import type { BackgroundAudioConfiguration } from '../backgroundAudio/Background
14
14
 
15
15
  export type PreloadType = 'none' | 'metadata' | 'auto' | '';
16
16
 
17
+ /**
18
+ * Specifies an aspect ratio for the player.
19
+ *
20
+ * <br/> - `FIT` (default): Scales the player so that all content fits inside its bounding box, keeping the original aspect ratio of the content..
21
+ * <br/> - `FILL`: Scales the player so that all content fits inside the bounding box, which will be stretched to fill it entirely.
22
+ * <br/> - `ASPECT_FILL`: Scales the player so that the content fills up the entire bounding box, keeping the original aspect ratio of the content.
23
+ *
24
+ * @public
25
+ * @defaultValue `'FIT'`
26
+ */
27
+ export enum AspectRatio {
28
+ FIT = 'fit',
29
+ FILL = 'fill',
30
+ ASPECT_FILL = 'aspectFill',
31
+ }
32
+
17
33
  export type NativeHandleType = unknown;
18
34
 
19
35
  /**
@@ -153,6 +169,14 @@ export interface THEOplayer extends EventDispatcher<PlayerEventMap> {
153
169
  */
154
170
  currentTime: number;
155
171
 
172
+ /**
173
+ * Used to set the aspect ratio of the player.
174
+ *
175
+ * @remarks
176
+ * Only available for iOS and Android.
177
+ */
178
+ aspectRatio: AspectRatio;
179
+
156
180
  /**
157
181
  * The active configuration for PiP.
158
182
  */
@@ -55,5 +55,9 @@ export function removeTrack<TTrack extends Track>(trackList: TTrack[], track: TT
55
55
  }
56
56
 
57
57
  export function addTrack<TTrack extends Track>(trackList: TTrack[], track: TTrack): TTrack[] {
58
- return trackList && track && !hasTrack(trackList, track) ? [...trackList, track] : trackList;
58
+ return trackList && track && !hasTrack(trackList, track) ? sortTracks([...trackList, track]) : trackList;
59
+ }
60
+
61
+ export function sortTracks<TTrack extends Track>(trackList?: TTrack[]): TTrack[] {
62
+ return trackList?.sort((t1: TTrack, t2: TTrack) => t1.uid - t2.uid) || [];
59
63
  }
@@ -2,8 +2,6 @@ import React, { useEffect, useRef } from 'react';
2
2
  import type { THEOplayerViewProps } from 'react-native-theoplayer';
3
3
  import * as THEOplayer from 'theoplayer';
4
4
  import { THEOplayerWebAdapter } from './adapter/THEOplayerWebAdapter';
5
- import { BaseEvent } from './adapter/event/BaseEvent';
6
- import { PlayerEventType } from 'react-native-theoplayer';
7
5
 
8
6
  export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProps>) {
9
7
  const { config, children } = props;
@@ -15,7 +13,7 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
15
13
  // Create player inside container.
16
14
  if (container.current) {
17
15
  const chromeless = config?.chromeless === true || config?.chromeless === undefined;
18
- const updatedConfig = {...config, allowNativeFullscreen: true};
16
+ const updatedConfig = { ...config, allowNativeFullscreen: true };
19
17
  if (chromeless) {
20
18
  player.current = new THEOplayer.ChromelessPlayer(container.current, updatedConfig);
21
19
  } else {
@@ -23,7 +21,7 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
23
21
  ...updatedConfig,
24
22
  ui: {
25
23
  fluid: true,
26
- }
24
+ },
27
25
  } as THEOplayer.PlayerConfiguration);
28
26
  }
29
27
 
@@ -48,9 +46,7 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
48
46
  if (adapter?.current && onPlayerDestroy) {
49
47
  onPlayerDestroy(adapter?.current);
50
48
  }
51
- adapter?.current?.dispatchEvent(new BaseEvent(PlayerEventType.DESTROY));
52
49
  adapter?.current?.destroy();
53
- player?.current?.destroy();
54
50
  };
55
51
  }, [container]);
56
52
 
@@ -1,6 +1,7 @@
1
1
  import type { MediaTrack, PreloadType, PresentationMode, SourceDescription, TextTrack, TimeRange } from 'react-native-theoplayer';
2
2
  import type { BackgroundAudioConfiguration } from '../../api/backgroundAudio/BackgroundAudioConfiguration';
3
3
  import type { PiPConfiguration } from 'react-native-theoplayer';
4
+ import type { AspectRatio } from 'react-native-theoplayer';
4
5
 
5
6
  export interface NativePlayerState {
6
7
  source: SourceDescription | undefined;
@@ -18,6 +19,7 @@ export interface NativePlayerState {
18
19
  duration: number;
19
20
  playbackRate: number;
20
21
  preload: PreloadType;
22
+ aspectRatio: AspectRatio;
21
23
  audioTracks: MediaTrack[];
22
24
  videoTracks: MediaTrack[];
23
25
  textTracks: TextTrack[];
@@ -23,6 +23,7 @@ import type {
23
23
  } from 'react-native-theoplayer';
24
24
  import {
25
25
  addTrack,
26
+ AspectRatio,
26
27
  findMediaTrackByUid,
27
28
  MediaTrackEventType,
28
29
  MediaTrackType,
@@ -58,6 +59,7 @@ const defaultPlayerState: NativePlayerState = {
58
59
  duration: NaN,
59
60
  playbackRate: 1,
60
61
  preload: 'none',
62
+ aspectRatio: AspectRatio.FIT,
61
63
  audioTracks: [],
62
64
  videoTracks: [],
63
65
  textTracks: [],
@@ -435,6 +437,15 @@ export class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> im
435
437
  NativeModules.PlayerModule.setVolume(this._view.nativeHandle, volume);
436
438
  }
437
439
 
440
+ get aspectRatio(): AspectRatio {
441
+ return this._state.aspectRatio;
442
+ }
443
+
444
+ set aspectRatio(ratio: AspectRatio) {
445
+ this._state.aspectRatio = ratio;
446
+ NativeModules.PlayerModule.setAspectRatio(this._view.nativeHandle, ratio);
447
+ }
448
+
438
449
  pause(): void {
439
450
  this._state.paused = true;
440
451
  NativeModules.PlayerModule.setPaused(this._view.nativeHandle, true);