react-native-theoplayer 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +1 -0
  2. package/ios/{THEOplayerRCTViewMainEventHandler.swift → THEOplayerRCTMainEventHandler.swift} +1 -1
  3. package/ios/{THEOplayerRCTViewMediaTrackEventHandler.swift → THEOplayerRCTMediaTrackEventHandler.swift} +2 -2
  4. package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +19 -114
  5. package/ios/{THEOplayerRCTViewTextTrackEventHandler.swift → THEOplayerRCTTextTrackEventHandler.swift} +2 -2
  6. package/ios/THEOplayerRCTView.swift +33 -133
  7. package/ios/{THEOplayerRCTAdAggregator.swift → ads/THEOplayerRCTAdAggregator.swift} +1 -1
  8. package/ios/ads/THEOplayerRCTAdsAPI+DAI.swift +108 -0
  9. package/ios/{THEOplayerRCTAdsAPI.swift → ads/THEOplayerRCTAdsAPI.swift} +6 -96
  10. package/ios/{THEOplayerRCTViewAdEventHandler.swift → ads/THEOplayerRCTAdsEventHandler.swift} +3 -3
  11. package/ios/ads/THEOplayerRCTSourceDescriptionBuilder+Ads.swift +130 -0
  12. package/ios/ads/THEOplayerRCTView+Ads.swift +15 -0
  13. package/ios/ads/THEOplayerRCTView+AdsConfig.swift +82 -0
  14. package/ios/casting/THEOplayerRCTCastAPI+Airplay.swift +97 -0
  15. package/ios/casting/THEOplayerRCTCastAPI+Chromecast.swift +132 -0
  16. package/ios/casting/THEOplayerRCTCastAPI.swift +53 -0
  17. package/ios/{THEOplayerRCTViewCastEventHandler.swift → casting/THEOplayerRCTCastEventHandler.swift} +1 -1
  18. package/ios/casting/THEOplayerRCTView+CastConfig.swift +47 -0
  19. package/ios/casting/THEOplayerRCTView+Casting.swift +17 -0
  20. package/ios/{THEOplayerRCTContentProtectionAPI.swift → contentprotection/THEOplayerRCTContentProtectionAPI.swift} +0 -0
  21. package/ios/{THEOplayerRCTContentProtectionAggregator.swift → contentprotection/THEOplayerRCTContentProtectionAggregator.swift} +0 -0
  22. package/ios/{THEOplayerRCTProxyContentProtectionIntegration.swift → contentprotection/THEOplayerRCTProxyContentProtectionIntegration.swift} +0 -0
  23. package/ios/{THEOplayerRCTProxyContentProtectionIntegrationFactory.swift → contentprotection/THEOplayerRCTProxyContentProtectionIntegrationFactory.swift} +0 -0
  24. package/ios/custom/react-native-theoplayer_custom.podspec +6 -6
  25. package/package.json +1 -1
  26. package/react-native-theoplayer.podspec +1 -1
  27. package/ios/THEOplayerRCTCastAPI.swift +0 -275
@@ -0,0 +1,53 @@
1
+ //
2
+ // THEOplayerRCTAdsAPI.swift
3
+ // Theoplayer
4
+ //
5
+ // Created by William van Haevre on 09/09/2022.
6
+ // Copyright © 2022 Facebook. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+
11
+ let ERROR_CODE_CAST_ACCESS_FAILURE = "cast_access_failure"
12
+ let ERROR_MESSAGE_CASTING_UNSUPPORTED_FEATURE = "Chromecast and Airplay are not supported by the provided SDK"
13
+ let ERROR_MESSAGE_CAST_ACCESS_FAILURE = "Could not access THEOplayer Cast Module"
14
+
15
+ @objc(THEOplayerRCTCastAPI)
16
+ class THEOplayerRCTCastAPI: NSObject, RCTBridgeModule {
17
+ @objc var bridge: RCTBridge!
18
+
19
+ static func moduleName() -> String! {
20
+ return "CastModule"
21
+ }
22
+
23
+ static func requiresMainQueueSetup() -> Bool {
24
+ return false
25
+ }
26
+
27
+ // MARK: CHROMECAST AND AIRPLAY
28
+ #if os(iOS)
29
+
30
+ @objc(casting:resolver:rejecter:)
31
+ func casting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
32
+ DispatchQueue.main.async {
33
+ let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
34
+ if let cast = theView.cast() {
35
+ resolve(cast.casting)
36
+ } else {
37
+ reject(ERROR_CODE_CAST_ACCESS_FAILURE, ERROR_MESSAGE_CAST_ACCESS_FAILURE, nil)
38
+ if DEBUG_CAST_API { print("[NATIVE] Could not retrieve current casting status (cast module unavailable).") }
39
+ }
40
+ }
41
+ }
42
+
43
+ #else
44
+
45
+ @objc(casting:resolver:rejecter:)
46
+ func casting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
47
+ if DEBUG_CAST_API { print(ERROR_MESSAGE_CASTING_UNSUPPORTED_FEATURE) }
48
+ resolve(false)
49
+ }
50
+
51
+ #endif
52
+
53
+ }
@@ -13,7 +13,7 @@ let EVENT_TYPE_CHROMECAST_STATE_CHANGE: String = "chromecaststatechange"
13
13
  let EVENT_TYPE_CHROMECAST_ERROR: String = "chromecasterror"
