spactureai-mobile-player 1.0.30

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 (492) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +474 -0
  3. package/UnifiedPlayer.podspec +51 -0
  4. package/android/CMakeLists.txt +29 -0
  5. package/android/build.gradle +249 -0
  6. package/android/fix-prefab.gradle +51 -0
  7. package/android/gradle.properties +15 -0
  8. package/android/src/main/AndroidManifest.xml +10 -0
  9. package/android/src/main/AndroidManifestNew.xml +9 -0
  10. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  11. package/android/src/main/java/com/unifiedplayer/core/AudioFocusManager.kt +233 -0
  12. package/android/src/main/java/com/unifiedplayer/core/VideoError.kt +105 -0
  13. package/android/src/main/java/com/unifiedplayer/core/VideoManager.kt +292 -0
  14. package/android/src/main/java/com/unifiedplayer/core/extensions/ResizeMode+AspectRatioFrameLayout.kt +20 -0
  15. package/android/src/main/java/com/unifiedplayer/core/extensions/SubtitleType+toString.kt +14 -0
  16. package/android/src/main/java/com/unifiedplayer/core/extensions/VideoPlaybackService+ServiceManagment.kt +59 -0
  17. package/android/src/main/java/com/unifiedplayer/core/fragments/FullscreenVideoFragment.kt +346 -0
  18. package/android/src/main/java/com/unifiedplayer/core/fragments/PictureInPictureHelperFragment.kt +85 -0
  19. package/android/src/main/java/com/unifiedplayer/core/player/DRMManagerSpec.kt +23 -0
  20. package/android/src/main/java/com/unifiedplayer/core/player/DataSourceFactoryUtils.kt +93 -0
  21. package/android/src/main/java/com/unifiedplayer/core/player/MediaItemUtils.kt +141 -0
  22. package/android/src/main/java/com/unifiedplayer/core/player/MediaSourceUtils.kt +134 -0
  23. package/android/src/main/java/com/unifiedplayer/core/player/OnAudioFocusChangedListener.kt +25 -0
  24. package/android/src/main/java/com/unifiedplayer/core/plugins/PluginsRegistry.kt +223 -0
  25. package/android/src/main/java/com/unifiedplayer/core/plugins/ReactNativeVideoPlugin.kt +173 -0
  26. package/android/src/main/java/com/unifiedplayer/core/recivers/AudioBecomingNoisyReceiver.kt +38 -0
  27. package/android/src/main/java/com/unifiedplayer/core/services/playback/CustomMediaNotificationProvider.kt +151 -0
  28. package/android/src/main/java/com/unifiedplayer/core/services/playback/VideoPlaybackCallback.kt +96 -0
  29. package/android/src/main/java/com/unifiedplayer/core/services/playback/VideoPlaybackService.kt +219 -0
  30. package/android/src/main/java/com/unifiedplayer/core/services/playback/VideoPlaybackServiceConnection.kt +59 -0
  31. package/android/src/main/java/com/unifiedplayer/core/utils/PictureInPictureUtils.kt +153 -0
  32. package/android/src/main/java/com/unifiedplayer/core/utils/SmallVideoPlayerOptimizer.kt +157 -0
  33. package/android/src/main/java/com/unifiedplayer/core/utils/SourceLoader.kt +48 -0
  34. package/android/src/main/java/com/unifiedplayer/core/utils/TextTrackUtils.kt +175 -0
  35. package/android/src/main/java/com/unifiedplayer/core/utils/Threading.kt +75 -0
  36. package/android/src/main/java/com/unifiedplayer/core/utils/VideoFileHelper.kt +51 -0
  37. package/android/src/main/java/com/unifiedplayer/core/utils/VideoInformationUtils.kt +67 -0
  38. package/android/src/main/java/com/unifiedplayer/core/utils/VideoOrientationUtils.kt +30 -0
  39. package/android/src/main/java/com/unifiedplayer/hybrids/videoplayer/HybridVideoPlayer.kt +732 -0
  40. package/android/src/main/java/com/unifiedplayer/hybrids/videoplayer/HybridVideoPlayerFactory.kt +16 -0
  41. package/android/src/main/java/com/unifiedplayer/hybrids/videoplayereventemitter/HybridVideoPlayerEventEmitter.kt +180 -0
  42. package/android/src/main/java/com/unifiedplayer/hybrids/videoplayersource/HybridVideoPlayerSource.kt +67 -0
  43. package/android/src/main/java/com/unifiedplayer/hybrids/videoplayersource/HybridVideoPlayerSourceFactory.kt +58 -0
  44. package/android/src/main/java/com/unifiedplayer/hybrids/videoviewviewmanager/HybridVideoViewViewManager.kt +187 -0
  45. package/android/src/main/java/com/unifiedplayer/hybrids/videoviewviewmanager/HybridVideoViewViewManagerFactory.kt +13 -0
  46. package/android/src/main/java/com/unifiedplayer/react/VideoPackage.kt +25 -0
  47. package/android/src/main/java/com/unifiedplayer/react/VideoViewViewManager.kt +78 -0
  48. package/android/src/main/java/com/unifiedplayer/view/VideoView.kt +565 -0
  49. package/android/src/main/res/layout/custom_player_control_view.xml +82 -0
  50. package/android/src/main/res/layout/player_view_surface.xml +13 -0
  51. package/android/src/main/res/layout/player_view_texture.xml +13 -0
  52. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCVideoViewManagerDelegate.java +32 -0
  53. package/android/src/paper/java/com/facebook/react/viewmanagers/RNCVideoViewManagerInterface.java +16 -0
  54. package/android/src/stubs/dash/androidx/media3/exoplayer/dash/DashMediaSource.kt +35 -0
  55. package/android/src/stubs/dash/androidx/media3/exoplayer/dash/DashUtil.kt +11 -0
  56. package/android/src/stubs/dash/androidx/media3/exoplayer/dash/manifest/AdaptationSet.kt +9 -0
  57. package/android/src/stubs/dash/androidx/media3/exoplayer/dash/manifest/DashManifest.kt +10 -0
  58. package/android/src/stubs/dash/androidx/media3/exoplayer/dash/manifest/Period.kt +7 -0
  59. package/android/src/stubs/dash/androidx/media3/exoplayer/dash/manifest/Representation.kt +8 -0
  60. package/android/src/stubs/hls/androidx/media3/exoplayer/hls/HlsMediaSource.kt +33 -0
  61. package/ios/RNCVideoViewManager.mm +39 -0
  62. package/ios/Video-Bridging-Header.h +2 -0
  63. package/ios/core/HLSAuthProxy.swift +428 -0
  64. package/ios/core/VideoError.swift +164 -0
  65. package/ios/core/VideoManager.swift +219 -0
  66. package/ios/hybrids/VideoPlayer/HybridVideoPlayer.swift +697 -0
  67. package/ios/hybrids/VideoPlayer/HybridVideoPlayerFactory.swift +15 -0
  68. package/ios/hybrids/VideoPlayer/VLCPlaybackDelegates.swift +58 -0
  69. package/ios/hybrids/VideoPlayerEmitter/HybridVideoPlayerEventEmitter.swift +203 -0
  70. package/ios/hybrids/VideoPlayerSource/HybridVideoPlayerSource.swift +55 -0
  71. package/ios/hybrids/VideoPlayerSource/HybridVideoPlayerSourceFactory.swift +29 -0
  72. package/ios/hybrids/VideoViewViewManager/HybridVideoViewViewManager.swift +266 -0
  73. package/ios/hybrids/VideoViewViewManager/HybridVideoViewViewManagerFactory.swift +14 -0
  74. package/ios/view/VideoComponentView.swift +196 -0
  75. package/ios/view/VideoComponentViewObserver.swift +48 -0
  76. package/lib/module/core/VideoPlayer.js +287 -0
  77. package/lib/module/core/VideoPlayer.js.map +1 -0
  78. package/lib/module/core/VideoPlayerEvents.js +84 -0
  79. package/lib/module/core/VideoPlayerEvents.js.map +1 -0
  80. package/lib/module/core/hooks/useEvent.js +19 -0
  81. package/lib/module/core/hooks/useEvent.js.map +1 -0
  82. package/lib/module/core/hooks/useManagedInstance.js +75 -0
  83. package/lib/module/core/hooks/useManagedInstance.js.map +1 -0
  84. package/lib/module/core/hooks/useVideoPlayer.js +57 -0
  85. package/lib/module/core/hooks/useVideoPlayer.js.map +1 -0
  86. package/lib/module/core/types/BufferConfig.js +2 -0
  87. package/lib/module/core/types/BufferConfig.js.map +1 -0
  88. package/lib/module/core/types/DrmParams.js +2 -0
  89. package/lib/module/core/types/DrmParams.js.map +1 -0
  90. package/lib/module/core/types/Events.js +10 -0
  91. package/lib/module/core/types/Events.js.map +1 -0
  92. package/lib/module/core/types/IgnoreSilentSwitchMode.js +2 -0
  93. package/lib/module/core/types/IgnoreSilentSwitchMode.js.map +1 -0
  94. package/lib/module/core/types/MixAudioMode.js +2 -0
  95. package/lib/module/core/types/MixAudioMode.js.map +1 -0
  96. package/lib/module/core/types/ResizeMode.js +2 -0
  97. package/lib/module/core/types/ResizeMode.js.map +1 -0
  98. package/lib/module/core/types/TextTrack.js +2 -0
  99. package/lib/module/core/types/TextTrack.js.map +1 -0
  100. package/lib/module/core/types/Utils.js +2 -0
  101. package/lib/module/core/types/Utils.js.map +1 -0
  102. package/lib/module/core/types/VideoConfig.js +4 -0
  103. package/lib/module/core/types/VideoConfig.js.map +1 -0
  104. package/lib/module/core/types/VideoError.js +100 -0
  105. package/lib/module/core/types/VideoError.js.map +1 -0
  106. package/lib/module/core/types/VideoInformation.js +4 -0
  107. package/lib/module/core/types/VideoInformation.js.map +1 -0
  108. package/lib/module/core/types/VideoOrientation.js +2 -0
  109. package/lib/module/core/types/VideoOrientation.js.map +1 -0
  110. package/lib/module/core/types/VideoPlayerBase.js +4 -0
  111. package/lib/module/core/types/VideoPlayerBase.js.map +1 -0
  112. package/lib/module/core/types/VideoPlayerSourceBase.js +4 -0
  113. package/lib/module/core/types/VideoPlayerSourceBase.js.map +1 -0
  114. package/lib/module/core/types/VideoPlayerStatus.js +2 -0
  115. package/lib/module/core/types/VideoPlayerStatus.js.map +1 -0
  116. package/lib/module/core/utils/playerFactory.js +25 -0
  117. package/lib/module/core/utils/playerFactory.js.map +1 -0
  118. package/lib/module/core/utils/sourceFactory.js +138 -0
  119. package/lib/module/core/utils/sourceFactory.js.map +1 -0
  120. package/lib/module/core/video-view/NativeVideoView.tsx +18 -0
  121. package/lib/module/core/video-view/VideoView.js +261 -0
  122. package/lib/module/core/video-view/VideoView.js.map +1 -0
  123. package/lib/module/expo-plugins/@types.js +2 -0
  124. package/lib/module/expo-plugins/@types.js.map +1 -0
  125. package/lib/module/expo-plugins/getPackageInfo.js +23 -0
  126. package/lib/module/expo-plugins/getPackageInfo.js.map +1 -0
  127. package/lib/module/expo-plugins/withAndroidExtensions.js +35 -0
  128. package/lib/module/expo-plugins/withAndroidExtensions.js.map +1 -0
  129. package/lib/module/expo-plugins/withAndroidNotificationControls.js +29 -0
  130. package/lib/module/expo-plugins/withAndroidNotificationControls.js.map +1 -0
  131. package/lib/module/expo-plugins/withAndroidPictureInPicture.js +18 -0
  132. package/lib/module/expo-plugins/withAndroidPictureInPicture.js.map +1 -0
  133. package/lib/module/expo-plugins/withBackgroundAudio.js +22 -0
  134. package/lib/module/expo-plugins/withBackgroundAudio.js.map +1 -0
  135. package/lib/module/expo-plugins/withReactNativeVideo.js +27 -0
  136. package/lib/module/expo-plugins/withReactNativeVideo.js.map +1 -0
  137. package/lib/module/expo-plugins/writeToPodfile.js +53 -0
  138. package/lib/module/expo-plugins/writeToPodfile.js.map +1 -0
  139. package/lib/module/index.js +8 -0
  140. package/lib/module/index.js.map +1 -0
  141. package/lib/module/package.json +1 -0
  142. package/lib/module/spec/fabric/VideoViewNativeComponent.ts +17 -0
  143. package/lib/module/spec/nitro/VideoPlayer.nitro.js +4 -0
  144. package/lib/module/spec/nitro/VideoPlayer.nitro.js.map +1 -0
  145. package/lib/module/spec/nitro/VideoPlayerEventEmitter.nitro.js +4 -0
  146. package/lib/module/spec/nitro/VideoPlayerEventEmitter.nitro.js.map +1 -0
  147. package/lib/module/spec/nitro/VideoPlayerSource.nitro.js +4 -0
  148. package/lib/module/spec/nitro/VideoPlayerSource.nitro.js.map +1 -0
  149. package/lib/module/spec/nitro/VideoViewViewManager.nitro.js +4 -0
  150. package/lib/module/spec/nitro/VideoViewViewManager.nitro.js.map +1 -0
  151. package/lib/typescript/drm-plugin/src/PluginManager.nitro.d.ts +10 -0
  152. package/lib/typescript/drm-plugin/src/PluginManager.nitro.d.ts.map +1 -0
  153. package/lib/typescript/drm-plugin/src/index.d.ts +4 -0
  154. package/lib/typescript/drm-plugin/src/index.d.ts.map +1 -0
  155. package/lib/typescript/package.json +1 -0
  156. package/lib/typescript/src/core/VideoPlayer.d.ts +88 -0
  157. package/lib/typescript/src/core/VideoPlayer.d.ts.map +1 -0
  158. package/lib/typescript/src/core/VideoPlayerEvents.d.ts +22 -0
  159. package/lib/typescript/src/core/VideoPlayerEvents.d.ts.map +1 -0
  160. package/lib/typescript/src/core/hooks/useEvent.d.ts +11 -0
  161. package/lib/typescript/src/core/hooks/useEvent.d.ts.map +1 -0
  162. package/lib/typescript/src/core/hooks/useManagedInstance.d.ts +19 -0
  163. package/lib/typescript/src/core/hooks/useManagedInstance.d.ts.map +1 -0
  164. package/lib/typescript/src/core/hooks/useVideoPlayer.d.ts +16 -0
  165. package/lib/typescript/src/core/hooks/useVideoPlayer.d.ts.map +1 -0
  166. package/lib/typescript/src/core/types/BufferConfig.d.ts +97 -0
  167. package/lib/typescript/src/core/types/BufferConfig.d.ts.map +1 -0
  168. package/lib/typescript/src/core/types/DrmParams.d.ts +64 -0
  169. package/lib/typescript/src/core/types/DrmParams.d.ts.map +1 -0
  170. package/lib/typescript/src/core/types/Events.d.ts +224 -0
  171. package/lib/typescript/src/core/types/Events.d.ts.map +1 -0
  172. package/lib/typescript/src/core/types/IgnoreSilentSwitchMode.d.ts +2 -0
  173. package/lib/typescript/src/core/types/IgnoreSilentSwitchMode.d.ts.map +1 -0
  174. package/lib/typescript/src/core/types/MixAudioMode.d.ts +2 -0
  175. package/lib/typescript/src/core/types/MixAudioMode.d.ts.map +1 -0
  176. package/lib/typescript/src/core/types/ResizeMode.d.ts +10 -0
  177. package/lib/typescript/src/core/types/ResizeMode.d.ts.map +1 -0
  178. package/lib/typescript/src/core/types/TextTrack.d.ts +20 -0
  179. package/lib/typescript/src/core/types/TextTrack.d.ts.map +1 -0
  180. package/lib/typescript/src/core/types/Utils.d.ts +2 -0
  181. package/lib/typescript/src/core/types/Utils.d.ts.map +1 -0
  182. package/lib/typescript/src/core/types/VideoConfig.d.ts +138 -0
  183. package/lib/typescript/src/core/types/VideoConfig.d.ts.map +1 -0
  184. package/lib/typescript/src/core/types/VideoError.d.ts +31 -0
  185. package/lib/typescript/src/core/types/VideoError.d.ts.map +1 -0
  186. package/lib/typescript/src/core/types/VideoInformation.d.ts +38 -0
  187. package/lib/typescript/src/core/types/VideoInformation.d.ts.map +1 -0
  188. package/lib/typescript/src/core/types/VideoOrientation.d.ts +2 -0
  189. package/lib/typescript/src/core/types/VideoOrientation.d.ts.map +1 -0
  190. package/lib/typescript/src/core/types/VideoPlayerBase.d.ts +155 -0
  191. package/lib/typescript/src/core/types/VideoPlayerBase.d.ts.map +1 -0
  192. package/lib/typescript/src/core/types/VideoPlayerSourceBase.d.ts +17 -0
  193. package/lib/typescript/src/core/types/VideoPlayerSourceBase.d.ts.map +1 -0
  194. package/lib/typescript/src/core/types/VideoPlayerStatus.d.ts +9 -0
  195. package/lib/typescript/src/core/types/VideoPlayerStatus.d.ts.map +1 -0
  196. package/lib/typescript/src/core/utils/playerFactory.d.ts +12 -0
  197. package/lib/typescript/src/core/utils/playerFactory.d.ts.map +1 -0
  198. package/lib/typescript/src/core/utils/sourceFactory.d.ts +29 -0
  199. package/lib/typescript/src/core/utils/sourceFactory.d.ts.map +1 -0
  200. package/lib/typescript/src/core/video-view/NativeVideoView.d.ts +2 -0
  201. package/lib/typescript/src/core/video-view/NativeVideoView.d.ts.map +1 -0
  202. package/lib/typescript/src/core/video-view/VideoView.d.ts +104 -0
  203. package/lib/typescript/src/core/video-view/VideoView.d.ts.map +1 -0
  204. package/lib/typescript/src/index.d.ts +13 -0
  205. package/lib/typescript/src/index.d.ts.map +1 -0
  206. package/lib/typescript/src/spec/fabric/VideoViewNativeComponent.d.ts +13 -0
  207. package/lib/typescript/src/spec/fabric/VideoViewNativeComponent.d.ts.map +1 -0
  208. package/lib/typescript/src/spec/nitro/VideoPlayer.nitro.d.ts +55 -0
  209. package/lib/typescript/src/spec/nitro/VideoPlayer.nitro.d.ts.map +1 -0
  210. package/lib/typescript/src/spec/nitro/VideoPlayerEventEmitter.nitro.d.ts +150 -0
  211. package/lib/typescript/src/spec/nitro/VideoPlayerEventEmitter.nitro.d.ts.map +1 -0
  212. package/lib/typescript/src/spec/nitro/VideoPlayerSource.nitro.d.ts +21 -0
  213. package/lib/typescript/src/spec/nitro/VideoPlayerSource.nitro.d.ts.map +1 -0
  214. package/lib/typescript/src/spec/nitro/VideoViewViewManager.nitro.d.ts +75 -0
  215. package/lib/typescript/src/spec/nitro/VideoViewViewManager.nitro.d.ts.map +1 -0
  216. package/nitro.json +47 -0
  217. package/nitrogen/generated/android/UnifiedPlayer+autolinking.cmake +95 -0
  218. package/nitrogen/generated/android/UnifiedPlayer+autolinking.gradle +27 -0
  219. package/nitrogen/generated/android/UnifiedPlayerOnLoad.cpp +122 -0
  220. package/nitrogen/generated/android/UnifiedPlayerOnLoad.hpp +34 -0
  221. package/nitrogen/generated/android/c++/JBandwidthData.hpp +65 -0
  222. package/nitrogen/generated/android/c++/JBufferConfig.hpp +101 -0
  223. package/nitrogen/generated/android/c++/JCustomVideoMetadata.hpp +74 -0
  224. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.hpp +126 -0
  225. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  226. package/nitrogen/generated/android/c++/JFunc_void_BandwidthData.hpp +78 -0
  227. package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +81 -0
  228. package/nitrogen/generated/android/c++/JFunc_void_VideoPlayerStatus.hpp +77 -0
  229. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
  230. package/nitrogen/generated/android/c++/JFunc_void_double.hpp +75 -0
  231. package/nitrogen/generated/android/c++/JFunc_void_onLoadData.hpp +79 -0
  232. package/nitrogen/generated/android/c++/JFunc_void_onLoadStartData.hpp +82 -0
  233. package/nitrogen/generated/android/c++/JFunc_void_onPlaybackStateChangeData.hpp +77 -0
  234. package/nitrogen/generated/android/c++/JFunc_void_onProgressData.hpp +77 -0
  235. package/nitrogen/generated/android/c++/JFunc_void_onVolumeChangeData.hpp +77 -0
  236. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__TextTrack__.hpp +83 -0
  237. package/nitrogen/generated/android/c++/JFunc_void_std__vector_std__string_.hpp +95 -0
  238. package/nitrogen/generated/android/c++/JHybridVideoPlayerEventEmitterSpec.cpp +224 -0
  239. package/nitrogen/generated/android/c++/JHybridVideoPlayerEventEmitterSpec.hpp +82 -0
  240. package/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.cpp +60 -0
  241. package/nitrogen/generated/android/c++/JHybridVideoPlayerFactorySpec.hpp +63 -0
  242. package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.cpp +106 -0
  243. package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceFactorySpec.hpp +64 -0
  244. package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.cpp +124 -0
  245. package/nitrogen/generated/android/c++/JHybridVideoPlayerSourceSpec.hpp +64 -0
  246. package/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.cpp +300 -0
  247. package/nitrogen/generated/android/c++/JHybridVideoPlayerSpec.hpp +98 -0
  248. package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.cpp +56 -0
  249. package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerFactorySpec.hpp +63 -0
  250. package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.cpp +185 -0
  251. package/nitrogen/generated/android/c++/JHybridVideoViewViewManagerSpec.hpp +87 -0
  252. package/nitrogen/generated/android/c++/JIgnoreSilentSwitchMode.hpp +61 -0
  253. package/nitrogen/generated/android/c++/JListenerSubscription.hpp +67 -0
  254. package/nitrogen/generated/android/c++/JLivePlaybackParams.hpp +73 -0
  255. package/nitrogen/generated/android/c++/JMixAudioMode.hpp +64 -0
  256. package/nitrogen/generated/android/c++/JNativeDrmParams.hpp +111 -0
  257. package/nitrogen/generated/android/c++/JNativeExternalSubtitle.hpp +71 -0
  258. package/nitrogen/generated/android/c++/JNativeVideoConfig.hpp +136 -0
  259. package/nitrogen/generated/android/c++/JOnGetLicensePayload.hpp +69 -0
  260. package/nitrogen/generated/android/c++/JResizeMode.hpp +64 -0
  261. package/nitrogen/generated/android/c++/JResolution.hpp +61 -0
  262. package/nitrogen/generated/android/c++/JSourceType.hpp +58 -0
  263. package/nitrogen/generated/android/c++/JSubtitleType.hpp +67 -0
  264. package/nitrogen/generated/android/c++/JSurfaceType.hpp +58 -0
  265. package/nitrogen/generated/android/c++/JTextTrack.hpp +70 -0
  266. package/nitrogen/generated/android/c++/JTimedMetadata.hpp +78 -0
  267. package/nitrogen/generated/android/c++/JTimedMetadataObject.hpp +61 -0
  268. package/nitrogen/generated/android/c++/JVariant_NullType_HybridVideoPlayerSourceSpec.cpp +26 -0
  269. package/nitrogen/generated/android/c++/JVariant_NullType_HybridVideoPlayerSourceSpec.hpp +72 -0
  270. package/nitrogen/generated/android/c++/JVariant_NullType_TextTrack.cpp +26 -0
  271. package/nitrogen/generated/android/c++/JVariant_NullType_TextTrack.hpp +73 -0
  272. package/nitrogen/generated/android/c++/JVideoInformation.hpp +86 -0
  273. package/nitrogen/generated/android/c++/JVideoOrientation.hpp +73 -0
  274. package/nitrogen/generated/android/c++/JVideoPlayerStatus.hpp +64 -0
  275. package/nitrogen/generated/android/c++/JonLoadData.hpp +74 -0
  276. package/nitrogen/generated/android/c++/JonLoadStartData.hpp +65 -0
  277. package/nitrogen/generated/android/c++/JonPlaybackStateChangeData.hpp +61 -0
  278. package/nitrogen/generated/android/c++/JonProgressData.hpp +65 -0
  279. package/nitrogen/generated/android/c++/JonVolumeChangeData.hpp +61 -0
  280. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/BandwidthData.kt +61 -0
  281. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/BufferConfig.kt +101 -0
  282. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/CustomVideoMetadata.kt +71 -0
  283. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.kt +80 -0
  284. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void.kt +80 -0
  285. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_BandwidthData.kt +80 -0
  286. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_TimedMetadata.kt +80 -0
  287. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_VideoPlayerStatus.kt +80 -0
  288. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_bool.kt +80 -0
  289. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_double.kt +80 -0
  290. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onLoadData.kt +80 -0
  291. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onLoadStartData.kt +80 -0
  292. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onPlaybackStateChangeData.kt +80 -0
  293. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onProgressData.kt +80 -0
  294. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_onVolumeChangeData.kt +80 -0
  295. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.kt +80 -0
  296. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Func_void_std__vector_std__string_.kt +80 -0
  297. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerEventEmitterSpec.kt +226 -0
  298. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerFactorySpec.kt +54 -0
  299. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerSourceFactorySpec.kt +58 -0
  300. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerSourceSpec.kt +61 -0
  301. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoPlayerSpec.kt +178 -0
  302. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoViewViewManagerFactorySpec.kt +54 -0
  303. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/HybridVideoViewViewManagerSpec.kt +168 -0
  304. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/IgnoreSilentSwitchMode.kt +24 -0
  305. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/ListenerSubscription.kt +55 -0
  306. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/LivePlaybackParams.kt +71 -0
  307. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/MixAudioMode.kt +25 -0
  308. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/NativeDrmParams.kt +85 -0
  309. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/NativeExternalSubtitle.kt +66 -0
  310. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/NativeVideoConfig.kt +81 -0
  311. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/OnGetLicensePayload.kt +66 -0
  312. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/ResizeMode.kt +25 -0
  313. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Resolution.kt +56 -0
  314. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/SourceType.kt +23 -0
  315. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/SubtitleType.kt +26 -0
  316. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/SurfaceType.kt +23 -0
  317. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/TextTrack.kt +66 -0
  318. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/TimedMetadata.kt +51 -0
  319. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/TimedMetadataObject.kt +56 -0
  320. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/UnifiedPlayerOnLoad.kt +35 -0
  321. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Variant_NullType_HybridVideoPlayerSourceSpec.kt +62 -0
  322. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/Variant_NullType_TextTrack.kt +62 -0
  323. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/VideoInformation.kt +86 -0
  324. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/VideoOrientation.kt +28 -0
  325. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/VideoPlayerStatus.kt +25 -0
  326. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onLoadData.kt +71 -0
  327. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onLoadStartData.kt +56 -0
  328. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onPlaybackStateChangeData.kt +56 -0
  329. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onProgressData.kt +61 -0
  330. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unifiedplayer/onVolumeChangeData.kt +56 -0
  331. package/nitrogen/generated/ios/UnifiedPlayer+autolinking.rb +62 -0
  332. package/nitrogen/generated/ios/UnifiedPlayer-Swift-Cxx-Bridge.cpp +280 -0
  333. package/nitrogen/generated/ios/UnifiedPlayer-Swift-Cxx-Bridge.hpp +1106 -0
  334. package/nitrogen/generated/ios/UnifiedPlayer-Swift-Cxx-Umbrella.hpp +162 -0
  335. package/nitrogen/generated/ios/UnifiedPlayerAutolinking.mm +49 -0
  336. package/nitrogen/generated/ios/UnifiedPlayerAutolinking.swift +50 -0
  337. package/nitrogen/generated/ios/c++/HybridVideoPlayerEventEmitterSpecSwift.cpp +11 -0
  338. package/nitrogen/generated/ios/c++/HybridVideoPlayerEventEmitterSpecSwift.hpp +279 -0
  339. package/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.cpp +11 -0
  340. package/nitrogen/generated/ios/c++/HybridVideoPlayerFactorySpecSwift.hpp +87 -0
  341. package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.cpp +11 -0
  342. package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceFactorySpecSwift.hpp +125 -0
  343. package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.cpp +11 -0
  344. package/nitrogen/generated/ios/c++/HybridVideoPlayerSourceSpecSwift.hpp +125 -0
  345. package/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.cpp +11 -0
  346. package/nitrogen/generated/ios/c++/HybridVideoPlayerSpecSwift.hpp +256 -0
  347. package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.cpp +11 -0
  348. package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerFactorySpecSwift.hpp +84 -0
  349. package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.cpp +11 -0
  350. package/nitrogen/generated/ios/c++/HybridVideoViewViewManagerSpecSwift.hpp +217 -0
  351. package/nitrogen/generated/ios/swift/BandwidthData.swift +65 -0
  352. package/nitrogen/generated/ios/swift/BufferConfig.swift +201 -0
  353. package/nitrogen/generated/ios/swift/CustomVideoMetadata.swift +114 -0
  354. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__string_____OnGetLicensePayload.swift +61 -0
  355. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  356. package/nitrogen/generated/ios/swift/Func_void_BandwidthData.swift +46 -0
  357. package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +46 -0
  358. package/nitrogen/generated/ios/swift/Func_void_VideoInformation.swift +46 -0
  359. package/nitrogen/generated/ios/swift/Func_void_VideoPlayerStatus.swift +46 -0
  360. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  361. package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
  362. package/nitrogen/generated/ios/swift/Func_void_onLoadData.swift +46 -0
  363. package/nitrogen/generated/ios/swift/Func_void_onLoadStartData.swift +46 -0
  364. package/nitrogen/generated/ios/swift/Func_void_onPlaybackStateChangeData.swift +46 -0
  365. package/nitrogen/generated/ios/swift/Func_void_onProgressData.swift +46 -0
  366. package/nitrogen/generated/ios/swift/Func_void_onVolumeChangeData.swift +46 -0
  367. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  368. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__TextTrack__.swift +65 -0
  369. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__string__.swift +66 -0
  370. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
  371. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +46 -0
  372. package/nitrogen/generated/ios/swift/HybridVideoPlayerEventEmitterSpec.swift +74 -0
  373. package/nitrogen/generated/ios/swift/HybridVideoPlayerEventEmitterSpec_cxx.swift +479 -0
  374. package/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec.swift +55 -0
  375. package/nitrogen/generated/ios/swift/HybridVideoPlayerFactorySpec_cxx.swift +145 -0
  376. package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec.swift +56 -0
  377. package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceFactorySpec_cxx.swift +156 -0
  378. package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec.swift +56 -0
  379. package/nitrogen/generated/ios/swift/HybridVideoPlayerSourceSpec_cxx.swift +157 -0
  380. package/nitrogen/generated/ios/swift/HybridVideoPlayerSpec.swift +80 -0
  381. package/nitrogen/generated/ios/swift/HybridVideoPlayerSpec_cxx.swift +490 -0
  382. package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec.swift +55 -0
  383. package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerFactorySpec_cxx.swift +141 -0
  384. package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec.swift +72 -0
  385. package/nitrogen/generated/ios/swift/HybridVideoViewViewManagerSpec_cxx.swift +390 -0
  386. package/nitrogen/generated/ios/swift/IgnoreSilentSwitchMode.swift +44 -0
  387. package/nitrogen/generated/ios/swift/ListenerSubscription.swift +37 -0
  388. package/nitrogen/generated/ios/swift/LivePlaybackParams.swift +114 -0
  389. package/nitrogen/generated/ios/swift/MixAudioMode.swift +48 -0
  390. package/nitrogen/generated/ios/swift/NativeDrmParams.swift +193 -0
  391. package/nitrogen/generated/ios/swift/NativeExternalSubtitle.swift +44 -0
  392. package/nitrogen/generated/ios/swift/NativeVideoConfig.swift +136 -0
  393. package/nitrogen/generated/ios/swift/OnGetLicensePayload.swift +44 -0
  394. package/nitrogen/generated/ios/swift/ResizeMode.swift +48 -0
  395. package/nitrogen/generated/ios/swift/Resolution.swift +34 -0
  396. package/nitrogen/generated/ios/swift/SourceType.swift +40 -0
  397. package/nitrogen/generated/ios/swift/SubtitleType.swift +52 -0
  398. package/nitrogen/generated/ios/swift/SurfaceType.swift +40 -0
  399. package/nitrogen/generated/ios/swift/TextTrack.swift +57 -0
  400. package/nitrogen/generated/ios/swift/TimedMetadata.swift +35 -0
  401. package/nitrogen/generated/ios/swift/TimedMetadataObject.swift +34 -0
  402. package/nitrogen/generated/ios/swift/Variant_NullType_TextTrack.swift +30 -0
  403. package/nitrogen/generated/ios/swift/Variant_NullType__any_HybridVideoPlayerSourceSpec_.swift +30 -0
  404. package/nitrogen/generated/ios/swift/VideoInformation.swift +64 -0
  405. package/nitrogen/generated/ios/swift/VideoOrientation.swift +60 -0
  406. package/nitrogen/generated/ios/swift/VideoPlayerStatus.swift +48 -0
  407. package/nitrogen/generated/ios/swift/onLoadData.swift +49 -0
  408. package/nitrogen/generated/ios/swift/onLoadStartData.swift +41 -0
  409. package/nitrogen/generated/ios/swift/onPlaybackStateChangeData.swift +34 -0
  410. package/nitrogen/generated/ios/swift/onProgressData.swift +39 -0
  411. package/nitrogen/generated/ios/swift/onVolumeChangeData.swift +34 -0
  412. package/nitrogen/generated/shared/c++/BandwidthData.hpp +91 -0
  413. package/nitrogen/generated/shared/c++/BufferConfig.hpp +128 -0
  414. package/nitrogen/generated/shared/c++/CustomVideoMetadata.hpp +100 -0
  415. package/nitrogen/generated/shared/c++/HybridVideoPlayerEventEmitterSpec.cpp +40 -0
  416. package/nitrogen/generated/shared/c++/HybridVideoPlayerEventEmitterSpec.hpp +115 -0
  417. package/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.cpp +21 -0
  418. package/nitrogen/generated/shared/c++/HybridVideoPlayerFactorySpec.hpp +67 -0
  419. package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.cpp +22 -0
  420. package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceFactorySpec.hpp +69 -0
  421. package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.cpp +23 -0
  422. package/nitrogen/generated/shared/c++/HybridVideoPlayerSourceSpec.hpp +69 -0
  423. package/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.cpp +57 -0
  424. package/nitrogen/generated/shared/c++/HybridVideoPlayerSpec.hpp +120 -0
  425. package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.cpp +21 -0
  426. package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerFactorySpec.hpp +64 -0
  427. package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.cpp +46 -0
  428. package/nitrogen/generated/shared/c++/HybridVideoViewViewManagerSpec.hpp +99 -0
  429. package/nitrogen/generated/shared/c++/IgnoreSilentSwitchMode.hpp +80 -0
  430. package/nitrogen/generated/shared/c++/ListenerSubscription.hpp +83 -0
  431. package/nitrogen/generated/shared/c++/LivePlaybackParams.hpp +99 -0
  432. package/nitrogen/generated/shared/c++/MixAudioMode.hpp +84 -0
  433. package/nitrogen/generated/shared/c++/NativeDrmParams.hpp +113 -0
  434. package/nitrogen/generated/shared/c++/NativeExternalSubtitle.hpp +97 -0
  435. package/nitrogen/generated/shared/c++/NativeVideoConfig.hpp +121 -0
  436. package/nitrogen/generated/shared/c++/OnGetLicensePayload.hpp +95 -0
  437. package/nitrogen/generated/shared/c++/ResizeMode.hpp +84 -0
  438. package/nitrogen/generated/shared/c++/Resolution.hpp +87 -0
  439. package/nitrogen/generated/shared/c++/SourceType.hpp +76 -0
  440. package/nitrogen/generated/shared/c++/SubtitleType.hpp +88 -0
  441. package/nitrogen/generated/shared/c++/SurfaceType.hpp +76 -0
  442. package/nitrogen/generated/shared/c++/TextTrack.hpp +96 -0
  443. package/nitrogen/generated/shared/c++/TimedMetadata.hpp +85 -0
  444. package/nitrogen/generated/shared/c++/TimedMetadataObject.hpp +87 -0
  445. package/nitrogen/generated/shared/c++/VideoInformation.hpp +112 -0
  446. package/nitrogen/generated/shared/c++/VideoOrientation.hpp +96 -0
  447. package/nitrogen/generated/shared/c++/VideoPlayerStatus.hpp +84 -0
  448. package/nitrogen/generated/shared/c++/onLoadData.hpp +100 -0
  449. package/nitrogen/generated/shared/c++/onLoadStartData.hpp +92 -0
  450. package/nitrogen/generated/shared/c++/onPlaybackStateChangeData.hpp +87 -0
  451. package/nitrogen/generated/shared/c++/onProgressData.hpp +91 -0
  452. package/nitrogen/generated/shared/c++/onVolumeChangeData.hpp +87 -0
  453. package/package.json +180 -0
  454. package/react-native.config.js +10 -0
  455. package/src/core/VideoPlayer.ts +357 -0
  456. package/src/core/VideoPlayerEvents.ts +146 -0
  457. package/src/core/hooks/useEvent.ts +24 -0
  458. package/src/core/hooks/useManagedInstance.ts +96 -0
  459. package/src/core/hooks/useVideoPlayer.ts +73 -0
  460. package/src/core/types/BufferConfig.ts +103 -0
  461. package/src/core/types/DrmParams.ts +65 -0
  462. package/src/core/types/Events.ts +283 -0
  463. package/src/core/types/IgnoreSilentSwitchMode.ts +1 -0
  464. package/src/core/types/MixAudioMode.ts +1 -0
  465. package/src/core/types/ResizeMode.ts +9 -0
  466. package/src/core/types/TextTrack.ts +22 -0
  467. package/src/core/types/Utils.ts +1 -0
  468. package/src/core/types/VideoConfig.ts +150 -0
  469. package/src/core/types/VideoError.ts +174 -0
  470. package/src/core/types/VideoInformation.ts +45 -0
  471. package/src/core/types/VideoOrientation.ts +8 -0
  472. package/src/core/types/VideoPlayerBase.ts +181 -0
  473. package/src/core/types/VideoPlayerSourceBase.ts +19 -0
  474. package/src/core/types/VideoPlayerStatus.ts +8 -0
  475. package/src/core/utils/playerFactory.ts +33 -0
  476. package/src/core/utils/sourceFactory.ts +171 -0
  477. package/src/core/video-view/NativeVideoView.tsx +18 -0
  478. package/src/core/video-view/VideoView.tsx +492 -0
  479. package/src/expo-plugins/@types.ts +37 -0
  480. package/src/expo-plugins/getPackageInfo.ts +23 -0
  481. package/src/expo-plugins/withAndroidExtensions.ts +46 -0
  482. package/src/expo-plugins/withAndroidNotificationControls.ts +43 -0
  483. package/src/expo-plugins/withAndroidPictureInPicture.ts +31 -0
  484. package/src/expo-plugins/withBackgroundAudio.ts +26 -0
  485. package/src/expo-plugins/withReactNativeVideo.ts +32 -0
  486. package/src/expo-plugins/writeToPodfile.ts +74 -0
  487. package/src/index.tsx +29 -0
  488. package/src/spec/fabric/VideoViewNativeComponent.ts +17 -0
  489. package/src/spec/nitro/VideoPlayer.nitro.ts +62 -0
  490. package/src/spec/nitro/VideoPlayerEventEmitter.nitro.ts +207 -0
  491. package/src/spec/nitro/VideoPlayerSource.nitro.ts +18 -0
  492. package/src/spec/nitro/VideoViewViewManager.nitro.ts +92 -0
