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.
Files changed (248) hide show
  1. package/README.md +2 -0
  2. package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +115 -0
  3. package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +648 -0
  4. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +23 -0
  5. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +447 -0
  6. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.kt +117 -0
  7. package/android/src/main/java/com/theoplayer/{TimeUpdateRate.java → TimeUpdateRate.kt} +2 -2
  8. package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +161 -0
  9. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.kt +90 -0
  10. package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +140 -0
  11. package/android/src/main/java/com/theoplayer/cast/CastEventAdapter.kt +81 -0
  12. package/android/src/main/java/com/theoplayer/cast/CastModule.kt +75 -0
  13. package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +2 -2
  14. package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +1 -2
  15. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegration.kt +1 -2
  16. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegrationFactory.kt +3 -5
  17. package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +402 -0
  18. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.kt +6 -0
  19. package/android/src/main/java/com/theoplayer/track/MediaTrackType.kt +6 -0
  20. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.kt +43 -0
  21. package/android/src/main/java/com/theoplayer/track/QualityListFilter.kt +28 -0
  22. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.kt +10 -0
  23. package/android/src/main/java/com/theoplayer/track/TrackEventType.kt +7 -0
  24. package/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +219 -0
  25. package/android/src/main/java/com/theoplayer/util/ViewResolver.kt +19 -0
  26. package/ios/THEOplayerRCTBridge.m +52 -1
  27. package/ios/THEOplayerRCTDebug.swift +3 -0
  28. package/ios/{THEOplayerRCTViewMainEventHandler.swift → THEOplayerRCTMainEventHandler.swift} +2 -2
  29. package/ios/{THEOplayerRCTViewMediaTrackEventHandler.swift → THEOplayerRCTMediaTrackEventHandler.swift} +8 -8
  30. package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +95 -118
  31. package/ios/{THEOplayerRCTViewTextTrackEventHandler.swift → THEOplayerRCTTextTrackEventHandler.swift} +7 -7
  32. package/ios/{THEOplayerRCTMetadataAggregator.swift → THEOplayerRCTTrackMetadataAggregator.swift} +12 -12
  33. package/ios/THEOplayerRCTView.swift +51 -71
  34. package/ios/{THEOplayerRCTAdAggregator.swift → ads/THEOplayerRCTAdAggregator.swift} +13 -7
  35. package/ios/ads/THEOplayerRCTAdsAPI+DAI.swift +108 -0
  36. package/ios/{THEOplayerRCTAdsAPI.swift → ads/THEOplayerRCTAdsAPI.swift} +4 -95
  37. package/ios/{THEOplayerRCTViewAdEventHandler.swift → ads/THEOplayerRCTAdsEventHandler.swift} +3 -3
  38. package/ios/ads/THEOplayerRCTSourceDescriptionBuilder+Ads.swift +130 -0
  39. package/ios/ads/THEOplayerRCTView+Ads.swift +15 -0
  40. package/ios/ads/THEOplayerRCTView+AdsConfig.swift +82 -0
  41. package/ios/casting/THEOplayerRCTCastAPI+Airplay.swift +97 -0
  42. package/ios/casting/THEOplayerRCTCastAPI+Chromecast.swift +132 -0
  43. package/ios/casting/THEOplayerRCTCastAPI.swift +53 -0
  44. package/ios/casting/THEOplayerRCTCastEventHandler.swift +124 -0
  45. package/ios/casting/THEOplayerRCTView+CastConfig.swift +47 -0
  46. package/ios/casting/THEOplayerRCTView+Casting.swift +17 -0
  47. package/ios/{THEOplayerRCTContentProtectionAPI.swift → contentprotection/THEOplayerRCTContentProtectionAPI.swift} +0 -0
  48. package/ios/{THEOplayerRCTContentProtectionAggregator.swift → contentprotection/THEOplayerRCTContentProtectionAggregator.swift} +0 -0
  49. package/ios/{THEOplayerRCTProxyContentProtectionIntegration.swift → contentprotection/THEOplayerRCTProxyContentProtectionIntegration.swift} +0 -0
  50. package/ios/{THEOplayerRCTProxyContentProtectionIntegrationFactory.swift → contentprotection/THEOplayerRCTProxyContentProtectionIntegrationFactory.swift} +0 -0
  51. package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +1 -1
  52. package/ios/custom/Frameworks/tvos/put_custom_tvos_xcframework_here.txt +2 -0
  53. package/ios/custom/react-native-theoplayer_custom.podspec +46 -0
  54. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  55. package/lib/commonjs/api/barrel.js +21 -8
  56. package/lib/commonjs/api/barrel.js.map +1 -1
  57. package/lib/commonjs/api/cast/Airplay.js +6 -0
  58. package/lib/commonjs/api/cast/Airplay.js.map +1 -0
  59. package/lib/commonjs/api/cast/CastAPI.js +6 -0
  60. package/lib/commonjs/api/cast/CastAPI.js.map +1 -0
  61. package/lib/commonjs/api/cast/CastConfiguration.js +2 -0
  62. package/lib/commonjs/api/cast/CastConfiguration.js.map +1 -0
  63. package/lib/commonjs/api/cast/CastState.js +2 -0
  64. package/lib/commonjs/api/cast/CastState.js.map +1 -0
  65. package/lib/commonjs/api/cast/Chromecast.js +6 -0
  66. package/lib/commonjs/api/cast/Chromecast.js.map +1 -0
  67. package/lib/commonjs/api/cast/barrel.js +71 -0
  68. package/lib/commonjs/api/cast/barrel.js.map +1 -0
  69. package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
  70. package/lib/commonjs/api/error/ChromecastError.js +2 -0
  71. package/lib/commonjs/api/error/ChromecastError.js.map +1 -0
  72. package/lib/commonjs/api/error/barrel.js +13 -0
  73. package/lib/commonjs/api/error/barrel.js.map +1 -1
  74. package/lib/commonjs/api/event/CastEvent.js +21 -0
  75. package/lib/commonjs/api/event/CastEvent.js.map +1 -0
  76. package/lib/commonjs/api/event/barrel.js +25 -12
  77. package/lib/commonjs/api/event/barrel.js.map +1 -1
  78. package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
  79. package/lib/commonjs/api/source/barrel.js +13 -0
  80. package/lib/commonjs/api/source/barrel.js.map +1 -1
  81. package/lib/commonjs/api/source/metadata/MetadataDescription.js +2 -0
  82. package/lib/commonjs/api/source/metadata/MetadataDescription.js.map +1 -0
  83. package/lib/commonjs/api/source/metadata/barrel.js +19 -0
  84. package/lib/commonjs/api/source/metadata/barrel.js.map +1 -0
  85. package/lib/commonjs/internal/THEOplayerView.js +16 -0
  86. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  87. package/lib/commonjs/internal/THEOplayerView.web.js +9 -0
  88. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  89. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js +34 -0
  90. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  91. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js +46 -0
  92. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  93. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js +42 -0
  94. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  95. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js +31 -0
  96. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  97. package/lib/commonjs/internal/web/stub/CastButtonStub.js +16 -0
  98. package/lib/commonjs/internal/web/stub/CastButtonStub.js.map +1 -0
  99. package/lib/module/api/THEOplayerView.js.map +1 -1
  100. package/lib/module/api/barrel.js +1 -0
  101. package/lib/module/api/barrel.js.map +1 -1
  102. package/lib/module/api/cast/Airplay.js +2 -0
  103. package/lib/module/api/cast/Airplay.js.map +1 -0
  104. package/lib/module/api/cast/CastAPI.js +2 -0
  105. package/lib/module/api/cast/CastAPI.js.map +1 -0
  106. package/lib/module/api/cast/CastConfiguration.js +2 -0
  107. package/lib/module/api/cast/CastConfiguration.js.map +1 -0
  108. package/lib/module/api/cast/CastState.js +2 -0
  109. package/lib/module/api/cast/CastState.js.map +1 -0
  110. package/lib/module/api/cast/Chromecast.js +2 -0
  111. package/lib/module/api/cast/Chromecast.js.map +1 -0
  112. package/lib/module/api/cast/barrel.js +6 -0
  113. package/lib/module/api/cast/barrel.js.map +1 -0
  114. package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
  115. package/lib/module/api/error/ChromecastError.js +2 -0
  116. package/lib/module/api/error/ChromecastError.js.map +1 -0
  117. package/lib/module/api/error/barrel.js +1 -0
  118. package/lib/module/api/error/barrel.js.map +1 -1
  119. package/lib/module/api/event/CastEvent.js +14 -0
  120. package/lib/module/api/event/CastEvent.js.map +1 -0
  121. package/lib/module/api/event/barrel.js +2 -1
  122. package/lib/module/api/event/barrel.js.map +1 -1
  123. package/lib/module/api/source/SourceDescription.js.map +1 -1
  124. package/lib/module/api/source/barrel.js +1 -0
  125. package/lib/module/api/source/barrel.js.map +1 -1
  126. package/lib/module/api/source/metadata/MetadataDescription.js +2 -0
  127. package/lib/module/api/source/metadata/MetadataDescription.js.map +1 -0
  128. package/lib/module/api/source/metadata/barrel.js +2 -0
  129. package/lib/module/api/source/metadata/barrel.js.map +1 -0
  130. package/lib/module/internal/THEOplayerView.js +15 -0
  131. package/lib/module/internal/THEOplayerView.js.map +1 -1
  132. package/lib/module/internal/THEOplayerView.web.js +8 -0
  133. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  134. package/lib/module/internal/cast/THEOplayerNativeAirplay.js +24 -0
  135. package/lib/module/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  136. package/lib/module/internal/cast/THEOplayerNativeCastApi.js +34 -0
  137. package/lib/module/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  138. package/lib/module/internal/cast/THEOplayerNativeChromecast.js +32 -0
  139. package/lib/module/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  140. package/lib/module/internal/cast/THEOplayerWebCastApi.js +22 -0
  141. package/lib/module/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  142. package/lib/module/internal/web/stub/CastButtonStub.js +6 -0
  143. package/lib/module/internal/web/stub/CastButtonStub.js.map +1 -0
  144. package/lib/typescript/lib/commonjs/api/cast/Airplay.d.ts +1 -0
  145. package/lib/typescript/lib/commonjs/api/cast/CastAPI.d.ts +1 -0
  146. package/lib/typescript/lib/commonjs/api/cast/CastConfiguration.d.ts +0 -0
  147. package/lib/typescript/lib/commonjs/api/cast/CastState.d.ts +0 -0
  148. package/lib/typescript/lib/commonjs/api/cast/Chromecast.d.ts +1 -0
  149. package/lib/typescript/lib/commonjs/api/cast/barrel.d.ts +1 -0
  150. package/lib/typescript/lib/commonjs/api/error/ChromecastError.d.ts +0 -0
  151. package/lib/typescript/lib/commonjs/api/event/CastEvent.d.ts +2 -0
  152. package/lib/typescript/lib/commonjs/api/source/metadata/MetadataDescription.d.ts +0 -0
  153. package/lib/typescript/lib/commonjs/api/source/metadata/barrel.d.ts +1 -0
  154. package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +3 -0
  155. package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +3 -0
  156. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  157. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeCastApi.d.ts +12 -0
  158. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  159. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerWebCastApi.d.ts +8 -0
  160. package/lib/typescript/lib/commonjs/internal/web/stub/CastButtonStub.d.ts +2 -0
  161. package/lib/typescript/lib/module/api/barrel.d.ts +1 -0
  162. package/lib/typescript/lib/module/api/cast/Airplay.d.ts +1 -0
  163. package/lib/typescript/lib/module/api/cast/CastAPI.d.ts +1 -0
  164. package/lib/typescript/lib/module/api/cast/CastConfiguration.d.ts +0 -0
  165. package/lib/typescript/lib/module/api/cast/CastState.d.ts +0 -0
  166. package/lib/typescript/lib/module/api/cast/Chromecast.d.ts +1 -0
  167. package/lib/typescript/lib/module/api/cast/barrel.d.ts +3 -0
  168. package/lib/typescript/lib/module/api/error/ChromecastError.d.ts +0 -0
  169. package/lib/typescript/lib/module/api/event/CastEvent.d.ts +1 -0
  170. package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -1
  171. package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
  172. package/lib/typescript/lib/module/api/source/metadata/MetadataDescription.d.ts +0 -0
  173. package/lib/typescript/lib/module/api/source/metadata/barrel.d.ts +1 -0
  174. package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +3 -0
  175. package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +3 -0
  176. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeAirplay.d.ts +8 -0
  177. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeCastApi.d.ts +11 -0
  178. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeChromecast.d.ts +10 -0
  179. package/lib/typescript/lib/module/internal/cast/THEOplayerWebCastApi.d.ts +7 -0
  180. package/lib/typescript/lib/module/internal/web/stub/CastButtonStub.d.ts +2 -0
  181. package/lib/typescript/src/api/THEOplayerView.d.ts +10 -0
  182. package/lib/typescript/src/api/barrel.d.ts +1 -0
  183. package/lib/typescript/src/api/cast/Airplay.d.ts +27 -0
  184. package/lib/typescript/src/api/cast/CastAPI.d.ts +25 -0
  185. package/lib/typescript/src/api/cast/CastConfiguration.d.ts +41 -0
  186. package/lib/typescript/src/api/cast/CastState.d.ts +10 -0
  187. package/lib/typescript/src/api/cast/Chromecast.d.ts +39 -0
  188. package/lib/typescript/src/api/cast/barrel.d.ts +5 -0
  189. package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +6 -1
  190. package/lib/typescript/src/api/error/ChromecastError.d.ts +34 -0
  191. package/lib/typescript/src/api/error/barrel.d.ts +1 -0
  192. package/lib/typescript/src/api/event/CastEvent.d.ts +21 -0
  193. package/lib/typescript/src/api/event/barrel.d.ts +2 -1
  194. package/lib/typescript/src/api/source/SourceDescription.d.ts +7 -0
  195. package/lib/typescript/src/api/source/barrel.d.ts +1 -0
  196. package/lib/typescript/src/api/source/metadata/MetadataDescription.d.ts +12 -0
  197. package/lib/typescript/src/api/source/metadata/barrel.d.ts +1 -0
  198. package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
  199. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +3 -1
  200. package/lib/typescript/src/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  201. package/lib/typescript/src/internal/cast/THEOplayerNativeCastApi.d.ts +10 -0
  202. package/lib/typescript/src/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  203. package/lib/typescript/src/internal/cast/THEOplayerWebCastApi.d.ts +9 -0
  204. package/lib/typescript/src/internal/web/stub/CastButtonStub.d.ts +3 -0
  205. package/package.json +2 -2
  206. package/react-native-theoplayer.podspec +2 -2
  207. package/src/api/THEOplayerView.ts +12 -0
  208. package/src/api/barrel.ts +1 -0
  209. package/src/api/cast/Airplay.ts +31 -0
  210. package/src/api/cast/CastAPI.ts +30 -0
  211. package/src/api/cast/CastConfiguration.ts +44 -0
  212. package/src/api/cast/CastState.ts +10 -0
  213. package/src/api/cast/Chromecast.ts +45 -0
  214. package/src/api/cast/barrel.ts +5 -0
  215. package/src/api/config/PlayerConfiguration.ts +7 -1
  216. package/src/api/error/ChromecastError.ts +46 -0
  217. package/src/api/error/barrel.ts +1 -0
  218. package/src/api/event/CastEvent.ts +45 -0
  219. package/src/api/event/barrel.ts +2 -1
  220. package/src/api/source/SourceDescription.ts +8 -0
  221. package/src/api/source/barrel.ts +1 -0
  222. package/src/api/source/metadata/MetadataDescription.ts +13 -0
  223. package/src/api/source/metadata/barrel.ts +1 -0
  224. package/src/internal/THEOplayerView.tsx +17 -0
  225. package/src/internal/THEOplayerView.web.tsx +8 -1
  226. package/src/internal/cast/THEOplayerNativeAirplay.ts +22 -0
  227. package/src/internal/cast/THEOplayerNativeCastApi.ts +28 -0
  228. package/src/internal/cast/THEOplayerNativeChromecast.ts +30 -0
  229. package/src/internal/cast/THEOplayerWebCastApi.ts +21 -0
  230. package/src/internal/web/stub/CastButtonStub.tsx +7 -0
  231. package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +0 -70
  232. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +0 -32
  233. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +0 -525
  234. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +0 -127
  235. package/android/src/main/java/com/theoplayer/SourceHelper.java +0 -362
  236. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +0 -578
  237. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +0 -92
  238. package/android/src/main/java/com/theoplayer/ads/AdInfo.java +0 -168
  239. package/android/src/main/java/com/theoplayer/ads/AdsModule.java +0 -152
  240. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +0 -11
  241. package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +0 -11
  242. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +0 -54
  243. package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +0 -40
  244. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +0 -11
  245. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +0 -12
  246. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +0 -234
  247. package/android/src/main/java/com/theoplayer/util/ViewResolver.java +0 -42
  248. 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 SD_PROP_ADS: String = "ads"
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
- var adsDescriptions: [AdDescription]?
111
-
112
- #if ADS && GOOGLE_IMA
113
- if let ads = sourceData[SD_PROP_ADS] {
114
- adsDescriptions = []
115
- // case: array of ads objects
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
- // 5. construct and return SourceDescription
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: nil) // TODO
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
- #if ADS && GOOGLE_DAI
173
- // check for alternative Google DAI SSAI
174
- if let ssaiData = typedSourceData[SD_PROP_SSAI] as? [String:Any] {
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
- #endif
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 GoogleImaAdDescription. This requires an ads property in the RN source description.
247
- - returns: a THEOplayer GoogleImaAdDescription
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 buildAdDescription(_ adsData: [String:Any]) -> AdDescription? {
250
- if let integration = adsData[SD_PROP_INTEGRATION] as? String,
251
- integration == AdIntegration.google_ima._rawValue {
252
- // timeOffset can be Int or String: 10, "01:32:54.78", "1234.56", "start", "end", "10%", ...
253
- let timeOffset = adsData[SD_PROP_TIME_OFFSET] as? String ?? String(adsData[SD_PROP_TIME_OFFSET] as? Int ?? 0)
254
- var srcString: String?
255
- if let sourcesData = adsData[SD_PROP_SOURCES] as? [String:Any] {
256
- srcString = sourcesData[SD_PROP_SRC] as? String
257
- } else if let sourcesData = adsData[SD_PROP_SOURCES] as? String {
258
- srcString = sourcesData
259
- }
260
- if let src = srcString {
261
- return GoogleImaAdDescription(src: src, timeOffset: timeOffset)
262
- } else {
263
- if DEBUG_SOURCE_DESCRIPTION_BUIDER { print("[NATIVE] AdDescription requires 'src' property in 'ads' description.") }
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
- if DEBUG_SOURCE_DESCRIPTION_BUIDER { print("[NATIVE] We currently require and only support the 'google-ima' integration in the 'ads' description.") }
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
- // integration
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 certifiate into certificteUrl with marker prefix (also supported by THEOplayer Web SDK
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 certifiate into certificteUrl with marker prefix (also supported by THEOplayer Web SDK
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
- // THEOplayerRCTViewTextTrackEventHandler.swift
1
+ // THEOplayerRCTTextTrackEventHandler.swift
2
2
 
3
3
  import Foundation
4
4
  import THEOplayerSDK
5
5
 
6
- class THEOplayerRCTViewTextTrackEventHandler {
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" : THEOplayerRCTMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
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" : THEOplayerRCTMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
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" : THEOplayerRCTMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
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": THEOplayerRCTMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: event.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": THEOplayerRCTMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: event.cue)
147
+ "cue": THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: event.cue)
148
148
  ])
149
149
  }
150
150
  }
@@ -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 THEOplayerRCTMetadataAggregator {
29
+ class THEOplayerRCTTrackMetadataAggregator {
30
30
 
31
- class func aggregateMetadata(player: THEOplayer) -> [String:Any] {
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 : THEOplayerRCTMetadataAggregator.aggregatedTextTrackListInfo(textTracks: textTracks),
37
- EVENT_PROP_AUDIO_TRACKS : THEOplayerRCTMetadataAggregator.aggregatedAudioTrackListInfo(audioTracks: audioTracks),
38
- EVENT_PROP_VIDEO_TRACKS : THEOplayerRCTMetadataAggregator.aggregatedVideoTrackListInfo(videoTracks: videoTracks),
39
- EVENT_PROP_SELECTED_TEXT_TRACK: THEOplayerRCTMetadataAggregator.selectedTextTrack(textTracks: textTracks),
40
- EVENT_PROP_SELECTED_AUDIO_TRACK: THEOplayerRCTMetadataAggregator.selectedAudioTrack(audioTracks: audioTracks),
41
- EVENT_PROP_SELECTED_VIDEO_TRACK: THEOplayerRCTMetadataAggregator.selectedVideoTrack(videoTracks: videoTracks),
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(THEOplayerRCTMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack))
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(THEOplayerRCTMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: cue))
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(THEOplayerRCTMetadataAggregator.aggregatedAudioTrackInfo(audioTrack: audioTrack))
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(THEOplayerRCTMetadataAggregator.aggregatedVideoTrackInfo(videoTrack: videoTrack))
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
- private var player: THEOplayer?
10
- private var mainEventHandler: THEOplayerRCTViewMainEventHandler
11
- private var textTrackEventHandler: THEOplayerRCTViewTextTrackEventHandler
12
- private var mediaTrackEventHandler: THEOplayerRCTViewMediaTrackEventHandler
13
- private var adEventHandler: THEOplayerRCTViewAdEventHandler
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 = false
22
- private var muted: Bool = true
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 = THEOplayerRCTViewMainEventHandler()
41
- self.textTrackEventHandler = THEOplayerRCTViewTextTrackEventHandler()
42
- self.mediaTrackEventHandler = THEOplayerRCTViewMediaTrackEventHandler()
43
- self.adEventHandler = THEOplayerRCTViewAdEventHandler()
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
- // reset player for new source
106
- if self.player != nil {
107
- self.player?.destroy()
108
- self.player = nil
109
- }
110
- DispatchQueue.main.async {
111
- self.initPlayer()
112
- if let player = self.player {
113
- // couple player instance to event handlers
114
- self.mainEventHandler.setPlayer(player)
115
- self.textTrackEventHandler.setPlayer(player)
116
- self.mediaTrackEventHandler.setPlayer(player)
117
- self.adEventHandler.setPlayer(player)
118
- // couple player instance to view
119
- player.addAsSubview(of: self)
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(tvOS)
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.initAdsConfiguration(),
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
- return nil
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
- #if ADS && (GOOGLE_IMA || GOOGLE_DAI)
173
- if let adsConfig = configDict["ads"] as? NSDictionary {
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:)