react-native-audio-browser 0.0.1 → 0.1.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1147) hide show
  1. package/AudioBrowser.podspec +45 -0
  2. package/LICENSE +21 -0
  3. package/README.md +3 -1
  4. package/android/CMakeLists.txt +32 -0
  5. package/android/build.gradle +214 -0
  6. package/android/fix-prefab.gradle +51 -0
  7. package/android/gradle.properties +6 -0
  8. package/android/src/main/AndroidManifest.xml +36 -0
  9. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  10. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +1197 -0
  11. package/android/src/main/java/com/audiobrowser/AudioBrowserPackage.kt +21 -0
  12. package/android/src/main/java/com/audiobrowser/Callbacks.kt +92 -0
  13. package/android/src/main/java/com/audiobrowser/HeadlessTaskService.kt +59 -0
  14. package/android/src/main/java/com/audiobrowser/Service.kt +334 -0
  15. package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +1174 -0
  16. package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +134 -0
  17. package/android/src/main/java/com/audiobrowser/browser/RouteMatch.kt +9 -0
  18. package/android/src/main/java/com/audiobrowser/browser/SimpleRouter.kt +154 -0
  19. package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +45 -0
  20. package/android/src/main/java/com/audiobrowser/extension/EnumExtensions.kt +5 -0
  21. package/android/src/main/java/com/audiobrowser/extension/NumberExt.kt +13 -0
  22. package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +171 -0
  23. package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +251 -0
  24. package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +80 -0
  25. package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +101 -0
  26. package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +125 -0
  27. package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +256 -0
  28. package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +162 -0
  29. package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +117 -0
  30. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +596 -0
  31. package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +578 -0
  32. package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +59 -0
  33. package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +246 -0
  34. package/android/src/main/java/com/audiobrowser/player/Player.kt +1510 -0
  35. package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +230 -0
  36. package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +191 -0
  37. package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +80 -0
  38. package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +147 -0
  39. package/android/src/main/java/com/audiobrowser/util/AndroidAudioContentTypeFactory.kt +17 -0
  40. package/android/src/main/java/com/audiobrowser/util/BatteryOptimizationHelper.kt +95 -0
  41. package/android/src/main/java/com/audiobrowser/util/BatteryWarningStore.kt +38 -0
  42. package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +155 -0
  43. package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +390 -0
  44. package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +197 -0
  45. package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +75 -0
  46. package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +97 -0
  47. package/android/src/main/java/com/audiobrowser/util/NetworkConnectivityMonitor.kt +121 -0
  48. package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +25 -0
  49. package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
  50. package/android/src/main/java/com/audiobrowser/util/RepeatModeFactory.kt +22 -0
  51. package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
  52. package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +130 -0
  53. package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +50 -0
  54. package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +125 -0
  55. package/android/src/main/res/values/strings.xml +6 -0
  56. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +63 -0
  57. package/android/src/test/java/com/audiobrowser/browser/SimpleBrowserTest.kt +38 -0
  58. package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +165 -0
  59. package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +240 -0
  60. package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +146 -0
  61. package/android/src/test/resources/robolectric.properties +1 -0
  62. package/ios/Bridge.h +8 -0
  63. package/ios/Browser/BrowserConfig.swift +111 -0
  64. package/ios/Browser/BrowserManager+URLResolution.swift +260 -0
  65. package/ios/Browser/BrowserManager.swift +630 -0
  66. package/ios/Browser/BrowserPathHelper.swift +190 -0
  67. package/ios/Browser/JsonModels.swift +202 -0
  68. package/ios/Browser/SimpleRouter.swift +184 -0
  69. package/ios/CarPlay/CarPlayArtworkResolver.swift +107 -0
  70. package/ios/CarPlay/CarPlayController.swift +771 -0
  71. package/ios/CarPlay/CarPlayImageLoader.swift +180 -0
  72. package/ios/CarPlay/CarPlayListItemFactory.swift +209 -0
  73. package/ios/CarPlay/CarPlayNowPlayingManager.swift +302 -0
  74. package/ios/CarPlay/RNABAudioBrowser.h +23 -0
  75. package/ios/CarPlay/RNABAudioBrowser.m +22 -0
  76. package/ios/CarPlay/RNABCarPlaySceneDelegate.h +15 -0
  77. package/ios/CarPlay/RNABCarPlaySceneDelegate.m +59 -0
  78. package/ios/CarPlay/RNABMediaIntentHandler.swift +60 -0
  79. package/ios/CarPlay/Track+CarPlay.swift +63 -0
  80. package/ios/Extension/Capability+RemoteCommand.swift +76 -0
  81. package/ios/Extension/ChapterMetadata+AVFoundation.swift +40 -0
  82. package/ios/Extension/CxxVectorConformances.swift +20 -0
  83. package/ios/Extension/NavigationError+Conversion.swift +49 -0
  84. package/ios/Extension/ResolvedTrack+Copying.swift +59 -0
  85. package/ios/Extension/TimedMetadata+AVFoundation.swift +129 -0
  86. package/ios/Extension/Track+AVPlayer.swift +33 -0
  87. package/ios/Extension/Track+Copying.swift +53 -0
  88. package/ios/Extension/TrackMetadata+AVFoundation.swift +131 -0
  89. package/ios/Http/HttpClient.swift +237 -0
  90. package/ios/HybridAudioBrowser.swift +1292 -0
  91. package/ios/Model/MediaURL.swift +67 -0
  92. package/ios/Model/NitroTypeStubs.swift +228 -0
  93. package/ios/Model/PlayerUpdateOptions.swift +116 -0
  94. package/ios/Model/RemoteCommand.swift +71 -0
  95. package/ios/Model/SourceType.swift +6 -0
  96. package/ios/Model/TrackPlayerError.swift +73 -0
  97. package/ios/NowPlayingInfo/MediaItemProperty.swift +78 -0
  98. package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
  99. package/ios/NowPlayingInfo/NowPlayingInfoController.swift +191 -0
  100. package/ios/NowPlayingInfo/NowPlayingInfoKeyValue.swift +6 -0
  101. package/ios/NowPlayingInfo/NowPlayingInfoProperty.swift +220 -0
  102. package/ios/Observer/PlayerItemNotificationObserver.swift +79 -0
  103. package/ios/Observer/PlayerItemPropertyObserver.swift +110 -0
  104. package/ios/Observer/PlayerStateObserver.swift +50 -0
  105. package/ios/Observer/PlayerTimeObserver.swift +105 -0
  106. package/ios/Option/PitchAlgorithms.swift +17 -0
  107. package/ios/Option/SessionCategories.swift +100 -0
  108. package/ios/Option/TimeEventFrequency.swift +18 -0
  109. package/ios/PlaybackEvent.swift +15 -0
  110. package/ios/Player/LoadSeekCoordinator.swift +84 -0
  111. package/ios/Player/MediaLoader.swift +197 -0
  112. package/ios/Player/MediaLoaderDelegate.swift +11 -0
  113. package/ios/Player/NowPlayingUpdater.swift +106 -0
  114. package/ios/Player/PlaybackCoordinator.swift +520 -0
  115. package/ios/Player/PlaybackCoordinatorCallbacks.swift +19 -0
  116. package/ios/Player/PlaybackEffectHandler.swift +44 -0
  117. package/ios/Player/PlaybackErrorHandler.swift +91 -0
  118. package/ios/Player/PlaybackProgressUpdateManager.swift +68 -0
  119. package/ios/Player/PlaybackStateMachine.swift +31 -0
  120. package/ios/Player/PlayerStatusTypes.swift +9 -0
  121. package/ios/Player/PlayingStateManager.swift +32 -0
  122. package/ios/Player/QueueManager.swift +320 -0
  123. package/ios/Player/RetryManager.swift +246 -0
  124. package/ios/Player/SeekCompletionHandler.swift +3 -0
  125. package/ios/Player/ShuffleOrder.swift +191 -0
  126. package/ios/Player/SleepTimerHandling.swift +7 -0
  127. package/ios/Player/SleepTimerManager.swift +131 -0
  128. package/ios/RemoteCommand/RemoteCommandController.swift +406 -0
  129. package/ios/Support/RNTrackPlayer-Bridging-Header.h +7 -0
  130. package/ios/Tests/BrowserPathHelperTests.swift +110 -0
  131. package/ios/Tests/CarPlayArtworkResolverTests.swift +413 -0
  132. package/ios/Tests/ChapterMetadataAVFoundationTests.swift +88 -0
  133. package/ios/Tests/EmitterTests.swift +122 -0
  134. package/ios/Tests/LoadSeekCoordinatorTests.swift +294 -0
  135. package/ios/Tests/MediaLoaderTests.swift +228 -0
  136. package/ios/Tests/PlaybackCoordinatorTests.swift +486 -0
  137. package/ios/Tests/PlaybackErrorHandlerTests.swift +213 -0
  138. package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +166 -0
  139. package/ios/Tests/PlaybackStateMachineTests.swift +137 -0
  140. package/ios/Tests/QueueManagerTests.swift +880 -0
  141. package/ios/Tests/ResolvedTrackCopyingTests.swift +245 -0
  142. package/ios/Tests/SimpleRouterTests.swift +139 -0
  143. package/ios/Tests/Support/TestTypes.swift +180 -0
  144. package/ios/Tests/TimedMetadataAVFoundationTests.swift +152 -0
  145. package/ios/Tests/TrackMetadataAVFoundationTests.swift +176 -0
  146. package/ios/Tests/TrackSelectorTests.swift +268 -0
  147. package/ios/TrackPlayer.swift +692 -0
  148. package/ios/TrackPlayerCallbacks.swift +92 -0
  149. package/ios/TrackSelector.swift +141 -0
  150. package/ios/Util/ArtworkImageFetcher.swift +35 -0
  151. package/ios/Util/Emitter.swift +68 -0
  152. package/ios/Util/LRUCache.swift +182 -0
  153. package/ios/Util/MetadataAdapter.swift +131 -0
  154. package/ios/Util/NetworkMonitor.swift +65 -0
  155. package/ios/Util/OnceValue.swift +70 -0
  156. package/ios/Util/SFSymbolRenderer.swift +142 -0
  157. package/ios/Util/SVGProcessor.swift +56 -0
  158. package/lib/commonjs/AudioBrowser.js +50 -0
  159. package/lib/commonjs/AudioBrowser.js.map +1 -0
  160. package/lib/commonjs/features/battery.js +154 -0
  161. package/lib/commonjs/features/battery.js.map +1 -0
  162. package/lib/commonjs/features/browser.js +272 -0
  163. package/lib/commonjs/features/browser.js.map +1 -0
  164. package/lib/commonjs/features/equalizer.js +69 -0
  165. package/lib/commonjs/features/equalizer.js.map +1 -0
  166. package/lib/commonjs/features/errors.js +165 -0
  167. package/lib/commonjs/features/errors.js.map +1 -0
  168. package/lib/commonjs/features/favorites.js +101 -0
  169. package/lib/commonjs/features/favorites.js.map +1 -0
  170. package/lib/commonjs/features/index.js +160 -0
  171. package/lib/commonjs/features/index.js.map +1 -0
  172. package/lib/commonjs/features/metadata.js +54 -0
  173. package/lib/commonjs/features/metadata.js.map +1 -0
  174. package/lib/commonjs/features/network.js +40 -0
  175. package/lib/commonjs/features/network.js.map +1 -0
  176. package/lib/commonjs/features/nowPlaying.js +61 -0
  177. package/lib/commonjs/features/nowPlaying.js.map +1 -0
  178. package/lib/commonjs/features/output.js +54 -0
  179. package/lib/commonjs/features/output.js.map +1 -0
  180. package/lib/commonjs/features/playback/controls.js +79 -0
  181. package/lib/commonjs/features/playback/controls.js.map +1 -0
  182. package/lib/commonjs/features/playback/index.js +83 -0
  183. package/lib/commonjs/features/playback/index.js.map +1 -0
  184. package/lib/commonjs/features/playback/playWhenReady.js +55 -0
  185. package/lib/commonjs/features/playback/playWhenReady.js.map +1 -0
  186. package/lib/commonjs/features/playback/playing.js +41 -0
  187. package/lib/commonjs/features/playback/playing.js.map +1 -0
  188. package/lib/commonjs/features/playback/progress.js +104 -0
  189. package/lib/commonjs/features/playback/progress.js.map +1 -0
  190. package/lib/commonjs/features/playback/rate.js +29 -0
  191. package/lib/commonjs/features/playback/rate.js.map +1 -0
  192. package/lib/commonjs/features/playback/state.js +62 -0
  193. package/lib/commonjs/features/playback/state.js.map +1 -0
  194. package/lib/commonjs/features/playback/volume.js +68 -0
  195. package/lib/commonjs/features/playback/volume.js.map +1 -0
  196. package/lib/commonjs/features/player/index.js +28 -0
  197. package/lib/commonjs/features/player/index.js.map +1 -0
  198. package/lib/commonjs/features/player/options.js +182 -0
  199. package/lib/commonjs/features/player/options.js.map +1 -0
  200. package/lib/commonjs/features/player/setup.js +143 -0
  201. package/lib/commonjs/features/player/setup.js.map +1 -0
  202. package/lib/commonjs/features/queue/activeTrack.js +52 -0
  203. package/lib/commonjs/features/queue/activeTrack.js.map +1 -0
  204. package/lib/commonjs/features/queue/index.js +50 -0
  205. package/lib/commonjs/features/queue/index.js.map +1 -0
  206. package/lib/commonjs/features/queue/queue.js +177 -0
  207. package/lib/commonjs/features/queue/queue.js.map +1 -0
  208. package/lib/commonjs/features/queue/repeatMode.js +58 -0
  209. package/lib/commonjs/features/queue/repeatMode.js.map +1 -0
  210. package/lib/commonjs/features/queue/shuffle.js +57 -0
  211. package/lib/commonjs/features/queue/shuffle.js.map +1 -0
  212. package/lib/commonjs/features/rating.js +2 -0
  213. package/lib/commonjs/features/rating.js.map +1 -0
  214. package/lib/commonjs/features/remoteControls.js +286 -0
  215. package/lib/commonjs/features/remoteControls.js.map +1 -0
  216. package/lib/commonjs/features/sleepTimer.js +164 -0
  217. package/lib/commonjs/features/sleepTimer.js.map +1 -0
  218. package/lib/commonjs/index.js +22 -0
  219. package/lib/commonjs/index.js.map +1 -0
  220. package/lib/commonjs/native.js +9 -0
  221. package/lib/commonjs/native.js.map +1 -0
  222. package/lib/commonjs/native.web.js +10 -0
  223. package/lib/commonjs/native.web.js.map +1 -0
  224. package/lib/commonjs/package.json +1 -0
  225. package/lib/commonjs/specs/audio-browser.nitro.js +6 -0
  226. package/lib/commonjs/specs/audio-browser.nitro.js.map +1 -0
  227. package/lib/commonjs/types/browser-native.js +6 -0
  228. package/lib/commonjs/types/browser-native.js.map +1 -0
  229. package/lib/commonjs/types/browser-nodes.js +6 -0
  230. package/lib/commonjs/types/browser-nodes.js.map +1 -0
  231. package/lib/commonjs/types/browser.js +6 -0
  232. package/lib/commonjs/types/browser.js.map +1 -0
  233. package/lib/commonjs/types/index.js +28 -0
  234. package/lib/commonjs/types/index.js.map +1 -0
  235. package/lib/commonjs/types/player.js +2 -0
  236. package/lib/commonjs/types/player.js.map +1 -0
  237. package/lib/commonjs/utils/LazyNativeEmitter.js +58 -0
  238. package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -0
  239. package/lib/commonjs/utils/NativeUpdatedValue.js +59 -0
  240. package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -0
  241. package/lib/commonjs/utils/resolveAssetSource.js +11 -0
  242. package/lib/commonjs/utils/resolveAssetSource.js.map +1 -0
  243. package/lib/commonjs/utils/useDebug.js +221 -0
  244. package/lib/commonjs/utils/useDebug.js.map +1 -0
  245. package/lib/commonjs/utils/useNativeUpdatedValue.js +44 -0
  246. package/lib/commonjs/utils/useNativeUpdatedValue.js.map +1 -0
  247. package/lib/commonjs/utils/validation.js +23 -0
  248. package/lib/commonjs/utils/validation.js.map +1 -0
  249. package/lib/commonjs/web/NativeAudioBrowser.js +731 -0
  250. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -0
  251. package/lib/commonjs/web/SimpleRouter.js +146 -0
  252. package/lib/commonjs/web/SimpleRouter.js.map +1 -0
  253. package/lib/commonjs/web/SimpleRouter.test.js +174 -0
  254. package/lib/commonjs/web/SimpleRouter.test.js.map +1 -0
  255. package/lib/commonjs/web/TrackPlayer/Event.js +19 -0
  256. package/lib/commonjs/web/TrackPlayer/Event.js.map +1 -0
  257. package/lib/commonjs/web/TrackPlayer/Player.js +301 -0
  258. package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -0
  259. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +293 -0
  260. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  261. package/lib/commonjs/web/TrackPlayer/RepeatMode.js +12 -0
  262. package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -0
  263. package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js +13 -0
  264. package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
  265. package/lib/commonjs/web/TrackPlayer/SleepTimer.js +75 -0
  266. package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -0
  267. package/lib/commonjs/web/TrackPlayer/State.js +18 -0
  268. package/lib/commonjs/web/TrackPlayer/State.js.map +1 -0
  269. package/lib/commonjs/web/TrackPlayer/index.js +52 -0
  270. package/lib/commonjs/web/TrackPlayer/index.js.map +1 -0
  271. package/lib/commonjs/web/browser/BrowserManager.js +587 -0
  272. package/lib/commonjs/web/browser/BrowserManager.js.map +1 -0
  273. package/lib/commonjs/web/browser/FavoriteManager.js +80 -0
  274. package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -0
  275. package/lib/commonjs/web/browser/NavigationErrorManager.js +106 -0
  276. package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -0
  277. package/lib/commonjs/web/browser/SearchManager.js +80 -0
  278. package/lib/commonjs/web/browser/SearchManager.js.map +1 -0
  279. package/lib/commonjs/web/http/HttpClient.js +94 -0
  280. package/lib/commonjs/web/http/HttpClient.js.map +1 -0
  281. package/lib/commonjs/web/http/RequestConfigBuilder.js +294 -0
  282. package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -0
  283. package/lib/commonjs/web/player/NowPlayingManager.js +79 -0
  284. package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -0
  285. package/lib/commonjs/web/player/OptionsManager.js +88 -0
  286. package/lib/commonjs/web/player/OptionsManager.js.map +1 -0
  287. package/lib/commonjs/web/util/BrowserPathHelper.js +138 -0
  288. package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -0
  289. package/lib/commonjs/web/util/shuffle.js +21 -0
  290. package/lib/commonjs/web/util/shuffle.js.map +1 -0
  291. package/lib/module/AudioBrowser.js +7 -0
  292. package/lib/module/AudioBrowser.js.map +1 -0
  293. package/lib/module/features/battery.js +144 -0
  294. package/lib/module/features/battery.js.map +1 -0
  295. package/lib/module/features/browser.js +258 -0
  296. package/lib/module/features/browser.js.map +1 -0
  297. package/lib/module/features/equalizer.js +60 -0
  298. package/lib/module/features/equalizer.js.map +1 -0
  299. package/lib/module/features/errors.js +156 -0
  300. package/lib/module/features/errors.js.map +1 -0
  301. package/lib/module/features/favorites.js +95 -0
  302. package/lib/module/features/favorites.js.map +1 -0
  303. package/lib/module/features/index.js +26 -0
  304. package/lib/module/features/index.js.map +1 -0
  305. package/lib/module/features/metadata.js +51 -0
  306. package/lib/module/features/metadata.js.map +1 -0
  307. package/lib/module/features/network.js +35 -0
  308. package/lib/module/features/network.js.map +1 -0
  309. package/lib/module/features/nowPlaying.js +55 -0
  310. package/lib/module/features/nowPlaying.js.map +1 -0
  311. package/lib/module/features/output.js +47 -0
  312. package/lib/module/features/output.js.map +1 -0
  313. package/lib/module/features/playback/controls.js +69 -0
  314. package/lib/module/features/playback/controls.js.map +1 -0
  315. package/lib/module/features/playback/index.js +10 -0
  316. package/lib/module/features/playback/index.js.map +1 -0
  317. package/lib/module/features/playback/playWhenReady.js +49 -0
  318. package/lib/module/features/playback/playWhenReady.js.map +1 -0
  319. package/lib/module/features/playback/playing.js +36 -0
  320. package/lib/module/features/playback/playing.js.map +1 -0
  321. package/lib/module/features/playback/progress.js +98 -0
  322. package/lib/module/features/playback/progress.js.map +1 -0
  323. package/lib/module/features/playback/rate.js +25 -0
  324. package/lib/module/features/playback/rate.js.map +1 -0
  325. package/lib/module/features/playback/state.js +57 -0
  326. package/lib/module/features/playback/state.js.map +1 -0
  327. package/lib/module/features/playback/volume.js +60 -0
  328. package/lib/module/features/playback/volume.js.map +1 -0
  329. package/lib/module/features/player/index.js +5 -0
  330. package/lib/module/features/player/index.js.map +1 -0
  331. package/lib/module/features/player/options.js +176 -0
  332. package/lib/module/features/player/options.js.map +1 -0
  333. package/lib/module/features/player/setup.js +140 -0
  334. package/lib/module/features/player/setup.js.map +1 -0
  335. package/lib/module/features/queue/activeTrack.js +46 -0
  336. package/lib/module/features/queue/activeTrack.js.map +1 -0
  337. package/lib/module/features/queue/index.js +7 -0
  338. package/lib/module/features/queue/index.js.map +1 -0
  339. package/lib/module/features/queue/queue.js +162 -0
  340. package/lib/module/features/queue/queue.js.map +1 -0
  341. package/lib/module/features/queue/repeatMode.js +52 -0
  342. package/lib/module/features/queue/repeatMode.js.map +1 -0
  343. package/lib/module/features/queue/shuffle.js +50 -0
  344. package/lib/module/features/queue/shuffle.js.map +1 -0
  345. package/lib/module/features/rating.js +2 -0
  346. package/lib/module/features/rating.js.map +1 -0
  347. package/lib/module/features/remoteControls.js +275 -0
  348. package/lib/module/features/remoteControls.js.map +1 -0
  349. package/lib/module/features/sleepTimer.js +155 -0
  350. package/lib/module/features/sleepTimer.js.map +1 -0
  351. package/lib/module/index.js +6 -0
  352. package/lib/module/index.js.map +1 -0
  353. package/lib/module/native.js +5 -0
  354. package/lib/module/native.js.map +1 -0
  355. package/lib/module/native.web.js +7 -0
  356. package/lib/module/native.web.js.map +1 -0
  357. package/lib/module/package.json +1 -0
  358. package/lib/module/specs/audio-browser.nitro.js +4 -0
  359. package/lib/module/specs/audio-browser.nitro.js.map +1 -0
  360. package/lib/module/types/browser-native.js +4 -0
  361. package/lib/module/types/browser-native.js.map +1 -0
  362. package/lib/module/types/browser-nodes.js +4 -0
  363. package/lib/module/types/browser-nodes.js.map +1 -0
  364. package/lib/module/types/browser.js +4 -0
  365. package/lib/module/types/browser.js.map +1 -0
  366. package/lib/module/types/index.js +5 -0
  367. package/lib/module/types/index.js.map +1 -0
  368. package/lib/module/types/player.js +2 -0
  369. package/lib/module/types/player.js.map +1 -0
  370. package/lib/module/utils/LazyNativeEmitter.js +53 -0
  371. package/lib/module/utils/LazyNativeEmitter.js.map +1 -0
  372. package/lib/module/utils/NativeUpdatedValue.js +54 -0
  373. package/lib/module/utils/NativeUpdatedValue.js.map +1 -0
  374. package/lib/module/utils/resolveAssetSource.js +7 -0
  375. package/lib/module/utils/resolveAssetSource.js.map +1 -0
  376. package/lib/module/utils/useDebug.js +218 -0
  377. package/lib/module/utils/useDebug.js.map +1 -0
  378. package/lib/module/utils/useNativeUpdatedValue.js +40 -0
  379. package/lib/module/utils/useNativeUpdatedValue.js.map +1 -0
  380. package/lib/module/utils/validation.js +18 -0
  381. package/lib/module/utils/validation.js.map +1 -0
  382. package/lib/module/web/NativeAudioBrowser.js +727 -0
  383. package/lib/module/web/NativeAudioBrowser.js.map +1 -0
  384. package/lib/module/web/SimpleRouter.js +141 -0
  385. package/lib/module/web/SimpleRouter.js.map +1 -0
  386. package/lib/module/web/SimpleRouter.test.js +174 -0
  387. package/lib/module/web/SimpleRouter.test.js.map +1 -0
  388. package/lib/module/web/TrackPlayer/Event.js +15 -0
  389. package/lib/module/web/TrackPlayer/Event.js.map +1 -0
  390. package/lib/module/web/TrackPlayer/Player.js +296 -0
  391. package/lib/module/web/TrackPlayer/Player.js.map +1 -0
  392. package/lib/module/web/TrackPlayer/PlaylistPlayer.js +288 -0
  393. package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  394. package/lib/module/web/TrackPlayer/RepeatMode.js +8 -0
  395. package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -0
  396. package/lib/module/web/TrackPlayer/SetupNotCalledError.js +8 -0
  397. package/lib/module/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
  398. package/lib/module/web/TrackPlayer/SleepTimer.js +70 -0
  399. package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -0
  400. package/lib/module/web/TrackPlayer/State.js +14 -0
  401. package/lib/module/web/TrackPlayer/State.js.map +1 -0
  402. package/lib/module/web/TrackPlayer/index.js +7 -0
  403. package/lib/module/web/TrackPlayer/index.js.map +1 -0
  404. package/lib/module/web/browser/BrowserManager.js +583 -0
  405. package/lib/module/web/browser/BrowserManager.js.map +1 -0
  406. package/lib/module/web/browser/FavoriteManager.js +75 -0
  407. package/lib/module/web/browser/FavoriteManager.js.map +1 -0
  408. package/lib/module/web/browser/NavigationErrorManager.js +101 -0
  409. package/lib/module/web/browser/NavigationErrorManager.js.map +1 -0
  410. package/lib/module/web/browser/SearchManager.js +76 -0
  411. package/lib/module/web/browser/SearchManager.js.map +1 -0
  412. package/lib/module/web/http/HttpClient.js +89 -0
  413. package/lib/module/web/http/HttpClient.js.map +1 -0
  414. package/lib/module/web/http/RequestConfigBuilder.js +291 -0
  415. package/lib/module/web/http/RequestConfigBuilder.js.map +1 -0
  416. package/lib/module/web/player/NowPlayingManager.js +74 -0
  417. package/lib/module/web/player/NowPlayingManager.js.map +1 -0
  418. package/lib/module/web/player/OptionsManager.js +83 -0
  419. package/lib/module/web/player/OptionsManager.js.map +1 -0
  420. package/lib/module/web/util/BrowserPathHelper.js +134 -0
  421. package/lib/module/web/util/BrowserPathHelper.js.map +1 -0
  422. package/lib/module/web/util/shuffle.js +17 -0
  423. package/lib/module/web/util/shuffle.js.map +1 -0
  424. package/lib/typescript/src/AudioBrowser.d.ts +5 -0
  425. package/lib/typescript/src/AudioBrowser.d.ts.map +1 -0
  426. package/lib/typescript/src/features/battery.d.ts +112 -0
  427. package/lib/typescript/src/features/battery.d.ts.map +1 -0
  428. package/lib/typescript/src/features/browser.d.ts +68 -0
  429. package/lib/typescript/src/features/browser.d.ts.map +1 -0
  430. package/lib/typescript/src/features/equalizer.d.ts +35 -0
  431. package/lib/typescript/src/features/equalizer.d.ts.map +1 -0
  432. package/lib/typescript/src/features/errors.d.ts +136 -0
  433. package/lib/typescript/src/features/errors.d.ts.map +1 -0
  434. package/lib/typescript/src/features/favorites.d.ts +84 -0
  435. package/lib/typescript/src/features/favorites.d.ts.map +1 -0
  436. package/lib/typescript/src/features/index.d.ts +23 -0
  437. package/lib/typescript/src/features/index.d.ts.map +1 -0
  438. package/lib/typescript/src/features/metadata.d.ts +103 -0
  439. package/lib/typescript/src/features/metadata.d.ts.map +1 -0
  440. package/lib/typescript/src/features/network.d.ts +18 -0
  441. package/lib/typescript/src/features/network.d.ts.map +1 -0
  442. package/lib/typescript/src/features/nowPlaying.d.ts +36 -0
  443. package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -0
  444. package/lib/typescript/src/features/output.d.ts +28 -0
  445. package/lib/typescript/src/features/output.d.ts.map +1 -0
  446. package/lib/typescript/src/features/playback/controls.d.ts +40 -0
  447. package/lib/typescript/src/features/playback/controls.d.ts.map +1 -0
  448. package/lib/typescript/src/features/playback/index.d.ts +8 -0
  449. package/lib/typescript/src/features/playback/index.d.ts.map +1 -0
  450. package/lib/typescript/src/features/playback/playWhenReady.d.ts +30 -0
  451. package/lib/typescript/src/features/playback/playWhenReady.d.ts.map +1 -0
  452. package/lib/typescript/src/features/playback/playing.d.ts +21 -0
  453. package/lib/typescript/src/features/playback/playing.d.ts.map +1 -0
  454. package/lib/typescript/src/features/playback/progress.d.ts +51 -0
  455. package/lib/typescript/src/features/playback/progress.d.ts.map +1 -0
  456. package/lib/typescript/src/features/playback/rate.d.ts +12 -0
  457. package/lib/typescript/src/features/playback/rate.d.ts.map +1 -0
  458. package/lib/typescript/src/features/playback/state.d.ts +43 -0
  459. package/lib/typescript/src/features/playback/state.d.ts.map +1 -0
  460. package/lib/typescript/src/features/playback/volume.d.ts +32 -0
  461. package/lib/typescript/src/features/playback/volume.d.ts.map +1 -0
  462. package/lib/typescript/src/features/player/index.d.ts +3 -0
  463. package/lib/typescript/src/features/player/index.d.ts.map +1 -0
  464. package/lib/typescript/src/features/player/options.d.ts +413 -0
  465. package/lib/typescript/src/features/player/options.d.ts.map +1 -0
  466. package/lib/typescript/src/features/player/setup.d.ts +471 -0
  467. package/lib/typescript/src/features/player/setup.d.ts.map +1 -0
  468. package/lib/typescript/src/features/queue/activeTrack.d.ts +38 -0
  469. package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -0
  470. package/lib/typescript/src/features/queue/index.d.ts +5 -0
  471. package/lib/typescript/src/features/queue/index.d.ts.map +1 -0
  472. package/lib/typescript/src/features/queue/queue.d.ts +111 -0
  473. package/lib/typescript/src/features/queue/queue.d.ts.map +1 -0
  474. package/lib/typescript/src/features/queue/repeatMode.d.ts +34 -0
  475. package/lib/typescript/src/features/queue/repeatMode.d.ts.map +1 -0
  476. package/lib/typescript/src/features/queue/shuffle.d.ts +27 -0
  477. package/lib/typescript/src/features/queue/shuffle.d.ts.map +1 -0
  478. package/lib/typescript/src/features/rating.d.ts +14 -0
  479. package/lib/typescript/src/features/rating.d.ts.map +1 -0
  480. package/lib/typescript/src/features/remoteControls.d.ts +164 -0
  481. package/lib/typescript/src/features/remoteControls.d.ts.map +1 -0
  482. package/lib/typescript/src/features/sleepTimer.d.ts +80 -0
  483. package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -0
  484. package/lib/typescript/src/index.d.ts +4 -0
  485. package/lib/typescript/src/index.d.ts.map +1 -0
  486. package/lib/typescript/src/native.d.ts +3 -0
  487. package/lib/typescript/src/native.d.ts.map +1 -0
  488. package/lib/typescript/src/native.web.d.ts +3 -0
  489. package/lib/typescript/src/native.web.d.ts.map +1 -0
  490. package/lib/typescript/src/specs/audio-browser.nitro.d.ts +242 -0
  491. package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -0
  492. package/lib/typescript/src/types/browser-native.d.ts +40 -0
  493. package/lib/typescript/src/types/browser-native.d.ts.map +1 -0
  494. package/lib/typescript/src/types/browser-nodes.d.ts +198 -0
  495. package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -0
  496. package/lib/typescript/src/types/browser.d.ts +742 -0
  497. package/lib/typescript/src/types/browser.d.ts.map +1 -0
  498. package/lib/typescript/src/types/index.d.ts +3 -0
  499. package/lib/typescript/src/types/index.d.ts.map +1 -0
  500. package/lib/typescript/src/types/player.d.ts +64 -0
  501. package/lib/typescript/src/types/player.d.ts.map +1 -0
  502. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +35 -0
  503. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -0
  504. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +39 -0
  505. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -0
  506. package/lib/typescript/src/utils/resolveAssetSource.d.ts +4 -0
  507. package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -0
  508. package/lib/typescript/src/utils/useDebug.d.ts +65 -0
  509. package/lib/typescript/src/utils/useDebug.d.ts.map +1 -0
  510. package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts +14 -0
  511. package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts.map +1 -0
  512. package/lib/typescript/src/utils/validation.d.ts +3 -0
  513. package/lib/typescript/src/utils/validation.d.ts.map +1 -0
  514. package/lib/typescript/src/web/NativeAudioBrowser.d.ts +188 -0
  515. package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -0
  516. package/lib/typescript/src/web/SimpleRouter.d.ts +40 -0
  517. package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -0
  518. package/lib/typescript/src/web/SimpleRouter.test.d.ts +2 -0
  519. package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +1 -0
  520. package/lib/typescript/src/web/TrackPlayer/Event.d.ts +11 -0
  521. package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +1 -0
  522. package/lib/typescript/src/web/TrackPlayer/Player.d.ts +59 -0
  523. package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +1 -0
  524. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +39 -0
  525. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +1 -0
  526. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +6 -0
  527. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +1 -0
  528. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +4 -0
  529. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +1 -0
  530. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +34 -0
  531. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +1 -0
  532. package/lib/typescript/src/web/TrackPlayer/State.d.ts +13 -0
  533. package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +1 -0
  534. package/lib/typescript/src/web/TrackPlayer/index.d.ts +5 -0
  535. package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +1 -0
  536. package/lib/typescript/src/web/browser/BrowserManager.d.ts +154 -0
  537. package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +1 -0
  538. package/lib/typescript/src/web/browser/FavoriteManager.d.ts +42 -0
  539. package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +1 -0
  540. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +40 -0
  541. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +1 -0
  542. package/lib/typescript/src/web/browser/SearchManager.d.ts +22 -0
  543. package/lib/typescript/src/web/browser/SearchManager.d.ts.map +1 -0
  544. package/lib/typescript/src/web/http/HttpClient.d.ts +25 -0
  545. package/lib/typescript/src/web/http/HttpClient.d.ts.map +1 -0
  546. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +98 -0
  547. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +1 -0
  548. package/lib/typescript/src/web/player/NowPlayingManager.d.ts +34 -0
  549. package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +1 -0
  550. package/lib/typescript/src/web/player/OptionsManager.d.ts +32 -0
  551. package/lib/typescript/src/web/player/OptionsManager.d.ts.map +1 -0
  552. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +69 -0
  553. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +1 -0
  554. package/lib/typescript/src/web/util/shuffle.d.ts +8 -0
  555. package/lib/typescript/src/web/util/shuffle.d.ts.map +1 -0
  556. package/nitro.json +24 -0
  557. package/nitrogen/generated/.gitattributes +1 -0
  558. package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +88 -0
  559. package/nitrogen/generated/android/AudioBrowser+autolinking.gradle +27 -0
  560. package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +136 -0
  561. package/nitrogen/generated/android/AudioBrowserOnLoad.hpp +34 -0
  562. package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +67 -0
  563. package/nitrogen/generated/android/c++/JAndroidAudioOffloadSettings.hpp +61 -0
  564. package/nitrogen/generated/android/c++/JAndroidOptions.hpp +86 -0
  565. package/nitrogen/generated/android/c++/JAndroidPlayerWakeMode.hpp +61 -0
  566. package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
  567. package/nitrogen/generated/android/c++/JAppKilledPlaybackBehavior.hpp +61 -0
  568. package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +166 -0
  569. package/nitrogen/generated/android/c++/JBatteryOptimizationStatus.hpp +61 -0
  570. package/nitrogen/generated/android/c++/JBatteryOptimizationStatusChangedEvent.hpp +58 -0
  571. package/nitrogen/generated/android/c++/JBatteryWarningPendingChangedEvent.hpp +57 -0
  572. package/nitrogen/generated/android/c++/JBrowseError.hpp +57 -0
  573. package/nitrogen/generated/android/c++/JBrowseResult.cpp +26 -0
  574. package/nitrogen/generated/android/c++/JBrowseResult.hpp +87 -0
  575. package/nitrogen/generated/android/c++/JBrowserSourceCallbackParam.hpp +76 -0
  576. package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +64 -0
  577. package/nitrogen/generated/android/c++/JCarPlaySiriListButtonPosition.hpp +58 -0
  578. package/nitrogen/generated/android/c++/JChapterMetadata.hpp +70 -0
  579. package/nitrogen/generated/android/c++/JEqualizerSettings.hpp +125 -0
  580. package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +74 -0
  581. package/nitrogen/generated/android/c++/JFormatNavigationErrorParams.hpp +72 -0
  582. package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +61 -0
  583. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.hpp +111 -0
  584. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.hpp +134 -0
  585. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +143 -0
  586. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +139 -0
  587. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +147 -0
  588. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +159 -0
  589. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +139 -0
  590. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  591. package/nitrogen/generated/android/c++/JFunc_void_BatteryOptimizationStatusChangedEvent.hpp +79 -0
  592. package/nitrogen/generated/android/c++/JFunc_void_BatteryWarningPendingChangedEvent.hpp +77 -0
  593. package/nitrogen/generated/android/c++/JFunc_void_EqualizerSettings.hpp +80 -0
  594. package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +91 -0
  595. package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
  596. package/nitrogen/generated/android/c++/JFunc_void_NavigationErrorEvent.hpp +83 -0
  597. package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +89 -0
  598. package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +98 -0
  599. package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +83 -0
  600. package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +91 -0
  601. package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +81 -0
  602. package/nitrogen/generated/android/c++/JFunc_void_PlaybackPlayWhenReadyChangedEvent.hpp +77 -0
  603. package/nitrogen/generated/android/c++/JFunc_void_PlaybackProgressUpdatedEvent.hpp +77 -0
  604. package/nitrogen/generated/android/c++/JFunc_void_PlaybackQueueEndedEvent.hpp +77 -0
  605. package/nitrogen/generated/android/c++/JFunc_void_PlayingState.hpp +77 -0
  606. package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpBackwardEvent.hpp +77 -0
  607. package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpForwardEvent.hpp +77 -0
  608. package/nitrogen/generated/android/c++/JFunc_void_RemotePlayIdEvent.hpp +79 -0
  609. package/nitrogen/generated/android/c++/JFunc_void_RemotePlaySearchEvent.hpp +78 -0
  610. package/nitrogen/generated/android/c++/JFunc_void_RemoteSeekEvent.hpp +77 -0
  611. package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
  612. package/nitrogen/generated/android/c++/JFunc_void_RemoteSkipEvent.hpp +77 -0
  613. package/nitrogen/generated/android/c++/JFunc_void_RepeatModeChangedEvent.hpp +79 -0
  614. package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +79 -0
  615. package/nitrogen/generated/android/c++/JFunc_void_TrackMetadata.hpp +79 -0
  616. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
  617. package/nitrogen/generated/android/c++/JFunc_void_double.hpp +75 -0
  618. package/nitrogen/generated/android/c++/JFunc_void_std__optional_FormattedNavigationError_.hpp +79 -0
  619. package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +93 -0
  620. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.hpp +84 -0
  621. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  622. package/nitrogen/generated/android/c++/JFunc_void_std__vector_ChapterMetadata_.hpp +98 -0
  623. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +107 -0
  624. package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
  625. package/nitrogen/generated/android/c++/JHttpMethod.hpp +73 -0
  626. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +1835 -0
  627. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +248 -0
  628. package/nitrogen/generated/android/c++/JIOSCategory.hpp +70 -0
  629. package/nitrogen/generated/android/c++/JIOSCategoryMode.hpp +79 -0
  630. package/nitrogen/generated/android/c++/JIOSCategoryOptions.hpp +73 -0
  631. package/nitrogen/generated/android/c++/JIOSCategoryPolicy.hpp +61 -0
  632. package/nitrogen/generated/android/c++/JImageContext.hpp +61 -0
  633. package/nitrogen/generated/android/c++/JImageQueryParams.hpp +62 -0
  634. package/nitrogen/generated/android/c++/JImageRowItem.hpp +75 -0
  635. package/nitrogen/generated/android/c++/JImageSource.hpp +86 -0
  636. package/nitrogen/generated/android/c++/JIosOutput.hpp +67 -0
  637. package/nitrogen/generated/android/c++/JIosOutputType.hpp +85 -0
  638. package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +156 -0
  639. package/nitrogen/generated/android/c++/JMediaTransformParams.hpp +69 -0
  640. package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +216 -0
  641. package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +151 -0
  642. package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +105 -0
  643. package/nitrogen/generated/android/c++/JNavigationError.hpp +72 -0
  644. package/nitrogen/generated/android/c++/JNavigationErrorEvent.hpp +62 -0
  645. package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +67 -0
  646. package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +86 -0
  647. package/nitrogen/generated/android/c++/JNotificationButton.hpp +67 -0
  648. package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
  649. package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +104 -0
  650. package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +62 -0
  651. package/nitrogen/generated/android/c++/JOptions.hpp +97 -0
  652. package/nitrogen/generated/android/c++/JPartialAndroidSetupPlayerOptions.hpp +104 -0
  653. package/nitrogen/generated/android/c++/JPartialIOSSetupPlayerOptions.hpp +100 -0
  654. package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +96 -0
  655. package/nitrogen/generated/android/c++/JPercentageRating.hpp +57 -0
  656. package/nitrogen/generated/android/c++/JPlayback.hpp +66 -0
  657. package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +86 -0
  658. package/nitrogen/generated/android/c++/JPlaybackError.hpp +61 -0
  659. package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +60 -0
  660. package/nitrogen/generated/android/c++/JPlaybackPlayWhenReadyChangedEvent.hpp +57 -0
  661. package/nitrogen/generated/android/c++/JPlaybackProgressUpdatedEvent.hpp +69 -0
  662. package/nitrogen/generated/android/c++/JPlaybackQueueEndedEvent.hpp +61 -0
  663. package/nitrogen/generated/android/c++/JPlaybackState.hpp +79 -0
  664. package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +101 -0
  665. package/nitrogen/generated/android/c++/JPlayingState.hpp +61 -0
  666. package/nitrogen/generated/android/c++/JProgress.hpp +65 -0
  667. package/nitrogen/generated/android/c++/JRatingType.hpp +73 -0
  668. package/nitrogen/generated/android/c++/JRemoteJumpBackwardEvent.hpp +57 -0
  669. package/nitrogen/generated/android/c++/JRemoteJumpForwardEvent.hpp +57 -0
  670. package/nitrogen/generated/android/c++/JRemotePlayIdEvent.hpp +62 -0
  671. package/nitrogen/generated/android/c++/JRemotePlaySearchEvent.hpp +57 -0
  672. package/nitrogen/generated/android/c++/JRemoteSeekEvent.hpp +57 -0
  673. package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
  674. package/nitrogen/generated/android/c++/JRemoteSkipEvent.hpp +57 -0
  675. package/nitrogen/generated/android/c++/JRepeatMode.hpp +61 -0
  676. package/nitrogen/generated/android/c++/JRepeatModeChangedEvent.hpp +58 -0
  677. package/nitrogen/generated/android/c++/JRequestConfig.hpp +115 -0
  678. package/nitrogen/generated/android/c++/JResolvedTrack.hpp +184 -0
  679. package/nitrogen/generated/android/c++/JRetryConfig.hpp +61 -0
  680. package/nitrogen/generated/android/c++/JSearchMode.hpp +70 -0
  681. package/nitrogen/generated/android/c++/JSearchParams.hpp +84 -0
  682. package/nitrogen/generated/android/c++/JSleepTimer.cpp +30 -0
  683. package/nitrogen/generated/android/c++/JSleepTimer.hpp +88 -0
  684. package/nitrogen/generated/android/c++/JSleepTimerEndOfTrack.hpp +57 -0
  685. package/nitrogen/generated/android/c++/JSleepTimerTime.hpp +57 -0
  686. package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
  687. package/nitrogen/generated/android/c++/JThumbsRating.hpp +57 -0
  688. package/nitrogen/generated/android/c++/JTimedMetadata.hpp +74 -0
  689. package/nitrogen/generated/android/c++/JTrack.hpp +154 -0
  690. package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +96 -0
  691. package/nitrogen/generated/android/c++/JTrackMetadata.hpp +118 -0
  692. package/nitrogen/generated/android/c++/JTrackStyle.hpp +58 -0
  693. package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +134 -0
  694. package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
  695. package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.cpp +26 -0
  696. package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.hpp +70 -0
  697. package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.cpp +26 -0
  698. package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.hpp +70 -0
  699. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +34 -0
  700. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +105 -0
  701. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  702. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  703. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +26 -0
  704. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +75 -0
  705. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +26 -0
  706. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioOffloadSettings.kt +41 -0
  707. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +50 -0
  708. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidPlayerWakeMode.kt +24 -0
  709. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
  710. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AppKilledPlaybackBehavior.kt +24 -0
  711. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +72 -0
  712. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AudioBrowserOnLoad.kt +35 -0
  713. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatus.kt +24 -0
  714. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatusChangedEvent.kt +38 -0
  715. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryWarningPendingChangedEvent.kt +38 -0
  716. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseError.kt +38 -0
  717. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseResult.kt +53 -0
  718. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowserSourceCallbackParam.kt +41 -0
  719. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +25 -0
  720. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlaySiriListButtonPosition.kt +23 -0
  721. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ChapterMetadata.kt +47 -0
  722. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/EqualizerSettings.kt +59 -0
  723. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FavoriteChangedEvent.kt +41 -0
  724. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNavigationErrorParams.kt +44 -0
  725. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +41 -0
  726. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.kt +80 -0
  727. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.kt +80 -0
  728. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.kt +80 -0
  729. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.kt +80 -0
  730. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt +80 -0
  731. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.kt +80 -0
  732. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.kt +80 -0
  733. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void.kt +80 -0
  734. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryOptimizationStatusChangedEvent.kt +80 -0
  735. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryWarningPendingChangedEvent.kt +80 -0
  736. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_EqualizerSettings.kt +80 -0
  737. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_FavoriteChangedEvent.kt +80 -0
  738. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_IosOutput.kt +80 -0
  739. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NavigationErrorEvent.kt +80 -0
  740. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NowPlayingMetadata.kt +80 -0
  741. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Options.kt +80 -0
  742. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Playback.kt +80 -0
  743. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackActiveTrackChangedEvent.kt +80 -0
  744. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackErrorEvent.kt +80 -0
  745. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackPlayWhenReadyChangedEvent.kt +80 -0
  746. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackProgressUpdatedEvent.kt +80 -0
  747. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackQueueEndedEvent.kt +80 -0
  748. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlayingState.kt +80 -0
  749. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpBackwardEvent.kt +80 -0
  750. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpForwardEvent.kt +80 -0
  751. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlayIdEvent.kt +80 -0
  752. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlaySearchEvent.kt +80 -0
  753. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSeekEvent.kt +80 -0
  754. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSetRatingEvent.kt +80 -0
  755. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSkipEvent.kt +80 -0
  756. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RepeatModeChangedEvent.kt +80 -0
  757. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TimedMetadata.kt +80 -0
  758. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TrackMetadata.kt +80 -0
  759. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +80 -0
  760. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_double.kt +80 -0
  761. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_FormattedNavigationError_.kt +80 -0
  762. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_ResolvedTrack_.kt +80 -0
  763. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.kt +80 -0
  764. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__string.kt +80 -0
  765. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_ChapterMetadata_.kt +80 -0
  766. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_Track_.kt +80 -0
  767. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HeartRating.kt +38 -0
  768. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HttpMethod.kt +28 -0
  769. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +1134 -0
  770. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategory.kt +27 -0
  771. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryMode.kt +30 -0
  772. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryOptions.kt +28 -0
  773. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryPolicy.kt +24 -0
  774. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageContext.kt +41 -0
  775. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageQueryParams.kt +41 -0
  776. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +47 -0
  777. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageSource.kt +47 -0
  778. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutput.kt +44 -0
  779. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +32 -0
  780. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +69 -0
  781. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaTransformParams.kt +41 -0
  782. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +72 -0
  783. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +63 -0
  784. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +53 -0
  785. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationError.kt +47 -0
  786. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorEvent.kt +38 -0
  787. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +26 -0
  788. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +50 -0
  789. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +26 -0
  790. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
  791. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +65 -0
  792. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +41 -0
  793. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +53 -0
  794. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialAndroidSetupPlayerOptions.kt +65 -0
  795. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialIOSSetupPlayerOptions.kt +50 -0
  796. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
  797. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PercentageRating.kt +38 -0
  798. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Playback.kt +41 -0
  799. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackActiveTrackChangedEvent.kt +50 -0
  800. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +41 -0
  801. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorEvent.kt +38 -0
  802. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackPlayWhenReadyChangedEvent.kt +38 -0
  803. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackProgressUpdatedEvent.kt +47 -0
  804. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackQueueEndedEvent.kt +41 -0
  805. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +30 -0
  806. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +71 -0
  807. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayingState.kt +41 -0
  808. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Progress.kt +44 -0
  809. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RatingType.kt +28 -0
  810. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpBackwardEvent.kt +38 -0
  811. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpForwardEvent.kt +38 -0
  812. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlayIdEvent.kt +41 -0
  813. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlaySearchEvent.kt +38 -0
  814. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSeekEvent.kt +38 -0
  815. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSetRatingEvent.kt +38 -0
  816. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSkipEvent.kt +38 -0
  817. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatMode.kt +24 -0
  818. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatModeChangedEvent.kt +38 -0
  819. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RequestConfig.kt +59 -0
  820. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +95 -0
  821. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +41 -0
  822. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +27 -0
  823. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +56 -0
  824. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimer.kt +65 -0
  825. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerEndOfTrack.kt +38 -0
  826. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerTime.kt +38 -0
  827. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StarRating.kt +38 -0
  828. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ThumbsRating.kt +38 -0
  829. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TimedMetadata.kt +50 -0
  830. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +89 -0
  831. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackLoadEvent.kt +44 -0
  832. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackMetadata.kt +83 -0
  833. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +23 -0
  834. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +66 -0
  835. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
  836. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_AndroidAudioOffloadSettings.kt +53 -0
  837. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_RetryConfig.kt +53 -0
  838. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +77 -0
  839. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_Double.kt +53 -0
  840. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_NotificationButtonLayout.kt +53 -0
  841. package/nitrogen/generated/ios/AudioBrowser+autolinking.rb +60 -0
  842. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +424 -0
  843. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +2959 -0
  844. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +309 -0
  845. package/nitrogen/generated/ios/AudioBrowserAutolinking.mm +33 -0
  846. package/nitrogen/generated/ios/AudioBrowserAutolinking.swift +26 -0
  847. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.cpp +11 -0
  848. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +1214 -0
  849. package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +52 -0
  850. package/nitrogen/generated/ios/swift/AndroidAudioOffloadSettings.swift +60 -0
  851. package/nitrogen/generated/ios/swift/AndroidOptions.swift +81 -0
  852. package/nitrogen/generated/ios/swift/AndroidPlayerWakeMode.swift +44 -0
  853. package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +119 -0
  854. package/nitrogen/generated/ios/swift/AppKilledPlaybackBehavior.swift +44 -0
  855. package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +294 -0
  856. package/nitrogen/generated/ios/swift/BatteryOptimizationStatus.swift +44 -0
  857. package/nitrogen/generated/ios/swift/BatteryOptimizationStatusChangedEvent.swift +29 -0
  858. package/nitrogen/generated/ios/swift/BatteryWarningPendingChangedEvent.swift +29 -0
  859. package/nitrogen/generated/ios/swift/BrowseError.swift +29 -0
  860. package/nitrogen/generated/ios/swift/BrowseResult.swift +18 -0
  861. package/nitrogen/generated/ios/swift/BrowserSourceCallbackParam.swift +61 -0
  862. package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +48 -0
  863. package/nitrogen/generated/ios/swift/CarPlaySiriListButtonPosition.swift +40 -0
  864. package/nitrogen/generated/ios/swift/ChapterMetadata.swift +70 -0
  865. package/nitrogen/generated/ios/swift/EqualizerSettings.swift +95 -0
  866. package/nitrogen/generated/ios/swift/FavoriteChangedEvent.swift +34 -0
  867. package/nitrogen/generated/ios/swift/FormatNavigationErrorParams.swift +39 -0
  868. package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +34 -0
  869. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.swift +60 -0
  870. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.swift +61 -0
  871. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +76 -0
  872. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.swift +61 -0
  873. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +68 -0
  874. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.swift +67 -0
  875. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.swift +61 -0
  876. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  877. package/nitrogen/generated/ios/swift/Func_void_BatteryOptimizationStatusChangedEvent.swift +46 -0
  878. package/nitrogen/generated/ios/swift/Func_void_BatteryWarningPendingChangedEvent.swift +46 -0
  879. package/nitrogen/generated/ios/swift/Func_void_EqualizerSettings.swift +46 -0
  880. package/nitrogen/generated/ios/swift/Func_void_FavoriteChangedEvent.swift +46 -0
  881. package/nitrogen/generated/ios/swift/Func_void_IosOutput.swift +46 -0
  882. package/nitrogen/generated/ios/swift/Func_void_NavigationErrorEvent.swift +46 -0
  883. package/nitrogen/generated/ios/swift/Func_void_NowPlayingMetadata.swift +46 -0
  884. package/nitrogen/generated/ios/swift/Func_void_Options.swift +46 -0
  885. package/nitrogen/generated/ios/swift/Func_void_Playback.swift +46 -0
  886. package/nitrogen/generated/ios/swift/Func_void_PlaybackActiveTrackChangedEvent.swift +46 -0
  887. package/nitrogen/generated/ios/swift/Func_void_PlaybackErrorEvent.swift +46 -0
  888. package/nitrogen/generated/ios/swift/Func_void_PlaybackPlayWhenReadyChangedEvent.swift +46 -0
  889. package/nitrogen/generated/ios/swift/Func_void_PlaybackProgressUpdatedEvent.swift +46 -0
  890. package/nitrogen/generated/ios/swift/Func_void_PlaybackQueueEndedEvent.swift +46 -0
  891. package/nitrogen/generated/ios/swift/Func_void_PlayingState.swift +46 -0
  892. package/nitrogen/generated/ios/swift/Func_void_RemoteJumpBackwardEvent.swift +46 -0
  893. package/nitrogen/generated/ios/swift/Func_void_RemoteJumpForwardEvent.swift +46 -0
  894. package/nitrogen/generated/ios/swift/Func_void_RemotePlayIdEvent.swift +46 -0
  895. package/nitrogen/generated/ios/swift/Func_void_RemotePlaySearchEvent.swift +46 -0
  896. package/nitrogen/generated/ios/swift/Func_void_RemoteSeekEvent.swift +46 -0
  897. package/nitrogen/generated/ios/swift/Func_void_RemoteSetRatingEvent.swift +46 -0
  898. package/nitrogen/generated/ios/swift/Func_void_RemoteSkipEvent.swift +46 -0
  899. package/nitrogen/generated/ios/swift/Func_void_RepeatModeChangedEvent.swift +46 -0
  900. package/nitrogen/generated/ios/swift/Func_void_RequestConfig.swift +46 -0
  901. package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +46 -0
  902. package/nitrogen/generated/ios/swift/Func_void_TrackMetadata.swift +46 -0
  903. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  904. package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
  905. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  906. package/nitrogen/generated/ios/swift/Func_void_std__optional_FormattedNavigationError_.swift +46 -0
  907. package/nitrogen/generated/ios/swift/Func_void_std__optional_ResolvedTrack_.swift +46 -0
  908. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.swift +68 -0
  909. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_RequestConfig__.swift +66 -0
  910. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift +66 -0
  911. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_Track___.swift +66 -0
  912. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_void__.swift +64 -0
  913. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
  914. package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError_.swift +58 -0
  915. package/nitrogen/generated/ios/swift/Func_void_std__vector_ChapterMetadata_.swift +46 -0
  916. package/nitrogen/generated/ios/swift/Func_void_std__vector_Track_.swift +46 -0
  917. package/nitrogen/generated/ios/swift/HeartRating.swift +29 -0
  918. package/nitrogen/generated/ios/swift/HttpMethod.swift +60 -0
  919. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +180 -0
  920. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +2401 -0
  921. package/nitrogen/generated/ios/swift/IOSCategory.swift +56 -0
  922. package/nitrogen/generated/ios/swift/IOSCategoryMode.swift +68 -0
  923. package/nitrogen/generated/ios/swift/IOSCategoryOptions.swift +60 -0
  924. package/nitrogen/generated/ios/swift/IOSCategoryPolicy.swift +44 -0
  925. package/nitrogen/generated/ios/swift/ImageContext.swift +60 -0
  926. package/nitrogen/generated/ios/swift/ImageQueryParams.swift +60 -0
  927. package/nitrogen/generated/ios/swift/ImageRowItem.swift +76 -0
  928. package/nitrogen/generated/ios/swift/ImageSource.swift +90 -0
  929. package/nitrogen/generated/ios/swift/IosOutput.swift +39 -0
  930. package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
  931. package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +295 -0
  932. package/nitrogen/generated/ios/swift/MediaTransformParams.swift +40 -0
  933. package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +271 -0
  934. package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +178 -0
  935. package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +143 -0
  936. package/nitrogen/generated/ios/swift/NavigationError.swift +70 -0
  937. package/nitrogen/generated/ios/swift/NavigationErrorEvent.swift +35 -0
  938. package/nitrogen/generated/ios/swift/NavigationErrorType.swift +52 -0
  939. package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +119 -0
  940. package/nitrogen/generated/ios/swift/NotificationButton.swift +52 -0
  941. package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +92 -0
  942. package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +233 -0
  943. package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +60 -0
  944. package/nitrogen/generated/ios/swift/Options.swift +92 -0
  945. package/nitrogen/generated/ios/swift/PartialAndroidSetupPlayerOptions.swift +228 -0
  946. package/nitrogen/generated/ios/swift/PartialIOSSetupPlayerOptions.swift +99 -0
  947. package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +101 -0
  948. package/nitrogen/generated/ios/swift/PercentageRating.swift +29 -0
  949. package/nitrogen/generated/ios/swift/Playback.swift +40 -0
  950. package/nitrogen/generated/ios/swift/PlaybackActiveTrackChangedEvent.swift +87 -0
  951. package/nitrogen/generated/ios/swift/PlaybackError.swift +34 -0
  952. package/nitrogen/generated/ios/swift/PlaybackErrorEvent.swift +35 -0
  953. package/nitrogen/generated/ios/swift/PlaybackPlayWhenReadyChangedEvent.swift +29 -0
  954. package/nitrogen/generated/ios/swift/PlaybackProgressUpdatedEvent.swift +44 -0
  955. package/nitrogen/generated/ios/swift/PlaybackQueueEndedEvent.swift +34 -0
  956. package/nitrogen/generated/ios/swift/PlaybackState.swift +68 -0
  957. package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +240 -0
  958. package/nitrogen/generated/ios/swift/PlayingState.swift +34 -0
  959. package/nitrogen/generated/ios/swift/Progress.swift +39 -0
  960. package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
  961. package/nitrogen/generated/ios/swift/RemoteJumpBackwardEvent.swift +29 -0
  962. package/nitrogen/generated/ios/swift/RemoteJumpForwardEvent.swift +29 -0
  963. package/nitrogen/generated/ios/swift/RemotePlayIdEvent.swift +47 -0
  964. package/nitrogen/generated/ios/swift/RemotePlaySearchEvent.swift +29 -0
  965. package/nitrogen/generated/ios/swift/RemoteSeekEvent.swift +29 -0
  966. package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +58 -0
  967. package/nitrogen/generated/ios/swift/RemoteSkipEvent.swift +29 -0
  968. package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
  969. package/nitrogen/generated/ios/swift/RepeatModeChangedEvent.swift +29 -0
  970. package/nitrogen/generated/ios/swift/RequestConfig.swift +189 -0
  971. package/nitrogen/generated/ios/swift/ResolvedTrack.swift +342 -0
  972. package/nitrogen/generated/ios/swift/RetryConfig.swift +47 -0
  973. package/nitrogen/generated/ios/swift/SearchMode.swift +56 -0
  974. package/nitrogen/generated/ios/swift/SearchParams.swift +130 -0
  975. package/nitrogen/generated/ios/swift/SleepTimer.swift +19 -0
  976. package/nitrogen/generated/ios/swift/SleepTimerEndOfTrack.swift +29 -0
  977. package/nitrogen/generated/ios/swift/SleepTimerTime.swift +29 -0
  978. package/nitrogen/generated/ios/swift/StarRating.swift +29 -0
  979. package/nitrogen/generated/ios/swift/ThumbsRating.swift +29 -0
  980. package/nitrogen/generated/ios/swift/TimedMetadata.swift +114 -0
  981. package/nitrogen/generated/ios/swift/Track.swift +320 -0
  982. package/nitrogen/generated/ios/swift/TrackLoadEvent.swift +45 -0
  983. package/nitrogen/generated/ios/swift/TrackMetadata.swift +312 -0
  984. package/nitrogen/generated/ios/swift/TrackStyle.swift +40 -0
  985. package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +248 -0
  986. package/nitrogen/generated/ios/swift/UpdateOptions.swift +143 -0
  987. package/nitrogen/generated/ios/swift/Variant_Bool_AndroidAudioOffloadSettings.swift +18 -0
  988. package/nitrogen/generated/ios/swift/Variant_Bool_RetryConfig.swift +18 -0
  989. package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
  990. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  991. package/nitrogen/generated/ios/swift/Variant_NullType_NotificationButtonLayout.swift +18 -0
  992. package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +88 -0
  993. package/nitrogen/generated/shared/c++/AndroidAudioOffloadSettings.hpp +87 -0
  994. package/nitrogen/generated/shared/c++/AndroidOptions.hpp +109 -0
  995. package/nitrogen/generated/shared/c++/AndroidPlayerWakeMode.hpp +80 -0
  996. package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +109 -0
  997. package/nitrogen/generated/shared/c++/AppKilledPlaybackBehavior.hpp +80 -0
  998. package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +141 -0
  999. package/nitrogen/generated/shared/c++/BatteryOptimizationStatus.hpp +80 -0
  1000. package/nitrogen/generated/shared/c++/BatteryOptimizationStatusChangedEvent.hpp +84 -0
  1001. package/nitrogen/generated/shared/c++/BatteryWarningPendingChangedEvent.hpp +83 -0
  1002. package/nitrogen/generated/shared/c++/BrowseError.hpp +83 -0
  1003. package/nitrogen/generated/shared/c++/BrowserSourceCallbackParam.hpp +89 -0
  1004. package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +84 -0
  1005. package/nitrogen/generated/shared/c++/CarPlaySiriListButtonPosition.hpp +76 -0
  1006. package/nitrogen/generated/shared/c++/ChapterMetadata.hpp +96 -0
  1007. package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +113 -0
  1008. package/nitrogen/generated/shared/c++/FavoriteChangedEvent.hpp +88 -0
  1009. package/nitrogen/generated/shared/c++/FormatNavigationErrorParams.hpp +96 -0
  1010. package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +87 -0
  1011. package/nitrogen/generated/shared/c++/HeartRating.hpp +83 -0
  1012. package/nitrogen/generated/shared/c++/HttpMethod.hpp +96 -0
  1013. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +207 -0
  1014. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +375 -0
  1015. package/nitrogen/generated/shared/c++/IOSCategory.hpp +92 -0
  1016. package/nitrogen/generated/shared/c++/IOSCategoryMode.hpp +104 -0
  1017. package/nitrogen/generated/shared/c++/IOSCategoryOptions.hpp +96 -0
  1018. package/nitrogen/generated/shared/c++/IOSCategoryPolicy.hpp +80 -0
  1019. package/nitrogen/generated/shared/c++/ImageContext.hpp +87 -0
  1020. package/nitrogen/generated/shared/c++/ImageQueryParams.hpp +88 -0
  1021. package/nitrogen/generated/shared/c++/ImageRowItem.hpp +98 -0
  1022. package/nitrogen/generated/shared/c++/ImageSource.hpp +99 -0
  1023. package/nitrogen/generated/shared/c++/IosOutput.hpp +93 -0
  1024. package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
  1025. package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +131 -0
  1026. package/nitrogen/generated/shared/c++/MediaTransformParams.hpp +92 -0
  1027. package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +150 -0
  1028. package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +139 -0
  1029. package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +111 -0
  1030. package/nitrogen/generated/shared/c++/NavigationError.hpp +98 -0
  1031. package/nitrogen/generated/shared/c++/NavigationErrorEvent.hpp +85 -0
  1032. package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +88 -0
  1033. package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +109 -0
  1034. package/nitrogen/generated/shared/c++/NotificationButton.hpp +88 -0
  1035. package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +102 -0
  1036. package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +132 -0
  1037. package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +88 -0
  1038. package/nitrogen/generated/shared/c++/Options.hpp +113 -0
  1039. package/nitrogen/generated/shared/c++/PartialAndroidSetupPlayerOptions.hpp +129 -0
  1040. package/nitrogen/generated/shared/c++/PartialIOSSetupPlayerOptions.hpp +111 -0
  1041. package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +104 -0
  1042. package/nitrogen/generated/shared/c++/PercentageRating.hpp +83 -0
  1043. package/nitrogen/generated/shared/c++/Playback.hpp +92 -0
  1044. package/nitrogen/generated/shared/c++/PlaybackActiveTrackChangedEvent.hpp +101 -0
  1045. package/nitrogen/generated/shared/c++/PlaybackError.hpp +87 -0
  1046. package/nitrogen/generated/shared/c++/PlaybackErrorEvent.hpp +85 -0
  1047. package/nitrogen/generated/shared/c++/PlaybackPlayWhenReadyChangedEvent.hpp +83 -0
  1048. package/nitrogen/generated/shared/c++/PlaybackProgressUpdatedEvent.hpp +95 -0
  1049. package/nitrogen/generated/shared/c++/PlaybackQueueEndedEvent.hpp +87 -0
  1050. package/nitrogen/generated/shared/c++/PlaybackState.hpp +104 -0
  1051. package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +127 -0
  1052. package/nitrogen/generated/shared/c++/PlayingState.hpp +87 -0
  1053. package/nitrogen/generated/shared/c++/Progress.hpp +91 -0
  1054. package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
  1055. package/nitrogen/generated/shared/c++/RemoteJumpBackwardEvent.hpp +83 -0
  1056. package/nitrogen/generated/shared/c++/RemoteJumpForwardEvent.hpp +83 -0
  1057. package/nitrogen/generated/shared/c++/RemotePlayIdEvent.hpp +88 -0
  1058. package/nitrogen/generated/shared/c++/RemotePlaySearchEvent.hpp +83 -0
  1059. package/nitrogen/generated/shared/c++/RemoteSeekEvent.hpp +83 -0
  1060. package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +94 -0
  1061. package/nitrogen/generated/shared/c++/RemoteSkipEvent.hpp +83 -0
  1062. package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
  1063. package/nitrogen/generated/shared/c++/RepeatModeChangedEvent.hpp +84 -0
  1064. package/nitrogen/generated/shared/c++/RequestConfig.hpp +115 -0
  1065. package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +175 -0
  1066. package/nitrogen/generated/shared/c++/RetryConfig.hpp +87 -0
  1067. package/nitrogen/generated/shared/c++/SearchMode.hpp +92 -0
  1068. package/nitrogen/generated/shared/c++/SearchParams.hpp +110 -0
  1069. package/nitrogen/generated/shared/c++/SleepTimerEndOfTrack.hpp +83 -0
  1070. package/nitrogen/generated/shared/c++/SleepTimerTime.hpp +83 -0
  1071. package/nitrogen/generated/shared/c++/StarRating.hpp +83 -0
  1072. package/nitrogen/generated/shared/c++/ThumbsRating.hpp +83 -0
  1073. package/nitrogen/generated/shared/c++/TimedMetadata.hpp +100 -0
  1074. package/nitrogen/generated/shared/c++/Track.hpp +161 -0
  1075. package/nitrogen/generated/shared/c++/TrackLoadEvent.hpp +93 -0
  1076. package/nitrogen/generated/shared/c++/TrackMetadata.hpp +144 -0
  1077. package/nitrogen/generated/shared/c++/TrackStyle.hpp +76 -0
  1078. package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +124 -0
  1079. package/nitrogen/generated/shared/c++/UpdateOptions.hpp +111 -0
  1080. package/package.json +117 -6
  1081. package/src/AudioBrowser.ts +4 -0
  1082. package/src/features/battery.ts +176 -0
  1083. package/src/features/browser.ts +316 -0
  1084. package/src/features/equalizer.ts +64 -0
  1085. package/src/features/errors.ts +196 -0
  1086. package/src/features/favorites.ts +102 -0
  1087. package/src/features/index.ts +23 -0
  1088. package/src/features/metadata.ts +130 -0
  1089. package/src/features/network.ts +34 -0
  1090. package/src/features/nowPlaying.ts +56 -0
  1091. package/src/features/output.ts +50 -0
  1092. package/src/features/playback/controls.ts +66 -0
  1093. package/src/features/playback/index.ts +7 -0
  1094. package/src/features/playback/playWhenReady.ts +57 -0
  1095. package/src/features/playback/playing.ts +40 -0
  1096. package/src/features/playback/progress.ts +122 -0
  1097. package/src/features/playback/rate.ts +22 -0
  1098. package/src/features/playback/state.ts +72 -0
  1099. package/src/features/playback/volume.ts +59 -0
  1100. package/src/features/player/index.ts +2 -0
  1101. package/src/features/player/options.ts +479 -0
  1102. package/src/features/player/setup.ts +551 -0
  1103. package/src/features/queue/activeTrack.ts +59 -0
  1104. package/src/features/queue/index.ts +4 -0
  1105. package/src/features/queue/queue.ts +173 -0
  1106. package/src/features/queue/repeatMode.ts +58 -0
  1107. package/src/features/queue/shuffle.ts +49 -0
  1108. package/src/features/rating.ts +17 -0
  1109. package/src/features/remoteControls.ts +341 -0
  1110. package/src/features/sleepTimer.ts +186 -0
  1111. package/src/index.ts +5 -0
  1112. package/src/native.ts +5 -0
  1113. package/src/native.web.ts +4 -0
  1114. package/src/specs/audio-browser.nitro.ts +325 -0
  1115. package/src/types/browser-native.ts +68 -0
  1116. package/src/types/browser-nodes.ts +222 -0
  1117. package/src/types/browser.ts +828 -0
  1118. package/src/types/index.ts +2 -0
  1119. package/src/types/player.ts +69 -0
  1120. package/src/utils/LazyNativeEmitter.ts +58 -0
  1121. package/src/utils/NativeUpdatedValue.ts +56 -0
  1122. package/src/utils/resolveAssetSource.ts +4 -0
  1123. package/src/utils/useDebug.ts +283 -0
  1124. package/src/utils/useNativeUpdatedValue.ts +41 -0
  1125. package/src/utils/validation.ts +27 -0
  1126. package/src/web/NativeAudioBrowser.ts +884 -0
  1127. package/src/web/SimpleRouter.test.ts +160 -0
  1128. package/src/web/SimpleRouter.ts +194 -0
  1129. package/src/web/TrackPlayer/Event.ts +11 -0
  1130. package/src/web/TrackPlayer/Player.ts +351 -0
  1131. package/src/web/TrackPlayer/PlaylistPlayer.ts +346 -0
  1132. package/src/web/TrackPlayer/RepeatMode.ts +7 -0
  1133. package/src/web/TrackPlayer/SetupNotCalledError.ts +5 -0
  1134. package/src/web/TrackPlayer/SleepTimer.ts +71 -0
  1135. package/src/web/TrackPlayer/State.ts +15 -0
  1136. package/src/web/TrackPlayer/index.ts +4 -0
  1137. package/src/web/browser/BrowserManager.ts +699 -0
  1138. package/src/web/browser/FavoriteManager.ts +79 -0
  1139. package/src/web/browser/NavigationErrorManager.ts +119 -0
  1140. package/src/web/browser/SearchManager.ts +88 -0
  1141. package/src/web/http/HttpClient.ts +125 -0
  1142. package/src/web/http/RequestConfigBuilder.ts +363 -0
  1143. package/src/web/player/NowPlayingManager.ts +89 -0
  1144. package/src/web/player/OptionsManager.ts +102 -0
  1145. package/src/web/util/BrowserPathHelper.ts +148 -0
  1146. package/src/web/util/shuffle.ts +14 -0
  1147. package/index.js +0 -1
