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.
Files changed (40) hide show
  1. package/android/build.gradle +7 -9
  2. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +148 -12
  3. package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +4 -0
  4. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +11 -0
  5. package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +11 -0
  6. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +2 -1
  7. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +123 -101
  8. package/ios/THEOplayerRCTAdAggregator.swift +3 -0
  9. package/ios/THEOplayerRCTBridge.m +2 -0
  10. package/ios/THEOplayerRCTMetadataAggregator.swift +59 -45
  11. package/ios/THEOplayerRCTTrackEventTypes.swift +17 -0
  12. package/ios/THEOplayerRCTView.swift +27 -3
  13. package/ios/THEOplayerRCTViewAdEventHandler.swift +7 -5
  14. package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +185 -0
  15. package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +26 -9
  16. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  17. package/lib/commonjs/api/event/TrackEvent.js +17 -1
  18. package/lib/commonjs/api/event/TrackEvent.js.map +1 -1
  19. package/lib/commonjs/internal/THEOplayerView.js +14 -0
  20. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  21. package/lib/commonjs/internal/THEOplayerView.web.js +71 -20
  22. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  23. package/lib/module/api/THEOplayerView.js.map +1 -1
  24. package/lib/module/api/event/TrackEvent.js +14 -0
  25. package/lib/module/api/event/TrackEvent.js.map +1 -1
  26. package/lib/module/internal/THEOplayerView.js +14 -0
  27. package/lib/module/internal/THEOplayerView.js.map +1 -1
  28. package/lib/module/internal/THEOplayerView.web.js +72 -21
  29. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  30. package/lib/typescript/lib/commonjs/api/event/TrackEvent.d.ts +4 -0
  31. package/lib/typescript/lib/module/api/event/TrackEvent.d.ts +2 -0
  32. package/lib/typescript/src/api/THEOplayerView.d.ts +11 -3
  33. package/lib/typescript/src/api/event/TrackEvent.d.ts +49 -3
  34. package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
  35. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +4 -1
  36. package/package.json +1 -1
  37. package/src/api/THEOplayerView.ts +13 -3
  38. package/src/api/event/TrackEvent.ts +58 -2
  39. package/src/internal/THEOplayerView.tsx +18 -0
  40. 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: MediaTrack = audioTracks.get(i)
96
- var entry: [String:Any] = [:]
97
- entry[PROP_ID] = audioTrack.id
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
- private class func aggregatedVideoTrackListInfo(videoTracks: VideoTrackList) -> [[String:Any]] {
111
- var videoTrackEntries:[[String:Any]] = []
112
- guard videoTracks.count > 0 else {
113
- return videoTrackEntries
114
- }
115
- for i in 0...videoTracks.count-1 {
116
- let videoTrack: MediaTrack = videoTracks.get(i)
117
- var entry: [String:Any] = [:]
118
- entry[PROP_ID] = videoTrack.id
119
- entry[PROP_UID] = videoTrack.uid
120
- entry[PROP_KIND] = videoTrack.kind
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 \"./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 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":""}
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 TextTrackListEvent {\n /**\n * The type of text track list event.\n */\n readonly type: TrackListEventType;\n\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"],"mappings":";;;;;;IAGYA,kB;;;WAAAA,kB;EAAAA,kB,CAAAA,kB;EAAAA,kB,CAAAA,kB;GAAAA,kB,kCAAAA,kB;;IAwBAC,kB;;;WAAAA,kB;EAAAA,kB,CAAAA,kB;EAAAA,kB,CAAAA,kB;GAAAA,kB,kCAAAA,kB"}
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"}