react-native-theoplayer 1.7.0 → 1.7.2
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/android/build.gradle +7 -9
- package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +148 -12
- package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +4 -0
- package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +11 -0
- package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +11 -0
- package/android/src/main/java/com/theoplayer/track/TrackEventType.java +2 -1
- package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +123 -101
- package/ios/THEOplayerRCTAdAggregator.swift +3 -0
- package/ios/THEOplayerRCTBridge.m +2 -0
- package/ios/THEOplayerRCTMetadataAggregator.swift +59 -45
- package/ios/THEOplayerRCTTrackEventTypes.swift +17 -0
- package/ios/THEOplayerRCTView.swift +27 -3
- package/ios/THEOplayerRCTViewAdEventHandler.swift +7 -5
- package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +185 -0
- package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +26 -9
- package/lib/commonjs/api/THEOplayerView.js.map +1 -1
- package/lib/commonjs/api/event/TrackEvent.js +17 -1
- package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.js +14 -0
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +71 -20
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/api/THEOplayerView.js.map +1 -1
- package/lib/module/api/event/TrackEvent.js +14 -0
- package/lib/module/api/event/TrackEvent.js.map +1 -1
- package/lib/module/internal/THEOplayerView.js +14 -0
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +72 -21
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +4 -0
- package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
- package/lib/typescript/src/api/THEOplayerView.d.ts +11 -3
- package/lib/typescript/src/api/event/TrackEvent.d.ts +49 -3
- package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
- package/lib/typescript/src/internal/THEOplayerView.web.d.ts +4 -1
- package/package.json +1 -1
- package/src/api/THEOplayerView.ts +13 -3
- package/src/api/event/TrackEvent.ts +58 -2
- package/src/internal/THEOplayerView.tsx +18 -0
- package/src/internal/THEOplayerView.web.tsx +80 -19
|
@@ -43,6 +43,7 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
43
43
|
]
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
// MARK: TEXTTRACKS
|
|
46
47
|
class func aggregatedTextTrackListInfo(textTracks: TextTrackList) -> [[String:Any]] {
|
|
47
48
|
var textTrackEntries:[[String:Any]] = []
|
|
48
49
|
guard textTracks.count > 0 else {
|
|
@@ -76,6 +77,20 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
76
77
|
return entry
|
|
77
78
|
}
|
|
78
79
|
|
|
80
|
+
private class func selectedTextTrack(textTracks: TextTrackList) -> Int {
|
|
81
|
+
guard textTracks.count > 0 else {
|
|
82
|
+
return 0
|
|
83
|
+
}
|
|
84
|
+
for i in 0...textTracks.count-1 {
|
|
85
|
+
let textTrack: TextTrack = textTracks.get(i)
|
|
86
|
+
if textTrack.mode == TextTrackMode.showing {
|
|
87
|
+
return textTrack.uid
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return 0
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// MARK: TEXTTRACK CUES
|
|
79
94
|
class func aggregatedTextTrackCueInfo(textTrackCue: TextTrackCue) -> [String:Any] {
|
|
80
95
|
var entry: [String:Any] = [:]
|
|
81
96
|
entry[PROP_ID] = textTrackCue.id
|
|
@@ -86,61 +101,33 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
86
101
|
return entry
|
|
87
102
|
}
|
|
88
103
|
|
|
104
|
+
// MARK: AUDIOTRACKS
|
|
89
105
|
private class func aggregatedAudioTrackListInfo(audioTracks: AudioTrackList) -> [[String:Any]] {
|
|
90
106
|
var audioTrackEntries:[[String:Any]] = []
|
|
91
107
|
guard audioTracks.count > 0 else {
|
|
92
108
|
return audioTrackEntries
|
|
93
109
|
}
|
|
94
110
|
for i in 0...audioTracks.count-1 {
|
|
95
|
-
let audioTrack:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
entry[PROP_UID] = audioTrack.uid
|
|
99
|
-
entry[PROP_KIND] = audioTrack.kind
|
|
100
|
-
entry[PROP_LANGUAGE] = audioTrack.language
|
|
101
|
-
entry[PROP_LABEL] = audioTrack.label
|
|
102
|
-
entry[PROP_QUALITIES] = [] // empty: qualities are not being exposed on iOS
|
|
103
|
-
//entry[PROP_ACTIVE_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
104
|
-
//entry[PROP_TARGET_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
105
|
-
audioTrackEntries.append(entry)
|
|
111
|
+
if let audioTrack: AudioTrack = audioTracks.get(i) as? AudioTrack {
|
|
112
|
+
audioTrackEntries.append(THEOplayerRCTMetadataAggregator.aggregatedAudioTrackInfo(audioTrack: audioTrack))
|
|
113
|
+
}
|
|
106
114
|
}
|
|
107
115
|
return audioTrackEntries
|
|
108
116
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
var
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
entry[PROP_LANGUAGE] = videoTrack.language
|
|
122
|
-
entry[PROP_LABEL] = videoTrack.label
|
|
123
|
-
entry[PROP_QUALITIES] = [] // empty: qualities are not being exposed on iOS
|
|
124
|
-
//entry[PROP_ACTIVE_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
125
|
-
//entry[PROP_TARGET_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
126
|
-
videoTrackEntries.append(entry)
|
|
127
|
-
}
|
|
128
|
-
return videoTrackEntries
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
private class func selectedTextTrack(textTracks: TextTrackList) -> Int {
|
|
132
|
-
guard textTracks.count > 0 else {
|
|
133
|
-
return 0
|
|
134
|
-
}
|
|
135
|
-
for i in 0...textTracks.count-1 {
|
|
136
|
-
let textTrack: TextTrack = textTracks.get(i)
|
|
137
|
-
if textTrack.mode == TextTrackMode.showing {
|
|
138
|
-
return textTrack.uid
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return 0
|
|
117
|
+
|
|
118
|
+
class func aggregatedAudioTrackInfo(audioTrack: AudioTrack) -> [String:Any] {
|
|
119
|
+
var entry: [String:Any] = [:]
|
|
120
|
+
entry[PROP_ID] = audioTrack.id
|
|
121
|
+
entry[PROP_UID] = audioTrack.uid
|
|
122
|
+
entry[PROP_KIND] = audioTrack.kind
|
|
123
|
+
entry[PROP_LANGUAGE] = audioTrack.language
|
|
124
|
+
entry[PROP_LABEL] = audioTrack.label
|
|
125
|
+
entry[PROP_QUALITIES] = [] // empty: qualities are not being exposed on iOS
|
|
126
|
+
//entry[PROP_ACTIVE_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
127
|
+
//entry[PROP_TARGET_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
128
|
+
return entry
|
|
142
129
|
}
|
|
143
|
-
|
|
130
|
+
|
|
144
131
|
private class func selectedAudioTrack(audioTracks: AudioTrackList) -> Int {
|
|
145
132
|
guard audioTracks.count > 0 else {
|
|
146
133
|
return 0
|
|
@@ -154,6 +141,33 @@ class THEOplayerRCTMetadataAggregator {
|
|
|
154
141
|
return 0
|
|
155
142
|
}
|
|
156
143
|
|
|
144
|
+
// MARK: VIDEOTRACKS
|
|
145
|
+
private class func aggregatedVideoTrackListInfo(videoTracks: VideoTrackList) -> [[String:Any]] {
|
|
146
|
+
var videoTrackEntries:[[String:Any]] = []
|
|
147
|
+
guard videoTracks.count > 0 else {
|
|
148
|
+
return videoTrackEntries
|
|
149
|
+
}
|
|
150
|
+
for i in 0...videoTracks.count-1 {
|
|
151
|
+
if let videoTrack: VideoTrack = videoTracks.get(i) as? VideoTrack {
|
|
152
|
+
videoTrackEntries.append(THEOplayerRCTMetadataAggregator.aggregatedVideoTrackInfo(videoTrack: videoTrack))
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return videoTrackEntries
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
class func aggregatedVideoTrackInfo(videoTrack: VideoTrack) -> [String:Any] {
|
|
159
|
+
var entry: [String:Any] = [:]
|
|
160
|
+
entry[PROP_ID] = videoTrack.id
|
|
161
|
+
entry[PROP_UID] = videoTrack.uid
|
|
162
|
+
entry[PROP_KIND] = videoTrack.kind
|
|
163
|
+
entry[PROP_LANGUAGE] = videoTrack.language
|
|
164
|
+
entry[PROP_LABEL] = videoTrack.label
|
|
165
|
+
entry[PROP_QUALITIES] = [] // empty: qualities are not being exposed on iOS
|
|
166
|
+
//entry[PROP_ACTIVE_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
167
|
+
//entry[PROP_TARGET_QUALITY] = // undefined: qualities are not being exposed on iOS
|
|
168
|
+
return entry
|
|
169
|
+
}
|
|
170
|
+
|
|
157
171
|
private class func selectedVideoTrack(videoTracks: VideoTrackList) -> Int {
|
|
158
172
|
guard videoTracks.count > 0 else {
|
|
159
173
|
return 0
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// THEOplayerRCTTrackEventTypes.swift
|
|
2
|
+
|
|
3
|
+
enum MediaTrackType: Int {
|
|
4
|
+
case AUDIO = 0
|
|
5
|
+
case VIDEO = 1
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
enum TrackListEventType: Int {
|
|
9
|
+
case ADD_TRACK = 0
|
|
10
|
+
case REMOVE_TRACK = 1
|
|
11
|
+
case CHANGE_TRACK = 2
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
enum TrackCueEventType: Int {
|
|
15
|
+
case ADD_CUE = 0
|
|
16
|
+
case REMOVE_CUE = 1
|
|
17
|
+
}
|
|
@@ -9,6 +9,7 @@ class THEOplayerRCTView: UIView {
|
|
|
9
9
|
private var player: THEOplayer?
|
|
10
10
|
private var mainEventHandler: THEOplayerRCTViewMainEventHandler
|
|
11
11
|
private var textTrackEventHandler: THEOplayerRCTViewTextTrackEventHandler
|
|
12
|
+
private var mediaTrackEventHandler: THEOplayerRCTViewMediaTrackEventHandler
|
|
12
13
|
private var adEventHandler: THEOplayerRCTViewAdEventHandler
|
|
13
14
|
|
|
14
15
|
// MARK: Bridged props
|
|
@@ -16,9 +17,6 @@ class THEOplayerRCTView: UIView {
|
|
|
16
17
|
private var license: String?
|
|
17
18
|
private var licenseUrl: String?
|
|
18
19
|
private var chromeless: Bool = true
|
|
19
|
-
private var adSUIEnabled: Bool = true
|
|
20
|
-
private var adPreloadType: THEOplayerSDK.AdPreloadType = THEOplayerSDK.AdPreloadType.MIDROLL_AND_POSTROLL
|
|
21
|
-
private var googleImaUsesNativeIma: Bool = true
|
|
22
20
|
private var config: THEOplayerConfiguration?
|
|
23
21
|
private var paused: Bool = false
|
|
24
22
|
private var muted: Bool = true
|
|
@@ -29,11 +27,19 @@ class THEOplayerRCTView: UIView {
|
|
|
29
27
|
private var seek: Double? = nil // in msec
|
|
30
28
|
private var fullscreen: Bool = false
|
|
31
29
|
|
|
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
|
+
|
|
32
37
|
// MARK: - Initialisation / view setup
|
|
33
38
|
init() {
|
|
34
39
|
// create event handlers to maintain event props
|
|
35
40
|
self.mainEventHandler = THEOplayerRCTViewMainEventHandler()
|
|
36
41
|
self.textTrackEventHandler = THEOplayerRCTViewTextTrackEventHandler()
|
|
42
|
+
self.mediaTrackEventHandler = THEOplayerRCTViewMediaTrackEventHandler()
|
|
37
43
|
self.adEventHandler = THEOplayerRCTViewAdEventHandler()
|
|
38
44
|
|
|
39
45
|
super.init(frame: .zero)
|
|
@@ -42,6 +48,7 @@ class THEOplayerRCTView: UIView {
|
|
|
42
48
|
func destroy() {
|
|
43
49
|
self.mainEventHandler.destroy()
|
|
44
50
|
self.textTrackEventHandler.destroy()
|
|
51
|
+
self.mediaTrackEventHandler.destroy()
|
|
45
52
|
self.adEventHandler.destroy()
|
|
46
53
|
self.player?.destroy()
|
|
47
54
|
self.player = nil
|
|
@@ -106,6 +113,7 @@ class THEOplayerRCTView: UIView {
|
|
|
106
113
|
// couple player instance to event handlers
|
|
107
114
|
self.mainEventHandler.setPlayer(player)
|
|
108
115
|
self.textTrackEventHandler.setPlayer(player)
|
|
116
|
+
self.mediaTrackEventHandler.setPlayer(player)
|
|
109
117
|
self.adEventHandler.setPlayer(player)
|
|
110
118
|
// couple player instance to view
|
|
111
119
|
player.addAsSubview(of: self)
|
|
@@ -161,6 +169,7 @@ class THEOplayerRCTView: UIView {
|
|
|
161
169
|
self.license = configDict["license"] as? String
|
|
162
170
|
self.licenseUrl = configDict["licenseUrl"] as? String
|
|
163
171
|
self.chromeless = configDict["chromeless"] as? Bool ?? true
|
|
172
|
+
#if ADS && (GOOGLE_IMA || GOOGLE_DAI)
|
|
164
173
|
if let adsConfig = configDict["ads"] as? NSDictionary {
|
|
165
174
|
self.adSUIEnabled = adsConfig["uiEnabled"] as? Bool ?? true
|
|
166
175
|
if let adPreloadType = adsConfig["preload"] as? String {
|
|
@@ -170,6 +179,7 @@ class THEOplayerRCTView: UIView {
|
|
|
170
179
|
self.googleImaUsesNativeIma = googleImaConfiguration["useNativeIma"] as? Bool ?? true
|
|
171
180
|
}
|
|
172
181
|
}
|
|
182
|
+
#endif
|
|
173
183
|
if DEBUG_PROP_UPDATES { print("[NATIVE] config prop updated.") }
|
|
174
184
|
}
|
|
175
185
|
|
|
@@ -475,6 +485,20 @@ class THEOplayerRCTView: UIView {
|
|
|
475
485
|
if DEBUG_PROP_UPDATES { print("[NATIVE] nativeTextTrackEvent prop set.") }
|
|
476
486
|
}
|
|
477
487
|
|
|
488
|
+
// MARK: - Listener based MEDIATRACK event bridging
|
|
489
|
+
|
|
490
|
+
@objc(setOnNativeMediaTrackListEvent:)
|
|
491
|
+
func setOnNativeMediaTrackListEvent(nativeMediaTrackListEvent: @escaping RCTDirectEventBlock) {
|
|
492
|
+
self.mediaTrackEventHandler.onNativeMediaTrackListEvent = nativeMediaTrackListEvent
|
|
493
|
+
if DEBUG_PROP_UPDATES { print("[NATIVE] nativeMediaTrackListEvent prop set.") }
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
@objc(setOnNativeMediaTrackEvent:)
|
|
497
|
+
func setOnNativeMediaTrackEvent(nativeMediaTrackEvent: @escaping RCTDirectEventBlock) {
|
|
498
|
+
self.mediaTrackEventHandler.onNativeMediaTrackEvent = nativeMediaTrackEvent
|
|
499
|
+
if DEBUG_PROP_UPDATES { print("[NATIVE] nativeMediaTrackEvent prop set.") }
|
|
500
|
+
}
|
|
501
|
+
|
|
478
502
|
// MARK: - Listener based AD event bridging
|
|
479
503
|
|
|
480
504
|
@objc(setOnNativeAdEvent:)
|
|
@@ -37,9 +37,7 @@ class THEOplayerRCTViewAdEventHandler {
|
|
|
37
37
|
// MARK: - destruction
|
|
38
38
|
func destroy() {
|
|
39
39
|
// dettach listeners
|
|
40
|
-
#if ADS && (GOOGLE_IMA || GOOLGE_DAI)
|
|
41
40
|
self.dettachListeners()
|
|
42
|
-
#endif
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
// MARK: - player setup / breakdown
|
|
@@ -47,9 +45,7 @@ class THEOplayerRCTViewAdEventHandler {
|
|
|
47
45
|
self.player = player;
|
|
48
46
|
|
|
49
47
|
// attach listeners
|
|
50
|
-
#if ADS && (GOOGLE_IMA || GOOLGE_DAI)
|
|
51
48
|
self.attachListeners()
|
|
52
|
-
#endif
|
|
53
49
|
}
|
|
54
50
|
|
|
55
51
|
// MARK: - attach/dettach Listeners
|
|
@@ -57,7 +53,8 @@ class THEOplayerRCTViewAdEventHandler {
|
|
|
57
53
|
guard let player = self.player else {
|
|
58
54
|
return
|
|
59
55
|
}
|
|
60
|
-
|
|
56
|
+
|
|
57
|
+
#if ADS && (GOOGLE_IMA || GOOLGE_DAI)
|
|
61
58
|
// AD_BEGIN
|
|
62
59
|
self.adBeginListener = player.ads.addEventListener(type: AdsEventTypes.AD_BEGIN) { [weak self] event in
|
|
63
60
|
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received AD_BEGIN event from THEOplayer Ads") }
|
|
@@ -174,6 +171,8 @@ class THEOplayerRCTViewAdEventHandler {
|
|
|
174
171
|
}
|
|
175
172
|
}
|
|
176
173
|
if DEBUG_EVENTHANDLER { print("[NATIVE] AdThirdQuartile listener attached to THEOplayer.ads") }
|
|
174
|
+
#endif
|
|
175
|
+
|
|
177
176
|
}
|
|
178
177
|
|
|
179
178
|
private func dettachListeners() {
|
|
@@ -181,6 +180,7 @@ class THEOplayerRCTViewAdEventHandler {
|
|
|
181
180
|
return
|
|
182
181
|
}
|
|
183
182
|
|
|
183
|
+
#if ADS && (GOOGLE_IMA || GOOLGE_DAI)
|
|
184
184
|
// AD_BEGIN
|
|
185
185
|
if let adBeginListener = self.adBeginListener {
|
|
186
186
|
player.ads.removeEventListener(type: AdsEventTypes.AD_BEGIN, listener: adBeginListener)
|
|
@@ -234,5 +234,7 @@ class THEOplayerRCTViewAdEventHandler {
|
|
|
234
234
|
player.ads.removeEventListener(type: AdsEventTypes.AD_LOADED, listener: adLoadedListener)
|
|
235
235
|
if DEBUG_EVENTHANDLER { print("[NATIVE] adLoadedListener listener dettached from THEOplayer.ads") }
|
|
236
236
|
}
|
|
237
|
+
#endif
|
|
238
|
+
|
|
237
239
|
}
|
|
238
240
|
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// THEOplayerRCTViewMediaTrackEventHandler.swift
|
|
2
|
+
|
|
3
|
+
import Foundation
|
|
4
|
+
import THEOplayerSDK
|
|
5
|
+
|
|
6
|
+
class THEOplayerRCTViewMediaTrackEventHandler {
|
|
7
|
+
// MARK: Members
|
|
8
|
+
private weak var player: THEOplayer?
|
|
9
|
+
|
|
10
|
+
// MARK: Events
|
|
11
|
+
var onNativeMediaTrackListEvent: RCTDirectEventBlock?
|
|
12
|
+
var onNativeMediaTrackEvent: RCTDirectEventBlock? // currently not in use on iOS THEOplayerSDK
|
|
13
|
+
|
|
14
|
+
// MARK: mediaTrackList Listeners
|
|
15
|
+
private var audioAddTrackListener: EventListener?
|
|
16
|
+
private var audioRemoveTrackListener: EventListener?
|
|
17
|
+
private var audioChangeTrackListener: EventListener?
|
|
18
|
+
private var videoAddTrackListener: EventListener?
|
|
19
|
+
private var videoRemoveTrackListener: EventListener?
|
|
20
|
+
private var videoChangeTrackListener: EventListener?
|
|
21
|
+
|
|
22
|
+
// MARK: mediaTrack listeners (attached dynamically to new mediatracks)
|
|
23
|
+
private var audioChangeTrackListeners: [Int:EventListener] = [:]
|
|
24
|
+
private var videoChangeTrackListeners: [Int:EventListener] = [:]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
// MARK: - destruction
|
|
28
|
+
func destroy() {
|
|
29
|
+
// dettach listeners
|
|
30
|
+
self.dettachListeners()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// MARK: - player setup / breakdown
|
|
34
|
+
func setPlayer(_ player: THEOplayer) {
|
|
35
|
+
self.player = player;
|
|
36
|
+
|
|
37
|
+
// attach listeners
|
|
38
|
+
self.attachListeners()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// MARK: - attach/dettach mediaTrackList Listeners
|
|
42
|
+
private func attachListeners() {
|
|
43
|
+
guard let player = self.player else {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// AUDIO ADD_TRACK
|
|
48
|
+
self.audioAddTrackListener = player.audioTracks.addEventListener(type: AudioTrackListEventTypes.ADD_TRACK) { [weak self] event in
|
|
49
|
+
guard let welf = self else { return }
|
|
50
|
+
if let forwardedMediaTrackListEvent = welf.onNativeMediaTrackListEvent,
|
|
51
|
+
let audioTrack = event.track as? AudioTrack {
|
|
52
|
+
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received ADD_TRACK event from THEOplayer audioTrack list: trackUid = \(audioTrack.uid)") }
|
|
53
|
+
// trigger tracklist event
|
|
54
|
+
forwardedMediaTrackListEvent([
|
|
55
|
+
"track" : THEOplayerRCTMetadataAggregator.aggregatedAudioTrackInfo(audioTrack: audioTrack),
|
|
56
|
+
"type" : TrackListEventType.ADD_TRACK.rawValue,
|
|
57
|
+
"trackType": MediaTrackType.AUDIO.rawValue
|
|
58
|
+
])
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] AddTrack listener attached to THEOplayer audioTrack list") }
|
|
62
|
+
|
|
63
|
+
// AUDIO REMOVE_TRACK
|
|
64
|
+
self.audioRemoveTrackListener = player.audioTracks.addEventListener(type: AudioTrackListEventTypes.REMOVE_TRACK) { [weak self] event in
|
|
65
|
+
guard let welf = self else { return }
|
|
66
|
+
if let forwardedMediaTrackListEvent = welf.onNativeMediaTrackListEvent,
|
|
67
|
+
let audioTrack = event.track as? AudioTrack {
|
|
68
|
+
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received REMOVE_TRACK event from THEOplayer audioTrack list: trackUid = \(audioTrack.uid)") }
|
|
69
|
+
// trigger tracklist event
|
|
70
|
+
forwardedMediaTrackListEvent([
|
|
71
|
+
"track" : THEOplayerRCTMetadataAggregator.aggregatedAudioTrackInfo(audioTrack: audioTrack),
|
|
72
|
+
"type" : TrackListEventType.REMOVE_TRACK.rawValue,
|
|
73
|
+
"trackType": MediaTrackType.AUDIO.rawValue
|
|
74
|
+
])
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] RemoveTrack listener attached to THEOplayer audioTrack list") }
|
|
78
|
+
|
|
79
|
+
// AUDIO CHANGE
|
|
80
|
+
self.audioChangeTrackListener = player.audioTracks.addEventListener(type: AudioTrackListEventTypes.CHANGE) { [weak self] event in
|
|
81
|
+
guard let welf = self else { return }
|
|
82
|
+
if let forwardedMediaTrackListEvent = welf.onNativeMediaTrackListEvent,
|
|
83
|
+
let audioTrack = event.track as? AudioTrack {
|
|
84
|
+
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received CHANGE event from THEOplayer audioTrack list: trackUid = \(audioTrack.uid)") }
|
|
85
|
+
// trigger tracklist event
|
|
86
|
+
forwardedMediaTrackListEvent([
|
|
87
|
+
"track" : THEOplayerRCTMetadataAggregator.aggregatedAudioTrackInfo(audioTrack: audioTrack),
|
|
88
|
+
"type" : TrackListEventType.CHANGE_TRACK.rawValue,
|
|
89
|
+
"trackType": MediaTrackType.AUDIO.rawValue
|
|
90
|
+
])
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] ChangeTrack listener attached to THEOplayer audioTrack list") }
|
|
94
|
+
|
|
95
|
+
// VIDEO ADD_TRACK
|
|
96
|
+
self.videoAddTrackListener = player.videoTracks.addEventListener(type: VideoTrackListEventTypes.ADD_TRACK) { [weak self] event in
|
|
97
|
+
guard let welf = self else { return }
|
|
98
|
+
if let forwardedMediaTrackListEvent = welf.onNativeMediaTrackListEvent,
|
|
99
|
+
let videoTrack = event.track as? VideoTrack {
|
|
100
|
+
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received ADD_TRACK event from THEOplayer videoTrack list: trackUid = \(videoTrack.uid)") }
|
|
101
|
+
// trigger tracklist event
|
|
102
|
+
forwardedMediaTrackListEvent([
|
|
103
|
+
"track" : THEOplayerRCTMetadataAggregator.aggregatedVideoTrackInfo(videoTrack: videoTrack),
|
|
104
|
+
"type" : TrackListEventType.ADD_TRACK.rawValue,
|
|
105
|
+
"trackType": MediaTrackType.VIDEO.rawValue
|
|
106
|
+
])
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] AddTrack listener attached to THEOplayer videoTrack list") }
|
|
110
|
+
|
|
111
|
+
// VIDEO REMOVE_TRACK
|
|
112
|
+
self.videoRemoveTrackListener = player.videoTracks.addEventListener(type: VideoTrackListEventTypes.REMOVE_TRACK) { [weak self] event in
|
|
113
|
+
guard let welf = self else { return }
|
|
114
|
+
if let forwardedMediaTrackListEvent = welf.onNativeMediaTrackListEvent,
|
|
115
|
+
let videoTrack = event.track as? VideoTrack {
|
|
116
|
+
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received REMOVE_TRACK event from THEOplayer videoTrack list: trackUid = \(videoTrack.uid)") }
|
|
117
|
+
// trigger tracklist event
|
|
118
|
+
forwardedMediaTrackListEvent([
|
|
119
|
+
"track" : THEOplayerRCTMetadataAggregator.aggregatedVideoTrackInfo(videoTrack: videoTrack),
|
|
120
|
+
"type" : TrackListEventType.REMOVE_TRACK.rawValue,
|
|
121
|
+
"trackType": MediaTrackType.VIDEO.rawValue
|
|
122
|
+
])
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] RemoveTrack listener attached to THEOplayer videoTrack list") }
|
|
126
|
+
|
|
127
|
+
// VIDEO CHANGE
|
|
128
|
+
self.videoChangeTrackListener = player.videoTracks.addEventListener(type: VideoTrackListEventTypes.CHANGE) { [weak self] event in
|
|
129
|
+
guard let welf = self else { return }
|
|
130
|
+
if let forwardedMediaTrackListEvent = welf.onNativeMediaTrackListEvent,
|
|
131
|
+
let videoTrack = event.track as? VideoTrack {
|
|
132
|
+
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received CHANGE event from THEOplayer videoTrack list: trackUid = \(videoTrack.uid)") }
|
|
133
|
+
// trigger tracklist event
|
|
134
|
+
forwardedMediaTrackListEvent([
|
|
135
|
+
"track" : THEOplayerRCTMetadataAggregator.aggregatedVideoTrackInfo(videoTrack: videoTrack),
|
|
136
|
+
"type" : TrackListEventType.CHANGE_TRACK.rawValue,
|
|
137
|
+
"trackType": MediaTrackType.VIDEO.rawValue
|
|
138
|
+
])
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] ChangeTrack listener attached to THEOplayer audioTrack list") }
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private func dettachListeners() {
|
|
145
|
+
guard let player = self.player else {
|
|
146
|
+
return
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// AUDIO ADD_TRACK
|
|
150
|
+
if let audioAddTrackListener = self.audioAddTrackListener {
|
|
151
|
+
player.audioTracks.removeEventListener(type: AudioTrackListEventTypes.ADD_TRACK, listener: audioAddTrackListener)
|
|
152
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] AddTrack listener dettached from THEOplayer audioTrack list") }
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// AUDIO REMOVE_TRACK
|
|
156
|
+
if let audioRemoveTrackListener = self.audioRemoveTrackListener {
|
|
157
|
+
player.audioTracks.removeEventListener(type: AudioTrackListEventTypes.REMOVE_TRACK, listener: audioRemoveTrackListener)
|
|
158
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] RemoveTrack listener dettached from THEOplayer audioTrack list") }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// AUDIO CHANGE
|
|
162
|
+
if let audioChangeTrackListener = self.audioChangeTrackListener {
|
|
163
|
+
player.audioTracks.removeEventListener(type: AudioTrackListEventTypes.CHANGE, listener: audioChangeTrackListener)
|
|
164
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] ChangeTrack listener dettached from THEOplayer audioTrack list") }
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// VIDEO ADD_TRACK
|
|
168
|
+
if let videoAddTrackListener = self.videoAddTrackListener {
|
|
169
|
+
player.videoTracks.removeEventListener(type: VideoTrackListEventTypes.ADD_TRACK, listener: videoAddTrackListener)
|
|
170
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] AddTrack listener dettached from THEOplayer videoTrack list") }
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// VIDEO REMOVE_TRACK
|
|
174
|
+
if let videoRemoveTrackListener = self.videoRemoveTrackListener {
|
|
175
|
+
player.videoTracks.removeEventListener(type: VideoTrackListEventTypes.REMOVE_TRACK, listener: videoRemoveTrackListener)
|
|
176
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] RemoveTrack listener dettached from THEOplayer videoTrack list") }
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// VIDEO CHANGE
|
|
180
|
+
if let videoChangeTrackListener = self.videoChangeTrackListener {
|
|
181
|
+
player.videoTracks.removeEventListener(type: VideoTrackListEventTypes.CHANGE, listener: videoChangeTrackListener)
|
|
182
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] ChangeTrack listener dettached from THEOplayer videoTrack list") }
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -3,11 +3,6 @@
|
|
|
3
3
|
import Foundation
|
|
4
4
|
import THEOplayerSDK
|
|
5
5
|
|
|
6
|
-
let ADD_TRACK: Int = 0
|
|
7
|
-
let REMOVE_TRACK: Int = 1
|
|
8
|
-
let ADD_CUE: Int = 0
|
|
9
|
-
let REMOVE_CUE: Int = 1
|
|
10
|
-
|
|
11
6
|
class THEOplayerRCTViewTextTrackEventHandler {
|
|
12
7
|
// MARK: Members
|
|
13
8
|
private weak var player: THEOplayer?
|
|
@@ -19,6 +14,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
19
14
|
// MARK: textTrackList Listeners
|
|
20
15
|
private var addTrackListener: EventListener?
|
|
21
16
|
private var removeTrackListener: EventListener?
|
|
17
|
+
private var changeTrackListener: EventListener?
|
|
22
18
|
|
|
23
19
|
// MARK: textTrack listeners (attached dynamically to new texttracks)
|
|
24
20
|
private var addCueListeners: [Int:EventListener] = [:]
|
|
@@ -54,7 +50,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
54
50
|
// trigger tracklist event
|
|
55
51
|
forwardedTextTrackListEvent([
|
|
56
52
|
"track" : THEOplayerRCTMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
|
|
57
|
-
"type" : ADD_TRACK
|
|
53
|
+
"type" : TrackListEventType.ADD_TRACK.rawValue
|
|
58
54
|
])
|
|
59
55
|
// start listening for cue events on this track and keep listener for later removal
|
|
60
56
|
welf.addCueListeners[textTrack.uid] = textTrack.addEventListener(type: TextTrackEventTypes.ADD_CUE, listener: welf.addCueListener(_:))
|
|
@@ -74,7 +70,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
74
70
|
// trigger tracklist event
|
|
75
71
|
forwardedTextTrackListEvent([
|
|
76
72
|
"track" : THEOplayerRCTMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
|
|
77
|
-
"type" : REMOVE_TRACK
|
|
73
|
+
"type" : TrackListEventType.REMOVE_TRACK.rawValue
|
|
78
74
|
])
|
|
79
75
|
// stop listening for cue events on this track
|
|
80
76
|
if let addCueListener = welf.addCueListeners[textTrack.uid],
|
|
@@ -87,6 +83,21 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
87
83
|
}
|
|
88
84
|
}
|
|
89
85
|
if DEBUG_EVENTHANDLER { print("[NATIVE] RemoveTrack listener attached to THEOplayer textTrack list") }
|
|
86
|
+
|
|
87
|
+
// CHANGE
|
|
88
|
+
self.changeTrackListener = player.textTracks.addEventListener(type: TextTrackListEventTypes.CHANGE) { [weak self] event in
|
|
89
|
+
guard let welf = self else { return }
|
|
90
|
+
if let forwardedTextTrackListEvent = welf.onNativeTextTrackListEvent,
|
|
91
|
+
let textTrack = event.track as? TextTrack {
|
|
92
|
+
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received CHANGE event from THEOplayer textTrack list: trackUid = \(textTrack.uid)") }
|
|
93
|
+
// trigger tracklist event
|
|
94
|
+
forwardedTextTrackListEvent([
|
|
95
|
+
"track" : THEOplayerRCTMetadataAggregator.aggregatedTextTrackInfo(textTrack: textTrack),
|
|
96
|
+
"type" : TrackListEventType.CHANGE_TRACK.rawValue
|
|
97
|
+
])
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] ChangeTrack listener attached to THEOplayer textTrack list") }
|
|
90
101
|
}
|
|
91
102
|
|
|
92
103
|
private func dettachListeners() {
|
|
@@ -105,6 +116,12 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
105
116
|
player.textTracks.removeEventListener(type: TextTrackListEventTypes.REMOVE_TRACK, listener: removeTrackListener)
|
|
106
117
|
if DEBUG_EVENTHANDLER { print("[NATIVE] RemoveTrack listener dettached from THEOplayer textTrack list") }
|
|
107
118
|
}
|
|
119
|
+
|
|
120
|
+
// CHANGE
|
|
121
|
+
if let changeTrackListener = self.changeTrackListener {
|
|
122
|
+
player.textTracks.removeEventListener(type: TextTrackListEventTypes.CHANGE, listener: changeTrackListener)
|
|
123
|
+
if DEBUG_EVENTHANDLER { print("[NATIVE] ChangeTrack listener dettached from THEOplayer textTrack list") }
|
|
124
|
+
}
|
|
108
125
|
}
|
|
109
126
|
|
|
110
127
|
// MARK: - dynamic textTrack Listeners
|
|
@@ -114,7 +131,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
114
131
|
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received ADD_CUE event from textTrack: trackUid = \(textTrack.uid), cueUid = \(event.cue.uid)") }
|
|
115
132
|
forwardedTextTrackEvent([
|
|
116
133
|
"trackUid" : textTrack.uid,
|
|
117
|
-
"type": ADD_CUE,
|
|
134
|
+
"type": TrackCueEventType.ADD_CUE,
|
|
118
135
|
"cue": THEOplayerRCTMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: event.cue)
|
|
119
136
|
])
|
|
120
137
|
}
|
|
@@ -126,7 +143,7 @@ class THEOplayerRCTViewTextTrackEventHandler {
|
|
|
126
143
|
if DEBUG_THEOPLAYER_EVENTS { print("[NATIVE] Received REMOVE_CUE event from textTrack: trackUid = \(textTrack.uid), cueUid = \(event.cue.uid)") }
|
|
127
144
|
forwardedTextTrackEvent([
|
|
128
145
|
"trackUid" : textTrack.uid,
|
|
129
|
-
"type": REMOVE_CUE,
|
|
146
|
+
"type": TrackCueEventType.REMOVE_CUE,
|
|
130
147
|
"cue": THEOplayerRCTMetadataAggregator.aggregatedTextTrackCueInfo(textTrackCue: event.cue)
|
|
131
148
|
])
|
|
132
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["THEOplayerView.ts"],"sourcesContent":["import type { SourceDescription } from './source/SourceDescription';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport type {\n DurationChangeEvent,\n ErrorEvent,\n LoadedMetadataEvent,\n ReadyStateChangeEvent,\n TimeUpdateEvent,\n ProgressEvent,\n SegmentNotFoundEvent,\n} from './event/PlayerEvent';\nimport type { TextTrackEvent, TextTrackListEvent } from './event/TrackEvent';\nimport type { PlayerConfiguration } from './config/PlayerConfiguration';\nimport type { ABRConfiguration } from './abr/ABRConfiguration';\nimport type { AdEvent } from
|
|
1
|
+
{"version":3,"names":[],"sources":["THEOplayerView.ts"],"sourcesContent":["import type { SourceDescription } from './source/SourceDescription';\nimport type { StyleProp, ViewStyle } from 'react-native';\nimport type {\n DurationChangeEvent,\n ErrorEvent,\n LoadedMetadataEvent,\n ReadyStateChangeEvent,\n TimeUpdateEvent,\n ProgressEvent,\n SegmentNotFoundEvent,\n} from './event/PlayerEvent';\nimport type { MediaTrackEvent, MediaTrackListEvent, TextTrackEvent, TextTrackListEvent } from './event/TrackEvent';\nimport type { PlayerConfiguration } from './config/PlayerConfiguration';\nimport type { ABRConfiguration } from './abr/ABRConfiguration';\nimport type { AdEvent } from './event/AdEvent';\nimport type { AdsAPI } from './ads/AdsAPI';\n\nexport interface THEOplayerViewProps {\n /**\n * The player configuration with THEOplayer license.\n */\n config?: PlayerConfiguration;\n\n /**\n * The player's adaptive bitrate (ABR) configuration.\n *\n * @remarks\n * <br/> - This property is supported on Android & Web platforms only.\n */\n abrConfig?: ABRConfiguration;\n\n /**\n * A source description that determines the current media resource.\n */\n source: SourceDescription;\n\n /**\n * Used to set the player's paused state.\n *\n * @remarks\n * <br/> - If paused is initially set to `true`, play-out will start once the source is set.\n */\n paused?: boolean;\n\n /**\n * Used to set the playback rate of the media.\n *\n * @example\n * <br/> - `playbackRate = 0.70` will slow down the playback rate of the media by 30%.\n * <br/> - `playbackRate = 1.25` will speed up the playback rate of the media by 25%.\n *\n * @remarks\n * <br/> - Playback rate is represented by a number where `1` is default playback speed.\n * <br/> - Playback rate must be a positive number.\n * <br/> - It is recommended that you limit the range to between 0.5 and 4.\n */\n playbackRate?: number;\n\n /**\n * Used to set the volume of the audio.\n *\n * @remarks\n * <br/> - Volume is represented by a floating point number between `0.0` and `1.0`.\n */\n volume?: number;\n\n /**\n * Determines whether audio is muted.\n */\n muted?: boolean;\n\n /**\n * Determines whether the player is currently playing in fullscreen.\n */\n fullscreen?: boolean;\n\n /**\n * Used to set the current selected text track by passing its `uid`, or `null` to select none.\n */\n selectedTextTrack?: number | null;\n\n /**\n * Used to set the current selected video track by passing its `uid`, or `null` to select none.\n */\n selectedVideoTrack?: number | null;\n\n /**\n * Used to set the current selected video quality by passing its `uid`, or `null` to select none.\n */\n targetVideoQuality?: number | number[] | undefined;\n\n /**\n * Used to set the current selected audio track by passing its `uid`, or `null` to select none.\n */\n selectedAudioTrack?: number | null;\n\n /**\n * The style applied to the player view.\n */\n style?: StyleProp<ViewStyle>;\n\n /**\n * Invoked before the player goes to fullscreen.\n */\n onFullscreenPlayerWillPresent?: () => void;\n\n /**\n * Invoked after the player went to fullscreen.\n */\n onFullscreenPlayerDidPresent?: () => void;\n\n /**\n * Invoked before the player returns from fullscreen.\n */\n onFullscreenPlayerWillDismiss?: () => void;\n\n /**\n * Invoked after the player returned from fullscreen.\n */\n onFullscreenPlayerDidDismiss?: () => void;\n\n /**\n * Invoked when the player's buffering state has changed.\n *\n * @remarks\n * <br/> - The `isBuffering` value is typically coupled to showing/hiding a loading indicator.\n *\n * @param isBuffering A value that indicates whether the player is buffering.\n */\n onBufferingStateChange?: (isBuffering: boolean) => void;\n\n /**\n * Invoked when the player receives a new source description.\n */\n onSourceChange?: () => void;\n\n /**\n * Invoked when the player starts loading the manifest.\n */\n onLoadStart?: () => void;\n\n /**\n * Invoked when the player has determined the duration and dimensions of the\n * media resource, and the text and media tracks are ready.\n */\n onLoadedMetadata?: (event: LoadedMetadataEvent) => void;\n\n /**\n * Invoked when the player can render the media data at the current playback position for the first time.\n */\n onLoadedData?: () => void;\n\n /**\n * Invoked when the player's readyState has changed.\n */\n onReadyStateChange?: (event: ReadyStateChangeEvent) => void;\n\n /**\n * Invoked when an error occurs.\n */\n onError?: (event: ErrorEvent) => void;\n\n /**\n * Invoked each time the player has loaded media data.\n */\n onProgress?: (event: ProgressEvent) => void;\n\n /**\n * Invoked when the player's internal paused state changes to `false`.\n */\n onPlay?: () => void;\n\n /**\n * Invoked when playback is ready to start after having been paused or delayed due to\n * lack of media data.\n */\n onPlaying?: () => void;\n\n /**\n * Invoked when the player's internal paused state changes to `true`.\n */\n onPause?: () => void;\n\n /**\n * Invoked when a seek operation starts and the player is seeking a new position.\n */\n onSeeking?: () => void;\n\n /**\n * Invoked when a seek operation completed and the current playback position has changed.\n */\n onSeeked?: () => void;\n\n /**\n * Invoked when playback has stopped because the end of the media was reached or because\n * no further data is available.\n */\n onEnded?: () => void;\n\n /**\n * Invoked each time the current playback position changed.\n */\n onTimeUpdate?: (event: TimeUpdateEvent) => void;\n\n /**\n * Invoked when the player's duration attribute has been updated.\n */\n onDurationChange?: (event: DurationChangeEvent) => void;\n\n /**\n * Invoked when a segment can not be found.\n *\n * @remarks\n * <br/> - Only dispatched on DASH streams.\n */\n onSegmentNotFound?: (event: SegmentNotFoundEvent) => void;\n\n /**\n * Invoked when a text track list event occurs.\n */\n onTextTrackListEvent?: (event: TextTrackListEvent) => void;\n\n /**\n * Invoked when a text track event occurs.\n */\n onTextTrackEvent?: (event: TextTrackEvent) => void;\n\n /**\n * Invoked when a media track list event occurs.\n */\n onMediaTrackListEvent?: (event: MediaTrackListEvent) => void;\n\n /**\n * Invoked when a media track event occurs.\n */\n onMediaTrackEvent?: (event: MediaTrackEvent) => void;\n\n /**\n * Invoked when an ad event occurs.\n */\n onAdEvent?: (event: AdEvent) => void;\n}\n\nexport interface THEOplayerViewComponent {\n /**\n * Seek to a new position.\n *\n * @param seekTime - new time, in milliseconds.\n */\n seek: (seekTime: number) => void;\n\n /**\n * The API for advertisements.\n */\n ads: AdsAPI;\n}\n"],"mappings":""}
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.TrackListEventType = exports.TextTrackEventType = void 0;
|
|
6
|
+
exports.TrackListEventType = exports.TextTrackEventType = exports.MediaTrackType = exports.MediaTrackEventType = void 0;
|
|
7
7
|
let TrackListEventType;
|
|
8
8
|
exports.TrackListEventType = TrackListEventType;
|
|
9
9
|
|
|
10
10
|
(function (TrackListEventType) {
|
|
11
11
|
TrackListEventType[TrackListEventType["AddTrack"] = 0] = "AddTrack";
|
|
12
12
|
TrackListEventType[TrackListEventType["RemoveTrack"] = 1] = "RemoveTrack";
|
|
13
|
+
TrackListEventType[TrackListEventType["ChangeTrack"] = 2] = "ChangeTrack";
|
|
13
14
|
})(TrackListEventType || (exports.TrackListEventType = TrackListEventType = {}));
|
|
14
15
|
|
|
15
16
|
let TextTrackEventType;
|
|
@@ -19,4 +20,19 @@ exports.TextTrackEventType = TextTrackEventType;
|
|
|
19
20
|
TextTrackEventType[TextTrackEventType["AddCue"] = 0] = "AddCue";
|
|
20
21
|
TextTrackEventType[TextTrackEventType["RemoveCue"] = 1] = "RemoveCue";
|
|
21
22
|
})(TextTrackEventType || (exports.TextTrackEventType = TextTrackEventType = {}));
|
|
23
|
+
|
|
24
|
+
let MediaTrackType;
|
|
25
|
+
exports.MediaTrackType = MediaTrackType;
|
|
26
|
+
|
|
27
|
+
(function (MediaTrackType) {
|
|
28
|
+
MediaTrackType[MediaTrackType["Audio"] = 0] = "Audio";
|
|
29
|
+
MediaTrackType[MediaTrackType["Video"] = 1] = "Video";
|
|
30
|
+
})(MediaTrackType || (exports.MediaTrackType = MediaTrackType = {}));
|
|
31
|
+
|
|
32
|
+
let MediaTrackEventType;
|
|
33
|
+
exports.MediaTrackEventType = MediaTrackEventType;
|
|
34
|
+
|
|
35
|
+
(function (MediaTrackEventType) {
|
|
36
|
+
MediaTrackEventType[MediaTrackEventType["ActiveQualityChanged"] = 0] = "ActiveQualityChanged";
|
|
37
|
+
})(MediaTrackEventType || (exports.MediaTrackEventType = MediaTrackEventType = {}));
|
|
22
38
|
//# sourceMappingURL=TrackEvent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TrackListEventType","TextTrackEventType"],"sources":["TrackEvent.ts"],"sourcesContent":["import type { TextTrack } from '../track/TextTrack';\nimport type { TextTrackCue } from '../track/TextTrackCue';\n\nexport enum TrackListEventType {\n /**\n * Dispatched when track has been added to the track list.\n */\n AddTrack,\n\n /**\n * Dispatched when track has been removed from the track list.\n */\n RemoveTrack,\n}\n\nexport interface
|
|
1
|
+
{"version":3,"names":["TrackListEventType","TextTrackEventType","MediaTrackType","MediaTrackEventType"],"sources":["TrackEvent.ts"],"sourcesContent":["import type { TextTrack } from '../track/TextTrack';\nimport type { TextTrackCue } from '../track/TextTrackCue';\nimport type { MediaTrack } from '../track/MediaTrack';\nimport type { Quality } from '../track/Quality';\n\nexport enum TrackListEventType {\n /**\n * Dispatched when track has been added to the track list.\n */\n AddTrack,\n\n /**\n * Dispatched when track has been removed from the track list.\n */\n RemoveTrack,\n\n /**\n * Fired when a track has been changed.\n */\n ChangeTrack,\n}\n\nexport interface TrackListEvent {\n /**\n * The type of track list event.\n */\n readonly type: TrackListEventType;\n}\n\nexport interface TextTrackListEvent extends TrackListEvent {\n /**\n * The relevant text track.\n */\n readonly track: TextTrack;\n}\n\nexport enum TextTrackEventType {\n /**\n * Dispatched when cue has been added to the text track.\n */\n AddCue,\n\n /**\n * Dispatched when cue has been removed from the text track.\n */\n RemoveCue,\n}\n\nexport interface TextTrackEvent {\n /**\n * The type of text track event.\n */\n readonly type: TextTrackEventType;\n\n /**\n * The text track's uid to which this cue belongs.\n */\n readonly trackUid: number;\n\n /**\n * The text track's cue.\n */\n readonly cue: TextTrackCue;\n}\n\nexport enum MediaTrackType {\n Audio,\n\n Video,\n}\n\nexport interface MediaTrackListEvent extends TrackListEvent {\n /**\n * The relevant media track type, either {@link MediaTrackType.Audio} or {@link MediaTrackType.Video}.\n */\n readonly trackType: MediaTrackType;\n\n /**\n * The relevant media track.\n */\n readonly track: MediaTrack;\n}\n\nexport enum MediaTrackEventType {\n /**\n * Dispatched when the media track's active quality changes.\n */\n ActiveQualityChanged,\n}\n\nexport interface MediaTrackEvent {\n /**\n * The type of media track event.\n */\n readonly type: MediaTrackEventType;\n\n /**\n * The media track's type to which event belongs, either {@link MediaTrackType.Audio} or {@link MediaTrackType.Video}.\n */\n readonly trackType: MediaTrackType;\n\n /**\n * The media track's uid to which event belongs.\n */\n readonly trackUid: number;\n\n /**\n * The affected media track's qualities.\n */\n readonly qualities?: Quality | Quality[];\n}\n"],"mappings":";;;;;;IAKYA,kB;;;WAAAA,kB;EAAAA,kB,CAAAA,kB;EAAAA,kB,CAAAA,kB;EAAAA,kB,CAAAA,kB;GAAAA,kB,kCAAAA,kB;;IA+BAC,kB;;;WAAAA,kB;EAAAA,kB,CAAAA,kB;EAAAA,kB,CAAAA,kB;GAAAA,kB,kCAAAA,kB;;IA6BAC,c;;;WAAAA,c;EAAAA,c,CAAAA,c;EAAAA,c,CAAAA,c;GAAAA,c,8BAAAA,c;;IAkBAC,mB;;;WAAAA,mB;EAAAA,mB,CAAAA,mB;GAAAA,mB,mCAAAA,mB"}
|