react-native-theoplayer 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +54 -18
  4. package/android/build.gradle +90 -0
  5. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  6. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  7. package/android/gradlew +185 -0
  8. package/android/gradlew.bat +89 -0
  9. package/android/src/main/AndroidManifest.xml +6 -0
  10. package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +30 -0
  11. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +27 -0
  12. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +420 -0
  13. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +114 -0
  14. package/android/src/main/java/com/theoplayer/SourceHelper.java +224 -0
  15. package/android/src/main/java/com/theoplayer/TimeUpdateRate.java +8 -0
  16. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +410 -0
  17. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +11 -0
  18. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +11 -0
  19. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +204 -0
  20. package/ios/THEOplayerRCTBridge.m +46 -0
  21. package/ios/THEOplayerRCTDebug.swift +16 -0
  22. package/ios/THEOplayerRCTMetadataAggregator.swift +169 -0
  23. package/ios/THEOplayerRCTView.swift +422 -0
  24. package/ios/THEOplayerRCTViewEventHandler.swift +493 -0
  25. package/ios/THEOplayerRCTViewManager.swift +23 -0
  26. package/ios/Theoplayer-Bridging-Header.h +5 -0
  27. package/ios/Theoplayer.xcodeproj/project.pbxproj +296 -0
  28. package/lib/commonjs/api/THEOplayerView.js +6 -0
  29. package/lib/commonjs/api/THEOplayerView.js.map +1 -0
  30. package/lib/commonjs/api/barrel.js +97 -0
  31. package/lib/commonjs/api/barrel.js.map +1 -0
  32. package/lib/commonjs/api/config/PlayerConfiguration.js +2 -0
  33. package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -0
  34. package/lib/commonjs/api/config/barrel.js +19 -0
  35. package/lib/commonjs/api/config/barrel.js.map +1 -0
  36. package/lib/commonjs/api/error/PlayerError.js +2 -0
  37. package/lib/commonjs/api/error/PlayerError.js.map +1 -0
  38. package/lib/commonjs/api/error/barrel.js +19 -0
  39. package/lib/commonjs/api/error/barrel.js.map +1 -0
  40. package/lib/commonjs/api/event/PlayerEvent.js +6 -0
  41. package/lib/commonjs/api/event/PlayerEvent.js.map +1 -0
  42. package/lib/commonjs/api/event/TrackEvent.js +22 -0
  43. package/lib/commonjs/api/event/TrackEvent.js.map +1 -0
  44. package/lib/commonjs/api/event/barrel.js +32 -0
  45. package/lib/commonjs/api/event/barrel.js.map +1 -0
  46. package/lib/commonjs/api/source/SourceDescription.js +6 -0
  47. package/lib/commonjs/api/source/SourceDescription.js.map +1 -0
  48. package/lib/commonjs/api/source/ads/Ads.js +2 -0
  49. package/lib/commonjs/api/source/ads/Ads.js.map +1 -0
  50. package/lib/commonjs/api/source/barrel.js +58 -0
  51. package/lib/commonjs/api/source/barrel.js.map +1 -0
  52. package/lib/commonjs/api/source/dash/DashPlaybackConfiguration.js +2 -0
  53. package/lib/commonjs/api/source/dash/DashPlaybackConfiguration.js.map +1 -0
  54. package/lib/commonjs/api/source/dash/barrel.js +19 -0
  55. package/lib/commonjs/api/source/dash/barrel.js.map +1 -0
  56. package/lib/commonjs/api/source/drm/DRMConfiguration.js +2 -0
  57. package/lib/commonjs/api/source/drm/DRMConfiguration.js.map +1 -0
  58. package/lib/commonjs/api/source/drm/barrel.js +19 -0
  59. package/lib/commonjs/api/source/drm/barrel.js.map +1 -0
  60. package/lib/commonjs/api/source/hls/HlsPlaybackConfiguration.js +2 -0
  61. package/lib/commonjs/api/source/hls/HlsPlaybackConfiguration.js.map +1 -0
  62. package/lib/commonjs/api/source/hls/barrel.js +19 -0
  63. package/lib/commonjs/api/source/hls/barrel.js.map +1 -0
  64. package/lib/commonjs/api/timeranges/TimeRange.js +2 -0
  65. package/lib/commonjs/api/timeranges/TimeRange.js.map +1 -0
  66. package/lib/commonjs/api/timeranges/barrel.js +19 -0
  67. package/lib/commonjs/api/timeranges/barrel.js.map +1 -0
  68. package/lib/commonjs/api/track/MediaTrack.js +6 -0
  69. package/lib/commonjs/api/track/MediaTrack.js.map +1 -0
  70. package/lib/commonjs/api/track/Quality.js +2 -0
  71. package/lib/commonjs/api/track/Quality.js.map +1 -0
  72. package/lib/commonjs/api/track/TextTrack.js +72 -0
  73. package/lib/commonjs/api/track/TextTrack.js.map +1 -0
  74. package/lib/commonjs/api/track/TextTrackCue.js +2 -0
  75. package/lib/commonjs/api/track/TextTrackCue.js.map +1 -0
  76. package/lib/commonjs/api/track/Track.js +2 -0
  77. package/lib/commonjs/api/track/Track.js.map +1 -0
  78. package/lib/commonjs/api/track/barrel.js +71 -0
  79. package/lib/commonjs/api/track/barrel.js.map +1 -0
  80. package/lib/commonjs/index.js +31 -0
  81. package/lib/commonjs/index.js.map +1 -0
  82. package/lib/commonjs/internal/THEOplayerView.js +274 -0
  83. package/lib/commonjs/internal/THEOplayerView.js.map +1 -0
  84. package/lib/commonjs/internal/THEOplayerView.style.js +22 -0
  85. package/lib/commonjs/internal/THEOplayerView.style.js.map +1 -0
  86. package/lib/commonjs/internal/THEOplayerView.web.js +512 -0
  87. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -0
  88. package/lib/commonjs/internal/web/TrackUtils.js +68 -0
  89. package/lib/commonjs/internal/web/TrackUtils.js.map +1 -0
  90. package/lib/module/api/THEOplayerView.js +2 -0
  91. package/lib/module/api/THEOplayerView.js.map +1 -0
  92. package/lib/module/api/barrel.js +8 -0
  93. package/lib/module/api/barrel.js.map +1 -0
  94. package/lib/module/api/config/PlayerConfiguration.js +2 -0
  95. package/lib/module/api/config/PlayerConfiguration.js.map +1 -0
  96. package/lib/module/api/config/barrel.js +2 -0
  97. package/lib/module/api/config/barrel.js.map +1 -0
  98. package/lib/module/api/error/PlayerError.js +2 -0
  99. package/lib/module/api/error/PlayerError.js.map +1 -0
  100. package/lib/module/api/error/barrel.js +2 -0
  101. package/lib/module/api/error/barrel.js.map +1 -0
  102. package/lib/module/api/event/PlayerEvent.js +2 -0
  103. package/lib/module/api/event/PlayerEvent.js.map +1 -0
  104. package/lib/module/api/event/TrackEvent.js +14 -0
  105. package/lib/module/api/event/TrackEvent.js.map +1 -0
  106. package/lib/module/api/event/barrel.js +3 -0
  107. package/lib/module/api/event/barrel.js.map +1 -0
  108. package/lib/module/api/source/SourceDescription.js +2 -0
  109. package/lib/module/api/source/SourceDescription.js.map +1 -0
  110. package/lib/module/api/source/ads/Ads.js +2 -0
  111. package/lib/module/api/source/ads/Ads.js.map +1 -0
  112. package/lib/module/api/source/barrel.js +5 -0
  113. package/lib/module/api/source/barrel.js.map +1 -0
  114. package/lib/module/api/source/dash/DashPlaybackConfiguration.js +2 -0
  115. package/lib/module/api/source/dash/DashPlaybackConfiguration.js.map +1 -0
  116. package/lib/module/api/source/dash/barrel.js +2 -0
  117. package/lib/module/api/source/dash/barrel.js.map +1 -0
  118. package/lib/module/api/source/drm/DRMConfiguration.js +2 -0
  119. package/lib/module/api/source/drm/DRMConfiguration.js.map +1 -0
  120. package/lib/module/api/source/drm/barrel.js +2 -0
  121. package/lib/module/api/source/drm/barrel.js.map +1 -0
  122. package/lib/module/api/source/hls/HlsPlaybackConfiguration.js +2 -0
  123. package/lib/module/api/source/hls/HlsPlaybackConfiguration.js.map +1 -0
  124. package/lib/module/api/source/hls/barrel.js +2 -0
  125. package/lib/module/api/source/hls/barrel.js.map +1 -0
  126. package/lib/module/api/timeranges/TimeRange.js +2 -0
  127. package/lib/module/api/timeranges/TimeRange.js.map +1 -0
  128. package/lib/module/api/timeranges/barrel.js +2 -0
  129. package/lib/module/api/timeranges/barrel.js.map +1 -0
  130. package/lib/module/api/track/MediaTrack.js +2 -0
  131. package/lib/module/api/track/MediaTrack.js.map +1 -0
  132. package/lib/module/api/track/Quality.js +2 -0
  133. package/lib/module/api/track/Quality.js.map +1 -0
  134. package/lib/module/api/track/TextTrack.js +47 -0
  135. package/lib/module/api/track/TextTrack.js.map +1 -0
  136. package/lib/module/api/track/TextTrackCue.js +2 -0
  137. package/lib/module/api/track/TextTrackCue.js.map +1 -0
  138. package/lib/module/api/track/Track.js +2 -0
  139. package/lib/module/api/track/Track.js.map +1 -0
  140. package/lib/module/api/track/barrel.js +6 -0
  141. package/lib/module/api/track/barrel.js.map +1 -0
  142. package/lib/module/index.js +3 -0
  143. package/lib/module/index.js.map +1 -0
  144. package/lib/module/internal/THEOplayerView.js +256 -0
  145. package/lib/module/internal/THEOplayerView.js.map +1 -0
  146. package/lib/module/internal/THEOplayerView.style.js +12 -0
  147. package/lib/module/internal/THEOplayerView.style.js.map +1 -0
  148. package/lib/module/internal/THEOplayerView.web.js +495 -0
  149. package/lib/module/internal/THEOplayerView.web.js.map +1 -0
  150. package/lib/module/internal/web/TrackUtils.js +57 -0
  151. package/lib/module/internal/web/TrackUtils.js.map +1 -0
  152. package/lib/typescript/babel.config.d.ts +1 -0
  153. package/lib/typescript/lib/commonjs/api/THEOplayerView.d.ts +1 -0
  154. package/lib/typescript/lib/commonjs/api/barrel.d.ts +1 -0
  155. package/lib/typescript/lib/commonjs/api/config/PlayerConfiguration.d.ts +0 -0
  156. package/lib/typescript/lib/commonjs/api/config/barrel.d.ts +1 -0
  157. package/lib/typescript/lib/commonjs/api/error/PlayerError.d.ts +0 -0
  158. package/lib/typescript/lib/commonjs/api/error/barrel.d.ts +1 -0
  159. package/lib/typescript/lib/commonjs/api/event/PlayerEvent.d.ts +1 -0
  160. package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +5 -0
  161. package/lib/typescript/lib/commonjs/api/event/barrel.d.ts +1 -0
  162. package/lib/typescript/lib/commonjs/api/source/SourceDescription.d.ts +1 -0
  163. package/lib/typescript/lib/commonjs/api/source/ads/Ads.d.ts +0 -0
  164. package/lib/typescript/lib/commonjs/api/source/barrel.d.ts +1 -0
  165. package/lib/typescript/lib/commonjs/api/source/dash/DashPlaybackConfiguration.d.ts +0 -0
  166. package/lib/typescript/lib/commonjs/api/source/dash/barrel.d.ts +1 -0
  167. package/lib/typescript/lib/commonjs/api/source/drm/DRMConfiguration.d.ts +0 -0
  168. package/lib/typescript/lib/commonjs/api/source/drm/barrel.d.ts +1 -0
  169. package/lib/typescript/lib/commonjs/api/source/hls/HlsPlaybackConfiguration.d.ts +0 -0
  170. package/lib/typescript/lib/commonjs/api/source/hls/barrel.d.ts +1 -0
  171. package/lib/typescript/lib/commonjs/api/timeranges/TimeRange.d.ts +0 -0
  172. package/lib/typescript/lib/commonjs/api/timeranges/barrel.d.ts +1 -0
  173. package/lib/typescript/lib/commonjs/api/track/MediaTrack.d.ts +1 -0
  174. package/lib/typescript/lib/commonjs/api/track/Quality.d.ts +0 -0
  175. package/lib/typescript/lib/commonjs/api/track/TextTrack.d.ts +21 -0
  176. package/lib/typescript/lib/commonjs/api/track/TextTrackCue.d.ts +0 -0
  177. package/lib/typescript/lib/commonjs/api/track/Track.d.ts +0 -0
  178. package/lib/typescript/lib/commonjs/api/track/barrel.d.ts +1 -0
  179. package/lib/typescript/lib/commonjs/index.d.ts +3 -0
  180. package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +14 -0
  181. package/lib/typescript/lib/commonjs/internal/THEOplayerView.style.d.ts +12 -0
  182. package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +17 -0
  183. package/lib/typescript/lib/commonjs/internal/web/TrackUtils.d.ts +30 -0
  184. package/lib/typescript/lib/module/api/THEOplayerView.d.ts +1 -0
  185. package/lib/typescript/lib/module/api/barrel.d.ts +7 -0
  186. package/lib/typescript/lib/module/api/config/PlayerConfiguration.d.ts +0 -0
  187. package/lib/typescript/lib/module/api/config/barrel.d.ts +1 -0
  188. package/lib/typescript/lib/module/api/error/PlayerError.d.ts +0 -0
  189. package/lib/typescript/lib/module/api/error/barrel.d.ts +1 -0
  190. package/lib/typescript/lib/module/api/event/PlayerEvent.d.ts +1 -0
  191. package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
  192. package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -0
  193. package/lib/typescript/lib/module/api/source/SourceDescription.d.ts +1 -0
  194. package/lib/typescript/lib/module/api/source/ads/Ads.d.ts +0 -0
  195. package/lib/typescript/lib/module/api/source/barrel.d.ts +4 -0
  196. package/lib/typescript/lib/module/api/source/dash/DashPlaybackConfiguration.d.ts +0 -0
  197. package/lib/typescript/lib/module/api/source/dash/barrel.d.ts +1 -0
  198. package/lib/typescript/lib/module/api/source/drm/DRMConfiguration.d.ts +0 -0
  199. package/lib/typescript/lib/module/api/source/drm/barrel.d.ts +1 -0
  200. package/lib/typescript/lib/module/api/source/hls/HlsPlaybackConfiguration.d.ts +0 -0
  201. package/lib/typescript/lib/module/api/source/hls/barrel.d.ts +1 -0
  202. package/lib/typescript/lib/module/api/timeranges/TimeRange.d.ts +0 -0
  203. package/lib/typescript/lib/module/api/timeranges/barrel.d.ts +1 -0
  204. package/lib/typescript/lib/module/api/track/MediaTrack.d.ts +1 -0
  205. package/lib/typescript/lib/module/api/track/Quality.d.ts +0 -0
  206. package/lib/typescript/lib/module/api/track/TextTrack.d.ts +20 -0
  207. package/lib/typescript/lib/module/api/track/TextTrackCue.d.ts +0 -0
  208. package/lib/typescript/lib/module/api/track/Track.d.ts +0 -0
  209. package/lib/typescript/lib/module/api/track/barrel.d.ts +2 -0
  210. package/lib/typescript/lib/module/index.d.ts +2 -0
  211. package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +9 -0
  212. package/lib/typescript/lib/module/internal/THEOplayerView.style.d.ts +11 -0
  213. package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +10 -0
  214. package/lib/typescript/lib/module/internal/web/TrackUtils.d.ts +29 -0
  215. package/lib/typescript/src/api/THEOplayerView.d.ts +178 -0
  216. package/lib/typescript/src/api/barrel.d.ts +7 -0
  217. package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +14 -0
  218. package/lib/typescript/src/api/config/barrel.d.ts +1 -0
  219. package/lib/typescript/src/api/error/PlayerError.d.ts +4 -0
  220. package/lib/typescript/src/api/error/barrel.d.ts +1 -0
  221. package/lib/typescript/src/api/event/PlayerEvent.d.ts +56 -0
  222. package/lib/typescript/src/api/event/TrackEvent.d.ts +46 -0
  223. package/lib/typescript/src/api/event/barrel.d.ts +2 -0
  224. package/lib/typescript/src/api/source/SourceDescription.d.ts +268 -0
  225. package/lib/typescript/src/api/source/ads/Ads.d.ts +94 -0
  226. package/lib/typescript/src/api/source/barrel.d.ts +4 -0
  227. package/lib/typescript/src/api/source/dash/DashPlaybackConfiguration.d.ts +44 -0
  228. package/lib/typescript/src/api/source/dash/barrel.d.ts +1 -0
  229. package/lib/typescript/src/api/source/drm/DRMConfiguration.d.ts +262 -0
  230. package/lib/typescript/src/api/source/drm/barrel.d.ts +1 -0
  231. package/lib/typescript/src/api/source/hls/HlsPlaybackConfiguration.d.ts +37 -0
  232. package/lib/typescript/src/api/source/hls/barrel.d.ts +1 -0
  233. package/lib/typescript/src/api/timeranges/TimeRange.d.ts +4 -0
  234. package/lib/typescript/src/api/timeranges/barrel.d.ts +1 -0
  235. package/lib/typescript/src/api/track/MediaTrack.d.ts +55 -0
  236. package/lib/typescript/src/api/track/Quality.d.ts +79 -0
  237. package/lib/typescript/src/api/track/TextTrack.d.ts +86 -0
  238. package/lib/typescript/src/api/track/TextTrackCue.d.ts +38 -0
  239. package/lib/typescript/src/api/track/Track.d.ts +43 -0
  240. package/lib/typescript/src/api/track/barrel.d.ts +5 -0
  241. package/lib/typescript/src/index.d.ts +2 -0
  242. package/lib/typescript/src/internal/THEOplayerView.d.ts +71 -0
  243. package/lib/typescript/src/internal/THEOplayerView.style.d.ts +11 -0
  244. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +22 -0
  245. package/lib/typescript/src/internal/web/TrackUtils.d.ts +5 -0
  246. package/package.json +115 -9
  247. package/react-native-theoplayer.podspec +20 -0
  248. package/src/api/THEOplayerView.ts +221 -0
  249. package/src/api/barrel.ts +7 -0
  250. package/src/api/config/PlayerConfiguration.ts +16 -0
  251. package/src/api/config/barrel.ts +1 -0
  252. package/src/api/error/PlayerError.ts +4 -0
  253. package/src/api/error/barrel.ts +1 -0
  254. package/src/api/event/PlayerEvent.ts +66 -0
  255. package/src/api/event/TrackEvent.ts +55 -0
  256. package/src/api/event/barrel.ts +2 -0
  257. package/src/api/source/SourceDescription.ts +292 -0
  258. package/src/api/source/ads/Ads.ts +101 -0
  259. package/src/api/source/barrel.ts +4 -0
  260. package/src/api/source/dash/DashPlaybackConfiguration.ts +45 -0
  261. package/src/api/source/dash/barrel.ts +1 -0
  262. package/src/api/source/drm/DRMConfiguration.ts +287 -0
  263. package/src/api/source/drm/barrel.ts +1 -0
  264. package/src/api/source/hls/HlsPlaybackConfiguration.ts +38 -0
  265. package/src/api/source/hls/barrel.ts +1 -0
  266. package/src/api/timeranges/TimeRange.ts +5 -0
  267. package/src/api/timeranges/barrel.ts +1 -0
  268. package/src/api/track/MediaTrack.ts +65 -0
  269. package/src/api/track/Quality.ts +91 -0
  270. package/src/api/track/TextTrack.ts +133 -0
  271. package/src/api/track/TextTrackCue.ts +42 -0
  272. package/src/api/track/Track.ts +47 -0
  273. package/src/api/track/barrel.ts +5 -0
  274. package/src/index.tsx +2 -0
  275. package/src/internal/THEOplayerView.style.ts +12 -0
  276. package/src/internal/THEOplayerView.tsx +301 -0
  277. package/src/internal/THEOplayerView.web.tsx +399 -0
  278. package/src/internal/web/TrackUtils.ts +44 -0
  279. package/.gitattributes +0 -1
  280. package/index.js +0 -5
  281. package/ios/IOSNativeToast.h +0 -18
  282. package/ios/IOSNativeToast.m +0 -49
  283. package/ios/RNTheoplayer.h +0 -11
  284. package/ios/RNTheoplayer.m +0 -15
  285. package/ios/RNTheoplayer.podspec +0 -23
  286. package/ios/RNTheoplayer.xcodeproj/project.pbxproj +0 -417
  287. package/ios/RNTheoplayer.xcworkspace/contents.xcworkspacedata +0 -9
