react-native-theoplayer 2.16.1 → 3.0.0-pre1
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/CHANGELOG.md +10 -0
- package/README.md +1 -0
- package/android/build.gradle +19 -22
- package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +87 -101
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerContext.kt +30 -30
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +3 -1
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +1 -1
- package/android/src/main/java/com/theoplayer/cache/CacheAdapter.kt +127 -0
- package/android/src/main/java/com/theoplayer/cache/CacheModule.kt +238 -0
- package/android/src/main/java/com/theoplayer/player/PlayerModule.kt +27 -12
- package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +16 -37
- package/android/src/main/java/com/theoplayer/util/BridgeUtils.kt +60 -0
- package/android/src/main/java/com/theoplayer/util/PayloadBuilder.kt +10 -10
- package/ios/THEOplayerRCTBridge.m +22 -0
- package/ios/THEOplayerRCTDebug.swift +7 -1
- package/ios/THEOplayerRCTMainEventHandler.swift +25 -27
- package/ios/THEOplayerRCTSourceDescriptionAggregator.swift +41 -0
- package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +3 -2
- package/ios/THEOplayerRCTTypeUtils.swift +37 -0
- package/ios/THEOplayerRCTView.swift +1 -2
- package/ios/ads/THEOplayerRCTAdsAPI+DAI.swift +3 -13
- package/ios/ads/THEOplayerRCTAdsAPI.swift +14 -48
- package/ios/ads/THEOplayerRCTView+AdsConfig.swift +0 -13
- package/ios/backgroundAudio/THEOplayerRCTNowPlayingManager.swift +24 -36
- package/ios/backgroundAudio/THEOplayerRCTRemoteCommandsManager.swift +2 -10
- package/ios/cache/THEOplayerRCTCacheAPI.swift +202 -0
- package/ios/cache/THEOplayerRCTCacheAggregator.swift +87 -0
- package/ios/cache/THEOplayerRCTCachingParametersBuilder.swift +27 -0
- package/ios/pip/THEOplayerRCTPipControlsManager.swift +2 -4
- package/lib/commonjs/api/abr/ABRConfiguration.js +21 -7
- package/lib/commonjs/api/abr/ABRConfiguration.js.map +1 -1
- package/lib/commonjs/api/ads/GoogleImaConfiguration.js.map +1 -1
- package/lib/commonjs/api/barrel.js +30 -19
- package/lib/commonjs/api/barrel.js.map +1 -1
- package/lib/commonjs/api/cache/CachingPreferredTrackSelection.js +2 -0
- package/lib/commonjs/api/cache/CachingPreferredTrackSelection.js.map +1 -0
- package/lib/commonjs/api/cache/CachingTask.js +30 -0
- package/lib/commonjs/api/cache/CachingTask.js.map +1 -0
- package/lib/commonjs/api/cache/CachingTaskLicense.js +6 -0
- package/lib/commonjs/api/cache/CachingTaskLicense.js.map +1 -0
- package/lib/commonjs/api/cache/CachingTaskList.js +6 -0
- package/lib/commonjs/api/cache/CachingTaskList.js.map +1 -0
- package/lib/commonjs/api/cache/CachingTaskParameters.js +6 -0
- package/lib/commonjs/api/cache/CachingTaskParameters.js.map +1 -0
- package/lib/commonjs/api/cache/MediaCacheAPI.js +24 -0
- package/lib/commonjs/api/cache/MediaCacheAPI.js.map +1 -0
- package/lib/commonjs/api/cache/barrel.js +83 -0
- package/lib/commonjs/api/cache/barrel.js.map +1 -0
- package/lib/commonjs/api/cache/events/CacheEvent.js +28 -0
- package/lib/commonjs/api/cache/events/CacheEvent.js.map +1 -0
- package/lib/commonjs/api/cache/events/CachingTaskEvent.js +17 -0
- package/lib/commonjs/api/cache/events/CachingTaskEvent.js.map +1 -0
- package/lib/commonjs/api/cache/events/barrel.js +28 -0
- package/lib/commonjs/api/cache/events/barrel.js.map +1 -0
- package/lib/commonjs/api/cache/hooks/barrel.js +39 -0
- package/lib/commonjs/api/cache/hooks/barrel.js.map +1 -0
- package/lib/commonjs/api/cache/hooks/useCachingTaskList.js +31 -0
- package/lib/commonjs/api/cache/hooks/useCachingTaskList.js.map +1 -0
- package/lib/commonjs/api/cache/hooks/useCachingTaskProgress.js +28 -0
- package/lib/commonjs/api/cache/hooks/useCachingTaskProgress.js.map +1 -0
- package/lib/commonjs/api/cache/hooks/useCachingTaskStatus.js +28 -0
- package/lib/commonjs/api/cache/hooks/useCachingTaskStatus.js.map +1 -0
- package/lib/commonjs/api/cast/CastState.js +3 -4
- package/lib/commonjs/api/cast/CastState.js.map +1 -1
- package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/commonjs/api/event/AdEvent.js +3 -4
- package/lib/commonjs/api/event/AdEvent.js.map +1 -1
- package/lib/commonjs/api/event/CastEvent.js +3 -4
- package/lib/commonjs/api/event/CastEvent.js.map +1 -1
- package/lib/commonjs/api/event/PlayerEvent.js +3 -4
- package/lib/commonjs/api/event/PlayerEvent.js.map +1 -1
- package/lib/commonjs/api/event/TrackEvent.js +12 -16
- package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
- package/lib/commonjs/api/player/PlayerEventMap.js +7 -8
- package/lib/commonjs/api/player/PlayerEventMap.js.map +1 -1
- package/lib/commonjs/api/player/THEOplayer.js +6 -4
- package/lib/commonjs/api/player/THEOplayer.js.map +1 -1
- package/lib/commonjs/api/presentation/PresentationMode.js +3 -4
- package/lib/commonjs/api/presentation/PresentationMode.js.map +1 -1
- package/lib/commonjs/api/source/ads/Ads.js +3 -4
- package/lib/commonjs/api/source/ads/Ads.js.map +1 -1
- package/lib/commonjs/api/track/TextTrack.js +9 -12
- package/lib/commonjs/api/track/TextTrack.js.map +1 -1
- package/lib/commonjs/api/track/TextTrackStyle.js +3 -4
- package/lib/commonjs/api/track/TextTrackStyle.js.map +1 -1
- package/lib/commonjs/index.js +9 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.js +1 -1
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.style.js +1 -2
- package/lib/commonjs/internal/THEOplayerView.style.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +5 -5
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +12 -13
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/WebEventForwarder.js +10 -10
- package/lib/commonjs/internal/adapter/WebEventForwarder.js.map +1 -1
- package/lib/commonjs/internal/adapter/abr/AbrAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/ads/THEOplayerWebAdsAdapter.js +2 -2
- package/lib/commonjs/internal/adapter/ads/THEOplayerWebAdsAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/cast/THEOplayerNativeCastAdapter.js +1 -1
- package/lib/commonjs/internal/adapter/cast/THEOplayerNativeCastAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/cast/THEOplayerWebCastAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/event/BaseEvent.js.map +1 -1
- package/lib/commonjs/internal/adapter/event/DefaultEventDispatcher.js +1 -1
- package/lib/commonjs/internal/adapter/event/DefaultEventDispatcher.js.map +1 -1
- package/lib/commonjs/internal/adapter/event/native/NativeTrackEvent.js +12 -16
- package/lib/commonjs/internal/adapter/event/native/NativeTrackEvent.js.map +1 -1
- package/lib/commonjs/internal/adapter/track/TextTrackStyleAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/web/FullscreenAPI.js +1 -2
- package/lib/commonjs/internal/adapter/web/FullscreenAPI.js.map +1 -1
- package/lib/commonjs/internal/adapter/web/WebMediaSession.js +9 -11
- package/lib/commonjs/internal/adapter/web/WebMediaSession.js.map +1 -1
- package/lib/commonjs/internal/adapter/web/WebPresentationModeManager.js +4 -4
- package/lib/commonjs/internal/adapter/web/WebPresentationModeManager.js.map +1 -1
- package/lib/commonjs/internal/cache/MediaCache.js +117 -0
- package/lib/commonjs/internal/cache/MediaCache.js.map +1 -0
- package/lib/commonjs/internal/cache/MediaCache.web.js +54 -0
- package/lib/commonjs/internal/cache/MediaCache.web.js.map +1 -0
- package/lib/commonjs/internal/cache/NativeCachingTaskAdapter.js +59 -0
- package/lib/commonjs/internal/cache/NativeCachingTaskAdapter.js.map +1 -0
- package/lib/commonjs/internal/cache/NativeCachingTaskParametersAdapter.js +27 -0
- package/lib/commonjs/internal/cache/NativeCachingTaskParametersAdapter.js.map +1 -0
- package/lib/commonjs/internal/cache/WebCachingTaskAdapter.js +71 -0
- package/lib/commonjs/internal/cache/WebCachingTaskAdapter.js.map +1 -0
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.js +1 -2
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.js.map +1 -1
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.web.js +1 -2
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.web.js.map +1 -1
- package/lib/commonjs/internal/drm/NativeCertificateResponse.js.map +1 -1
- package/lib/commonjs/internal/drm/NativeLicenseResponse.js.map +1 -1
- package/lib/commonjs/internal/utils/TypeUtils.js +2 -4
- package/lib/commonjs/internal/utils/TypeUtils.js.map +1 -1
- package/lib/module/api/abr/ABRConfiguration.js +24 -6
- package/lib/module/api/abr/ABRConfiguration.js.map +1 -1
- package/lib/module/api/ads/GoogleImaConfiguration.js.map +1 -1
- package/lib/module/api/barrel.js +1 -0
- package/lib/module/api/barrel.js.map +1 -1
- package/lib/module/api/cache/CachingPreferredTrackSelection.js +2 -0
- package/lib/module/api/cache/CachingPreferredTrackSelection.js.map +1 -0
- package/lib/module/api/cache/CachingTask.js +25 -0
- package/lib/module/api/cache/CachingTask.js.map +1 -0
- package/lib/module/api/cache/CachingTaskLicense.js +2 -0
- package/lib/module/api/cache/CachingTaskLicense.js.map +1 -0
- package/lib/module/api/cache/CachingTaskList.js +2 -0
- package/lib/module/api/cache/CachingTaskList.js.map +1 -0
- package/lib/module/api/cache/CachingTaskParameters.js +2 -0
- package/lib/module/api/cache/CachingTaskParameters.js.map +1 -0
- package/lib/module/api/cache/MediaCacheAPI.js +19 -0
- package/lib/module/api/cache/MediaCacheAPI.js.map +1 -0
- package/lib/module/api/cache/barrel.js +8 -0
- package/lib/module/api/cache/barrel.js.map +1 -0
- package/lib/module/api/cache/events/CacheEvent.js +25 -0
- package/lib/module/api/cache/events/CacheEvent.js.map +1 -0
- package/lib/module/api/cache/events/CachingTaskEvent.js +12 -0
- package/lib/module/api/cache/events/CachingTaskEvent.js.map +1 -0
- package/lib/module/api/cache/events/barrel.js +3 -0
- package/lib/module/api/cache/events/barrel.js.map +1 -0
- package/lib/module/api/cache/hooks/barrel.js +4 -0
- package/lib/module/api/cache/hooks/barrel.js.map +1 -0
- package/lib/module/api/cache/hooks/useCachingTaskList.js +24 -0
- package/lib/module/api/cache/hooks/useCachingTaskList.js.map +1 -0
- package/lib/module/api/cache/hooks/useCachingTaskProgress.js +21 -0
- package/lib/module/api/cache/hooks/useCachingTaskProgress.js.map +1 -0
- package/lib/module/api/cache/hooks/useCachingTaskStatus.js +21 -0
- package/lib/module/api/cache/hooks/useCachingTaskStatus.js.map +1 -0
- package/lib/module/api/cast/CastState.js +3 -3
- package/lib/module/api/cast/CastState.js.map +1 -1
- package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/module/api/event/AdEvent.js +3 -3
- package/lib/module/api/event/AdEvent.js.map +1 -1
- package/lib/module/api/event/CastEvent.js +3 -3
- package/lib/module/api/event/CastEvent.js.map +1 -1
- package/lib/module/api/event/PlayerEvent.js +3 -3
- package/lib/module/api/event/PlayerEvent.js.map +1 -1
- package/lib/module/api/event/TrackEvent.js +12 -12
- package/lib/module/api/event/TrackEvent.js.map +1 -1
- package/lib/module/api/player/PlayerEventMap.js +8 -8
- package/lib/module/api/player/PlayerEventMap.js.map +1 -1
- package/lib/module/api/player/THEOplayer.js +7 -3
- package/lib/module/api/player/THEOplayer.js.map +1 -1
- package/lib/module/api/presentation/PresentationMode.js +3 -3
- package/lib/module/api/presentation/PresentationMode.js.map +1 -1
- package/lib/module/api/source/ads/Ads.js +3 -3
- package/lib/module/api/source/ads/Ads.js.map +1 -1
- package/lib/module/api/track/TextTrack.js +9 -9
- package/lib/module/api/track/TextTrack.js.map +1 -1
- package/lib/module/api/track/TextTrackStyle.js +3 -3
- package/lib/module/api/track/TextTrackStyle.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/internal/THEOplayerView.js +1 -1
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +5 -5
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js +12 -11
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/module/internal/adapter/WebEventForwarder.js +10 -10
- package/lib/module/internal/adapter/WebEventForwarder.js.map +1 -1
- package/lib/module/internal/adapter/abr/AbrAdapter.js.map +1 -1
- package/lib/module/internal/adapter/ads/THEOplayerWebAdsAdapter.js +2 -2
- package/lib/module/internal/adapter/ads/THEOplayerWebAdsAdapter.js.map +1 -1
- package/lib/module/internal/adapter/cast/THEOplayerNativeCastAdapter.js +1 -1
- package/lib/module/internal/adapter/cast/THEOplayerNativeCastAdapter.js.map +1 -1
- package/lib/module/internal/adapter/cast/THEOplayerWebCastAdapter.js.map +1 -1
- package/lib/module/internal/adapter/event/BaseEvent.js.map +1 -1
- package/lib/module/internal/adapter/event/DefaultEventDispatcher.js +1 -1
- package/lib/module/internal/adapter/event/DefaultEventDispatcher.js.map +1 -1
- package/lib/module/internal/adapter/event/native/NativeTrackEvent.js +12 -12
- package/lib/module/internal/adapter/event/native/NativeTrackEvent.js.map +1 -1
- package/lib/module/internal/adapter/track/TextTrackStyleAdapter.js.map +1 -1
- package/lib/module/internal/adapter/web/FullscreenAPI.js.map +1 -1
- package/lib/module/internal/adapter/web/WebMediaSession.js +8 -9
- package/lib/module/internal/adapter/web/WebMediaSession.js.map +1 -1
- package/lib/module/internal/adapter/web/WebPresentationModeManager.js +4 -4
- package/lib/module/internal/adapter/web/WebPresentationModeManager.js.map +1 -1
- package/lib/module/internal/cache/MediaCache.js +110 -0
- package/lib/module/internal/cache/MediaCache.js.map +1 -0
- package/lib/module/internal/cache/MediaCache.web.js +45 -0
- package/lib/module/internal/cache/MediaCache.web.js.map +1 -0
- package/lib/module/internal/cache/NativeCachingTaskAdapter.js +52 -0
- package/lib/module/internal/cache/NativeCachingTaskAdapter.js.map +1 -0
- package/lib/module/internal/cache/NativeCachingTaskParametersAdapter.js +20 -0
- package/lib/module/internal/cache/NativeCachingTaskParametersAdapter.js.map +1 -0
- package/lib/module/internal/cache/WebCachingTaskAdapter.js +64 -0
- package/lib/module/internal/cache/WebCachingTaskAdapter.js.map +1 -0
- package/lib/module/internal/drm/ContentProtectionRegistry.js.map +1 -1
- package/lib/module/internal/drm/ContentProtectionRegistry.web.js.map +1 -1
- package/lib/module/internal/drm/NativeCertificateResponse.js.map +1 -1
- package/lib/module/internal/drm/NativeLicenseResponse.js.map +1 -1
- package/lib/typescript/api/abr/ABRConfiguration.d.ts +1 -1
- package/lib/typescript/api/ads/Ad.d.ts +2 -2
- package/lib/typescript/api/ads/AdsConfiguration.d.ts +2 -2
- package/lib/typescript/api/ads/GoogleImaConfiguration.d.ts +1 -0
- package/lib/typescript/api/barrel.d.ts +1 -0
- package/lib/typescript/api/cache/CachingPreferredTrackSelection.d.ts +23 -0
- package/lib/typescript/api/cache/CachingTask.d.ts +93 -0
- package/lib/typescript/api/cache/CachingTaskLicense.d.ts +14 -0
- package/lib/typescript/api/cache/CachingTaskList.d.ts +7 -0
- package/lib/typescript/api/cache/CachingTaskParameters.d.ts +57 -0
- package/lib/typescript/api/cache/MediaCacheAPI.d.ts +39 -0
- package/lib/typescript/api/cache/barrel.d.ts +7 -0
- package/lib/typescript/api/cache/events/CacheEvent.d.ts +55 -0
- package/lib/typescript/api/cache/events/CachingTaskEvent.d.ts +22 -0
- package/lib/typescript/api/cache/events/barrel.d.ts +2 -0
- package/lib/typescript/api/cache/hooks/barrel.d.ts +3 -0
- package/lib/typescript/api/cache/hooks/useCachingTaskList.d.ts +1 -0
- package/lib/typescript/api/cache/hooks/useCachingTaskProgress.d.ts +2 -0
- package/lib/typescript/api/cache/hooks/useCachingTaskStatus.d.ts +2 -0
- package/lib/typescript/api/cast/CastConfiguration.d.ts +1 -1
- package/lib/typescript/api/config/PlayerConfiguration.d.ts +4 -1
- package/lib/typescript/api/drm/ContentProtectionIntegration.d.ts +2 -2
- package/lib/typescript/api/drm/ContentProtectionRequest.d.ts +1 -1
- package/lib/typescript/api/error/ChromecastError.d.ts +1 -1
- package/lib/typescript/api/event/CastEvent.d.ts +1 -1
- package/lib/typescript/api/event/EventDispatcher.d.ts +2 -2
- package/lib/typescript/api/event/EventListener.d.ts +1 -1
- package/lib/typescript/api/player/THEOplayer.d.ts +2 -2
- package/lib/typescript/api/source/SourceDescription.d.ts +3 -3
- package/lib/typescript/api/source/ads/Ads.d.ts +1 -1
- package/lib/typescript/api/source/ads/FreeWheelAdDescription.d.ts +1 -1
- package/lib/typescript/api/source/ads/ssai/GoogleDAIConfiguration.d.ts +2 -2
- package/lib/typescript/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.d.ts +1 -1
- package/lib/typescript/api/source/ads/ssai/ServerSideAdInsertionConfiguration.d.ts +1 -1
- package/lib/typescript/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.d.ts +2 -2
- package/lib/typescript/api/source/dash/DashPlaybackConfiguration.d.ts +1 -1
- package/lib/typescript/api/source/drm/DRMConfiguration.d.ts +3 -3
- package/lib/typescript/api/source/hls/HlsPlaybackConfiguration.d.ts +1 -1
- package/lib/typescript/api/track/MediaTrack.d.ts +1 -1
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/internal/THEOplayerView.web.d.ts +1 -1
- package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts +2 -2
- package/lib/typescript/internal/adapter/WebEventForwarder.d.ts +2 -2
- package/lib/typescript/internal/adapter/ads/THEOplayerWebAdsAdapter.d.ts +2 -2
- package/lib/typescript/internal/adapter/cast/THEOplayerWebCastAdapter.d.ts +2 -2
- package/lib/typescript/internal/adapter/event/native/NativeCastEvent.d.ts +1 -1
- package/lib/typescript/internal/adapter/web/WebPresentationModeManager.d.ts +2 -2
- package/lib/typescript/internal/cache/MediaCache.d.ts +25 -0
- package/lib/typescript/internal/cache/MediaCache.web.d.ts +16 -0
- package/lib/typescript/internal/cache/NativeCachingTaskAdapter.d.ts +33 -0
- package/lib/typescript/internal/cache/NativeCachingTaskParametersAdapter.d.ts +11 -0
- package/lib/typescript/internal/cache/WebCachingTaskAdapter.d.ts +25 -0
- package/package.json +16 -15
- package/react-native-theoplayer.podspec +4 -4
- package/src/api/ads/GoogleImaConfiguration.ts +1 -0
- package/src/api/barrel.ts +1 -0
- package/src/api/cache/CachingPreferredTrackSelection.ts +24 -0
- package/src/api/cache/CachingTask.ts +107 -0
- package/src/api/cache/CachingTaskLicense.ts +15 -0
- package/src/api/cache/CachingTaskList.ts +8 -0
- package/src/api/cache/CachingTaskParameters.ts +62 -0
- package/src/api/cache/MediaCacheAPI.ts +43 -0
- package/src/api/cache/barrel.ts +7 -0
- package/src/api/cache/events/CacheEvent.ts +62 -0
- package/src/api/cache/events/CachingTaskEvent.ts +27 -0
- package/src/api/cache/events/barrel.ts +2 -0
- package/src/api/cache/hooks/barrel.ts +3 -0
- package/src/api/cache/hooks/useCachingTaskList.ts +23 -0
- package/src/api/cache/hooks/useCachingTaskProgress.ts +20 -0
- package/src/api/cache/hooks/useCachingTaskStatus.ts +20 -0
- package/src/api/config/PlayerConfiguration.ts +3 -0
- package/src/index.tsx +1 -0
- package/src/internal/THEOplayerView.web.tsx +5 -5
- package/src/internal/adapter/THEOplayerWebAdapter.ts +6 -6
- package/src/internal/adapter/WebEventForwarder.ts +3 -3
- package/src/internal/adapter/ads/THEOplayerWebAdsAdapter.ts +3 -3
- package/src/internal/adapter/cast/THEOplayerWebCastAdapter.ts +3 -3
- package/src/internal/adapter/web/WebPresentationModeManager.ts +3 -3
- package/src/internal/cache/MediaCache.ts +151 -0
- package/src/internal/cache/MediaCache.web.ts +54 -0
- package/src/internal/cache/NativeCachingTaskAdapter.ts +81 -0
- package/src/internal/cache/NativeCachingTaskParametersAdapter.ts +32 -0
- package/src/internal/cache/WebCachingTaskAdapter.ts +95 -0
- package/android/src/main/java/com/theoplayer/track/QualityListFilter.kt +0 -28
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CachingPreferredTrackSelection } from "./CachingPreferredTrackSelection";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Describes the configuration of a caching task.
|
|
5
|
+
*
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface CachingTaskParameters {
|
|
9
|
+
/**
|
|
10
|
+
* The amount of data to cache for the given stream.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* <br/> - Available only on Web and Android. On iOS this value we always be '100%'.
|
|
14
|
+
*
|
|
15
|
+
* Possible formats:
|
|
16
|
+
* <br/> - A number in seconds.
|
|
17
|
+
* <br/> - A percentage string (XX%) for a proportion of the content duration.
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
readonly amount: number | string;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The expiration date of the cached data.
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
* <br/> - Must be a date in the future.
|
|
27
|
+
* <br/> - Data might be removed by the browser if it runs out of disk space.
|
|
28
|
+
*
|
|
29
|
+
* @defaultValue 30 minutes after starting the caching task.
|
|
30
|
+
*/
|
|
31
|
+
readonly expirationDate?: Date;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Upper bandwidth limit of the quality to cache.
|
|
35
|
+
*
|
|
36
|
+
* @remarks
|
|
37
|
+
* <br/> - This will take the quality with the highest bandwidth that is lower than the specified bandwidth.
|
|
38
|
+
* <br/> - It should be a value between zero and infinity.
|
|
39
|
+
*
|
|
40
|
+
* @defaultValue Infinity
|
|
41
|
+
*/
|
|
42
|
+
readonly bandwidth?: number;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The preferred audio/text tracks to cache.
|
|
46
|
+
*
|
|
47
|
+
* @remarks
|
|
48
|
+
* <br/> - Available only on iOS and Android.
|
|
49
|
+
* <br/> - By default, the first track will be picked.
|
|
50
|
+
*/
|
|
51
|
+
readonly preferredTrackSelection?: CachingPreferredTrackSelection;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* An indication of whether the data should be cached on a cellular network, or only on WIFI. Defaults to true.
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* <br/> - Available only on iOS.
|
|
58
|
+
* <br/> - The value can not be changed on a scheduled asset.
|
|
59
|
+
* <br/> - If the download is scheduled/started on WIFI-only mode, and suddenly we would like allow Cellular Network download too, the `CachingTask` has to be removed and scheduled again with the new `CachingParamaters`.
|
|
60
|
+
*/
|
|
61
|
+
readonly allowsCellularAccess?: boolean;
|
|
62
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { EventDispatcher } from '../event/EventDispatcher';
|
|
2
|
+
import type { SourceDescription } from 'react-native-theoplayer';
|
|
3
|
+
import type { CachingTaskParameters } from './CachingTaskParameters';
|
|
4
|
+
import type { CachingTask } from './CachingTask';
|
|
5
|
+
import type { CacheEventMap } from './events/CacheEvent';
|
|
6
|
+
import type { CachingTaskList } from './CachingTaskList';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The cache status, represented by a value from the following list:
|
|
10
|
+
* <br/> - `'uninitialised'`: Previously stored caching tasks are unavailable.
|
|
11
|
+
* <br/> - `'initialised'`: Previously stored caching tasks are now available.
|
|
12
|
+
*
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
export enum CacheStatus {
|
|
16
|
+
uninitialised = 'uninitialised',
|
|
17
|
+
initialised = 'initialised',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The media cache API.
|
|
22
|
+
*
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
25
|
+
export interface MediaCacheAPI extends EventDispatcher<CacheEventMap> {
|
|
26
|
+
/**
|
|
27
|
+
* List of caching tasks which control the caching of media.
|
|
28
|
+
*/
|
|
29
|
+
readonly tasks: CachingTaskList;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The current status of the cache.
|
|
33
|
+
*/
|
|
34
|
+
readonly status: CacheStatus;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Create a caching task which controls the caching of media.
|
|
38
|
+
*
|
|
39
|
+
* @param source - Describes the media source to be cached.
|
|
40
|
+
* @param parameters - Contains caching task related options.
|
|
41
|
+
*/
|
|
42
|
+
createTask(source: SourceDescription, parameters: CachingTaskParameters): Promise<CachingTask>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Event } from '../../event/Event';
|
|
2
|
+
import type { CacheStatus } from '../MediaCacheAPI';
|
|
3
|
+
import type { CachingTask } from '../CachingTask';
|
|
4
|
+
|
|
5
|
+
export enum CacheEventType {
|
|
6
|
+
statechange = 'statechange',
|
|
7
|
+
addtask = 'addtask',
|
|
8
|
+
removetask = 'removetask',
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The events dispatched by the {@link Cache | cache API}.
|
|
13
|
+
*
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export interface CacheEventMap {
|
|
17
|
+
/**
|
|
18
|
+
* Dispatched when {@link Cache.status} changes.
|
|
19
|
+
*/
|
|
20
|
+
[CacheEventType.statechange]: Event<CacheEventType.statechange>;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* {@inheritDoc AddCachingTaskEvent}
|
|
24
|
+
*/
|
|
25
|
+
[CacheEventType.addtask]: AddCachingTaskEvent;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* {@inheritDoc AddCachingTaskEvent}
|
|
29
|
+
*/
|
|
30
|
+
[CacheEventType.removetask]: RemoveCachingTaskEvent;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface CacheStatusChangeEvent extends Event<CacheEventType.statechange> {
|
|
34
|
+
/**
|
|
35
|
+
* The cache's new status.
|
|
36
|
+
*/
|
|
37
|
+
readonly status: CacheStatus;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Dispatched when a caching task is added.
|
|
42
|
+
*
|
|
43
|
+
* @public
|
|
44
|
+
*/
|
|
45
|
+
export interface AddCachingTaskEvent extends Event<CacheEventType.addtask> {
|
|
46
|
+
/**
|
|
47
|
+
* The task which has been added.
|
|
48
|
+
*/
|
|
49
|
+
readonly task: CachingTask;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Dispatched when a caching task is removed.
|
|
54
|
+
*
|
|
55
|
+
* @public
|
|
56
|
+
*/
|
|
57
|
+
export interface RemoveCachingTaskEvent extends Event<CacheEventType.removetask> {
|
|
58
|
+
/**
|
|
59
|
+
* The task which has been removed.
|
|
60
|
+
*/
|
|
61
|
+
readonly task: CachingTask;
|
|
62
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Event } from '../../event/Event';
|
|
2
|
+
|
|
3
|
+
export enum CachingTaskEventType {
|
|
4
|
+
progress = 'progress',
|
|
5
|
+
statechange = 'statechange',
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The events dispatched by the {@link CachingTask}.
|
|
10
|
+
*
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
export interface CachingTaskEventMap {
|
|
14
|
+
/**
|
|
15
|
+
* Dispatched when a segment is added to the cache.
|
|
16
|
+
*/
|
|
17
|
+
[CachingTaskEventType.progress]: Event<CachingTaskEventType.progress>;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Dispatched when {@link CachingTask.status} changes.
|
|
21
|
+
*/
|
|
22
|
+
[CachingTaskEventType.statechange]: Event<CachingTaskEventType.statechange>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type CachingTaskProgressEvent = Event<CachingTaskEventType.progress>;
|
|
26
|
+
|
|
27
|
+
export type CachingTaskStatusChangeEvent = Event<CachingTaskEventType.statechange>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CacheEventType, MediaCache } from 'react-native-theoplayer';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
export const useCachingTaskList = (debug = false) => {
|
|
5
|
+
const [tasks, setTasks] = useState([...MediaCache.tasks]);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const taskListChangeListener = () => {
|
|
8
|
+
if (debug) {
|
|
9
|
+
console.log('[MediaCache] task list changed: ', MediaCache.tasks);
|
|
10
|
+
}
|
|
11
|
+
setTasks([...MediaCache.tasks]);
|
|
12
|
+
};
|
|
13
|
+
MediaCache.addEventListener(CacheEventType.addtask, taskListChangeListener);
|
|
14
|
+
MediaCache.addEventListener(CacheEventType.removetask, taskListChangeListener);
|
|
15
|
+
MediaCache.addEventListener(CacheEventType.statechange, taskListChangeListener);
|
|
16
|
+
return () => {
|
|
17
|
+
MediaCache.removeEventListener(CacheEventType.addtask, taskListChangeListener);
|
|
18
|
+
MediaCache.removeEventListener(CacheEventType.removetask, taskListChangeListener);
|
|
19
|
+
MediaCache.addEventListener(CacheEventType.statechange, taskListChangeListener);
|
|
20
|
+
};
|
|
21
|
+
}, []);
|
|
22
|
+
return tasks;
|
|
23
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CachingTask, CachingTaskEventType } from 'react-native-theoplayer';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
export const useCachingTaskProgress = (task: CachingTask, debug = true) => {
|
|
5
|
+
const [progress, setProgress] = useState<number | undefined>(task.percentageCached);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const onProgress = () => {
|
|
8
|
+
const percentageCached = task.percentageCached;
|
|
9
|
+
if (debug) {
|
|
10
|
+
console.log('[MediaCache] progress change', percentageCached);
|
|
11
|
+
}
|
|
12
|
+
setProgress(percentageCached);
|
|
13
|
+
};
|
|
14
|
+
task.addEventListener(CachingTaskEventType.progress, onProgress);
|
|
15
|
+
return () => {
|
|
16
|
+
task.removeEventListener(CachingTaskEventType.progress, onProgress);
|
|
17
|
+
};
|
|
18
|
+
}, []);
|
|
19
|
+
return progress;
|
|
20
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CacheTaskStatus, CachingTask, CachingTaskEventType } from 'react-native-theoplayer';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
export const useCachingTaskStatus = (task: CachingTask, debug = false) => {
|
|
5
|
+
const [status, setStatus] = useState<CacheTaskStatus | undefined>(task.status);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const onStateChange = () => {
|
|
8
|
+
const status = task.status;
|
|
9
|
+
if (debug) {
|
|
10
|
+
console.log('[MediaCache] state change', status);
|
|
11
|
+
}
|
|
12
|
+
setStatus(status);
|
|
13
|
+
};
|
|
14
|
+
task.addEventListener(CachingTaskEventType.statechange, onStateChange);
|
|
15
|
+
return () => {
|
|
16
|
+
task.removeEventListener(CachingTaskEventType.statechange, onStateChange);
|
|
17
|
+
};
|
|
18
|
+
}, []);
|
|
19
|
+
return status;
|
|
20
|
+
};
|
package/src/index.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import type { THEOplayerViewProps } from 'react-native-theoplayer';
|
|
3
|
-
import
|
|
3
|
+
import { Player, ChromelessPlayer, PlayerConfiguration } from 'theoplayer';
|
|
4
4
|
import { THEOplayerWebAdapter } from './adapter/THEOplayerWebAdapter';
|
|
5
5
|
|
|
6
6
|
export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProps>) {
|
|
7
7
|
const { config, children } = props;
|
|
8
|
-
const player = useRef<
|
|
8
|
+
const player = useRef<ChromelessPlayer | null>(null);
|
|
9
9
|
const adapter = useRef<THEOplayerWebAdapter | null>(null);
|
|
10
10
|
const container = useRef<null | HTMLDivElement>(null);
|
|
11
11
|
|
|
@@ -15,14 +15,14 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
|
|
|
15
15
|
const chromeless = config?.chromeless === true || config?.chromeless === undefined;
|
|
16
16
|
const updatedConfig = { ...config, allowNativeFullscreen: true };
|
|
17
17
|
if (chromeless) {
|
|
18
|
-
player.current = new
|
|
18
|
+
player.current = new ChromelessPlayer(container.current, updatedConfig);
|
|
19
19
|
} else {
|
|
20
|
-
player.current = new
|
|
20
|
+
player.current = new Player(container.current, {
|
|
21
21
|
...updatedConfig,
|
|
22
22
|
ui: {
|
|
23
23
|
fluid: true,
|
|
24
24
|
},
|
|
25
|
-
} as
|
|
25
|
+
} as PlayerConfiguration);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// Adapt native player to react-native player.
|
|
@@ -15,7 +15,7 @@ import type {
|
|
|
15
15
|
import { AspectRatio, PlayerEventType, PresentationMode } from 'react-native-theoplayer';
|
|
16
16
|
import { THEOplayerWebAdsAdapter } from './ads/THEOplayerWebAdsAdapter';
|
|
17
17
|
import { THEOplayerWebCastAdapter } from './cast/THEOplayerWebCastAdapter';
|
|
18
|
-
import
|
|
18
|
+
import { ChromelessPlayer as NativeChromelessPlayer, SourceDescription as NativeSourceDescription, version as nativeVersion } from 'theoplayer';
|
|
19
19
|
import type { MediaTrack as NativeMediaTrack, TextTrack as NativeTextTrack } from 'theoplayer';
|
|
20
20
|
import { findNativeQualitiesByUid, fromNativeMediaTrackList, fromNativeTextTrackList } from './web/TrackUtils';
|
|
21
21
|
import type { ABRConfiguration, SourceDescription } from 'src/api/barrel';
|
|
@@ -38,14 +38,14 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
|
|
|
38
38
|
private readonly _adsAdapter: THEOplayerWebAdsAdapter;
|
|
39
39
|
private readonly _castAdapter: THEOplayerWebCastAdapter;
|
|
40
40
|
private readonly _presentationModeManager: WebPresentationModeManager;
|
|
41
|
-
private _player:
|
|
41
|
+
private _player: NativeChromelessPlayer | undefined;
|
|
42
42
|
private _eventForwarder: WebEventForwarder | undefined;
|
|
43
43
|
private _mediaSession: WebMediaSession | undefined = undefined;
|
|
44
44
|
private _targetVideoQuality: number | number[] | undefined = undefined;
|
|
45
45
|
private _backgroundAudioConfiguration: BackgroundAudioConfiguration = defaultBackgroundAudioConfiguration;
|
|
46
46
|
private _pipConfiguration: PiPConfiguration = defaultPipConfiguration;
|
|
47
47
|
|
|
48
|
-
constructor(player:
|
|
48
|
+
constructor(player: NativeChromelessPlayer, config?: PlayerConfiguration) {
|
|
49
49
|
super();
|
|
50
50
|
this._player = player;
|
|
51
51
|
this._adsAdapter = new THEOplayerWebAdsAdapter(this._player);
|
|
@@ -71,7 +71,7 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
|
|
|
71
71
|
set source(source: SourceDescription | undefined) {
|
|
72
72
|
this._targetVideoQuality = undefined;
|
|
73
73
|
if (this._player) {
|
|
74
|
-
this._player.source = source as
|
|
74
|
+
this._player.source = source as NativeSourceDescription;
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -302,8 +302,8 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
|
|
|
302
302
|
|
|
303
303
|
public get version(): PlayerVersion {
|
|
304
304
|
return {
|
|
305
|
-
version:
|
|
306
|
-
playerSuiteVersion:
|
|
305
|
+
version: nativeVersion,
|
|
306
|
+
playerSuiteVersion: '', // deprecated
|
|
307
307
|
};
|
|
308
308
|
}
|
|
309
309
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type { ChromelessPlayer } from 'theoplayer';
|
|
2
2
|
import type {
|
|
3
3
|
AddTrackEvent,
|
|
4
4
|
CastStateChangeEvent,
|
|
@@ -53,10 +53,10 @@ import {
|
|
|
53
53
|
import { fromNativeCue, fromNativeMediaTrack, fromNativeTextTrack } from './web/TrackUtils';
|
|
54
54
|
|
|
55
55
|
export class WebEventForwarder {
|
|
56
|
-
private readonly _player:
|
|
56
|
+
private readonly _player: ChromelessPlayer;
|
|
57
57
|
private readonly _facade: THEOplayerWebAdapter;
|
|
58
58
|
|
|
59
|
-
constructor(player:
|
|
59
|
+
constructor(player: ChromelessPlayer, facade: THEOplayerWebAdapter) {
|
|
60
60
|
this._player = player;
|
|
61
61
|
this._facade = facade;
|
|
62
62
|
this.addEventListeners();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { Ad, AdBreak, AdDescription, AdsAPI, GoogleDAI } from 'react-native-theoplayer';
|
|
2
2
|
import { THEOplayerWebGoogleDAI } from './THEOplayerWebGoogleDAI';
|
|
3
|
-
import type
|
|
3
|
+
import type { ChromelessPlayer } from 'theoplayer';
|
|
4
4
|
|
|
5
5
|
export class THEOplayerWebAdsAdapter implements AdsAPI {
|
|
6
|
-
private readonly _player:
|
|
6
|
+
private readonly _player: ChromelessPlayer;
|
|
7
7
|
private _dai: GoogleDAI | undefined;
|
|
8
8
|
|
|
9
|
-
constructor(player:
|
|
9
|
+
constructor(player: ChromelessPlayer) {
|
|
10
10
|
this._player = player;
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Airplay, CastAPI, Chromecast } from 'react-native-theoplayer';
|
|
2
|
-
import type
|
|
2
|
+
import type { ChromelessPlayer } from 'theoplayer';
|
|
3
3
|
|
|
4
4
|
export class THEOplayerWebCastAdapter implements CastAPI {
|
|
5
|
-
private readonly _player:
|
|
5
|
+
private readonly _player: ChromelessPlayer;
|
|
6
6
|
|
|
7
|
-
constructor(player:
|
|
7
|
+
constructor(player: ChromelessPlayer) {
|
|
8
8
|
this._player = player;
|
|
9
9
|
}
|
|
10
10
|
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import type { PlayerEventMap } from 'react-native-theoplayer';
|
|
2
2
|
import { PresentationMode } from 'react-native-theoplayer';
|
|
3
|
-
import type
|
|
3
|
+
import type { ChromelessPlayer } from 'theoplayer';
|
|
4
4
|
import { DefaultPresentationModeChangeEvent } from '../event/PlayerEvents';
|
|
5
5
|
import type { DefaultEventDispatcher } from '../event/DefaultEventDispatcher';
|
|
6
6
|
import { fullscreenAPI } from './FullscreenAPI';
|
|
7
7
|
import { noOp } from '../../utils/CommonUtils';
|
|
8
8
|
|
|
9
9
|
export class WebPresentationModeManager {
|
|
10
|
-
private readonly _player:
|
|
10
|
+
private readonly _player: ChromelessPlayer;
|
|
11
11
|
private _presentationMode: PresentationMode = PresentationMode.inline;
|
|
12
12
|
private _element: HTMLVideoElement | undefined = undefined;
|
|
13
13
|
private _eventForwarder: DefaultEventDispatcher<PlayerEventMap>;
|
|
14
14
|
|
|
15
|
-
constructor(player:
|
|
15
|
+
constructor(player: ChromelessPlayer, eventForwarder: DefaultEventDispatcher<PlayerEventMap>) {
|
|
16
16
|
this._player = player;
|
|
17
17
|
this._eventForwarder = eventForwarder;
|
|
18
18
|
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { CacheStatus, MediaCacheAPI } from '../../api/cache/MediaCacheAPI';
|
|
2
|
+
import type { CachingTaskList } from '../../api/cache/CachingTaskList';
|
|
3
|
+
import { DefaultEventDispatcher } from '../adapter/event/DefaultEventDispatcher';
|
|
4
|
+
import type { CacheEventMap } from '../../api/cache/events/CacheEvent';
|
|
5
|
+
import { CacheEventType } from '../../api/cache/events/CacheEvent';
|
|
6
|
+
import type { CachingTaskProgressEvent, CachingTaskStatusChangeEvent, SourceDescription } from 'react-native-theoplayer';
|
|
7
|
+
import { CacheTaskStatus, CachingTaskEventType, TimeRange } from 'react-native-theoplayer';
|
|
8
|
+
import type { CachingTaskParameters } from '../../api/cache/CachingTaskParameters';
|
|
9
|
+
import type { CachingTask } from '../../api/cache/CachingTask';
|
|
10
|
+
import { NativeEventEmitter, NativeModules } from 'react-native';
|
|
11
|
+
import { NativeCachingTask, NativeCachingTaskAdapter } from './NativeCachingTaskAdapter';
|
|
12
|
+
import { toNativeCachingTaskParameters } from "./NativeCachingTaskParametersAdapter";
|
|
13
|
+
|
|
14
|
+
const TAG = "NativeMediaCache";
|
|
15
|
+
|
|
16
|
+
interface NativeCachingStatusChangeEvent {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly status: CacheTaskStatus;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface NativeCacheStatusChangeEvent {
|
|
22
|
+
readonly status: CacheStatus;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface NativeAddCachingTaskEvent {
|
|
26
|
+
readonly task: NativeCachingTask;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface NativeRemoveCachingTaskEvent {
|
|
30
|
+
readonly task: NativeCachingTask;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface NativeCachingTaskProgressEvent {
|
|
34
|
+
id: string;
|
|
35
|
+
progress: {
|
|
36
|
+
readonly duration: number;
|
|
37
|
+
readonly cached: TimeRange[];
|
|
38
|
+
readonly secondsCached: number;
|
|
39
|
+
readonly percentageCached: number;
|
|
40
|
+
readonly bytes: number;
|
|
41
|
+
readonly bytesCached: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class NativeMediaCache extends DefaultEventDispatcher<CacheEventMap> implements MediaCacheAPI {
|
|
46
|
+
private _emitter: NativeEventEmitter = new NativeEventEmitter(NativeModules.CacheModule);
|
|
47
|
+
private _status: CacheStatus = CacheStatus.uninitialised;
|
|
48
|
+
private _tasks: NativeCachingTaskAdapter[] = [];
|
|
49
|
+
|
|
50
|
+
constructor() {
|
|
51
|
+
super();
|
|
52
|
+
this._emitter.addListener('onCacheStatusChange', this.onCacheStatusChange);
|
|
53
|
+
this._emitter.addListener('onAddCachingTaskEvent', this.onAddCachingTaskEvent);
|
|
54
|
+
this._emitter.addListener('onRemoveCachingTaskEvent', this.onRemoveCachingTaskEvent);
|
|
55
|
+
this._emitter.addListener('onCachingTaskProgressEvent', this.onCachingTaskProgressEvent);
|
|
56
|
+
this._emitter.addListener('onCachingTaskStatusChangeEvent', this.onCachingTaskStatusChangeEvent);
|
|
57
|
+
void this.initialize();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async createTask(source: SourceDescription, parameters: CachingTaskParameters): Promise<CachingTask> {
|
|
61
|
+
return NativeModules.CacheModule.createTask(source, toNativeCachingTaskParameters(parameters));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
get status(): CacheStatus {
|
|
65
|
+
return this._status;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
get tasks(): CachingTaskList {
|
|
69
|
+
return this._tasks;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private async initialize(): Promise<void> {
|
|
73
|
+
await this.getInitialState();
|
|
74
|
+
|
|
75
|
+
// Dispatch status change event here
|
|
76
|
+
if (this._status === CacheStatus.initialised) {
|
|
77
|
+
await this.onCacheStatusChange({
|
|
78
|
+
status: this._status,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private async getInitialState(): Promise<void> {
|
|
84
|
+
const initialState = await NativeModules.CacheModule.getInitialState();
|
|
85
|
+
this._status = initialState.status;
|
|
86
|
+
this._tasks = initialState.tasks.map((task: NativeCachingTask) => new NativeCachingTaskAdapter(task));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private onCacheStatusChange = async (event: NativeCacheStatusChangeEvent) => {
|
|
90
|
+
if (this._status === CacheStatus.uninitialised) {
|
|
91
|
+
await this.getInitialState();
|
|
92
|
+
}
|
|
93
|
+
this._status = event.status;
|
|
94
|
+
this.dispatchEvent({
|
|
95
|
+
type: CacheEventType.statechange,
|
|
96
|
+
date: new Date()
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
private onAddCachingTaskEvent = (event: NativeAddCachingTaskEvent) => {
|
|
101
|
+
const task= new NativeCachingTaskAdapter(event.task);
|
|
102
|
+
this._tasks.push(task);
|
|
103
|
+
this.dispatchEvent({
|
|
104
|
+
type: CacheEventType.addtask,
|
|
105
|
+
task,
|
|
106
|
+
date: new Date(),
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
private onRemoveCachingTaskEvent = (event: NativeRemoveCachingTaskEvent) => {
|
|
111
|
+
const task = this.taskById(event.task.id);
|
|
112
|
+
if (task) {
|
|
113
|
+
this._tasks = this._tasks.filter((task) => task.id !== event.task.id);
|
|
114
|
+
this.dispatchEvent({
|
|
115
|
+
type: CacheEventType.removetask,
|
|
116
|
+
task,
|
|
117
|
+
date: new Date(),
|
|
118
|
+
});
|
|
119
|
+
} else {
|
|
120
|
+
console.warn(TAG, `onRemoveCachingTaskEvent: CachingTask with id ${event.task.id} not found.`)
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
private onCachingTaskProgressEvent = (event: NativeCachingTaskProgressEvent) => {
|
|
125
|
+
const task = this.taskById(event.id);
|
|
126
|
+
if (task) {
|
|
127
|
+
Object.assign(task, { ...event.progress });
|
|
128
|
+
task.dispatchEvent({
|
|
129
|
+
type: CachingTaskEventType.progress,
|
|
130
|
+
date: new Date(),
|
|
131
|
+
} as CachingTaskProgressEvent);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
private onCachingTaskStatusChangeEvent = (event: NativeCachingStatusChangeEvent) => {
|
|
136
|
+
const task = this.taskById(event.id);
|
|
137
|
+
if (task) {
|
|
138
|
+
Object.assign(task, { ...event });
|
|
139
|
+
task.dispatchEvent({
|
|
140
|
+
type: CachingTaskEventType.statechange,
|
|
141
|
+
date: new Date(),
|
|
142
|
+
} as CachingTaskStatusChangeEvent);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
private taskById(id: string): NativeCachingTaskAdapter | undefined {
|
|
147
|
+
return this._tasks.find((task) => task.id === id);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export const MediaCache = new NativeMediaCache();
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { CacheStatus, MediaCacheAPI } from 'react-native-theoplayer';
|
|
2
|
+
import type { CachingTaskList } from 'react-native-theoplayer';
|
|
3
|
+
import { DefaultEventDispatcher } from '../adapter/event/DefaultEventDispatcher';
|
|
4
|
+
import type { CacheEventMap } from 'react-native-theoplayer';
|
|
5
|
+
import type { SourceDescription } from 'react-native-theoplayer';
|
|
6
|
+
import type { CachingTaskParameters } from 'react-native-theoplayer';
|
|
7
|
+
import type { CachingTask } from 'react-native-theoplayer';
|
|
8
|
+
import * as THEOplayerWeb from 'theoplayer';
|
|
9
|
+
import { WebCachingTaskAdapter } from './WebCachingTaskAdapter';
|
|
10
|
+
import type { AddCachingTaskEvent, RemoveCachingTaskEvent, SourceDescription as NativeSourceDescription } from 'theoplayer';
|
|
11
|
+
import { CacheEventType } from 'react-native-theoplayer';
|
|
12
|
+
|
|
13
|
+
export class WebMediaCache extends DefaultEventDispatcher<CacheEventMap> implements MediaCacheAPI {
|
|
14
|
+
constructor() {
|
|
15
|
+
super();
|
|
16
|
+
THEOplayerWeb.cache.tasks.addEventListener('addtask', this.onAddTask);
|
|
17
|
+
THEOplayerWeb.cache.tasks.addEventListener('removetask', this.onRemoveTask);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private onAddTask = (event: AddCachingTaskEvent) => {
|
|
21
|
+
this.dispatchEvent({
|
|
22
|
+
type: CacheEventType.addtask,
|
|
23
|
+
task: new WebCachingTaskAdapter(event.task),
|
|
24
|
+
date: event.date,
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
private onRemoveTask = (event: RemoveCachingTaskEvent) => {
|
|
29
|
+
this.dispatchEvent({
|
|
30
|
+
type: CacheEventType.removetask,
|
|
31
|
+
task: new WebCachingTaskAdapter(event.task),
|
|
32
|
+
date: event.date,
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
createTask(source: SourceDescription, parameters: CachingTaskParameters): Promise<CachingTask> {
|
|
37
|
+
return Promise.resolve(new WebCachingTaskAdapter(THEOplayerWeb.cache.createTask(source as NativeSourceDescription, parameters)));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get status(): CacheStatus {
|
|
41
|
+
return THEOplayerWeb.cache.status as CacheStatus;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// @ts-ignore
|
|
45
|
+
get tasks(): CachingTaskList {
|
|
46
|
+
return THEOplayerWeb.cache.tasks.map((task) => new WebCachingTaskAdapter(task)) as CachingTaskList;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const MediaCache = new WebMediaCache();
|
|
51
|
+
|
|
52
|
+
// Expose cache for easy access
|
|
53
|
+
// @ts-ignore
|
|
54
|
+
window.MediaCache = MediaCache;
|