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.
- package/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +54 -18
- package/android/build.gradle +90 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/android/gradlew +185 -0
- package/android/gradlew.bat +89 -0
- package/android/src/main/AndroidManifest.xml +6 -0
- package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +30 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +27 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +420 -0
- package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +114 -0
- package/android/src/main/java/com/theoplayer/SourceHelper.java +224 -0
- package/android/src/main/java/com/theoplayer/TimeUpdateRate.java +8 -0
- package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +410 -0
- package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +11 -0
- package/android/src/main/java/com/theoplayer/track/TrackEventType.java +11 -0
- package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +204 -0
- package/ios/THEOplayerRCTBridge.m +46 -0
- package/ios/THEOplayerRCTDebug.swift +16 -0
- package/ios/THEOplayerRCTMetadataAggregator.swift +169 -0
- package/ios/THEOplayerRCTView.swift +422 -0
- package/ios/THEOplayerRCTViewEventHandler.swift +493 -0
- package/ios/THEOplayerRCTViewManager.swift +23 -0
- package/ios/Theoplayer-Bridging-Header.h +5 -0
- package/ios/Theoplayer.xcodeproj/project.pbxproj +296 -0
- package/lib/commonjs/api/THEOplayerView.js +6 -0
- package/lib/commonjs/api/THEOplayerView.js.map +1 -0
- package/lib/commonjs/api/barrel.js +97 -0
- package/lib/commonjs/api/barrel.js.map +1 -0
- package/lib/commonjs/api/config/PlayerConfiguration.js +2 -0
- package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -0
- package/lib/commonjs/api/config/barrel.js +19 -0
- package/lib/commonjs/api/config/barrel.js.map +1 -0
- package/lib/commonjs/api/error/PlayerError.js +2 -0
- package/lib/commonjs/api/error/PlayerError.js.map +1 -0
- package/lib/commonjs/api/error/barrel.js +19 -0
- package/lib/commonjs/api/error/barrel.js.map +1 -0
- package/lib/commonjs/api/event/PlayerEvent.js +6 -0
- package/lib/commonjs/api/event/PlayerEvent.js.map +1 -0
- package/lib/commonjs/api/event/TrackEvent.js +22 -0
- package/lib/commonjs/api/event/TrackEvent.js.map +1 -0
- package/lib/commonjs/api/event/barrel.js +32 -0
- package/lib/commonjs/api/event/barrel.js.map +1 -0
- package/lib/commonjs/api/source/SourceDescription.js +6 -0
- package/lib/commonjs/api/source/SourceDescription.js.map +1 -0
- package/lib/commonjs/api/source/ads/Ads.js +2 -0
- package/lib/commonjs/api/source/ads/Ads.js.map +1 -0
- package/lib/commonjs/api/source/barrel.js +58 -0
- package/lib/commonjs/api/source/barrel.js.map +1 -0
- package/lib/commonjs/api/source/dash/DashPlaybackConfiguration.js +2 -0
- package/lib/commonjs/api/source/dash/DashPlaybackConfiguration.js.map +1 -0
- package/lib/commonjs/api/source/dash/barrel.js +19 -0
- package/lib/commonjs/api/source/dash/barrel.js.map +1 -0
- package/lib/commonjs/api/source/drm/DRMConfiguration.js +2 -0
- package/lib/commonjs/api/source/drm/DRMConfiguration.js.map +1 -0
- package/lib/commonjs/api/source/drm/barrel.js +19 -0
- package/lib/commonjs/api/source/drm/barrel.js.map +1 -0
- package/lib/commonjs/api/source/hls/HlsPlaybackConfiguration.js +2 -0
- package/lib/commonjs/api/source/hls/HlsPlaybackConfiguration.js.map +1 -0
- package/lib/commonjs/api/source/hls/barrel.js +19 -0
- package/lib/commonjs/api/source/hls/barrel.js.map +1 -0
- package/lib/commonjs/api/timeranges/TimeRange.js +2 -0
- package/lib/commonjs/api/timeranges/TimeRange.js.map +1 -0
- package/lib/commonjs/api/timeranges/barrel.js +19 -0
- package/lib/commonjs/api/timeranges/barrel.js.map +1 -0
- package/lib/commonjs/api/track/MediaTrack.js +6 -0
- package/lib/commonjs/api/track/MediaTrack.js.map +1 -0
- package/lib/commonjs/api/track/Quality.js +2 -0
- package/lib/commonjs/api/track/Quality.js.map +1 -0
- package/lib/commonjs/api/track/TextTrack.js +72 -0
- package/lib/commonjs/api/track/TextTrack.js.map +1 -0
- package/lib/commonjs/api/track/TextTrackCue.js +2 -0
- package/lib/commonjs/api/track/TextTrackCue.js.map +1 -0
- package/lib/commonjs/api/track/Track.js +2 -0
- package/lib/commonjs/api/track/Track.js.map +1 -0
- package/lib/commonjs/api/track/barrel.js +71 -0
- package/lib/commonjs/api/track/barrel.js.map +1 -0
- package/lib/commonjs/index.js +31 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/internal/THEOplayerView.js +274 -0
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -0
- package/lib/commonjs/internal/THEOplayerView.style.js +22 -0
- package/lib/commonjs/internal/THEOplayerView.style.js.map +1 -0
- package/lib/commonjs/internal/THEOplayerView.web.js +512 -0
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -0
- package/lib/commonjs/internal/web/TrackUtils.js +68 -0
- package/lib/commonjs/internal/web/TrackUtils.js.map +1 -0
- package/lib/module/api/THEOplayerView.js +2 -0
- package/lib/module/api/THEOplayerView.js.map +1 -0
- package/lib/module/api/barrel.js +8 -0
- package/lib/module/api/barrel.js.map +1 -0
- package/lib/module/api/config/PlayerConfiguration.js +2 -0
- package/lib/module/api/config/PlayerConfiguration.js.map +1 -0
- package/lib/module/api/config/barrel.js +2 -0
- package/lib/module/api/config/barrel.js.map +1 -0
- package/lib/module/api/error/PlayerError.js +2 -0
- package/lib/module/api/error/PlayerError.js.map +1 -0
- package/lib/module/api/error/barrel.js +2 -0
- package/lib/module/api/error/barrel.js.map +1 -0
- package/lib/module/api/event/PlayerEvent.js +2 -0
- package/lib/module/api/event/PlayerEvent.js.map +1 -0
- package/lib/module/api/event/TrackEvent.js +14 -0
- package/lib/module/api/event/TrackEvent.js.map +1 -0
- package/lib/module/api/event/barrel.js +3 -0
- package/lib/module/api/event/barrel.js.map +1 -0
- package/lib/module/api/source/SourceDescription.js +2 -0
- package/lib/module/api/source/SourceDescription.js.map +1 -0
- package/lib/module/api/source/ads/Ads.js +2 -0
- package/lib/module/api/source/ads/Ads.js.map +1 -0
- package/lib/module/api/source/barrel.js +5 -0
- package/lib/module/api/source/barrel.js.map +1 -0
- package/lib/module/api/source/dash/DashPlaybackConfiguration.js +2 -0
- package/lib/module/api/source/dash/DashPlaybackConfiguration.js.map +1 -0
- package/lib/module/api/source/dash/barrel.js +2 -0
- package/lib/module/api/source/dash/barrel.js.map +1 -0
- package/lib/module/api/source/drm/DRMConfiguration.js +2 -0
- package/lib/module/api/source/drm/DRMConfiguration.js.map +1 -0
- package/lib/module/api/source/drm/barrel.js +2 -0
- package/lib/module/api/source/drm/barrel.js.map +1 -0
- package/lib/module/api/source/hls/HlsPlaybackConfiguration.js +2 -0
- package/lib/module/api/source/hls/HlsPlaybackConfiguration.js.map +1 -0
- package/lib/module/api/source/hls/barrel.js +2 -0
- package/lib/module/api/source/hls/barrel.js.map +1 -0
- package/lib/module/api/timeranges/TimeRange.js +2 -0
- package/lib/module/api/timeranges/TimeRange.js.map +1 -0
- package/lib/module/api/timeranges/barrel.js +2 -0
- package/lib/module/api/timeranges/barrel.js.map +1 -0
- package/lib/module/api/track/MediaTrack.js +2 -0
- package/lib/module/api/track/MediaTrack.js.map +1 -0
- package/lib/module/api/track/Quality.js +2 -0
- package/lib/module/api/track/Quality.js.map +1 -0
- package/lib/module/api/track/TextTrack.js +47 -0
- package/lib/module/api/track/TextTrack.js.map +1 -0
- package/lib/module/api/track/TextTrackCue.js +2 -0
- package/lib/module/api/track/TextTrackCue.js.map +1 -0
- package/lib/module/api/track/Track.js +2 -0
- package/lib/module/api/track/Track.js.map +1 -0
- package/lib/module/api/track/barrel.js +6 -0
- package/lib/module/api/track/barrel.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/internal/THEOplayerView.js +256 -0
- package/lib/module/internal/THEOplayerView.js.map +1 -0
- package/lib/module/internal/THEOplayerView.style.js +12 -0
- package/lib/module/internal/THEOplayerView.style.js.map +1 -0
- package/lib/module/internal/THEOplayerView.web.js +495 -0
- package/lib/module/internal/THEOplayerView.web.js.map +1 -0
- package/lib/module/internal/web/TrackUtils.js +57 -0
- package/lib/module/internal/web/TrackUtils.js.map +1 -0
- package/lib/typescript/babel.config.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/THEOplayerView.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/config/PlayerConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/config/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/error/PlayerError.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/error/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/event/PlayerEvent.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +5 -0
- package/lib/typescript/lib/commonjs/api/event/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/SourceDescription.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/ads/Ads.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/source/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/dash/DashPlaybackConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/source/dash/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/drm/DRMConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/source/drm/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/source/hls/HlsPlaybackConfiguration.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/source/hls/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/timeranges/TimeRange.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/timeranges/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/track/MediaTrack.d.ts +1 -0
- package/lib/typescript/lib/commonjs/api/track/Quality.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/track/TextTrack.d.ts +21 -0
- package/lib/typescript/lib/commonjs/api/track/TextTrackCue.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/track/Track.d.ts +0 -0
- package/lib/typescript/lib/commonjs/api/track/barrel.d.ts +1 -0
- package/lib/typescript/lib/commonjs/index.d.ts +3 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +14 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.style.d.ts +12 -0
- package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +17 -0
- package/lib/typescript/lib/commonjs/internal/web/TrackUtils.d.ts +30 -0
- package/lib/typescript/lib/module/api/THEOplayerView.d.ts +1 -0
- package/lib/typescript/lib/module/api/barrel.d.ts +7 -0
- package/lib/typescript/lib/module/api/config/PlayerConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/config/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/error/PlayerError.d.ts +0 -0
- package/lib/typescript/lib/module/api/error/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/event/PlayerEvent.d.ts +1 -0
- package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
- package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -0
- package/lib/typescript/lib/module/api/source/SourceDescription.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/ads/Ads.d.ts +0 -0
- package/lib/typescript/lib/module/api/source/barrel.d.ts +4 -0
- package/lib/typescript/lib/module/api/source/dash/DashPlaybackConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/source/dash/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/drm/DRMConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/source/drm/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/source/hls/HlsPlaybackConfiguration.d.ts +0 -0
- package/lib/typescript/lib/module/api/source/hls/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/timeranges/TimeRange.d.ts +0 -0
- package/lib/typescript/lib/module/api/timeranges/barrel.d.ts +1 -0
- package/lib/typescript/lib/module/api/track/MediaTrack.d.ts +1 -0
- package/lib/typescript/lib/module/api/track/Quality.d.ts +0 -0
- package/lib/typescript/lib/module/api/track/TextTrack.d.ts +20 -0
- package/lib/typescript/lib/module/api/track/TextTrackCue.d.ts +0 -0
- package/lib/typescript/lib/module/api/track/Track.d.ts +0 -0
- package/lib/typescript/lib/module/api/track/barrel.d.ts +2 -0
- package/lib/typescript/lib/module/index.d.ts +2 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +9 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.style.d.ts +11 -0
- package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +10 -0
- package/lib/typescript/lib/module/internal/web/TrackUtils.d.ts +29 -0
- package/lib/typescript/src/api/THEOplayerView.d.ts +178 -0
- package/lib/typescript/src/api/barrel.d.ts +7 -0
- package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +14 -0
- package/lib/typescript/src/api/config/barrel.d.ts +1 -0
- package/lib/typescript/src/api/error/PlayerError.d.ts +4 -0
- package/lib/typescript/src/api/error/barrel.d.ts +1 -0
- package/lib/typescript/src/api/event/PlayerEvent.d.ts +56 -0
- package/lib/typescript/src/api/event/TrackEvent.d.ts +46 -0
- package/lib/typescript/src/api/event/barrel.d.ts +2 -0
- package/lib/typescript/src/api/source/SourceDescription.d.ts +268 -0
- package/lib/typescript/src/api/source/ads/Ads.d.ts +94 -0
- package/lib/typescript/src/api/source/barrel.d.ts +4 -0
- package/lib/typescript/src/api/source/dash/DashPlaybackConfiguration.d.ts +44 -0
- package/lib/typescript/src/api/source/dash/barrel.d.ts +1 -0
- package/lib/typescript/src/api/source/drm/DRMConfiguration.d.ts +262 -0
- package/lib/typescript/src/api/source/drm/barrel.d.ts +1 -0
- package/lib/typescript/src/api/source/hls/HlsPlaybackConfiguration.d.ts +37 -0
- package/lib/typescript/src/api/source/hls/barrel.d.ts +1 -0
- package/lib/typescript/src/api/timeranges/TimeRange.d.ts +4 -0
- package/lib/typescript/src/api/timeranges/barrel.d.ts +1 -0
- package/lib/typescript/src/api/track/MediaTrack.d.ts +55 -0
- package/lib/typescript/src/api/track/Quality.d.ts +79 -0
- package/lib/typescript/src/api/track/TextTrack.d.ts +86 -0
- package/lib/typescript/src/api/track/TextTrackCue.d.ts +38 -0
- package/lib/typescript/src/api/track/Track.d.ts +43 -0
- package/lib/typescript/src/api/track/barrel.d.ts +5 -0
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/internal/THEOplayerView.d.ts +71 -0
- package/lib/typescript/src/internal/THEOplayerView.style.d.ts +11 -0
- package/lib/typescript/src/internal/THEOplayerView.web.d.ts +22 -0
- package/lib/typescript/src/internal/web/TrackUtils.d.ts +5 -0
- package/package.json +115 -9
- package/react-native-theoplayer.podspec +20 -0
- package/src/api/THEOplayerView.ts +221 -0
- package/src/api/barrel.ts +7 -0
- package/src/api/config/PlayerConfiguration.ts +16 -0
- package/src/api/config/barrel.ts +1 -0
- package/src/api/error/PlayerError.ts +4 -0
- package/src/api/error/barrel.ts +1 -0
- package/src/api/event/PlayerEvent.ts +66 -0
- package/src/api/event/TrackEvent.ts +55 -0
- package/src/api/event/barrel.ts +2 -0
- package/src/api/source/SourceDescription.ts +292 -0
- package/src/api/source/ads/Ads.ts +101 -0
- package/src/api/source/barrel.ts +4 -0
- package/src/api/source/dash/DashPlaybackConfiguration.ts +45 -0
- package/src/api/source/dash/barrel.ts +1 -0
- package/src/api/source/drm/DRMConfiguration.ts +287 -0
- package/src/api/source/drm/barrel.ts +1 -0
- package/src/api/source/hls/HlsPlaybackConfiguration.ts +38 -0
- package/src/api/source/hls/barrel.ts +1 -0
- package/src/api/timeranges/TimeRange.ts +5 -0
- package/src/api/timeranges/barrel.ts +1 -0
- package/src/api/track/MediaTrack.ts +65 -0
- package/src/api/track/Quality.ts +91 -0
- package/src/api/track/TextTrack.ts +133 -0
- package/src/api/track/TextTrackCue.ts +42 -0
- package/src/api/track/Track.ts +47 -0
- package/src/api/track/barrel.ts +5 -0
- package/src/index.tsx +2 -0
- package/src/internal/THEOplayerView.style.ts +12 -0
- package/src/internal/THEOplayerView.tsx +301 -0
- package/src/internal/THEOplayerView.web.tsx +399 -0
- package/src/internal/web/TrackUtils.ts +44 -0
- package/.gitattributes +0 -1
- package/index.js +0 -5
- package/ios/IOSNativeToast.h +0 -18
- package/ios/IOSNativeToast.m +0 -49
- package/ios/RNTheoplayer.h +0 -11
- package/ios/RNTheoplayer.m +0 -15
- package/ios/RNTheoplayer.podspec +0 -23
- package/ios/RNTheoplayer.xcodeproj/project.pbxproj +0 -417
- 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
|
+
}
|