@@ -0,0 +1,346 @@
1
+ package com.unifiedplayer.core.fragments
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.content.Context
5
+ import android.content.pm.ActivityInfo
6
+ import android.content.res.Configuration
7
+ import android.os.Build
8
+ import android.os.Bundle
9
+ import android.view.Gravity
10
+ import android.view.LayoutInflater
11
+ import android.view.View
12
+ import android.view.ViewGroup
13
+ import android.view.WindowInsets
14
+ import android.view.WindowInsetsController
15
+ import android.view.WindowManager
16
+ import android.widget.FrameLayout
17
+ import android.widget.ImageButton
18
+ import android.widget.TextView
19
+ import androidx.activity.OnBackPressedCallback
20
+ import androidx.annotation.OptIn
21
+ import androidx.core.view.isVisible
22
+ import androidx.fragment.app.Fragment
23
+ import androidx.media3.common.util.UnstableApi
24
+ import com.unifiedplayer.core.utils.PictureInPictureUtils.createPictureInPictureParams
25
+ import com.unifiedplayer.core.utils.SmallVideoPlayerOptimizer
26
+ import com.unifiedplayer.view.VideoView
27
+ import java.util.UUID
28
+
29
+ @OptIn(UnstableApi::class)
30
+ class FullscreenVideoFragment(private val videoView: VideoView) : Fragment() {
31
+ val id: String = UUID.randomUUID().toString()
32
+
33
+ private var container: FrameLayout? = null
34
+ private var originalPlayerParent: ViewGroup? = null
35
+ private var originalPlayerLayoutParams: ViewGroup.LayoutParams? = null
36
+ private var rootContentViews: List<View> = listOf()
37
+ private var originalOrientation: Int? = null
38
+
39
+ // Back press callback to handle back navigation
40
+ private val backPressCallback = object : OnBackPressedCallback(true) {
41
+ override fun handleOnBackPressed() {
42
+ videoView.exitFullscreen()
43
+ }
44
+ }
45
+
46
+ override fun onCreateView(
47
+ inflater: LayoutInflater,
48
+ container: ViewGroup?,
49
+ savedInstanceState: Bundle?
50
+ ): View? {
51
+ // Create a fullscreen container
52
+ this.container = FrameLayout(requireContext()).apply {
53
+ layoutParams = ViewGroup.LayoutParams(
54
+ ViewGroup.LayoutParams.MATCH_PARENT,
55
+ ViewGroup.LayoutParams.MATCH_PARENT
56
+ )
57
+ setBackgroundColor(android.graphics.Color.BLACK)
58
+ keepScreenOn = true
59
+ }
60
+ return this.container
61
+ }
62
+
63
+ override fun onSaveInstanceState(outState: Bundle) {
64
+ super.onSaveInstanceState(outState)
65
+ originalOrientation?.let { outState.putInt("originalOrientation", it) }
66
+ }
67
+
68
+ override fun onResume() {
69
+ super.onResume()
70
+
71
+ // System UI is re-enabled when user have exited app and go back
72
+ // We need to hide it again
73
+ hideSystemUI()
74
+ }
75
+
76
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
77
+ super.onViewCreated(view, savedInstanceState)
78
+
79
+ // Register back press callback
80
+ requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backPressCallback)
81
+
82
+ enterFullscreenMode()
83
+ setupPlayerView()
84
+ hideSystemUI()
85
+
86
+ // Update PiP params if supported
87
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
88
+ try {
89
+ val params = createPictureInPictureParams(videoView)
90
+ requireActivity().setPictureInPictureParams(params)
91
+ } catch (_: Exception) {}
92
+ }
93
+
94
+
95
+
96
+ // Creating a fullscreen fragment usually means we want to be in landscape
97
+ if (savedInstanceState != null && savedInstanceState.containsKey("originalOrientation")) {
98
+ originalOrientation = savedInstanceState.getInt("originalOrientation")
99
+ } else {
100
+ originalOrientation = requireActivity().requestedOrientation
101
+ }
102
+ requireActivity().requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
103
+ }
104
+
105
+ override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
106
+ super.onPictureInPictureModeChanged(isInPictureInPictureMode)
107
+
108
+ if (isInPictureInPictureMode) {
109
+ videoView.playerView.useController = false
110
+ videoView.playerView.controllerAutoShow = false
111
+ } else {
112
+ // In fullscreen, we always want controls enabled
113
+ videoView.playerView.useController = true
114
+ videoView.playerView.controllerAutoShow = true
115
+ }
116
+ }
117
+
118
+ override fun onConfigurationChanged(newConfig: Configuration) {
119
+ super.onConfigurationChanged(newConfig)
120
+
121
+ val isInPictureInPictureMode = requireActivity().isInPictureInPictureMode
122
+
123
+ if (isInPictureInPictureMode) {
124
+ videoView.playerView.useController = false
125
+ videoView.playerView.controllerAutoShow = false
126
+ } else {
127
+ // In fullscreen, we always want controls enabled
128
+ videoView.playerView.useController = true
129
+ videoView.playerView.controllerAutoShow = true
130
+ }
131
+ }
132
+
133
+ private fun enterFullscreenMode() {
134
+ // Store original parent and layout params
135
+ originalPlayerParent = videoView.playerView.parent as? ViewGroup
136
+ originalPlayerLayoutParams = videoView.playerView.layoutParams
137
+
138
+ // Remove player from original parent
139
+ originalPlayerParent?.removeView(videoView.playerView)
140
+
141
+ // Hide all root content views
142
+ val currentActivity = requireActivity()
143
+ val rootContent = currentActivity.window.decorView.findViewById<ViewGroup>(android.R.id.content)
144
+ rootContentViews = (0 until rootContent.childCount)
145
+ .map { rootContent.getChildAt(it) }
146
+ .filter { it.isVisible }
147
+
148
+ rootContentViews.forEach { view ->
149
+ view.visibility = View.GONE
150
+ }
151
+
152
+ // Add our fullscreen container to root
153
+ rootContent.addView(container,
154
+ ViewGroup.LayoutParams(
155
+ ViewGroup.LayoutParams.MATCH_PARENT,
156
+ ViewGroup.LayoutParams.MATCH_PARENT
157
+ )
158
+ )
159
+ }
160
+
161
+ private fun setupPlayerView() {
162
+ // Add PlayerView to our container
163
+ container?.addView(videoView.playerView,
164
+ FrameLayout.LayoutParams(
165
+ FrameLayout.LayoutParams.MATCH_PARENT,
166
+ FrameLayout.LayoutParams.MATCH_PARENT
167
+ )
168
+ )
169
+
170
+ videoView.playerView.setBackgroundColor(android.graphics.Color.BLACK)
171
+ videoView.playerView.setShutterBackgroundColor(android.graphics.Color.BLACK)
172
+
173
+ // We need show controls in fullscreen
174
+ videoView.playerView.useController = true
175
+
176
+ setupFullscreenButton()
177
+ videoView.playerView.setShowSubtitleButton(true)
178
+
179
+ // Apply optimizations based on video player size in fullscreen mode
180
+ SmallVideoPlayerOptimizer.applyOptimizations(videoView.playerView, requireContext(), isFullscreen = true)
181
+
182
+ // Add close button after player view so it's on top
183
+ setupCloseButton()
184
+
185
+ // Add playback speed button logic
186
+ setupPlaybackSpeedButton()
187
+
188
+ // Show controller initially
189
+ videoView.playerView.showController()
190
+ }
191
+
192
+ private fun setupPlaybackSpeedButton() {
193
+ val speedButton = videoView.playerView.findViewById<TextView>(com.unifiedplayer.R.id.exo_playback_speed)
194
+
195
+ speedButton?.setOnClickListener {
196
+ val player = videoView.playerView.player ?: return@setOnClickListener
197
+ val currentSpeed = player.playbackParameters.speed
198
+
199
+ val nextSpeed = when (currentSpeed) {
200
+ 1.0f -> 2.0f
201
+ 2.0f -> 4.0f
202
+ 4.0f -> 1.0f
203
+ else -> 1.0f
204
+ }
205
+
206
+ player.setPlaybackSpeed(nextSpeed)
207
+ speedButton.text = "${nextSpeed}x"
208
+ }
209
+ }
210
+
211
+ private fun setupCloseButton() {
212
+ val context = requireContext()
213
+ val closeButton = ImageButton(context).apply {
214
+ setImageResource(android.R.drawable.ic_menu_close_clear_cancel)
215
+ setBackgroundColor(android.graphics.Color.TRANSPARENT)
216
+ setColorFilter(android.graphics.Color.WHITE)
217
+ setPadding(16, 16, 16, 16)
218
+
219
+ layoutParams = FrameLayout.LayoutParams(
220
+ ViewGroup.LayoutParams.WRAP_CONTENT,
221
+ ViewGroup.LayoutParams.WRAP_CONTENT
222
+ ).apply {
223
+ gravity = Gravity.TOP or Gravity.START
224
+ topMargin = 64
225
+ leftMargin = 64
226
+ }
227
+
228
+ setOnClickListener {
229
+ exitFullscreen()
230
+ }
231
+ }
232
+
233
+ container?.addView(closeButton)
234
+ }
235
+
236
+ @SuppressLint("PrivateResource")
237
+ private fun setupFullscreenButton() {
238
+ videoView.playerView.setFullscreenButtonClickListener { _ ->
239
+ videoView.exitFullscreen()
240
+ }
241
+
242
+ // Change icon to exit fullscreen
243
+ val button = videoView.playerView.findViewById<ImageButton>(androidx.media3.ui.R.id.exo_fullscreen)
244
+ button?.setImageResource(androidx.media3.ui.R.drawable.exo_icon_fullscreen_exit)
245
+ }
246
+
247
+ @Suppress("DEPRECATION")
248
+ private fun hideSystemUI() {
249
+ val currentActivity = requireActivity()
250
+ container?.let { container ->
251
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
252
+ container.fitsSystemWindows = false
253
+ container.windowInsetsController?.let { controller ->
254
+ controller.hide(WindowInsets.Type.systemBars())
255
+ controller.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
256
+ }
257
+ } else {
258
+ currentActivity.window.decorView.systemUiVisibility = (
259
+ View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
260
+ or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
261
+ or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
262
+ or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
263
+ or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
264
+ or View.SYSTEM_UI_FLAG_FULLSCREEN
265
+ )
266
+ }
267
+ }
268
+ }
269
+
270
+ @Suppress("DEPRECATION")
271
+ private fun restoreSystemUI() {
272
+ val currentActivity = requireActivity()
273
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
274
+ container?.windowInsetsController?.show(WindowInsets.Type.systemBars())
275
+ } else {
276
+ currentActivity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
277
+ }
278
+ }
279
+
280
+ fun exitFullscreen() {
281
+ // Remove back press callback since we're exiting
282
+ backPressCallback.remove()
283
+
284
+ restoreSystemUI()
285
+
286
+ // Restore original orientation
287
+ originalOrientation?.let { orientation ->
288
+ requireActivity().requestedOrientation = orientation
289
+ }
290
+ originalOrientation = null
291
+
292
+ // Restore controller state from VideoView settings
293
+ videoView.playerView.useController = videoView.useController
294
+ if (videoView.useController) {
295
+ videoView.playerView.controllerAutoShow = true
296
+ } else {
297
+ videoView.playerView.hideController()
298
+ videoView.playerView.controllerAutoShow = false
299
+ }
300
+
301
+ // Ensure PlayerView keeps black background when returning to normal mode
302
+ videoView.playerView.setBackgroundColor(android.graphics.Color.BLACK)
303
+ videoView.playerView.setShutterBackgroundColor(android.graphics.Color.BLACK)
304
+
305
+ // Remove PlayerView from our container
306
+ container?.removeView(videoView.playerView)
307
+
308
+ // Remove our container from root
309
+ val currentActivity = requireActivity()
310
+ val rootContent = currentActivity.window.decorView.findViewById<ViewGroup>(android.R.id.content)
311
+ rootContent.removeView(container)
312
+
313
+ // Restore root content views
314
+ rootContentViews.forEach { it.visibility = View.VISIBLE }
315
+ rootContentViews = listOf()
316
+
317
+ // Safely restore PlayerView to original parent
318
+ // First, ensure PlayerView is removed from any current parent
319
+ val currentParent = videoView.playerView.parent as? ViewGroup
320
+ currentParent?.removeView(videoView.playerView)
321
+
322
+ // Now add it back to the original parent if it's not already the parent
323
+ if (videoView.playerView.parent != originalPlayerParent) {
324
+ originalPlayerParent?.addView(videoView.playerView, originalPlayerLayoutParams)
325
+ }
326
+
327
+ // Remove this fragment
328
+ parentFragmentManager.beginTransaction()
329
+ .remove(this)
330
+ .commitAllowingStateLoss()
331
+
332
+ // Notify VideoView that we've exited fullscreen
333
+ videoView.isInFullscreen = false
334
+ }
335
+
336
+
337
+
338
+ override fun onDestroy() {
339
+ super.onDestroy()
340
+
341
+ // Ensure we clean up properly if fragment is destroyed
342
+ if (videoView.isInFullscreen) {
343
+ exitFullscreen()
344
+ }
345
+ }
346
+ }
@@ -0,0 +1,85 @@
1
+ package com.unifiedplayer.core.fragments
2
+
3
+ import android.content.res.Configuration
4
+ import android.os.Bundle
5
+ import android.os.Handler
6
+ import android.os.Looper
7
+ import android.util.Log
8
+ import androidx.annotation.OptIn
9
+ import androidx.fragment.app.Fragment
10
+ import androidx.media3.common.util.UnstableApi
11
+ import com.unifiedplayer.core.VideoManager
12
+ import com.unifiedplayer.view.VideoView
13
+ import java.util.UUID
14
+
15
+ @OptIn(UnstableApi::class)
16
+ class PictureInPictureHelperFragment(private val videoView: VideoView) : Fragment() {
17
+ val id: String = UUID.randomUUID().toString()
18
+
19
+ override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
20
+ super.onPictureInPictureModeChanged(isInPictureInPictureMode)
21
+
22
+ if (isInPictureInPictureMode) {
23
+ var currentPipVideo = VideoManager.getCurrentPictureInPictureVideo()
24
+
25
+ if (currentPipVideo == null) {
26
+ synchronized(VideoManager) {
27
+ currentPipVideo = VideoManager.getCurrentPictureInPictureVideo()
28
+ if (currentPipVideo == null) {
29
+ if (videoView.hybridPlayer?.isPlaying == true) {
30
+ val lastPlayed = VideoManager.getLastPlayedVideoView()
31
+ val shouldDesignate = lastPlayed == null || lastPlayed.nitroId == videoView.nitroId
32
+
33
+ if (shouldDesignate) {
34
+ VideoManager.setCurrentPictureInPictureVideo(videoView)
35
+ videoView.hybridPlayer?.movePlayerToVideoView(videoView)
36
+ VideoManager.pauseOtherPlayers(videoView)
37
+ currentPipVideo = videoView
38
+ }
39
+ } else {
40
+ if (!VideoManager.isAnyVideoInPictureInPicture()) {
41
+ val lastPlayed = VideoManager.getLastPlayedVideoView()
42
+ val targetView = lastPlayed ?: videoView
43
+
44
+ VideoManager.setCurrentPictureInPictureVideo(targetView)
45
+ targetView.hybridPlayer?.movePlayerToVideoView(targetView)
46
+ VideoManager.pauseOtherPlayers(targetView)
47
+ currentPipVideo = targetView
48
+ }
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ if (currentPipVideo == videoView) {
55
+ // Disable controls immediately when entering PiP - media session creates its own controls for PiP
56
+ videoView.playerView.useController = false
57
+ videoView.playerView.controllerAutoShow = false
58
+
59
+ // If we're currently in fullscreen, exit it first to prevent parent conflicts
60
+ if (videoView.isInFullscreen) {
61
+ try {
62
+ videoView.exitFullscreen()
63
+ // Post hideRootContentViews to main thread to ensure it runs after exitFullscreen completes
64
+ Handler(Looper.getMainLooper()).post {
65
+ videoView.hideRootContentViews()
66
+ videoView.isInPictureInPicture = true
67
+ }
68
+ } catch (e: Exception) {
69
+ Log.w("UnifiedPlayer", "Failed to exit fullscreen before entering PiP for nitroId: ${videoView.nitroId}", e)
70
+ videoView.hideRootContentViews()
71
+ videoView.isInPictureInPicture = true
72
+ }
73
+ } else {
74
+ // Now move the PlayerView to the root for PiP and hide content
75
+ videoView.hideRootContentViews()
76
+ videoView.isInPictureInPicture = true
77
+ }
78
+ }
79
+ } else {
80
+ if (videoView.isInPictureInPicture) {
81
+ videoView.exitPictureInPicture()
82
+ }
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,23 @@
1
+ package com.unifiedplayer.core.player
2
+
3
+ import androidx.annotation.OptIn
4
+ import androidx.media3.common.MediaItem
5
+ import androidx.media3.common.util.UnstableApi
6
+ import androidx.media3.common.util.Util
7
+ import androidx.media3.exoplayer.drm.DrmSessionManager
8
+ import com.margelo.nitro.unifiedplayer.NativeDrmParams
9
+ import java.util.UUID
10
+
11
+ @OptIn(UnstableApi::class)
12
+ interface DRMManagerSpec {
13
+ fun buildDrmSessionManager(drmParams: NativeDrmParams): DrmSessionManager {
14
+ val drmScheme = drmParams.type ?: "widevine"
15
+ val drmUuid = Util.getDrmUuid(drmScheme)
16
+
17
+ return buildDrmSessionManager(drmParams, drmUuid)
18
+ }
19
+
20
+ fun buildDrmSessionManager(drmParams: NativeDrmParams, drmUuid: UUID?, retryCount: Int = 0): DrmSessionManager
21
+
22
+ fun getDRMConfiguration(drmParams: NativeDrmParams): MediaItem.DrmConfiguration
23
+ }
@@ -0,0 +1,93 @@
1
+ package com.unifiedplayer.core.player
2
+
3
+ import android.content.Context
4
+ import androidx.annotation.OptIn
5
+ import androidx.media3.common.util.UnstableApi
6
+ import androidx.media3.common.util.Util
7
+ import androidx.media3.datasource.DefaultDataSource
8
+ import androidx.media3.datasource.okhttp.OkHttpDataSource
9
+ import com.facebook.react.bridge.ReactContext
10
+ import com.facebook.react.modules.network.CookieJarContainer
11
+ import com.facebook.react.modules.network.ForwardingCookieHandler
12
+ import com.facebook.react.modules.network.OkHttpClientProvider
13
+ import com.margelo.nitro.unifiedplayer.HybridVideoPlayerSourceSpec
14
+ import okhttp3.Dispatcher
15
+ import okhttp3.JavaNetCookieJar
16
+ import okhttp3.OkHttpClient
17
+ import java.util.concurrent.TimeUnit
18
+
19
+ fun buildBaseDataSourceFactory(context: Context, source: HybridVideoPlayerSourceSpec): DefaultDataSource.Factory {
20
+ return if (source.uri.startsWith("http")) {
21
+ DefaultDataSource.Factory(context, buildHttpDataSourceFactory(context, source))
22
+ } else {
23
+ DefaultDataSource.Factory(context)
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Dedicated OkHttp client used by the HLS / DASH / progressive data
29
+ * source. Built once on first access and shared across player instances.
30
+ *
31
+ * Why a dedicated client (instead of reusing
32
+ * `OkHttpClientProvider.getOkHttpClient()` directly):
33
+ * • RN's shared client uses OkHttp's default `Dispatcher`
34
+ * (`maxRequestsPerHost = 5`). HLS playback wants to parallel-fetch
35
+ * several segments after a seek — with the shared client those
36
+ * requests queue behind whatever API traffic the rest of the app is
37
+ * making, producing visible buffer stalls.
38
+ * • Disabling the response cache prevents double-buffering: ExoPlayer
39
+ * already maintains its own segment buffer; an OkHttp cache on top
40
+ * just adds memory pressure.
41
+ * • Mirrors the iOS-side fix in `AuthHeaderAssetResourceLoader.swift`
42
+ * (`httpMaximumConnectionsPerHost = 10`, `urlCache = nil`,
43
+ * `requestCachePolicy = reloadIgnoringLocalCacheData`) so behaviour
44
+ * stays consistent across platforms.
45
+ */
46
+ private val playbackHttpClient: OkHttpClient by lazy {
47
+ val sharedClient = OkHttpClientProvider.getOkHttpClient()
48
+
49
+ val playbackDispatcher = Dispatcher().apply {
50
+ maxRequests = 64
51
+ maxRequestsPerHost = 10
52
+ }
53
+
54
+ sharedClient.newBuilder()
55
+ .dispatcher(playbackDispatcher)
56
+ .cache(null)
57
+ .connectTimeout(30, TimeUnit.SECONDS)
58
+ .readTimeout(30, TimeUnit.SECONDS)
59
+ .writeTimeout(30, TimeUnit.SECONDS)
60
+ .build()
61
+ }
62
+
63
+ @OptIn(UnstableApi::class)
64
+ fun buildHttpDataSourceFactory(context: Context, source: HybridVideoPlayerSourceSpec): OkHttpDataSource.Factory {
65
+ // Forward RN's cookie handler onto the SHARED client's CookieJar so
66
+ // any cookie-based session auth (e.g. set during regular API calls)
67
+ // is visible to playback requests. The dedicated `playbackHttpClient`
68
+ // inherits the same CookieJar via `newBuilder()`.
69
+ if (context is ReactContext) {
70
+ val sharedClient = OkHttpClientProvider.getOkHttpClient()
71
+ val handler = ForwardingCookieHandler(context)
72
+ (sharedClient.cookieJar as CookieJarContainer).setCookieJar(JavaNetCookieJar(handler))
73
+ }
74
+
75
+ val factory = OkHttpDataSource.Factory(playbackHttpClient)
76
+
77
+ val headers: Map<String, String>? = source.config.headers
78
+
79
+ if (headers != null) {
80
+ factory.setDefaultRequestProperties(headers)
81
+ }
82
+
83
+ if (headers == null || !headers.containsKey("User-Agent")) {
84
+ factory.setUserAgent(getUserAgent(context))
85
+ }
86
+
87
+ return factory
88
+ }
89
+
90
+ @OptIn(UnstableApi::class)
91
+ fun getUserAgent(context: Context): String {
92
+ return Util.getUserAgent(context, context.packageName)
93
+ }
@@ -0,0 +1,141 @@
1
+ package com.unifiedplayer.core.player
2
+
3
+ import android.util.Log
4
+ import android.webkit.MimeTypeMap
5
+ import androidx.annotation.OptIn
6
+ import androidx.core.net.toUri
7
+ import androidx.media3.common.MediaItem
8
+ import androidx.media3.common.C
9
+ import androidx.media3.common.MediaMetadata
10
+ import androidx.media3.common.MimeTypes
11
+ import androidx.media3.common.util.UnstableApi
12
+ import com.margelo.nitro.unifiedplayer.BufferConfig
13
+ import com.margelo.nitro.unifiedplayer.CustomVideoMetadata
14
+ import com.margelo.nitro.unifiedplayer.HybridVideoPlayerSource
15
+ import com.margelo.nitro.unifiedplayer.LivePlaybackParams
16
+ import com.margelo.nitro.unifiedplayer.NativeDrmParams
17
+ import com.margelo.nitro.unifiedplayer.NativeVideoConfig
18
+ import com.margelo.nitro.unifiedplayer.SubtitleType
19
+ import com.unifiedplayer.core.LibraryError
20
+ import com.unifiedplayer.core.SourceError
21
+ import com.unifiedplayer.core.extensions.toStringExtension
22
+ import com.unifiedplayer.core.plugins.PluginsRegistry
23
+
24
+ private const val TAG = "MediaItemUtils"
25
+
26
+ @OptIn(UnstableApi::class)
27
+ fun createMediaItemFromVideoConfig(
28
+ source: HybridVideoPlayerSource
29
+ ): MediaItem {
30
+ val mediaItemBuilder = MediaItem.Builder()
31
+
32
+ mediaItemBuilder.setUri(source.config.uri)
33
+
34
+ source.config.drm?.let { drmParams ->
35
+ val drmManager = source.drmManager ?: throw LibraryError.DRMPluginNotFound
36
+ val drmConfiguration = drmManager.getDRMConfiguration(drmParams)
37
+ mediaItemBuilder.setDrmConfiguration(drmConfiguration)
38
+ }
39
+
40
+ source.config.bufferConfig?.livePlayback?.let { livePlaybackParams ->
41
+ mediaItemBuilder.setLiveConfiguration(getLiveConfiguration(livePlaybackParams))
42
+ }
43
+
44
+ source.config.metadata?.let { metadata ->
45
+ mediaItemBuilder.setMediaMetadata(getCustomMetadata(metadata))
46
+ }
47
+
48
+ return PluginsRegistry.shared.overrideMediaItemBuilder(
49
+ source,
50
+ mediaItemBuilder
51
+ ).build()
52
+ }
53
+
54
+ fun getSubtitlesConfiguration(
55
+ config: NativeVideoConfig,
56
+ ): List<MediaItem.SubtitleConfiguration> {
57
+ val subtitlesConfiguration: MutableList<MediaItem.SubtitleConfiguration> = mutableListOf()
58
+
59
+ if (config.externalSubtitles != null) {
60
+ for (subtitle in config.externalSubtitles) {
61
+ val ext = if (subtitle.type == SubtitleType.AUTO) {
62
+ MimeTypeMap.getFileExtensionFromUrl(subtitle.uri)
63
+ } else {
64
+ subtitle.type.toStringExtension()
65
+ }
66
+
67
+ val mimeType = when (ext?.lowercase()) {
68
+ "srt" -> MimeTypes.APPLICATION_SUBRIP
69
+ "vtt" -> MimeTypes.TEXT_VTT
70
+ "ssa", "ass" -> MimeTypes.TEXT_SSA
71
+ else -> {
72
+ Log.e(TAG, "Unsupported subtitle extension '$ext' for URI: ${subtitle.uri}. Skipping this subtitle.")
73
+ continue
74
+ }
75
+ }
76
+
77
+ try {
78
+ val subtitleConfig = MediaItem.SubtitleConfiguration.Builder(subtitle.uri.toUri())
79
+ .setId("external-subtitle-${subtitle.uri}")
80
+ .setMimeType(mimeType)
81
+ .setSelectionFlags(C.SELECTION_FLAG_DEFAULT)
82
+ .setRoleFlags(C.ROLE_FLAG_SUBTITLE)
83
+ .setLabel(subtitle.label)
84
+ .build()
85
+ subtitlesConfiguration.add(subtitleConfig)
86
+ } catch (e: Exception) {
87
+ Log.e(TAG, "Error creating SubtitleConfiguration for URI ${subtitle.uri}: ${e.message}", e)
88
+ }
89
+ }
90
+ }
91
+ return subtitlesConfiguration
92
+ }
93
+
94
+ fun getLiveConfiguration(
95
+ livePlaybackParams: LivePlaybackParams
96
+ ): MediaItem.LiveConfiguration {
97
+ val liveConfiguration = MediaItem.LiveConfiguration.Builder()
98
+
99
+ livePlaybackParams.maxOffsetMs?.let {
100
+ if (it >= 0) {
101
+ liveConfiguration.setMaxOffsetMs(it.toLong())
102
+ }
103
+ }
104
+
105
+ livePlaybackParams.minOffsetMs?.let {
106
+ if (it >= 0) {
107
+ liveConfiguration.setMinOffsetMs(it.toLong())
108
+ }
109
+ }
110
+
111
+ livePlaybackParams.targetOffsetMs?.let {
112
+ if (it >= 0) {
113
+ liveConfiguration.setTargetOffsetMs(it.toLong())
114
+ }
115
+ }
116
+
117
+ livePlaybackParams.maxPlaybackSpeed?.let {
118
+ if (it >= 0) {
119
+ liveConfiguration.setMaxPlaybackSpeed(it.toFloat())
120
+ }
121
+ }
122
+
123
+ livePlaybackParams.minPlaybackSpeed?.let {
124
+ if (it >= 0) {
125
+ liveConfiguration.setMinPlaybackSpeed(it.toFloat())
126
+ }
127
+ }
128
+
129
+ return liveConfiguration.build()
130
+ }
131
+
132
+ fun getCustomMetadata(metadata: CustomVideoMetadata): MediaMetadata {
133
+ return MediaMetadata.Builder()
134
+ .setDisplayTitle(metadata.title)
135
+ .setTitle(metadata.title)
136
+ .setSubtitle(metadata.subtitle)
137
+ .setDescription(metadata.description)
138
+ .setArtist(metadata.artist)
139
+ .setArtworkUri(metadata.imageUri?.toUri())
140
+ .build()
141
+ }