@@ -0,0 +1,1510 @@
1
+ package com.audiobrowser.player
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.content.Context
5
+ import androidx.media3.common.AudioAttributes
6
+ import androidx.media3.common.C
7
+ import androidx.media3.common.ForwardingPlayer
8
+ import androidx.media3.common.HeartRating
9
+ import androidx.media3.common.MediaItem
10
+ import androidx.media3.common.TrackSelectionParameters
11
+ import androidx.media3.database.StandaloneDatabaseProvider
12
+ import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor
13
+ import androidx.media3.datasource.cache.SimpleCache
14
+ import androidx.media3.exoplayer.DefaultRenderersFactory
15
+ import androidx.media3.exoplayer.ExoPlayer
16
+ import androidx.media3.exoplayer.upstream.DefaultBandwidthMeter
17
+ import androidx.media3.session.MediaLibraryService
18
+ import androidx.media3.session.MediaSession
19
+ import com.audiobrowser.AudioBrowser
20
+ import com.audiobrowser.Callbacks
21
+ import com.audiobrowser.extension.NumberExt.Companion.toSeconds
22
+ import com.margelo.nitro.audiobrowser.ImageContext
23
+ import com.audiobrowser.model.PlayerSetupOptions
24
+ import com.audiobrowser.model.PlayerUpdateOptions
25
+ import com.audiobrowser.util.AndroidAudioContentTypeFactory
26
+ import com.audiobrowser.util.CoilBitmapLoader
27
+ import com.audiobrowser.util.EqualizerManager
28
+ import com.audiobrowser.util.NetworkConnectivityMonitor
29
+ import com.audiobrowser.util.PlayingStateFactory
30
+ import com.audiobrowser.util.RepeatModeFactory
31
+ import com.audiobrowser.util.TrackFactory
32
+ import com.margelo.nitro.audiobrowser.AndroidPlayerWakeMode
33
+ import com.margelo.nitro.audiobrowser.AppKilledPlaybackBehavior
34
+ import com.margelo.nitro.audiobrowser.FavoriteChangedEvent
35
+ import com.margelo.nitro.audiobrowser.NowPlayingMetadata
36
+ import com.margelo.nitro.audiobrowser.NowPlayingUpdate
37
+ import com.margelo.nitro.audiobrowser.Playback
38
+ import com.margelo.nitro.audiobrowser.PlaybackActiveTrackChangedEvent
39
+ import com.margelo.nitro.audiobrowser.PlaybackError
40
+ import com.margelo.nitro.audiobrowser.PlaybackProgressUpdatedEvent
41
+ import com.margelo.nitro.audiobrowser.PlaybackQueueEndedEvent
42
+ import com.margelo.nitro.audiobrowser.PlaybackState
43
+ import com.margelo.nitro.audiobrowser.PlayingState
44
+ import com.margelo.nitro.audiobrowser.RatingType
45
+ import com.margelo.nitro.audiobrowser.RemoteJumpBackwardEvent
46
+ import com.margelo.nitro.audiobrowser.RemoteJumpForwardEvent
47
+ import com.margelo.nitro.audiobrowser.RemoteSeekEvent
48
+ import com.margelo.nitro.audiobrowser.RepeatMode
49
+ import com.margelo.nitro.audiobrowser.SearchParams
50
+ import com.margelo.nitro.audiobrowser.SleepTimer as NitroSleepTimer
51
+ import com.margelo.nitro.audiobrowser.SleepTimerEndOfTrack
52
+ import com.margelo.nitro.audiobrowser.SleepTimerTime
53
+ import com.margelo.nitro.audiobrowser.Track
54
+ import com.margelo.nitro.core.NullType
55
+ import java.io.File
56
+ import java.util.concurrent.TimeUnit
57
+ import kotlin.time.Duration.Companion.seconds
58
+ import kotlinx.coroutines.CompletableDeferred
59
+ import kotlinx.coroutines.TimeoutCancellationException
60
+ import kotlinx.coroutines.withTimeout
61
+ import timber.log.Timber
62
+
63
+ @SuppressLint("RestrictedApi")
64
+ class Player(internal val context: Context) {
65
+ val appKilledPlaybackBehavior: AppKilledPlaybackBehavior
66
+ get() = options.appKilledPlaybackBehavior
67
+
68
+ private var options = PlayerUpdateOptions()
69
+ internal var callbacks: Callbacks? = null
70
+ private lateinit var mediaSession: MediaSession
71
+ val networkMonitor: NetworkConnectivityMonitor = NetworkConnectivityMonitor(context)
72
+ private var equalizerManager: EqualizerManager? = null
73
+ private val mediaSessionCallback = MediaSessionCallback(this)
74
+ internal val playbackStateStore = PlaybackStateStore(this)
75
+ private val sleepTimer =
76
+ object : SleepTimer() {
77
+ override fun onComplete() {
78
+ Timber.d("Sleep timer completed, stopping playback")
79
+ stop()
80
+ callbacks?.onSleepTimerChanged(NitroSleepTimer.create(NullType.NULL))
81
+ }
82
+ }
83
+
84
+ lateinit var exoPlayer: ExoPlayer
85
+ lateinit var forwardingPlayer: androidx.media3.common.Player
86
+ /** Thread-safe cache of playWhenReady for access from non-main threads (e.g., retry policy) */
87
+ @Volatile internal var playWhenReadyCache = false
88
+ private lateinit var mediaFactory: MediaFactory
89
+ private lateinit var loadControl: DynamicLoadControl
90
+ private var automaticBufferManager: AutomaticBufferManager? = null
91
+
92
+ /**
93
+ * Tracks whether a network-related retry is pending. When true, network restoration will trigger
94
+ * an immediate retry via exoPlayer.prepare().
95
+ */
96
+ @Volatile private var pendingNetworkRetry = false
97
+
98
+ private var _browser: AudioBrowser? = null
99
+ private var browserRegistered = CompletableDeferred<AudioBrowser>()
100
+ private var _coilBitmapLoader: CoilBitmapLoader? = null
101
+
102
+ /**
103
+ * Coil ImageLoader for SVG pre-rendering in Android Auto browse items.
104
+ * Set by Service after creation.
105
+ */
106
+ var imageLoader: coil3.ImageLoader? = null
107
+
108
+ /**
109
+ * Set the CoilBitmapLoader for artwork URL transformation. Called from Service after creation.
110
+ */
111
+ var coilBitmapLoader: CoilBitmapLoader?
112
+ get() = _coilBitmapLoader
113
+ set(value) {
114
+ _coilBitmapLoader = value
115
+ // If browser is already set, wire up the resolver
116
+ _browser?.let { audioBrowser -> wireUpArtworkResolver(audioBrowser, value) }
117
+ }
118
+
119
+ var browser: AudioBrowser?
120
+ get() = _browser
121
+ set(value) {
122
+ _browser = value
123
+ value?.let { audioBrowser ->
124
+ // Wire up artwork URL resolver
125
+ // This ensures the resolver is available when onGetChildren resumes
126
+ wireUpArtworkResolver(audioBrowser, _coilBitmapLoader)
127
+
128
+ // NOTE: We do NOT complete browserRegistered here.
129
+ // Configuration (routes/tabs) must be set before Android Auto can browse.
130
+ // Call notifyBrowserConfigurationReady() after configuration is set.
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Notifies that the browser configuration is ready (routes/tabs are configured).
136
+ * This should be called after setting the browser AND its configuration.
137
+ * Only then will Android Auto be able to browse content.
138
+ */
139
+ fun notifyBrowserConfigurationReady() {
140
+ val audioBrowser = _browser ?: return
141
+
142
+ if (!browserRegistered.isCompleted) {
143
+ Timber.d("Browser configuration ready - completing deferred")
144
+ browserRegistered.complete(audioBrowser)
145
+ // Notify any subscribed controllers that content is now available
146
+ // This handles the cold-start case where AA subscribed before browser was ready
147
+ mediaSessionCallback.notifyBrowserReady()
148
+ }
149
+
150
+ // Update MediaSession commands when browser becomes available with search configured
151
+ // Only update if search is available, since default state is "no search"
152
+ if (::mediaSession.isInitialized) {
153
+ val searchAvailable = audioBrowser.browserManager.config.hasSearch
154
+ if (searchAvailable) {
155
+ mediaSessionCallback.updateMediaSession(
156
+ mediaSession,
157
+ options.capabilities,
158
+ options.notificationButtons,
159
+ searchAvailable,
160
+ )
161
+ }
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Wires up the artwork URL resolver between BrowserManager and CoilBitmapLoader. This enables
167
+ * artwork URL transformation during browse-time (Phase 2).
168
+ */
169
+ private fun wireUpArtworkResolver(audioBrowser: AudioBrowser, loader: CoilBitmapLoader?) {
170
+ val browserManager = audioBrowser.browserManager
171
+ if (loader != null) {
172
+ Timber.d("Wiring up artwork URL resolver")
173
+ browserManager.artworkUrlResolver = { track, perRouteConfig, imageContext ->
174
+ loader.transformArtworkUrlForTrack(track, perRouteConfig, imageContext)
175
+ }
176
+ // Clear content cache so that content resolved before the resolver was wired up
177
+ // will be re-fetched with artwork transformation applied
178
+ browserManager.clearContentCache()
179
+ Timber.d("Cleared content cache after wiring artwork resolver")
180
+ } else {
181
+ Timber.d("CoilBitmapLoader not available - artwork URL transformation disabled")
182
+ browserManager.artworkUrlResolver = null
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Suspends until the browser is registered, with a timeout.
188
+ *
189
+ * @throws TimeoutCancellationException if browser is not registered within timeout
190
+ */
191
+ suspend fun awaitBrowser(): AudioBrowser =
192
+ browser
193
+ ?: try {
194
+ withTimeout(10.seconds) {
195
+ Timber.d("Waiting for browser registration...")
196
+ browserRegistered.await()
197
+ }
198
+ } catch (e: TimeoutCancellationException) {
199
+ Timber.e("Timed out waiting for browser registration (10s)")
200
+ throw e
201
+ }
202
+
203
+ /**
204
+ * ForwardingPlayer that intercepts external player actions and dispatches them to callbacks.
205
+ *
206
+ * This class blocks all external media item modifications to delegate control to RNAB. These
207
+ * overrides prevent media controllers (like Android Auto, notifications) from directly modifying
208
+ * the queue, ensuring all queue changes go through the RNAB API for proper state management and
209
+ * event handling.
210
+ */
211
+ private inner class InterceptingPlayer(player: ExoPlayer) : ForwardingPlayer(player) {
212
+
213
+ override fun setMediaItems(mediaItems: MutableList<MediaItem>, resetPosition: Boolean) {
214
+ return super.setMediaItems(mediaItems, resetPosition)
215
+ }
216
+
217
+ override fun addMediaItems(mediaItems: MutableList<MediaItem>) {
218
+ return super.addMediaItems(mediaItems)
219
+ }
220
+
221
+ override fun addMediaItems(index: Int, mediaItems: MutableList<MediaItem>) {
222
+ return super.addMediaItems(index, mediaItems)
223
+ }
224
+
225
+ override fun setMediaItems(
226
+ mediaItems: MutableList<MediaItem>,
227
+ startIndex: Int,
228
+ startPositionMs: Long,
229
+ ) {
230
+ return super.setMediaItems(mediaItems, startIndex, startPositionMs)
231
+ }
232
+
233
+ override fun setMediaItems(mediaItems: MutableList<MediaItem>) {
234
+ return super.setMediaItems(mediaItems)
235
+ }
236
+
237
+ // Intercept playback controls and dispatch to callbacks or fall back to default behavior
238
+ override fun play() {
239
+ if (callbacks?.handleRemotePlay() != true) {
240
+ super.play()
241
+ }
242
+ }
243
+
244
+ override fun pause() {
245
+ if (callbacks?.handleRemotePause() != true) {
246
+ super.pause()
247
+ }
248
+ }
249
+
250
+ override fun seekToNext() {
251
+ Timber.Forest.d("InterceptingPlayer.seekToNext() called")
252
+ if (callbacks?.handleRemoteNext() != true) {
253
+ super.seekToNext()
254
+ }
255
+ }
256
+
257
+ override fun seekToNextMediaItem() {
258
+ Timber.Forest.d("InterceptingPlayer.seekToNextMediaItem() called")
259
+ if (callbacks?.handleRemoteNext() != true) {
260
+ super.seekToNextMediaItem()
261
+ }
262
+ }
263
+
264
+ override fun seekToPrevious() {
265
+ Timber.Forest.d("InterceptingPlayer.seekToPrevious() called")
266
+ if (callbacks?.handleRemotePrevious() != true) {
267
+ super.seekToPrevious()
268
+ }
269
+ }
270
+
271
+ override fun seekToPreviousMediaItem() {
272
+ Timber.Forest.d("InterceptingPlayer.seekToPreviousMediaItem() called")
273
+ if (callbacks?.handleRemotePrevious() != true) {
274
+ super.seekToPreviousMediaItem()
275
+ }
276
+ }
277
+
278
+ override fun seekForward() {
279
+ Timber.Forest.d("InterceptingPlayer.seekForward() called")
280
+ if (
281
+ callbacks?.handleRemoteJumpForward(
282
+ RemoteJumpForwardEvent(interval = options.forwardJumpInterval)
283
+ ) != true
284
+ ) {
285
+ super.seekForward()
286
+ }
287
+ }
288
+
289
+ override fun seekBack() {
290
+ if (
291
+ callbacks?.handleRemoteJumpBackward(
292
+ RemoteJumpBackwardEvent(interval = options.backwardJumpInterval)
293
+ ) != true
294
+ ) {
295
+ super.seekBack()
296
+ }
297
+ }
298
+
299
+ override fun stop() {
300
+ if (callbacks?.handleRemoteStop() != true) {
301
+ super.stop()
302
+ }
303
+ }
304
+
305
+ override fun seekTo(mediaItemIndex: Int, positionMs: Long) {
306
+ if (
307
+ callbacks?.handleRemoteSeek(RemoteSeekEvent(position = positionMs.toDouble() / 1000.0)) !=
308
+ true
309
+ ) {
310
+ super.seekTo(mediaItemIndex, positionMs)
311
+ }
312
+ }
313
+
314
+ override fun seekTo(positionMs: Long) {
315
+ if (
316
+ callbacks?.handleRemoteSeek(RemoteSeekEvent(position = positionMs.toDouble() / 1000.0)) !=
317
+ true
318
+ ) {
319
+ super.seekTo(positionMs)
320
+ }
321
+ }
322
+ }
323
+
324
+ private lateinit var playerListener: PlayerListener
325
+ private var cache: SimpleCache? = null
326
+
327
+ private val progressUpdateManager: PlaybackProgressUpdateManager by lazy {
328
+ PlaybackProgressUpdateManager {
329
+ val index = currentIndex ?: return@PlaybackProgressUpdateManager
330
+ val event =
331
+ PlaybackProgressUpdatedEvent(
332
+ position = position.toSeconds(),
333
+ duration = duration.toSeconds(),
334
+ buffered = bufferedPosition.toSeconds(),
335
+ track = index.toDouble(),
336
+ )
337
+ callbacks?.onPlaybackProgressUpdated(event)
338
+ }
339
+ }
340
+
341
+ internal var playingState: PlayingState = PlayingState(false, false)
342
+
343
+ val currentTrack: Track?
344
+ get() = exoPlayer.currentMediaItem?.let { TrackFactory.fromMedia3(it) }
345
+
346
+ internal var lastTrack: Track? = null
347
+ internal var lastIndex: Int? = null
348
+
349
+ var playbackError: PlaybackError? = null
350
+ internal set
351
+
352
+ internal var playbackState: PlaybackState = PlaybackState.NONE
353
+ private set
354
+
355
+ /** Current now playing metadata override (null = use track metadata) */
356
+ private var nowPlayingOverride: NowPlayingUpdate? = null
357
+
358
+ fun getPlayback(): Playback {
359
+ return Playback(playbackState, playbackError)
360
+ }
361
+
362
+ fun getPlayingState(): PlayingState {
363
+ return playingState
364
+ }
365
+
366
+ var playWhenReady: Boolean
367
+ get() = exoPlayer.playWhenReady
368
+ set(value) {
369
+ playWhenReadyCache = value
370
+ exoPlayer.playWhenReady = value
371
+ }
372
+
373
+ val duration: Long
374
+ get() = if (exoPlayer.duration == C.TIME_UNSET) 0 else exoPlayer.duration
375
+
376
+ internal var oldPosition = 0L
377
+
378
+ val position: Long
379
+ get() =
380
+ if (exoPlayer.currentPosition == C.INDEX_UNSET.toLong()) 0 else exoPlayer.currentPosition
381
+
382
+ val bufferedPosition: Long
383
+ get() =
384
+ if (exoPlayer.bufferedPosition == C.INDEX_UNSET.toLong()) 0 else exoPlayer.bufferedPosition
385
+
386
+ var volume: Float
387
+ get() = exoPlayer.volume
388
+ set(value) {
389
+ exoPlayer.volume = value
390
+ }
391
+
392
+ var playbackSpeed: Float
393
+ get() = exoPlayer.playbackParameters.speed
394
+ set(value) {
395
+ exoPlayer.setPlaybackSpeed(value)
396
+ }
397
+
398
+ val isPlaying
399
+ get() = exoPlayer.isPlaying
400
+
401
+ var ratingType: RatingType = RatingType.NONE
402
+
403
+ var repeatMode: RepeatMode
404
+ get() = RepeatModeFactory.fromMedia3(exoPlayer.repeatMode)
405
+ internal set(value) {
406
+ exoPlayer.repeatMode = RepeatModeFactory.toMedia3(value)
407
+ }
408
+
409
+ val currentIndex: Int?
410
+ get() =
411
+ if (exoPlayer.currentMediaItemIndex == C.INDEX_UNSET) null
412
+ else exoPlayer.currentMediaItemIndex
413
+
414
+ var shuffleMode: Boolean
415
+ get() = exoPlayer.shuffleModeEnabled
416
+ set(value) {
417
+ exoPlayer.shuffleModeEnabled = value
418
+ }
419
+
420
+ val trackCount: Int
421
+ get() = exoPlayer.mediaItemCount
422
+
423
+ val isEmpty: Boolean
424
+ get() = exoPlayer.mediaItemCount == 0
425
+
426
+ val tracks: Array<Track>
427
+ get() =
428
+ (0 until exoPlayer.mediaItemCount)
429
+ .map { index -> TrackFactory.fromMedia3(exoPlayer.getMediaItemAt(index)) }
430
+ .toTypedArray()
431
+
432
+ val isLastTrack: Boolean
433
+ get() = exoPlayer.currentMediaItemIndex == exoPlayer.mediaItemCount - 1
434
+
435
+ /**
436
+ * The source path from which the current queue was expanded (e.g., from a contextual URL). Used
437
+ * to avoid re-expanding the queue when selecting tracks from the same source.
438
+ */
439
+ var queueSourcePath: String? = null
440
+ internal set
441
+
442
+ /**
443
+ * Get track at index with bounds checking.
444
+ *
445
+ * @param index The index of the track to retrieve.
446
+ * @throws IllegalArgumentException if index is out of bounds.
447
+ */
448
+ fun getTrack(index: Int): Track {
449
+ if (index < 0 || index >= exoPlayer.mediaItemCount) {
450
+ throw IllegalArgumentException(
451
+ "Track index $index is out of bounds (size: ${exoPlayer.mediaItemCount})"
452
+ )
453
+ }
454
+ return TrackFactory.fromMedia3(exoPlayer.getMediaItemAt(index))
455
+ }
456
+
457
+ var skipSilence: Boolean
458
+ get() = exoPlayer.skipSilenceEnabled
459
+ internal set(value) {
460
+ exoPlayer.skipSilenceEnabled = value
461
+ }
462
+
463
+ /**
464
+ * Sets up or recreates the ExoPlayer with the provided setup options. This method can be called
465
+ * multiple times to change setup options.
466
+ */
467
+ fun setup(setupOptions: PlayerSetupOptions) {
468
+ Timber.Forest.d("Setting up player with new options")
469
+
470
+ val isInitialSetup = !::exoPlayer.isInitialized
471
+
472
+ if (!isInitialSetup) {
473
+ forwardingPlayer.removeListener(playerListener)
474
+ exoPlayer.release()
475
+ Timber.Forest.d("Player cleanup completed")
476
+ }
477
+
478
+ if (setupOptions.maxCacheSize > 0) {
479
+ cache =
480
+ SimpleCache(
481
+ File(context.cacheDir, "RNAB"),
482
+ LeastRecentlyUsedCacheEvictor(
483
+ setupOptions.maxCacheSize.toLong() * 1_000_000
484
+ ), // MB to bytes
485
+ StandaloneDatabaseProvider(context),
486
+ )
487
+ } else {
488
+ cache?.release()
489
+ cache = null
490
+ }
491
+
492
+ // Recreate ExoPlayer with new setup options
493
+ val renderer = DefaultRenderersFactory(context)
494
+ renderer.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)
495
+
496
+ // Create bandwidth meter for adaptive bitrate selection in HLS/DASH
497
+ val bandwidthMeter = DefaultBandwidthMeter.Builder(context).build()
498
+
499
+ loadControl = run {
500
+ val minBuffer = setupOptions.minBuffer.toInt()
501
+ val maxBuffer = setupOptions.maxBuffer.toInt()
502
+ val playBuffer = setupOptions.playBuffer.toInt()
503
+ // When automatic (rebufferBuffer is null), start at playBuffer and let AutomaticBufferManager
504
+ // adjust
505
+ // When fixed (rebufferBuffer is set), use that value
506
+ val playAfterRebuffer = setupOptions.rebufferBuffer?.toInt() ?: playBuffer
507
+ val backBuffer = setupOptions.backBuffer.toInt()
508
+ val config =
509
+ BufferConfig(
510
+ minBufferMs = minBuffer,
511
+ maxBufferMs = maxBuffer,
512
+ bufferForPlaybackMs = playBuffer,
513
+ bufferForPlaybackAfterRebufferMs = playAfterRebuffer,
514
+ backBufferMs = backBuffer,
515
+ )
516
+ DynamicLoadControl(initialConfig = config)
517
+ }
518
+ // Create MediaFactory with reference to browser for media URL transformation
519
+ // shouldRetry checks playWhenReady to avoid retrying when paused (e.g., another app took audio
520
+ // focus). Uses thread-safe cache since this is called from ExoPlayer's playback thread.
521
+ // isOnline and onRetryPending enable network-aware retry acceleration.
522
+ mediaFactory =
523
+ MediaFactory(
524
+ context,
525
+ cache,
526
+ setupOptions.retryPolicy,
527
+ shouldRetry = { playWhenReadyCache },
528
+ isOnline = { networkMonitor.getOnline() },
529
+ onRetryPending = { isNetworkError ->
530
+ // Track pending network retries for acceleration when connectivity returns
531
+ pendingNetworkRetry = isNetworkError
532
+ if (isNetworkError) {
533
+ Timber.d("Network retry pending, will accelerate on connectivity restoration")
534
+ }
535
+ },
536
+ transferListener = bandwidthMeter,
537
+ ) { url ->
538
+ browser?.getMediaRequestConfig(url)
539
+ }
540
+
541
+ exoPlayer =
542
+ ExoPlayer.Builder(context)
543
+ .setRenderersFactory(renderer)
544
+ .setBandwidthMeter(bandwidthMeter)
545
+ .setHandleAudioBecomingNoisy(setupOptions.handleAudioBecomingNoisy)
546
+ .setMediaSourceFactory(mediaFactory)
547
+ .setWakeMode(
548
+ when (setupOptions.wakeMode) {
549
+ AndroidPlayerWakeMode.NONE -> C.WAKE_MODE_NONE
550
+ AndroidPlayerWakeMode.LOCAL -> C.WAKE_MODE_LOCAL
551
+ AndroidPlayerWakeMode.NETWORK -> C.WAKE_MODE_NETWORK
552
+ }
553
+ )
554
+ .setLoadControl(loadControl)
555
+ .setName("AudioBrowser")
556
+ .build()
557
+ exoPlayer.setAudioAttributes(
558
+ AudioAttributes.Builder()
559
+ .setUsage(C.USAGE_MEDIA)
560
+ .setContentType(AndroidAudioContentTypeFactory.toMedia3(setupOptions.audioContentType))
561
+ .build(),
562
+ true, // handle audio focus
563
+ )
564
+
565
+ // Apply setup-specific options
566
+ setupOptions.audioOffload?.let {
567
+ val audioOffloadPreferences =
568
+ TrackSelectionParameters.AudioOffloadPreferences.Builder()
569
+ .setAudioOffloadMode(
570
+ TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED
571
+ )
572
+ .setIsGaplessSupportRequired(it.gaplessSupportRequired)
573
+ .setIsSpeedChangeSupportRequired(it.rateChangeSupportRequired)
574
+ .build()
575
+ exoPlayer.trackSelectionParameters.audioOffloadPreferences = audioOffloadPreferences
576
+ }
577
+
578
+ // Recreate forwarding player with new ExoPlayer
579
+ forwardingPlayer = InterceptingPlayer(exoPlayer)
580
+
581
+ if (isInitialSetup) {
582
+ // Initial setup - create player listener and emit initial state
583
+ playerListener = PlayerListener(this)
584
+ forwardingPlayer.addListener(playerListener)
585
+ callbacks?.onPlaybackChanged(Playback(PlaybackState.NONE, null))
586
+
587
+ // Initialize equalizer with audio session ID
588
+ initializeEqualizer()
589
+ } else {
590
+ // Re-setup - re-add listener and update MediaSession
591
+ forwardingPlayer.addListener(playerListener)
592
+
593
+ // Update MediaSession with new forwardingPlayer reference if MediaSession exists
594
+ if (::mediaSession.isInitialized) {
595
+ Timber.Forest.d("Updating MediaSession with new forwardingPlayer reference")
596
+ mediaSession.player = forwardingPlayer
597
+ }
598
+
599
+ setPlaybackState(PlaybackState.NONE)
600
+ }
601
+
602
+ // Set up automatic buffer management if enabled
603
+ setupAutomaticBufferManager(setupOptions.automaticBuffer)
604
+ }
605
+
606
+ /** Sets up or tears down the automatic buffer manager based on the enabled flag. */
607
+ private fun setupAutomaticBufferManager(enabled: Boolean) {
608
+ // Detach existing manager if any
609
+ automaticBufferManager?.detach()
610
+
611
+ if (enabled) {
612
+ val defaultConfig = loadControl.getBufferConfig()
613
+ automaticBufferManager =
614
+ AutomaticBufferManager(loadControl, defaultConfig).also { it.attach(exoPlayer) }
615
+ Timber.d("Automatic buffer management enabled")
616
+ } else {
617
+ automaticBufferManager = null
618
+ Timber.d("Automatic buffer management disabled")
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Starts observing network connectivity changes and invokes the callback when state changes.
624
+ * Also handles accelerating pending network retries when connectivity is restored.
625
+ *
626
+ * @param scope The coroutine scope to use for observation
627
+ */
628
+ fun observeNetworkConnectivity(scope: kotlinx.coroutines.CoroutineScope) {
629
+ networkMonitor.observeOnline(scope) { isOnline ->
630
+ callbacks?.onOnlineChanged(isOnline)
631
+
632
+ // Accelerate pending network retry when connectivity is restored
633
+ if (isOnline && pendingNetworkRetry) {
634
+ Timber.d("Network restored with pending retry, triggering immediate retry")
635
+ pendingNetworkRetry = false
636
+ // Only retry if player is still expecting to play
637
+ if (playWhenReadyCache) {
638
+ exoPlayer.prepare()
639
+ }
640
+ }
641
+ }
642
+ }
643
+
644
+ /**
645
+ * Loads a track into the player. If there is a current track, it will be replaced. If the queue
646
+ * is empty, the track will be added.
647
+ *
648
+ * @param track The [Track] to load.
649
+ */
650
+ fun load(track: Track) {
651
+ if (exoPlayer.mediaItemCount == 0) {
652
+ add(track)
653
+ } else {
654
+ val index = exoPlayer.currentMediaItemIndex
655
+ replaceTrack(index, track)
656
+ exoPlayer.seekTo(index, C.TIME_UNSET)
657
+ exoPlayer.prepare()
658
+ }
659
+ }
660
+
661
+ /**
662
+ * Add a single track to the queue. If the AudioPlayer has no track loaded, it will load the
663
+ * `track`.
664
+ *
665
+ * @param track The [Track] to add.
666
+ */
667
+ fun add(track: Track) {
668
+ val mediaItem = TrackFactory.toMedia3(track)
669
+ exoPlayer.addMediaItem(mediaItem)
670
+ exoPlayer.prepare()
671
+ }
672
+
673
+ /**
674
+ * Add multiple tracks to the queue. If the AudioPlayer has no track loaded, it will load the
675
+ * first track in the list.
676
+ *
677
+ * @param tracks The [Track]s to add.
678
+ */
679
+ fun add(tracks: Array<Track>) {
680
+ val mediaItems = TrackFactory.toMedia3(tracks)
681
+ exoPlayer.addMediaItems(mediaItems.toList())
682
+ exoPlayer.prepare()
683
+ }
684
+
685
+ /**
686
+ * Add multiple tracks to the queue.
687
+ *
688
+ * @param tracks The [Track]s to add.
689
+ * @param atIndex Index to insert tracks at. Use -1 to append to the end of the queue.
690
+ * @throws IllegalArgumentException if index is out of bounds.
691
+ */
692
+ fun add(tracks: Array<Track>, atIndex: Int) {
693
+ validateInsertIndex(atIndex)
694
+ val index = if (atIndex == -1) exoPlayer.mediaItemCount else atIndex
695
+ val mediaItems = tracks.map { TrackFactory.toMedia3(it) }
696
+ exoPlayer.addMediaItems(index, mediaItems)
697
+ exoPlayer.prepare()
698
+ }
699
+
700
+ /**
701
+ * Remove a track from the queue.
702
+ *
703
+ * @param index The index of the track to remove.
704
+ * @throws IllegalArgumentException if index is out of bounds.
705
+ */
706
+ fun remove(index: Int) {
707
+ validateIndex(index)
708
+ exoPlayer.removeMediaItem(index)
709
+ }
710
+
711
+ /**
712
+ * Remove tracks from the queue.
713
+ *
714
+ * @param indexes The indexes of the tracks to remove.
715
+ * @throws IllegalArgumentException if any index is out of bounds or if duplicate indexes are
716
+ * provided.
717
+ */
718
+ fun remove(indexes: List<Int>) {
719
+ if (indexes.toSet().size != indexes.size) {
720
+ throw IllegalArgumentException("Duplicate indexes provided")
721
+ }
722
+ indexes.forEach { validateIndex(it) }
723
+ val sorted = indexes.sortedDescending()
724
+ sorted.forEach { exoPlayer.removeMediaItem(it) }
725
+ }
726
+
727
+ /**
728
+ * Skip to the next track in the queue, which may depend on the current repeat mode. Does nothing
729
+ * if there is no next track to skip to.
730
+ */
731
+ fun next() {
732
+ exoPlayer.seekToNextMediaItem()
733
+ exoPlayer.prepare()
734
+ }
735
+
736
+ /**
737
+ * Skip to the previous track in the queue, which may depend on the current repeat mode. Does
738
+ * nothing if there is no previous track to skip to.
739
+ */
740
+ fun previous() {
741
+ exoPlayer.seekToPreviousMediaItem()
742
+ exoPlayer.prepare()
743
+ }
744
+
745
+ /**
746
+ * Move an track in the queue from one position to another.
747
+ *
748
+ * @param fromIndex The index of the track to move.
749
+ * @param toIndex The index to move the track to. If the index is larger than the size of the
750
+ * queue, the track is moved to the end of the queue instead.
751
+ * @throws IllegalArgumentException if fromIndex is out of bounds.
752
+ */
753
+ fun move(fromIndex: Int, toIndex: Int) {
754
+ validateIndex(fromIndex)
755
+ exoPlayer.moveMediaItem(fromIndex, toIndex)
756
+ }
757
+
758
+ /**
759
+ * Skips to a track in the queue.
760
+ *
761
+ * @param index the index to skip to
762
+ * @throws IllegalArgumentException if index is out of bounds.
763
+ */
764
+ fun skipTo(index: Int) {
765
+ validateIndex(index)
766
+ exoPlayer.seekTo(index, C.TIME_UNSET)
767
+ exoPlayer.prepare()
768
+ }
769
+
770
+ /**
771
+ * Sets the queue with new tracks, optionally starting at a specific index and position. This is
772
+ * more efficient than calling clear() + add() + skipTo() separately.
773
+ *
774
+ * @param tracks The tracks to set as the new queue.
775
+ * @param startIndex The index to start playback from (default: 0).
776
+ * @param startPositionMs The position in milliseconds to start from (default: 0).
777
+ * @param sourcePath Optional path from which this queue was expanded (for contextual URL
778
+ * optimization).
779
+ */
780
+ fun setQueue(
781
+ tracks: Array<Track>,
782
+ startIndex: Int = 0,
783
+ startPositionMs: Long = 0,
784
+ sourcePath: String? = null,
785
+ ) {
786
+ val mediaItems = TrackFactory.toMedia3(tracks).toMutableList()
787
+ exoPlayer.setMediaItems(mediaItems, startIndex, startPositionMs)
788
+ queueSourcePath = sourcePath
789
+ exoPlayer.prepare()
790
+ }
791
+
792
+ /**
793
+ * Replaces track at index in queue.
794
+ *
795
+ * @throws IllegalArgumentException if index is out of bounds.
796
+ */
797
+ fun replaceTrack(index: Int, track: Track) {
798
+ validateIndex(index)
799
+ exoPlayer.replaceMediaItem(index, TrackFactory.toMedia3(track))
800
+ }
801
+
802
+ /**
803
+ * Sets the favorited state of the currently playing track. Updates the heart icon in media
804
+ * controllers without interrupting playback.
805
+ */
806
+ fun setActiveTrackFavorited(favorited: Boolean) {
807
+ val index = exoPlayer.currentMediaItemIndex
808
+ if (index == C.INDEX_UNSET) return
809
+
810
+ val currentTrack = this.currentTrack ?: return
811
+
812
+ // Update native favorites cache (only tracks with src can be favorited)
813
+ currentTrack.src?.let { src -> browser?.browserManager?.updateFavorite(src, favorited) }
814
+
815
+ // Create updated Track with new favorited state
816
+ val updatedTrack =
817
+ Track(
818
+ url = currentTrack.url,
819
+ src = currentTrack.src,
820
+ artwork = currentTrack.artwork,
821
+ artworkSource = currentTrack.artworkSource,
822
+ artworkCarPlayTinted = currentTrack.artworkCarPlayTinted,
823
+ title = currentTrack.title,
824
+ subtitle = currentTrack.subtitle,
825
+ artist = currentTrack.artist,
826
+ album = currentTrack.album,
827
+ description = currentTrack.description,
828
+ genre = currentTrack.genre,
829
+ duration = currentTrack.duration,
830
+ style = currentTrack.style,
831
+ childrenStyle = currentTrack.childrenStyle,
832
+ favorited = favorited,
833
+ groupTitle = currentTrack.groupTitle,
834
+ live = currentTrack.live,
835
+ imageRow = currentTrack.imageRow,
836
+ )
837
+
838
+ // Use buildUpon() on the existing MediaItem to update only the metadata
839
+ // This preserves internal references and avoids playback interruption
840
+ // Note: setTag() requires setUri() to be called, so we must re-set the URI
841
+ val currentMediaItem = exoPlayer.getMediaItemAt(index)
842
+ val updatedMetadata =
843
+ currentMediaItem.mediaMetadata.buildUpon().setUserRating(HeartRating(favorited)).build()
844
+ val updatedMediaItem =
845
+ currentMediaItem
846
+ .buildUpon()
847
+ .setUri(currentMediaItem.localConfiguration?.uri)
848
+ .setMediaMetadata(updatedMetadata)
849
+ .setTag(updatedTrack)
850
+ .build()
851
+
852
+ exoPlayer.replaceMediaItem(index, updatedMediaItem)
853
+
854
+ // Update the heart button icon in notification/Android Auto
855
+ updateFavoriteButtonState(favorited)
856
+
857
+ // Notify JS of the favorite state change
858
+ callbacks?.onFavoriteChanged(FavoriteChangedEvent(updatedTrack, favorited))
859
+
860
+ // Emit active track changed so useActiveTrack() hook updates
861
+ val activeTrackEvent =
862
+ PlaybackActiveTrackChangedEvent(
863
+ lastIndex = index.toDouble(),
864
+ lastTrack = currentTrack,
865
+ lastPosition = exoPlayer.currentPosition.toSeconds(),
866
+ index = index.toDouble(),
867
+ track = updatedTrack,
868
+ )
869
+ callbacks?.onPlaybackActiveTrackChanged(activeTrackEvent)
870
+
871
+ // Emit queue changed so useQueue() hook updates
872
+ callbacks?.onPlaybackQueueChanged(tracks)
873
+ }
874
+
875
+ /** Toggles the favorited state of the currently playing track. */
876
+ fun toggleActiveTrackFavorited() {
877
+ val currentTrack = this.currentTrack ?: return
878
+ setActiveTrackFavorited(currentTrack.favorited != true)
879
+ }
880
+
881
+ // MARK: - Now Playing Metadata
882
+
883
+ /**
884
+ * Updates the now playing notification metadata. Pass null to clear overrides and revert to track
885
+ * metadata.
886
+ */
887
+ fun updateNowPlaying(update: NowPlayingUpdate?) {
888
+ nowPlayingOverride = update
889
+ applyNowPlayingMetadata()
890
+ }
891
+
892
+ /** Gets the current now playing metadata (override if set, else track metadata). */
893
+ fun getNowPlaying(): NowPlayingMetadata? {
894
+ val track = currentTrack ?: return null
895
+ val override = nowPlayingOverride
896
+
897
+ return NowPlayingMetadata(
898
+ elapsedTime = null,
899
+ title = override?.title ?: track.title,
900
+ album = track.album,
901
+ artist = override?.artist ?: track.artist,
902
+ duration = track.duration,
903
+ artwork = track.artwork,
904
+ description = track.description,
905
+ mediaId = track.src ?: track.url,
906
+ genre = track.genre,
907
+ rating = null, // TODO: map track.favorited to rating if needed
908
+ )
909
+ }
910
+
911
+ /**
912
+ * Clears the now playing override when track changes. Called from
913
+ * PlayerListener.onMediaItemTransition.
914
+ */
915
+ internal fun clearNowPlayingOverride() {
916
+ nowPlayingOverride = null
917
+ }
918
+
919
+ /**
920
+ * Resets the retry timer when track changes. Called from PlayerListener.onMediaItemTransition.
921
+ */
922
+ internal fun resetRetryTimer() {
923
+ mediaFactory.resetRetryTimer()
924
+ }
925
+
926
+ /**
927
+ * Applies the current now playing metadata to the media notification. Uses the override if set,
928
+ * otherwise uses track metadata.
929
+ */
930
+ private fun applyNowPlayingMetadata() {
931
+ val index = currentIndex ?: return
932
+ val track = currentTrack ?: return
933
+ val override = nowPlayingOverride
934
+
935
+ val currentMediaItem = exoPlayer.getMediaItemAt(index)
936
+ val updatedMetadata =
937
+ currentMediaItem.mediaMetadata
938
+ .buildUpon()
939
+ .setTitle(override?.title ?: track.title)
940
+ .setDisplayTitle(override?.title ?: track.title)
941
+ .setArtist(override?.artist ?: track.artist)
942
+ .build()
943
+
944
+ val updatedMediaItem =
945
+ currentMediaItem
946
+ .buildUpon()
947
+ .setUri(currentMediaItem.localConfiguration?.uri)
948
+ .setMediaMetadata(updatedMetadata)
949
+ .setTag(track)
950
+ .build()
951
+
952
+ exoPlayer.replaceMediaItem(index, updatedMediaItem)
953
+
954
+ // Notify JS of the now playing metadata change
955
+ getNowPlaying()?.let { callbacks?.onNowPlayingChanged(it) }
956
+ }
957
+
958
+ /**
959
+ * Updates the favorite button icon in the notification/Android Auto. Call this when track changes
960
+ * or favorite state changes.
961
+ */
962
+ internal fun updateFavoriteButtonState(favorited: Boolean?) {
963
+ if (!::mediaSession.isInitialized) return
964
+ mediaSessionCallback.commandManager.updateFavoriteState(mediaSession, favorited)
965
+ }
966
+
967
+ /** Removes all the upcoming tracks, if any (the ones returned by [next]). */
968
+ fun removeUpcomingTracks() {
969
+ val index = exoPlayer.currentMediaItemIndex
970
+ if (index == C.INDEX_UNSET) return
971
+ val lastIndex = exoPlayer.mediaItemCount
972
+ val fromIndex = index + 1
973
+
974
+ exoPlayer.removeMediaItems(fromIndex, lastIndex)
975
+ }
976
+
977
+ fun play() {
978
+ exoPlayer.play()
979
+ if (currentTrack != null) {
980
+ exoPlayer.prepare()
981
+ }
982
+ }
983
+
984
+ /**
985
+ * Executes a search and plays the results. Used for voice commands with structured search
986
+ * parameters.
987
+ *
988
+ * @param params The structured search parameters (mode, query, artist, album, etc.)
989
+ * @return true if search succeeded and playback started, false otherwise
990
+ */
991
+ suspend fun playFromSearch(params: SearchParams): Boolean {
992
+ return try {
993
+ val browserManager = awaitBrowser().browserManager
994
+
995
+ Timber.d(
996
+ "Executing voice search: mode=${params.mode}, query='${params.query}', artist='${params.artist}', album='${params.album}'"
997
+ )
998
+ val tracks = browserManager.searchPlayable(params)
999
+
1000
+ if (tracks != null && tracks.isNotEmpty()) {
1001
+ Timber.d("Found ${tracks.size} track(s), playing first: ${tracks[0].title}")
1002
+ setQueue(tracks)
1003
+ play()
1004
+ true
1005
+ } else {
1006
+ Timber.w("No tracks found for search: ${params}")
1007
+ false
1008
+ }
1009
+ } catch (e: Exception) {
1010
+ Timber.e(e, "Error handling voice search: ${params}")
1011
+ false
1012
+ }
1013
+ }
1014
+
1015
+ fun prepare() {
1016
+ if (currentTrack != null) {
1017
+ exoPlayer.prepare()
1018
+ }
1019
+ }
1020
+
1021
+ fun pause() {
1022
+ exoPlayer.pause()
1023
+ }
1024
+
1025
+ fun togglePlayback() {
1026
+ if (exoPlayer.playWhenReady) {
1027
+ pause()
1028
+ } else {
1029
+ play()
1030
+ }
1031
+ }
1032
+
1033
+ /**
1034
+ * Stops playback, without clearing the active track. Calling this method will cause the playback
1035
+ * state to transition to State.NONE and the player will release the loaded media and resources
1036
+ * required for playback.
1037
+ */
1038
+ fun stop() {
1039
+ playbackState = PlaybackState.STOPPED
1040
+ exoPlayer.playWhenReady = false
1041
+ exoPlayer.stop()
1042
+ }
1043
+
1044
+ fun clear() {
1045
+ exoPlayer.clearMediaItems()
1046
+ queueSourcePath = null
1047
+ }
1048
+
1049
+ /**
1050
+ * Stops and destroys the player. Only call this when you are finished using the player, otherwise
1051
+ * use [pause].
1052
+ */
1053
+ fun destroy() {
1054
+ stop()
1055
+ forwardingPlayer.removeListener(playerListener)
1056
+ automaticBufferManager?.detach()
1057
+ automaticBufferManager = null
1058
+ exoPlayer.release()
1059
+ cache?.release()
1060
+ cache = null
1061
+ networkMonitor.destroy()
1062
+ equalizerManager?.release()
1063
+ equalizerManager = null
1064
+ }
1065
+
1066
+ fun seekTo(duration: Long, unit: TimeUnit) {
1067
+ val positionMs = TimeUnit.MILLISECONDS.convert(duration, unit)
1068
+ exoPlayer.seekTo(positionMs)
1069
+ }
1070
+
1071
+ fun seekBy(offset: Long, unit: TimeUnit) {
1072
+ val positionMs = exoPlayer.currentPosition + TimeUnit.MILLISECONDS.convert(offset, unit)
1073
+ exoPlayer.seekTo(positionMs)
1074
+ }
1075
+
1076
+ /**
1077
+ * Updates the player state and emits a state change event if the state has changed. Only emits an
1078
+ * event if the new state differs from the current state.
1079
+ *
1080
+ * IMPORTANT: This method also triggers the queue ended event when the player reaches State.ENDED
1081
+ * and is on the last track. All state transitions should go through this method to ensure proper
1082
+ * event dispatching. Direct assignments to playerState will bypass event emission.
1083
+ *
1084
+ * @param state The new player state to set
1085
+ */
1086
+ internal fun setPlaybackState(state: PlaybackState) {
1087
+ if (state != playbackState) {
1088
+ val oldState = playbackState
1089
+ playbackState = state
1090
+
1091
+ // Clear error when transitioning away from error state
1092
+ if (oldState == PlaybackState.ERROR) {
1093
+ playbackError = null
1094
+ callbacks?.onPlaybackError(null)
1095
+ }
1096
+
1097
+ val playback = Playback(state, playbackError)
1098
+ callbacks?.onPlaybackChanged(playback)
1099
+
1100
+ // Emit queue ended event when playback ends on the last track
1101
+ // This coupling ensures queue ended events are always triggered consistently with state
1102
+ // changes
1103
+ if (state == PlaybackState.ENDED && isLastTrack) {
1104
+ currentIndex?.let { index ->
1105
+ val event =
1106
+ PlaybackQueueEndedEvent(track = index.toDouble(), position = position.toSeconds())
1107
+ callbacks?.onPlaybackQueueEnded(event)
1108
+ }
1109
+ // Reset saved position to 0 so resumption starts from beginning (only when not repeating)
1110
+ if (repeatMode == RepeatMode.OFF) {
1111
+ playbackStateStore.savePositionZero()
1112
+ }
1113
+ }
1114
+
1115
+ progressUpdateManager.onPlaybackStateChanged(state)
1116
+ val newPlayingState = PlayingStateFactory.derive(playWhenReady, state)
1117
+ if (newPlayingState != playingState) {
1118
+ Timber.d(
1119
+ "PlayingState changed: playing=${newPlayingState.playing}, buffering=${newPlayingState.buffering}"
1120
+ )
1121
+ playingState = newPlayingState
1122
+ callbacks?.onPlaybackPlayingState(playingState)
1123
+ }
1124
+ }
1125
+ }
1126
+
1127
+ /**
1128
+ * Sets the progress update interval.
1129
+ *
1130
+ * @param interval The interval in seconds, or null to disable progress updates
1131
+ */
1132
+ fun setProgressUpdateInterval(interval: Double?) {
1133
+ progressUpdateManager.setUpdateInterval(interval)
1134
+ }
1135
+
1136
+ /**
1137
+ * Applies update options with change detection. Only updates properties that have actually
1138
+ * changed and emits events accordingly.
1139
+ *
1140
+ * @param options The new options to apply
1141
+ * @param mediaSession The MediaSession to update when capabilities change
1142
+ */
1143
+ fun applyOptions(options: PlayerUpdateOptions) {
1144
+ // Store previous values for change detection
1145
+ val previousOptions = this.options
1146
+
1147
+ // Update current options
1148
+ this.options = options.copy()
1149
+
1150
+ // Check what changed
1151
+ val skipSilenceChanged = previousOptions.skipSilence != options.skipSilence
1152
+ val ratingTypeChanged = previousOptions.ratingType != options.ratingType
1153
+ val shuffleChanged = previousOptions.shuffle != options.shuffle
1154
+ val progressUpdateEventIntervalChanged =
1155
+ previousOptions.progressUpdateEventInterval != options.progressUpdateEventInterval
1156
+ val forwardJumpIntervalChanged =
1157
+ previousOptions.forwardJumpInterval != options.forwardJumpInterval
1158
+ val backwardJumpIntervalChanged =
1159
+ previousOptions.backwardJumpInterval != options.backwardJumpInterval
1160
+ val capabilitiesChanged = previousOptions.capabilities != options.capabilities
1161
+ val notificationButtonsChanged =
1162
+ previousOptions.notificationButtons != options.notificationButtons
1163
+ val appKilledPlaybackBehaviorChanged =
1164
+ previousOptions.appKilledPlaybackBehavior != options.appKilledPlaybackBehavior
1165
+
1166
+ val hasChanged =
1167
+ skipSilenceChanged ||
1168
+ ratingTypeChanged ||
1169
+ shuffleChanged ||
1170
+ progressUpdateEventIntervalChanged ||
1171
+ forwardJumpIntervalChanged ||
1172
+ backwardJumpIntervalChanged ||
1173
+ capabilitiesChanged ||
1174
+ notificationButtonsChanged ||
1175
+ appKilledPlaybackBehaviorChanged
1176
+
1177
+ // Apply only changed properties
1178
+ if (skipSilenceChanged) {
1179
+ skipSilence = options.skipSilence
1180
+ }
1181
+
1182
+ if (ratingTypeChanged) {
1183
+ options.ratingType?.let { ratingType = it }
1184
+ }
1185
+
1186
+ if (shuffleChanged) {
1187
+ shuffleMode = options.shuffle
1188
+ }
1189
+
1190
+ if (progressUpdateEventIntervalChanged) {
1191
+ setProgressUpdateInterval(options.progressUpdateEventInterval)
1192
+ }
1193
+
1194
+ if (capabilitiesChanged || notificationButtonsChanged) {
1195
+ val searchAvailable = browser?.browserManager?.config?.hasSearch ?: false
1196
+ mediaSessionCallback.updateMediaSession(
1197
+ mediaSession,
1198
+ options.capabilities,
1199
+ options.notificationButtons,
1200
+ searchAvailable,
1201
+ )
1202
+ }
1203
+
1204
+ if (hasChanged) {
1205
+ callbacks?.onOptionsChanged(options)
1206
+ }
1207
+ }
1208
+
1209
+ /**
1210
+ * Sets the callbacks for player events.
1211
+ *
1212
+ * @param callbacks The callbacks to set, or null to clear callbacks
1213
+ */
1214
+ fun setCallbacks(callbacks: Callbacks?) {
1215
+ this.callbacks = callbacks
1216
+ }
1217
+
1218
+ /**
1219
+ * Gets the current callbacks instance.
1220
+ *
1221
+ * @return The current callbacks, or null if none are set
1222
+ */
1223
+ fun getCallbacks(): Callbacks? {
1224
+ return this.callbacks
1225
+ }
1226
+
1227
+ fun setMediaSession(mediaSession: MediaSession) {
1228
+ this.mediaSession = mediaSession
1229
+ }
1230
+
1231
+ fun getOptions(): PlayerUpdateOptions {
1232
+ return options
1233
+ }
1234
+
1235
+ /**
1236
+ * Gets the current network connectivity state.
1237
+ *
1238
+ * @return true if device is online, false otherwise
1239
+ */
1240
+ fun getOnline(): Boolean {
1241
+ return networkMonitor.getOnline()
1242
+ }
1243
+
1244
+ /** Initializes the equalizer with the player's audio session ID. */
1245
+ private fun initializeEqualizer() {
1246
+ val audioSessionId = exoPlayer.audioSessionId
1247
+ if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) {
1248
+ Timber.d("Skipping equalizer init - no audio session yet, will init on first playback")
1249
+ return
1250
+ }
1251
+
1252
+ try {
1253
+ equalizerManager =
1254
+ EqualizerManager(audioSessionId).apply {
1255
+ setOnSettingsChanged { settings -> callbacks?.onEqualizerChanged(settings) }
1256
+ }
1257
+ Timber.d("Equalizer initialized with session ID: $audioSessionId")
1258
+ } catch (e: Exception) {
1259
+ Timber.e(e, "Failed to initialize equalizer")
1260
+ equalizerManager = null
1261
+ }
1262
+ }
1263
+
1264
+ /**
1265
+ * Reinitializes the equalizer when the audio session ID changes. Preserves current settings
1266
+ * (enabled state, preset, or custom levels). Also handles first-time initialization when the
1267
+ * equalizer was skipped at startup due to unset audio session ID.
1268
+ */
1269
+ internal fun reinitializeEqualizer(newAudioSessionId: Int) {
1270
+ val oldManager = equalizerManager
1271
+
1272
+ // First-time initialization (skipped at startup because session was unset)
1273
+ if (oldManager == null) {
1274
+ Timber.d("First-time equalizer initialization with session ID: $newAudioSessionId")
1275
+ try {
1276
+ equalizerManager =
1277
+ EqualizerManager(newAudioSessionId).apply {
1278
+ setOnSettingsChanged { settings -> callbacks?.onEqualizerChanged(settings) }
1279
+ }
1280
+ Timber.d("Equalizer initialized with session ID: $newAudioSessionId")
1281
+ } catch (e: Exception) {
1282
+ Timber.e(e, "Failed to initialize equalizer")
1283
+ equalizerManager = null
1284
+ }
1285
+ return
1286
+ }
1287
+
1288
+ // Same session ID, no need to reinitialize
1289
+ if (oldManager.audioSessionId == newAudioSessionId) {
1290
+ return
1291
+ }
1292
+
1293
+ try {
1294
+ // Capture current settings before releasing old equalizer
1295
+ val currentSettings = oldManager.getSettings()
1296
+
1297
+ // Release old equalizer
1298
+ oldManager.release()
1299
+
1300
+ // Create new equalizer with new session ID
1301
+ equalizerManager =
1302
+ EqualizerManager(newAudioSessionId).apply {
1303
+ setOnSettingsChanged { settings -> callbacks?.onEqualizerChanged(settings) }
1304
+ }
1305
+
1306
+ // Restore previous settings if available
1307
+ currentSettings?.let { settings ->
1308
+ if (settings.activePreset != null) {
1309
+ // Restore preset
1310
+ equalizerManager?.setPreset(settings.activePreset)
1311
+ } else if (settings.enabled) {
1312
+ // Restore custom levels
1313
+ equalizerManager?.setLevels(settings.bandLevels)
1314
+ }
1315
+ // Restore enabled state
1316
+ equalizerManager?.setEnabled(settings.enabled)
1317
+ }
1318
+
1319
+ Timber.d("Equalizer reinitialized for new session ID: $newAudioSessionId")
1320
+ } catch (e: Exception) {
1321
+ Timber.e(e, "Failed to reinitialize equalizer")
1322
+ equalizerManager = null
1323
+ }
1324
+ }
1325
+
1326
+ /**
1327
+ * Gets the current equalizer settings.
1328
+ *
1329
+ * @return Current equalizer settings or null if not available
1330
+ */
1331
+ fun getEqualizerSettings(): com.margelo.nitro.audiobrowser.EqualizerSettings? {
1332
+ return equalizerManager?.getSettings()
1333
+ }
1334
+
1335
+ /**
1336
+ * Enables or disables the equalizer.
1337
+ *
1338
+ * @param enabled true to enable, false to disable
1339
+ */
1340
+ fun setEqualizerEnabled(enabled: Boolean) {
1341
+ equalizerManager?.setEnabled(enabled)
1342
+ }
1343
+
1344
+ /**
1345
+ * Applies a preset to the equalizer.
1346
+ *
1347
+ * @param preset Name of the preset to apply
1348
+ */
1349
+ fun setEqualizerPreset(preset: String) {
1350
+ equalizerManager?.setPreset(preset)
1351
+ }
1352
+
1353
+ /**
1354
+ * Sets custom band levels for the equalizer.
1355
+ *
1356
+ * @param levels Array of level values in millibels for each band
1357
+ */
1358
+ fun setEqualizerLevels(levels: DoubleArray) {
1359
+ equalizerManager?.setLevels(levels)
1360
+ }
1361
+
1362
+ // MARK: - Sleep Timer
1363
+
1364
+ /**
1365
+ * Gets the current sleep timer state.
1366
+ *
1367
+ * @return Sleep timer state or null if no timer is active
1368
+ */
1369
+ fun getSleepTimer(): NitroSleepTimer {
1370
+ return when {
1371
+ sleepTimer.time != null -> {
1372
+ NitroSleepTimer.create(SleepTimerTime(sleepTimer.time!!))
1373
+ }
1374
+ sleepTimer.sleepWhenPlayedToEnd -> {
1375
+ NitroSleepTimer.create(SleepTimerEndOfTrack(true))
1376
+ }
1377
+ else -> {
1378
+ NitroSleepTimer.create(NullType.NULL)
1379
+ }
1380
+ }
1381
+ }
1382
+
1383
+ /**
1384
+ * Sets a sleep timer to stop playback after the specified duration.
1385
+ *
1386
+ * @param seconds Number of seconds until playback stops
1387
+ */
1388
+ fun setSleepTimer(seconds: Double) {
1389
+ sleepTimer.sleepAfter(seconds)
1390
+ callbacks?.onSleepTimerChanged(getSleepTimer())
1391
+ }
1392
+
1393
+ /** Sets a sleep timer to stop playback when the current track finishes playing. */
1394
+ fun setSleepTimerToEndOfTrack() {
1395
+ sleepTimer.sleepWhenPlayedToEnd()
1396
+ callbacks?.onSleepTimerChanged(getSleepTimer())
1397
+ }
1398
+
1399
+ /**
1400
+ * Clears the active sleep timer.
1401
+ *
1402
+ * @return true if a timer was cleared, false if no timer was active
1403
+ */
1404
+ fun clearSleepTimer(): Boolean {
1405
+ val wasRunning = sleepTimer.clear()
1406
+ if (wasRunning) {
1407
+ callbacks?.onSleepTimerChanged(NitroSleepTimer.create(NullType.NULL))
1408
+ }
1409
+ return wasRunning
1410
+ }
1411
+
1412
+ /**
1413
+ * Checks if the sleep timer is set to end on track completion and stops playback if so. Called
1414
+ * when a track naturally finishes playing.
1415
+ */
1416
+ internal fun checkSleepTimerOnTrackEnd() {
1417
+ if (sleepTimer.sleepWhenPlayedToEnd) {
1418
+ Timber.d("Sleep timer triggered on track end, stopping playback")
1419
+ sleepTimer.clear()
1420
+ stop()
1421
+ callbacks?.onSleepTimerChanged(NitroSleepTimer.create(NullType.NULL))
1422
+ }
1423
+ }
1424
+
1425
+ /**
1426
+ * Validates that an index is within bounds [0, trackCount).
1427
+ *
1428
+ * @param index The index to validate.
1429
+ * @throws IllegalArgumentException if index is out of bounds.
1430
+ */
1431
+ private fun validateIndex(index: Int) {
1432
+ if (index < 0 || index >= exoPlayer.mediaItemCount) {
1433
+ throw IllegalArgumentException(
1434
+ "Track index $index is out of bounds (size: ${exoPlayer.mediaItemCount})"
1435
+ )
1436
+ }
1437
+ }
1438
+
1439
+ /**
1440
+ * Validates that an insertion index is within bounds [0, trackCount] or -1 (append).
1441
+ *
1442
+ * @param index The index to validate.
1443
+ * @throws IllegalArgumentException if index is out of bounds.
1444
+ */
1445
+ private fun validateInsertIndex(index: Int) {
1446
+ if (index < -1 || index > exoPlayer.mediaItemCount) {
1447
+ throw IllegalArgumentException(
1448
+ "Insert index $index is out of bounds (size: ${exoPlayer.mediaItemCount}, use -1 to append)"
1449
+ )
1450
+ }
1451
+ }
1452
+
1453
+ /**
1454
+ * Gets the MediaSessionCallback for this AudioBrowser.
1455
+ *
1456
+ * @return MediaLibrarySession.Callback instance
1457
+ */
1458
+ fun getMediaSessionCallback(): MediaLibraryService.MediaLibrarySession.Callback {
1459
+ return mediaSessionCallback
1460
+ }
1461
+
1462
+ /**
1463
+ * Notifies external controllers (Android Auto, etc.) that content at the given path has changed.
1464
+ * Controllers subscribed to this path will refresh their UI.
1465
+ *
1466
+ * @param path The path where content has changed
1467
+ */
1468
+ fun notifyContentChanged(path: String) {
1469
+ mediaSessionCallback.notifyContentChanged(path)
1470
+ }
1471
+
1472
+ /**
1473
+ * Returns the recommended artwork size in pixels from the connected media browser (e.g., Android
1474
+ * Auto), or null if not provided.
1475
+ */
1476
+ val artworkSizeHintPixels: Int?
1477
+ get() = mediaSessionCallback.artworkSizeHintPixels
1478
+
1479
+ /** Returns true if the current media item is a live stream. */
1480
+ val isCurrentItemLive: Boolean
1481
+ get() = exoPlayer.isCurrentMediaItemLive
1482
+
1483
+ // MARK: - Buffer Configuration
1484
+
1485
+ /**
1486
+ * Updates the buffer configuration at runtime.
1487
+ *
1488
+ * The new configuration takes effect immediately for future buffering decisions. Already-buffered
1489
+ * data is not affected.
1490
+ *
1491
+ * @param config The new buffer configuration to apply.
1492
+ */
1493
+ fun updateBufferConfig(config: BufferConfig) {
1494
+ loadControl.updateBufferConfig(config)
1495
+ }
1496
+
1497
+ /**
1498
+ * Gets the current buffer configuration.
1499
+ *
1500
+ * @return The current buffer configuration.
1501
+ */
1502
+ fun getBufferConfig(): BufferConfig {
1503
+ return loadControl.getBufferConfig()
1504
+ }
1505
+
1506
+ /** Resets the buffer configuration to defaults. */
1507
+ fun resetBufferConfig() {
1508
+ loadControl.resetToDefaults()
1509
+ }
1510
+ }