react-native-theoplayer 1.7.2 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/README.md +2 -0
  2. package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +115 -0
  3. package/android/src/main/java/com/theoplayer/PlayerEventEmitter.kt +648 -0
  4. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.kt +23 -0
  5. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.kt +446 -0
  6. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.kt +117 -0
  7. package/android/src/main/java/com/theoplayer/{TimeUpdateRate.java → TimeUpdateRate.kt} +2 -2
  8. package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +161 -0
  9. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.kt +90 -0
  10. package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +140 -0
  11. package/android/src/main/java/com/theoplayer/cast/CastEventAdapter.kt +81 -0
  12. package/android/src/main/java/com/theoplayer/cast/CastModule.kt +75 -0
  13. package/android/src/main/java/com/theoplayer/drm/ContentProtectionAdapter.kt +2 -2
  14. package/android/src/main/java/com/theoplayer/drm/ContentProtectionModule.kt +1 -2
  15. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegration.kt +1 -2
  16. package/android/src/main/java/com/theoplayer/drm/ProxyContentProtectionIntegrationFactory.kt +3 -5
  17. package/android/src/main/java/com/theoplayer/source/SourceAdapter.kt +402 -0
  18. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.kt +6 -0
  19. package/android/src/main/java/com/theoplayer/track/MediaTrackType.kt +6 -0
  20. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.kt +43 -0
  21. package/android/src/main/java/com/theoplayer/track/QualityListFilter.kt +28 -0
  22. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.kt +10 -0
  23. package/android/src/main/java/com/theoplayer/track/TrackEventType.kt +7 -0
  24. package/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +219 -0
  25. package/android/src/main/java/com/theoplayer/util/ViewResolver.kt +19 -0
  26. package/ios/THEOplayerRCTAdAggregator.swift +12 -6
  27. package/ios/THEOplayerRCTAdsAPI.swift +39 -40
  28. package/ios/THEOplayerRCTBridge.m +52 -1
  29. package/ios/THEOplayerRCTCastAPI.swift +275 -0
  30. package/ios/THEOplayerRCTDebug.swift +3 -0
  31. package/ios/THEOplayerRCTSourceDescriptionBuilder.swift +91 -19
  32. package/ios/{THEOplayerRCTMetadataAggregator.swift → THEOplayerRCTTrackMetadataAggregator.swift} +12 -12
  33. package/ios/THEOplayerRCTView.swift +104 -24
  34. package/ios/THEOplayerRCTViewAdEventHandler.swift +2 -2
  35. package/ios/THEOplayerRCTViewCastEventHandler.swift +124 -0
  36. package/ios/THEOplayerRCTViewMainEventHandler.swift +1 -1
  37. package/ios/THEOplayerRCTViewMediaTrackEventHandler.swift +6 -6
  38. package/ios/THEOplayerRCTViewTextTrackEventHandler.swift +5 -5
  39. package/ios/custom/Frameworks/ios/put_custom_ios_xcframework_here.txt +1 -1
  40. package/ios/custom/Frameworks/tvos/put_custom_tvos_xcframework_here.txt +2 -0
  41. package/ios/custom/react-native-theoplayer_custom.podspec +46 -0
  42. package/lib/commonjs/api/THEOplayerView.js.map +1 -1
  43. package/lib/commonjs/api/barrel.js +21 -8
  44. package/lib/commonjs/api/barrel.js.map +1 -1
  45. package/lib/commonjs/api/cast/Airplay.js +6 -0
  46. package/lib/commonjs/api/cast/Airplay.js.map +1 -0
  47. package/lib/commonjs/api/cast/CastAPI.js +6 -0
  48. package/lib/commonjs/api/cast/CastAPI.js.map +1 -0
  49. package/lib/commonjs/api/cast/CastConfiguration.js +2 -0
  50. package/lib/commonjs/api/cast/CastConfiguration.js.map +1 -0
  51. package/lib/commonjs/api/cast/CastState.js +2 -0
  52. package/lib/commonjs/api/cast/CastState.js.map +1 -0
  53. package/lib/commonjs/api/cast/Chromecast.js +6 -0
  54. package/lib/commonjs/api/cast/Chromecast.js.map +1 -0
  55. package/lib/commonjs/api/cast/barrel.js +71 -0
  56. package/lib/commonjs/api/cast/barrel.js.map +1 -0
  57. package/lib/commonjs/api/config/PlayerConfiguration.js.map +1 -1
  58. package/lib/commonjs/api/error/ChromecastError.js +2 -0
  59. package/lib/commonjs/api/error/ChromecastError.js.map +1 -0
  60. package/lib/commonjs/api/error/barrel.js +13 -0
  61. package/lib/commonjs/api/error/barrel.js.map +1 -1
  62. package/lib/commonjs/api/event/CastEvent.js +21 -0
  63. package/lib/commonjs/api/event/CastEvent.js.map +1 -0
  64. package/lib/commonjs/api/event/barrel.js +25 -12
  65. package/lib/commonjs/api/event/barrel.js.map +1 -1
  66. package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
  67. package/lib/commonjs/api/source/barrel.js +13 -0
  68. package/lib/commonjs/api/source/barrel.js.map +1 -1
  69. package/lib/commonjs/api/source/metadata/MetadataDescription.js +2 -0
  70. package/lib/commonjs/api/source/metadata/MetadataDescription.js.map +1 -0
  71. package/lib/commonjs/api/source/metadata/barrel.js +19 -0
  72. package/lib/commonjs/api/source/metadata/barrel.js.map +1 -0
  73. package/lib/commonjs/internal/THEOplayerView.js +16 -0
  74. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  75. package/lib/commonjs/internal/THEOplayerView.web.js +9 -0
  76. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  77. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js +34 -0
  78. package/lib/commonjs/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  79. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js +46 -0
  80. package/lib/commonjs/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  81. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js +42 -0
  82. package/lib/commonjs/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  83. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js +31 -0
  84. package/lib/commonjs/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  85. package/lib/commonjs/internal/web/stub/CastButtonStub.js +16 -0
  86. package/lib/commonjs/internal/web/stub/CastButtonStub.js.map +1 -0
  87. package/lib/module/api/THEOplayerView.js.map +1 -1
  88. package/lib/module/api/barrel.js +1 -0
  89. package/lib/module/api/barrel.js.map +1 -1
  90. package/lib/module/api/cast/Airplay.js +2 -0
  91. package/lib/module/api/cast/Airplay.js.map +1 -0
  92. package/lib/module/api/cast/CastAPI.js +2 -0
  93. package/lib/module/api/cast/CastAPI.js.map +1 -0
  94. package/lib/module/api/cast/CastConfiguration.js +2 -0
  95. package/lib/module/api/cast/CastConfiguration.js.map +1 -0
  96. package/lib/module/api/cast/CastState.js +2 -0
  97. package/lib/module/api/cast/CastState.js.map +1 -0
  98. package/lib/module/api/cast/Chromecast.js +2 -0
  99. package/lib/module/api/cast/Chromecast.js.map +1 -0
  100. package/lib/module/api/cast/barrel.js +6 -0
  101. package/lib/module/api/cast/barrel.js.map +1 -0
  102. package/lib/module/api/config/PlayerConfiguration.js.map +1 -1
  103. package/lib/module/api/error/ChromecastError.js +2 -0
  104. package/lib/module/api/error/ChromecastError.js.map +1 -0
  105. package/lib/module/api/error/barrel.js +1 -0
  106. package/lib/module/api/error/barrel.js.map +1 -1
  107. package/lib/module/api/event/CastEvent.js +14 -0
  108. package/lib/module/api/event/CastEvent.js.map +1 -0
  109. package/lib/module/api/event/barrel.js +2 -1
  110. package/lib/module/api/event/barrel.js.map +1 -1
  111. package/lib/module/api/source/SourceDescription.js.map +1 -1
  112. package/lib/module/api/source/barrel.js +1 -0
  113. package/lib/module/api/source/barrel.js.map +1 -1
  114. package/lib/module/api/source/metadata/MetadataDescription.js +2 -0
  115. package/lib/module/api/source/metadata/MetadataDescription.js.map +1 -0
  116. package/lib/module/api/source/metadata/barrel.js +2 -0
  117. package/lib/module/api/source/metadata/barrel.js.map +1 -0
  118. package/lib/module/internal/THEOplayerView.js +15 -0
  119. package/lib/module/internal/THEOplayerView.js.map +1 -1
  120. package/lib/module/internal/THEOplayerView.web.js +8 -0
  121. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  122. package/lib/module/internal/cast/THEOplayerNativeAirplay.js +24 -0
  123. package/lib/module/internal/cast/THEOplayerNativeAirplay.js.map +1 -0
  124. package/lib/module/internal/cast/THEOplayerNativeCastApi.js +34 -0
  125. package/lib/module/internal/cast/THEOplayerNativeCastApi.js.map +1 -0
  126. package/lib/module/internal/cast/THEOplayerNativeChromecast.js +32 -0
  127. package/lib/module/internal/cast/THEOplayerNativeChromecast.js.map +1 -0
  128. package/lib/module/internal/cast/THEOplayerWebCastApi.js +22 -0
  129. package/lib/module/internal/cast/THEOplayerWebCastApi.js.map +1 -0
  130. package/lib/module/internal/web/stub/CastButtonStub.js +6 -0
  131. package/lib/module/internal/web/stub/CastButtonStub.js.map +1 -0
  132. package/lib/typescript/lib/commonjs/api/cast/Airplay.d.ts +1 -0
  133. package/lib/typescript/lib/commonjs/api/cast/CastAPI.d.ts +1 -0
  134. package/lib/typescript/lib/commonjs/api/cast/CastConfiguration.d.ts +0 -0
  135. package/lib/typescript/lib/commonjs/api/cast/CastState.d.ts +0 -0
  136. package/lib/typescript/lib/commonjs/api/cast/Chromecast.d.ts +1 -0
  137. package/lib/typescript/lib/commonjs/api/cast/barrel.d.ts +1 -0
  138. package/lib/typescript/lib/commonjs/api/error/ChromecastError.d.ts +0 -0
  139. package/lib/typescript/lib/commonjs/api/event/CastEvent.d.ts +2 -0
  140. package/lib/typescript/lib/commonjs/api/source/metadata/MetadataDescription.d.ts +0 -0
  141. package/lib/typescript/lib/commonjs/api/source/metadata/barrel.d.ts +1 -0
  142. package/lib/typescript/lib/commonjs/internal/THEOplayerView.d.ts +3 -0
  143. package/lib/typescript/lib/commonjs/internal/THEOplayerView.web.d.ts +3 -0
  144. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  145. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeCastApi.d.ts +12 -0
  146. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  147. package/lib/typescript/lib/commonjs/internal/cast/THEOplayerWebCastApi.d.ts +8 -0
  148. package/lib/typescript/lib/commonjs/internal/web/stub/CastButtonStub.d.ts +2 -0
  149. package/lib/typescript/lib/module/api/barrel.d.ts +1 -0
  150. package/lib/typescript/lib/module/api/cast/Airplay.d.ts +1 -0
  151. package/lib/typescript/lib/module/api/cast/CastAPI.d.ts +1 -0
  152. package/lib/typescript/lib/module/api/cast/CastConfiguration.d.ts +0 -0
  153. package/lib/typescript/lib/module/api/cast/CastState.d.ts +0 -0
  154. package/lib/typescript/lib/module/api/cast/Chromecast.d.ts +1 -0
  155. package/lib/typescript/lib/module/api/cast/barrel.d.ts +3 -0
  156. package/lib/typescript/lib/module/api/error/ChromecastError.d.ts +0 -0
  157. package/lib/typescript/lib/module/api/event/CastEvent.d.ts +1 -0
  158. package/lib/typescript/lib/module/api/event/barrel.d.ts +2 -1
  159. package/lib/typescript/lib/module/api/source/barrel.d.ts +1 -0
  160. package/lib/typescript/lib/module/api/source/metadata/MetadataDescription.d.ts +0 -0
  161. package/lib/typescript/lib/module/api/source/metadata/barrel.d.ts +1 -0
  162. package/lib/typescript/lib/module/internal/THEOplayerView.d.ts +3 -0
  163. package/lib/typescript/lib/module/internal/THEOplayerView.web.d.ts +3 -0
  164. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeAirplay.d.ts +8 -0
  165. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeCastApi.d.ts +11 -0
  166. package/lib/typescript/lib/module/internal/cast/THEOplayerNativeChromecast.d.ts +10 -0
  167. package/lib/typescript/lib/module/internal/cast/THEOplayerWebCastApi.d.ts +7 -0
  168. package/lib/typescript/lib/module/internal/web/stub/CastButtonStub.d.ts +2 -0
  169. package/lib/typescript/src/api/THEOplayerView.d.ts +10 -0
  170. package/lib/typescript/src/api/barrel.d.ts +1 -0
  171. package/lib/typescript/src/api/cast/Airplay.d.ts +27 -0
  172. package/lib/typescript/src/api/cast/CastAPI.d.ts +25 -0
  173. package/lib/typescript/src/api/cast/CastConfiguration.d.ts +41 -0
  174. package/lib/typescript/src/api/cast/CastState.d.ts +10 -0
  175. package/lib/typescript/src/api/cast/Chromecast.d.ts +39 -0
  176. package/lib/typescript/src/api/cast/barrel.d.ts +5 -0
  177. package/lib/typescript/src/api/config/PlayerConfiguration.d.ts +6 -1
  178. package/lib/typescript/src/api/error/ChromecastError.d.ts +34 -0
  179. package/lib/typescript/src/api/error/barrel.d.ts +1 -0
  180. package/lib/typescript/src/api/event/CastEvent.d.ts +21 -0
  181. package/lib/typescript/src/api/event/barrel.d.ts +2 -1
  182. package/lib/typescript/src/api/source/SourceDescription.d.ts +7 -0
  183. package/lib/typescript/src/api/source/barrel.d.ts +1 -0
  184. package/lib/typescript/src/api/source/metadata/MetadataDescription.d.ts +12 -0
  185. package/lib/typescript/src/api/source/metadata/barrel.d.ts +1 -0
  186. package/lib/typescript/src/internal/THEOplayerView.d.ts +5 -1
  187. package/lib/typescript/src/internal/THEOplayerView.web.d.ts +3 -1
  188. package/lib/typescript/src/internal/cast/THEOplayerNativeAirplay.d.ts +9 -0
  189. package/lib/typescript/src/internal/cast/THEOplayerNativeCastApi.d.ts +10 -0
  190. package/lib/typescript/src/internal/cast/THEOplayerNativeChromecast.d.ts +11 -0
  191. package/lib/typescript/src/internal/cast/THEOplayerWebCastApi.d.ts +9 -0
  192. package/lib/typescript/src/internal/web/stub/CastButtonStub.d.ts +3 -0
  193. package/package.json +2 -2
  194. package/react-native-theoplayer.podspec +2 -2
  195. package/src/api/THEOplayerView.ts +12 -0
  196. package/src/api/barrel.ts +1 -0
  197. package/src/api/cast/Airplay.ts +31 -0
  198. package/src/api/cast/CastAPI.ts +30 -0
  199. package/src/api/cast/CastConfiguration.ts +44 -0
  200. package/src/api/cast/CastState.ts +10 -0
  201. package/src/api/cast/Chromecast.ts +45 -0
  202. package/src/api/cast/barrel.ts +5 -0
  203. package/src/api/config/PlayerConfiguration.ts +7 -1
  204. package/src/api/error/ChromecastError.ts +46 -0
  205. package/src/api/error/barrel.ts +1 -0
  206. package/src/api/event/CastEvent.ts +45 -0
  207. package/src/api/event/barrel.ts +2 -1
  208. package/src/api/source/SourceDescription.ts +8 -0
  209. package/src/api/source/barrel.ts +1 -0
  210. package/src/api/source/metadata/MetadataDescription.ts +13 -0
  211. package/src/api/source/metadata/barrel.ts +1 -0
  212. package/src/internal/THEOplayerView.tsx +17 -0
  213. package/src/internal/THEOplayerView.web.tsx +8 -1
  214. package/src/internal/cast/THEOplayerNativeAirplay.ts +22 -0
  215. package/src/internal/cast/THEOplayerNativeCastApi.ts +28 -0
  216. package/src/internal/cast/THEOplayerNativeChromecast.ts +30 -0
  217. package/src/internal/cast/THEOplayerWebCastApi.ts +21 -0
  218. package/src/internal/web/stub/CastButtonStub.tsx +7 -0
  219. package/android/src/main/java/com/theoplayer/PlayerConfigHelper.java +0 -70
  220. package/android/src/main/java/com/theoplayer/ReactTHEOplayerPackage.java +0 -32
  221. package/android/src/main/java/com/theoplayer/ReactTHEOplayerView.java +0 -525
  222. package/android/src/main/java/com/theoplayer/ReactTHEOplayerViewManager.java +0 -127
  223. package/android/src/main/java/com/theoplayer/SourceHelper.java +0 -362
  224. package/android/src/main/java/com/theoplayer/VideoEventEmitter.java +0 -578
  225. package/android/src/main/java/com/theoplayer/ads/AdEventAdapter.java +0 -92
  226. package/android/src/main/java/com/theoplayer/ads/AdInfo.java +0 -168
  227. package/android/src/main/java/com/theoplayer/ads/AdsModule.java +0 -152
  228. package/android/src/main/java/com/theoplayer/track/MediaTrackEventType.java +0 -11
  229. package/android/src/main/java/com/theoplayer/track/MediaTrackType.java +0 -11
  230. package/android/src/main/java/com/theoplayer/track/QualityListAdapter.java +0 -54
  231. package/android/src/main/java/com/theoplayer/track/QualityListFilter.java +0 -40
  232. package/android/src/main/java/com/theoplayer/track/TextTrackCueEventType.java +0 -11
  233. package/android/src/main/java/com/theoplayer/track/TrackEventType.java +0 -12
  234. package/android/src/main/java/com/theoplayer/track/TrackListInfo.java +0 -234
  235. package/android/src/main/java/com/theoplayer/util/ViewResolver.java +0 -42
  236. package/ios/custom/react-native-theoplayer_custom_ios.podspec +0 -36