14
14
  let EVENT_TYPE_AIRPLAY_STATE_CHANGE: String = "airplaystatechange"
15
15
 
16
- class THEOplayerRCTViewCastEventHandler {
16
+ class THEOplayerRCTCastEventHandler {
17
17
  // MARK: Members
18
18
  private weak var player: THEOplayer?
19
19
 
@@ -0,0 +1,47 @@
1
+ // THEOplayerRCTView+CastConfig.swift
2
+
3
+ import Foundation
4
+ import THEOplayerSDK
5
+
6
+ struct CastConfig {
7
+ var castStrategyString: String = "manual"
8
+ }
9
+
10
+ extension THEOplayerRCTView {
11
+
12
+ func parseCastConfig(configDict: NSDictionary) {
13
+ if let castConfig = configDict["cast"] as? NSDictionary {
14
+ if let castStrategy = castConfig["strategy"] as? String {
15
+ self.castConfig.castStrategyString = castStrategy
16
+ }
17
+ }
18
+ }
19
+
20
+ #if os(iOS)
21
+ func playerCastConfiguration() -> CastConfiguration? {
22
+ return CastConfiguration(strategy: self.castStrategy())
23
+ }
24
+
25
+ func isCasting() -> Bool {
26
+ if let cast = self.cast() {
27
+ return cast.casting
28
+ }
29
+ return false
30
+ }
31
+
32
+ private func castStrategy() -> THEOplayerSDK.CastStrategy {
33
+ switch self.castConfig.castStrategyString {
34
+ case "auto":
35
+ return THEOplayerSDK.CastStrategy.auto
36
+ case "manual":
37
+ return THEOplayerSDK.CastStrategy.manual
38
+ case "disabled":
39
+ return THEOplayerSDK.CastStrategy.disabled
40
+ default :
41
+ return THEOplayerSDK.CastStrategy.manual
42
+ }
43
+ }
44
+ #else
45
+ func isCasting() -> Bool { return false }
46
+ #endif
47
+ }
@@ -0,0 +1,17 @@
1
+ // THEOplayerRCTView+Casting.swift
2
+
3
+ import Foundation
4
+ import THEOplayerSDK
5
+
6
+ extension THEOplayerRCTView {
7
+
8
+ #if os(iOS)
9
+ func cast() -> Cast? {
10
+ guard let player = self.player else {
11
+ return nil
12
+ }
13
+ return player.cast
14
+ }
15
+ #endif
16
+
17
+ }
@@ -17,7 +17,7 @@ Pod::Spec.new do |s|
17
17
  s.platforms = { :ios => "12.0", :tvos => "12.0" }
18
18
  s.source = { :git => "https://www.theoplayer.com/.git", :tag => "#{s.version}" }
19
19
 
20
- s.source_files = "ios/*.{h,m,mm,swift}"
20
+ s.source_files = 'ios/*.{h,m,swift}', 'ios/ads/*.swift', 'ios/casting/*.swift', 'ios/contentprotection/*.swift'
21
21
  s.resources = ['ios/*.css']
22
22
 
23
23
  s.dependency "React-Core"
@@ -33,14 +33,14 @@ Pod::Spec.new do |s|
33
33
  }
34
34
 
35
35
  ### Set custom player SDK
36
- s.ios.vendored_frameworks = "ios/custom/Frameworks/ios/THEOplayerSDK.xcframework"
37
- s.tvos.vendored_frameworks = "ios/custom/Frameworks/tvos/THEOplayerSDK.xcframework"
36
+ s.ios.vendored_frameworks = 'ios/custom/Frameworks/ios/THEOplayerSDK.xcframework'
37
+ s.tvos.vendored_frameworks = 'ios/custom/Frameworks/tvos/THEOplayerSDK.xcframework'
38
38
 
39
39
  ### Set Ads dependencies
40
- # s.ios.dependency "GoogleAds-IMA-iOS-SDK", "3.14.1"
41
- # s.tvos.dependency "GoogleAds-IMA-tvOS-SDK", "4.4.1"
40
+ s.ios.dependency "GoogleAds-IMA-iOS-SDK", "3.14.1"
41
+ s.tvos.dependency "GoogleAds-IMA-tvOS-SDK", "4.4.1"
42
42
 
43
43
  ### Set ChromeCast dependency (iOS only)
44
- # s.ios.dependency "google-cast-sdk-dynamic-xcframework-no-bluetooth"
44
+ s.ios.dependency "google-cast-sdk-dynamic-xcframework-no-bluetooth"
45
45
 
46
46
  end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-theoplayer",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "A THEOplayer video component for react-native.",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -13,7 +13,7 @@ Pod::Spec.new do |s|
13
13
  s.platforms = { :ios => "11.0", :tvos => "12.0" }
14
14
  s.source = { :git => "https://www.theoplayer.com/.git", :tag => "#{s.version}" }
15
15
 
16
- s.source_files = "ios/*.{h,m,mm,swift}"
16
+ s.source_files = 'ios/*.{h,m,swift}', 'ios/ads/*.swift', 'ios/casting/*.swift', 'ios/contentprotection/*.swift'
17
17
  s.resources = ['ios/*.css']
18
18
 
19
19
  s.dependency "React-Core"
@@ -1,275 +0,0 @@
1
- //
2
- // THEOplayerRCTAdsAPI.swift
3
- // Theoplayer
4
- //
5
- // Created by William van Haevre on 09/09/2022.
6
- // Copyright © 2022 Facebook. All rights reserved.
7
- //
8
-
9
- import Foundation
10
- import UIKit
11
-
12
- let ERROR_CODE_CAST_ACCESS_FAILURE = "cast_access_failure"
13
- let ERROR_CODE_CHROMECAST_ACCESS_FAILURE = "chromecast_access_failure"
14
- let ERROR_CODE_AIRPLAY_ACCESS_FAILURE = "airplay_access_failure"
15
-
16
- let ERROR_MESSAGE_CASTING_UNSUPPORTED_FEATURE = "Chromecast and Airplay are not supported by the provided iOS SDK"
17
- let ERROR_MESSAGE_CHROMECAST_UNSUPPORTED_FEATURE = "Chromecast is not supported by the provided iOS SDK"
18
- let ERROR_MESSAGE_AIRPLAY_UNSUPPORTED_FEATURE = "Airplay is not supported by the provided iOS SDK"
19
- let ERROR_MESSAGE_CAST_ACCESS_FAILURE = "Could not access THEOplayer Cast Module"
20
- let ERROR_MESSAGE_CHROMECAST_ACCESS_FAILURE = "Could not access THEOplayer Chromecast API"
21
- let ERROR_MESSAGE_AIRPLAY_ACCESS_FAILURE = "Could not access THEOplayer Airplay API"
22
-
23
- @objc(THEOplayerRCTCastAPI)
24
- class THEOplayerRCTCastAPI: NSObject, RCTBridgeModule {
25
- @objc var bridge: RCTBridge!
26
-
27
- static func moduleName() -> String! {
28
- return "CastModule"
29
- }
30
-
31
- static func requiresMainQueueSetup() -> Bool {
32
- return false
33
- }
34
-
35
- // MARK: CHROMECAST AND AIRPLAY
36
-
37
- #if os(iOS)
38
-
39
- @objc(casting:resolver:rejecter:)
40
- func casting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
41
- DispatchQueue.main.async {
42
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
43
- if let cast = theView.cast() {
44
- resolve(cast.casting)
45
- } else {
46
- reject(ERROR_CODE_CAST_ACCESS_FAILURE, ERROR_MESSAGE_CAST_ACCESS_FAILURE, nil)
47
- if DEBUG_CAST_API { print("[NATIVE] Could not retrieve current casting status (cast module unavailable).") }
48
- }
49
- }
50
- }
51
-
52
- #else
53
-
54
- @objc(casting:resolver:rejecter:)
55
- func casting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
56
- if DEBUG_CAST_API { print(ERROR_MESSAGE_CASTING_UNSUPPORTED_FEATURE) }
57
- resolve(false)
58
- }
59
-
60
- #endif
61
-
62
-
63
-
64
- // MARK: CHROMECAST SPECIFIC
65
-
66
- #if os(iOS) && CHROMECAST
67
- @objc(chromecastCasting:resolver:rejecter:)
68
- func chromecastCasting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
69
- DispatchQueue.main.async {
70
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
71
- if let cast = theView.cast(),
72
- let chromecast = cast.chromecast {
73
- resolve(chromecast.casting)
74
- } else {
75
- reject(ERROR_CODE_CHROMECAST_ACCESS_FAILURE, ERROR_MESSAGE_CHROMECAST_ACCESS_FAILURE, nil)
76
- if DEBUG_CAST_API { print("[NATIVE] Could not retrieve current chromecast casting status.") }
77
- }
78
- }
79
- }
80
-
81
- @objc(chromecastState:resolver:rejecter:)
82
- func chromecastState(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
83
- DispatchQueue.main.async {
84
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
85
- if let cast = theView.cast(),
86
- let chromecast = cast.chromecast {
87
- resolve(chromecast.state?._rawValue)
88
- } else {
89
- reject(ERROR_CODE_CHROMECAST_ACCESS_FAILURE, ERROR_MESSAGE_CHROMECAST_ACCESS_FAILURE, nil)
90
- if DEBUG_CAST_API { print("[NATIVE] Could not retrieve current chromecast state.") }
91
- }
92
- }
93
- }
94
-
95
- @objc(chromecastStart:)
96
- func chromecastStart(_ node: NSNumber) -> Void {
97
- DispatchQueue.main.async {
98
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
99
- if let cast = theView.cast(),
100
- let chromecast = cast.chromecast {
101
- if DEBUG_CAST_API { print("[NATIVE] Starting chromecast session.") }
102
- chromecast.start()
103
- } else {
104
- if DEBUG_CAST_API { print("[NATIVE] Could not start chromecast session.") }
105
- }
106
- }
107
- }
108
-
109
- @objc(chromecastStop:)
110
- func chromecastStop(_ node: NSNumber) -> Void {
111
- DispatchQueue.main.async {
112
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
113
- if let cast = theView.cast(),
114
- let chromecast = cast.chromecast {
115
- if DEBUG_CAST_API { print("[NATIVE] Stopping chromecast session.") }
116
- chromecast.stop()
117
- } else {
118
- if DEBUG_CAST_API { print("[NATIVE] Could not stop chromecast session.") }
119
- }
120
- }
121
- }
122
-
123
- @objc(chromecastJoin:)
124
- func chromecastJoin(_ node: NSNumber) -> Void {
125
- DispatchQueue.main.async {
126
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
127
- if let cast = theView.cast(),
128
- let chromecast = cast.chromecast {
129
- if DEBUG_CAST_API { print("[NATIVE] Joining chromecast session.") }
130
- chromecast.join()
131
- } else {
132
- if DEBUG_CAST_API { print("[NATIVE] Could not join chromecast session.") }
133
- }
134
- }
135
- }
136
-
137
- @objc(chromecastLeave:)
138
- func chromecastLeave(_ node: NSNumber) -> Void {
139
- DispatchQueue.main.async {
140
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
141
- if let cast = theView.cast(),
142
- let chromecast = cast.chromecast {
143
- if DEBUG_CAST_API { print("[NATIVE] Leaving chromecast session.") }
144
- chromecast.leave()
145
- } else {
146
- if DEBUG_CAST_API { print("[NATIVE] Could not leave chromecast session.") }
147
- }
148
- }
149
- }
150
-
151
- #else
152
-
153
- @objc(chromecastCasting:resolver:rejecter:)
154
- func chromecastCasting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
155
- if DEBUG_CAST_API { print(ERROR_MESSAGE_CHROMECAST_UNSUPPORTED_FEATURE) }
156
- resolve(false)
157
- }
158
-
159
- @objc(chromecastState:resolver:rejecter:)
160
- func chromecastState(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
161
- if DEBUG_CAST_API { print(ERROR_MESSAGE_CHROMECAST_UNSUPPORTED_FEATURE) }
162
- resolve("unavailable")
163
- }
164
-
165
- @objc(chromecastStart:)
166
- func chromecastStart(_ node: NSNumber) -> Void {
167
- if DEBUG_CAST_API { print(ERROR_MESSAGE_CHROMECAST_UNSUPPORTED_FEATURE) }
168
- }
169
-
170
- @objc(chromecastStop:)
171
- func chromecastStop(_ node: NSNumber) -> Void {
172
- if DEBUG_CAST_API { print(ERROR_MESSAGE_CHROMECAST_UNSUPPORTED_FEATURE) }
173
- }
174
-
175
- @objc(chromecastJoin:)
176
- func chromecastJoin(_ node: NSNumber) -> Void {
177
- if DEBUG_CAST_API { print(ERROR_MESSAGE_CHROMECAST_UNSUPPORTED_FEATURE) }
178
- }
179
-
180
- @objc(chromecastLeave:)
181
- func chromecastLeave(_ node: NSNumber) -> Void {
182
- if DEBUG_CAST_API { print(ERROR_MESSAGE_CHROMECAST_UNSUPPORTED_FEATURE) }
183
- }
184
-
185
- #endif
186
-
187
-
188
-
189
- // MARK: AIRPLAY SPECIFIC
190
-
191
- #if os(iOS)
192
-
193
- @objc(airplayCasting:resolver:rejecter:)
194
- func airplayCasting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
195
- DispatchQueue.main.async {
196
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
197
- if let cast = theView.cast(),
198
- let airplay = cast.airPlay {
199
- resolve(airplay.casting)
200
- } else {
201
- reject(ERROR_CODE_AIRPLAY_ACCESS_FAILURE, ERROR_MESSAGE_AIRPLAY_ACCESS_FAILURE, nil)
202
- if DEBUG_CAST_API { print("[NATIVE] Could not retrieve current airplay casting status.") }
203
- }
204
- }
205
- }
206
-
207
- @objc(airplayState:resolver:rejecter:)
208
- func airplayState(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
209
- DispatchQueue.main.async {
210
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
211
- if let cast = theView.cast(),
212
- let airplay = cast.airPlay {
213
- resolve(airplay.state._rawValue)
214
- } else {
215
- reject(ERROR_CODE_AIRPLAY_ACCESS_FAILURE, ERROR_MESSAGE_AIRPLAY_ACCESS_FAILURE, nil)
216
- if DEBUG_CAST_API { print("[NATIVE] Could not retrieve current airplay state.") }
217
- }
218
- }
219
- }
220
-
221
- @objc(airplayStart:)
222
- func airplayStart(_ node: NSNumber) -> Void {
223
- DispatchQueue.main.async {
224
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
225
- if let cast = theView.cast(),
226
- let airplay = cast.airPlay {
227
- if DEBUG_CAST_API { print("[NATIVE] Starting airplay session.") }
228
- airplay.start()
229
- } else {
230
- if DEBUG_CAST_API { print("[NATIVE] Could not start airplay session.") }
231
- }
232
- }
233
- }
234
-
235
- @objc(airplayStop:)
236
- func airplayStop(_ node: NSNumber) -> Void {
237
- DispatchQueue.main.async {
238
- let theView = self.bridge.uiManager.view(forReactTag: node) as! THEOplayerRCTView
239
- if let cast = theView.cast(),
240
- let airplay = cast.airPlay {
241
- if DEBUG_CAST_API { print("[NATIVE] Stopping airplay session.") }
242
- airplay.stop()
243
- } else {
244
- if DEBUG_CAST_API { print("[NATIVE] Could not stop airplay session.") }
245
- }
246
- }
247
- }
248
-
249
- #else
250
-
251
- @objc(airplayCasting:resolver:rejecter:)
252
- func airplayCasting(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
253
- if DEBUG_CAST_API { print(ERROR_MESSAGE_AIRPLAY_UNSUPPORTED_FEATURE) }
254
- resolve(false)
255
- }
256
-
257
- @objc(airplayState:resolver:rejecter:)
258
- func airplayState(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
259
- if DEBUG_CAST_API { print(ERROR_MESSAGE_AIRPLAY_UNSUPPORTED_FEATURE) }
260
- resolve("unavailable")
261
- }
262
-
263
- @objc(airplayStart:)
264
- func airplayStart(_ node: NSNumber) -> Void {
265
- if DEBUG_CAST_API { print(ERROR_MESSAGE_AIRPLAY_UNSUPPORTED_FEATURE) }
266
- }
267
-
268
- @objc(airplayStop:)
269
- func airplayStop(_ node: NSNumber) -> Void {
270
- if DEBUG_CAST_API { print(ERROR_MESSAGE_AIRPLAY_UNSUPPORTED_FEATURE) }
271
- }
272
-
273
- #endif
274
-
275
- }