react-native-theoplayer 3.10.3 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -4
- package/README.md +96 -24
- package/android/build.gradle +3 -11
- package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +82 -28
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerContext.kt +35 -14
- package/android/src/main/java/com/theoplayer/media/MediaPlaybackService.kt +1 -1
- package/android/src/main/java/com/theoplayer/media/MediaSessionConfig.kt +18 -0
- package/android/src/main/java/com/theoplayer/media/MediaSessionConfigAdapter.kt +23 -0
- package/ios/THEOplayerRCTPlayerAPI.swift +2 -2
- package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +1 -11
- package/ios/THEOplayerRCTTrackMetadataAggregator.swift +2 -0
- package/ios/THEOplayerRCTView.swift +7 -25
- package/ios/ads/THEOplayerRCTAdsAPI+DAI.swift +1 -1
- package/ios/ads/THEOplayerRCTAdsAPI.swift +1 -1
- package/ios/ads/THEOplayerRCTAdsEventHandler.swift +2 -2
- package/ios/ads/THEOplayerRCTSourceDescriptionBuilder+Ads.swift +3 -3
- package/ios/ads/THEOplayerRCTView+Ads.swift +35 -1
- package/ios/ads/THEOplayerRCTView+AdsConfig.swift +33 -14
- package/ios/backgroundAudio/THEOplayerRCTRemoteCommandsManager.swift +2 -2
- package/ios/backgroundAudio/THEOplayerRCTView+BackgroundAudioConfig.swift +0 -12
- package/ios/pip/THEOplayerRCTPipControlsManager.swift +11 -18
- package/ios/pip/THEOplayerRCTView+PipConfig.swift +8 -15
- package/lib/commonjs/api/THEOplayerView.js.map +1 -1
- package/lib/commonjs/api/abr/ABRConfiguration.js.map +1 -1
- package/lib/commonjs/api/abr/barrel.js.map +1 -1
- package/lib/commonjs/api/ads/Ad.js.map +1 -1
- package/lib/commonjs/api/ads/AdBreak.js.map +1 -1
- package/lib/commonjs/api/ads/AdsAPI.js.map +1 -1
- package/lib/commonjs/api/ads/AdsConfiguration.js.map +1 -1
- package/lib/commonjs/api/ads/CompanionAd.js.map +1 -1
- package/lib/commonjs/api/ads/GoogleDai.js.map +1 -1
- package/lib/commonjs/api/ads/GoogleImaAd.js.map +1 -1
- package/lib/commonjs/api/ads/GoogleImaConfiguration.js.map +1 -1
- package/lib/commonjs/api/ads/barrel.js.map +1 -1
- package/lib/commonjs/api/backgroundAudio/BackgroundAudioConfiguration.js.map +1 -1
- package/lib/commonjs/api/backgroundAudio/barrel.js.map +1 -1
- package/lib/commonjs/api/barrel.js +20 -9
- package/lib/commonjs/api/barrel.js.map +1 -1
- package/lib/commonjs/api/broadcast/EventBroadcastAPI.js.map +1 -1
- package/lib/commonjs/api/broadcast/barrel.js.map +1 -1
- package/lib/commonjs/api/cache/CachingPreferredTrackSelection.js.map +1 -1
- package/lib/commonjs/api/cache/CachingTask.js.map +1 -1
- package/lib/commonjs/api/cache/CachingTaskLicense.js.map +1 -1
- package/lib/commonjs/api/cache/CachingTaskList.js.map +1 -1
- package/lib/commonjs/api/cache/CachingTaskParameters.js.map +1 -1
- package/lib/commonjs/api/cache/MediaCacheAPI.js.map +1 -1
- package/lib/commonjs/api/cache/barrel.js +11 -0
- package/lib/commonjs/api/cache/barrel.js.map +1 -1
- package/lib/commonjs/api/cache/events/CacheEvent.js +1 -1
- package/lib/commonjs/api/cache/events/CacheEvent.js.map +1 -1
- package/lib/commonjs/api/cache/events/CachingTaskEvent.js.map +1 -1
- package/lib/commonjs/api/cache/events/barrel.js.map +1 -1
- package/lib/commonjs/api/cache/hooks/barrel.js.map +1 -1
- package/lib/commonjs/api/cache/hooks/useCachingTaskList.js.map +1 -1
- package/lib/commonjs/api/cache/hooks/useCachingTaskProgress.js.map +1 -1
- package/lib/commonjs/api/cache/hooks/useCachingTaskStatus.js.map +1 -1
- package/lib/commonjs/api/cast/Airplay.js.map +1 -1
- package/lib/commonjs/api/cast/CastAPI.js.map +1 -1
- package/lib/commonjs/api/cast/CastConfiguration.js.map +1 -1
- package/lib/commonjs/api/cast/CastState.js.map +1 -1
- package/lib/commonjs/api/cast/Chromecast.js.map +1 -1
- package/lib/commonjs/api/cast/barrel.js.map +1 -1
- package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/commonjs/api/config/barrel.js.map +1 -1
- package/lib/commonjs/api/drm/ContentProtectionAPI.js.map +1 -1
- package/lib/commonjs/api/drm/ContentProtectionIntegration.js.map +1 -1
- package/lib/commonjs/api/drm/ContentProtectionIntegrationFactory.js.map +1 -1
- package/lib/commonjs/api/drm/ContentProtectionRequest.js.map +1 -1
- package/lib/commonjs/api/drm/ContentProtectionResponse.js.map +1 -1
- package/lib/commonjs/api/drm/barrel.js.map +1 -1
- package/lib/commonjs/api/error/ChromecastError.js.map +1 -1
- package/lib/commonjs/api/error/PlayerError.js.map +1 -1
- package/lib/commonjs/api/error/barrel.js.map +1 -1
- package/lib/commonjs/api/event/AdEvent.js.map +1 -1
- package/lib/commonjs/api/event/CastEvent.js.map +1 -1
- package/lib/commonjs/api/event/Event.js.map +1 -1
- package/lib/commonjs/api/event/EventDispatcher.js.map +1 -1
- package/lib/commonjs/api/event/EventListener.js.map +1 -1
- package/lib/commonjs/api/event/PlayerEvent.js.map +1 -1
- package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
- package/lib/commonjs/api/event/barrel.js +33 -11
- package/lib/commonjs/api/event/barrel.js.map +1 -1
- package/lib/commonjs/api/media/MediaControlConfiguration.js.map +1 -1
- package/lib/commonjs/api/media/barrel.js.map +1 -1
- package/lib/commonjs/api/pip/PiPConfiguration.js.map +1 -1
- package/lib/commonjs/api/pip/barrel.js.map +1 -1
- package/lib/commonjs/api/player/PlayerEventMap.js.map +1 -1
- package/lib/commonjs/api/player/PlayerVersion.js.map +1 -1
- package/lib/commonjs/api/player/THEOplayer.js.map +1 -1
- package/lib/commonjs/api/player/barrel.js.map +1 -1
- package/lib/commonjs/api/presentation/PresentationMode.js.map +1 -1
- package/lib/commonjs/api/presentation/barrel.js.map +1 -1
- package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
- package/lib/commonjs/api/source/ads/Ads.js.map +1 -1
- package/lib/commonjs/api/source/ads/FreeWheelAdDescription.js.map +1 -1
- package/lib/commonjs/api/source/ads/IMAAdDescription.js.map +1 -1
- package/lib/commonjs/api/source/ads/SpotXAdDescription.js.map +1 -1
- package/lib/commonjs/api/source/ads/THEOplayerAdDescription.js.map +1 -1
- package/lib/commonjs/api/source/ads/barrel.js.map +1 -1
- package/lib/commonjs/api/source/ads/ssai/GoogleDAIConfiguration.js.map +1 -1
- package/lib/commonjs/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js.map +1 -1
- package/lib/commonjs/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js.map +1 -1
- package/lib/commonjs/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js.map +1 -1
- package/lib/commonjs/api/source/ads/ssai/barrel.js.map +1 -1
- package/lib/commonjs/api/source/analytics/AnalyticsDescription.js.map +1 -1
- package/lib/commonjs/api/source/analytics/barrel.js.map +1 -1
- package/lib/commonjs/api/source/barrel.js.map +1 -1
- package/lib/commonjs/api/source/dash/DashPlaybackConfiguration.js.map +1 -1
- package/lib/commonjs/api/source/dash/barrel.js.map +1 -1
- package/lib/commonjs/api/source/drm/DRMConfiguration.js.map +1 -1
- package/lib/commonjs/api/source/drm/barrel.js.map +1 -1
- package/lib/commonjs/api/source/hls/HlsPlaybackConfiguration.js.map +1 -1
- package/lib/commonjs/api/source/hls/barrel.js.map +1 -1
- package/lib/commonjs/api/source/metadata/MetadataDescription.js.map +1 -1
- package/lib/commonjs/api/source/metadata/barrel.js.map +1 -1
- package/lib/commonjs/api/timeranges/TimeRange.js.map +1 -1
- package/lib/commonjs/api/timeranges/barrel.js.map +1 -1
- package/lib/commonjs/api/track/DateRangeCue.js.map +1 -1
- package/lib/commonjs/api/track/MediaTrack.js.map +1 -1
- package/lib/commonjs/api/track/Quality.js.map +1 -1
- package/lib/commonjs/api/track/TextTrack.js.map +1 -1
- package/lib/commonjs/api/track/TextTrackCue.js.map +1 -1
- package/lib/commonjs/api/track/TextTrackStyle.js.map +1 -1
- package/lib/commonjs/api/track/Track.js.map +1 -1
- package/lib/commonjs/api/track/barrel.js.map +1 -1
- package/lib/commonjs/api/ui/UIConfiguration.js.map +1 -1
- package/lib/commonjs/api/ui/barrel.js.map +1 -1
- package/lib/commonjs/api/utils/RetryConfiguration.js.map +1 -1
- package/lib/commonjs/api/utils/TypeUtils.js.map +1 -1
- package/lib/commonjs/api/utils/barrel.js +11 -0
- package/lib/commonjs/api/utils/barrel.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.js +6 -3
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.style.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +13 -3
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/commonjs/internal/adapter/NativePlayerState.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +1 -3
- package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +1 -2
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/WebEventForwarder.js +0 -1
- 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/THEOplayerNativeAdsAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/ads/THEOplayerNativeGoogleDAI.js.map +1 -1
- package/lib/commonjs/internal/adapter/ads/THEOplayerWebAdsAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/ads/THEOplayerWebGoogleDAI.js.map +1 -1
- package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/broadcast/EventBroadcastAdapter.web.js.map +1 -1
- package/lib/commonjs/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js.map +1 -1
- package/lib/commonjs/internal/adapter/cast/THEOplayerNativeAirplay.js.map +1 -1
- package/lib/commonjs/internal/adapter/cast/THEOplayerNativeCastAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/cast/THEOplayerNativeChromecast.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.map +1 -1
- package/lib/commonjs/internal/adapter/event/PlayerEvents.js.map +1 -1
- package/lib/commonjs/internal/adapter/event/native/NativeAdEvent.js.map +1 -1
- package/lib/commonjs/internal/adapter/event/native/NativeCastEvent.js.map +1 -1
- package/lib/commonjs/internal/adapter/event/native/NativePlayerEvent.js.map +1 -1
- 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.map +1 -1
- package/lib/commonjs/internal/adapter/web/TrackUtils.js.map +1 -1
- package/lib/commonjs/internal/adapter/web/WebMediaSession.js +10 -6
- package/lib/commonjs/internal/adapter/web/WebMediaSession.js.map +1 -1
- package/lib/commonjs/internal/adapter/web/WebPresentationModeManager.js.map +1 -1
- package/lib/commonjs/internal/cache/MediaCache.js +1 -1
- package/lib/commonjs/internal/cache/MediaCache.js.map +1 -1
- package/lib/commonjs/internal/cache/MediaCache.web.js +2 -2
- package/lib/commonjs/internal/cache/MediaCache.web.js.map +1 -1
- package/lib/commonjs/internal/cache/NativeCachingTaskAdapter.js.map +1 -1
- package/lib/commonjs/internal/cache/NativeCachingTaskParametersAdapter.js.map +1 -1
- package/lib/commonjs/internal/cache/WebCachingTaskAdapter.js.map +1 -1
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.js.map +1 -1
- package/lib/commonjs/internal/drm/ContentProtectionRegistry.web.js.map +1 -1
- package/lib/commonjs/internal/drm/NativeCertificateRequest.js.map +1 -1
- package/lib/commonjs/internal/drm/NativeCertificateResponse.js.map +1 -1
- package/lib/commonjs/internal/drm/NativeContentProtectionEvent.js.map +1 -1
- package/lib/commonjs/internal/drm/NativeLicenseRequest.js.map +1 -1
- package/lib/commonjs/internal/drm/NativeLicenseResponse.js.map +1 -1
- package/lib/commonjs/internal/utils/CommonUtils.js.map +1 -1
- package/lib/commonjs/internal/utils/Dimensions.js.map +1 -1
- package/lib/commonjs/internal/utils/TypeUtils.js.map +1 -1
- package/lib/commonjs/internal/utils/arrayUtil.js.map +1 -1
- package/lib/commonjs/web/platform/browser.d.js.map +1 -1
- package/lib/module/api/THEOplayerView.js.map +1 -1
- package/lib/module/api/abr/ABRConfiguration.js.map +1 -1
- package/lib/module/api/abr/barrel.js.map +1 -1
- package/lib/module/api/ads/Ad.js.map +1 -1
- package/lib/module/api/ads/AdBreak.js.map +1 -1
- package/lib/module/api/ads/AdsAPI.js.map +1 -1
- package/lib/module/api/ads/AdsConfiguration.js.map +1 -1
- package/lib/module/api/ads/CompanionAd.js.map +1 -1
- package/lib/module/api/ads/GoogleDai.js.map +1 -1
- package/lib/module/api/ads/GoogleImaAd.js.map +1 -1
- package/lib/module/api/ads/GoogleImaConfiguration.js.map +1 -1
- package/lib/module/api/ads/barrel.js.map +1 -1
- package/lib/module/api/backgroundAudio/BackgroundAudioConfiguration.js.map +1 -1
- package/lib/module/api/backgroundAudio/barrel.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/broadcast/EventBroadcastAPI.js.map +1 -1
- package/lib/module/api/broadcast/barrel.js.map +1 -1
- package/lib/module/api/cache/CachingPreferredTrackSelection.js.map +1 -1
- package/lib/module/api/cache/CachingTask.js.map +1 -1
- package/lib/module/api/cache/CachingTaskLicense.js.map +1 -1
- package/lib/module/api/cache/CachingTaskList.js.map +1 -1
- package/lib/module/api/cache/CachingTaskParameters.js.map +1 -1
- package/lib/module/api/cache/MediaCacheAPI.js.map +1 -1
- package/lib/module/api/cache/barrel.js +1 -0
- package/lib/module/api/cache/barrel.js.map +1 -1
- package/lib/module/api/cache/events/CacheEvent.js +1 -1
- package/lib/module/api/cache/events/CacheEvent.js.map +1 -1
- package/lib/module/api/cache/events/CachingTaskEvent.js.map +1 -1
- package/lib/module/api/cache/events/barrel.js.map +1 -1
- package/lib/module/api/cache/hooks/barrel.js.map +1 -1
- package/lib/module/api/cache/hooks/useCachingTaskList.js.map +1 -1
- package/lib/module/api/cache/hooks/useCachingTaskProgress.js.map +1 -1
- package/lib/module/api/cache/hooks/useCachingTaskStatus.js.map +1 -1
- package/lib/module/api/cast/Airplay.js.map +1 -1
- package/lib/module/api/cast/CastAPI.js.map +1 -1
- package/lib/module/api/cast/CastConfiguration.js.map +1 -1
- package/lib/module/api/cast/CastState.js.map +1 -1
- package/lib/module/api/cast/Chromecast.js.map +1 -1
- package/lib/module/api/cast/barrel.js.map +1 -1
- package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/module/api/config/barrel.js.map +1 -1
- package/lib/module/api/drm/ContentProtectionAPI.js.map +1 -1
- package/lib/module/api/drm/ContentProtectionIntegration.js.map +1 -1
- package/lib/module/api/drm/ContentProtectionIntegrationFactory.js.map +1 -1
- package/lib/module/api/drm/ContentProtectionRequest.js.map +1 -1
- package/lib/module/api/drm/ContentProtectionResponse.js.map +1 -1
- package/lib/module/api/drm/barrel.js.map +1 -1
- package/lib/module/api/error/ChromecastError.js.map +1 -1
- package/lib/module/api/error/PlayerError.js.map +1 -1
- package/lib/module/api/error/barrel.js.map +1 -1
- package/lib/module/api/event/AdEvent.js.map +1 -1
- package/lib/module/api/event/CastEvent.js.map +1 -1
- package/lib/module/api/event/Event.js.map +1 -1
- package/lib/module/api/event/EventDispatcher.js.map +1 -1
- package/lib/module/api/event/EventListener.js.map +1 -1
- package/lib/module/api/event/PlayerEvent.js.map +1 -1
- package/lib/module/api/event/TrackEvent.js.map +1 -1
- package/lib/module/api/event/barrel.js +3 -1
- package/lib/module/api/event/barrel.js.map +1 -1
- package/lib/module/api/media/MediaControlConfiguration.js.map +1 -1
- package/lib/module/api/media/barrel.js.map +1 -1
- package/lib/module/api/pip/PiPConfiguration.js.map +1 -1
- package/lib/module/api/pip/barrel.js.map +1 -1
- package/lib/module/api/player/PlayerEventMap.js.map +1 -1
- package/lib/module/api/player/PlayerVersion.js.map +1 -1
- package/lib/module/api/player/THEOplayer.js.map +1 -1
- package/lib/module/api/player/barrel.js.map +1 -1
- package/lib/module/api/presentation/PresentationMode.js.map +1 -1
- package/lib/module/api/presentation/barrel.js.map +1 -1
- package/lib/module/api/source/SourceDescription.js.map +1 -1
- package/lib/module/api/source/ads/Ads.js.map +1 -1
- package/lib/module/api/source/ads/FreeWheelAdDescription.js.map +1 -1
- package/lib/module/api/source/ads/IMAAdDescription.js.map +1 -1
- package/lib/module/api/source/ads/SpotXAdDescription.js.map +1 -1
- package/lib/module/api/source/ads/THEOplayerAdDescription.js.map +1 -1
- package/lib/module/api/source/ads/barrel.js.map +1 -1
- package/lib/module/api/source/ads/ssai/GoogleDAIConfiguration.js.map +1 -1
- package/lib/module/api/source/ads/ssai/ImagineServerSideAdInsertionConfiguration.js.map +1 -1
- package/lib/module/api/source/ads/ssai/ServerSideAdInsertionConfiguration.js.map +1 -1
- package/lib/module/api/source/ads/ssai/YospaceServerSideAdInsertionConfiguration.js.map +1 -1
- package/lib/module/api/source/ads/ssai/barrel.js.map +1 -1
- package/lib/module/api/source/analytics/AnalyticsDescription.js.map +1 -1
- package/lib/module/api/source/analytics/barrel.js.map +1 -1
- package/lib/module/api/source/barrel.js.map +1 -1
- package/lib/module/api/source/dash/DashPlaybackConfiguration.js.map +1 -1
- package/lib/module/api/source/dash/barrel.js.map +1 -1
- package/lib/module/api/source/drm/DRMConfiguration.js.map +1 -1
- package/lib/module/api/source/drm/barrel.js.map +1 -1
- package/lib/module/api/source/hls/HlsPlaybackConfiguration.js.map +1 -1
- package/lib/module/api/source/hls/barrel.js.map +1 -1
- package/lib/module/api/source/metadata/MetadataDescription.js.map +1 -1
- package/lib/module/api/source/metadata/barrel.js.map +1 -1
- package/lib/module/api/timeranges/TimeRange.js.map +1 -1
- package/lib/module/api/timeranges/barrel.js.map +1 -1
- package/lib/module/api/track/DateRangeCue.js.map +1 -1
- package/lib/module/api/track/MediaTrack.js.map +1 -1
- package/lib/module/api/track/Quality.js.map +1 -1
- package/lib/module/api/track/TextTrack.js.map +1 -1
- package/lib/module/api/track/TextTrackCue.js.map +1 -1
- package/lib/module/api/track/TextTrackStyle.js.map +1 -1
- package/lib/module/api/track/Track.js.map +1 -1
- package/lib/module/api/track/barrel.js.map +1 -1
- package/lib/module/api/ui/UIConfiguration.js.map +1 -1
- package/lib/module/api/ui/barrel.js.map +1 -1
- package/lib/module/api/utils/RetryConfiguration.js.map +1 -1
- package/lib/module/api/utils/TypeUtils.js.map +1 -1
- package/lib/module/api/utils/barrel.js +1 -0
- package/lib/module/api/utils/barrel.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/internal/THEOplayerView.js +4 -1
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.style.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +11 -1
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/internal/adapter/NativePlayerState.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerAdapter.js +1 -3
- package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js +1 -2
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/module/internal/adapter/WebEventForwarder.js +0 -1
- 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/THEOplayerNativeAdsAdapter.js.map +1 -1
- package/lib/module/internal/adapter/ads/THEOplayerNativeGoogleDAI.js.map +1 -1
- package/lib/module/internal/adapter/ads/THEOplayerWebAdsAdapter.js.map +1 -1
- package/lib/module/internal/adapter/ads/THEOplayerWebGoogleDAI.js.map +1 -1
- package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.js.map +1 -1
- package/lib/module/internal/adapter/broadcast/EventBroadcastAdapter.web.js.map +1 -1
- package/lib/module/internal/adapter/broadcast/web/DefaultWebEventDispatcher.js.map +1 -1
- package/lib/module/internal/adapter/cast/THEOplayerNativeAirplay.js.map +1 -1
- package/lib/module/internal/adapter/cast/THEOplayerNativeCastAdapter.js.map +1 -1
- package/lib/module/internal/adapter/cast/THEOplayerNativeChromecast.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.map +1 -1
- package/lib/module/internal/adapter/event/PlayerEvents.js.map +1 -1
- package/lib/module/internal/adapter/event/native/NativeAdEvent.js.map +1 -1
- package/lib/module/internal/adapter/event/native/NativeCastEvent.js.map +1 -1
- package/lib/module/internal/adapter/event/native/NativePlayerEvent.js.map +1 -1
- 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/TrackUtils.js.map +1 -1
- package/lib/module/internal/adapter/web/WebMediaSession.js +9 -5
- package/lib/module/internal/adapter/web/WebMediaSession.js.map +1 -1
- package/lib/module/internal/adapter/web/WebPresentationModeManager.js.map +1 -1
- package/lib/module/internal/cache/MediaCache.js +2 -2
- package/lib/module/internal/cache/MediaCache.js.map +1 -1
- package/lib/module/internal/cache/MediaCache.web.js.map +1 -1
- package/lib/module/internal/cache/NativeCachingTaskAdapter.js.map +1 -1
- package/lib/module/internal/cache/NativeCachingTaskParametersAdapter.js.map +1 -1
- package/lib/module/internal/cache/WebCachingTaskAdapter.js.map +1 -1
- 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/NativeCertificateRequest.js.map +1 -1
- package/lib/module/internal/drm/NativeCertificateResponse.js.map +1 -1
- package/lib/module/internal/drm/NativeContentProtectionEvent.js.map +1 -1
- package/lib/module/internal/drm/NativeLicenseRequest.js.map +1 -1
- package/lib/module/internal/drm/NativeLicenseResponse.js.map +1 -1
- package/lib/module/internal/utils/CommonUtils.js.map +1 -1
- package/lib/module/internal/utils/Dimensions.js.map +1 -1
- package/lib/module/internal/utils/TypeUtils.js.map +1 -1
- package/lib/module/internal/utils/arrayUtil.js.map +1 -1
- package/lib/module/web/platform/browser.d.js.map +1 -1
- package/lib/typescript/api/ads/AdsConfiguration.d.ts +3 -2
- package/lib/typescript/api/ads/AdsConfiguration.d.ts.map +1 -1
- package/lib/typescript/api/ads/GoogleImaConfiguration.d.ts +34 -5
- package/lib/typescript/api/ads/GoogleImaConfiguration.d.ts.map +1 -1
- package/lib/typescript/api/barrel.d.ts +1 -0
- package/lib/typescript/api/barrel.d.ts.map +1 -1
- package/lib/typescript/api/cache/barrel.d.ts +1 -0
- package/lib/typescript/api/cache/barrel.d.ts.map +1 -1
- package/lib/typescript/api/cache/events/CacheEvent.d.ts +2 -2
- package/lib/typescript/api/config/PlayerConfiguration.d.ts +1 -1
- package/lib/typescript/api/event/barrel.d.ts +3 -1
- package/lib/typescript/api/event/barrel.d.ts.map +1 -1
- package/lib/typescript/api/media/MediaControlConfiguration.d.ts +20 -2
- package/lib/typescript/api/media/MediaControlConfiguration.d.ts.map +1 -1
- package/lib/typescript/api/source/SourceDescription.d.ts +1 -1
- package/lib/typescript/api/track/TextTrackCue.d.ts +1 -1
- package/lib/typescript/api/utils/barrel.d.ts +1 -0
- package/lib/typescript/api/utils/barrel.d.ts.map +1 -1
- package/lib/typescript/internal/THEOplayerView.d.ts.map +1 -1
- package/lib/typescript/internal/THEOplayerView.web.d.ts.map +1 -1
- package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts.map +1 -1
- package/lib/typescript/internal/adapter/web/WebMediaSession.d.ts +3 -6
- package/lib/typescript/internal/adapter/web/WebMediaSession.d.ts.map +1 -1
- package/lib/typescript/internal/cache/MediaCache.d.ts +1 -1
- package/lib/typescript/internal/cache/MediaCache.d.ts.map +1 -1
- package/lib/typescript/internal/drm/ContentProtectionRegistry.d.ts +1 -1
- package/lib/typescript/internal/drm/ContentProtectionRegistry.d.ts.map +1 -1
- package/package.json +9 -6
- package/react-native-theoplayer.podspec +19 -26
- package/src/api/ads/AdsConfiguration.ts +3 -2
- package/src/api/ads/GoogleImaConfiguration.ts +37 -5
- package/src/api/barrel.ts +1 -0
- package/src/api/cache/barrel.ts +1 -0
- package/src/api/cache/events/CacheEvent.ts +2 -2
- package/src/api/config/PlayerConfiguration.ts +1 -1
- package/src/api/event/barrel.ts +3 -1
- package/src/api/media/MediaControlConfiguration.ts +22 -2
- package/src/api/source/SourceDescription.ts +4 -4
- package/src/api/track/TextTrackCue.ts +1 -1
- package/src/api/utils/barrel.ts +1 -0
- package/src/internal/THEOplayerView.tsx +4 -1
- package/src/internal/THEOplayerView.web.tsx +14 -1
- package/src/internal/adapter/THEOplayerAdapter.ts +1 -3
- package/src/internal/adapter/THEOplayerWebAdapter.ts +1 -1
- package/src/internal/adapter/web/WebMediaSession.ts +11 -9
- package/src/internal/cache/MediaCache.ts +6 -6
- package/src/internal/drm/ContentProtectionRegistry.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,38 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.1.0/)
|
|
6
6
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [7.1.0] - 24-04-23
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Fixed a build issue on tvOS example app due to the deprecated `prepare` method.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- Added multiple configuration options to `GoogleImaConfiguration` for both iOS and Android. These map to the corresponding IMASettings from the underlying native Google IMA SDKs.
|
|
17
|
+
- Added `skipForwardInterval` and `skipBackwardInterval` properties to `MediaControlConfiguration` for Android and Web, enabling configurable skip intervals for media sessions.
|
|
18
|
+
- Added ios bridging code to make 'forced' property available from native iOS TextTrack API.
|
|
19
|
+
|
|
20
|
+
### Removed
|
|
21
|
+
|
|
22
|
+
- Removed support for the web-based native iOS SDK on the RN iOS Bridge.
|
|
23
|
+
|
|
24
|
+
## [7.0.0] - 24-04-10
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- Fixed an issue where the player had the wrong layout in fullscreen presentationMode, after changing the source.
|
|
29
|
+
- Fixed an issue where not enabling autoplay would explicitly pause the stream, reverting a possible play() request right after setting up the source.
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- Added support for THEOplayer native SDK 7.0.
|
|
34
|
+
- Aligned SDK major version with native player SDKs.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- Raise minimal ios deployment target to 13.4, to match react native 0.73's minimal deployment target
|
|
39
|
+
|
|
8
40
|
## [3.10.3] - 24-03-22
|
|
9
41
|
|
|
10
42
|
### Fixed
|
|
@@ -196,7 +228,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
196
228
|
|
|
197
229
|
### Changed
|
|
198
230
|
|
|
199
|
-
- Added support for THEOplayer 6.0. See [THEOplayer's changelog](https://
|
|
231
|
+
- Added support for THEOplayer 6.0. See [THEOplayer's changelog](https://www.theoplayer.com/docs/theoplayer/changelog/) for details.
|
|
200
232
|
- Bumped minimal version for SideloadedTextTracks connection on iOS to v6.1.1 which contains fix for iOS 17.0.
|
|
201
233
|
|
|
202
234
|
### Added
|
|
@@ -492,7 +524,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
492
524
|
|
|
493
525
|
### Added
|
|
494
526
|
|
|
495
|
-
- Added `onPlayerReady` callback on `THEOplayerView` to pass a `THEOplayer` instance once it is ready for access. More info on the [migration documentation](./doc/
|
|
527
|
+
- Added `onPlayerReady` callback on `THEOplayerView` to pass a `THEOplayer` instance once it is ready for access. More info on the [migration documentation](./doc/migrating-v2.md) page.
|
|
496
528
|
- Added `canplay` event, which is dispatched when the player can start play-out.
|
|
497
529
|
- Added `waiting` event, which is dispatched when the player has stopped play-out because of a temporary lack of data.
|
|
498
530
|
- Added `nativeHandle` property on `THEOplayer` to access the native player instance on web, and view id on mobile.
|
|
@@ -513,8 +545,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
513
545
|
|
|
514
546
|
### Changed
|
|
515
547
|
|
|
516
|
-
- Moved all player properties such as `paused`, `muted` and `volume`, from `THEOplayerView` component to `THEOplayer` instance. More info on the [migration documentation](./doc/
|
|
517
|
-
- Removed `onEventName` callback methods from `THEOplayerView` component in favor of `THEOplayer` event listener's interface. More info on the [migration documentation](./doc/
|
|
548
|
+
- Moved all player properties such as `paused`, `muted` and `volume`, from `THEOplayerView` component to `THEOplayer` instance. More info on the [migration documentation](./doc/migrating-v2.md) page.
|
|
549
|
+
- Removed `onEventName` callback methods from `THEOplayerView` component in favor of `THEOplayer` event listener's interface. More info on the [migration documentation](./doc/migrating-v2.md) page.
|
|
518
550
|
- Changed documentation sample code to reflect API changes.
|
|
519
551
|
- Exposed the `activeQuality` of a `MediaTrack` as a `Quality` instance instead of the quality's `uid`.
|
|
520
552
|
- Set the default container style for web to let the player cover the whole container.
|
package/README.md
CHANGED
|
@@ -32,6 +32,7 @@ It also gives a description of the properties of the `THEOplayerView` component,
|
|
|
32
32
|
a list of features and known limitations.
|
|
33
33
|
|
|
34
34
|
## Prerequisites
|
|
35
|
+
|
|
35
36
|
For each platform, a dependency to the corresponding THEOplayer SDK is included through a dependency manager:
|
|
36
37
|
|
|
37
38
|
- Gradle & Maven for Android
|
|
@@ -39,8 +40,7 @@ For each platform, a dependency to the corresponding THEOplayer SDK is included
|
|
|
39
40
|
- npm for Web
|
|
40
41
|
|
|
41
42
|
In order to use one of these THEOplayer SDKs, it is necessary to obtain a valid THEOplayer license for that specific platform,
|
|
42
|
-
i.e. HTML5, Android, and/or iOS. You can
|
|
43
|
-
[free trial account](https://www.theoplayer.com/free-trial-theoplayer?hsLang=en-us).
|
|
43
|
+
i.e. HTML5, Android, and/or iOS. You can sign up for a THEOplayer SDK license through [our portal](https://portal.theoplayer.com/).
|
|
44
44
|
|
|
45
45
|
If you have no previous experience in React Native, we encourage you to first explore the
|
|
46
46
|
[React Native Documentation](https://reactnative.dev/docs/getting-started),
|
|
@@ -59,7 +59,72 @@ Depending on the platform on which the application is deployed, a different set
|
|
|
59
59
|
If a feature missing, additional help is needed, or you need to extend the package,
|
|
60
60
|
please reach out to us for support.
|
|
61
61
|
|
|
62
|
-
<
|
|
62
|
+
<table>
|
|
63
|
+
<thead>
|
|
64
|
+
<tr>
|
|
65
|
+
<th>Feature</th>
|
|
66
|
+
<th>Android, Android TV, Fire TV</th>
|
|
67
|
+
<th>Web</th>
|
|
68
|
+
<th>iOS, tvOS</th>
|
|
69
|
+
</tr>
|
|
70
|
+
</thead>
|
|
71
|
+
<tbody>
|
|
72
|
+
<tr>
|
|
73
|
+
<td><strong>Streaming</strong></td>
|
|
74
|
+
<td colspan="2">MPEG-DASH (fmp4, CMAF), HLS (TS, CMAF), Progressive MP4, MP3</td>
|
|
75
|
+
<td>HLS (TS, CMAF), Progressive MP4, MP3</td>
|
|
76
|
+
</tr>
|
|
77
|
+
<tr>
|
|
78
|
+
<td><strong>Content Protection</strong></td>
|
|
79
|
+
<td>Widevine</td>
|
|
80
|
+
<td>Widevine, PlayReady, Fairplay</td>
|
|
81
|
+
<td>Fairplay</td>
|
|
82
|
+
</tr>
|
|
83
|
+
<tr>
|
|
84
|
+
<td><strong>DRM Connectors</strong></td>
|
|
85
|
+
<td colspan="3">BuyDRM, EZDRM, Anvato, Titanium, Axinom, Irdeto, VuDRM, Comcast, Verimatrix, Azure, …</td>
|
|
86
|
+
</tr>
|
|
87
|
+
<tr>
|
|
88
|
+
<td><strong>Analytics Connectors</strong></td>
|
|
89
|
+
<td colspan="3">Adobe, Agama, Comscore, Conviva, Mux, Nielsen, Youbora</td>
|
|
90
|
+
</tr>
|
|
91
|
+
<tr>
|
|
92
|
+
<td><strong>Subtitles & Closed Captions</strong></td>
|
|
93
|
+
<td colspan="3">CEA-608/708, SRT, TTML, WebVTT</td>
|
|
94
|
+
</tr>
|
|
95
|
+
<tr>
|
|
96
|
+
<td><strong>Metadata</strong></td>
|
|
97
|
+
<td colspan="3">Event stream, emsg, ID3, EXT-X-DATERANGE, EXT-X-PROGRAM-DATE-TIME</td>
|
|
98
|
+
</tr>
|
|
99
|
+
<tr>
|
|
100
|
+
<td><strong>Advertising Integration</strong></td>
|
|
101
|
+
<td colspan="3">Google IMA, Google DAI</td>
|
|
102
|
+
</tr>
|
|
103
|
+
<tr>
|
|
104
|
+
<td><strong>Cast Integration</strong></td>
|
|
105
|
+
<td>Chromecast</td>
|
|
106
|
+
<td colspan="2">Chromecast, Airplay</td>
|
|
107
|
+
</tr>
|
|
108
|
+
<tr>
|
|
109
|
+
<td><strong>Presentation Mode</strong></td>
|
|
110
|
+
<td colspan="3">Inline, Picture-in-Picture, Fullscreen</td>
|
|
111
|
+
</tr>
|
|
112
|
+
<tr>
|
|
113
|
+
<td><strong>Audio Control Management</strong></td>
|
|
114
|
+
<td>Audio focus & Audio-Becoming-Noisy mgmt</td>
|
|
115
|
+
<td colspan="2">(Audio control management by platform)</td>
|
|
116
|
+
</tr>
|
|
117
|
+
<tr>
|
|
118
|
+
<td><strong>Advanced APIs</strong></td>
|
|
119
|
+
<td colspan="2">Background playback,<br/>Media Session,<br/>Media Cache (offline playback)</td>
|
|
120
|
+
<td>Background playback,<br/>NowPlaying,<br/>Media Cache (iOS only)</td>
|
|
121
|
+
</tr>
|
|
122
|
+
<tr>
|
|
123
|
+
<td><strong>User Interface</strong><br/><code>@theoplayer/react-native-ui</code></td>
|
|
124
|
+
<td colspan="3">Basic playback, media & text track selection, progress bar, live & vod, preview thumbnails, customisable & extensible</td>
|
|
125
|
+
</tr>
|
|
126
|
+
</tbody>
|
|
127
|
+
</table>
|
|
63
128
|
|
|
64
129
|
## Available connectors
|
|
65
130
|
|
|
@@ -67,7 +132,7 @@ The `react-native-theoplayer` package can be combined with any number of connect
|
|
|
67
132
|
functionality. Currently, the following connectors are available:
|
|
68
133
|
|
|
69
134
|
| Package name | Purpose | Registry |
|
|
70
|
-
|
|
135
|
+
| ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
71
136
|
| [`@theoplayer/react-native-analytics-adobe`](https://github.com/THEOplayer/react-native-theoplayer-analytics) | Adobe analytics connector | [](https://www.npmjs.com/package/@theoplayer/react-native-analytics-adobe) |
|
|
72
137
|
| [`@theoplayer/react-native-analytics-agama`](https://github.com/THEOplayer/react-native-theoplayer-analytics) | Agama analytics connector | [](https://www.npmjs.com/package/@theoplayer/react-native-analytics-agama) |
|
|
73
138
|
| [`@theoplayer/react-native-analytics-comscore`](https://github.com/THEOplayer/react-native-theoplayer-analytics) | Comscore analytics connector | [](https://www.npmjs.com/package/@theoplayer/react-native-analytics-comscore) |
|
|
@@ -79,31 +144,38 @@ functionality. Currently, the following connectors are available:
|
|
|
79
144
|
| [`@theoplayer/react-native-ui`](https://github.com/THEOplayer/react-native-theoplayer-ui) | React Native user interface | [](https://www.npmjs.com/package/@theoplayer/react-native-ui) |
|
|
80
145
|
| [`@theoplayer/react-native-connector-template`](https://github.com/THEOplayer/react-native-theoplayer-connector-template) | A template for<br/>`react-native-theoplayer` connectors. | [](https://www.npmjs.com/package/@theoplayer/react-native-connector-template) |
|
|
81
146
|
|
|
82
|
-
##
|
|
147
|
+
## Creating your first app
|
|
83
148
|
|
|
84
149
|
This section starts with creating a minimal demo app that integrates the `react-native-theoplayer` package,
|
|
85
150
|
followed by an overview of the available properties and functionality of the THEOplayerView component.
|
|
86
151
|
An example application including a basic user interface and demo sources is included in the
|
|
87
|
-
[git repository](https://github.com/THEOplayer/react-native-theoplayer/tree/
|
|
88
|
-
and discussed in the next section.
|
|
152
|
+
[git repository](https://github.com/THEOplayer/react-native-theoplayer/tree/develop/example),
|
|
153
|
+
and discussed in the next section.
|
|
89
154
|
|
|
90
155
|
- [Creating a minimal demo app](./doc/creating-minimal-app.md)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
156
|
+
- [Getting started on Android](./doc/creating-minimal-app.md#getting-started-on-android)
|
|
157
|
+
- [Getting started on iOS](./doc/creating-minimal-app.md#getting-started-on-ios-and-tvos)
|
|
158
|
+
- [Getting started on Web](./doc/creating-minimal-app.md#getting-started-on-web)
|
|
94
159
|
- [The THEOplayerView component](./doc/theoplayerview-component.md)
|
|
95
160
|
- [The example application](./doc/example-app.md)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
161
|
+
|
|
162
|
+
## Knowledge Base
|
|
163
|
+
|
|
164
|
+
This section gives an overview of features, limitations and known issues:
|
|
165
|
+
|
|
166
|
+
- [Adaptive Bitrate (ABR)](./doc/abr.md)
|
|
167
|
+
- [Advertisements](./doc/ads.md)
|
|
168
|
+
- [Audio Control Management](./doc/audio-control.md)
|
|
169
|
+
- [Background playback and notifications](./doc/background.md)
|
|
170
|
+
- [Casting with Chromecast and Airplay](./doc/cast.md)
|
|
171
|
+
- [Digital Rights Management (DRM)](./doc/drm.md)
|
|
172
|
+
- [Fullscreen presentation](./doc/fullscreen.md)
|
|
173
|
+
- [Media Caching](./doc/media-caching.md)
|
|
174
|
+
- [Picture-in-Picture (PiP)](./doc/pip.md)
|
|
175
|
+
- [Subtitles, Closed Captions and Metadata tracks](./doc/texttracks.md)
|
|
176
|
+
- [Limitations and known issues](./doc/limitations.md)
|
|
177
|
+
|
|
178
|
+
## API Reference
|
|
179
|
+
|
|
180
|
+
See the [API Reference](https://theoplayer.github.io/react-native-theoplayer/api/) for detailed documentation
|
|
181
|
+
about all available components and functions.
|
package/android/build.gradle
CHANGED
|
@@ -112,21 +112,13 @@ dependencies {
|
|
|
112
112
|
implementation "androidx.appcompat:appcompat:${safeExtGet('appcompatVersion', '1.6.1')}"
|
|
113
113
|
implementation "androidx.core:core-ktx:${safeExtGet('corektxVersion', '1.10.1')}"
|
|
114
114
|
|
|
115
|
-
// The minimum supported THEOplayer version is
|
|
116
|
-
def theoplayer_sdk_version = safeExtGet('THEOplayer_sdk', '[
|
|
115
|
+
// The minimum supported THEOplayer version is 7.0.0
|
|
116
|
+
def theoplayer_sdk_version = safeExtGet('THEOplayer_sdk', '[7.0.0, 8.0.0)')
|
|
117
117
|
|
|
118
118
|
println("Using THEOplayer (${versionString(theoplayer_sdk_version)})")
|
|
119
119
|
implementation "com.theoplayer.theoplayer-sdk-android:core:${theoplayer_sdk_version}"
|
|
120
|
-
|
|
121
120
|
implementation "com.theoplayer.theoplayer-sdk-android:ads-wrapper:6.10.0"
|
|
122
|
-
|
|
123
|
-
if (enabledMediaSession) {
|
|
124
|
-
println("Enable THEOplayer MediaSession extension (${versionString(theoplayer_sdk_version)})")
|
|
125
|
-
implementation "com.theoplayer.android-connector:mediasession:${theoplayer_sdk_version}"
|
|
126
|
-
} else {
|
|
127
|
-
println('Disable THEOplayer MediaSession extension.')
|
|
128
|
-
compileOnly "com.theoplayer.android-connector:mediasession:${theoplayer_sdk_version}"
|
|
129
|
-
}
|
|
121
|
+
implementation "com.theoplayer.android-connector:mediasession:${theoplayer_sdk_version}"
|
|
130
122
|
|
|
131
123
|
if (enabledGoogleIMA) {
|
|
132
124
|
println('Enable THEOplayer IMA extension.')
|
|
@@ -4,14 +4,16 @@ import android.text.TextUtils
|
|
|
4
4
|
import com.facebook.react.bridge.ReadableMap
|
|
5
5
|
import com.google.ads.interactivemedia.v3.api.AdsRenderingSettings
|
|
6
6
|
import com.google.ads.interactivemedia.v3.api.ImaSdkFactory
|
|
7
|
+
import com.google.ads.interactivemedia.v3.api.ImaSdkSettings
|
|
7
8
|
import com.theoplayer.android.api.THEOplayerConfig
|
|
8
|
-
import com.theoplayer.android.api.
|
|
9
|
-
import com.theoplayer.android.api.ads.AdPreloadType
|
|
9
|
+
import com.theoplayer.android.api.THEOplayerGlobal
|
|
10
10
|
import com.theoplayer.android.api.cast.CastStrategy
|
|
11
11
|
import com.theoplayer.android.api.cast.CastConfiguration
|
|
12
12
|
import com.theoplayer.android.api.pip.PipConfiguration
|
|
13
13
|
import com.theoplayer.android.api.player.NetworkConfiguration
|
|
14
14
|
import com.theoplayer.android.api.ui.UIConfiguration
|
|
15
|
+
import com.theoplayer.media.MediaSessionConfig
|
|
16
|
+
import com.theoplayer.media.MediaSessionConfigAdapter
|
|
15
17
|
|
|
16
18
|
private const val PROP_LICENSE = "license"
|
|
17
19
|
private const val PROP_LICENSE_URL = "licenseUrl"
|
|
@@ -27,7 +29,15 @@ private const val PROP_RETRY_MIN_BACKOFF = "minimumBackoff"
|
|
|
27
29
|
private const val PROP_RETRY_MAX_BACKOFF = "maximumBackoff"
|
|
28
30
|
private const val PROP_CAST_CONFIGURATION = "cast"
|
|
29
31
|
private const val PROP_ADS_CONFIGURATION = "ads"
|
|
32
|
+
private const val PROP_IMA_CONFIGURATION = "ima"
|
|
30
33
|
private const val PROP_UI_CONFIGURATION = "ui"
|
|
34
|
+
private const val PROP_MEDIA_CONTROL = "mediaControl"
|
|
35
|
+
private const val PROP_PPID = "ppid"
|
|
36
|
+
private const val PROP_MAX_REDIRECTS = "maxRedirects"
|
|
37
|
+
private const val PROP_FEATURE_FLAGS = "featureFlags"
|
|
38
|
+
private const val PROP_AUTOPLAY_AD_BREAKS = "autoPlayAdBreaks"
|
|
39
|
+
private const val PROP_SESSION_ID = "sessionID"
|
|
40
|
+
private const val PROP_ENABLE_DEBUG_MODE = "enableDebugMode"
|
|
31
41
|
|
|
32
42
|
class PlayerConfigAdapter(private val configProps: ReadableMap?) {
|
|
33
43
|
|
|
@@ -86,24 +96,72 @@ class PlayerConfigAdapter(private val configProps: ReadableMap?) {
|
|
|
86
96
|
}
|
|
87
97
|
|
|
88
98
|
/**
|
|
89
|
-
* Get
|
|
90
|
-
*
|
|
91
|
-
*
|
|
99
|
+
* Get ImaSdkSettings object.
|
|
100
|
+
*
|
|
101
|
+
* @see <a href="https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/ImaSdkSettings">IMA SDK for Android</a>.
|
|
92
102
|
*/
|
|
93
|
-
fun
|
|
94
|
-
return
|
|
103
|
+
fun imaSdkSettings(): ImaSdkSettings{
|
|
104
|
+
return ImaSdkFactory.getInstance().createImaSdkSettings().apply {
|
|
105
|
+
configProps?.getMap(PROP_ADS_CONFIGURATION)?.getMap(PROP_IMA_CONFIGURATION)?.run {
|
|
106
|
+
// Specifies whether VMAP and ad rules ad breaks are automatically played.
|
|
107
|
+
if (hasKey(PROP_AUTOPLAY_AD_BREAKS)) {
|
|
108
|
+
autoPlayAdBreaks = getBoolean(PROP_AUTOPLAY_AD_BREAKS)
|
|
109
|
+
}
|
|
110
|
+
// Feature flags and their states. Used to control experimental features.
|
|
111
|
+
if (hasKey(PROP_FEATURE_FLAGS)) {
|
|
112
|
+
val convertedMap: MutableMap<String, String> = mutableMapOf()
|
|
113
|
+
getMap(PROP_FEATURE_FLAGS)?.toHashMap()?.forEach { (key, value) ->
|
|
114
|
+
convertedMap[key] = value as String
|
|
115
|
+
}
|
|
116
|
+
featureFlags = convertedMap
|
|
117
|
+
}
|
|
118
|
+
// The current ISO 639-1 language code, get it from the UI config.
|
|
119
|
+
uiConfig().language?.let {
|
|
120
|
+
language = it
|
|
121
|
+
}
|
|
122
|
+
// The maximum number of VAST redirects.
|
|
123
|
+
if (hasKey(PROP_MAX_REDIRECTS)) {
|
|
124
|
+
maxRedirects = getInt(PROP_MAX_REDIRECTS)
|
|
125
|
+
}
|
|
126
|
+
// The partner provided player type.
|
|
127
|
+
playerType = "THEOplayer"
|
|
128
|
+
// The partner provided player version.
|
|
129
|
+
playerVersion = THEOplayerGlobal.getVersion()
|
|
130
|
+
// The Publisher Provided Identification (PPID) sent with ads request.
|
|
131
|
+
if (hasKey(PROP_PPID)) {
|
|
132
|
+
ppid = getString(PROP_PPID) ?: ""
|
|
133
|
+
}
|
|
134
|
+
// The session ID to identify a single user session. This should be a UUID. It
|
|
135
|
+
// is used exclusively for frequency capping across the user session.
|
|
136
|
+
if (hasKey(PROP_SESSION_ID)) {
|
|
137
|
+
sessionId = getString(PROP_PPID) ?: ""
|
|
138
|
+
}
|
|
139
|
+
// Toggles debug mode which will output detailed log information to the console.
|
|
140
|
+
if (hasKey(PROP_ENABLE_DEBUG_MODE)) {
|
|
141
|
+
isDebugMode = getBoolean(PROP_ENABLE_DEBUG_MODE)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Create a AdsRenderingSettings object.
|
|
149
|
+
*
|
|
150
|
+
* @see <a href="https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/AdsRenderingSettings">IMA SDK for Android</a>.
|
|
151
|
+
*/
|
|
152
|
+
fun adsRenderSettings(): AdsRenderingSettings {
|
|
153
|
+
return ImaSdkFactory.getInstance().createAdsRenderingSettings().apply {
|
|
95
154
|
configProps?.getMap(PROP_ADS_CONFIGURATION)?.run {
|
|
155
|
+
if (hasKey(PROP_UI_ENABLED) && !getBoolean(PROP_UI_ENABLED)) {
|
|
156
|
+
setUiElements(emptySet())
|
|
157
|
+
disableUi = true
|
|
158
|
+
}
|
|
96
159
|
if (hasKey(PROP_PRELOAD)) {
|
|
97
160
|
val preloadTypeString = getString(PROP_PRELOAD)
|
|
98
|
-
|
|
99
|
-
preload(AdPreloadType.from(preloadTypeString))
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (hasKey(PROP_UI_ENABLED)) {
|
|
103
|
-
showCountdown(getBoolean(PROP_UI_ENABLED))
|
|
161
|
+
enablePreloading = preloadTypeString !== "none"
|
|
104
162
|
}
|
|
105
163
|
}
|
|
106
|
-
}
|
|
164
|
+
}
|
|
107
165
|
}
|
|
108
166
|
|
|
109
167
|
/**
|
|
@@ -121,20 +179,6 @@ class PlayerConfigAdapter(private val configProps: ReadableMap?) {
|
|
|
121
179
|
}.build()
|
|
122
180
|
}
|
|
123
181
|
|
|
124
|
-
/**
|
|
125
|
-
* Create a AdsRenderingSettings object.
|
|
126
|
-
*/
|
|
127
|
-
fun adsRenderSettings(): AdsRenderingSettings {
|
|
128
|
-
return ImaSdkFactory.getInstance().createAdsRenderingSettings().apply {
|
|
129
|
-
configProps?.getMap(PROP_ADS_CONFIGURATION)?.run {
|
|
130
|
-
if (hasKey(PROP_UI_ENABLED) && !getBoolean(PROP_UI_ENABLED)) {
|
|
131
|
-
setUiElements(emptySet())
|
|
132
|
-
disableUi = true
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
182
|
/**
|
|
139
183
|
* Get CastConfiguration object; these properties apply:
|
|
140
184
|
* - strategy: The join strategy of the player.
|
|
@@ -157,4 +201,14 @@ class PlayerConfigAdapter(private val configProps: ReadableMap?) {
|
|
|
157
201
|
else -> null
|
|
158
202
|
}
|
|
159
203
|
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Get MediaSession connector configuration; these properties apply:
|
|
207
|
+
* - mediaSessionEnabled: whether or not the media session should be enabled.
|
|
208
|
+
* - skipForwardInterval: the amount of seconds the player will skip forward.
|
|
209
|
+
* - skipBackwardInterval: the amount of seconds the player will skip backward.
|
|
210
|
+
*/
|
|
211
|
+
fun mediaSessionConfig(): MediaSessionConfig {
|
|
212
|
+
return MediaSessionConfigAdapter.fromProps(configProps?.getMap(PROP_MEDIA_CONTROL))
|
|
213
|
+
}
|
|
160
214
|
}
|
|
@@ -28,6 +28,7 @@ import com.theoplayer.audio.AudioBecomingNoisyManager
|
|
|
28
28
|
import com.theoplayer.audio.AudioFocusManager
|
|
29
29
|
import com.theoplayer.audio.BackgroundAudioConfig
|
|
30
30
|
import com.theoplayer.media.MediaPlaybackService
|
|
31
|
+
import com.theoplayer.media.MediaSessionConfig
|
|
31
32
|
import java.util.concurrent.atomic.AtomicBoolean
|
|
32
33
|
|
|
33
34
|
private const val TAG = "ReactTHEOplayerContext"
|
|
@@ -42,7 +43,8 @@ private const val ALLOWED_PLAYBACK_ACTIONS = (
|
|
|
42
43
|
PlaybackStateCompat.ACTION_SET_PLAYBACK_SPEED)
|
|
43
44
|
|
|
44
45
|
class ReactTHEOplayerContext private constructor(
|
|
45
|
-
private val reactContext: ThemedReactContext
|
|
46
|
+
private val reactContext: ThemedReactContext,
|
|
47
|
+
private val configAdapter: PlayerConfigAdapter
|
|
46
48
|
) {
|
|
47
49
|
private val mainHandler = Handler(Looper.getMainLooper())
|
|
48
50
|
private var isBound = AtomicBoolean()
|
|
@@ -60,6 +62,12 @@ class ReactTHEOplayerContext private constructor(
|
|
|
60
62
|
field = value
|
|
61
63
|
}
|
|
62
64
|
|
|
65
|
+
var mediaSessionConfig: MediaSessionConfig = configAdapter.mediaSessionConfig()
|
|
66
|
+
set(value) {
|
|
67
|
+
applyMediaSessionConfig(mediaSessionConnector, value)
|
|
68
|
+
field = value
|
|
69
|
+
}
|
|
70
|
+
|
|
63
71
|
lateinit var playerView: THEOplayerView
|
|
64
72
|
|
|
65
73
|
val player: Player
|
|
@@ -85,8 +93,8 @@ class ReactTHEOplayerContext private constructor(
|
|
|
85
93
|
reactContext: ThemedReactContext,
|
|
86
94
|
configAdapter: PlayerConfigAdapter
|
|
87
95
|
): ReactTHEOplayerContext {
|
|
88
|
-
return ReactTHEOplayerContext(reactContext).apply {
|
|
89
|
-
initializePlayerView(
|
|
96
|
+
return ReactTHEOplayerContext(reactContext, configAdapter).apply {
|
|
97
|
+
initializePlayerView()
|
|
90
98
|
}
|
|
91
99
|
}
|
|
92
100
|
}
|
|
@@ -96,9 +104,9 @@ class ReactTHEOplayerContext private constructor(
|
|
|
96
104
|
binder = service as MediaPlaybackService.MediaPlaybackBinder
|
|
97
105
|
|
|
98
106
|
// Get media session connector from service
|
|
99
|
-
mediaSessionConnector = binder?.mediaSessionConnector
|
|
100
|
-
|
|
101
|
-
|
|
107
|
+
mediaSessionConnector = binder?.mediaSessionConnector?.also {
|
|
108
|
+
applyMediaSessionConfig(it, mediaSessionConfig)
|
|
109
|
+
}
|
|
102
110
|
|
|
103
111
|
// Pass player context
|
|
104
112
|
binder?.setPlayerContext(this@ReactTHEOplayerContext)
|
|
@@ -184,7 +192,7 @@ class ReactTHEOplayerContext private constructor(
|
|
|
184
192
|
binder = null
|
|
185
193
|
}
|
|
186
194
|
|
|
187
|
-
private fun initializePlayerView(
|
|
195
|
+
private fun initializePlayerView() {
|
|
188
196
|
playerView = object : THEOplayerView(reactContext.currentActivity!!, configAdapter.playerConfig()) {
|
|
189
197
|
private fun measureAndLayout() {
|
|
190
198
|
measure(
|
|
@@ -205,7 +213,7 @@ class ReactTHEOplayerContext private constructor(
|
|
|
205
213
|
// By default, the screen should remain on.
|
|
206
214
|
playerView.keepScreenOn = true
|
|
207
215
|
|
|
208
|
-
addIntegrations(
|
|
216
|
+
addIntegrations()
|
|
209
217
|
addListeners()
|
|
210
218
|
|
|
211
219
|
audioFocusManager = AudioFocusManager(reactContext, player)
|
|
@@ -229,21 +237,34 @@ class ReactTHEOplayerContext private constructor(
|
|
|
229
237
|
mediaSession.setMediaButtonReceiver(null)
|
|
230
238
|
|
|
231
239
|
// Create a MediaSessionConnector and attach the THEOplayer instance.
|
|
232
|
-
mediaSessionConnector = MediaSessionConnector(mediaSession).
|
|
240
|
+
mediaSessionConnector = MediaSessionConnector(mediaSession).also {
|
|
241
|
+
applyMediaSessionConfig(it, mediaSessionConfig)
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
private fun applyMediaSessionConfig(connector: MediaSessionConnector?, config: MediaSessionConfig) {
|
|
246
|
+
connector?.apply {
|
|
233
247
|
debug = BuildConfig.LOG_MEDIASESSION_EVENTS
|
|
248
|
+
|
|
234
249
|
player = this@ReactTHEOplayerContext.player
|
|
235
250
|
|
|
236
251
|
// Set mediaSession active and ready to receive media button events, but not if the player
|
|
237
252
|
// is backgrounded.
|
|
238
|
-
setActive(!isHostPaused)
|
|
253
|
+
setActive(!isHostPaused && BuildConfig.EXTENSION_MEDIASESSION && config.mediaSessionEnabled)
|
|
254
|
+
|
|
255
|
+
skipForwardInterval = config.skipForwardInterval
|
|
256
|
+
skipBackwardsInterval = config.skipBackwardInterval
|
|
257
|
+
|
|
258
|
+
// Pass metadata from source description
|
|
259
|
+
setMediaSessionMetadata(player?.source)
|
|
239
260
|
}
|
|
240
261
|
}
|
|
241
262
|
|
|
242
|
-
private fun addIntegrations(
|
|
263
|
+
private fun addIntegrations() {
|
|
243
264
|
try {
|
|
244
265
|
if (BuildConfig.EXTENSION_GOOGLE_IMA) {
|
|
245
266
|
imaIntegration = GoogleImaIntegrationFactory.createGoogleImaIntegration(
|
|
246
|
-
playerView, configAdapter.
|
|
267
|
+
playerView, configAdapter.imaSdkSettings()
|
|
247
268
|
).apply {
|
|
248
269
|
setAdsRenderingSettings(configAdapter.adsRenderSettings())
|
|
249
270
|
}.also {
|
|
@@ -256,7 +277,7 @@ class ReactTHEOplayerContext private constructor(
|
|
|
256
277
|
try {
|
|
257
278
|
if (BuildConfig.EXTENSION_GOOGLE_DAI) {
|
|
258
279
|
daiIntegration = GoogleDaiIntegrationFactory.createGoogleDaiIntegration(
|
|
259
|
-
playerView, configAdapter.
|
|
280
|
+
playerView, configAdapter.imaSdkSettings()
|
|
260
281
|
).apply {
|
|
261
282
|
setAdsRenderingSettings(configAdapter.adsRenderSettings())
|
|
262
283
|
}.also {
|
|
@@ -357,7 +378,7 @@ class ReactTHEOplayerContext private constructor(
|
|
|
357
378
|
*/
|
|
358
379
|
fun onHostResume() {
|
|
359
380
|
isHostPaused = false
|
|
360
|
-
mediaSessionConnector?.setActive(
|
|
381
|
+
mediaSessionConnector?.setActive(BuildConfig.EXTENSION_MEDIASESSION)
|
|
361
382
|
playerView.onResume()
|
|
362
383
|
if (!player.isPaused) {
|
|
363
384
|
audioFocusManager?.retrieveAudioFocus()
|
|
@@ -173,7 +173,7 @@ class MediaPlaybackService : MediaBrowserServiceCompat() {
|
|
|
173
173
|
debug = BuildConfig.LOG_MEDIASESSION_EVENTS
|
|
174
174
|
|
|
175
175
|
// Set mediaSession active
|
|
176
|
-
setActive(
|
|
176
|
+
setActive(BuildConfig.EXTENSION_MEDIASESSION)
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
// Set the MediaBrowserServiceCompat's media session.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
package com.theoplayer.media
|
|
2
|
+
|
|
3
|
+
data class MediaSessionConfig (
|
|
4
|
+
/**
|
|
5
|
+
* Whether or not the media session should be enabled.
|
|
6
|
+
*/
|
|
7
|
+
var mediaSessionEnabled: Boolean = true,
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The amount of seconds the player will skip forward.
|
|
11
|
+
*/
|
|
12
|
+
var skipForwardInterval: Double = 5.0,
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The amount of seconds the player will skip backward.
|
|
16
|
+
*/
|
|
17
|
+
var skipBackwardInterval: Double = 5.0,
|
|
18
|
+
)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package com.theoplayer.media
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
object MediaSessionConfigAdapter {
|
|
6
|
+
private const val PROP_ENABLED = "mediaSessionEnabled"
|
|
7
|
+
private const val PROP_SKIP_FORWARD_INTERVAL = "skipForwardInterval"
|
|
8
|
+
private const val PROP_SKIP_BACKWARD_INTERVAL = "skipBackwardInterval"
|
|
9
|
+
|
|
10
|
+
fun fromProps(props: ReadableMap?): MediaSessionConfig {
|
|
11
|
+
return MediaSessionConfig().apply {
|
|
12
|
+
if (props?.hasKey(PROP_ENABLED) == true) {
|
|
13
|
+
mediaSessionEnabled = props.getBoolean(PROP_ENABLED)
|
|
14
|
+
}
|
|
15
|
+
if (props?.hasKey(PROP_SKIP_FORWARD_INTERVAL) == true) {
|
|
16
|
+
skipForwardInterval = props.getDouble(PROP_SKIP_FORWARD_INTERVAL)
|
|
17
|
+
}
|
|
18
|
+
if (props?.hasKey(PROP_SKIP_BACKWARD_INTERVAL) == true) {
|
|
19
|
+
skipBackwardInterval = props.getDouble(PROP_SKIP_BACKWARD_INTERVAL)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -134,7 +134,7 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
|
|
|
134
134
|
let playbackRateValue = playbackRate.doubleValue
|
|
135
135
|
if player.playbackRate != playbackRateValue {
|
|
136
136
|
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Setting playbackRate on TheoPlayer to \(playbackRateValue)") }
|
|
137
|
-
player.
|
|
137
|
+
player.playbackRate = playbackRateValue
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
}
|
|
@@ -271,7 +271,7 @@ class THEOplayerRCTPlayerAPI: NSObject, RCTBridgeModule {
|
|
|
271
271
|
let preloadType = THEOplayerRCTTypeUtils.preloadTypeFromString(type)
|
|
272
272
|
if player.preload != preloadType {
|
|
273
273
|
if DEBUG_PLAYER_API { PrintUtils.printLog(logText: "[NATIVE] Changing TheoPlayer preload type to \(type)") }
|
|
274
|
-
player.
|
|
274
|
+
player.preload = preloadType
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
}
|
|
@@ -352,17 +352,7 @@ class THEOplayerRCTSourceDescriptionBuilder {
|
|
|
352
352
|
static func buildContentProtection(_ contentProtectionData: [String:Any]) -> MultiplatformDRMConfiguration? {
|
|
353
353
|
do {
|
|
354
354
|
let data = try JSONSerialization.data(withJSONObject: contentProtectionData)
|
|
355
|
-
|
|
356
|
-
switch integration {
|
|
357
|
-
case DRM_INTEGRATION_ID_EZDRM: return try JSONDecoder().decode(EzdrmDRMConfiguration.self, from: data)
|
|
358
|
-
case DRM_INTEGRATION_ID_KEYOS: return try JSONDecoder().decode(KeyOSDRMConfiguration.self, from: data)
|
|
359
|
-
case DRM_INTEGRATION_ID_VERIMATRIX: return try JSONDecoder().decode(VerimatrixDRMConfiguration.self, from: data)
|
|
360
|
-
default: return try JSONDecoder().decode(MultiplatformDRMConfiguration.self, from: data)
|
|
361
|
-
}
|
|
362
|
-
} else {
|
|
363
|
-
PrintUtils.printLog(logText: "[NATIVE] integration type not specified... trying default drm integration")
|
|
364
|
-
return try JSONDecoder().decode(MultiplatformDRMConfiguration.self, from: data)
|
|
365
|
-
}
|
|
355
|
+
return try JSONDecoder().decode(MultiplatformDRMConfiguration.self, from: data)
|
|
366
356
|
} catch {
|
|
367
357
|
PrintUtils.printLog(logText: "[NATIVE] unsupported contentProtection data format")
|
|
368
358
|
}
|
|
@@ -26,6 +26,7 @@ let PROP_CUES: String = "cues"
|
|
|
26
26
|
let PROP_CUE_CONTENT: String = "content"
|
|
27
27
|
let PROP_CUE_CUSTOM_ATTRIBUTES: String = "customAttributes"
|
|
28
28
|
let PROP_SRC: String = "src"
|
|
29
|
+
let PROP_FORCED: String = "forced"
|
|
29
30
|
let PROP_START_DATE: String = "startDate"
|
|
30
31
|
let PROP_END_DATE: String = "endDate"
|
|
31
32
|
let PROP_ATTRIBUTE_CLASS: String = "class"
|
|
@@ -73,6 +74,7 @@ class THEOplayerRCTTrackMetadataAggregator {
|
|
|
73
74
|
entry[PROP_LABEL] = textTrack.label
|
|
74
75
|
entry[PROP_TYPE] = textTrack.type
|
|
75
76
|
entry[PROP_SRC] = textTrack.src
|
|
77
|
+
entry[PROP_FORCED] = textTrack.forced
|
|
76
78
|
// process cues when texttrack contains them
|
|
77
79
|
if !textTrack.cues.isEmpty {
|
|
78
80
|
var cueList: [[String:Any]] = []
|