@@ -1,362 +0,0 @@
1
- package com.theoplayer;
2
-
3
- import android.text.TextUtils;
4
-
5
- import androidx.annotation.NonNull;
6
- import androidx.annotation.Nullable;
7
-
8
- import com.facebook.react.bridge.ReadableArray;
9
- import com.facebook.react.bridge.ReadableMap;
10
- import com.google.gson.Gson;
11
- import com.theoplayer.android.api.error.ErrorCode;
12
- import com.theoplayer.android.api.error.THEOplayerException;
13
- import com.theoplayer.android.api.event.ads.AdIntegrationKind;
14
- import com.theoplayer.android.api.player.track.texttrack.TextTrackKind;
15
- import com.theoplayer.android.api.source.GoogleDaiTypedSource;
16
- import com.theoplayer.android.api.source.SourceDescription;
17
- import com.theoplayer.android.api.source.SourceType;
18
- import com.theoplayer.android.api.source.TextTrackDescription;
19
- import com.theoplayer.android.api.source.TypedSource;
20
- import com.theoplayer.android.api.source.addescription.AdDescription;
21
- import com.theoplayer.android.api.source.addescription.GoogleImaAdDescription;
22
- import com.theoplayer.android.api.source.drm.DRMConfiguration;
23
- import com.theoplayer.android.api.source.hls.HlsPlaybackConfiguration;
24
- import com.theoplayer.android.api.source.ssai.SsaiIntegration;
25
- import com.theoplayer.android.api.source.ssai.YoSpaceDescription;
26
- import com.theoplayer.android.api.source.ssai.dai.GoogleDaiLiveConfiguration;
27
- import com.theoplayer.android.api.source.ssai.dai.GoogleDaiVodConfiguration;
28
- import com.theoplayer.drm.ContentProtectionAdapter;
29
-
30
- import org.json.JSONArray;
31
- import org.json.JSONException;
32
- import org.json.JSONObject;
33
-
34
- import java.util.ArrayList;
35
- import java.util.HashMap;
36
- import java.util.Map;
37
-
38
- /**
39
- * Source parsing helper class, because we don't support GSON object deserialization currently
40
- */
41
- public class SourceHelper {
42
-
43
- private static final String PROP_CONTENT_PROTECTION = "contentProtection";
44
- private static final String PROP_LIVE_OFFSET = "liveOffset";
45
- private static final String PROP_HLS_DATERANGE = "hlsDateRange";
46
- private static final String PROP_HLS_PLAYBACK_CONFIG = "hls";
47
- private static final String PROP_TIME_SERVER = "timeServer";
48
- public static final String PROP_SSAI = "ssai";
49
- public static final String PROP_TYPE = "type";
50
- public static final String PROP_SRC = "src";
51
- public static final String PROP_SOURCES = "sources";
52
- public static final String PROP_DEFAULT = "default";
53
- public static final String PROP_LABEL = "label";
54
- public static final String PROP_KIND = "kind";
55
- public static final String PROP_TIME_OFFSET = "timeOffset";
56
- public static final String PROP_INTEGRATION = "integration";
57
- public static final String PROP_TEXT_TRACKS = "textTracks";
58
- public static final String PROP_POSTER = "poster";
59
- public static final String PROP_ADS = "ads";
60
- public static final String PROP_AVAILABILITY_TYPE = "availabilityType";
61
-
62
- private static final String ERROR_DAI_NOT_ENABLED = "Google DAI support not enabled.";
63
- private static final String ERROR_UNSUPPORTED_SSAI_INTEGRATION = "Unsupported SSAI integration";
64
- private static final String ERROR_MISSING_SSAI_INTEGRATION = "Missing SSAI integration";
65
- private static final String ERROR_IMA_NOT_ENABLED = "Google IMA support not enabled.";
66
- private static final String ERROR_UNSUPPORTED_CSAI_INTEGRATION = "Unsupported CSAI integration";
67
- private static final String ERROR_MISSING_CSAI_INTEGRATION = "Missing CSAI integration";
68
-
69
- private final Gson gson = new Gson();
70
-
71
- public SourceDescription parseSourceFromJS(ReadableMap source) throws THEOplayerException {
72
- HashMap<String, Object> hashmap = eliminateReadables(source);
73
- try {
74
- String json = gson.toJson(hashmap);
75
- JSONObject jsonSourceObject = new JSONObject(json);
76
-
77
- // typed sources
78
- ArrayList<TypedSource> typedSources = new ArrayList<>();
79
-
80
- // sources can be an array or single object
81
- JSONArray jsonSources = jsonSourceObject.optJSONArray(PROP_SOURCES);
82
- if (jsonSources != null) {
83
- for (int i = 0 ; i < jsonSources.length(); i++) {
84
- TypedSource typedSource = parseTypedSource((JSONObject)jsonSources.get(i));
85
- if (typedSource != null) {
86
- typedSources.add(typedSource);
87
- }
88
- }
89
- } else {
90
- TypedSource typedSource = parseTypedSource(jsonSourceObject.getJSONObject(PROP_SOURCES));
91
- if (typedSource != null) {
92
- typedSources.add(typedSource);
93
- }
94
- }
95
-
96
- // poster
97
- String poster = jsonSourceObject.optString(PROP_POSTER);
98
-
99
- // ads
100
- JSONArray jsonAds = jsonSourceObject.optJSONArray(PROP_ADS);
101
- ArrayList<AdDescription> ads = new ArrayList<>();
102
- if (jsonAds != null) {
103
- for (int i = 0 ; i < jsonAds.length(); i++) {
104
- JSONObject jsonAdDescription = (JSONObject) jsonAds.get(i);
105
-
106
- // Currently only ima-ads are supported.
107
- ads.add(parseAdFromJS(jsonAdDescription));
108
- }
109
- }
110
-
111
- // Side-loaded text tracks
112
- JSONArray textTracks = jsonSourceObject.optJSONArray(PROP_TEXT_TRACKS);
113
- ArrayList<TextTrackDescription> sideLoadedTextTracks = new ArrayList<>();
114
- if (textTracks != null) {
115
- for (int i = 0 ; i < textTracks.length(); i++) {
116
- JSONObject jsonTextTrack = (JSONObject) textTracks.get(i);
117
- sideLoadedTextTracks.add(parseTextTrackFromJS(jsonTextTrack));
118
- }
119
- }
120
-
121
- return SourceDescription.Builder.sourceDescription(typedSources.toArray(new TypedSource[]{}))
122
- .poster(poster)
123
- .ads(ads.toArray(new AdDescription[]{}))
124
- .textTracks(sideLoadedTextTracks.toArray(new TextTrackDescription[]{}))
125
- .build();
126
- } catch (JSONException e) {
127
- e.printStackTrace();
128
- }
129
-
130
- return null;
131
- }
132
-
133
- @Nullable
134
- private TypedSource parseTypedSource(@NonNull final JSONObject jsonTypedSource) throws THEOplayerException {
135
- try {
136
- TypedSource.Builder tsBuilder = TypedSource.Builder.typedSource();
137
- SourceType sourceType = parseSourceType(jsonTypedSource);
138
-
139
- if (jsonTypedSource.has(PROP_SSAI)) {
140
- final JSONObject ssaiJson = jsonTypedSource.getJSONObject(PROP_SSAI);
141
-
142
- // Check for valid SsaiIntegration
143
- final String ssaiIntegrationStr = ssaiJson.optString(PROP_INTEGRATION);
144
- if (!TextUtils.isEmpty(ssaiIntegrationStr)) {
145
- SsaiIntegration ssaiIntegration = SsaiIntegration.from(ssaiIntegrationStr);
146
- if (ssaiIntegration == null) {
147
- throw new THEOplayerException(ErrorCode.AD_ERROR, ERROR_UNSUPPORTED_SSAI_INTEGRATION + ": " + ssaiIntegrationStr);
148
- }
149
- switch (ssaiIntegration) {
150
- case GOOGLE_DAI:
151
- if (!BuildConfig.EXTENSION_GOOGLE_DAI) {
152
- throw new THEOplayerException(ErrorCode.AD_ERROR, ERROR_DAI_NOT_ENABLED);
153
- }
154
- if (ssaiJson.optString(PROP_AVAILABILITY_TYPE).equals("vod")) {
155
- tsBuilder = new GoogleDaiTypedSource.Builder(gson.fromJson(ssaiJson.toString(), GoogleDaiVodConfiguration.class));
156
- } else {
157
- tsBuilder = new GoogleDaiTypedSource.Builder(gson.fromJson(ssaiJson.toString(), GoogleDaiLiveConfiguration.class));
158
- }
159
- // Prefer DASH if not SSAI type specified
160
- if (sourceType == null) {
161
- tsBuilder.type(SourceType.DASH);
162
- }
163
- break;
164
- case YOSPACE:
165
- tsBuilder.ssai(gson.fromJson(ssaiJson.toString(), YoSpaceDescription.class));
166
- break;
167
- default:
168
- throw new THEOplayerException(ErrorCode.AD_ERROR, ERROR_UNSUPPORTED_SSAI_INTEGRATION + ": " + ssaiIntegrationStr);
169
- }
170
- } else {
171
- throw new THEOplayerException(ErrorCode.AD_ERROR, ERROR_MISSING_SSAI_INTEGRATION);
172
- }
173
- }
174
- tsBuilder.src(jsonTypedSource.optString(PROP_SRC));
175
- if (sourceType != null) {
176
- tsBuilder.type(sourceType);
177
- }
178
- if (jsonTypedSource.has(PROP_LIVE_OFFSET)) {
179
- tsBuilder.liveOffset(jsonTypedSource.getDouble(PROP_LIVE_OFFSET));
180
- }
181
- if (jsonTypedSource.has(PROP_HLS_DATERANGE)) {
182
- tsBuilder.hlsDateRange(jsonTypedSource.getBoolean(PROP_HLS_DATERANGE));
183
- }
184
- if (jsonTypedSource.has(PROP_HLS_PLAYBACK_CONFIG)) {
185
- HlsPlaybackConfiguration hlsConfig =
186
- gson.fromJson(jsonTypedSource.get(PROP_HLS_PLAYBACK_CONFIG).toString(), HlsPlaybackConfiguration.class);
187
- tsBuilder.hls(hlsConfig);
188
- }
189
- if (jsonTypedSource.has(PROP_TIME_SERVER)) {
190
- tsBuilder.timeServer(jsonTypedSource.getString(PROP_TIME_SERVER));
191
- }
192
- if (jsonTypedSource.has(PROP_CONTENT_PROTECTION)) {
193
- DRMConfiguration drmConfig =
194
- ContentProtectionAdapter.INSTANCE.drmConfigurationFromJson(jsonTypedSource.getJSONObject(PROP_CONTENT_PROTECTION));
195
- if (drmConfig != null) {
196
- tsBuilder.drm(drmConfig);
197
- }
198
- }
199
- return tsBuilder.build();
200
- } catch (JSONException e) {
201
- e.printStackTrace();
202
- }
203
- return null;
204
- }
205
-
206
- private static SourceType parseSourceType(@NonNull final JSONObject jsonTypedSource) {
207
- String type = jsonTypedSource.optString(PROP_TYPE);
208
- if (!type.isEmpty()) {
209
- if ("application/dash+xml".equals(type)) {
210
- return SourceType.DASH;
211
- }
212
- if ("application/x-mpegurl".equals(type)) {
213
- return SourceType.HLSX;
214
- }
215
- if ("application/vnd.theo.hesp+json".equals(type)) {
216
- return SourceType.HESP;
217
- }
218
- if ("application/vnd.apple.mpegurl".equals(type)) {
219
- return SourceType.HLS;
220
- }
221
- if ("video/mp4".equals(type)) {
222
- return SourceType.MP4;
223
- }
224
- if ("audio/mpeg".equals(type)) {
225
- return SourceType.MP3;
226
- }
227
- } else {
228
- // No type given, check for known extension.
229
- String src = jsonTypedSource.optString(PROP_SRC);
230
- if (src.endsWith(".mpd")) {
231
- return SourceType.DASH;
232
- }
233
- if (src.endsWith(".m3u8")) {
234
- return SourceType.HLSX;
235
- }
236
- if (src.endsWith(".mp4")) {
237
- return SourceType.MP4;
238
- }
239
- if (src.endsWith(".mp3")) {
240
- return SourceType.MP3;
241
- }
242
- }
243
- return null;
244
- }
245
-
246
- @Nullable
247
- public AdDescription parseAdFromJS(ReadableMap map) throws THEOplayerException {
248
- HashMap<String, Object> hashmap = eliminateReadables(map);
249
- try {
250
- JSONObject jsonAdDescription = new JSONObject(gson.toJson(hashmap));
251
- return parseAdFromJS(jsonAdDescription);
252
- } catch(JSONException e) {
253
- e.printStackTrace();
254
- return null;
255
- }
256
- }
257
-
258
- @NonNull
259
- public static AdDescription parseAdFromJS(JSONObject jsonAdDescription) throws JSONException, THEOplayerException {
260
- final String integrationKindStr = jsonAdDescription.optString(PROP_INTEGRATION);
261
- if (!TextUtils.isEmpty(integrationKindStr)) {
262
- AdIntegrationKind integrationKind = AdIntegrationKind.from(integrationKindStr);
263
- switch (integrationKind) {
264
- // Currently only IMA is supported.
265
- case GOOGLE_IMA:
266
- return parseImaAdFromJS(jsonAdDescription);
267
- case DEFAULT:
268
- case THEO:
269
- case FREEWHEEL:
270
- case SPOTX:
271
- default: {
272
- throw new THEOplayerException(ErrorCode.AD_ERROR, ERROR_UNSUPPORTED_CSAI_INTEGRATION + ": " + integrationKindStr);
273
- }
274
- }
275
- } else {
276
- throw new THEOplayerException(ErrorCode.AD_ERROR, ERROR_MISSING_CSAI_INTEGRATION + ": " + integrationKindStr);
277
- }
278
- }
279
-
280
- @NonNull
281
- private static GoogleImaAdDescription parseImaAdFromJS(JSONObject jsonAdDescription) throws THEOplayerException {
282
- if (!BuildConfig.EXTENSION_GOOGLE_IMA) {
283
- throw new THEOplayerException(ErrorCode.AD_ERROR, ERROR_IMA_NOT_ENABLED);
284
- }
285
- String source;
286
- // Property `sources` is of type string | AdSource.
287
- JSONObject sourceObj = jsonAdDescription.optJSONObject(PROP_SOURCES);
288
- if (sourceObj != null) {
289
- source = sourceObj.optString(PROP_SRC);
290
- } else {
291
- source = jsonAdDescription.optString(PROP_SOURCES);
292
- }
293
- return GoogleImaAdDescription.Builder.googleImaAdDescription()
294
- .source(source)
295
- .timeOffset(jsonAdDescription.optString(PROP_TIME_OFFSET))
296
- .build();
297
- }
298
-
299
- private static TextTrackDescription parseTextTrackFromJS(JSONObject jsonTextTrack) throws JSONException {
300
- TextTrackDescription.Builder builder = TextTrackDescription.Builder.textTrackDescription()
301
- .isDefault(jsonTextTrack.optBoolean(PROP_DEFAULT))
302
- .src(jsonTextTrack.optString(PROP_SRC))
303
- .label(jsonTextTrack.optString(PROP_LABEL))
304
- .kind(parseTextTrackKind(jsonTextTrack.optString(PROP_KIND)));
305
- return builder.build();
306
- }
307
-
308
- private static TextTrackKind parseTextTrackKind(String kind) {
309
- if (kind == null) {
310
- return null;
311
- }
312
- switch (kind) {
313
- case "subtitles": return TextTrackKind.SUBTITLES;
314
- case "metadata": return TextTrackKind.METADATA;
315
- case "captions": return TextTrackKind.CAPTIONS;
316
- case "chapters": return TextTrackKind.CHAPTERS;
317
- case "descriptions": return TextTrackKind.DESCRIPTIONS;
318
- }
319
- return null;
320
- }
321
-
322
- /**
323
- * Eliminate all the Readable* classes from the map.
324
- */
325
- protected static HashMap<String, Object> eliminateReadables(ReadableMap readableMap) {
326
- HashMap<String, Object> hashMap = readableMap.toHashMap();
327
- HashMap<String, Object> eliminatedHashMap = new HashMap<>();
328
-
329
- for (Map.Entry<String, Object> entry : hashMap.entrySet()) {
330
- Object value = entry.getValue();
331
- if (value instanceof ReadableMap) {
332
- value = eliminateReadables((ReadableMap) value);
333
- } else if (value instanceof ReadableArray) {
334
- value = eliminateReadables((ReadableArray) value);
335
- }
336
- eliminatedHashMap.put(entry.getKey(), value);
337
- }
338
- return eliminatedHashMap;
339
- }
340
-
341
- /**
342
- * Eliminate all the Readable* classes from the array.
343
- */
344
- protected static ArrayList<Object> eliminateReadables(ReadableArray readableArray) {
345
- ArrayList<Object> arrayList = readableArray.toArrayList();
346
- ArrayList<Object> eliminatedArrayList = new ArrayList<>();
347
-
348
- for (Object o : arrayList) {
349
- Object value = o;
350
-
351
- if (value instanceof ReadableMap) {
352
- value = eliminateReadables((ReadableMap) value);
353
- } else if (value instanceof ReadableArray) {
354
- value = eliminateReadables((ReadableArray) value);
355
- }
356
-
357
- eliminatedArrayList.add(value);
358
- }
359
-
360
- return eliminatedArrayList;
361
- }
362
- }