@@ -0,0 +1,422 @@
1
+ // THEOplayerRCTView.swift
2
+
3
+ import Foundation
4
+ import UIKit
5
+ import THEOplayerSDK
6
+
7
+ class THEOplayerRCTView: UIView {
8
+ // MARK: Members
9
+ private var player: THEOplayer?
10
+ private var eventHandler: THEOplayerRCTViewEventHandler
11
+
12
+ // MARK: Bridged props
13
+ private var src: SourceDescription?
14
+ private var license: String?
15
+ private var licenseUrl: String?
16
+ private var chromeless: Bool = true
17
+ private var config: THEOplayerConfiguration?
18
+ private var paused: Bool = false
19
+ private var muted: Bool = true
20
+ private var playbackRate: Double = 1.0
21
+ private var selectedTextTrackUid: Int = 0
22
+ private var selectedVideoTrackUid: Int = 0
23
+ private var selectedAudioTrackUid: Int = 0
24
+ private var seek: Double? = nil // in msec
25
+ private var fullscreen: Bool = false
26
+
27
+ // MARK: - Initialisation / view setup
28
+ init() {
29
+ // create an event handler to contain event props
30
+ self.eventHandler = THEOplayerRCTViewEventHandler()
31
+
32
+ super.init(frame: .zero)
33
+ }
34
+
35
+ deinit {
36
+ self.player?.destroy()
37
+ self.player = nil
38
+ }
39
+
40
+ required init?(coder aDecoder: NSCoder) {
41
+ fatalError("[NATIVE] init(coder:) has not been implemented")
42
+ }
43
+
44
+ override func layoutSubviews() {
45
+ super.layoutSubviews()
46
+ if let player = self.player {
47
+ player.frame = self.frame
48
+ player.autoresizingMask = [.flexibleBottomMargin, .flexibleHeight, .flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleWidth]
49
+ }
50
+ }
51
+
52
+ // MARK: - Property bridging
53
+ private func syncAllPlayerProps() {
54
+ // sync stored props with player instance
55
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Syncing stored props with THEOplayer instance...") }
56
+ self.syncPlayerSrc()
57
+ self.syncPlayerPaused()
58
+ self.syncPlayerMuted()
59
+ self.syncPlayerPlaybackRate()
60
+ self.syncPlayerSelectedTextTrack()
61
+ self.syncPlayerSelectedAudioTrack()
62
+ self.syncPlayerSelectedVideoTrack()
63
+ self.syncPlayerSeek()
64
+ self.syncPlayerFullscreen()
65
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] All props synced with THEOplayer instance.") }
66
+ }
67
+
68
+ // MARK: - Property bridging
69
+ @objc(setSrc:)
70
+ func setSrc(srcDict: NSDictionary) {
71
+ do {
72
+ // store sourceDescription
73
+ let data = try JSONSerialization.data(withJSONObject: srcDict)
74
+ let sourceDescription = try JSONDecoder().decode(SourceDescription.self, from: data)
75
+ self.src = sourceDescription
76
+ if DEBUG_PROP_UPDATES { print("[NATIVE] src prop updated.") }
77
+ } catch {
78
+ print(error)
79
+ }
80
+
81
+ if (self.player == nil) {
82
+ // 'lazy' init THEOplayer instance, performed on next runloop, to make sure all props have been set (license config is needed to init player)
83
+ DispatchQueue.main.async {
84
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] 'lazy' init THEOplayer intance") }
85
+ #if os(tvOS)
86
+ self.player = THEOplayer(configuration: THEOplayerConfiguration(chromeless: self.chromeless, license: self.license, licenseUrl: self.licenseUrl, pip: nil))
87
+ #else
88
+ self.player = THEOplayer(configuration: THEOplayerConfiguration(chromeless: self.chromeless, pip: nil, license: self.license, licenseUrl: self.licenseUrl))
89
+ #endif
90
+ if let player = self.player {
91
+ // couple player instance to event handler
92
+ self.eventHandler.setPlayer(player)
93
+ // couple player instance to view
94
+ player.addAsSubview(of: self)
95
+ }
96
+ self.syncAllPlayerProps()
97
+ }
98
+ } else {
99
+ self.syncPlayerSrc()
100
+ self.syncPlayerMuted()
101
+ if !self.paused {
102
+ self.player?.play()
103
+ }
104
+ }
105
+ }
106
+
107
+ private func syncPlayerSrc() {
108
+ // set sourceDescription on player
109
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Setting new source on TheoPlayer") }
110
+ if let player = self.player {
111
+ player.source = self.src
112
+ }
113
+ }
114
+
115
+ @objc(setConfig:)
116
+ func setConfig(configDict: NSDictionary) {
117
+ // store license info
118
+ self.license = configDict["license"] as? String
119
+ self.licenseUrl = configDict["licenseUrl"] as? String
120
+ self.chromeless = configDict["chromeless"] as? Bool ?? true
121
+ if DEBUG_PROP_UPDATES { print("[NATIVE] config prop updated.") }
122
+ }
123
+
124
+ @objc(setPaused:)
125
+ func setPaused(paused: Bool) {
126
+ // store paused state
127
+ self.paused = paused
128
+ if DEBUG_PROP_UPDATES { print("[NATIVE] paused prop updated.") }
129
+ // sync player state with paused prop
130
+ self.syncPlayerPaused()
131
+ }
132
+
133
+ private func syncPlayerPaused() {
134
+ if let player = self.player {
135
+ if DEBUG_THEOPLAYER_INTERACTION { print("RNView paused: \(self.paused), THEOplayer paused: \(player.paused)") }
136
+ if self.paused && !player.paused {
137
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Triggering pause on TheoPlayer") }
138
+ player.pause()
139
+ } else if !self.paused && player.paused {
140
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Triggering play on TheoPlayer") }
141
+ player.play()
142
+ }
143
+ }
144
+ }
145
+
146
+ @objc(setVolume:)
147
+ func setVolume(volume: NSNumber) {
148
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Setting volume: TheoPlayer does not handle volume changes for iOS. This is handled by the device.") }
149
+ }
150
+
151
+ @objc(setMuted:)
152
+ func setMuted(muted: Bool) {
153
+ // store muted state
154
+ self.muted = muted
155
+ if DEBUG_PROP_UPDATES { print("[NATIVE] muted prop updated.") }
156
+ // sync player state with muted prop
157
+ self.syncPlayerMuted()
158
+ }
159
+
160
+ private func syncPlayerMuted() {
161
+ if let player = self.player {
162
+ if player.muted != self.muted {
163
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Changing TheoPlayer to \(self.muted ? "muted" : "not muted")") }
164
+ player.muted = self.muted
165
+ }
166
+ }
167
+ }
168
+
169
+ @objc(setPlaybackRate:)
170
+ func setPlaybackRate(playbackRate: NSNumber) {
171
+ // store playbackRate
172
+ self.playbackRate = playbackRate.doubleValue
173
+ if DEBUG_PROP_UPDATES { print("[NATIVE] playbackRate prop updated.") }
174
+ // sync player state with playbackRate prop
175
+ self.syncPlayerPlaybackRate()
176
+ }
177
+
178
+ private func syncPlayerPlaybackRate() {
179
+ if let player = self.player {
180
+ if player.playbackRate != self.playbackRate {
181
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Setting playbackRate on TheoPlayer to \(self.playbackRate)") }
182
+ player.setPlaybackRate(self.playbackRate)
183
+ }
184
+ }
185
+ }
186
+
187
+ @objc(setSelectedTextTrack:)
188
+ func setSelectedTextTrack(selectedTextTrackUid: NSNumber) {
189
+ // store selectedTextTrackUid
190
+ self.selectedTextTrackUid = selectedTextTrackUid.intValue
191
+ if DEBUG_PROP_UPDATES { print("[NATIVE] selectedTextTrack prop updated.") }
192
+ // sync player state with selectedTextTrackUid prop
193
+ self.syncPlayerSelectedTextTrack()
194
+ }
195
+
196
+ private func syncPlayerSelectedTextTrack() {
197
+ if let player = self.player {
198
+ let textTracks: TextTrackList = player.textTracks
199
+ guard textTracks.count > 0 else {
200
+ return
201
+ }
202
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Showing textTrack \(self.selectedTextTrackUid) on TheoPlayer") }
203
+ for i in 0...textTracks.count-1 {
204
+ var textTrack: TextTrack = textTracks.get(i)
205
+ textTrack.mode = (textTrack.uid == self.selectedTextTrackUid) ? TextTrackMode.showing : TextTrackMode.disabled
206
+ }
207
+ }
208
+ }
209
+
210
+ @objc(setSelectedAudioTrack:)
211
+ func setSelectedAudioTrack(selectedAudioTrackUid: NSNumber) {
212
+ // store selectedAudioTrackUid
213
+ self.selectedAudioTrackUid = selectedAudioTrackUid.intValue
214
+ if DEBUG_PROP_UPDATES { print("[NATIVE] selectedAudioTrack prop updated.") }
215
+ // sync player state with selectedAudioTrackUid prop
216
+ self.syncPlayerSelectedAudioTrack()
217
+ }
218
+
219
+ private func syncPlayerSelectedAudioTrack() {
220
+ if let player = self.player {
221
+ let audioTracks: AudioTrackList = player.audioTracks
222
+ guard audioTracks.count > 0 else {
223
+ return
224
+ }
225
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Enabling audioTrack \(self.selectedAudioTrackUid) on TheoPlayer") }
226
+ for i in 0...audioTracks.count-1 {
227
+ var audioTrack: MediaTrack = audioTracks.get(i)
228
+ audioTrack.enabled = (audioTrack.uid == self.selectedAudioTrackUid)
229
+ }
230
+ }
231
+ }
232
+
233
+ @objc(setSelectedVideoTrack:)
234
+ func setSelectedVideoTrack(selectedVideoTrackUid: NSNumber) {
235
+ // store selectedVideoTrackUid
236
+ self.selectedVideoTrackUid = selectedVideoTrackUid.intValue
237
+ if DEBUG_PROP_UPDATES { print("[NATIVE] selectedVideoTrack prop updated.") }
238
+ // sync player state with selectedVideoTrackUid prop
239
+ self.syncPlayerSelectedVideoTrack()
240
+ }
241
+
242
+ private func syncPlayerSelectedVideoTrack() {
243
+ if let player = self.player {
244
+ let videoTracks: VideoTrackList = player.videoTracks
245
+ guard videoTracks.count > 0 else {
246
+ return
247
+ }
248
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Enabling videoTrack \(self.selectedVideoTrackUid) on TheoPlayer") }
249
+ for i in 0...videoTracks.count-1 {
250
+ var videoTrack: MediaTrack = videoTracks.get(i)
251
+ videoTrack.enabled = (videoTrack.uid == self.selectedVideoTrackUid)
252
+ }
253
+ }
254
+ }
255
+
256
+ @objc(setSeek:)
257
+ func setSeek(seek: NSNumber) {
258
+ // store selectedVideoTrackUid
259
+ self.seek = seek.doubleValue
260
+ if DEBUG_PROP_UPDATES { print("[NATIVE] seek prop set.") }
261
+ // sync player state with seek prop
262
+ self.syncPlayerSeek()
263
+ }
264
+
265
+ private func syncPlayerSeek() {
266
+ if let player = self.player,
267
+ let seek = self.seek {
268
+ if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Seeking to \(seek) on TheoPlayer") }
269
+ player.setCurrentTime(seek * 0.001)
270
+ // Unset seek prop. CurrentTime value must be set only once
271
+ self.seek = nil
272
+ if DEBUG_PROP_UPDATES { print("[NATIVE] seek prop unset.") }
273
+ }
274
+ }
275
+
276
+ @objc(setFullscreen:)
277
+ func setFullscreen(fullscreen: Bool) {
278
+ // store fullscreen
279
+ self.fullscreen = fullscreen
280
+ if DEBUG_PROP_UPDATES { print("[NATIVE] fullscreen prop updated.") }
281
+ // sync player state with fullscreen prop
282
+ self.syncPlayerFullscreen()
283
+ }
284
+
285
+ private func syncPlayerFullscreen() {
286
+ // NOTE: Fullscreen changes only supported through default UI or with custom implementation in RN
287
+ if let player = self.player {
288
+ if self.fullscreen && player.presentationMode != PresentationMode.fullscreen {
289
+ // if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Putting TheoPlayer in fullscreen") }
290
+ } else if !self.fullscreen && player.presentationMode == PresentationMode.fullscreen {
291
+ // if DEBUG_THEOPLAYER_INTERACTION { print("[NATIVE] Taking TheoPlayer out of fullscreen") }
292
+ }
293
+ }
294
+ }
295
+
296
+ // MARK: - Listener based event bridging
297
+ @objc(setOnNativePlay:)
298
+ func setOnNativePlay(nativePlay: @escaping RCTDirectEventBlock) {
299
+ self.eventHandler.onNativePlay = nativePlay
300
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativePlay prop set.") }
301
+ }
302
+
303
+ @objc(setOnNativePause:)
304
+ func setOnNativePause(nativePause: @escaping RCTDirectEventBlock) {
305
+ self.eventHandler.onNativePause = nativePause
306
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativePause prop set.") }
307
+ }
308
+
309
+ @objc(setOnNativeSourceChange:)
310
+ func setOnNativeSourceChange(nativeSourceChange: @escaping RCTDirectEventBlock) {
311
+ self.eventHandler.onNativeSourceChange = nativeSourceChange
312
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeSourceChange prop set.") }
313
+ }
314
+
315
+ @objc(setOnNativeLoadStart:)
316
+ func setOnNativeLoadStart(nativeLoadStart: @escaping RCTDirectEventBlock) {
317
+ self.eventHandler.onNativeLoadStart = nativeLoadStart
318
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeLoadStart prop set.") }
319
+ }
320
+
321
+ @objc(setOnNativeReadyStateChange:)
322
+ func setOnNativeReadyStateChange(nativeReadyStateChange: @escaping RCTDirectEventBlock) {
323
+ self.eventHandler.onNativeReadyStateChange = nativeReadyStateChange
324
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeReadyStateChange prop set.") }
325
+ }
326
+
327
+ @objc(setOnNativeDurationChange:)
328
+ func setOnNativeDurationChange(nativeDurationChange: @escaping RCTDirectEventBlock) {
329
+ self.eventHandler.onNativeDurationChange = nativeDurationChange
330
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeDurationChange prop set.") }
331
+ }
332
+
333
+ @objc(setOnNativeProgress:)
334
+ func setOnNativeProgress(nativeProgress: @escaping RCTBubblingEventBlock) {
335
+ self.eventHandler.onNativeProgress = nativeProgress
336
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeProgress prop set.") }
337
+ }
338
+
339
+ @objc(setOnNativeTimeUpdate:)
340
+ func setOnNativeTimeUpdate(nativeTimeUpdate: @escaping RCTBubblingEventBlock) {
341
+ self.eventHandler.onNativeTimeUpdate = nativeTimeUpdate
342
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeTimeUpdate prop set.") }
343
+ }
344
+
345
+ @objc(setOnNativePlaying:)
346
+ func setOnNativePlaying(nativePlaying: @escaping RCTDirectEventBlock) {
347
+ self.eventHandler.onNativePlaying = nativePlaying
348
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativePlaying prop set.") }
349
+ }
350
+
351
+ @objc(setOnNativeSeeking:)
352
+ func setOnNativeSeeking(nativeSeeking: @escaping RCTDirectEventBlock) {
353
+ self.eventHandler.onNativeSeeking = nativeSeeking
354
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeSeeking prop set.") }
355
+ }
356
+
357
+ @objc(setOnNativeSeeked:)
358
+ func setOnNativeSeeked(nativeSeeked: @escaping RCTDirectEventBlock) {
359
+ self.eventHandler.onNativeSeeked = nativeSeeked
360
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeSeeked prop set.") }
361
+ }
362
+
363
+ @objc(setOnNativeEnded:)
364
+ func setOnNativeEnded(nativeEnded: @escaping RCTDirectEventBlock) {
365
+ self.eventHandler.onNativeEnded = nativeEnded
366
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeEnded prop set.") }
367
+ }
368
+
369
+ @objc(setOnNativeError:)
370
+ func setOnNativeError(nativeError: @escaping RCTDirectEventBlock) {
371
+ self.eventHandler.onNativeError = nativeError
372
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeError prop set.") }
373
+ }
374
+
375
+ @objc(setOnNativeLoadedData:)
376
+ func setOnNativeLoadedData(nativeLoadedData: @escaping RCTDirectEventBlock) {
377
+ self.eventHandler.onNativeLoadedData = nativeLoadedData
378
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeLoadedData prop set.") }
379
+ }
380
+
381
+ @objc(setOnNativeLoadedMetadata:)
382
+ func setOnNativeLoadedMetadata(nativeLoadedMetadata: @escaping RCTDirectEventBlock) {
383
+ self.eventHandler.onNativeLoadedMetadata = nativeLoadedMetadata
384
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeLoadedMetadata prop set.") }
385
+ }
386
+
387
+ @objc(setOnNativeFullscreenPlayerWillPresent:)
388
+ func setOnNativeFullscreenPlayerWillPresent(nativeFullscreenPlayerWillPresent: @escaping RCTDirectEventBlock) {
389
+ self.eventHandler.onNativeFullscreenPlayerWillPresent = nativeFullscreenPlayerWillPresent
390
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeFullscreenPlayerWillPresent prop set.") }
391
+ }
392
+
393
+ @objc(setOnNativeFullscreenPlayerDidPresent:)
394
+ func setOnNativeFullscreenPlayerDidPresent(nativeFullscreenPlayerDidPresent: @escaping RCTDirectEventBlock) {
395
+ self.eventHandler.onNativeFullscreenPlayerDidPresent = nativeFullscreenPlayerDidPresent
396
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeFullscreenPlayerDidPresent prop set.") }
397
+ }
398
+
399
+ @objc(setOnNativeFullscreenPlayerWillDismiss:)
400
+ func setOnNativeFullscreenPlayerWillDismiss(nativeFullscreenPlayerWillDismiss: @escaping RCTDirectEventBlock) {
401
+ self.eventHandler.onNativeFullscreenPlayerWillDismiss = nativeFullscreenPlayerWillDismiss
402
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeFullscreenPlayerWillDismiss prop set.") }
403
+ }
404
+
405
+ @objc(setOnNativeFullscreenPlayerDidDismiss:)
406
+ func setOnNativeFullscreenPlayerDidDismiss(nativeFullscreenPlayerDidDismiss: @escaping RCTDirectEventBlock) {
407
+ self.eventHandler.onNativeFullscreenPlayerDidDismiss = nativeFullscreenPlayerDidDismiss
408
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeFullscreenPlayerDidDismiss prop set.") }
409
+ }
410
+
411
+ @objc(setOnNativeTextTrackListEvent:)
412
+ func setOnNativeTextTrackListEvent(nativeTextTrackListEvent: @escaping RCTDirectEventBlock) {
413
+ self.eventHandler.onNativeTextTrackListEvent = nativeTextTrackListEvent
414
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeTextTrackListEvent prop set.") }
415
+ }
416
+
417
+ @objc(setOnNativeTextTrackEvent:)
418
+ func setOnNativeTextTrackEvent(nativeTextTrackEvent: @escaping RCTDirectEventBlock) {
419
+ self.eventHandler.onNativeTextTrackEvent = nativeTextTrackEvent
420
+ if DEBUG_PROP_UPDATES { print("[NATIVE] nativeTextTrackEvent prop set.") }
421
+ }
422
+ }