react-native-theoplayer 1.7.2 → 1.8.1
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/README.md +2 -0
- package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +115 -0
- package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +648 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +23 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +447 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.kt +117 -0
- package/android/src/main/java/com/theoplayer/{TimeUpdateRate.java → TimeUpdateRate.kt} +2 -2
- package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +161 -0
- package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.kt +90 -0
- package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +140 -0
- package/android/src/main/java/com/theoplayer/cast/CastEventAdapter.kt +81 -0
- package/android/src/main/java/com/theoplayer/cast/CastModule.kt +75 -0
- package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +2 -2
- package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +1 -2
- package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegration.kt +1 -2
- package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegrationFactory.kt +3 -5
- package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +402 -0
- package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.kt +6 -0
- package/android/src/main/java/com/theoplayer/track/MediaTrackType.kt +6 -0
- package/android/src/main/java/com/theoplayer/track/QualityListAdapter.kt +43 -0
- package/android/src/main/java/com/theoplayer/track/QualityListFilter.kt +28 -0
- package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.kt +10 -0
- package/android/src/main/java/com/theoplayer/track/TrackEventType.kt +7 -0
- package/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +219 -0
- package/android/src/main/java/com/theoplayer/util/ViewResolver.kt +19 -0
- package/ios/THEOplayerRCTBridge.m +52 -1
- package/ios/THEOplayerRCTDebug.swift +3 -0
- package/ios/{THEOplayerRCTViewMainEventHandler.swift → THEOplayerRCTMainEventHandler.swift} +2 -2
- package/ios/{THEOplayerRCTViewMediaTrackEventHandler.swift → THEOplayerRCTMediaTrackEventHandler.swift} +8 -8
- package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +95 -118
- package/ios/{THEOplayerRCTViewTextTrackEventHandler.swift → THEOplayerRCTTextTrackEventHandler.swift} +7 -7
- package/ios/{THEOplayerRCTMetadataAggregator.swift → THEOplayerRCTTrackMetadataAggregator.swift} +12 -12
- package/ios/THEOplayerRCTView.swift +51 -71
- package/ios/{THEOplayerRCTAdAggregator.swift → ads/THEOplayerRCTAdAggregator.swift} +13 -7
- package/ios/ads/THEOplayerRCTAdsAPI+DAI.swift +108 -0
- package/ios/{THEOplayerRCTAdsAPI.swift → ads/THEOplayerRCTAdsAPI.swift} +4 -95
- package/ios/{THEOplayerRCTViewAdEventHandler.swift → ads/THEOplayerRCTAdsEventHandler.swift} +3 -3
- package/ios/ads/THEOplayerRCTSourceDescriptionBuilder+Ads.swift +130 -0
- package/ios/ads/THEOplayerRCTView+Ads.swift +15 -0
- package/ios/ads/THEOplayerRCTView+AdsConfig.swift +82 -0
- package/ios/casting/THEOplayerRCTCastAPI+Airplay.swift +97 -0
- package/ios/casting/THEOplayerRCTCastAPI+Chromecast.swift +132 -0
- package/ios/casting/THEOplayerRCTCastAPI.swift +53 -0
- package/ios/casting/THEOplayerRCTCastEventHandler.swift +124 -0
- package/ios/casting/THEOplayerRCTView+CastConfig.swift +47 -0
- package/ios/casting/THEOplayerRCTView+Casting.swift +17 -0
- package/ios/{THEOplayerRCTContentProtectionAPI.swift → contentprotection/THEOplayerRCTContentProtectionAPI.swift} +0 -0
- package/ios/{THEOplayerRCTContentProtectionAggregator.swift → contentprotection/THEOplayerRCTContentProtectionAggregator.swift} +0 -0
- package/ios/{THEOplayerRCTProxyContentProtectionIntegration.swift → contentprotection/THEOplayerRCTProxyContentProtectionIntegration.swift} +0 -0
- package/ios/{THEOplayerRCTProxyContentProtectionIntegrationFactory.swift → contentprotection/THEOplayerRCTProxyContentProtectionIntegrationFactory.swift} +0 -0
- package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +1 -1
- package/ios/custom/Frameworks/tvos/put_custom_tvos_xcframework_here.txt +2 -0
- package/ios/custom/react-native-theoplayer_custom.podspec +46 -0
- package/lib/commonjs/api/THEOplayerView.js.map +1 -1
- package/lib/commonjs/api/barrel.js +21 -8
- package/lib/commonjs/api/barrel.js.map +1 -1
- package/lib/commonjs/api/cast/Airplay.js +6 -0
- package/lib/commonjs/api/cast/Airplay.js.map +1 -0
- package/lib/commonjs/api/cast/CastAPI.js +6 -0
- package/lib/commonjs/api/cast/CastAPI.js.map +1 -0
- package/lib/commonjs/api/cast/CastConfiguration.js +2 -0
- package/lib/commonjs/api/cast/CastConfiguration.js.map +1 -0
- package/lib/commonjs/api/cast/CastState.js +2 -0
- package/lib/commonjs/api/cast/CastState.js.map +1 -0
- package/lib/commonjs/api/cast/Chromecast.js +6 -0
- package/lib/commonjs/api/cast/Chromecast.js.map +1 -0
- package/lib/commonjs/api/cast/barrel.js +71 -0
- package/lib/commonjs/api/cast/barrel.js.map +1 -0
- package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/commonjs/api/error/ChromecastError.js +2 -0
- package/lib/commonjs/api/error/ChromecastError.js.map +1 -0
- package/lib/commonjs/api/error/barrel.js +13 -0
- package/lib/commonjs/api/error/barrel.js.map +1 -1
- package/lib/commonjs/api/event/CastEvent.js +21 -0
- package/lib/commonjs/api/event/CastEvent.js.map +1 -0
- package/lib/commonjs/api/event/barrel.js +25 -12
- package/lib/commonjs/api/event/barrel.js.map +1 -1
- package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
- package/lib/commonjs/api/source/barrel.js +13 -0
- package/lib/commonjs/api/source/barrel.js.map +1 -1
- package/lib/commonjs/api/source/metadata/MetadataDescription.js +2 -0
- package/lib/commonjs/api/source/metadata/MetadataDescription.js.map +1 -0
- package/lib/commonjs/api/source/metadata/barrel.js +19 -0
- package/lib/commonjs/api/source/metadata/barrel.js.map +1 -0
- package/lib/commonjs/internal/THEOplayerView.js +16 -0
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +9 -0
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js +34 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js +46 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js +42 -0
- package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
- package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js +31 -0
- package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js.map +1 -0
- package/lib/commonjs/internal/web/stub/CastButtonStub.js +16 -0
- package/lib/commonjs/internal/web/stub/CastButtonStub.js.map +1 -0
- package/lib/module/api/THEOplayerView.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/cast/Airplay.js +2 -0
- package/lib/module/api/cast/Airplay.js.map +1 -0
- package/lib/module/api/cast/CastAPI.js +2 -0
- package/lib/module/api/cast/CastAPI.js.map +1 -0
- package/lib/module/api/cast/CastConfiguration.js +2 -0
- package/lib/module/api/cast/CastConfiguration.js.map +1 -0
- package/lib/module/api/cast/CastState.js +2 -0
- package/lib/module/api/cast/CastState.js.map +1 -0
- package/lib/module/api/cast/Chromecast.js +2 -0
- package/lib/module/api/cast/Chromecast.js.map +1 -0
- package/lib/module/api/cast/barrel.js +6 -0
- package/lib/module/api/cast/barrel.js.map +1 -0
- package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
- package/lib/module/api/error/ChromecastError.js +2 -0
- package/lib/module/api/error/ChromecastError.js.map +1 -0
- package/lib/module/api/error/barrel.js +1 -0
- package/lib/module/api/error/barrel.js.map +1 -1
- package/lib/module/api/event/CastEvent.js +14 -0
- package/lib/module/api/event/CastEvent.js.map +1 -0
- package/lib/module/api/event/barrel.js +2 -1
- package/lib/module/api/event/barrel.js.map +1 -1
- package/lib/module/api/source/SourceDescription.js.map +1 -1
- package/lib/module/api/source/barrel.js +1 -0
- package/lib/module/api/source/barrel.js.map +1 -1
- package/lib/module/api/source/metadata/MetadataDescription.js +2 -0
- package/lib/module/api/source/metadata/MetadataDescription.js.map +1 -0
- package/lib/module/api/source/metadata/barrel.js +2 -0
- package/lib/module/api/source/metadata/barrel.js.map +1 -0
- package/lib/module/internal/THEOplayerView.js +15 -0
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +8 -0
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/internal/cast/THEOplayerNativeAirplay.js +24 -0
- package/lib/module/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
- package/lib/module/internal/cast/THEOplayerNativeCastApi.js +34 -0
- package/lib/module/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
- package/lib/module/internal/cast/THEOplayerNativeChromecast.js +32 -0
- package/lib/module/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
- package/lib/module/internal/cast/THEOplayerWebCastApi.js +22 -0
- package/lib/module/internal/cast/THEOplayerWebCastApi.js.map +1 -0
- package/lib/module/internal/web/stub/CastButtonStub.js +6 -0
- package/lib/module/internal/web/stub/CastButtonStub.js.map +1 -0
- package/lib/typescript/lib/commonjs/api/cast/Airplay.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/cast/CastAPI.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/cast/CastConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/cast/CastState.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/cast/Chromecast.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/cast/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/error/ChromecastError.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/event/CastEvent.d.ts +2 -0
- package/lib/typescript/lib/commonjs/api/source/metadata/MetadataDescription.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/source/metadata/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +3 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +3 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeCastApi.d.ts +12 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
- package/lib/typescript/lib/commonjs/internal/cast/THEOplayerWebCastApi.d.ts +8 -0
- package/lib/typescript/lib/commonjs/internal/web/stub/CastButtonStub.d.ts +2 -0
- package/lib/typescript/lib/module/api/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/Airplay.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/CastAPI.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/CastConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/cast/CastState.d.ts +0 -0
- package/lib/typescript/lib/module/api/cast/Chromecast.d.ts +1 -0
- package/lib/typescript/lib/module/api/cast/barrel.d.ts +3 -0
- package/lib/typescript/lib/module/api/error/ChromecastError.d.ts +0 -0
- package/lib/typescript/lib/module/api/event/CastEvent.d.ts +1 -0
- package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -1
- package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/metadata/MetadataDescription.d.ts +0 -0
- package/lib/typescript/lib/module/api/source/metadata/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +3 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +3 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerNativeAirplay.d.ts +8 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerNativeCastApi.d.ts +11 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerNativeChromecast.d.ts +10 -0
- package/lib/typescript/lib/module/internal/cast/THEOplayerWebCastApi.d.ts +7 -0
- package/lib/typescript/lib/module/internal/web/stub/CastButtonStub.d.ts +2 -0
- package/lib/typescript/src/api/THEOplayerView.d.ts +10 -0
- package/lib/typescript/src/api/barrel.d.ts +1 -0
- package/lib/typescript/src/api/cast/Airplay.d.ts +27 -0
- package/lib/typescript/src/api/cast/CastAPI.d.ts +25 -0
- package/lib/typescript/src/api/cast/CastConfiguration.d.ts +41 -0
- package/lib/typescript/src/api/cast/CastState.d.ts +10 -0
- package/lib/typescript/src/api/cast/Chromecast.d.ts +39 -0
- package/lib/typescript/src/api/cast/barrel.d.ts +5 -0
- package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +6 -1
- package/lib/typescript/src/api/error/ChromecastError.d.ts +34 -0
- package/lib/typescript/src/api/error/barrel.d.ts +1 -0
- package/lib/typescript/src/api/event/CastEvent.d.ts +21 -0
- package/lib/typescript/src/api/event/barrel.d.ts +2 -1
- package/lib/typescript/src/api/source/SourceDescription.d.ts +7 -0
- package/lib/typescript/src/api/source/barrel.d.ts +1 -0
- package/lib/typescript/src/api/source/metadata/MetadataDescription.d.ts +12 -0
- package/lib/typescript/src/api/source/metadata/barrel.d.ts +1 -0
- package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
- package/lib/typescript/src/internal/THEOplayerView.web.d.ts +3 -1
- package/lib/typescript/src/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
- package/lib/typescript/src/internal/cast/THEOplayerNativeCastApi.d.ts +10 -0
- package/lib/typescript/src/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
- package/lib/typescript/src/internal/cast/THEOplayerWebCastApi.d.ts +9 -0
- package/lib/typescript/src/internal/web/stub/CastButtonStub.d.ts +3 -0
- package/package.json +2 -2
- package/react-native-theoplayer.podspec +2 -2
- package/src/api/THEOplayerView.ts +12 -0
- package/src/api/barrel.ts +1 -0
- package/src/api/cast/Airplay.ts +31 -0
- package/src/api/cast/CastAPI.ts +30 -0
- package/src/api/cast/CastConfiguration.ts +44 -0
- package/src/api/cast/CastState.ts +10 -0
- package/src/api/cast/Chromecast.ts +45 -0
- package/src/api/cast/barrel.ts +5 -0
- package/src/api/config/PlayerConfiguration.ts +7 -1
- package/src/api/error/ChromecastError.ts +46 -0
- package/src/api/error/barrel.ts +1 -0
- package/src/api/event/CastEvent.ts +45 -0
- package/src/api/event/barrel.ts +2 -1
- package/src/api/source/SourceDescription.ts +8 -0
- package/src/api/source/barrel.ts +1 -0
- package/src/api/source/metadata/MetadataDescription.ts +13 -0
- package/src/api/source/metadata/barrel.ts +1 -0
- package/src/internal/THEOplayerView.tsx +17 -0
- package/src/internal/THEOplayerView.web.tsx +8 -1
- package/src/internal/cast/THEOplayerNativeAirplay.ts +22 -0
- package/src/internal/cast/THEOplayerNativeCastApi.ts +28 -0
- package/src/internal/cast/THEOplayerNativeChromecast.ts +30 -0
- package/src/internal/cast/THEOplayerWebCastApi.ts +21 -0
- package/src/internal/web/stub/CastButtonStub.tsx +7 -0
- package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +0 -70
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +0 -32
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +0 -525
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +0 -127
- package/android/src/main/java/com/theoplayer/SourceHelper.java +0 -362
- package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +0 -578
- package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +0 -92
- package/android/src/main/java/com/theoplayer/ads/AdInfo.java +0 -168
- package/android/src/main/java/com/theoplayer/ads/AdsModule.java +0 -152
- package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +0 -11
- package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +0 -11
- package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +0 -54
- package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +0 -40
- package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +0 -11
- package/android/src/main/java/com/theoplayer/track/TrackEventType.java +0 -12
- package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +0 -234
- package/android/src/main/java/com/theoplayer/util/ViewResolver.java +0 -42
- package/ios/custom/react-native-theoplayer_custom_ios.podspec +0 -36
|
@@ -7,7 +7,7 @@ import UIKit
|
|
|
7
7
|
let SD_PROP_SOURCES: String = "sources"
|
|
8
8
|
let SD_PROP_POSTER: String = "poster"
|
|
9
9
|
let SD_PROP_TEXTTRACKS: String = "textTracks"
|
|
10
|
-
let
|
|
10
|
+
let SD_PROP_METADATA: String = "metadata"
|
|
11
11
|
let SD_PROP_SRC: String = "src"
|
|
12
12
|
let SD_PROP_TYPE: String = "type"
|
|
13
13
|
let SD_PROP_SSAI: String = "ssai"
|
|
@@ -35,6 +35,13 @@ let SD_PROP_CERTIFICATE_URL: String = "certificateURL"
|
|
|
35
35
|
let SD_PROP_LICENSE_URL: String = "licenseAcquisitionURL"
|
|
36
36
|
let SD_PROP_HEADERS: String = "headers"
|
|
37
37
|
let SD_PROP_LICENSE_TYPE: String = "licenseType"
|
|
38
|
+
let SD_PROP_METADATA_IMAGES: String = "images"
|
|
39
|
+
let SD_PROP_METADATA_IMAGE_HEIGHT: String = "height"
|
|
40
|
+
let SD_PROP_METADATA_IMAGE_WIDTH: String = "width"
|
|
41
|
+
let SD_PROP_METADATA_RELEASE_DATE: String = "releaseDate"
|
|
42
|
+
let SD_PROP_METADATA_RELEASE_YEAR: String = "releaseYear"
|
|
43
|
+
let SD_PROP_METADATA_TITLE: String = "title"
|
|
44
|
+
let SD_PROP_METADATA_SUBTITLE: String = "subtitle"
|
|
38
45
|
|
|
39
46
|
let EXTENSION_HLS: String = ".m3u8"
|
|
40
47
|
let EXTENSION_MP4: String = ".mp4"
|
|
@@ -107,44 +114,20 @@ class THEOplayerRCTSourceDescriptionBuilder {
|
|
|
107
114
|
}
|
|
108
115
|
|
|
109
116
|
// 4. extract Google IMA "ads"
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if let adsDataArray = ads as? [[String:Any]] {
|
|
117
|
-
for adsData in adsDataArray {
|
|
118
|
-
if let adDescription = THEOplayerRCTSourceDescriptionBuilder.buildAdDescription(adsData) {
|
|
119
|
-
adsDescriptions?.append(adDescription)
|
|
120
|
-
} else {
|
|
121
|
-
if DEBUG_SOURCE_DESCRIPTION_BUIDER {
|
|
122
|
-
print("[NATIVE] Could not create THEOplayer GoogleImaAdDescription from adsData array")
|
|
123
|
-
}
|
|
124
|
-
return nil
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
// case: single ads object
|
|
129
|
-
else if let adsData = ads as? [String:Any] {
|
|
130
|
-
if let adDescription = THEOplayerRCTSourceDescriptionBuilder.buildAdDescription(adsData) {
|
|
131
|
-
adsDescriptions?.append(adDescription)
|
|
132
|
-
} else {
|
|
133
|
-
if DEBUG_SOURCE_DESCRIPTION_BUIDER {
|
|
134
|
-
print("[NATIVE] Could not create THEOplayer GoogleImaAdDescription from adsData")
|
|
135
|
-
}
|
|
136
|
-
return nil
|
|
137
|
-
}
|
|
138
|
-
}
|
|
117
|
+
let adsDescriptions: [AdDescription]? = self.buildAdDescriptions(sourceData) // Ads Extension
|
|
118
|
+
|
|
119
|
+
// 5. extract metadata
|
|
120
|
+
var metadataDescription: MetadataDescription?
|
|
121
|
+
if let metadataData = sourceData[SD_PROP_METADATA] as? [String:Any] {
|
|
122
|
+
metadataDescription = THEOplayerRCTSourceDescriptionBuilder.buildMetaDataDescription(metadataData)
|
|
139
123
|
}
|
|
140
|
-
#endif
|
|
141
124
|
|
|
142
|
-
//
|
|
125
|
+
// 6. construct and return SourceDescription
|
|
143
126
|
return SourceDescription(sources: typedSources,
|
|
144
127
|
textTracks: textTrackDescriptions,
|
|
145
128
|
ads: adsDescriptions,
|
|
146
129
|
poster: poster,
|
|
147
|
-
metadata:
|
|
130
|
+
metadata: metadataDescription)
|
|
148
131
|
}
|
|
149
132
|
|
|
150
133
|
// MARK: Private build methods
|
|
@@ -154,72 +137,35 @@ class THEOplayerRCTSourceDescriptionBuilder {
|
|
|
154
137
|
- returns: a THEOplayer TypedSource. In case of SSAI we support GoogleDAITypedSource with GoogleDAIVodConfiguration or GoogleDAILiveConfiguration
|
|
155
138
|
*/
|
|
156
139
|
private static func buildTypedSource(_ typedSourceData: [String:Any]) -> TypedSource? {
|
|
140
|
+
let contentProtection = extractDrmConfiguration(from: typedSourceData)
|
|
157
141
|
if let src = typedSourceData[SD_PROP_SRC] as? String {
|
|
158
142
|
// extract the type
|
|
159
143
|
let type = typedSourceData[SD_PROP_TYPE] as? String ?? THEOplayerRCTSourceDescriptionBuilder.extractMimeType(src)
|
|
160
|
-
// check for a contentProtection
|
|
161
|
-
var contentProtection: MultiplatformDRMConfiguration?
|
|
162
|
-
if let contentProtectionData = typedSourceData[SD_PROP_CONTENT_PROTECTION] as? [String:Any] {
|
|
163
|
-
let sanitisedContentProtectionData = THEOplayerRCTSourceDescriptionBuilder.sanitiseContentProtectionData(contentProtectionData)
|
|
164
|
-
contentProtection = THEOplayerRCTSourceDescriptionBuilder.buildContentProtection(sanitisedContentProtectionData)
|
|
165
|
-
}
|
|
166
|
-
|
|
167
144
|
return TypedSource(src: src,
|
|
168
145
|
type: type,
|
|
169
146
|
drm: contentProtection)
|
|
170
147
|
}
|
|
171
148
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
if let integration = ssaiData[SD_PROP_INTEGRATION] as? String,
|
|
176
|
-
integration == SSAIIntegrationId.GoogleDAISSAIIntegrationID._rawValue {
|
|
177
|
-
if let availabilityType = ssaiData[SD_PROP_AVAILABILITY_TYPE] as? String {
|
|
178
|
-
// build a GoogleDAIConfiguration
|
|
179
|
-
var googleDaiConfig: GoogleDAIConfiguration?
|
|
180
|
-
let authToken = ssaiData[SD_PROP_AUTH_TOKEN] as? String
|
|
181
|
-
let streamActivityMonitorID = ssaiData[SD_PROP_STREAM_ACTIVITY_MONITOR_ID] as? String
|
|
182
|
-
let adTagParameters = ssaiData[SD_PROP_AD_TAG_PARAMETERS] as? [String:String]
|
|
183
|
-
let apiKey = ssaiData[SD_PROP_APIKEY] as? String ?? ""
|
|
184
|
-
switch availabilityType {
|
|
185
|
-
case StreamType.vod._rawValue:
|
|
186
|
-
if let videoId = ssaiData[SD_PROP_VIDEOID] as? String,
|
|
187
|
-
let contentSourceID = ssaiData[SD_PROP_CONTENT_SOURCE_ID] as? String {
|
|
188
|
-
googleDaiConfig = GoogleDAIVodConfiguration(videoID: videoId,
|
|
189
|
-
contentSourceID: contentSourceID,
|
|
190
|
-
apiKey: apiKey,
|
|
191
|
-
authToken: authToken,
|
|
192
|
-
streamActivityMonitorID: streamActivityMonitorID,
|
|
193
|
-
adTagParameters: adTagParameters)
|
|
194
|
-
}
|
|
195
|
-
case StreamType.live._rawValue:
|
|
196
|
-
if let assetKey = ssaiData[SD_PROP_ASSET_KEY] as? String {
|
|
197
|
-
googleDaiConfig = GoogleDAILiveConfiguration(assetKey: assetKey,
|
|
198
|
-
apiKey: apiKey,
|
|
199
|
-
authToken: authToken,
|
|
200
|
-
streamActivityMonitorID: streamActivityMonitorID,
|
|
201
|
-
adTagParameters: adTagParameters)
|
|
202
|
-
}
|
|
203
|
-
default:
|
|
204
|
-
if DEBUG_SOURCE_DESCRIPTION_BUIDER {
|
|
205
|
-
print("[NATIVE] THEOplayer ssai 'availabilityType' must be 'live' or 'vod'")
|
|
206
|
-
}
|
|
207
|
-
return nil
|
|
208
|
-
}
|
|
209
|
-
// when valid, create a GoolgeDAITypedSource from the GoogleDAIConfiguration
|
|
210
|
-
if let config = googleDaiConfig {
|
|
211
|
-
return GoogleDAITypedSource(ssai: config)
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
149
|
+
// Check if we can extract a DAI source
|
|
150
|
+
if let daiSource = self.buildDAITypedSource(typedSourceData, contentProtection: contentProtection) {
|
|
151
|
+
return daiSource
|
|
215
152
|
}
|
|
216
|
-
|
|
153
|
+
|
|
217
154
|
if DEBUG_SOURCE_DESCRIPTION_BUIDER {
|
|
218
155
|
print("[NATIVE] THEOplayer TypedSource requires 'src' property in 'sources' description")
|
|
219
156
|
}
|
|
220
157
|
return nil
|
|
221
158
|
}
|
|
222
159
|
|
|
160
|
+
private static func extractDrmConfiguration(from typedSourceData: [String:Any]) -> MultiplatformDRMConfiguration? {
|
|
161
|
+
// check for a contentProtection
|
|
162
|
+
guard let contentProtectionData = typedSourceData[SD_PROP_CONTENT_PROTECTION] as? [String:Any] else {
|
|
163
|
+
return nil
|
|
164
|
+
}
|
|
165
|
+
let sanitisedContentProtectionData = THEOplayerRCTSourceDescriptionBuilder.sanitiseContentProtectionData(contentProtectionData)
|
|
166
|
+
return THEOplayerRCTSourceDescriptionBuilder.buildContentProtection(sanitisedContentProtectionData)
|
|
167
|
+
}
|
|
168
|
+
|
|
223
169
|
/**
|
|
224
170
|
Creates a THEOplayer TextTrackDescription. This requires a textTracks property in the RN source description.
|
|
225
171
|
- returns: a THEOplayer TextTrackDescription
|
|
@@ -241,29 +187,70 @@ class THEOplayerRCTSourceDescriptionBuilder {
|
|
|
241
187
|
return nil
|
|
242
188
|
}
|
|
243
189
|
|
|
244
|
-
#if ADS && GOOGLE_IMA
|
|
245
190
|
/**
|
|
246
|
-
Creates a THEOplayer
|
|
247
|
-
- returns: a THEOplayer
|
|
191
|
+
Creates a THEOplayer MetadataDescription. This requires a metadata property in the RN source description.
|
|
192
|
+
- returns: a THEOplayer MetadataDescription
|
|
248
193
|
*/
|
|
249
|
-
static func
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
194
|
+
static func buildMetaDataDescription(_ metadataData: [String:Any]) -> MetadataDescription? {
|
|
195
|
+
// first extract explicit casting metadata:
|
|
196
|
+
#if os(iOS)
|
|
197
|
+
var images: [ChromecastMetadataImage]?
|
|
198
|
+
if let metadataImagesArrayData = metadataData[SD_PROP_METADATA_IMAGES] as? [[String:Any]] {
|
|
199
|
+
images = THEOplayerRCTSourceDescriptionBuilder.buildChromecastMetaDataImagesArray(metadataImagesArrayData)
|
|
200
|
+
}
|
|
201
|
+
let type = THEOplayerRCTSourceDescriptionBuilder.buildChromecastMetadataType(metadataData[SD_PROP_TYPE] as? String)
|
|
202
|
+
let releaseDate = metadataData[SD_PROP_METADATA_RELEASE_DATE] as? String
|
|
203
|
+
let releaseYear = metadataData[SD_PROP_METADATA_RELEASE_YEAR] as? Int
|
|
204
|
+
let title = metadataData[SD_PROP_METADATA_TITLE] as? String
|
|
205
|
+
let subtitle = metadataData[SD_PROP_METADATA_SUBTITLE] as? String
|
|
206
|
+
// all the non-casting related metadata goes in the metadataKeys:
|
|
207
|
+
let metadataKeys = metadataData.filter { metadataElement in
|
|
208
|
+
!(metadataElement.key == SD_PROP_TYPE || metadataElement.key == SD_PROP_METADATA_IMAGES)
|
|
209
|
+
}
|
|
210
|
+
return ChromecastMetadataDescription(images: images,
|
|
211
|
+
releaseDate: releaseDate,
|
|
212
|
+
releaseYear: releaseYear,
|
|
213
|
+
title: title,
|
|
214
|
+
subtitle: subtitle,
|
|
215
|
+
type: type,
|
|
216
|
+
metadataKeys: metadataKeys)
|
|
217
|
+
#else
|
|
218
|
+
let title = metadataData[SD_PROP_METADATA_TITLE] as? String
|
|
219
|
+
return MetadataDescription(metadataKeys: metadataData, title: title)
|
|
220
|
+
#endif
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
#if os(iOS)
|
|
224
|
+
static func buildChromecastMetadataType(_ metadataType: String?) -> ChromecastMetadataType {
|
|
225
|
+
guard let typeString = metadataType else {
|
|
226
|
+
return ChromecastMetadataType.GENERIC
|
|
227
|
+
}
|
|
228
|
+
switch typeString {
|
|
229
|
+
case "none": return ChromecastMetadataType.NONE
|
|
230
|
+
case "audio": return ChromecastMetadataType.AUDIO
|
|
231
|
+
case "tv-show": return ChromecastMetadataType.TV_SHOW
|
|
232
|
+
case "generic": return ChromecastMetadataType.GENERIC
|
|
233
|
+
case "movie": return ChromecastMetadataType.MOVIE
|
|
234
|
+
default: return ChromecastMetadataType.GENERIC
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
static func buildChromecastMetaDataImagesArray(_ metadataImagesArrayData: [[String:Any]]) -> [ChromecastMetadataImage]? {
|
|
239
|
+
var images: [ChromecastMetadataImage] = []
|
|
240
|
+
for metadataImageData in metadataImagesArrayData {
|
|
241
|
+
if let image: ChromecastMetadataImage = THEOplayerRCTSourceDescriptionBuilder.buildChromecastMetaDataImage(metadataImageData) {
|
|
242
|
+
images.append(image)
|
|
264
243
|
}
|
|
265
244
|
}
|
|
266
|
-
|
|
245
|
+
return images.count > 0 ? images : nil
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
static func buildChromecastMetaDataImage(_ metadataImageData: [String:Any]) -> ChromecastMetadataImage? {
|
|
249
|
+
if let src = metadataImageData[SD_PROP_SRC] as? String,
|
|
250
|
+
let width = metadataImageData[SD_PROP_METADATA_IMAGE_WIDTH] as? Int,
|
|
251
|
+
let height = metadataImageData[SD_PROP_METADATA_IMAGE_HEIGHT] as? Int {
|
|
252
|
+
return ChromecastMetadataImage(src: src, width: width, height: height)
|
|
253
|
+
}
|
|
267
254
|
return nil
|
|
268
255
|
}
|
|
269
256
|
#endif
|
|
@@ -273,25 +260,15 @@ class THEOplayerRCTSourceDescriptionBuilder {
|
|
|
273
260
|
- returns: a THEOplayer valid contentProtection data map
|
|
274
261
|
*/
|
|
275
262
|
private static func sanitiseContentProtectionData(_ contentProtectionData: [String:Any]) -> [String:Any] {
|
|
276
|
-
var sanitisedContentProtectionData: [String:Any] =
|
|
277
|
-
//
|
|
278
|
-
let sanitisedIntegration = contentProtectionData[SD_PROP_INTEGRATION] as? String
|
|
279
|
-
sanitisedContentProtectionData[SD_PROP_INTEGRATION] = sanitisedIntegration
|
|
280
|
-
// integrationParameters
|
|
281
|
-
let sanitisedIntegrationParameters = contentProtectionData[SD_PROP_INTEGRATION_PARAMETERS] as? [String:Any]
|
|
282
|
-
sanitisedContentProtectionData[SD_PROP_INTEGRATION_PARAMETERS] = sanitisedIntegrationParameters
|
|
283
|
-
// headers
|
|
284
|
-
if let headers = contentProtectionData[SD_PROP_HEADERS] as? [String:String] {
|
|
285
|
-
sanitisedContentProtectionData[SD_PROP_HEADERS] = headers
|
|
286
|
-
}
|
|
287
|
-
// fairplay
|
|
263
|
+
var sanitisedContentProtectionData: [String:Any] = contentProtectionData
|
|
264
|
+
// fairplay update
|
|
288
265
|
if let fairplayData = contentProtectionData[SD_PROP_FAIRPLAY] as? [String:Any] {
|
|
289
266
|
var sanitisedFairplayData: [String:Any] = [:]
|
|
290
267
|
// certificateUrl
|
|
291
268
|
if let certificateUrl = fairplayData[SD_PROP_CERTIFICATE_URL] as? String {
|
|
292
269
|
sanitisedFairplayData[SD_PROP_CERTIFICATE_URL] = certificateUrl
|
|
293
270
|
}
|
|
294
|
-
// convert
|
|
271
|
+
// convert certificate into certificateUrl with marker prefix (also supported by THEOplayer Web SDK)
|
|
295
272
|
if let certificate = fairplayData[SD_PROP_CERTIFICATE] as? String {
|
|
296
273
|
sanitisedFairplayData[SD_PROP_CERTIFICATE_URL] = "\(CERTIFICATE_MARKER)\(certificate)"
|
|
297
274
|
}
|
|
@@ -309,14 +286,14 @@ class THEOplayerRCTSourceDescriptionBuilder {
|
|
|
309
286
|
}
|
|
310
287
|
sanitisedContentProtectionData[SD_PROP_FAIRPLAY] = sanitisedFairplayData
|
|
311
288
|
}
|
|
312
|
-
// widevine
|
|
289
|
+
// widevine update
|
|
313
290
|
if let widevineData = contentProtectionData[SD_PROP_WIDEVINE] as? [String:Any] {
|
|
314
291
|
var sanitisedWidevineData: [String:Any] = [:]
|
|
315
292
|
// certificateUrl
|
|
316
293
|
if let certificateUrl = widevineData[SD_PROP_CERTIFICATE_URL] as? String {
|
|
317
294
|
sanitisedWidevineData[SD_PROP_CERTIFICATE_URL] = certificateUrl
|
|
318
295
|
}
|
|
319
|
-
// convert
|
|
296
|
+
// convert certificate into certificateUrl with marker prefix (also supported by THEOplayer Web SDK)
|
|
320
297
|
if let certificate = widevineData[SD_PROP_CERTIFICATE] as? String {
|
|
321
298
|
sanitisedWidevineData[SD_PROP_CERTIFICATE_URL] = "\(CERTIFICATE_MARKER)\(certificate)"
|
|
322
299
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
//
|
|
1
|
+
// THEOplayerRCTTextTrackEventHandler.swift
|
|
2
2
|
|
|
3
3
|
import Foundation
|
|
4
4
|
import THEOplayerSDK
|
|
5
5
|
|
|
6
|
-
class
|
|
6
|
+
class THEOplayerRCTTextTrackEventHandler {
|
|
7
7
|
// MARK: Members
|
|
8
8
|
private weak var player: THEOplayer?
|
|
9
9
|
|
|
@@ -49,7 +49,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
49
49
|
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received ADD_TRACK event from THEOplayer textTrack list: trackUid = \(textTrack.uid)") }
|
|
50
50
|
// trigger tracklist event
|
|
51
51
|
forwardedTextTrackListEvent([
|
|
52
|
-
"track" :
|
|
52
|
+
"track" : THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
|
|
53
53
|
"type" : TrackListEventType.ADD_TRACK.rawValue
|
|
54
54
|
])
|
|
55
55
|
// start listening for cue events on this track and keep listener for later removal
|
|
@@ -69,7 +69,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
69
69
|
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received REMOVE_TRACK event from THEOplayer textTrack list: trackUid = \(textTrack.uid)") }
|
|
70
70
|
// trigger tracklist event
|
|
71
71
|
forwardedTextTrackListEvent([
|
|
72
|
-
"track" :
|
|
72
|
+
"track" : THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
|
|
73
73
|
"type" : TrackListEventType.REMOVE_TRACK.rawValue
|
|
74
74
|
])
|
|
75
75
|
// stop listening for cue events on this track
|
|
@@ -92,7 +92,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
92
92
|
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received CHANGE event from THEOplayer textTrack list: trackUid = \(textTrack.uid)") }
|
|
93
93
|
// trigger tracklist event
|
|
94
94
|
forwardedTextTrackListEvent([
|
|
95
|
-
"track" :
|
|
95
|
+
"track" : THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
|
|
96
96
|
"type" : TrackListEventType.CHANGE_TRACK.rawValue
|
|
97
97
|
])
|
|
98
98
|
}
|
|
@@ -132,7 +132,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
132
132
|
forwardedTextTrackEvent([
|
|
133
133
|
"trackUid" : textTrack.uid,
|
|
134
134
|
"type": TrackCueEventType.ADD_CUE,
|
|
135
|
-
"cue":
|
|
135
|
+
"cue": THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: event.cue)
|
|
136
136
|
])
|
|
137
137
|
}
|
|
138
138
|
}
|
|
@@ -144,7 +144,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
144
144
|
forwardedTextTrackEvent([
|
|
145
145
|
"trackUid" : textTrack.uid,
|
|
146
146
|
"type": TrackCueEventType.REMOVE_CUE,
|
|
147
|
-
"cue":
|
|
147
|
+
"cue": THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: event.cue)
|
|
148
148
|
])
|
|
149
149
|
}
|
|
150
150
|
}
|
package/ios/{THEOplayerRCTMetadataAggregator.swift → THEOplayerRCTTrackMetadataAggregator.swift}
RENAMED
|
@@ -26,19 +26,19 @@ let PROP_CUES: String = "cues"
|
|
|
26
26
|
let PROP_CUE_CONTENT: String = "content"
|
|
27
27
|
let PROP_SRC: String = "src"
|
|
28
28
|
|
|
29
|
-
class
|
|
29
|
+
class THEOplayerRCTTrackMetadataAggregator {
|
|
30
30
|
|
|
31
|
-
class func
|
|
31
|
+
class func aggregateTrackMetadata(player: THEOplayer) -> [String:Any] {
|
|
32
32
|
let textTracks: TextTrackList = player.textTracks
|
|
33
33
|
let audioTracks: AudioTrackList = player.audioTracks
|
|
34
34
|
let videoTracks: VideoTrackList = player.videoTracks
|
|
35
35
|
return [
|
|
36
|
-
EVENT_PROP_TEXT_TRACKS :
|
|
37
|
-
EVENT_PROP_AUDIO_TRACKS :
|
|
38
|
-
EVENT_PROP_VIDEO_TRACKS :
|
|
39
|
-
EVENT_PROP_SELECTED_TEXT_TRACK:
|
|
40
|
-
EVENT_PROP_SELECTED_AUDIO_TRACK:
|
|
41
|
-
EVENT_PROP_SELECTED_VIDEO_TRACK:
|
|
36
|
+
EVENT_PROP_TEXT_TRACKS : THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackListInfo(textTracks: textTracks),
|
|
37
|
+
EVENT_PROP_AUDIO_TRACKS : THEOplayerRCTTrackMetadataAggregator.aggregatedAudioTrackListInfo(audioTracks: audioTracks),
|
|
38
|
+
EVENT_PROP_VIDEO_TRACKS : THEOplayerRCTTrackMetadataAggregator.aggregatedVideoTrackListInfo(videoTracks: videoTracks),
|
|
39
|
+
EVENT_PROP_SELECTED_TEXT_TRACK: THEOplayerRCTTrackMetadataAggregator.selectedTextTrack(textTracks: textTracks),
|
|
40
|
+
EVENT_PROP_SELECTED_AUDIO_TRACK: THEOplayerRCTTrackMetadataAggregator.selectedAudioTrack(audioTracks: audioTracks),
|
|
41
|
+
EVENT_PROP_SELECTED_VIDEO_TRACK: THEOplayerRCTTrackMetadataAggregator.selectedVideoTrack(videoTracks: videoTracks),
|
|
42
42
|
EVENT_PROP_DURATION: THEOplayerRCTTypeUtils.encodeInfNan((player.duration ?? Double.nan) * 1000)
|
|
43
43
|
]
|
|
44
44
|
}
|
|
@@ -51,7 +51,7 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
51
51
|
}
|
|
52
52
|
for i in 0...textTracks.count-1 {
|
|
53
53
|
let textTrack: TextTrack = textTracks.get(i)
|
|
54
|
-
textTrackEntries.append(
|
|
54
|
+
textTrackEntries.append(THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack))
|
|
55
55
|
}
|
|
56
56
|
return textTrackEntries
|
|
57
57
|
}
|
|
@@ -70,7 +70,7 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
70
70
|
if !textTrack.cues.isEmpty {
|
|
71
71
|
var cueList: [[String:Any]] = []
|
|
72
72
|
for cue in textTrack.cues {
|
|
73
|
-
cueList.append(
|
|
73
|
+
cueList.append(THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: cue))
|
|
74
74
|
}
|
|
75
75
|
entry[PROP_CUES] = cueList
|
|
76
76
|
}
|
|
@@ -109,7 +109,7 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
109
109
|
}
|
|
110
110
|
for i in 0...audioTracks.count-1 {
|
|
111
111
|
if let audioTrack: AudioTrack = audioTracks.get(i) as? AudioTrack {
|
|
112
|
-
audioTrackEntries.append(
|
|
112
|
+
audioTrackEntries.append(THEOplayerRCTTrackMetadataAggregator.aggregatedAudioTrackInfo(audioTrack: audioTrack))
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
return audioTrackEntries
|
|
@@ -149,7 +149,7 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
149
149
|
}
|
|
150
150
|
for i in 0...videoTracks.count-1 {
|
|
151
151
|
if let videoTrack: VideoTrack = videoTracks.get(i) as? VideoTrack {
|
|
152
|
-
videoTrackEntries.append(
|
|
152
|
+
videoTrackEntries.append(THEOplayerRCTTrackMetadataAggregator.aggregatedVideoTrackInfo(videoTrack: videoTrack))
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
return videoTrackEntries
|
|
@@ -6,11 +6,14 @@ import THEOplayerSDK
|
|
|
6
6
|
|
|
7
7
|
class THEOplayerRCTView: UIView {
|
|
8
8
|
// MARK: Members
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
var player: THEOplayer?
|
|
10
|
+
var mainEventHandler: THEOplayerRCTMainEventHandler
|
|
11
|
+
var textTrackEventHandler: THEOplayerRCTTextTrackEventHandler
|
|
12
|
+
var mediaTrackEventHandler: THEOplayerRCTMediaTrackEventHandler
|
|
13
|
+
var adEventHandler: THEOplayerRCTAdsEventHandler
|
|
14
|
+
var castEventHandler: THEOplayerRCTCastEventHandler
|
|
15
|
+
var adsConfig = AdsConfig()
|
|
16
|
+
var castConfig = CastConfig()
|
|
14
17
|
|
|
15
18
|
// MARK: Bridged props
|
|
16
19
|
private var src: SourceDescription?
|
|
@@ -18,8 +21,8 @@ class THEOplayerRCTView: UIView {
|
|
|
18
21
|
private var licenseUrl: String?
|
|
19
22
|
private var chromeless: Bool = true
|
|
20
23
|
private var config: THEOplayerConfiguration?
|
|
21
|
-
private var paused: Bool =
|
|
22
|
-
private var muted: Bool =
|
|
24
|
+
private var paused: Bool = true
|
|
25
|
+
private var muted: Bool = false
|
|
23
26
|
private var playbackRate: Double = 1.0
|
|
24
27
|
private var selectedTextTrackUid: Int = 0
|
|
25
28
|
private var selectedVideoTrackUid: Int = 0
|
|
@@ -27,20 +30,14 @@ class THEOplayerRCTView: UIView {
|
|
|
27
30
|
private var seek: Double? = nil // in msec
|
|
28
31
|
private var fullscreen: Bool = false
|
|
29
32
|
|
|
30
|
-
#if ADS && (GOOGLE_IMA || GOOGLE_DAI)
|
|
31
|
-
private var adSUIEnabled: Bool = true
|
|
32
|
-
private var adPreloadType: THEOplayerSDK.AdPreloadType = THEOplayerSDK.AdPreloadType.MIDROLL_AND_POSTROLL
|
|
33
|
-
private var googleImaUsesNativeIma: Bool = true
|
|
34
|
-
#endif
|
|
35
|
-
|
|
36
|
-
|
|
37
33
|
// MARK: - Initialisation / view setup
|
|
38
34
|
init() {
|
|
39
35
|
// create event handlers to maintain event props
|
|
40
|
-
self.mainEventHandler =
|
|
41
|
-
self.textTrackEventHandler =
|
|
42
|
-
self.mediaTrackEventHandler =
|
|
43
|
-
self.adEventHandler =
|
|
36
|
+
self.mainEventHandler = THEOplayerRCTMainEventHandler()
|
|
37
|
+
self.textTrackEventHandler = THEOplayerRCTTextTrackEventHandler()
|
|
38
|
+
self.mediaTrackEventHandler = THEOplayerRCTMediaTrackEventHandler()
|
|
39
|
+
self.adEventHandler = THEOplayerRCTAdsEventHandler()
|
|
40
|
+
self.castEventHandler = THEOplayerRCTCastEventHandler()
|
|
44
41
|
|
|
45
42
|
super.init(frame: .zero)
|
|
46
43
|
}
|
|
@@ -50,18 +47,13 @@ class THEOplayerRCTView: UIView {
|
|
|
50
47
|
self.textTrackEventHandler.destroy()
|
|
51
48
|
self.mediaTrackEventHandler.destroy()
|
|
52
49
|
self.adEventHandler.destroy()
|
|
50
|
+
self.castEventHandler.destroy()
|
|
51
|
+
|
|
53
52
|
self.player?.destroy()
|
|
54
53
|
self.player = nil
|
|
55
54
|
if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] THEOplayer instance destroyed.") }
|
|
56
55
|
}
|
|
57
56
|
|
|
58
|
-
func ads() -> Ads? {
|
|
59
|
-
guard let player = self.player else {
|
|
60
|
-
return nil
|
|
61
|
-
}
|
|
62
|
-
return player.ads
|
|
63
|
-
}
|
|
64
|
-
|
|
65
57
|
required init?(coder aDecoder: NSCoder) {
|
|
66
58
|
fatalError("[NATIVE] init(coder:) has not been implemented")
|
|
67
59
|
}
|
|
@@ -102,57 +94,46 @@ class THEOplayerRCTView: UIView {
|
|
|
102
94
|
return
|
|
103
95
|
}
|
|
104
96
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
97
|
+
if !self.isCasting() || self.player == nil {
|
|
98
|
+
self.destroy()
|
|
99
|
+
DispatchQueue.main.async {
|
|
100
|
+
self.initPlayer()
|
|
101
|
+
if let player = self.player {
|
|
102
|
+
// couple player instance to event handlers
|
|
103
|
+
self.mainEventHandler.setPlayer(player)
|
|
104
|
+
self.textTrackEventHandler.setPlayer(player)
|
|
105
|
+
self.mediaTrackEventHandler.setPlayer(player)
|
|
106
|
+
self.adEventHandler.setPlayer(player)
|
|
107
|
+
self.castEventHandler.setPlayer(player)
|
|
108
|
+
// couple player instance to view
|
|
109
|
+
player.addAsSubview(of: self)
|
|
110
|
+
}
|
|
111
|
+
self.syncAllPlayerProps()
|
|
120
112
|
}
|
|
113
|
+
} else {
|
|
121
114
|
self.syncAllPlayerProps()
|
|
122
115
|
}
|
|
123
116
|
}
|
|
124
117
|
|
|
125
118
|
private func initPlayer() {
|
|
126
119
|
if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] 'lazy' init THEOplayer instance") }
|
|
127
|
-
#if os(
|
|
128
|
-
self.player = THEOplayer(configuration: THEOplayerConfiguration(chromeless: self.chromeless,
|
|
129
|
-
license: self.license,
|
|
130
|
-
licenseUrl: self.licenseUrl,
|
|
131
|
-
pip: nil))
|
|
132
|
-
#else
|
|
120
|
+
#if os(iOS)
|
|
133
121
|
let stylePath = Bundle.main.path(forResource:"style", ofType: "css")
|
|
134
122
|
let cssPaths = stylePath != nil ? [stylePath!] : []
|
|
135
123
|
self.player = THEOplayer(configuration: THEOplayerConfiguration(chromeless: self.chromeless,
|
|
136
124
|
cssPaths: cssPaths,
|
|
137
125
|
pip: nil,
|
|
138
|
-
ads: self.
|
|
126
|
+
ads: self.playerAdsConfiguration(),
|
|
127
|
+
cast: self.playerCastConfiguration(),
|
|
139
128
|
license: self.license,
|
|
140
129
|
licenseUrl: self.licenseUrl))
|
|
141
|
-
#endif
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
private func initAdsConfiguration() -> AdsConfiguration? {
|
|
145
|
-
#if ADS && (GOOGLE_IMA || GOOGLE_DAI)
|
|
146
|
-
let googleIMAConfiguration = GoogleIMAConfiguration()
|
|
147
|
-
googleIMAConfiguration.useNativeIma = self.googleImaUsesNativeIma
|
|
148
|
-
googleIMAConfiguration.disableUI = !self.adSUIEnabled
|
|
149
|
-
return AdsConfiguration(showCountdown: self.adSUIEnabled,
|
|
150
|
-
preload: self.adPreloadType,
|
|
151
|
-
googleImaConfiguration: googleIMAConfiguration)
|
|
152
130
|
#else
|
|
153
|
-
|
|
131
|
+
self.player = THEOplayer(configuration: THEOplayerConfiguration(chromeless: self.chromeless,
|
|
132
|
+
ads: self.playerAdsConfiguration(),
|
|
133
|
+
license: self.license,
|
|
134
|
+
licenseUrl: self.licenseUrl,
|
|
135
|
+
pip: nil))
|
|
154
136
|
#endif
|
|
155
|
-
|
|
156
137
|
}
|
|
157
138
|
|
|
158
139
|
private func syncPlayerSrc() {
|
|
@@ -169,17 +150,8 @@ class THEOplayerRCTView: UIView {
|
|
|
169
150
|
self.license = configDict["license"] as? String
|
|
170
151
|
self.licenseUrl = configDict["licenseUrl"] as? String
|
|
171
152
|
self.chromeless = configDict["chromeless"] as? Bool ?? true
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
self.adSUIEnabled = adsConfig["uiEnabled"] as? Bool ?? true
|
|
175
|
-
if let adPreloadType = adsConfig["preload"] as? String {
|
|
176
|
-
self.adPreloadType = adPreloadType == "none" ? THEOplayerSDK.AdPreloadType.NONE : THEOplayerSDK.AdPreloadType.MIDROLL_AND_POSTROLL
|
|
177
|
-
}
|
|
178
|
-
if let googleImaConfiguration = adsConfig["googleImaConfiguration"] as? NSDictionary {
|
|
179
|
-
self.googleImaUsesNativeIma = googleImaConfiguration["useNativeIma"] as? Bool ?? true
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
#endif
|
|
153
|
+
self.parseAdsConfig(configDict: configDict)
|
|
154
|
+
self.parseCastConfig(configDict: configDict)
|
|
183
155
|
if DEBUG_PROP_UPDATES { print("[NATIVE] config prop updated.") }
|
|
184
156
|
}
|
|
185
157
|
|
|
@@ -499,6 +471,14 @@ class THEOplayerRCTView: UIView {
|
|
|
499
471
|
if DEBUG_PROP_UPDATES { print("[NATIVE] nativeMediaTrackEvent prop set.") }
|
|
500
472
|
}
|
|
501
473
|
|
|
474
|
+
// MARK: - Listener based CAST event bridging
|
|
475
|
+
|
|
476
|
+
@objc(setOnNativeCastEvent:)
|
|
477
|
+
func setOnNativeCastEvent(nativeCastEvent: @escaping RCTDirectEventBlock) {
|
|
478
|
+
self.castEventHandler.onNativeCastEvent = nativeCastEvent
|
|
479
|
+
if DEBUG_PROP_UPDATES { print("[NATIVE] nativeCastEvent prop set.") }
|
|
480
|
+
}
|
|
481
|
+
|
|
502
482
|
// MARK: - Listener based AD event bridging
|
|
503
483
|
|
|
504
484
|
@objc(setOnNativeAdEvent:)
|