bitmovin-player-react-native 0.44.1-alpha.0 → 1.0.0-alpha.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/.eslintignore +11 -0
- package/.eslintrc.js +7 -0
- package/.gitattributes +3 -0
- package/.prettierignore +11 -0
- package/.ruby-version +1 -0
- package/.swiftlint.yml +171 -0
- package/Brewfile +2 -0
- package/CHANGELOG.md +627 -0
- package/CONTRIBUTING.md +255 -0
- package/TODO.md +0 -0
- package/android/.editorconfig +8 -0
- package/android/build.gradle +78 -75
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/android/gradle.properties +1 -0
- package/android/gradlew +248 -0
- package/android/gradlew.bat +92 -0
- package/android/ktlint.gradle +31 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/ActivityLifecycleListener.kt +51 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/BitmovinCastManagerModule.kt +32 -55
- package/android/src/main/java/com/bitmovin/player/reactnative/BufferModule.kt +33 -45
- package/android/src/main/java/com/bitmovin/player/reactnative/CustomMessageHandlerModule.kt +84 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/DebugModule.kt +6 -14
- package/android/src/main/java/com/bitmovin/player/reactnative/DecoderConfigModule.kt +89 -44
- package/android/src/main/java/com/bitmovin/player/reactnative/DrmModule.kt +80 -99
- package/android/src/main/java/com/bitmovin/player/reactnative/EventSubscription.kt +22 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/FullscreenHandlerModule.kt +100 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/MediaSessionPlaybackManager.kt +5 -5
- package/android/src/main/java/com/bitmovin/player/reactnative/NetworkModule.kt +98 -56
- package/android/src/main/java/com/bitmovin/player/reactnative/OfflineModule.kt +132 -186
- package/android/src/main/java/com/bitmovin/player/reactnative/PlayerAnalyticsModule.kt +37 -36
- package/android/src/main/java/com/bitmovin/player/reactnative/PlayerModule.kt +252 -528
- package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerPackage.kt +11 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerView.kt +558 -213
- package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerViewManager.kt +99 -286
- package/android/src/main/java/com/bitmovin/player/reactnative/ResultWaiter.kt +58 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/SourceModule.kt +77 -151
- package/android/src/main/java/com/bitmovin/player/reactnative/Types.kt +44 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/UuidModule.kt +12 -15
- package/android/src/main/java/com/bitmovin/player/reactnative/converter/JsonConverter.kt +296 -456
- package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ListExtension.kt +89 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/extensions/MapExtension.kt +95 -0
- package/android/src/main/java/com/bitmovin/player/reactnative/offline/OfflineContentManagerBridge.kt +20 -52
- package/android/src/main/java/com/bitmovin/player/reactnative/ui/CustomMessageHandlerBridge.kt +10 -20
- package/android/src/main/java/com/bitmovin/player/reactnative/ui/FullscreenHandlerBridge.kt +4 -9
- package/app.plugin.js +21 -0
- package/build/BitmovinPlayerReactNative.types.d.ts +18 -0
- package/build/BitmovinPlayerReactNative.types.d.ts.map +1 -0
- package/build/BitmovinPlayerReactNative.types.js +2 -0
- package/build/BitmovinPlayerReactNative.types.js.map +1 -0
- package/build/adaptationConfig.d.ts +18 -0
- package/build/adaptationConfig.d.ts.map +1 -0
- package/build/adaptationConfig.js +2 -0
- package/build/adaptationConfig.js.map +1 -0
- package/build/advertising.d.ts +175 -0
- package/build/advertising.d.ts.map +1 -0
- package/build/advertising.js +37 -0
- package/build/advertising.js.map +1 -0
- package/build/analytics/config.d.ts +194 -0
- package/build/analytics/config.d.ts.map +1 -0
- package/build/analytics/config.js +2 -0
- package/build/analytics/config.js.map +1 -0
- package/build/analytics/index.d.ts +3 -0
- package/build/analytics/index.d.ts.map +1 -0
- package/build/analytics/index.js +3 -0
- package/build/analytics/index.js.map +1 -0
- package/build/analytics/player.d.ts +24 -0
- package/build/analytics/player.d.ts.map +1 -0
- package/build/analytics/player.js +30 -0
- package/build/analytics/player.js.map +1 -0
- package/build/analytics/playerAnalyticsModule.d.ts +13 -0
- package/build/analytics/playerAnalyticsModule.d.ts.map +1 -0
- package/build/analytics/playerAnalyticsModule.js +3 -0
- package/build/analytics/playerAnalyticsModule.js.map +1 -0
- package/build/audioSession.d.ts +33 -0
- package/build/audioSession.d.ts.map +1 -0
- package/build/audioSession.js +21 -0
- package/build/audioSession.js.map +1 -0
- package/build/audioTrack.d.ts +39 -0
- package/build/audioTrack.d.ts.map +1 -0
- package/build/audioTrack.js +2 -0
- package/build/audioTrack.js.map +1 -0
- package/build/bitmovinCastManager.d.ts +58 -0
- package/build/bitmovinCastManager.d.ts.map +1 -0
- package/build/bitmovinCastManager.js +64 -0
- package/build/bitmovinCastManager.js.map +1 -0
- package/build/bufferApi.d.ts +85 -0
- package/build/bufferApi.d.ts.map +1 -0
- package/build/bufferApi.js +60 -0
- package/build/bufferApi.js.map +1 -0
- package/build/bufferConfig.d.ts +42 -0
- package/build/bufferConfig.d.ts.map +1 -0
- package/build/bufferConfig.js +2 -0
- package/build/bufferConfig.js.map +1 -0
- package/build/components/PlayerView/events.d.ts +310 -0
- package/build/components/PlayerView/events.d.ts.map +1 -0
- package/build/components/PlayerView/events.js +2 -0
- package/build/components/PlayerView/events.js.map +1 -0
- package/build/components/PlayerView/index.d.ts +10 -0
- package/build/components/PlayerView/index.d.ts.map +1 -0
- package/build/components/PlayerView/index.js +72 -0
- package/build/components/PlayerView/index.js.map +1 -0
- package/build/components/PlayerView/native.d.ts +30 -0
- package/build/components/PlayerView/native.d.ts.map +1 -0
- package/build/components/PlayerView/native.js +6 -0
- package/build/components/PlayerView/native.js.map +1 -0
- package/build/components/PlayerView/nativeEvents.d.ts +437 -0
- package/build/components/PlayerView/nativeEvents.d.ts.map +1 -0
- package/build/components/PlayerView/nativeEvents.js +2 -0
- package/build/components/PlayerView/nativeEvents.js.map +1 -0
- package/build/components/PlayerView/pictureInPictureConfig.d.ts +22 -0
- package/build/components/PlayerView/pictureInPictureConfig.d.ts.map +1 -0
- package/build/components/PlayerView/pictureInPictureConfig.js +2 -0
- package/build/components/PlayerView/pictureInPictureConfig.js.map +1 -0
- package/build/components/PlayerView/playerViewConfig.d.ts +111 -0
- package/build/components/PlayerView/playerViewConfig.d.ts.map +1 -0
- package/build/components/PlayerView/playerViewConfig.js +51 -0
- package/build/components/PlayerView/playerViewConfig.js.map +1 -0
- package/build/components/PlayerView/properties.d.ts +61 -0
- package/build/components/PlayerView/properties.d.ts.map +1 -0
- package/build/components/PlayerView/properties.js +2 -0
- package/build/components/PlayerView/properties.js.map +1 -0
- package/build/components/index.d.ts +5 -0
- package/build/components/index.d.ts.map +1 -0
- package/build/components/index.js +5 -0
- package/build/components/index.js.map +1 -0
- package/build/debug.d.ts +46 -0
- package/build/debug.d.ts.map +1 -0
- package/build/debug.js +52 -0
- package/build/debug.js.map +1 -0
- package/build/decoder/decoderConfig.d.ts +96 -0
- package/build/decoder/decoderConfig.d.ts.map +1 -0
- package/build/decoder/decoderConfig.js +6 -0
- package/build/decoder/decoderConfig.js.map +1 -0
- package/build/decoder/decoderConfigModule.d.ts +14 -0
- package/build/decoder/decoderConfigModule.d.ts.map +1 -0
- package/build/decoder/decoderConfigModule.js +31 -0
- package/build/decoder/decoderConfigModule.js.map +1 -0
- package/build/decoder/index.d.ts +26 -0
- package/build/decoder/index.d.ts.map +1 -0
- package/build/decoder/index.js +50 -0
- package/build/decoder/index.js.map +1 -0
- package/build/drm/drmModule.d.ts +55 -0
- package/build/drm/drmModule.d.ts.map +1 -0
- package/build/drm/drmModule.js +3 -0
- package/build/drm/drmModule.js.map +1 -0
- package/build/drm/fairplayConfig.d.ts +91 -0
- package/build/drm/fairplayConfig.d.ts.map +1 -0
- package/build/drm/fairplayConfig.js +2 -0
- package/build/drm/fairplayConfig.js.map +1 -0
- package/build/drm/index.d.ts +112 -0
- package/build/drm/index.d.ts.map +1 -0
- package/build/drm/index.js +191 -0
- package/build/drm/index.js.map +1 -0
- package/build/drm/widevineConfig.d.ts +58 -0
- package/build/drm/widevineConfig.d.ts.map +1 -0
- package/build/drm/widevineConfig.js +2 -0
- package/build/drm/widevineConfig.js.map +1 -0
- package/build/events.d.ts +692 -0
- package/build/events.d.ts.map +1 -0
- package/build/events.js +2 -0
- package/build/events.js.map +1 -0
- package/build/hooks/index.d.ts +2 -0
- package/build/hooks/index.d.ts.map +1 -0
- package/build/hooks/index.js +2 -0
- package/build/hooks/index.js.map +1 -0
- package/build/hooks/usePlayer.d.ts +8 -0
- package/build/hooks/usePlayer.d.ts.map +1 -0
- package/build/hooks/usePlayer.js +10 -0
- package/build/hooks/usePlayer.js.map +1 -0
- package/build/hooks/useProxy.d.ts +18 -0
- package/build/hooks/useProxy.d.ts.map +1 -0
- package/build/hooks/useProxy.js +16 -0
- package/build/hooks/useProxy.js.map +1 -0
- package/build/index.d.ts +32 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +32 -0
- package/build/index.js.map +1 -0
- package/build/liveConfig.d.ts +13 -0
- package/build/liveConfig.d.ts.map +1 -0
- package/build/liveConfig.js +2 -0
- package/build/liveConfig.js.map +1 -0
- package/build/media.d.ts +85 -0
- package/build/media.d.ts.map +1 -0
- package/build/media.js +2 -0
- package/build/media.js.map +1 -0
- package/build/mediaControlConfig.d.ts +62 -0
- package/build/mediaControlConfig.d.ts.map +1 -0
- package/build/mediaControlConfig.js +2 -0
- package/build/mediaControlConfig.js.map +1 -0
- package/build/mediaTrackRole.d.ts +28 -0
- package/build/mediaTrackRole.d.ts.map +1 -0
- package/build/mediaTrackRole.js +2 -0
- package/build/mediaTrackRole.js.map +1 -0
- package/build/modules/AudioSessionModule.d.ts +8 -0
- package/build/modules/AudioSessionModule.d.ts.map +1 -0
- package/build/modules/AudioSessionModule.js +7 -0
- package/build/modules/AudioSessionModule.js.map +1 -0
- package/build/modules/BitmovinCastManagerModule.d.ts +11 -0
- package/build/modules/BitmovinCastManagerModule.d.ts.map +1 -0
- package/build/modules/BitmovinCastManagerModule.js +3 -0
- package/build/modules/BitmovinCastManagerModule.js.map +1 -0
- package/build/modules/BufferModule.d.ts +16 -0
- package/build/modules/BufferModule.d.ts.map +1 -0
- package/build/modules/BufferModule.js +3 -0
- package/build/modules/BufferModule.js.map +1 -0
- package/build/modules/DebugModule.d.ts +8 -0
- package/build/modules/DebugModule.d.ts.map +1 -0
- package/build/modules/DebugModule.js +3 -0
- package/build/modules/DebugModule.js.map +1 -0
- package/build/modules/PlayerModule.d.ts +188 -0
- package/build/modules/PlayerModule.d.ts.map +1 -0
- package/build/modules/PlayerModule.js +3 -0
- package/build/modules/PlayerModule.js.map +1 -0
- package/build/modules/SourceModule.d.ts +51 -0
- package/build/modules/SourceModule.d.ts.map +1 -0
- package/build/modules/SourceModule.js +3 -0
- package/build/modules/SourceModule.js.map +1 -0
- package/build/modules/UuidModule.d.ts +8 -0
- package/build/modules/UuidModule.d.ts.map +1 -0
- package/build/modules/UuidModule.js +3 -0
- package/build/modules/UuidModule.js.map +1 -0
- package/build/nativeInstance.d.ts +49 -0
- package/build/nativeInstance.d.ts.map +1 -0
- package/build/nativeInstance.js +20 -0
- package/build/nativeInstance.js.map +1 -0
- package/build/network/index.d.ts +50 -0
- package/build/network/index.d.ts.map +1 -0
- package/build/network/index.js +102 -0
- package/build/network/index.js.map +1 -0
- package/build/network/networkConfig.d.ts +151 -0
- package/build/network/networkConfig.d.ts.map +1 -0
- package/build/network/networkConfig.js +21 -0
- package/build/network/networkConfig.js.map +1 -0
- package/build/network/networkModule.d.ts +29 -0
- package/build/network/networkModule.d.ts.map +1 -0
- package/build/network/networkModule.js +3 -0
- package/build/network/networkModule.js.map +1 -0
- package/build/offline/index.d.ts +8 -0
- package/build/offline/index.d.ts.map +1 -0
- package/build/offline/index.js +8 -0
- package/build/offline/index.js.map +1 -0
- package/build/offline/offlineContentConfig.d.ts +18 -0
- package/build/offline/offlineContentConfig.d.ts.map +1 -0
- package/build/offline/offlineContentConfig.js +2 -0
- package/build/offline/offlineContentConfig.js.map +1 -0
- package/build/offline/offlineContentManager.d.ts +90 -0
- package/build/offline/offlineContentManager.d.ts.map +1 -0
- package/build/offline/offlineContentManager.js +177 -0
- package/build/offline/offlineContentManager.js.map +1 -0
- package/build/offline/offlineContentManagerListener.d.ts +174 -0
- package/build/offline/offlineContentManagerListener.d.ts.map +1 -0
- package/build/offline/offlineContentManagerListener.js +17 -0
- package/build/offline/offlineContentManagerListener.js.map +1 -0
- package/build/offline/offlineContentOptions.d.ts +29 -0
- package/build/offline/offlineContentOptions.d.ts.map +1 -0
- package/build/offline/offlineContentOptions.js +2 -0
- package/build/offline/offlineContentOptions.js.map +1 -0
- package/build/offline/offlineDownloadRequest.d.ts +19 -0
- package/build/offline/offlineDownloadRequest.d.ts.map +1 -0
- package/build/offline/offlineDownloadRequest.js +2 -0
- package/build/offline/offlineDownloadRequest.js.map +1 -0
- package/build/offline/offlineModule.d.ts +32 -0
- package/build/offline/offlineModule.d.ts.map +1 -0
- package/build/offline/offlineModule.js +3 -0
- package/build/offline/offlineModule.js.map +1 -0
- package/build/offline/offlineSourceOptions.d.ts +12 -0
- package/build/offline/offlineSourceOptions.d.ts.map +1 -0
- package/build/offline/offlineSourceOptions.js +2 -0
- package/build/offline/offlineSourceOptions.js.map +1 -0
- package/build/offline/offlineState.d.ts +23 -0
- package/build/offline/offlineState.d.ts.map +1 -0
- package/build/offline/offlineState.js +24 -0
- package/build/offline/offlineState.js.map +1 -0
- package/build/playbackConfig.d.ts +88 -0
- package/build/playbackConfig.d.ts.map +1 -0
- package/build/playbackConfig.js +2 -0
- package/build/playbackConfig.js.map +1 -0
- package/build/player.d.ts +308 -0
- package/build/player.d.ts.map +1 -0
- package/build/player.js +445 -0
- package/build/player.js.map +1 -0
- package/build/playerConfig.d.ts +83 -0
- package/build/playerConfig.d.ts.map +1 -0
- package/build/playerConfig.js +2 -0
- package/build/playerConfig.js.map +1 -0
- package/build/remoteControlConfig.d.ts +38 -0
- package/build/remoteControlConfig.d.ts.map +1 -0
- package/build/remoteControlConfig.js +2 -0
- package/build/remoteControlConfig.js.map +1 -0
- package/build/source.d.ts +216 -0
- package/build/source.d.ts.map +1 -0
- package/build/source.js +167 -0
- package/build/source.js.map +1 -0
- package/build/styleConfig.d.ts +120 -0
- package/build/styleConfig.d.ts.map +1 -0
- package/build/styleConfig.js +38 -0
- package/build/styleConfig.js.map +1 -0
- package/build/subtitleFormat.d.ts +27 -0
- package/build/subtitleFormat.d.ts.map +1 -0
- package/build/subtitleFormat.js +28 -0
- package/build/subtitleFormat.js.map +1 -0
- package/build/subtitleTrack.d.ts +55 -0
- package/build/subtitleTrack.d.ts.map +1 -0
- package/build/subtitleTrack.js +2 -0
- package/build/subtitleTrack.js.map +1 -0
- package/build/thumbnail.d.ts +38 -0
- package/build/thumbnail.d.ts.map +1 -0
- package/build/thumbnail.js +2 -0
- package/build/thumbnail.js.map +1 -0
- package/build/tweaksConfig.d.ts +197 -0
- package/build/tweaksConfig.d.ts.map +1 -0
- package/build/tweaksConfig.js +25 -0
- package/build/tweaksConfig.js.map +1 -0
- package/build/ui/customMessageHandlerModule.d.ts +27 -0
- package/build/ui/customMessageHandlerModule.d.ts.map +1 -0
- package/build/ui/customMessageHandlerModule.js +3 -0
- package/build/ui/customMessageHandlerModule.js.map +1 -0
- package/build/ui/custommessagehandler.d.ts +56 -0
- package/build/ui/custommessagehandler.d.ts.map +1 -0
- package/build/ui/custommessagehandler.js +54 -0
- package/build/ui/custommessagehandler.js.map +1 -0
- package/build/ui/custommessagehandlerbridge.d.ts +33 -0
- package/build/ui/custommessagehandlerbridge.d.ts.map +1 -0
- package/build/ui/custommessagehandlerbridge.js +72 -0
- package/build/ui/custommessagehandlerbridge.js.map +1 -0
- package/build/ui/custommessagesender.d.ts +5 -0
- package/build/ui/custommessagesender.d.ts.map +1 -0
- package/build/ui/custommessagesender.js +2 -0
- package/build/ui/custommessagesender.js.map +1 -0
- package/build/ui/fullscreenHandlerModule.d.ts +20 -0
- package/build/ui/fullscreenHandlerModule.d.ts.map +1 -0
- package/build/ui/fullscreenHandlerModule.js +3 -0
- package/build/ui/fullscreenHandlerModule.js.map +1 -0
- package/build/ui/fullscreenhandler.d.ts +18 -0
- package/build/ui/fullscreenhandler.d.ts.map +1 -0
- package/build/ui/fullscreenhandler.js +2 -0
- package/build/ui/fullscreenhandler.js.map +1 -0
- package/build/ui/fullscreenhandlerbridge.d.ts +26 -0
- package/build/ui/fullscreenhandlerbridge.d.ts.map +1 -0
- package/build/ui/fullscreenhandlerbridge.js +67 -0
- package/build/ui/fullscreenhandlerbridge.js.map +1 -0
- package/build/ui/index.d.ts +3 -0
- package/build/ui/index.d.ts.map +1 -0
- package/build/ui/index.js +3 -0
- package/build/ui/index.js.map +1 -0
- package/expo-module.config.json +40 -0
- package/ios/AppLifecycleDelegate.swift +25 -0
- package/ios/AudioSessionModule.swift +14 -40
- package/ios/BitmovinCastManagerModule.swift +30 -69
- package/ios/BufferModule.swift +26 -62
- package/ios/CustomMessageHandlerBridge.swift +11 -18
- package/ios/CustomMessageHandlerModule.swift +61 -63
- package/ios/DebugModule.swift +6 -27
- package/ios/DrmModule.swift +105 -379
- package/ios/Event+JSON.swift +1 -0
- package/ios/FullscreenHandlerBridge.swift +12 -5
- package/ios/FullscreenHandlerModule.swift +73 -57
- package/ios/LockedBox.swift +21 -0
- package/ios/ModuleRegistry+Generics.swift +11 -0
- package/ios/NetworkModule.swift +78 -82
- package/ios/OfflineContentManagerBridge.swift +11 -38
- package/ios/OfflineModule.swift +136 -454
- package/ios/PlayerAnalyticsModule.swift +24 -52
- package/ios/PlayerModule.swift +192 -770
- package/ios/RCTConvert+BitmovinPlayer.swift +38 -312
- package/ios/RNBitmovinPlayer.h +1 -8
- package/ios/RNBitmovinPlayer.podspec +47 -0
- package/ios/RNPlayerView.swift +600 -77
- package/ios/RNPlayerViewManager.swift +96 -210
- package/ios/Registry.swift +2 -2
- package/ios/ResultWaiter.swift +66 -0
- package/ios/SourceModule.swift +104 -223
- package/ios/UuidModule.swift +9 -18
- package/package.json +67 -71
- package/plugin/build/FeatureFlags.d.ts +24 -0
- package/plugin/build/FeatureFlags.js +2 -0
- package/plugin/build/index.d.ts +7 -0
- package/plugin/build/index.js +10 -0
- package/plugin/build/withAppGradleDependencies.d.ts +7 -0
- package/plugin/build/withAppGradleDependencies.js +49 -0
- package/plugin/build/withBitmovinAndroidConfig.d.ts +7 -0
- package/plugin/build/withBitmovinAndroidConfig.js +159 -0
- package/plugin/build/withBitmovinConfig.d.ts +7 -0
- package/plugin/build/withBitmovinConfig.js +21 -0
- package/plugin/build/withBitmovinIosConfig.d.ts +7 -0
- package/plugin/build/withBitmovinIosConfig.js +53 -0
- package/plugin/src/FeatureFlags.ts +21 -0
- package/plugin/src/index.ts +9 -0
- package/plugin/src/withAppGradleDependencies.ts +80 -0
- package/plugin/src/withBitmovinAndroidConfig.ts +224 -0
- package/plugin/src/withBitmovinConfig.ts +24 -0
- package/plugin/src/withBitmovinIosConfig.ts +71 -0
- package/plugin/tsconfig.json +9 -0
- package/plugin/tsconfig.tsbuildinfo +1 -0
- package/prettier.config.js +7 -0
- package/scripts/format-android.sh +2 -0
- package/scripts/format-swift.sh +3 -0
- package/scripts/lint-android.sh +2 -0
- package/scripts/lint-swift.sh +3 -0
- package/scripts/pre-commit.sh +14 -0
- package/scripts/setup-hooks.sh +58 -0
- package/src/BitmovinPlayerReactNative.types.ts +19 -0
- package/src/adaptationConfig.ts +1 -1
- package/src/advertising.ts +1 -1
- package/src/analytics/config.ts +4 -4
- package/src/analytics/player.ts +4 -6
- package/src/analytics/playerAnalyticsModule.ts +19 -0
- package/src/audioSession.ts +4 -6
- package/src/audioTrack.ts +1 -1
- package/src/bitmovinCastManager.ts +14 -10
- package/src/bufferApi.ts +1 -3
- package/src/bufferConfig.ts +2 -2
- package/src/components/PlayerView/events.ts +92 -94
- package/src/components/PlayerView/index.tsx +109 -159
- package/src/components/PlayerView/native.ts +24 -11
- package/src/components/PlayerView/nativeEvents.ts +113 -94
- package/src/components/PlayerView/pictureInPictureConfig.ts +1 -1
- package/src/components/PlayerView/playerViewConfig.ts +4 -8
- package/src/components/PlayerView/properties.ts +23 -22
- package/src/debug.ts +1 -3
- package/src/decoder/decoderConfig.ts +3 -3
- package/src/decoder/decoderConfigModule.ts +62 -0
- package/src/decoder/index.ts +32 -16
- package/src/drm/drmModule.ts +84 -0
- package/src/drm/fairplayConfig.ts +1 -1
- package/src/drm/index.ts +130 -40
- package/src/drm/widevineConfig.ts +5 -5
- package/src/events.ts +47 -41
- package/src/hooks/useProxy.ts +13 -20
- package/src/mediaControlConfig.ts +1 -1
- package/src/modules/AudioSessionModule.ts +13 -0
- package/src/modules/BitmovinCastManagerModule.ts +14 -0
- package/src/modules/BufferModule.ts +18 -0
- package/src/modules/DebugModule.ts +9 -0
- package/src/modules/PlayerModule.ts +251 -0
- package/src/modules/SourceModule.ts +74 -0
- package/src/modules/UuidModule.ts +9 -0
- package/src/nativeInstance.ts +3 -3
- package/src/network/index.ts +42 -15
- package/src/network/networkConfig.ts +3 -3
- package/src/network/networkModule.ts +51 -0
- package/src/offline/offlineContentConfig.ts +1 -1
- package/src/offline/offlineContentManager.ts +15 -50
- package/src/offline/offlineContentManagerListener.ts +20 -23
- package/src/offline/offlineContentOptions.ts +2 -2
- package/src/offline/offlineDownloadRequest.ts +1 -1
- package/src/offline/offlineModule.ts +46 -0
- package/src/offline/offlineSourceOptions.ts +2 -2
- package/src/offline/offlineState.ts +1 -1
- package/src/playbackConfig.ts +5 -6
- package/src/player.ts +53 -48
- package/src/source.ts +15 -14
- package/src/styleConfig.ts +5 -5
- package/src/subtitleFormat.ts +5 -5
- package/src/subtitleTrack.ts +1 -1
- package/src/tweaksConfig.ts +16 -16
- package/src/ui/customMessageHandlerModule.ts +46 -0
- package/src/ui/custommessagehandlerbridge.ts +45 -18
- package/src/ui/fullscreenHandlerModule.ts +35 -0
- package/src/ui/fullscreenhandlerbridge.ts +35 -15
- package/tsconfig.json +9 -0
- package/typedoc.json +23 -0
- package/RNBitmovinPlayer.podspec +0 -26
- package/android/src/main/java/com/bitmovin/player/reactnative/BitmovinBaseModule.kt +0 -114
- package/android/src/main/java/com/bitmovin/player/reactnative/EventRelay.kt +0 -47
- package/android/src/main/java/com/bitmovin/player/reactnative/RNPlayerViewPackage.kt +0 -48
- package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReactContextExtension.kt +0 -24
- package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReadableArray.kt +0 -20
- package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReadableMap.kt +0 -15
- package/android/src/main/java/com/bitmovin/player/reactnative/extensions/ReadableMapExtension.kt +0 -57
- package/android/src/main/java/com/bitmovin/player/reactnative/extensions/WritableMap.kt +0 -27
- package/android/src/main/java/com/bitmovin/player/reactnative/ui/CustomMessageHandlerModule.kt +0 -86
- package/android/src/main/java/com/bitmovin/player/reactnative/ui/FullscreenHandlerModule.kt +0 -78
- package/ios/AudioSessionModule.m +0 -10
- package/ios/BitmovinCastManagerModule.m +0 -14
- package/ios/BufferModule.m +0 -8
- package/ios/CustomMessageHandlerModule.m +0 -10
- package/ios/DebugModule.m +0 -7
- package/ios/DrmModule.m +0 -16
- package/ios/FullscreenHandlerModule.m +0 -10
- package/ios/NetworkModule.m +0 -10
- package/ios/OfflineModule.m +0 -19
- package/ios/PlayerAnalyticsModule.m +0 -8
- package/ios/PlayerModule.m +0 -130
- package/ios/PreprocessHttpRequestDelegateBridge.swift +0 -30
- package/ios/RCTBridge+Generics.swift +0 -6
- package/ios/RNBitmovinPlayer.xcodeproj/project.pbxproj +0 -303
- package/ios/RNPlayerView+PlayerListener.swift +0 -229
- package/ios/RNPlayerView+UserInterfaceListener.swift +0 -35
- package/ios/RNPlayerViewManager.m +0 -79
- package/ios/SourceModule.m +0 -42
- package/ios/UuidModule.m +0 -9
- package/lib/index.d.mts +0 -4303
- package/lib/index.d.ts +0 -4303
- package/lib/index.js +0 -1895
- package/lib/index.mjs +0 -1836
package/ios/PlayerModule.swift
CHANGED
|
@@ -1,711 +1,220 @@
|
|
|
1
|
-
// swiftlint:disable file_length
|
|
2
1
|
import BitmovinPlayer
|
|
2
|
+
import ExpoModulesCore
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
public class PlayerModule: NSObject, RCTBridgeModule { // swiftlint:disable:this type_body_length
|
|
6
|
-
// swiftlint:disable:next implicitly_unwrapped_optional
|
|
7
|
-
@objc public var bridge: RCTBridge!
|
|
8
|
-
|
|
9
|
-
/// In-memory mapping from `nativeId`s to `Player` instances.
|
|
4
|
+
public class PlayerModule: Module {
|
|
10
5
|
private var players: Registry<Player> = [:]
|
|
11
6
|
|
|
12
|
-
// swiftlint:disable:next
|
|
13
|
-
public
|
|
14
|
-
"PlayerModule"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
public var methodQueue: DispatchQueue! {
|
|
23
|
-
bridge.uiManager.methodQueue
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
deinit {
|
|
27
|
-
// Destroy all players on the main thread when the module is deallocated.
|
|
28
|
-
// This is necessary when the IMA SDK is present in the app, as it may crash if the players are destroyed on a
|
|
29
|
-
// background thread.
|
|
30
|
-
DispatchQueue.main.async { [players] in
|
|
31
|
-
players.values.forEach { $0.destroy() }
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
Fetches the `Player` instance associated with `nativeId` from the internal players.
|
|
37
|
-
- Parameter nativeId: `Player` instance ID.
|
|
38
|
-
- Returns: The associated `Player` instance or `nil`.
|
|
39
|
-
*/
|
|
40
|
-
@objc
|
|
41
|
-
func retrieve(_ nativeId: NativeId) -> Player? {
|
|
42
|
-
players[nativeId]
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
Creates a new `Player` instance inside the internal players using the provided `config` object.
|
|
47
|
-
- Parameter config: `PlayerConfig` object received from JS.
|
|
48
|
-
*/
|
|
49
|
-
@objc(initWithConfig:config:networkNativeId:decoderNativeId:)
|
|
50
|
-
func initWithConfig(
|
|
51
|
-
_ nativeId: NativeId,
|
|
52
|
-
config: Any?,
|
|
53
|
-
networkNativeId: NativeId?,
|
|
54
|
-
decoderNativeId: NativeId?
|
|
55
|
-
) {
|
|
56
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
57
|
-
guard
|
|
58
|
-
self?.players[nativeId] == nil,
|
|
59
|
-
let playerConfig = RCTConvert.playerConfig(config)
|
|
60
|
-
else {
|
|
61
|
-
return
|
|
62
|
-
}
|
|
63
|
-
#if os(iOS)
|
|
64
|
-
self?.setupRemoteControlConfig(playerConfig.remoteControlConfig)
|
|
65
|
-
#endif
|
|
66
|
-
if let networkNativeId,
|
|
67
|
-
let networkConfig = self?.setupNetworkConfig(nativeId: networkNativeId) {
|
|
68
|
-
playerConfig.networkConfig = networkConfig
|
|
69
|
-
}
|
|
70
|
-
self?.players[nativeId] = PlayerFactory.create(playerConfig: playerConfig)
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
Creates a new analytics enabled `Player` instance inside the internal players using the provided `config`
|
|
76
|
-
and `analyticsConfig` object.
|
|
77
|
-
- Parameter config: `PlayerConfig` object received from JS.
|
|
78
|
-
- Parameter analyticsConfig: `AnalyticsConfig` object received from JS.
|
|
79
|
-
*/
|
|
80
|
-
@objc(initWithAnalyticsConfig:config:networkNativeId:analyticsConfig:decoderNativeId:)
|
|
81
|
-
func initWithAnalyticsConfig(
|
|
82
|
-
_ nativeId: NativeId,
|
|
83
|
-
config: Any?,
|
|
84
|
-
networkNativeId: NativeId?,
|
|
85
|
-
analyticsConfig: Any?,
|
|
86
|
-
decoderNativeId: NativeId?
|
|
87
|
-
) {
|
|
88
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
89
|
-
let analyticsConfigJson = analyticsConfig
|
|
90
|
-
guard
|
|
91
|
-
self?.players[nativeId] == nil,
|
|
92
|
-
let playerConfig = RCTConvert.playerConfig(config),
|
|
93
|
-
let analyticsConfig = RCTConvert.analyticsConfig(analyticsConfig)
|
|
94
|
-
else {
|
|
95
|
-
return
|
|
96
|
-
}
|
|
97
|
-
#if os(iOS)
|
|
98
|
-
self?.setupRemoteControlConfig(playerConfig.remoteControlConfig)
|
|
99
|
-
#endif
|
|
100
|
-
if let networkNativeId,
|
|
101
|
-
let networkConfig = self?.setupNetworkConfig(nativeId: networkNativeId) {
|
|
102
|
-
playerConfig.networkConfig = networkConfig
|
|
103
|
-
}
|
|
104
|
-
let defaultMetadata = RCTConvert.analyticsDefaultMetadataFromAnalyticsConfig(analyticsConfigJson)
|
|
105
|
-
self?.players[nativeId] = PlayerFactory.create(
|
|
106
|
-
playerConfig: playerConfig,
|
|
107
|
-
analyticsConfig: analyticsConfig,
|
|
108
|
-
defaultMetadata: defaultMetadata ?? DefaultMetadata()
|
|
109
|
-
)
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
Loads the given source configuration into `nativeId`'s `Player` object.
|
|
115
|
-
- Parameter nativeId: Target player.
|
|
116
|
-
- Parameter sourceNativeId: The `nativeId` of the `Source` object.
|
|
117
|
-
*/
|
|
118
|
-
@objc(loadSource:sourceNativeId:)
|
|
119
|
-
func loadSource(_ nativeId: NativeId, sourceNativeId: NativeId) {
|
|
120
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
121
|
-
guard
|
|
122
|
-
let player = self?.players[nativeId],
|
|
123
|
-
let source = self?.bridge[SourceModule.self]?.retrieve(sourceNativeId)
|
|
124
|
-
else {
|
|
125
|
-
return
|
|
7
|
+
// swiftlint:disable:next function_body_length
|
|
8
|
+
public func definition() -> ModuleDefinition {
|
|
9
|
+
Name("PlayerModule")
|
|
10
|
+
OnCreate {}
|
|
11
|
+
OnDestroy {
|
|
12
|
+
// Destroy all players on the main thread when the module is deallocated.
|
|
13
|
+
// This is necessary when the IMA SDK is present in the app,
|
|
14
|
+
// as it may crash if the players are destroyed on a background thread.
|
|
15
|
+
DispatchQueue.main.async { [players] in
|
|
16
|
+
players.values.forEach { $0.destroy() }
|
|
126
17
|
}
|
|
127
|
-
player.load(source: source)
|
|
128
18
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
Loads the given offline source configuration into `nativeId`'s `Player` object.
|
|
133
|
-
- Parameter nativeId: Target player.
|
|
134
|
-
- Parameter offlineContentManagerBridgeId: The `nativeId` of the `OfflineModule` object.
|
|
135
|
-
*/
|
|
136
|
-
@objc(loadOfflineContent:offlineContentManagerBridgeId:options:)
|
|
137
|
-
func loadOfflineContent(_ nativeId: NativeId, offlineContentManagerBridgeId: NativeId, options: Any?) {
|
|
138
|
-
#if os(iOS)
|
|
139
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
140
|
-
guard let player = self?.players[nativeId],
|
|
141
|
-
let offlineContentManagerBridge = self?.bridge[OfflineModule.self]?
|
|
142
|
-
.retrieve(offlineContentManagerBridgeId) else {
|
|
143
|
-
return
|
|
144
|
-
}
|
|
145
|
-
let optionsDictionary = options as? [String: Any?] ?? [:]
|
|
146
|
-
let restrictedToAssetCache = optionsDictionary["restrictedToAssetCache"] as? Bool ?? true
|
|
147
|
-
let offlineSourceConfig = offlineContentManagerBridge
|
|
148
|
-
.offlineContentManager
|
|
149
|
-
.createOfflineSourceConfig(restrictedToAssetCache: restrictedToAssetCache)
|
|
150
|
-
|
|
151
|
-
guard let offlineSourceConfig else { return }
|
|
152
|
-
player.load(sourceConfig: offlineSourceConfig)
|
|
153
|
-
}
|
|
154
|
-
#endif
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
Call `.unload()` on `nativeId`'s player.
|
|
159
|
-
- Parameter nativeId: Target player Id.
|
|
160
|
-
*/
|
|
161
|
-
@objc(unload:)
|
|
162
|
-
func unload(_ nativeId: NativeId) {
|
|
163
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
164
|
-
self?.players[nativeId]?.unload()
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
Call `.play()` on `nativeId`'s player.
|
|
170
|
-
- Parameter nativeId: Target player Id.
|
|
171
|
-
*/
|
|
172
|
-
@objc(play:)
|
|
173
|
-
func play(_ nativeId: NativeId) {
|
|
174
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
19
|
+
AsyncFunction("play") { [weak self] (nativeId: NativeId) in
|
|
175
20
|
self?.players[nativeId]?.play()
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
Call `.pause()` on `nativeId`'s player.
|
|
181
|
-
- Parameter nativeId: Target player Id.
|
|
182
|
-
*/
|
|
183
|
-
@objc(pause:)
|
|
184
|
-
func pause(_ nativeId: NativeId) {
|
|
185
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
21
|
+
}.runOnQueue(.main)
|
|
22
|
+
AsyncFunction("pause") { [weak self] (nativeId: NativeId) in
|
|
186
23
|
self?.players[nativeId]?.pause()
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
Call `.seek(time:)` on `nativeId`'s player.
|
|
192
|
-
- Parameter nativeId: Target player Id.
|
|
193
|
-
- Parameter time: Time to seek in seconds.
|
|
194
|
-
*/
|
|
195
|
-
@objc(seek:time:)
|
|
196
|
-
func seek(_ nativeId: NativeId, time: NSNumber) {
|
|
197
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
198
|
-
self?.players[nativeId]?.seek(time: time.doubleValue)
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
Sets `timeShift` on `nativeId`'s player.
|
|
204
|
-
- Parameter nativeId: Target player Id.
|
|
205
|
-
- Parameter offset: Offset to timeShift to in seconds.
|
|
206
|
-
*/
|
|
207
|
-
@objc(timeShift:offset:)
|
|
208
|
-
func timeShift(_ nativeId: NativeId, offset: NSNumber) {
|
|
209
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
210
|
-
self?.players[nativeId]?.timeShift = offset.doubleValue
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
Call `.mute()` on `nativeId`'s player.
|
|
216
|
-
- Parameter nativeId: Target player Id.
|
|
217
|
-
*/
|
|
218
|
-
@objc(mute:)
|
|
219
|
-
func mute(_ nativeId: NativeId) {
|
|
220
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
24
|
+
}.runOnQueue(.main)
|
|
25
|
+
AsyncFunction("mute") { [weak self] (nativeId: NativeId) in
|
|
221
26
|
self?.players[nativeId]?.mute()
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
Call `.unmute()` on `nativeId`'s player.
|
|
227
|
-
- Parameter nativeId: Target player Id.
|
|
228
|
-
*/
|
|
229
|
-
@objc(unmute:)
|
|
230
|
-
func unmute(_ nativeId: NativeId) {
|
|
231
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
27
|
+
}.runOnQueue(.main)
|
|
28
|
+
AsyncFunction("unmute") { [weak self] (nativeId: NativeId) in
|
|
232
29
|
self?.players[nativeId]?.unmute()
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
func destroy(_ nativeId: NativeId) {
|
|
242
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
30
|
+
}.runOnQueue(.main)
|
|
31
|
+
AsyncFunction("seek") { [weak self] (nativeId: NativeId, time: Double) in
|
|
32
|
+
self?.players[nativeId]?.seek(time: time)
|
|
33
|
+
}.runOnQueue(.main)
|
|
34
|
+
AsyncFunction("timeShift") { [weak self] (nativeId: NativeId, offset: Double) in
|
|
35
|
+
self?.players[nativeId]?.timeShift = offset
|
|
36
|
+
}.runOnQueue(.main)
|
|
37
|
+
AsyncFunction("destroy") { [weak self] (nativeId: NativeId) in
|
|
243
38
|
if let player = self?.players[nativeId] {
|
|
244
39
|
player.destroy()
|
|
245
|
-
// Remove destroyed player from the players
|
|
246
40
|
self?.players[nativeId] = nil
|
|
247
41
|
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
self?.players[nativeId]?.
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
- Parameter nativeId: Target player Id.
|
|
266
|
-
- Parameter resolver: JS promise resolver.
|
|
267
|
-
- Parameter rejecter: JS promise rejecter.
|
|
268
|
-
*/
|
|
269
|
-
@objc(getVolume:resolver:rejecter:)
|
|
270
|
-
func getVolume(
|
|
271
|
-
_ nativeId: NativeId,
|
|
272
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
273
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
274
|
-
) {
|
|
275
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
276
|
-
resolve(self?.players[nativeId]?.volume)
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
Resolve `nativeId`'s current playback time.
|
|
282
|
-
- Parameter nativeId: Target player Id.
|
|
283
|
-
- Parameter mode: Time mode: either relative or absolute. Can be empty.
|
|
284
|
-
- Parameter resolver: JS promise resolver.
|
|
285
|
-
- Parameter rejecter: JS promise rejecter.
|
|
286
|
-
*/
|
|
287
|
-
@objc(currentTime:mode:resolver:rejecter:)
|
|
288
|
-
func currentTime(
|
|
289
|
-
_ nativeId: NativeId,
|
|
290
|
-
mode: String?,
|
|
291
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
292
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
293
|
-
) {
|
|
294
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
42
|
+
}.runOnQueue(.main)
|
|
43
|
+
AsyncFunction("setVolume") { [weak self] (nativeId: NativeId, volume: Int) in
|
|
44
|
+
self?.players[nativeId]?.volume = volume
|
|
45
|
+
}.runOnQueue(.main)
|
|
46
|
+
AsyncFunction("unload") { [weak self] (nativeId: NativeId) in
|
|
47
|
+
self?.players[nativeId]?.unload()
|
|
48
|
+
}.runOnQueue(.main)
|
|
49
|
+
AsyncFunction("setPlaybackSpeed") { [weak self] (nativeId: NativeId, playbackSpeed: Float) in
|
|
50
|
+
self?.players[nativeId]?.playbackSpeed = playbackSpeed
|
|
51
|
+
}.runOnQueue(.main)
|
|
52
|
+
AsyncFunction("setMaxSelectableBitrate") { [weak self] (nativeId: NativeId, maxSelectableBitrate: Int) in
|
|
53
|
+
self?.players[nativeId]?.maxSelectableBitrate = UInt(maxSelectableBitrate)
|
|
54
|
+
}.runOnQueue(.main)
|
|
55
|
+
AsyncFunction("getVolume") { [weak self] (nativeId: NativeId) -> Int? in
|
|
56
|
+
self?.players[nativeId]?.volume
|
|
57
|
+
}.runOnQueue(.main)
|
|
58
|
+
AsyncFunction("currentTime") { [weak self] (nativeId: NativeId, mode: String?) -> Double? in
|
|
295
59
|
let player = self?.players[nativeId]
|
|
296
60
|
if let mode {
|
|
297
|
-
|
|
298
|
-
} else {
|
|
299
|
-
resolve(player?.currentTime)
|
|
61
|
+
return player?.currentTime(RCTConvert.timeMode(mode))
|
|
300
62
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
- Parameter nativeId: Target player Id.
|
|
341
|
-
- Parameter resolver: JS promise resolver.
|
|
342
|
-
- Parameter rejecter: JS promise rejecter.
|
|
343
|
-
*/
|
|
344
|
-
@objc(isPlaying:resolver:rejecter:)
|
|
345
|
-
func isPlaying(
|
|
346
|
-
_ nativeId: NativeId,
|
|
347
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
348
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
349
|
-
) {
|
|
350
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
351
|
-
resolve(self?.players[nativeId]?.isPlaying)
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
Resolve `nativeId`'s current paused state.
|
|
357
|
-
- Parameter nativeId: Target player Id.
|
|
358
|
-
- Parameter resolver: JS promise resolver.
|
|
359
|
-
- Parameter rejecter: JS promise rejecter.
|
|
360
|
-
*/
|
|
361
|
-
@objc(isPaused:resolver:rejecter:)
|
|
362
|
-
func isPaused(
|
|
363
|
-
_ nativeId: NativeId,
|
|
364
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
365
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
366
|
-
) {
|
|
367
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
368
|
-
resolve(self?.players[nativeId]?.isPaused)
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
373
|
-
Resolve `nativeId`'s live streaming state.
|
|
374
|
-
`true` if source is a live streaming.
|
|
375
|
-
- Parameter nativeId: Target player Id.
|
|
376
|
-
- Parameter resolver: JS promise resolver.
|
|
377
|
-
- Parameter rejecter: JS promise rejecter.
|
|
378
|
-
*/
|
|
379
|
-
@objc(isLive:resolver:rejecter:)
|
|
380
|
-
func isLive(
|
|
381
|
-
_ nativeId: NativeId,
|
|
382
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
383
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
384
|
-
) {
|
|
385
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
386
|
-
resolve(self?.players[nativeId]?.isLive)
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
/**
|
|
391
|
-
Resolve `nativeId`'s air play activation state.
|
|
392
|
-
- Parameter nativeId: Target player Id.
|
|
393
|
-
- Parameter resolver: JS promise resolver.
|
|
394
|
-
- Parameter rejecter: JS promise rejecter.
|
|
395
|
-
*/
|
|
396
|
-
@objc(isAirPlayActive:resolver:rejecter:)
|
|
397
|
-
func isAirPlayActive(
|
|
398
|
-
_ nativeId: NativeId,
|
|
399
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
400
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
401
|
-
) {
|
|
402
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
403
|
-
resolve(self?.players[nativeId]?.isAirPlayActive)
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/**
|
|
408
|
-
Resolve `nativeId`'s air play availability state.
|
|
409
|
-
- Parameter nativeId: Target player Id.
|
|
410
|
-
- Parameter resolver: JS promise resolver.
|
|
411
|
-
- Parameter rejecter: JS promise rejecter.
|
|
412
|
-
*/
|
|
413
|
-
@objc(isAirPlayAvailable:resolver:rejecter:)
|
|
414
|
-
func isAirPlayAvailable(
|
|
415
|
-
_ nativeId: NativeId,
|
|
416
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
417
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
418
|
-
) {
|
|
419
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
420
|
-
resolve(self?.players[nativeId]?.isAirPlayAvailable)
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
Resolve `nativeId`'s currently selected audio track.
|
|
426
|
-
- Parameter nativeId: Target player Id.
|
|
427
|
-
- Parameter resolver: JS promise resolver.
|
|
428
|
-
- Parameter rejecter: JS promise rejecter.
|
|
429
|
-
*/
|
|
430
|
-
@objc(getAudioTrack:resolver:rejecter:)
|
|
431
|
-
func getAudioTrack(
|
|
432
|
-
_ nativeId: NativeId,
|
|
433
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
434
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
435
|
-
) {
|
|
436
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
437
|
-
resolve(RCTConvert.audioTrackJson(self?.players[nativeId]?.audio))
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
Resolve `nativeId`'s player available audio tracks.
|
|
443
|
-
- Parameter nativeId: Target player Id.
|
|
444
|
-
- Parameter resolver: JS promise resolver.
|
|
445
|
-
- Parameter rejecter: JS promise rejecter.
|
|
446
|
-
*/
|
|
447
|
-
@objc(getAvailableAudioTracks:resolver:rejecter:)
|
|
448
|
-
func getAvailableAudioTracks(
|
|
449
|
-
_ nativeId: NativeId,
|
|
450
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
451
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
452
|
-
) {
|
|
453
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
454
|
-
let audioTracksJson = self?.players[nativeId]?.availableAudio.map {
|
|
455
|
-
RCTConvert.audioTrackJson($0)
|
|
456
|
-
}
|
|
457
|
-
resolve(audioTracksJson ?? [])
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
/**
|
|
462
|
-
Set `nativeId`'s player audio track.
|
|
463
|
-
- Parameter nativeId: Target player Id.
|
|
464
|
-
- Parameter trackIdentifier: The audio track identifier.
|
|
465
|
-
- Parameter resolver: JS promise resolver.
|
|
466
|
-
- Parameter rejecter: JS promise rejecter.
|
|
467
|
-
*/
|
|
468
|
-
@objc(setAudioTrack:trackIdentifier:resolver:rejecter:)
|
|
469
|
-
func setAudioTrack(
|
|
470
|
-
_ nativeId: NativeId,
|
|
471
|
-
trackIdentifier: String,
|
|
472
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
473
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
474
|
-
) {
|
|
475
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
63
|
+
return player?.currentTime
|
|
64
|
+
}.runOnQueue(.main)
|
|
65
|
+
AsyncFunction("isPlaying") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
66
|
+
self?.players[nativeId]?.isPlaying
|
|
67
|
+
}.runOnQueue(.main)
|
|
68
|
+
AsyncFunction("isPaused") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
69
|
+
self?.players[nativeId]?.isPaused
|
|
70
|
+
}.runOnQueue(.main)
|
|
71
|
+
AsyncFunction("duration") { [weak self] (nativeId: NativeId) -> Double? in
|
|
72
|
+
self?.players[nativeId]?.duration
|
|
73
|
+
}.runOnQueue(.main)
|
|
74
|
+
AsyncFunction("isMuted") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
75
|
+
self?.players[nativeId]?.isMuted
|
|
76
|
+
}.runOnQueue(.main)
|
|
77
|
+
AsyncFunction("getTimeShift") { [weak self] (nativeId: NativeId) -> Double? in
|
|
78
|
+
self?.players[nativeId]?.timeShift
|
|
79
|
+
}.runOnQueue(.main)
|
|
80
|
+
AsyncFunction("isLive") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
81
|
+
self?.players[nativeId]?.isLive
|
|
82
|
+
}.runOnQueue(.main)
|
|
83
|
+
AsyncFunction("getMaxTimeShift") { [weak self] (nativeId: NativeId) -> Double? in
|
|
84
|
+
self?.players[nativeId]?.maxTimeShift
|
|
85
|
+
}.runOnQueue(.main)
|
|
86
|
+
AsyncFunction("getPlaybackSpeed") { [weak self] (nativeId: NativeId) -> Float? in
|
|
87
|
+
self?.players[nativeId]?.playbackSpeed
|
|
88
|
+
}.runOnQueue(.main)
|
|
89
|
+
AsyncFunction("isAd") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
90
|
+
self?.players[nativeId]?.isAd
|
|
91
|
+
}.runOnQueue(.main)
|
|
92
|
+
AsyncFunction("canPlayAtPlaybackSpeed") { [weak self] (nativeId: NativeId, playbackSpeed: Float) -> Bool? in
|
|
93
|
+
self?.players[nativeId]?.canPlay(atPlaybackSpeed: playbackSpeed)
|
|
94
|
+
}.runOnQueue(.main)
|
|
95
|
+
AsyncFunction("getAudioTrack") { [weak self] (nativeId: NativeId) -> [String: Any]? in
|
|
96
|
+
RCTConvert.audioTrackJson(self?.players[nativeId]?.audio)
|
|
97
|
+
}.runOnQueue(.main)
|
|
98
|
+
AsyncFunction("getAvailableAudioTracks") { [weak self] (nativeId: NativeId) -> [[String: Any]] in
|
|
99
|
+
self?.players[nativeId]?.availableAudio.compactMap { RCTConvert.audioTrackJson($0) } ?? []
|
|
100
|
+
}.runOnQueue(.main)
|
|
101
|
+
AsyncFunction("setAudioTrack") { [weak self] (nativeId: NativeId, trackIdentifier: String) in
|
|
476
102
|
self?.players[nativeId]?.setAudio(trackIdentifier: trackIdentifier)
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
- Parameter rejecter: JS promise rejecter.
|
|
486
|
-
*/
|
|
487
|
-
@objc(getSubtitleTrack:resolver:rejecter:)
|
|
488
|
-
func getSubtitleTrack(
|
|
489
|
-
_ nativeId: NativeId,
|
|
490
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
491
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
492
|
-
) {
|
|
493
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
494
|
-
resolve(RCTConvert.subtitleTrackJson(self?.players[nativeId]?.subtitle))
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
/**
|
|
499
|
-
Resolve `nativeId`'s player available subtitle tracks.
|
|
500
|
-
- Parameter nativeId: Target player Id.
|
|
501
|
-
- Parameter resolver: JS promise resolver.
|
|
502
|
-
- Parameter rejecter: JS promise rejecter.
|
|
503
|
-
*/
|
|
504
|
-
@objc(getAvailableSubtitles:resolver:rejecter:)
|
|
505
|
-
func getAvailableSubtitles(
|
|
506
|
-
_ nativeId: NativeId,
|
|
507
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
508
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
509
|
-
) {
|
|
510
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
511
|
-
let subtitlesJson = self?.players[nativeId]?.availableSubtitles.map {
|
|
512
|
-
RCTConvert.subtitleTrackJson($0)
|
|
513
|
-
}
|
|
514
|
-
resolve(subtitlesJson ?? [])
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
Set `nativeId`'s player subtitle track.
|
|
520
|
-
- Parameter nativeId: Target player Id.
|
|
521
|
-
- Parameter trackIdentifier: The subtitle track identifier.
|
|
522
|
-
- Parameter resolver: JS promise resolver.
|
|
523
|
-
- Parameter rejecter: JS promise rejecter.
|
|
524
|
-
*/
|
|
525
|
-
@objc(setSubtitleTrack:trackIdentifier:resolver:rejecter:)
|
|
526
|
-
func setSubtitleTrack(
|
|
527
|
-
_ nativeId: NativeId,
|
|
528
|
-
trackIdentifier: String?,
|
|
529
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
530
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
531
|
-
) {
|
|
532
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
103
|
+
}.runOnQueue(.main)
|
|
104
|
+
AsyncFunction("getSubtitleTrack") { [weak self] (nativeId: NativeId) -> [String: Any]? in
|
|
105
|
+
RCTConvert.subtitleTrackJson(self?.players[nativeId]?.subtitle)
|
|
106
|
+
}.runOnQueue(.main)
|
|
107
|
+
AsyncFunction("getAvailableSubtitles") { [weak self] (nativeId: NativeId) -> [[String: Any]] in
|
|
108
|
+
self?.players[nativeId]?.availableSubtitles.compactMap { RCTConvert.subtitleTrackJson($0) } ?? []
|
|
109
|
+
}.runOnQueue(.main)
|
|
110
|
+
AsyncFunction("setSubtitleTrack") { [weak self] (nativeId: NativeId, trackIdentifier: String?) in
|
|
533
111
|
self?.players[nativeId]?.setSubtitle(trackIdentifier: trackIdentifier)
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
112
|
+
}.runOnQueue(.main)
|
|
113
|
+
|
|
114
|
+
AsyncFunction("getVideoQuality") { [weak self] (nativeId: NativeId) -> [String: Any]? in
|
|
115
|
+
RCTConvert.toJson(videoQuality: self?.players[nativeId]?.videoQuality)
|
|
116
|
+
}.runOnQueue(.main)
|
|
117
|
+
AsyncFunction("getAvailableVideoQualities") { [weak self] (nativeId: NativeId) -> [[String: Any]] in
|
|
118
|
+
self?.players[nativeId]?.availableVideoQualities.compactMap { RCTConvert.toJson(videoQuality: $0) } ?? []
|
|
119
|
+
}.runOnQueue(.main)
|
|
120
|
+
AsyncFunction("getThumbnail") { [weak self] (nativeId: NativeId, time: Double) -> [String: Any]? in
|
|
121
|
+
RCTConvert.toJson(thumbnail: self?.players[nativeId]?.thumbnail(forTime: time))
|
|
122
|
+
}.runOnQueue(.main)
|
|
123
|
+
AsyncFunction("loadOfflineContent") { [weak self] (nativeId: NativeId, bridgeId: String, options: [String: Any]?) in // swiftlint:disable:this line_length
|
|
124
|
+
#if os(iOS)
|
|
125
|
+
guard let player = self?.players[nativeId],
|
|
126
|
+
let offlineModule = self?.appContext?.moduleRegistry.get(OfflineModule.self),
|
|
127
|
+
let offlineContentManagerBridge = offlineModule.retrieve(bridgeId) else { return }
|
|
128
|
+
let optionsDictionary = options ?? [:]
|
|
129
|
+
let restrictedToAssetCache = optionsDictionary["restrictedToAssetCache"] as? Bool ?? true
|
|
130
|
+
let offlineSourceConfig = offlineContentManagerBridge.offlineContentManager.createOfflineSourceConfig(
|
|
131
|
+
restrictedToAssetCache: restrictedToAssetCache
|
|
132
|
+
)
|
|
133
|
+
guard let offlineSourceConfig else { return }
|
|
134
|
+
player.load(sourceConfig: offlineSourceConfig)
|
|
135
|
+
#endif
|
|
136
|
+
}.runOnQueue(.main)
|
|
137
|
+
AsyncFunction("scheduleAd") { [weak self] (nativeId: NativeId, adItemJson: [String: Any]) in
|
|
138
|
+
guard let adItem = RCTConvert.adItem(adItemJson) else { return }
|
|
549
139
|
self?.players[nativeId]?.scheduleAd(adItem: adItem)
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
func isAd(
|
|
573
|
-
_ nativeId: NativeId,
|
|
574
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
575
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
576
|
-
) {
|
|
577
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
578
|
-
resolve(self?.players[nativeId]?.isAd)
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
/**
|
|
583
|
-
The current time shift of the live stream in seconds. This value is always 0 if the active `source` is not a
|
|
584
|
-
live stream or there are no sources loaded.
|
|
585
|
-
- Parameter nativeId: Target player id.
|
|
586
|
-
- Parameter resolver: JS promise resolver.
|
|
587
|
-
- Parameter rejecter: JS promise rejecter.
|
|
588
|
-
*/
|
|
589
|
-
@objc(getTimeShift:resolver:rejecter:)
|
|
590
|
-
func getTimeShift(
|
|
591
|
-
_ nativeId: NativeId,
|
|
592
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
593
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
594
|
-
) {
|
|
595
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
596
|
-
resolve(self?.players[nativeId]?.timeShift)
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
/**
|
|
601
|
-
Returns the limit in seconds for time shift. Is either negative or 0. Is applicable for live streams only.
|
|
602
|
-
- Parameter nativeId: Target player id.
|
|
603
|
-
- Parameter resolver: JS promise resolver.
|
|
604
|
-
- Parameter rejecter: JS promise rejecter.
|
|
605
|
-
*/
|
|
606
|
-
@objc(getMaxTimeShift:resolver:rejecter:)
|
|
607
|
-
func getMaxTimeShift(
|
|
608
|
-
_ nativeId: NativeId,
|
|
609
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
610
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
611
|
-
) {
|
|
612
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
613
|
-
resolve(self?.players[nativeId]?.maxTimeShift)
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
/**
|
|
618
|
-
Sets the max selectable bitrate for the player.
|
|
619
|
-
- Parameter nativeId: Target player id.
|
|
620
|
-
- Parameter maxBitrate: The desired max bitrate limit.
|
|
621
|
-
*/
|
|
622
|
-
@objc(setMaxSelectableBitrate:maxSelectableBitrate:)
|
|
623
|
-
func setMaxSelectableBitrate(_ nativeId: NativeId, maxSelectableBitrate: NSNumber) {
|
|
624
|
-
let maxSelectableBitrateValue = maxSelectableBitrate.intValue
|
|
625
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
626
|
-
let maxSelectableBitrate = maxSelectableBitrateValue != -1 ? maxSelectableBitrateValue : 0
|
|
627
|
-
self?.players[nativeId]?.maxSelectableBitrate = UInt(maxSelectableBitrate)
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
/**
|
|
632
|
-
Returns the thumbnail image for the active `Source` at a certain time.
|
|
633
|
-
- Parameter nativeId: Target player id.
|
|
634
|
-
- Parameter resolver: JS promise resolver.
|
|
635
|
-
- Parameter rejecter: JS promise rejecter.
|
|
636
|
-
*/
|
|
637
|
-
@objc(getThumbnail:time:resolver:rejecter:)
|
|
638
|
-
func getThumbnail(
|
|
639
|
-
_ nativeId: NativeId,
|
|
640
|
-
time: NSNumber,
|
|
641
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
642
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
643
|
-
) {
|
|
644
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
645
|
-
resolve(RCTConvert.toJson(thumbnail: self?.players[nativeId]?.thumbnail(forTime: time.doubleValue)))
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
/**
|
|
650
|
-
Returns `true` if casting to another device (such as a ChromeCast) is available, otherwise false.
|
|
651
|
-
- Parameter nativeId: Target player id.
|
|
652
|
-
- Parameter resolver: JS promise resolver.
|
|
653
|
-
- Parameter rejecter: JS promise rejecter.
|
|
654
|
-
*/
|
|
655
|
-
@objc(isCastAvailable:resolver:rejecter:)
|
|
656
|
-
func isCastAvailable(
|
|
657
|
-
_ nativeId: NativeId,
|
|
658
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
659
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
660
|
-
) {
|
|
661
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
662
|
-
resolve(self?.players[nativeId]?.isCastAvailable)
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
/**
|
|
667
|
-
Returns `true` if the video is currently casted to a device and not played locally,
|
|
668
|
-
or `false` if the video is played locally.
|
|
669
|
-
- Parameter nativeId: Target player id.
|
|
670
|
-
- Parameter resolver: JS promise resolver.
|
|
671
|
-
- Parameter rejecter: JS promise rejecter.
|
|
672
|
-
*/
|
|
673
|
-
@objc(isCasting:resolver:rejecter:)
|
|
674
|
-
func isCasting(
|
|
675
|
-
_ nativeId: NativeId,
|
|
676
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
677
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
678
|
-
) {
|
|
679
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
680
|
-
resolve(self?.players[nativeId]?.isCasting)
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
/**
|
|
685
|
-
Initiates casting the current video to a cast-compatible device.
|
|
686
|
-
The user has to choose to which device it should be sent.
|
|
687
|
-
*/
|
|
688
|
-
@objc(castVideo:)
|
|
689
|
-
func castVideo(_ nativeId: NativeId) {
|
|
690
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
140
|
+
}.runOnQueue(.main)
|
|
141
|
+
AsyncFunction("isAirPlayActive") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
142
|
+
#if os(iOS)
|
|
143
|
+
return self?.players[nativeId]?.isAirPlayActive
|
|
144
|
+
#else
|
|
145
|
+
return nil
|
|
146
|
+
#endif
|
|
147
|
+
}.runOnQueue(.main)
|
|
148
|
+
AsyncFunction("isAirPlayAvailable") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
149
|
+
#if os(iOS)
|
|
150
|
+
return self?.players[nativeId]?.allowsAirPlay
|
|
151
|
+
#else
|
|
152
|
+
return nil
|
|
153
|
+
#endif
|
|
154
|
+
}.runOnQueue(.main)
|
|
155
|
+
AsyncFunction("isCastAvailable") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
156
|
+
self?.players[nativeId]?.isCastAvailable
|
|
157
|
+
}.runOnQueue(.main)
|
|
158
|
+
AsyncFunction("isCasting") { [weak self] (nativeId: NativeId) -> Bool? in
|
|
159
|
+
self?.players[nativeId]?.isCasting
|
|
160
|
+
}.runOnQueue(.main)
|
|
161
|
+
AsyncFunction("castVideo") { [weak self] (nativeId: NativeId) in
|
|
691
162
|
self?.players[nativeId]?.castVideo()
|
|
692
|
-
}
|
|
163
|
+
}.runOnQueue(.main)
|
|
164
|
+
AsyncFunction("castStop") { [weak self] (nativeId: NativeId) in
|
|
165
|
+
self?.players[nativeId]?.castStop()
|
|
166
|
+
}.runOnQueue(.main)
|
|
167
|
+
AsyncFunction("skipAd") { [weak self] (nativeId: NativeId) in
|
|
168
|
+
self?.players[nativeId]?.skipAd()
|
|
169
|
+
}.runOnQueue(.main)
|
|
170
|
+
AsyncFunction(
|
|
171
|
+
"initializeWithConfig"
|
|
172
|
+
) { [weak self] (nativeId: NativeId, config: [String: Any]?, networkNativeId: NativeId?, _: String?) in // swiftlint:disable:this line_length
|
|
173
|
+
guard self?.players[nativeId] == nil, let playerConfig = RCTConvert.playerConfig(config) else { return }
|
|
174
|
+
#if os(iOS)
|
|
175
|
+
self?.setupRemoteControlConfig(playerConfig.remoteControlConfig)
|
|
176
|
+
#endif
|
|
177
|
+
if let networkNativeId, let networkConfig = self?.setupNetworkConfig(nativeId: networkNativeId) {
|
|
178
|
+
playerConfig.networkConfig = networkConfig
|
|
179
|
+
}
|
|
180
|
+
self?.players[nativeId] = PlayerFactory.create(playerConfig: playerConfig)
|
|
181
|
+
}.runOnQueue(.main)
|
|
182
|
+
AsyncFunction(
|
|
183
|
+
"initializeWithAnalyticsConfig"
|
|
184
|
+
) { [weak self] (nativeId: NativeId, analyticsConfig: [String: Any]?, config: [String: Any]?, networkNativeId: NativeId?, _: String?) in // swiftlint:disable:this line_length
|
|
185
|
+
guard self?.players[nativeId] == nil,
|
|
186
|
+
let playerConfig = RCTConvert.playerConfig(config),
|
|
187
|
+
let analyticsConfig = RCTConvert.analyticsConfig(analyticsConfig) else { return } // swiftlint:disable:this line_length
|
|
188
|
+
#if os(iOS)
|
|
189
|
+
self?.setupRemoteControlConfig(playerConfig.remoteControlConfig)
|
|
190
|
+
#endif
|
|
191
|
+
if let networkNativeId, let networkConfig = self?.setupNetworkConfig(nativeId: networkNativeId) {
|
|
192
|
+
playerConfig.networkConfig = networkConfig
|
|
193
|
+
}
|
|
194
|
+
let defaultMetadata = RCTConvert.analyticsDefaultMetadataFromAnalyticsConfig(analyticsConfig)
|
|
195
|
+
self?.players[nativeId] = PlayerFactory.create(
|
|
196
|
+
playerConfig: playerConfig,
|
|
197
|
+
analyticsConfig: analyticsConfig,
|
|
198
|
+
defaultMetadata: defaultMetadata ?? DefaultMetadata()
|
|
199
|
+
)
|
|
200
|
+
}.runOnQueue(.main)
|
|
201
|
+
AsyncFunction("loadSource") { [weak self] (nativeId: NativeId, sourceNativeId: NativeId) in
|
|
202
|
+
guard let player = self?.players[nativeId],
|
|
203
|
+
let sourceModule = self?.appContext?.moduleRegistry.get(SourceModule.self), // swiftlint:disable:this line_length
|
|
204
|
+
let source = sourceModule.retrieve(sourceNativeId) else { return }
|
|
205
|
+
player.load(source: source)
|
|
206
|
+
}.runOnQueue(.main)
|
|
693
207
|
}
|
|
694
208
|
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
@objc(castStop:)
|
|
700
|
-
func castStop(_ nativeId: NativeId) {
|
|
701
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
702
|
-
self?.players[nativeId]?.castStop()
|
|
703
|
-
}
|
|
209
|
+
/// This needs to stay stable to maintain compatibility for cross-module access..
|
|
210
|
+
@objc
|
|
211
|
+
public func retrieve(_ nativeId: NativeId) -> Player? {
|
|
212
|
+
players[nativeId]
|
|
704
213
|
}
|
|
705
214
|
|
|
706
215
|
private func setupRemoteControlConfig(_ remoteControlConfig: RemoteControlConfig) {
|
|
707
216
|
remoteControlConfig.prepareSource = { [weak self] _, sourceConfig in
|
|
708
|
-
guard let sourceModule = self?.
|
|
217
|
+
guard let sourceModule = self?.appContext?.moduleRegistry.get(SourceModule.self), // swiftlint:disable:this line_length
|
|
709
218
|
let sourceNativeId = sourceModule.nativeId(where: { $0.sourceConfig === sourceConfig }),
|
|
710
219
|
let castSourceConfig = sourceModule.retrieveCastSourceConfig(sourceNativeId) else {
|
|
711
220
|
return nil
|
|
@@ -716,96 +225,9 @@ public class PlayerModule: NSObject, RCTBridgeModule { // swiftlint:disable:this
|
|
|
716
225
|
}
|
|
717
226
|
|
|
718
227
|
private func setupNetworkConfig(nativeId: NativeId) -> NetworkConfig? {
|
|
719
|
-
guard let networkModule =
|
|
720
|
-
let networkConfig = networkModule.retrieve(nativeId) else {
|
|
228
|
+
guard let networkModule = self.appContext?.moduleRegistry.get(NetworkModule.self) else {
|
|
721
229
|
return nil
|
|
722
230
|
}
|
|
723
|
-
return
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
/**
|
|
727
|
-
Resolve `nativeId`'s current video quality.
|
|
728
|
-
- Parameter nativeId: Target player Id.
|
|
729
|
-
- Parameter resolver: JS promise resolver.
|
|
730
|
-
- Parameter rejecter: JS promise rejecter.
|
|
731
|
-
*/
|
|
732
|
-
@objc(getVideoQuality:resolver:rejecter:)
|
|
733
|
-
func getVideoQuality(
|
|
734
|
-
_ nativeId: NativeId,
|
|
735
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
736
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
737
|
-
) {
|
|
738
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
739
|
-
resolve(RCTConvert.toJson(videoQuality: self?.players[nativeId]?.videoQuality))
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
/**
|
|
744
|
-
Resolve `nativeId`'s current available video qualities.
|
|
745
|
-
- Parameter nativeId: Target player Id.
|
|
746
|
-
- Parameter resolver: JS promise resolver.
|
|
747
|
-
- Parameter rejecter: JS promise rejecter.
|
|
748
|
-
*/
|
|
749
|
-
@objc(getAvailableVideoQualities:resolver:rejecter:)
|
|
750
|
-
func getAvailableVideoQualities(
|
|
751
|
-
_ nativeId: NativeId,
|
|
752
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
753
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
754
|
-
) {
|
|
755
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
756
|
-
let videoQualitiesJson = self?.players[nativeId]?.availableVideoQualities.map {
|
|
757
|
-
RCTConvert.toJson(videoQuality: $0)
|
|
758
|
-
}
|
|
759
|
-
resolve(videoQualitiesJson ?? [])
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
/**
|
|
764
|
-
Resolve `nativeId`'s current playback speed.
|
|
765
|
-
- Parameter nativeId: Target player Id.
|
|
766
|
-
- Parameter resolver: JS promise resolver.
|
|
767
|
-
- Parameter rejecter: JS promise rejecter.
|
|
768
|
-
*/
|
|
769
|
-
@objc(getPlaybackSpeed:resolver:rejecter:)
|
|
770
|
-
func getPlaybackSpeed(
|
|
771
|
-
_ nativeId: NativeId,
|
|
772
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
773
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
774
|
-
) {
|
|
775
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
776
|
-
resolve(self?.players[nativeId]?.playbackSpeed)
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
/**
|
|
781
|
-
Sets playback speed for the player.
|
|
782
|
-
- Parameter nativeId: Target player Id.
|
|
783
|
-
- Parameter playbackSpeed: Float representing the playback speed level.
|
|
784
|
-
*/
|
|
785
|
-
@objc(setPlaybackSpeed:playbackSpeed:)
|
|
786
|
-
func setPlaybackSpeed(_ nativeId: NativeId, playbackSpeed: NSNumber) {
|
|
787
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
788
|
-
self?.players[nativeId]?.playbackSpeed = playbackSpeed.floatValue
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
|
|
792
|
-
/**
|
|
793
|
-
Resolve `nativeId`'s possibility to play the media at specified playback speed.
|
|
794
|
-
- Parameters:
|
|
795
|
-
- nativeId: Target player Id.
|
|
796
|
-
- playbackSpeed: The playback speed to check.
|
|
797
|
-
- resolver: JS promise resolver.
|
|
798
|
-
- rejecter: JS promise rejecter.
|
|
799
|
-
*/
|
|
800
|
-
@objc(canPlayAtPlaybackSpeed:atPlaybackSpeed:resolver:rejecter:)
|
|
801
|
-
func canPlayAtPlaybackSpeed(
|
|
802
|
-
_ nativeId: NativeId,
|
|
803
|
-
atPlaybackSpeed playbackSpeed: NSNumber,
|
|
804
|
-
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
805
|
-
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
806
|
-
) {
|
|
807
|
-
bridge.uiManager.addUIBlock { [weak self] _, _ in
|
|
808
|
-
resolve(self?.players[nativeId]?.canPlay(atPlaybackSpeed: playbackSpeed.floatValue))
|
|
809
|
-
}
|
|
231
|
+
return networkModule.retrieve(nativeId)
|
|
810
232
|
}
|
|
811
233
|
}
|