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,157 @@
1
+ package com.unifiedplayer.core.utils
2
+
3
+ import android.content.Context
4
+ import android.util.Log
5
+ import android.view.View
6
+ import android.view.ViewGroup
7
+ import android.widget.ImageButton
8
+ import androidx.media3.ui.PlayerView
9
+
10
+ object SmallVideoPlayerOptimizer {
11
+
12
+ fun isSmallVideoPlayer(playerView: PlayerView): Boolean {
13
+ // Check if the PlayerView dimensions are small enough to warrant optimizations
14
+ val width = playerView.width
15
+ val height = playerView.height
16
+
17
+ // If view hasn't been measured yet, use layout params or return false
18
+ if (width <= 0 || height <= 0) {
19
+ val layoutParams = playerView.layoutParams
20
+ if (layoutParams != null) {
21
+ // Convert any specific dimensions to pixels if needed
22
+ val widthPx = if (layoutParams.width > 0) layoutParams.width else playerView.measuredWidth
23
+ val heightPx = if (layoutParams.height > 0) layoutParams.height else playerView.measuredHeight
24
+
25
+ if (widthPx <= 0 || heightPx <= 0) return false
26
+
27
+ return isSmallDimensions(widthPx, heightPx, playerView.context)
28
+ }
29
+ return false
30
+ }
31
+
32
+ return isSmallDimensions(width, height, playerView.context)
33
+ }
34
+
35
+ private fun isSmallDimensions(widthPx: Int, heightPx: Int, context: Context): Boolean {
36
+ val density = context.resources.displayMetrics.density
37
+ val widthDp = widthPx / density
38
+ val heightDp = heightPx / density
39
+
40
+ // Consider the video player "small" if width <= 400dp or height <= 300dp
41
+ // These thresholds are more appropriate for actual video player sizes
42
+ return widthDp <= 400 || heightDp <= 300
43
+ }
44
+
45
+ fun applyOptimizations(
46
+ playerView: PlayerView,
47
+ context: Context,
48
+ isFullscreen: Boolean = false
49
+ ) {
50
+ playerView.post {
51
+ try {
52
+ if (isFullscreen) {
53
+ // For fullscreen mode, use system defaults - no custom optimizations
54
+ // Let ExoPlayer use its default controller timeout and styling
55
+ return@post
56
+ }
57
+
58
+ // Only apply optimizations if the video player itself is small
59
+ if (!isSmallVideoPlayer(playerView)) {
60
+ return@post
61
+ }
62
+
63
+ val controllerView = playerView.findViewById<ViewGroup>(androidx.media3.ui.R.id.exo_controller)
64
+ controllerView?.let { controller ->
65
+ optimizeControlElementsForSmallPlayer(controller, context)
66
+ }
67
+ } catch (e: Exception) {
68
+ Log.w("UnifiedPlayer", "Error applying small video player optimizations: ${e.message}")
69
+ }
70
+ }
71
+ }
72
+
73
+ private fun optimizeControlElementsForSmallPlayer(
74
+ controller: ViewGroup,
75
+ context: Context
76
+ ) {
77
+ val density = context.resources.displayMetrics.density
78
+ val primaryButtonSize = (48 * density).toInt()
79
+ val secondaryButtonSize = (44 * density).toInt()
80
+
81
+ optimizeButtons(controller, primaryButtonSize, secondaryButtonSize)
82
+ optimizeProgressBar(controller, context)
83
+ optimizeTextElements(controller)
84
+ }
85
+
86
+ private fun optimizeButtons(
87
+ container: ViewGroup,
88
+ primarySize: Int,
89
+ secondarySize: Int
90
+ ) {
91
+ for (i in 0 until container.childCount) {
92
+ val child = container.getChildAt(i)
93
+ when (child) {
94
+ is ImageButton -> {
95
+ val buttonSize = when (child.id) {
96
+ androidx.media3.ui.R.id.exo_play_pause -> primarySize
97
+ androidx.media3.ui.R.id.exo_fullscreen -> primarySize
98
+ androidx.media3.ui.R.id.exo_settings -> primarySize
99
+ androidx.media3.ui.R.id.exo_rew -> secondarySize
100
+ androidx.media3.ui.R.id.exo_ffwd -> secondarySize
101
+ androidx.media3.ui.R.id.exo_subtitle -> secondarySize
102
+ androidx.media3.ui.R.id.exo_prev -> secondarySize
103
+ androidx.media3.ui.R.id.exo_next -> secondarySize
104
+ else -> secondarySize
105
+ }
106
+
107
+ val params = child.layoutParams
108
+ params.width = buttonSize
109
+ params.height = buttonSize
110
+ child.layoutParams = params
111
+
112
+ // Hide less essential buttons on small video players
113
+ when (child.id) {
114
+ androidx.media3.ui.R.id.exo_shuffle,
115
+ androidx.media3.ui.R.id.exo_repeat_toggle,
116
+ androidx.media3.ui.R.id.exo_vr -> {
117
+ child.visibility = View.GONE
118
+ }
119
+ }
120
+ }
121
+ is ViewGroup -> {
122
+ optimizeButtons(child, primarySize, secondarySize)
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ private fun optimizeProgressBar(
129
+ controller: ViewGroup,
130
+ context: Context
131
+ ) {
132
+ val progressContainer = controller.findViewById<View>(androidx.media3.ui.R.id.exo_progress)
133
+ progressContainer?.let { progress ->
134
+ val params = progress.layoutParams as? ViewGroup.MarginLayoutParams
135
+ params?.let {
136
+ it.height = (4 * context.resources.displayMetrics.density).toInt()
137
+ progress.layoutParams = it
138
+ }
139
+ }
140
+ }
141
+
142
+ private fun optimizeTextElements(
143
+ controller: ViewGroup
144
+ ) {
145
+ val timeContainer = controller.findViewById<ViewGroup>(androidx.media3.ui.R.id.exo_time)
146
+ timeContainer?.let { time ->
147
+ val positionView = time.findViewById<View>(androidx.media3.ui.R.id.exo_position)
148
+ val durationView = time.findViewById<View>(androidx.media3.ui.R.id.exo_duration)
149
+
150
+ listOf(positionView, durationView).forEach { textView ->
151
+ if (textView is android.widget.TextView) {
152
+ textView.textSize = 12f
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
@@ -0,0 +1,48 @@
1
+ package com.unifiedplayer.core.utils
2
+
3
+ import com.unifiedplayer.core.SourceError
4
+ import java.util.concurrent.atomic.AtomicInteger
5
+ import java.util.concurrent.atomic.AtomicReference
6
+
7
+ class SourceLoader {
8
+ private val operationCounter = AtomicInteger(0)
9
+ private val currentOperationRef = AtomicReference<OperationHolder<*>?>(null)
10
+
11
+ fun <T> load(operation: () -> T): T {
12
+ cancel()
13
+
14
+ val currentOp = operationCounter.incrementAndGet()
15
+ val holder = OperationHolder<T>(currentOp)
16
+ currentOperationRef.set(holder)
17
+
18
+ return try {
19
+ val result = operation()
20
+ if (holder.operationId != operationCounter.get()) {
21
+ throw SourceError.Cancelled
22
+ }
23
+ result
24
+ } catch (e: SourceError.Cancelled) {
25
+ throw e
26
+ } catch (e: Exception) {
27
+ if (holder.operationId != operationCounter.get()) {
28
+ throw SourceError.Cancelled
29
+ }
30
+ throw e
31
+ } finally {
32
+ if (holder.operationId == operationCounter.get()) {
33
+ currentOperationRef.set(null)
34
+ }
35
+ }
36
+ }
37
+
38
+ fun cancel() {
39
+ val current = currentOperationRef.get()
40
+ if (current != null) {
41
+ operationCounter.incrementAndGet()
42
+ currentOperationRef.set(null)
43
+ }
44
+ }
45
+
46
+ private class OperationHolder<T>(val operationId: Int)
47
+ }
48
+
@@ -0,0 +1,175 @@
1
+ package com.unifiedplayer.core.utils
2
+
3
+ import androidx.media3.common.C
4
+ import androidx.media3.common.TrackSelectionOverride
5
+ import androidx.media3.common.util.UnstableApi
6
+ import androidx.media3.exoplayer.ExoPlayer
7
+ import com.margelo.nitro.unifiedplayer.HybridVideoPlayerSourceSpec
8
+ import com.margelo.nitro.unifiedplayer.TextTrack
9
+
10
+ @UnstableApi
11
+ object TextTrackUtils {
12
+ fun getAvailableTextTracks(player: ExoPlayer, source: HybridVideoPlayerSourceSpec): Array<TextTrack> {
13
+ return Threading.runOnMainThreadSync {
14
+ val tracks = mutableListOf<TextTrack>()
15
+ val currentTracks = player.currentTracks
16
+ var globalTrackIndex = 0
17
+
18
+ // Get all text tracks from the current player tracks (includes both built-in and external)
19
+ for (trackGroup in currentTracks.groups) {
20
+ if (trackGroup.type == C.TRACK_TYPE_TEXT) {
21
+ for (trackIndex in 0 until trackGroup.length) {
22
+ val format = trackGroup.getTrackFormat(trackIndex)
23
+ val trackId = format.id ?: "text-$globalTrackIndex"
24
+ val label = format.label ?: "Unknown ${globalTrackIndex + 1}"
25
+ val language = format.language
26
+ val isSelected = trackGroup.isTrackSelected(trackIndex)
27
+
28
+ // Determine if this is an external track by checking if it matches external subtitle labels
29
+ val isExternal = source.config.externalSubtitles?.any { subtitle ->
30
+ label.contains(subtitle.label, ignoreCase = true)
31
+ } == true
32
+
33
+ val finalTrackId = if (isExternal) "external-$globalTrackIndex" else trackId
34
+
35
+ tracks.add(
36
+ TextTrack(
37
+ id = finalTrackId,
38
+ label = label,
39
+ language = language,
40
+ selected = isSelected
41
+ )
42
+ )
43
+
44
+ globalTrackIndex++
45
+ }
46
+ }
47
+ }
48
+
49
+ tracks.toTypedArray()
50
+ }
51
+ }
52
+
53
+ fun selectTextTrack(
54
+ player: ExoPlayer,
55
+ textTrack: TextTrack?,
56
+ source: HybridVideoPlayerSourceSpec,
57
+ onTrackChange: (TextTrack?) -> Unit,
58
+ ): Int? {
59
+ return Threading.runOnMainThreadSync {
60
+ val trackSelector = player.trackSelectionParameters.buildUpon()
61
+
62
+ // If textTrack is null, disable all text tracks
63
+ if (textTrack == null) {
64
+ trackSelector.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true)
65
+ player.trackSelectionParameters = trackSelector.build()
66
+ onTrackChange(null)
67
+ return@runOnMainThreadSync null
68
+ }
69
+
70
+ if (textTrack.id.isEmpty()) {
71
+ // Disable all text tracks
72
+ trackSelector.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true)
73
+ player.trackSelectionParameters = trackSelector.build()
74
+ onTrackChange(null)
75
+ return@runOnMainThreadSync null
76
+ }
77
+
78
+ val currentTracks = player.currentTracks
79
+ var trackFound = false
80
+ var selectedExternalTrackIndex: Int? = null
81
+ var globalTrackIndex = 0
82
+
83
+ // Find and select the specific text track
84
+ for (trackGroup in currentTracks.groups) {
85
+ if (trackGroup.type == C.TRACK_TYPE_TEXT) {
86
+ for (trackIndex in 0 until trackGroup.length) {
87
+ val format = trackGroup.getTrackFormat(trackIndex)
88
+ val currentTrackId = format.id ?: "text-$globalTrackIndex"
89
+ val label = format.label ?: "Unknown ${globalTrackIndex + 1}"
90
+
91
+ // Check if this matches our target track (either by original ID or by external ID)
92
+ val isExternal = source.config.externalSubtitles?.any { subtitle ->
93
+ label.contains(subtitle.label, ignoreCase = true)
94
+ } == true
95
+
96
+ val finalTrackId =
97
+ if (isExternal) "external-$globalTrackIndex" else currentTrackId
98
+
99
+ if (finalTrackId == textTrack.id) {
100
+ // Enable this specific track
101
+ trackSelector.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, false)
102
+ trackSelector.setOverrideForType(
103
+ TrackSelectionOverride(
104
+ trackGroup.mediaTrackGroup,
105
+ listOf(trackIndex)
106
+ )
107
+ )
108
+
109
+ // Update selection state
110
+ selectedExternalTrackIndex = if (isExternal) {
111
+ globalTrackIndex
112
+ } else {
113
+ null
114
+ }
115
+
116
+ onTrackChange(textTrack)
117
+ trackFound = true
118
+ break
119
+ }
120
+
121
+ globalTrackIndex++
122
+ }
123
+ if (trackFound) {
124
+ break
125
+ }
126
+ }
127
+ }
128
+
129
+ // Apply the track selection parameters regardless of whether we found a track
130
+ player.trackSelectionParameters = trackSelector.build()
131
+ selectedExternalTrackIndex
132
+ }
133
+ }
134
+
135
+ fun getSelectedTrack(player: ExoPlayer, source: HybridVideoPlayerSourceSpec): TextTrack? {
136
+ return Threading.runOnMainThreadSync {
137
+ val currentTracks = player.currentTracks
138
+ var globalTrackIndex = 0
139
+
140
+ // Find the currently selected text track
141
+ for (trackGroup in currentTracks.groups) {
142
+ if (trackGroup.type == C.TRACK_TYPE_TEXT && trackGroup.isSelected) {
143
+ for (trackIndex in 0 until trackGroup.length) {
144
+ if (trackGroup.isTrackSelected(trackIndex)) {
145
+ val format = trackGroup.getTrackFormat(trackIndex)
146
+ val trackId = format.id ?: "text-$globalTrackIndex"
147
+ val label = format.label ?: "Unknown ${globalTrackIndex + 1}"
148
+ val language = format.language
149
+
150
+ // Determine if this is an external track by checking if it matches external subtitle labels
151
+ val isExternal = source.config.externalSubtitles?.any { subtitle ->
152
+ label.contains(subtitle.label, ignoreCase = true)
153
+ } == true
154
+
155
+ val finalTrackId = if (isExternal) "external-$globalTrackIndex" else trackId
156
+
157
+ return@runOnMainThreadSync TextTrack(
158
+ id = finalTrackId,
159
+ label = label,
160
+ language = language,
161
+ selected = true
162
+ )
163
+ }
164
+ globalTrackIndex++
165
+ }
166
+ } else if (trackGroup.type == C.TRACK_TYPE_TEXT) {
167
+ // Still need to increment global index for non-selected text track groups
168
+ globalTrackIndex += trackGroup.length
169
+ }
170
+ }
171
+
172
+ null
173
+ }
174
+ }
175
+ }
@@ -0,0 +1,75 @@
1
+ package com.unifiedplayer.core.utils
2
+
3
+ import android.os.Handler
4
+ import android.os.Looper
5
+ import com.margelo.nitro.NitroModules
6
+ import com.unifiedplayer.core.LibraryError
7
+ import java.util.concurrent.Callable
8
+ import java.util.concurrent.FutureTask
9
+ import kotlin.reflect.KProperty
10
+
11
+ object Threading {
12
+ @JvmStatic
13
+ fun runOnMainThread(action: () -> Unit) {
14
+ // We are already on the main thread, run and return
15
+ if (Looper.myLooper() == Looper.getMainLooper()) {
16
+ action()
17
+ return
18
+ }
19
+
20
+ // If application context is null, throw an error
21
+ if (NitroModules.applicationContext == null) {
22
+ throw LibraryError.ApplicationContextNotFound
23
+ }
24
+
25
+ // Post the action to the main thread
26
+ Handler(NitroModules.applicationContext!!.mainLooper).post {
27
+ action()
28
+ }
29
+ }
30
+
31
+ @JvmStatic
32
+ fun <T> runOnMainThreadSync(action: Callable<T>): T {
33
+ return if (Looper.myLooper() == Looper.getMainLooper()) {
34
+ // Already on the main thread, run and return the result
35
+ action.call()
36
+ } else {
37
+ // Post the action to the main thread and wait for the result
38
+ val futureTask = FutureTask(action)
39
+ Handler(Looper.getMainLooper()).post(futureTask)
40
+ futureTask.get()
41
+ }
42
+ }
43
+
44
+ class MainThreadProperty<Reference, Type>(
45
+ private val get: Reference.() -> Type,
46
+ private val set: (Reference.(Type) -> Unit)? = null
47
+ ) {
48
+ operator fun getValue(thisRef: Reference, property: KProperty<*>): Type {
49
+ return runOnMainThreadSync { thisRef.get() }
50
+ }
51
+
52
+ operator fun setValue(thisRef: Reference, property: KProperty<*>, value: Type) {
53
+ val setter = set ?: throw IllegalStateException("Property ${property.name} is read-only")
54
+ runOnMainThread { thisRef.setter(value) }
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Read-only property that runs on main thread
60
+ * @param get The getter function that runs synchronously on the main thread.
61
+ *
62
+ * @throws [IllegalStateException] if there will be a write operation
63
+ */
64
+ fun <Reference, T> Reference.mainThreadProperty(get: Reference.() -> T) = MainThreadProperty(get)
65
+
66
+ /**
67
+ * Read-only property that runs on main thread
68
+ * @param get The getter function that runs synchronously on the main thread
69
+ * @param set The setter function that runs asynchronously on the main thread
70
+ */
71
+ fun <Reference, T> Reference.mainThreadProperty(
72
+ get: Reference.() -> T,
73
+ set: Reference.(T) -> Unit
74
+ ) = MainThreadProperty(get, set)
75
+ }
@@ -0,0 +1,51 @@
1
+ package com.unifiedplayer.core.utils
2
+
3
+ import android.Manifest
4
+ import android.content.pm.PackageManager
5
+ import android.net.Uri
6
+ import android.webkit.URLUtil
7
+ import com.margelo.nitro.NitroModules
8
+ import com.unifiedplayer.core.SourceError
9
+ import java.io.File
10
+ import java.net.URL
11
+ import java.net.URLConnection
12
+
13
+ object VideoFileHelper {
14
+ private fun hasReadPermission(): Boolean {
15
+ return NitroModules.applicationContext?.checkSelfPermission(
16
+ Manifest.permission.READ_EXTERNAL_STORAGE
17
+ ) == PackageManager.PERMISSION_GRANTED
18
+ }
19
+
20
+ fun validateReadPermission(uri: String) {
21
+ if (!hasReadPermission()) throw SourceError.MissingReadFilePermission(uri)
22
+
23
+ val file = File(Uri.parse(uri).path ?: throw SourceError.InvalidUri(uri))
24
+
25
+ // Check if file exists and is readable
26
+ if (!file.exists()) throw SourceError.FileDoesNotExist(uri)
27
+
28
+ // Check if file is readable
29
+ if (!file.canRead()) throw SourceError.MissingReadFilePermission(uri)
30
+ }
31
+
32
+ fun getFileSizeFromUri(uri: String): Long {
33
+ return try {
34
+ when {
35
+ URLUtil.isFileUrl(uri) -> {
36
+ validateReadPermission(uri)
37
+ val file = File(Uri.parse(uri).path ?: return -1)
38
+ if (file.exists()) file.length() else -1
39
+ }
40
+ URLUtil.isNetworkUrl(uri) -> {
41
+ val connection: URLConnection = URL(uri).openConnection()
42
+ connection.connect()
43
+ connection.contentLength.toLong()
44
+ }
45
+ else -> -1
46
+ }
47
+ } catch (e: Exception) {
48
+ -1
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,67 @@
1
+ package com.unifiedplayer.core.utils
2
+
3
+ import android.media.MediaFormat
4
+ import android.media.MediaMetadataRetriever
5
+ import android.net.Uri
6
+ import android.os.Build
7
+ import android.webkit.URLUtil
8
+ import com.margelo.nitro.unifiedplayer.VideoInformation
9
+ import androidx.core.net.toUri
10
+
11
+ object VideoInformationUtils {
12
+ fun fromUri(uri: String, headers: Map<String, String> = emptyMap()): VideoInformation {
13
+ val retriever = MediaMetadataRetriever()
14
+
15
+ when {
16
+ URLUtil.isFileUrl(uri) -> {
17
+ retriever.setDataSource(uri.toUri().path)
18
+ }
19
+ else -> {
20
+ retriever.setDataSource(uri, headers)
21
+ }
22
+ }
23
+
24
+ // Get dimensions
25
+ val width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toDoubleOrNull() ?: Double.NaN
26
+ val height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toDoubleOrNull() ?: Double.NaN
27
+
28
+ // Get duration in milliseconds, convert to long
29
+ val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLongOrNull() ?: -1L
30
+
31
+ // If we have some valid info, but there is no duration it might be live
32
+ val isLive = !width.isNaN() && !height.isNaN() && duration <= 0
33
+
34
+ // Get bitrate
35
+ val bitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)?.toDoubleOrNull() ?: Double.NaN
36
+
37
+ // Get rotation
38
+ val rotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION)?.toIntOrNull() ?: 0
39
+
40
+ // Check for HDR by looking at color transfer (API 30+)
41
+ val isHDR = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
42
+ val colorTransfer = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER)?.toIntOrNull()
43
+ colorTransfer == MediaFormat.COLOR_TRANSFER_ST2084 || colorTransfer == MediaFormat.COLOR_TRANSFER_HLG
44
+ } else {
45
+ false
46
+ }
47
+
48
+ // Clean up
49
+ retriever.release()
50
+
51
+ // Get file size
52
+ val fileSize = VideoFileHelper.getFileSizeFromUri(uri)
53
+
54
+ val videoInfo = VideoInformation(
55
+ bitrate = bitrate,
56
+ width = width,
57
+ height = height,
58
+ duration = duration,
59
+ fileSize = fileSize,
60
+ isHDR = isHDR,
61
+ isLive = isLive,
62
+ orientation = VideoOrientationUtils.fromWHR(width.toInt(), height.toInt(), rotation)
63
+ )
64
+
65
+ return videoInfo
66
+ }
67
+ }
@@ -0,0 +1,30 @@
1
+ package com.unifiedplayer.core.utils
2
+
3
+ import com.margelo.nitro.unifiedplayer.VideoOrientation
4
+
5
+ object VideoOrientationUtils {
6
+ fun fromWHR(width: Int?, height: Int?, rotation: Int?): VideoOrientation {
7
+ if (width == 0 || height == 0 || height == null || width == null) return VideoOrientation.UNKNOWN
8
+
9
+ if (width == height) return VideoOrientation.SQUARE
10
+
11
+ // Check if video is portrait or landscape using natural size
12
+ val isNaturalSizePortrait = height > width
13
+
14
+ // If rotation is not available, use natural size to determine orientation
15
+ if (rotation == null) {
16
+ return if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT
17
+ }
18
+
19
+ // Normalize rotation to 0-360 range
20
+ val normalizedRotation = ((rotation % 360) + 360) % 360
21
+
22
+ return when (normalizedRotation) {
23
+ 0 -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT
24
+ 90 -> VideoOrientation.PORTRAIT
25
+ 180 -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT_UPSIDE_DOWN else VideoOrientation.LANDSCAPE_LEFT
26
+ 270 -> VideoOrientation.PORTRAIT_UPSIDE_DOWN
27
+ else -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT
28
+ }
29
+ }
30
+ }