@5stones/react-native-audio-browser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1065) hide show
  1. package/AudioBrowser.podspec +43 -0
  2. package/LICENSE +21 -0
  3. package/README.md +5 -0
  4. package/android/CMakeLists.txt +32 -0
  5. package/android/build.gradle +210 -0
  6. package/android/fix-prefab.gradle +51 -0
  7. package/android/gradle.properties +5 -0
  8. package/android/src/main/AndroidManifest.xml +36 -0
  9. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  10. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +1191 -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 +336 -0
  15. package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +1169 -0
  16. package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +103 -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 +150 -0
  19. package/android/src/main/java/com/audiobrowser/extension/EnumExtensions.kt +5 -0
  20. package/android/src/main/java/com/audiobrowser/extension/NumberExt.kt +13 -0
  21. package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +171 -0
  22. package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +251 -0
  23. package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +80 -0
  24. package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +101 -0
  25. package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +125 -0
  26. package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +256 -0
  27. package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +163 -0
  28. package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +177 -0
  29. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +580 -0
  30. package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +578 -0
  31. package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +58 -0
  32. package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +245 -0
  33. package/android/src/main/java/com/audiobrowser/player/Player.kt +1509 -0
  34. package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +230 -0
  35. package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +191 -0
  36. package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +80 -0
  37. package/android/src/main/java/com/audiobrowser/util/AndroidAudioContentTypeFactory.kt +17 -0
  38. package/android/src/main/java/com/audiobrowser/util/BatteryOptimizationHelper.kt +95 -0
  39. package/android/src/main/java/com/audiobrowser/util/BatteryWarningStore.kt +38 -0
  40. package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +155 -0
  41. package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +390 -0
  42. package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +197 -0
  43. package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +75 -0
  44. package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +97 -0
  45. package/android/src/main/java/com/audiobrowser/util/NetworkConnectivityMonitor.kt +121 -0
  46. package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +25 -0
  47. package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
  48. package/android/src/main/java/com/audiobrowser/util/RepeatModeFactory.kt +22 -0
  49. package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
  50. package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +130 -0
  51. package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +50 -0
  52. package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +125 -0
  53. package/android/src/main/res/values/strings.xml +6 -0
  54. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +273 -0
  55. package/android/src/test/java/com/audiobrowser/browser/SimpleBrowserTest.kt +33 -0
  56. package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +156 -0
  57. package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +240 -0
  58. package/ios/Bridge.h +8 -0
  59. package/ios/Browser/BrowserConfig.swift +85 -0
  60. package/ios/Browser/BrowserManager.swift +985 -0
  61. package/ios/Browser/BrowserPathHelper.swift +156 -0
  62. package/ios/Browser/JsonModels.swift +165 -0
  63. package/ios/Browser/SimpleRouter.swift +184 -0
  64. package/ios/CarPlay/CarPlayController.swift +1342 -0
  65. package/ios/CarPlay/RNABCarPlaySceneDelegate.h +15 -0
  66. package/ios/CarPlay/RNABCarPlaySceneDelegate.m +59 -0
  67. package/ios/CarPlay/Track+CarPlay.swift +49 -0
  68. package/ios/Extension/Capability+RemoteCommand.swift +76 -0
  69. package/ios/Extension/ChapterMetadata+AVFoundation.swift +37 -0
  70. package/ios/Extension/TimedMetadata+AVFoundation.swift +126 -0
  71. package/ios/Extension/Track+AVPlayer.swift +68 -0
  72. package/ios/Extension/TrackMetadata+AVFoundation.swift +128 -0
  73. package/ios/Http/HttpClient.swift +237 -0
  74. package/ios/HybridAudioBrowser.swift +1309 -0
  75. package/ios/Model/MediaURL.swift +66 -0
  76. package/ios/Model/PlayerUpdateOptions.swift +116 -0
  77. package/ios/Model/RemoteCommand.swift +71 -0
  78. package/ios/Model/SourceType.swift +6 -0
  79. package/ios/Model/TrackPlayerError.swift +69 -0
  80. package/ios/NowPlayingInfo/MediaItemProperty.swift +78 -0
  81. package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
  82. package/ios/NowPlayingInfo/NowPlayingInfoController.swift +283 -0
  83. package/ios/NowPlayingInfo/NowPlayingInfoKeyValue.swift +6 -0
  84. package/ios/NowPlayingInfo/NowPlayingInfoProperty.swift +220 -0
  85. package/ios/Observer/PlayerItemNotificationObserver.swift +83 -0
  86. package/ios/Observer/PlayerItemPropertyObserver.swift +110 -0
  87. package/ios/Observer/PlayerStateObserver.swift +52 -0
  88. package/ios/Observer/PlayerTimeObserver.swift +109 -0
  89. package/ios/Option/PitchAlgorithms.swift +17 -0
  90. package/ios/Option/SessionCategories.swift +100 -0
  91. package/ios/Option/TimeEventFrequency.swift +18 -0
  92. package/ios/Player/PlaybackProgressUpdateManager.swift +60 -0
  93. package/ios/Player/PlayingStateManager.swift +29 -0
  94. package/ios/Player/RetryManager.swift +281 -0
  95. package/ios/Player/ShuffleOrder.swift +191 -0
  96. package/ios/Player/SleepTimerManager.swift +137 -0
  97. package/ios/RemoteCommand/RemoteCommandController.swift +400 -0
  98. package/ios/Support/RNTrackPlayer-Bridging-Header.h +7 -0
  99. package/ios/TrackPlayer.swift +1590 -0
  100. package/ios/TrackPlayerCallbacks.swift +121 -0
  101. package/ios/Util/Emitter.swift +46 -0
  102. package/ios/Util/LRUCache.swift +182 -0
  103. package/ios/Util/MetadataAdapter.swift +131 -0
  104. package/ios/Util/NetworkMonitor.swift +68 -0
  105. package/ios/Util/OnceValue.swift +70 -0
  106. package/ios/Util/SVGProcessor.swift +56 -0
  107. package/lib/commonjs/AudioBrowser.js +50 -0
  108. package/lib/commonjs/AudioBrowser.js.map +1 -0
  109. package/lib/commonjs/features/battery.js +154 -0
  110. package/lib/commonjs/features/battery.js.map +1 -0
  111. package/lib/commonjs/features/browser.js +271 -0
  112. package/lib/commonjs/features/browser.js.map +1 -0
  113. package/lib/commonjs/features/equalizer.js +69 -0
  114. package/lib/commonjs/features/equalizer.js.map +1 -0
  115. package/lib/commonjs/features/errors.js +165 -0
  116. package/lib/commonjs/features/errors.js.map +1 -0
  117. package/lib/commonjs/features/favorites.js +101 -0
  118. package/lib/commonjs/features/favorites.js.map +1 -0
  119. package/lib/commonjs/features/index.js +160 -0
  120. package/lib/commonjs/features/index.js.map +1 -0
  121. package/lib/commonjs/features/metadata.js +54 -0
  122. package/lib/commonjs/features/metadata.js.map +1 -0
  123. package/lib/commonjs/features/network.js +40 -0
  124. package/lib/commonjs/features/network.js.map +1 -0
  125. package/lib/commonjs/features/nowPlaying.js +61 -0
  126. package/lib/commonjs/features/nowPlaying.js.map +1 -0
  127. package/lib/commonjs/features/output.js +54 -0
  128. package/lib/commonjs/features/output.js.map +1 -0
  129. package/lib/commonjs/features/playback/controls.js +79 -0
  130. package/lib/commonjs/features/playback/controls.js.map +1 -0
  131. package/lib/commonjs/features/playback/index.js +83 -0
  132. package/lib/commonjs/features/playback/index.js.map +1 -0
  133. package/lib/commonjs/features/playback/playWhenReady.js +55 -0
  134. package/lib/commonjs/features/playback/playWhenReady.js.map +1 -0
  135. package/lib/commonjs/features/playback/playing.js +41 -0
  136. package/lib/commonjs/features/playback/playing.js.map +1 -0
  137. package/lib/commonjs/features/playback/progress.js +104 -0
  138. package/lib/commonjs/features/playback/progress.js.map +1 -0
  139. package/lib/commonjs/features/playback/rate.js +29 -0
  140. package/lib/commonjs/features/playback/rate.js.map +1 -0
  141. package/lib/commonjs/features/playback/state.js +62 -0
  142. package/lib/commonjs/features/playback/state.js.map +1 -0
  143. package/lib/commonjs/features/playback/volume.js +68 -0
  144. package/lib/commonjs/features/playback/volume.js.map +1 -0
  145. package/lib/commonjs/features/player/index.js +28 -0
  146. package/lib/commonjs/features/player/index.js.map +1 -0
  147. package/lib/commonjs/features/player/options.js +182 -0
  148. package/lib/commonjs/features/player/options.js.map +1 -0
  149. package/lib/commonjs/features/player/setup.js +143 -0
  150. package/lib/commonjs/features/player/setup.js.map +1 -0
  151. package/lib/commonjs/features/queue/activeTrack.js +52 -0
  152. package/lib/commonjs/features/queue/activeTrack.js.map +1 -0
  153. package/lib/commonjs/features/queue/index.js +50 -0
  154. package/lib/commonjs/features/queue/index.js.map +1 -0
  155. package/lib/commonjs/features/queue/queue.js +177 -0
  156. package/lib/commonjs/features/queue/queue.js.map +1 -0
  157. package/lib/commonjs/features/queue/repeatMode.js +58 -0
  158. package/lib/commonjs/features/queue/repeatMode.js.map +1 -0
  159. package/lib/commonjs/features/queue/shuffle.js +57 -0
  160. package/lib/commonjs/features/queue/shuffle.js.map +1 -0
  161. package/lib/commonjs/features/rating.js +2 -0
  162. package/lib/commonjs/features/rating.js.map +1 -0
  163. package/lib/commonjs/features/remoteControls.js +286 -0
  164. package/lib/commonjs/features/remoteControls.js.map +1 -0
  165. package/lib/commonjs/features/sleepTimer.js +164 -0
  166. package/lib/commonjs/features/sleepTimer.js.map +1 -0
  167. package/lib/commonjs/index.js +22 -0
  168. package/lib/commonjs/index.js.map +1 -0
  169. package/lib/commonjs/native.js +9 -0
  170. package/lib/commonjs/native.js.map +1 -0
  171. package/lib/commonjs/native.web.js +10 -0
  172. package/lib/commonjs/native.web.js.map +1 -0
  173. package/lib/commonjs/package.json +1 -0
  174. package/lib/commonjs/specs/audio-browser.nitro.js +6 -0
  175. package/lib/commonjs/specs/audio-browser.nitro.js.map +1 -0
  176. package/lib/commonjs/types/browser-native.js +6 -0
  177. package/lib/commonjs/types/browser-native.js.map +1 -0
  178. package/lib/commonjs/types/browser-nodes.js +6 -0
  179. package/lib/commonjs/types/browser-nodes.js.map +1 -0
  180. package/lib/commonjs/types/browser.js +6 -0
  181. package/lib/commonjs/types/browser.js.map +1 -0
  182. package/lib/commonjs/types/index.js +28 -0
  183. package/lib/commonjs/types/index.js.map +1 -0
  184. package/lib/commonjs/types/player.js +2 -0
  185. package/lib/commonjs/types/player.js.map +1 -0
  186. package/lib/commonjs/utils/LazyNativeEmitter.js +58 -0
  187. package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -0
  188. package/lib/commonjs/utils/NativeUpdatedValue.js +59 -0
  189. package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -0
  190. package/lib/commonjs/utils/resolveAssetSource.js +11 -0
  191. package/lib/commonjs/utils/resolveAssetSource.js.map +1 -0
  192. package/lib/commonjs/utils/useDebug.js +221 -0
  193. package/lib/commonjs/utils/useDebug.js.map +1 -0
  194. package/lib/commonjs/utils/useNativeUpdatedValue.js +44 -0
  195. package/lib/commonjs/utils/useNativeUpdatedValue.js.map +1 -0
  196. package/lib/commonjs/web/NativeAudioBrowser.js +668 -0
  197. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -0
  198. package/lib/commonjs/web/SimpleRouter.js +144 -0
  199. package/lib/commonjs/web/SimpleRouter.js.map +1 -0
  200. package/lib/commonjs/web/TrackPlayer/Event.js +19 -0
  201. package/lib/commonjs/web/TrackPlayer/Event.js.map +1 -0
  202. package/lib/commonjs/web/TrackPlayer/Player.js +276 -0
  203. package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -0
  204. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +284 -0
  205. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  206. package/lib/commonjs/web/TrackPlayer/RepeatMode.js +12 -0
  207. package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -0
  208. package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js +13 -0
  209. package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
  210. package/lib/commonjs/web/TrackPlayer/SleepTimer.js +75 -0
  211. package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -0
  212. package/lib/commonjs/web/TrackPlayer/State.js +18 -0
  213. package/lib/commonjs/web/TrackPlayer/State.js.map +1 -0
  214. package/lib/commonjs/web/TrackPlayer/index.js +52 -0
  215. package/lib/commonjs/web/TrackPlayer/index.js.map +1 -0
  216. package/lib/commonjs/web/browser/BrowserManager.js +594 -0
  217. package/lib/commonjs/web/browser/BrowserManager.js.map +1 -0
  218. package/lib/commonjs/web/browser/FavoriteManager.js +80 -0
  219. package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -0
  220. package/lib/commonjs/web/browser/NavigationErrorManager.js +106 -0
  221. package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -0
  222. package/lib/commonjs/web/browser/SearchManager.js +80 -0
  223. package/lib/commonjs/web/browser/SearchManager.js.map +1 -0
  224. package/lib/commonjs/web/http/HttpClient.js +81 -0
  225. package/lib/commonjs/web/http/HttpClient.js.map +1 -0
  226. package/lib/commonjs/web/http/RequestConfigBuilder.js +294 -0
  227. package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -0
  228. package/lib/commonjs/web/player/NowPlayingManager.js +70 -0
  229. package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -0
  230. package/lib/commonjs/web/player/OptionsManager.js +88 -0
  231. package/lib/commonjs/web/player/OptionsManager.js.map +1 -0
  232. package/lib/commonjs/web/util/BrowserPathHelper.js +138 -0
  233. package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -0
  234. package/lib/commonjs/web/util/shuffle.js +21 -0
  235. package/lib/commonjs/web/util/shuffle.js.map +1 -0
  236. package/lib/module/AudioBrowser.js +7 -0
  237. package/lib/module/AudioBrowser.js.map +1 -0
  238. package/lib/module/features/battery.js +144 -0
  239. package/lib/module/features/battery.js.map +1 -0
  240. package/lib/module/features/browser.js +257 -0
  241. package/lib/module/features/browser.js.map +1 -0
  242. package/lib/module/features/equalizer.js +60 -0
  243. package/lib/module/features/equalizer.js.map +1 -0
  244. package/lib/module/features/errors.js +156 -0
  245. package/lib/module/features/errors.js.map +1 -0
  246. package/lib/module/features/favorites.js +95 -0
  247. package/lib/module/features/favorites.js.map +1 -0
  248. package/lib/module/features/index.js +26 -0
  249. package/lib/module/features/index.js.map +1 -0
  250. package/lib/module/features/metadata.js +51 -0
  251. package/lib/module/features/metadata.js.map +1 -0
  252. package/lib/module/features/network.js +35 -0
  253. package/lib/module/features/network.js.map +1 -0
  254. package/lib/module/features/nowPlaying.js +54 -0
  255. package/lib/module/features/nowPlaying.js.map +1 -0
  256. package/lib/module/features/output.js +47 -0
  257. package/lib/module/features/output.js.map +1 -0
  258. package/lib/module/features/playback/controls.js +69 -0
  259. package/lib/module/features/playback/controls.js.map +1 -0
  260. package/lib/module/features/playback/index.js +10 -0
  261. package/lib/module/features/playback/index.js.map +1 -0
  262. package/lib/module/features/playback/playWhenReady.js +49 -0
  263. package/lib/module/features/playback/playWhenReady.js.map +1 -0
  264. package/lib/module/features/playback/playing.js +36 -0
  265. package/lib/module/features/playback/playing.js.map +1 -0
  266. package/lib/module/features/playback/progress.js +98 -0
  267. package/lib/module/features/playback/progress.js.map +1 -0
  268. package/lib/module/features/playback/rate.js +25 -0
  269. package/lib/module/features/playback/rate.js.map +1 -0
  270. package/lib/module/features/playback/state.js +57 -0
  271. package/lib/module/features/playback/state.js.map +1 -0
  272. package/lib/module/features/playback/volume.js +60 -0
  273. package/lib/module/features/playback/volume.js.map +1 -0
  274. package/lib/module/features/player/index.js +5 -0
  275. package/lib/module/features/player/index.js.map +1 -0
  276. package/lib/module/features/player/options.js +176 -0
  277. package/lib/module/features/player/options.js.map +1 -0
  278. package/lib/module/features/player/setup.js +140 -0
  279. package/lib/module/features/player/setup.js.map +1 -0
  280. package/lib/module/features/queue/activeTrack.js +46 -0
  281. package/lib/module/features/queue/activeTrack.js.map +1 -0
  282. package/lib/module/features/queue/index.js +7 -0
  283. package/lib/module/features/queue/index.js.map +1 -0
  284. package/lib/module/features/queue/queue.js +162 -0
  285. package/lib/module/features/queue/queue.js.map +1 -0
  286. package/lib/module/features/queue/repeatMode.js +52 -0
  287. package/lib/module/features/queue/repeatMode.js.map +1 -0
  288. package/lib/module/features/queue/shuffle.js +50 -0
  289. package/lib/module/features/queue/shuffle.js.map +1 -0
  290. package/lib/module/features/rating.js +2 -0
  291. package/lib/module/features/rating.js.map +1 -0
  292. package/lib/module/features/remoteControls.js +275 -0
  293. package/lib/module/features/remoteControls.js.map +1 -0
  294. package/lib/module/features/sleepTimer.js +155 -0
  295. package/lib/module/features/sleepTimer.js.map +1 -0
  296. package/lib/module/index.js +6 -0
  297. package/lib/module/index.js.map +1 -0
  298. package/lib/module/native.js +5 -0
  299. package/lib/module/native.js.map +1 -0
  300. package/lib/module/native.web.js +7 -0
  301. package/lib/module/native.web.js.map +1 -0
  302. package/lib/module/package.json +1 -0
  303. package/lib/module/specs/audio-browser.nitro.js +4 -0
  304. package/lib/module/specs/audio-browser.nitro.js.map +1 -0
  305. package/lib/module/types/browser-native.js +4 -0
  306. package/lib/module/types/browser-native.js.map +1 -0
  307. package/lib/module/types/browser-nodes.js +4 -0
  308. package/lib/module/types/browser-nodes.js.map +1 -0
  309. package/lib/module/types/browser.js +4 -0
  310. package/lib/module/types/browser.js.map +1 -0
  311. package/lib/module/types/index.js +5 -0
  312. package/lib/module/types/index.js.map +1 -0
  313. package/lib/module/types/player.js +2 -0
  314. package/lib/module/types/player.js.map +1 -0
  315. package/lib/module/utils/LazyNativeEmitter.js +53 -0
  316. package/lib/module/utils/LazyNativeEmitter.js.map +1 -0
  317. package/lib/module/utils/NativeUpdatedValue.js +54 -0
  318. package/lib/module/utils/NativeUpdatedValue.js.map +1 -0
  319. package/lib/module/utils/resolveAssetSource.js +7 -0
  320. package/lib/module/utils/resolveAssetSource.js.map +1 -0
  321. package/lib/module/utils/useDebug.js +218 -0
  322. package/lib/module/utils/useDebug.js.map +1 -0
  323. package/lib/module/utils/useNativeUpdatedValue.js +40 -0
  324. package/lib/module/utils/useNativeUpdatedValue.js.map +1 -0
  325. package/lib/module/web/NativeAudioBrowser.js +664 -0
  326. package/lib/module/web/NativeAudioBrowser.js.map +1 -0
  327. package/lib/module/web/SimpleRouter.js +139 -0
  328. package/lib/module/web/SimpleRouter.js.map +1 -0
  329. package/lib/module/web/TrackPlayer/Event.js +15 -0
  330. package/lib/module/web/TrackPlayer/Event.js.map +1 -0
  331. package/lib/module/web/TrackPlayer/Player.js +271 -0
  332. package/lib/module/web/TrackPlayer/Player.js.map +1 -0
  333. package/lib/module/web/TrackPlayer/PlaylistPlayer.js +279 -0
  334. package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  335. package/lib/module/web/TrackPlayer/RepeatMode.js +8 -0
  336. package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -0
  337. package/lib/module/web/TrackPlayer/SetupNotCalledError.js +8 -0
  338. package/lib/module/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
  339. package/lib/module/web/TrackPlayer/SleepTimer.js +70 -0
  340. package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -0
  341. package/lib/module/web/TrackPlayer/State.js +14 -0
  342. package/lib/module/web/TrackPlayer/State.js.map +1 -0
  343. package/lib/module/web/TrackPlayer/index.js +7 -0
  344. package/lib/module/web/TrackPlayer/index.js.map +1 -0
  345. package/lib/module/web/browser/BrowserManager.js +590 -0
  346. package/lib/module/web/browser/BrowserManager.js.map +1 -0
  347. package/lib/module/web/browser/FavoriteManager.js +75 -0
  348. package/lib/module/web/browser/FavoriteManager.js.map +1 -0
  349. package/lib/module/web/browser/NavigationErrorManager.js +101 -0
  350. package/lib/module/web/browser/NavigationErrorManager.js.map +1 -0
  351. package/lib/module/web/browser/SearchManager.js +76 -0
  352. package/lib/module/web/browser/SearchManager.js.map +1 -0
  353. package/lib/module/web/http/HttpClient.js +76 -0
  354. package/lib/module/web/http/HttpClient.js.map +1 -0
  355. package/lib/module/web/http/RequestConfigBuilder.js +291 -0
  356. package/lib/module/web/http/RequestConfigBuilder.js.map +1 -0
  357. package/lib/module/web/player/NowPlayingManager.js +65 -0
  358. package/lib/module/web/player/NowPlayingManager.js.map +1 -0
  359. package/lib/module/web/player/OptionsManager.js +83 -0
  360. package/lib/module/web/player/OptionsManager.js.map +1 -0
  361. package/lib/module/web/util/BrowserPathHelper.js +134 -0
  362. package/lib/module/web/util/BrowserPathHelper.js.map +1 -0
  363. package/lib/module/web/util/shuffle.js +17 -0
  364. package/lib/module/web/util/shuffle.js.map +1 -0
  365. package/lib/typescript/src/AudioBrowser.d.ts +5 -0
  366. package/lib/typescript/src/AudioBrowser.d.ts.map +1 -0
  367. package/lib/typescript/src/features/battery.d.ts +112 -0
  368. package/lib/typescript/src/features/battery.d.ts.map +1 -0
  369. package/lib/typescript/src/features/browser.d.ts +68 -0
  370. package/lib/typescript/src/features/browser.d.ts.map +1 -0
  371. package/lib/typescript/src/features/equalizer.d.ts +35 -0
  372. package/lib/typescript/src/features/equalizer.d.ts.map +1 -0
  373. package/lib/typescript/src/features/errors.d.ts +136 -0
  374. package/lib/typescript/src/features/errors.d.ts.map +1 -0
  375. package/lib/typescript/src/features/favorites.d.ts +84 -0
  376. package/lib/typescript/src/features/favorites.d.ts.map +1 -0
  377. package/lib/typescript/src/features/index.d.ts +23 -0
  378. package/lib/typescript/src/features/index.d.ts.map +1 -0
  379. package/lib/typescript/src/features/metadata.d.ts +103 -0
  380. package/lib/typescript/src/features/metadata.d.ts.map +1 -0
  381. package/lib/typescript/src/features/network.d.ts +18 -0
  382. package/lib/typescript/src/features/network.d.ts.map +1 -0
  383. package/lib/typescript/src/features/nowPlaying.d.ts +36 -0
  384. package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -0
  385. package/lib/typescript/src/features/output.d.ts +28 -0
  386. package/lib/typescript/src/features/output.d.ts.map +1 -0
  387. package/lib/typescript/src/features/playback/controls.d.ts +40 -0
  388. package/lib/typescript/src/features/playback/controls.d.ts.map +1 -0
  389. package/lib/typescript/src/features/playback/index.d.ts +8 -0
  390. package/lib/typescript/src/features/playback/index.d.ts.map +1 -0
  391. package/lib/typescript/src/features/playback/playWhenReady.d.ts +30 -0
  392. package/lib/typescript/src/features/playback/playWhenReady.d.ts.map +1 -0
  393. package/lib/typescript/src/features/playback/playing.d.ts +21 -0
  394. package/lib/typescript/src/features/playback/playing.d.ts.map +1 -0
  395. package/lib/typescript/src/features/playback/progress.d.ts +51 -0
  396. package/lib/typescript/src/features/playback/progress.d.ts.map +1 -0
  397. package/lib/typescript/src/features/playback/rate.d.ts +12 -0
  398. package/lib/typescript/src/features/playback/rate.d.ts.map +1 -0
  399. package/lib/typescript/src/features/playback/state.d.ts +43 -0
  400. package/lib/typescript/src/features/playback/state.d.ts.map +1 -0
  401. package/lib/typescript/src/features/playback/volume.d.ts +32 -0
  402. package/lib/typescript/src/features/playback/volume.d.ts.map +1 -0
  403. package/lib/typescript/src/features/player/index.d.ts +3 -0
  404. package/lib/typescript/src/features/player/index.d.ts.map +1 -0
  405. package/lib/typescript/src/features/player/options.d.ts +413 -0
  406. package/lib/typescript/src/features/player/options.d.ts.map +1 -0
  407. package/lib/typescript/src/features/player/setup.d.ts +471 -0
  408. package/lib/typescript/src/features/player/setup.d.ts.map +1 -0
  409. package/lib/typescript/src/features/queue/activeTrack.d.ts +38 -0
  410. package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -0
  411. package/lib/typescript/src/features/queue/index.d.ts +5 -0
  412. package/lib/typescript/src/features/queue/index.d.ts.map +1 -0
  413. package/lib/typescript/src/features/queue/queue.d.ts +111 -0
  414. package/lib/typescript/src/features/queue/queue.d.ts.map +1 -0
  415. package/lib/typescript/src/features/queue/repeatMode.d.ts +34 -0
  416. package/lib/typescript/src/features/queue/repeatMode.d.ts.map +1 -0
  417. package/lib/typescript/src/features/queue/shuffle.d.ts +27 -0
  418. package/lib/typescript/src/features/queue/shuffle.d.ts.map +1 -0
  419. package/lib/typescript/src/features/rating.d.ts +14 -0
  420. package/lib/typescript/src/features/rating.d.ts.map +1 -0
  421. package/lib/typescript/src/features/remoteControls.d.ts +164 -0
  422. package/lib/typescript/src/features/remoteControls.d.ts.map +1 -0
  423. package/lib/typescript/src/features/sleepTimer.d.ts +80 -0
  424. package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -0
  425. package/lib/typescript/src/index.d.ts +4 -0
  426. package/lib/typescript/src/index.d.ts.map +1 -0
  427. package/lib/typescript/src/native.d.ts +3 -0
  428. package/lib/typescript/src/native.d.ts.map +1 -0
  429. package/lib/typescript/src/native.web.d.ts +3 -0
  430. package/lib/typescript/src/native.web.d.ts.map +1 -0
  431. package/lib/typescript/src/specs/audio-browser.nitro.d.ts +242 -0
  432. package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -0
  433. package/lib/typescript/src/types/browser-native.d.ts +39 -0
  434. package/lib/typescript/src/types/browser-native.d.ts.map +1 -0
  435. package/lib/typescript/src/types/browser-nodes.d.ts +153 -0
  436. package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -0
  437. package/lib/typescript/src/types/browser.d.ts +710 -0
  438. package/lib/typescript/src/types/browser.d.ts.map +1 -0
  439. package/lib/typescript/src/types/index.d.ts +3 -0
  440. package/lib/typescript/src/types/index.d.ts.map +1 -0
  441. package/lib/typescript/src/types/player.d.ts +64 -0
  442. package/lib/typescript/src/types/player.d.ts.map +1 -0
  443. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +35 -0
  444. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -0
  445. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +39 -0
  446. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -0
  447. package/lib/typescript/src/utils/resolveAssetSource.d.ts +4 -0
  448. package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -0
  449. package/lib/typescript/src/utils/useDebug.d.ts +65 -0
  450. package/lib/typescript/src/utils/useDebug.d.ts.map +1 -0
  451. package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts +14 -0
  452. package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts.map +1 -0
  453. package/lib/typescript/src/web/NativeAudioBrowser.d.ts +176 -0
  454. package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -0
  455. package/lib/typescript/src/web/SimpleRouter.d.ts +40 -0
  456. package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -0
  457. package/lib/typescript/src/web/TrackPlayer/Event.d.ts +11 -0
  458. package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +1 -0
  459. package/lib/typescript/src/web/TrackPlayer/Player.d.ts +71 -0
  460. package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +1 -0
  461. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +39 -0
  462. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +1 -0
  463. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +6 -0
  464. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +1 -0
  465. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +4 -0
  466. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +1 -0
  467. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +34 -0
  468. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +1 -0
  469. package/lib/typescript/src/web/TrackPlayer/State.d.ts +13 -0
  470. package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +1 -0
  471. package/lib/typescript/src/web/TrackPlayer/index.d.ts +5 -0
  472. package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +1 -0
  473. package/lib/typescript/src/web/browser/BrowserManager.d.ts +154 -0
  474. package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +1 -0
  475. package/lib/typescript/src/web/browser/FavoriteManager.d.ts +42 -0
  476. package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +1 -0
  477. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +40 -0
  478. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +1 -0
  479. package/lib/typescript/src/web/browser/SearchManager.d.ts +22 -0
  480. package/lib/typescript/src/web/browser/SearchManager.d.ts.map +1 -0
  481. package/lib/typescript/src/web/http/HttpClient.d.ts +25 -0
  482. package/lib/typescript/src/web/http/HttpClient.d.ts.map +1 -0
  483. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +98 -0
  484. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +1 -0
  485. package/lib/typescript/src/web/player/NowPlayingManager.d.ts +34 -0
  486. package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +1 -0
  487. package/lib/typescript/src/web/player/OptionsManager.d.ts +32 -0
  488. package/lib/typescript/src/web/player/OptionsManager.d.ts.map +1 -0
  489. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +69 -0
  490. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +1 -0
  491. package/lib/typescript/src/web/util/shuffle.d.ts +8 -0
  492. package/lib/typescript/src/web/util/shuffle.d.ts.map +1 -0
  493. package/nitro.json +24 -0
  494. package/nitrogen/generated/.gitattributes +1 -0
  495. package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +88 -0
  496. package/nitrogen/generated/android/AudioBrowser+autolinking.gradle +27 -0
  497. package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +124 -0
  498. package/nitrogen/generated/android/AudioBrowserOnLoad.hpp +25 -0
  499. package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +68 -0
  500. package/nitrogen/generated/android/c++/JAndroidAudioOffloadSettings.hpp +61 -0
  501. package/nitrogen/generated/android/c++/JAndroidOptions.hpp +86 -0
  502. package/nitrogen/generated/android/c++/JAndroidPlayerWakeMode.hpp +62 -0
  503. package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
  504. package/nitrogen/generated/android/c++/JAppKilledPlaybackBehavior.hpp +62 -0
  505. package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +163 -0
  506. package/nitrogen/generated/android/c++/JBatteryOptimizationStatus.hpp +62 -0
  507. package/nitrogen/generated/android/c++/JBatteryOptimizationStatusChangedEvent.hpp +58 -0
  508. package/nitrogen/generated/android/c++/JBatteryWarningPendingChangedEvent.hpp +57 -0
  509. package/nitrogen/generated/android/c++/JBrowseError.hpp +57 -0
  510. package/nitrogen/generated/android/c++/JBrowseResult.cpp +26 -0
  511. package/nitrogen/generated/android/c++/JBrowseResult.hpp +83 -0
  512. package/nitrogen/generated/android/c++/JBrowserSourceCallbackParam.hpp +76 -0
  513. package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +65 -0
  514. package/nitrogen/generated/android/c++/JChapterMetadata.hpp +70 -0
  515. package/nitrogen/generated/android/c++/JEqualizerSettings.hpp +125 -0
  516. package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +71 -0
  517. package/nitrogen/generated/android/c++/JFormatNavigationErrorParams.hpp +72 -0
  518. package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +61 -0
  519. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.hpp +111 -0
  520. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.hpp +134 -0
  521. 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
  522. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +136 -0
  523. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +143 -0
  524. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +157 -0
  525. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  526. package/nitrogen/generated/android/c++/JFunc_void_BatteryOptimizationStatusChangedEvent.hpp +79 -0
  527. package/nitrogen/generated/android/c++/JFunc_void_BatteryWarningPendingChangedEvent.hpp +77 -0
  528. package/nitrogen/generated/android/c++/JFunc_void_EqualizerSettings.hpp +80 -0
  529. package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +88 -0
  530. package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
  531. package/nitrogen/generated/android/c++/JFunc_void_NavigationErrorEvent.hpp +83 -0
  532. package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +89 -0
  533. package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +98 -0
  534. package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +83 -0
  535. package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +88 -0
  536. package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +81 -0
  537. package/nitrogen/generated/android/c++/JFunc_void_PlaybackPlayWhenReadyChangedEvent.hpp +77 -0
  538. package/nitrogen/generated/android/c++/JFunc_void_PlaybackProgressUpdatedEvent.hpp +77 -0
  539. package/nitrogen/generated/android/c++/JFunc_void_PlaybackQueueEndedEvent.hpp +77 -0
  540. package/nitrogen/generated/android/c++/JFunc_void_PlayingState.hpp +77 -0
  541. package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpBackwardEvent.hpp +77 -0
  542. package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpForwardEvent.hpp +77 -0
  543. package/nitrogen/generated/android/c++/JFunc_void_RemotePlayIdEvent.hpp +79 -0
  544. package/nitrogen/generated/android/c++/JFunc_void_RemotePlaySearchEvent.hpp +78 -0
  545. package/nitrogen/generated/android/c++/JFunc_void_RemoteSeekEvent.hpp +77 -0
  546. package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
  547. package/nitrogen/generated/android/c++/JFunc_void_RemoteSkipEvent.hpp +77 -0
  548. package/nitrogen/generated/android/c++/JFunc_void_RepeatModeChangedEvent.hpp +79 -0
  549. package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +79 -0
  550. package/nitrogen/generated/android/c++/JFunc_void_TrackMetadata.hpp +79 -0
  551. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
  552. package/nitrogen/generated/android/c++/JFunc_void_double.hpp +75 -0
  553. package/nitrogen/generated/android/c++/JFunc_void_std__optional_FormattedNavigationError_.hpp +79 -0
  554. package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +89 -0
  555. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.hpp +84 -0
  556. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  557. package/nitrogen/generated/android/c++/JFunc_void_std__vector_ChapterMetadata_.hpp +98 -0
  558. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +105 -0
  559. package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
  560. package/nitrogen/generated/android/c++/JHttpMethod.hpp +74 -0
  561. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +1811 -0
  562. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +250 -0
  563. package/nitrogen/generated/android/c++/JIOSCategory.hpp +71 -0
  564. package/nitrogen/generated/android/c++/JIOSCategoryMode.hpp +80 -0
  565. package/nitrogen/generated/android/c++/JIOSCategoryOptions.hpp +74 -0
  566. package/nitrogen/generated/android/c++/JIOSCategoryPolicy.hpp +62 -0
  567. package/nitrogen/generated/android/c++/JImageContext.hpp +61 -0
  568. package/nitrogen/generated/android/c++/JImageQueryParams.hpp +62 -0
  569. package/nitrogen/generated/android/c++/JImageSource.hpp +86 -0
  570. package/nitrogen/generated/android/c++/JIosOutput.hpp +67 -0
  571. package/nitrogen/generated/android/c++/JIosOutputType.hpp +86 -0
  572. package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +153 -0
  573. package/nitrogen/generated/android/c++/JMediaTransformParams.hpp +69 -0
  574. package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +196 -0
  575. package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +147 -0
  576. package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +105 -0
  577. package/nitrogen/generated/android/c++/JNavigationError.hpp +72 -0
  578. package/nitrogen/generated/android/c++/JNavigationErrorEvent.hpp +62 -0
  579. package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +68 -0
  580. package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +86 -0
  581. package/nitrogen/generated/android/c++/JNotificationButton.hpp +68 -0
  582. package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
  583. package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +104 -0
  584. package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +62 -0
  585. package/nitrogen/generated/android/c++/JOptions.hpp +97 -0
  586. package/nitrogen/generated/android/c++/JPartialAndroidSetupPlayerOptions.hpp +104 -0
  587. package/nitrogen/generated/android/c++/JPartialIOSSetupPlayerOptions.hpp +100 -0
  588. package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +96 -0
  589. package/nitrogen/generated/android/c++/JPercentageRating.hpp +57 -0
  590. package/nitrogen/generated/android/c++/JPlayback.hpp +66 -0
  591. package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +83 -0
  592. package/nitrogen/generated/android/c++/JPlaybackError.hpp +61 -0
  593. package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +60 -0
  594. package/nitrogen/generated/android/c++/JPlaybackPlayWhenReadyChangedEvent.hpp +57 -0
  595. package/nitrogen/generated/android/c++/JPlaybackProgressUpdatedEvent.hpp +69 -0
  596. package/nitrogen/generated/android/c++/JPlaybackQueueEndedEvent.hpp +61 -0
  597. package/nitrogen/generated/android/c++/JPlaybackState.hpp +80 -0
  598. package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +101 -0
  599. package/nitrogen/generated/android/c++/JPlayingState.hpp +61 -0
  600. package/nitrogen/generated/android/c++/JProgress.hpp +65 -0
  601. package/nitrogen/generated/android/c++/JRatingType.hpp +74 -0
  602. package/nitrogen/generated/android/c++/JRemoteJumpBackwardEvent.hpp +57 -0
  603. package/nitrogen/generated/android/c++/JRemoteJumpForwardEvent.hpp +57 -0
  604. package/nitrogen/generated/android/c++/JRemotePlayIdEvent.hpp +62 -0
  605. package/nitrogen/generated/android/c++/JRemotePlaySearchEvent.hpp +57 -0
  606. package/nitrogen/generated/android/c++/JRemoteSeekEvent.hpp +57 -0
  607. package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
  608. package/nitrogen/generated/android/c++/JRemoteSkipEvent.hpp +57 -0
  609. package/nitrogen/generated/android/c++/JRepeatMode.hpp +62 -0
  610. package/nitrogen/generated/android/c++/JRepeatModeChangedEvent.hpp +58 -0
  611. package/nitrogen/generated/android/c++/JRequestConfig.hpp +115 -0
  612. package/nitrogen/generated/android/c++/JResolvedTrack.hpp +154 -0
  613. package/nitrogen/generated/android/c++/JRetryConfig.hpp +61 -0
  614. package/nitrogen/generated/android/c++/JSearchMode.hpp +71 -0
  615. package/nitrogen/generated/android/c++/JSearchParams.hpp +84 -0
  616. package/nitrogen/generated/android/c++/JSleepTimer.cpp +30 -0
  617. package/nitrogen/generated/android/c++/JSleepTimer.hpp +88 -0
  618. package/nitrogen/generated/android/c++/JSleepTimerEndOfTrack.hpp +57 -0
  619. package/nitrogen/generated/android/c++/JSleepTimerTime.hpp +57 -0
  620. package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
  621. package/nitrogen/generated/android/c++/JThumbsRating.hpp +57 -0
  622. package/nitrogen/generated/android/c++/JTimedMetadata.hpp +74 -0
  623. package/nitrogen/generated/android/c++/JTrack.hpp +129 -0
  624. package/nitrogen/generated/android/c++/JTrackMetadata.hpp +118 -0
  625. package/nitrogen/generated/android/c++/JTrackStyle.hpp +59 -0
  626. package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +134 -0
  627. package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
  628. package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.cpp +26 -0
  629. package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.hpp +70 -0
  630. package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.cpp +26 -0
  631. package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.hpp +70 -0
  632. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +34 -0
  633. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +105 -0
  634. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  635. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  636. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +26 -0
  637. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +75 -0
  638. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +24 -0
  639. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioOffloadSettings.kt +41 -0
  640. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +50 -0
  641. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidPlayerWakeMode.kt +22 -0
  642. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
  643. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AppKilledPlaybackBehavior.kt +22 -0
  644. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +72 -0
  645. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AudioBrowserOnLoad.kt +35 -0
  646. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatus.kt +22 -0
  647. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatusChangedEvent.kt +38 -0
  648. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryWarningPendingChangedEvent.kt +38 -0
  649. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseError.kt +38 -0
  650. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseResult.kt +59 -0
  651. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowserSourceCallbackParam.kt +41 -0
  652. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +23 -0
  653. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ChapterMetadata.kt +47 -0
  654. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/EqualizerSettings.kt +59 -0
  655. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FavoriteChangedEvent.kt +41 -0
  656. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNavigationErrorParams.kt +44 -0
  657. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +41 -0
  658. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.kt +80 -0
  659. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.kt +80 -0
  660. 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
  661. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.kt +80 -0
  662. 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
  663. 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
  664. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void.kt +80 -0
  665. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryOptimizationStatusChangedEvent.kt +80 -0
  666. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryWarningPendingChangedEvent.kt +80 -0
  667. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_EqualizerSettings.kt +80 -0
  668. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_FavoriteChangedEvent.kt +80 -0
  669. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_IosOutput.kt +80 -0
  670. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NavigationErrorEvent.kt +80 -0
  671. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NowPlayingMetadata.kt +80 -0
  672. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Options.kt +80 -0
  673. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Playback.kt +80 -0
  674. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackActiveTrackChangedEvent.kt +80 -0
  675. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackErrorEvent.kt +80 -0
  676. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackPlayWhenReadyChangedEvent.kt +80 -0
  677. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackProgressUpdatedEvent.kt +80 -0
  678. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackQueueEndedEvent.kt +80 -0
  679. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlayingState.kt +80 -0
  680. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpBackwardEvent.kt +80 -0
  681. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpForwardEvent.kt +80 -0
  682. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlayIdEvent.kt +80 -0
  683. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlaySearchEvent.kt +80 -0
  684. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSeekEvent.kt +80 -0
  685. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSetRatingEvent.kt +80 -0
  686. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSkipEvent.kt +80 -0
  687. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RepeatModeChangedEvent.kt +80 -0
  688. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TimedMetadata.kt +80 -0
  689. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TrackMetadata.kt +80 -0
  690. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +80 -0
  691. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_double.kt +80 -0
  692. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_FormattedNavigationError_.kt +80 -0
  693. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_ResolvedTrack_.kt +80 -0
  694. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.kt +80 -0
  695. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__string.kt +80 -0
  696. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_ChapterMetadata_.kt +80 -0
  697. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_Track_.kt +80 -0
  698. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HeartRating.kt +38 -0
  699. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HttpMethod.kt +26 -0
  700. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +1137 -0
  701. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategory.kt +25 -0
  702. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryMode.kt +28 -0
  703. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryOptions.kt +26 -0
  704. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryPolicy.kt +22 -0
  705. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageContext.kt +41 -0
  706. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageQueryParams.kt +41 -0
  707. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageSource.kt +47 -0
  708. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutput.kt +44 -0
  709. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +30 -0
  710. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +69 -0
  711. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaTransformParams.kt +41 -0
  712. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +69 -0
  713. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +63 -0
  714. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +53 -0
  715. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationError.kt +47 -0
  716. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorEvent.kt +38 -0
  717. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +24 -0
  718. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +50 -0
  719. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +24 -0
  720. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
  721. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +65 -0
  722. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +41 -0
  723. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +53 -0
  724. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialAndroidSetupPlayerOptions.kt +65 -0
  725. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialIOSSetupPlayerOptions.kt +50 -0
  726. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
  727. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PercentageRating.kt +38 -0
  728. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Playback.kt +41 -0
  729. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackActiveTrackChangedEvent.kt +50 -0
  730. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +41 -0
  731. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorEvent.kt +38 -0
  732. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackPlayWhenReadyChangedEvent.kt +38 -0
  733. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackProgressUpdatedEvent.kt +47 -0
  734. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackQueueEndedEvent.kt +41 -0
  735. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +28 -0
  736. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +71 -0
  737. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayingState.kt +41 -0
  738. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Progress.kt +44 -0
  739. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RatingType.kt +26 -0
  740. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpBackwardEvent.kt +38 -0
  741. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpForwardEvent.kt +38 -0
  742. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlayIdEvent.kt +41 -0
  743. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlaySearchEvent.kt +38 -0
  744. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSeekEvent.kt +38 -0
  745. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSetRatingEvent.kt +38 -0
  746. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSkipEvent.kt +38 -0
  747. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatMode.kt +22 -0
  748. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatModeChangedEvent.kt +38 -0
  749. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RequestConfig.kt +59 -0
  750. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +89 -0
  751. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +41 -0
  752. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +25 -0
  753. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +56 -0
  754. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimer.kt +72 -0
  755. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerEndOfTrack.kt +38 -0
  756. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerTime.kt +38 -0
  757. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StarRating.kt +38 -0
  758. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ThumbsRating.kt +38 -0
  759. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TimedMetadata.kt +50 -0
  760. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +86 -0
  761. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackMetadata.kt +83 -0
  762. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +21 -0
  763. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +66 -0
  764. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
  765. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_AndroidAudioOffloadSettings.kt +59 -0
  766. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_RetryConfig.kt +59 -0
  767. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +85 -0
  768. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_Double.kt +59 -0
  769. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_NotificationButtonLayout.kt +59 -0
  770. package/nitrogen/generated/ios/AudioBrowser+autolinking.rb +60 -0
  771. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +407 -0
  772. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +2822 -0
  773. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +300 -0
  774. package/nitrogen/generated/ios/AudioBrowserAutolinking.mm +33 -0
  775. package/nitrogen/generated/ios/AudioBrowserAutolinking.swift +25 -0
  776. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.cpp +11 -0
  777. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +1190 -0
  778. package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +52 -0
  779. package/nitrogen/generated/ios/swift/AndroidAudioOffloadSettings.swift +85 -0
  780. package/nitrogen/generated/ios/swift/AndroidOptions.swift +125 -0
  781. package/nitrogen/generated/ios/swift/AndroidPlayerWakeMode.swift +44 -0
  782. package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +187 -0
  783. package/nitrogen/generated/ios/swift/AppKilledPlaybackBehavior.swift +44 -0
  784. package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +445 -0
  785. package/nitrogen/generated/ios/swift/BatteryOptimizationStatus.swift +44 -0
  786. package/nitrogen/generated/ios/swift/BatteryOptimizationStatusChangedEvent.swift +36 -0
  787. package/nitrogen/generated/ios/swift/BatteryWarningPendingChangedEvent.swift +36 -0
  788. package/nitrogen/generated/ios/swift/BrowseError.swift +36 -0
  789. package/nitrogen/generated/ios/swift/BrowseResult.swift +18 -0
  790. package/nitrogen/generated/ios/swift/BrowserSourceCallbackParam.swift +86 -0
  791. package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +48 -0
  792. package/nitrogen/generated/ios/swift/ChapterMetadata.swift +107 -0
  793. package/nitrogen/generated/ios/swift/EqualizerSettings.swift +168 -0
  794. package/nitrogen/generated/ios/swift/FavoriteChangedEvent.swift +47 -0
  795. package/nitrogen/generated/ios/swift/FormatNavigationErrorParams.swift +58 -0
  796. package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +47 -0
  797. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.swift +61 -0
  798. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.swift +62 -0
  799. 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 +77 -0
  800. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.swift +62 -0
  801. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +69 -0
  802. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.swift +68 -0
  803. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  804. package/nitrogen/generated/ios/swift/Func_void_BatteryOptimizationStatusChangedEvent.swift +47 -0
  805. package/nitrogen/generated/ios/swift/Func_void_BatteryWarningPendingChangedEvent.swift +47 -0
  806. package/nitrogen/generated/ios/swift/Func_void_EqualizerSettings.swift +47 -0
  807. package/nitrogen/generated/ios/swift/Func_void_FavoriteChangedEvent.swift +47 -0
  808. package/nitrogen/generated/ios/swift/Func_void_IosOutput.swift +47 -0
  809. package/nitrogen/generated/ios/swift/Func_void_NavigationErrorEvent.swift +47 -0
  810. package/nitrogen/generated/ios/swift/Func_void_NowPlayingMetadata.swift +47 -0
  811. package/nitrogen/generated/ios/swift/Func_void_Options.swift +47 -0
  812. package/nitrogen/generated/ios/swift/Func_void_Playback.swift +47 -0
  813. package/nitrogen/generated/ios/swift/Func_void_PlaybackActiveTrackChangedEvent.swift +47 -0
  814. package/nitrogen/generated/ios/swift/Func_void_PlaybackErrorEvent.swift +47 -0
  815. package/nitrogen/generated/ios/swift/Func_void_PlaybackPlayWhenReadyChangedEvent.swift +47 -0
  816. package/nitrogen/generated/ios/swift/Func_void_PlaybackProgressUpdatedEvent.swift +47 -0
  817. package/nitrogen/generated/ios/swift/Func_void_PlaybackQueueEndedEvent.swift +47 -0
  818. package/nitrogen/generated/ios/swift/Func_void_PlayingState.swift +47 -0
  819. package/nitrogen/generated/ios/swift/Func_void_RemoteJumpBackwardEvent.swift +47 -0
  820. package/nitrogen/generated/ios/swift/Func_void_RemoteJumpForwardEvent.swift +47 -0
  821. package/nitrogen/generated/ios/swift/Func_void_RemotePlayIdEvent.swift +47 -0
  822. package/nitrogen/generated/ios/swift/Func_void_RemotePlaySearchEvent.swift +47 -0
  823. package/nitrogen/generated/ios/swift/Func_void_RemoteSeekEvent.swift +47 -0
  824. package/nitrogen/generated/ios/swift/Func_void_RemoteSetRatingEvent.swift +47 -0
  825. package/nitrogen/generated/ios/swift/Func_void_RemoteSkipEvent.swift +47 -0
  826. package/nitrogen/generated/ios/swift/Func_void_RepeatModeChangedEvent.swift +47 -0
  827. package/nitrogen/generated/ios/swift/Func_void_RequestConfig.swift +47 -0
  828. package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +47 -0
  829. package/nitrogen/generated/ios/swift/Func_void_TrackMetadata.swift +47 -0
  830. package/nitrogen/generated/ios/swift/Func_void_bool.swift +47 -0
  831. package/nitrogen/generated/ios/swift/Func_void_double.swift +47 -0
  832. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  833. package/nitrogen/generated/ios/swift/Func_void_std__optional_FormattedNavigationError_.swift +47 -0
  834. package/nitrogen/generated/ios/swift/Func_void_std__optional_ResolvedTrack_.swift +47 -0
  835. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.swift +69 -0
  836. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_RequestConfig__.swift +67 -0
  837. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift +67 -0
  838. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_Track___.swift +67 -0
  839. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  840. package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError_.swift +59 -0
  841. package/nitrogen/generated/ios/swift/Func_void_std__vector_ChapterMetadata_.swift +47 -0
  842. package/nitrogen/generated/ios/swift/Func_void_std__vector_Track_.swift +47 -0
  843. package/nitrogen/generated/ios/swift/HeartRating.swift +36 -0
  844. package/nitrogen/generated/ios/swift/HttpMethod.swift +60 -0
  845. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +181 -0
  846. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +2352 -0
  847. package/nitrogen/generated/ios/swift/IOSCategory.swift +56 -0
  848. package/nitrogen/generated/ios/swift/IOSCategoryMode.swift +68 -0
  849. package/nitrogen/generated/ios/swift/IOSCategoryOptions.swift +60 -0
  850. package/nitrogen/generated/ios/swift/IOSCategoryPolicy.swift +44 -0
  851. package/nitrogen/generated/ios/swift/ImageContext.swift +71 -0
  852. package/nitrogen/generated/ios/swift/ImageQueryParams.swift +85 -0
  853. package/nitrogen/generated/ios/swift/ImageSource.swift +139 -0
  854. package/nitrogen/generated/ios/swift/IosOutput.swift +58 -0
  855. package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
  856. package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +434 -0
  857. package/nitrogen/generated/ios/swift/MediaTransformParams.swift +59 -0
  858. package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +360 -0
  859. package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +275 -0
  860. package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +215 -0
  861. package/nitrogen/generated/ios/swift/NavigationError.swift +100 -0
  862. package/nitrogen/generated/ios/swift/NavigationErrorEvent.swift +48 -0
  863. package/nitrogen/generated/ios/swift/NavigationErrorType.swift +52 -0
  864. package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +187 -0
  865. package/nitrogen/generated/ios/swift/NotificationButton.swift +52 -0
  866. package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +159 -0
  867. package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +351 -0
  868. package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +85 -0
  869. package/nitrogen/generated/ios/swift/Options.swift +148 -0
  870. package/nitrogen/generated/ios/swift/PartialAndroidSetupPlayerOptions.swift +328 -0
  871. package/nitrogen/generated/ios/swift/PartialIOSSetupPlayerOptions.swift +159 -0
  872. package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +157 -0
  873. package/nitrogen/generated/ios/swift/PercentageRating.swift +36 -0
  874. package/nitrogen/generated/ios/swift/Playback.swift +59 -0
  875. package/nitrogen/generated/ios/swift/PlaybackActiveTrackChangedEvent.swift +128 -0
  876. package/nitrogen/generated/ios/swift/PlaybackError.swift +47 -0
  877. package/nitrogen/generated/ios/swift/PlaybackErrorEvent.swift +48 -0
  878. package/nitrogen/generated/ios/swift/PlaybackPlayWhenReadyChangedEvent.swift +36 -0
  879. package/nitrogen/generated/ios/swift/PlaybackProgressUpdatedEvent.swift +69 -0
  880. package/nitrogen/generated/ios/swift/PlaybackQueueEndedEvent.swift +47 -0
  881. package/nitrogen/generated/ios/swift/PlaybackState.swift +68 -0
  882. package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +385 -0
  883. package/nitrogen/generated/ios/swift/PlayingState.swift +47 -0
  884. package/nitrogen/generated/ios/swift/Progress.swift +58 -0
  885. package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
  886. package/nitrogen/generated/ios/swift/RemoteJumpBackwardEvent.swift +36 -0
  887. package/nitrogen/generated/ios/swift/RemoteJumpForwardEvent.swift +36 -0
  888. package/nitrogen/generated/ios/swift/RemotePlayIdEvent.swift +59 -0
  889. package/nitrogen/generated/ios/swift/RemotePlaySearchEvent.swift +36 -0
  890. package/nitrogen/generated/ios/swift/RemoteSeekEvent.swift +36 -0
  891. package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +76 -0
  892. package/nitrogen/generated/ios/swift/RemoteSkipEvent.swift +36 -0
  893. package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
  894. package/nitrogen/generated/ios/swift/RepeatModeChangedEvent.swift +36 -0
  895. package/nitrogen/generated/ios/swift/RequestConfig.swift +298 -0
  896. package/nitrogen/generated/ios/swift/ResolvedTrack.swift +511 -0
  897. package/nitrogen/generated/ios/swift/RetryConfig.swift +59 -0
  898. package/nitrogen/generated/ios/swift/SearchMode.swift +56 -0
  899. package/nitrogen/generated/ios/swift/SearchParams.swift +209 -0
  900. package/nitrogen/generated/ios/swift/SleepTimer.swift +19 -0
  901. package/nitrogen/generated/ios/swift/SleepTimerEndOfTrack.swift +36 -0
  902. package/nitrogen/generated/ios/swift/SleepTimerTime.swift +36 -0
  903. package/nitrogen/generated/ios/swift/StarRating.swift +36 -0
  904. package/nitrogen/generated/ios/swift/ThumbsRating.swift +36 -0
  905. package/nitrogen/generated/ios/swift/TimedMetadata.swift +175 -0
  906. package/nitrogen/generated/ios/swift/Track.swift +488 -0
  907. package/nitrogen/generated/ios/swift/TrackMetadata.swift +505 -0
  908. package/nitrogen/generated/ios/swift/TrackStyle.swift +40 -0
  909. package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +372 -0
  910. package/nitrogen/generated/ios/swift/UpdateOptions.swift +215 -0
  911. package/nitrogen/generated/ios/swift/Variant_Bool_AndroidAudioOffloadSettings.swift +18 -0
  912. package/nitrogen/generated/ios/swift/Variant_Bool_RetryConfig.swift +18 -0
  913. package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
  914. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  915. package/nitrogen/generated/ios/swift/Variant_NullType_NotificationButtonLayout.swift +18 -0
  916. package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +88 -0
  917. package/nitrogen/generated/shared/c++/AndroidAudioOffloadSettings.hpp +79 -0
  918. package/nitrogen/generated/shared/c++/AndroidOptions.hpp +101 -0
  919. package/nitrogen/generated/shared/c++/AndroidPlayerWakeMode.hpp +80 -0
  920. package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +101 -0
  921. package/nitrogen/generated/shared/c++/AppKilledPlaybackBehavior.hpp +80 -0
  922. package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +133 -0
  923. package/nitrogen/generated/shared/c++/BatteryOptimizationStatus.hpp +80 -0
  924. package/nitrogen/generated/shared/c++/BatteryOptimizationStatusChangedEvent.hpp +76 -0
  925. package/nitrogen/generated/shared/c++/BatteryWarningPendingChangedEvent.hpp +75 -0
  926. package/nitrogen/generated/shared/c++/BrowseError.hpp +75 -0
  927. package/nitrogen/generated/shared/c++/BrowserSourceCallbackParam.hpp +81 -0
  928. package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +84 -0
  929. package/nitrogen/generated/shared/c++/ChapterMetadata.hpp +88 -0
  930. package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +105 -0
  931. package/nitrogen/generated/shared/c++/FavoriteChangedEvent.hpp +80 -0
  932. package/nitrogen/generated/shared/c++/FormatNavigationErrorParams.hpp +88 -0
  933. package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +79 -0
  934. package/nitrogen/generated/shared/c++/HeartRating.hpp +75 -0
  935. package/nitrogen/generated/shared/c++/HttpMethod.hpp +96 -0
  936. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +207 -0
  937. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +375 -0
  938. package/nitrogen/generated/shared/c++/IOSCategory.hpp +92 -0
  939. package/nitrogen/generated/shared/c++/IOSCategoryMode.hpp +104 -0
  940. package/nitrogen/generated/shared/c++/IOSCategoryOptions.hpp +96 -0
  941. package/nitrogen/generated/shared/c++/IOSCategoryPolicy.hpp +80 -0
  942. package/nitrogen/generated/shared/c++/ImageContext.hpp +79 -0
  943. package/nitrogen/generated/shared/c++/ImageQueryParams.hpp +80 -0
  944. package/nitrogen/generated/shared/c++/ImageSource.hpp +91 -0
  945. package/nitrogen/generated/shared/c++/IosOutput.hpp +85 -0
  946. package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
  947. package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +123 -0
  948. package/nitrogen/generated/shared/c++/MediaTransformParams.hpp +84 -0
  949. package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +135 -0
  950. package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +131 -0
  951. package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +103 -0
  952. package/nitrogen/generated/shared/c++/NavigationError.hpp +90 -0
  953. package/nitrogen/generated/shared/c++/NavigationErrorEvent.hpp +77 -0
  954. package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +88 -0
  955. package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +101 -0
  956. package/nitrogen/generated/shared/c++/NotificationButton.hpp +88 -0
  957. package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +94 -0
  958. package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +124 -0
  959. package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +80 -0
  960. package/nitrogen/generated/shared/c++/Options.hpp +105 -0
  961. package/nitrogen/generated/shared/c++/PartialAndroidSetupPlayerOptions.hpp +121 -0
  962. package/nitrogen/generated/shared/c++/PartialIOSSetupPlayerOptions.hpp +103 -0
  963. package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +96 -0
  964. package/nitrogen/generated/shared/c++/PercentageRating.hpp +75 -0
  965. package/nitrogen/generated/shared/c++/Playback.hpp +84 -0
  966. package/nitrogen/generated/shared/c++/PlaybackActiveTrackChangedEvent.hpp +93 -0
  967. package/nitrogen/generated/shared/c++/PlaybackError.hpp +79 -0
  968. package/nitrogen/generated/shared/c++/PlaybackErrorEvent.hpp +77 -0
  969. package/nitrogen/generated/shared/c++/PlaybackPlayWhenReadyChangedEvent.hpp +75 -0
  970. package/nitrogen/generated/shared/c++/PlaybackProgressUpdatedEvent.hpp +87 -0
  971. package/nitrogen/generated/shared/c++/PlaybackQueueEndedEvent.hpp +79 -0
  972. package/nitrogen/generated/shared/c++/PlaybackState.hpp +104 -0
  973. package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +119 -0
  974. package/nitrogen/generated/shared/c++/PlayingState.hpp +79 -0
  975. package/nitrogen/generated/shared/c++/Progress.hpp +83 -0
  976. package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
  977. package/nitrogen/generated/shared/c++/RemoteJumpBackwardEvent.hpp +75 -0
  978. package/nitrogen/generated/shared/c++/RemoteJumpForwardEvent.hpp +75 -0
  979. package/nitrogen/generated/shared/c++/RemotePlayIdEvent.hpp +80 -0
  980. package/nitrogen/generated/shared/c++/RemotePlaySearchEvent.hpp +75 -0
  981. package/nitrogen/generated/shared/c++/RemoteSeekEvent.hpp +75 -0
  982. package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +86 -0
  983. package/nitrogen/generated/shared/c++/RemoteSkipEvent.hpp +75 -0
  984. package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
  985. package/nitrogen/generated/shared/c++/RepeatModeChangedEvent.hpp +76 -0
  986. package/nitrogen/generated/shared/c++/RequestConfig.hpp +107 -0
  987. package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +153 -0
  988. package/nitrogen/generated/shared/c++/RetryConfig.hpp +79 -0
  989. package/nitrogen/generated/shared/c++/SearchMode.hpp +92 -0
  990. package/nitrogen/generated/shared/c++/SearchParams.hpp +102 -0
  991. package/nitrogen/generated/shared/c++/SleepTimerEndOfTrack.hpp +75 -0
  992. package/nitrogen/generated/shared/c++/SleepTimerTime.hpp +75 -0
  993. package/nitrogen/generated/shared/c++/StarRating.hpp +75 -0
  994. package/nitrogen/generated/shared/c++/ThumbsRating.hpp +75 -0
  995. package/nitrogen/generated/shared/c++/TimedMetadata.hpp +92 -0
  996. package/nitrogen/generated/shared/c++/Track.hpp +145 -0
  997. package/nitrogen/generated/shared/c++/TrackMetadata.hpp +136 -0
  998. package/nitrogen/generated/shared/c++/TrackStyle.hpp +76 -0
  999. package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +116 -0
  1000. package/nitrogen/generated/shared/c++/UpdateOptions.hpp +103 -0
  1001. package/package.json +120 -0
  1002. package/src/AudioBrowser.ts +4 -0
  1003. package/src/features/battery.ts +176 -0
  1004. package/src/features/browser.ts +315 -0
  1005. package/src/features/equalizer.ts +64 -0
  1006. package/src/features/errors.ts +196 -0
  1007. package/src/features/favorites.ts +102 -0
  1008. package/src/features/index.ts +23 -0
  1009. package/src/features/metadata.ts +130 -0
  1010. package/src/features/network.ts +34 -0
  1011. package/src/features/nowPlaying.ts +56 -0
  1012. package/src/features/output.ts +50 -0
  1013. package/src/features/playback/controls.ts +66 -0
  1014. package/src/features/playback/index.ts +7 -0
  1015. package/src/features/playback/playWhenReady.ts +57 -0
  1016. package/src/features/playback/playing.ts +40 -0
  1017. package/src/features/playback/progress.ts +122 -0
  1018. package/src/features/playback/rate.ts +22 -0
  1019. package/src/features/playback/state.ts +72 -0
  1020. package/src/features/playback/volume.ts +59 -0
  1021. package/src/features/player/index.ts +2 -0
  1022. package/src/features/player/options.ts +479 -0
  1023. package/src/features/player/setup.ts +551 -0
  1024. package/src/features/queue/activeTrack.ts +59 -0
  1025. package/src/features/queue/index.ts +4 -0
  1026. package/src/features/queue/queue.ts +173 -0
  1027. package/src/features/queue/repeatMode.ts +58 -0
  1028. package/src/features/queue/shuffle.ts +49 -0
  1029. package/src/features/rating.ts +17 -0
  1030. package/src/features/remoteControls.ts +341 -0
  1031. package/src/features/sleepTimer.ts +186 -0
  1032. package/src/index.ts +5 -0
  1033. package/src/native.ts +5 -0
  1034. package/src/native.web.ts +4 -0
  1035. package/src/specs/audio-browser.nitro.ts +326 -0
  1036. package/src/types/browser-native.ts +66 -0
  1037. package/src/types/browser-nodes.ts +174 -0
  1038. package/src/types/browser.ts +792 -0
  1039. package/src/types/index.ts +2 -0
  1040. package/src/types/player.ts +69 -0
  1041. package/src/utils/LazyNativeEmitter.ts +58 -0
  1042. package/src/utils/NativeUpdatedValue.ts +56 -0
  1043. package/src/utils/resolveAssetSource.ts +4 -0
  1044. package/src/utils/useDebug.ts +283 -0
  1045. package/src/utils/useNativeUpdatedValue.ts +41 -0
  1046. package/src/web/NativeAudioBrowser.ts +781 -0
  1047. package/src/web/SimpleRouter.ts +177 -0
  1048. package/src/web/TrackPlayer/Event.ts +11 -0
  1049. package/src/web/TrackPlayer/Player.ts +323 -0
  1050. package/src/web/TrackPlayer/PlaylistPlayer.ts +337 -0
  1051. package/src/web/TrackPlayer/RepeatMode.ts +7 -0
  1052. package/src/web/TrackPlayer/SetupNotCalledError.ts +5 -0
  1053. package/src/web/TrackPlayer/SleepTimer.ts +71 -0
  1054. package/src/web/TrackPlayer/State.ts +15 -0
  1055. package/src/web/TrackPlayer/index.ts +4 -0
  1056. package/src/web/browser/BrowserManager.ts +642 -0
  1057. package/src/web/browser/FavoriteManager.ts +77 -0
  1058. package/src/web/browser/NavigationErrorManager.ts +112 -0
  1059. package/src/web/browser/SearchManager.ts +82 -0
  1060. package/src/web/http/HttpClient.ts +107 -0
  1061. package/src/web/http/RequestConfigBuilder.ts +347 -0
  1062. package/src/web/player/NowPlayingManager.ts +83 -0
  1063. package/src/web/player/OptionsManager.ts +101 -0
  1064. package/src/web/util/BrowserPathHelper.ts +147 -0
  1065. package/src/web/util/shuffle.ts +14 -0
@@ -0,0 +1,1191 @@
1
+ package com.audiobrowser
2
+
3
+ import android.content.ComponentName
4
+ import android.content.Context
5
+ import android.content.Intent
6
+ import android.content.ServiceConnection
7
+ import android.os.Handler
8
+ import android.os.IBinder
9
+ import android.os.Looper
10
+ import androidx.annotation.Keep
11
+ import androidx.lifecycle.DefaultLifecycleObserver
12
+ import androidx.lifecycle.LifecycleOwner
13
+ import androidx.lifecycle.ProcessLifecycleOwner
14
+ import androidx.media3.session.MediaBrowser
15
+ import androidx.media3.session.SessionToken
16
+ import com.audiobrowser.browser.BrowserConfig
17
+ import com.audiobrowser.browser.BrowserManager
18
+ import com.audiobrowser.browser.CallbackException
19
+ import com.audiobrowser.browser.ContentNotFoundException
20
+ import com.audiobrowser.browser.HttpStatusException
21
+ import com.audiobrowser.browser.NetworkException
22
+ import com.audiobrowser.extension.NumberExt.Companion.toSeconds
23
+ import com.audiobrowser.http.RequestConfigBuilder
24
+ import com.audiobrowser.model.PlaybackMetadata
25
+ import com.audiobrowser.model.PlayerSetupOptions
26
+ import com.audiobrowser.model.PlayerUpdateOptions
27
+ import com.audiobrowser.util.BatteryOptimizationHelper
28
+ import com.audiobrowser.util.BatteryWarningStore
29
+ import com.audiobrowser.util.BrowserPathHelper
30
+ import com.audiobrowser.util.CoilBitmapLoader
31
+ import com.audiobrowser.util.SystemVolumeMonitor
32
+ import com.facebook.proguard.annotations.DoNotStrip
33
+ import com.google.common.util.concurrent.ListenableFuture
34
+ import com.margelo.nitro.NitroModules
35
+ import com.margelo.nitro.audiobrowser.ChapterMetadata
36
+ import com.margelo.nitro.audiobrowser.TimedMetadata
37
+ import com.margelo.nitro.audiobrowser.TrackMetadata
38
+ import com.margelo.nitro.audiobrowser.BatteryOptimizationStatus
39
+ import com.margelo.nitro.audiobrowser.BatteryOptimizationStatusChangedEvent
40
+ import com.margelo.nitro.audiobrowser.BatteryWarningPendingChangedEvent
41
+ import com.margelo.nitro.audiobrowser.EqualizerSettings
42
+ import com.margelo.nitro.audiobrowser.FavoriteChangedEvent
43
+ import com.margelo.nitro.audiobrowser.FormatNavigationErrorParams
44
+ import com.margelo.nitro.audiobrowser.FormattedNavigationError
45
+ import com.margelo.nitro.audiobrowser.HybridAudioBrowserSpec
46
+ import com.margelo.nitro.audiobrowser.IosOutput
47
+ import com.margelo.nitro.audiobrowser.MediaRequestConfig
48
+ import com.margelo.nitro.audiobrowser.NativeBrowserConfiguration
49
+ import com.margelo.nitro.audiobrowser.NativeUpdateOptions
50
+ import com.margelo.nitro.audiobrowser.NavigationError
51
+ import com.margelo.nitro.audiobrowser.NavigationErrorEvent
52
+ import com.margelo.nitro.audiobrowser.NavigationErrorType
53
+ import com.margelo.nitro.audiobrowser.NowPlayingMetadata
54
+ import com.margelo.nitro.audiobrowser.NowPlayingUpdate
55
+ import com.margelo.nitro.audiobrowser.Options
56
+ import com.margelo.nitro.audiobrowser.PartialSetupPlayerOptions
57
+ import com.margelo.nitro.audiobrowser.Playback
58
+ import com.margelo.nitro.audiobrowser.PlaybackActiveTrackChangedEvent
59
+ import com.margelo.nitro.audiobrowser.PlaybackError
60
+ import com.margelo.nitro.audiobrowser.PlaybackErrorEvent
61
+ import com.margelo.nitro.audiobrowser.PlaybackPlayWhenReadyChangedEvent
62
+ import com.margelo.nitro.audiobrowser.PlaybackProgressUpdatedEvent
63
+ import com.margelo.nitro.audiobrowser.PlaybackQueueEndedEvent
64
+ import com.margelo.nitro.audiobrowser.PlayingState
65
+ import com.margelo.nitro.audiobrowser.Progress
66
+ import com.margelo.nitro.audiobrowser.RemoteJumpBackwardEvent
67
+ import com.margelo.nitro.audiobrowser.RemoteJumpForwardEvent
68
+ import com.margelo.nitro.audiobrowser.RemotePlayIdEvent
69
+ import com.margelo.nitro.audiobrowser.RemotePlaySearchEvent
70
+ import com.margelo.nitro.audiobrowser.RemoteSeekEvent
71
+ import com.margelo.nitro.audiobrowser.RemoteSetRatingEvent
72
+ import com.margelo.nitro.audiobrowser.RemoteSkipEvent
73
+ import com.margelo.nitro.audiobrowser.RepeatMode
74
+ import com.margelo.nitro.audiobrowser.RepeatModeChangedEvent
75
+ import com.margelo.nitro.audiobrowser.RequestConfig
76
+ import com.margelo.nitro.audiobrowser.ResolvedTrack
77
+ import com.margelo.nitro.audiobrowser.SleepTimer
78
+ import com.margelo.nitro.audiobrowser.Track
79
+ import com.margelo.nitro.audiobrowser.UpdateOptions
80
+ import com.margelo.nitro.core.Promise
81
+ import java.util.concurrent.TimeUnit
82
+ import kotlin.coroutines.resume
83
+ import kotlin.coroutines.resumeWithException
84
+ import kotlin.coroutines.suspendCoroutine
85
+ import kotlinx.coroutines.CancellationException
86
+ import kotlinx.coroutines.Job
87
+ import kotlinx.coroutines.MainScope
88
+ import kotlinx.coroutines.cancelChildren
89
+ import kotlinx.coroutines.delay
90
+ import kotlinx.coroutines.launch
91
+ import kotlinx.coroutines.runBlocking
92
+ import timber.log.Timber
93
+
94
+ @Keep
95
+ @DoNotStrip
96
+ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
97
+ private val mainScope = MainScope()
98
+ private var navigationJob: Job? = null
99
+ private val handler = Handler(Looper.getMainLooper())
100
+ private val context =
101
+ NitroModules.applicationContext
102
+ ?: throw IllegalStateException("NitroModules.applicationContext is null")
103
+
104
+ // MARK: Browser state
105
+ private var _configuration =
106
+ NativeBrowserConfiguration(
107
+ path = null,
108
+ request = null,
109
+ media = null,
110
+ artwork = null,
111
+ routes = null,
112
+ singleTrack = null,
113
+ androidControllerOfflineError = null,
114
+ carPlayUpNextButton = null,
115
+ carPlayNowPlayingButtons = null,
116
+ formatNavigationError = null,
117
+ )
118
+
119
+ internal val browserManager =
120
+ BrowserManager().apply {
121
+ setOnPathChanged { path -> onPathChanged(path) }
122
+ setOnContentChanged { content -> onContentChanged(content) }
123
+ setOnTabsChanged { tabs -> onTabsChanged(tabs) }
124
+ }
125
+
126
+ private val systemVolumeMonitor = SystemVolumeMonitor(context)
127
+
128
+ // MARK: Player state
129
+ private var updateOptions: PlayerUpdateOptions = PlayerUpdateOptions()
130
+ private var mediaBrowserFuture: ListenableFuture<MediaBrowser>? = null
131
+ private var setupOptions = PlayerSetupOptions()
132
+ private var connectedService: Service? = null
133
+ private var setupPromise: ((Unit) -> Unit)? = null
134
+
135
+ /** Post callback to main handler for consistent async delivery to JS - avoids deadlocks */
136
+ private fun post(block: () -> Unit) = handler.post(block)
137
+
138
+ // MARK: Browser callbacks
139
+ override var onPathChanged: (String) -> Unit = {}
140
+ override var onContentChanged: (ResolvedTrack?) -> Unit = {}
141
+ override var onTabsChanged: (Array<Track>) -> Unit = {}
142
+ override var onNavigationError: (NavigationErrorEvent) -> Unit = {}
143
+ override var onFormattedNavigationError: (FormattedNavigationError?) -> Unit = {}
144
+
145
+ // MARK: Player callbacks
146
+ override var onPlaybackChanged: (data: Playback) -> Unit = {}
147
+ override var onRemoteBookmark: () -> Unit = {}
148
+ override var onRemoteDislike: () -> Unit = {}
149
+ override var onRemoteJumpBackward: (RemoteJumpBackwardEvent) -> Unit = {}
150
+ override var onRemoteJumpForward: (RemoteJumpForwardEvent) -> Unit = {}
151
+ override var onRemoteLike: () -> Unit = {}
152
+ override var onRemoteNext: () -> Unit = {}
153
+ override var onRemotePause: () -> Unit = {}
154
+ override var onChapterMetadata: (chapters: Array<ChapterMetadata>) -> Unit = {}
155
+ override var onTrackMetadata: (metadata: TrackMetadata) -> Unit = {}
156
+ override var onTimedMetadata: (metadata: TimedMetadata) -> Unit = {}
157
+ override var onPlaybackActiveTrackChanged: (data: PlaybackActiveTrackChangedEvent) -> Unit = {}
158
+ override var onPlaybackError: (data: PlaybackErrorEvent) -> Unit = {}
159
+ override var onPlaybackPlayWhenReadyChanged: (data: PlaybackPlayWhenReadyChangedEvent) -> Unit =
160
+ {}
161
+ override var onPlaybackPlayingState: (data: PlayingState) -> Unit = {}
162
+ override var onPlaybackProgressUpdated: (data: PlaybackProgressUpdatedEvent) -> Unit = {}
163
+ override var onPlaybackQueueEnded: (data: PlaybackQueueEndedEvent) -> Unit = {}
164
+ override var onPlaybackQueueChanged: (queue: Array<Track>) -> Unit = {}
165
+ override var onPlaybackRepeatModeChanged: (data: RepeatModeChangedEvent) -> Unit = {}
166
+ override var onPlaybackShuffleModeChanged: (enabled: Boolean) -> Unit = {}
167
+ override var onRemotePlay: (() -> Unit) = {}
168
+ override var onRemotePlayId: (RemotePlayIdEvent) -> Unit = {}
169
+ override var onRemotePlaySearch: (RemotePlaySearchEvent) -> Unit = {}
170
+ override var onRemotePrevious: () -> Unit = {}
171
+ override var onRemoteSeek: (RemoteSeekEvent) -> Unit = {}
172
+ override var onRemoteSetRating: (RemoteSetRatingEvent) -> Unit = {}
173
+ override var onRemoteSkip: (RemoteSkipEvent) -> Unit = {}
174
+ override var onRemoteStop: () -> Unit = {}
175
+ override var onOptionsChanged: (Options) -> Unit = {}
176
+ override var onFavoriteChanged: (FavoriteChangedEvent) -> Unit = {}
177
+ override var onNowPlayingChanged: (NowPlayingMetadata) -> Unit = {}
178
+ override var onOnlineChanged: (Boolean) -> Unit = {}
179
+ override var onEqualizerChanged: (EqualizerSettings) -> Unit = {}
180
+ override var onSleepTimerChanged: (SleepTimer?) -> Unit = {}
181
+ override var onBatteryWarningPendingChanged: (BatteryWarningPendingChangedEvent) -> Unit = {}
182
+ override var onBatteryOptimizationStatusChanged: (BatteryOptimizationStatusChangedEvent) -> Unit =
183
+ {}
184
+ override var onSystemVolumeChanged: (Double) -> Unit = {}
185
+ override var onIosOutputChanged: (IosOutput) -> Unit = {}
186
+
187
+ // MARK: Remote handlers
188
+ override var handleRemoteBookmark: (() -> Unit)? = null
189
+ override var handleRemoteDislike: (() -> Unit)? = null
190
+ override var handleRemoteJumpBackward: ((RemoteJumpBackwardEvent) -> Unit)? = null
191
+ override var handleRemoteJumpForward: ((RemoteJumpForwardEvent) -> Unit)? = null
192
+ override var handleRemoteLike: (() -> Unit)? = null
193
+ override var handleRemoteNext: (() -> Unit)? = null
194
+ override var handleRemotePause: (() -> Unit)? = null
195
+ override var handleRemotePlay: (() -> Unit)? = null
196
+ override var handleRemotePlayId: ((RemotePlayIdEvent) -> Unit)? = null
197
+ override var handleRemotePlaySearch: ((RemotePlaySearchEvent) -> Unit)? = null
198
+ override var handleRemotePrevious: (() -> Unit)? = null
199
+ override var handleRemoteSeek: ((RemoteSeekEvent) -> Unit)? = null
200
+ override var handleRemoteSkip: (() -> Unit)? = null
201
+ override var handleRemoteStop: (() -> Unit)? = null
202
+
203
+ /** Lifecycle observer to check battery status when app comes to foreground */
204
+ private val lifecycleObserver =
205
+ object : DefaultLifecycleObserver {
206
+ override fun onStart(owner: LifecycleOwner) {
207
+ checkBatteryStatusChange()
208
+ }
209
+ }
210
+
211
+ init {
212
+ // Auto-bind to service if it's already running
213
+ launchInScope {
214
+ try {
215
+ Timber.d("Attempting to auto-bind to existing AudioBrowserService from AudioBrowser")
216
+ val intent = Intent(context, Service::class.java)
217
+ val bound = context.bindService(intent, this@AudioBrowser, Context.BIND_AUTO_CREATE)
218
+ Timber.d("Auto-bind result: $bound")
219
+
220
+ if (!bound) {
221
+ Timber.w("Failed to bind to AudioBrowserService - service may not be running")
222
+ }
223
+ } catch (e: Exception) {
224
+ Timber.e(e, "Failed to auto-bind to AudioBrowserService during initialization")
225
+ }
226
+ }
227
+
228
+ // Observe app lifecycle to check battery status on foreground
229
+ // Must run on main thread as required by LifecycleRegistry.addObserver
230
+ handler.post { ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleObserver) }
231
+
232
+ // Observe system volume changes
233
+ systemVolumeMonitor.setOnVolumeChanged { volume ->
234
+ post { onSystemVolumeChanged(volume) }
235
+ }
236
+ }
237
+
238
+ // ============================================================================
239
+ // MARK: Browser Configuration
240
+ // ============================================================================
241
+
242
+ internal fun buildConfig(): BrowserConfig {
243
+ return BrowserConfig(
244
+ request = _configuration.request,
245
+ media = _configuration.media,
246
+ artwork = _configuration.artwork,
247
+ routes = _configuration.routes,
248
+ singleTrack = _configuration.singleTrack ?: false,
249
+ androidControllerOfflineError = _configuration.androidControllerOfflineError ?: true,
250
+ )
251
+ }
252
+
253
+ /**
254
+ * Returns the artwork configuration for use by CoilBitmapLoader. This provides access to the base
255
+ * request config and artwork-specific config.
256
+ */
257
+ fun getArtworkConfig(): CoilBitmapLoader.ArtworkConfig? {
258
+ val artworkConfig = _configuration.artwork ?: return null
259
+ val baseConfig =
260
+ _configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
261
+ ?: RequestConfig(null, null, null, null, null, null, null, null)
262
+ return CoilBitmapLoader.ArtworkConfig(baseConfig, artworkConfig)
263
+ }
264
+
265
+ /**
266
+ * Creates a request config for media URL transformation by merging base and media configs.
267
+ * Returns null if no media configuration is set.
268
+ */
269
+ fun getMediaRequestConfig(originalUrl: String): MediaRequestConfig? {
270
+ val mediaConfig = _configuration.media ?: return null
271
+
272
+ return try {
273
+ // Create base request config with the original URL as path
274
+ val baseConfig =
275
+ _configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
276
+ ?: RequestConfig(null, null, null, null, null, null, null, null)
277
+ val urlRequestConfig = RequestConfig(null, originalUrl, null, null, null, null, null, null)
278
+ val mergedBaseConfig = RequestConfigBuilder.mergeConfig(baseConfig, urlRequestConfig)
279
+
280
+ // Apply media transformation
281
+ runBlocking { RequestConfigBuilder.mergeConfig(mergedBaseConfig, mediaConfig) }
282
+ } catch (e: Exception) {
283
+ Timber.e(e, "Failed to transform media URL: $originalUrl")
284
+ null
285
+ }
286
+ }
287
+
288
+ private fun hasValidConfiguration(): Boolean {
289
+ // Need at least one browsable route (not just search)
290
+ return _configuration.routes?.any { it.path != BrowserManager.SEARCH_ROUTE_PATH } == true
291
+ }
292
+
293
+ private fun getDefaultPath(): String? {
294
+ return try {
295
+ browserManager.config = buildConfig()
296
+ val tabs = runBlocking { browserManager.queryTabs() }
297
+ if (tabs.isNotEmpty()) {
298
+ Timber.d("Using first tab as default path: ${tabs[0].url}")
299
+ tabs[0].url
300
+ } else {
301
+ Timber.d("Using root path as default: /")
302
+ "/"
303
+ }
304
+ } catch (e: Exception) {
305
+ Timber.e(e, "Failed to get default path, falling back to /")
306
+ "/"
307
+ }
308
+ }
309
+
310
+ // ============================================================================
311
+ // MARK: Browser Properties
312
+ // ============================================================================
313
+
314
+ override var path: String?
315
+ get() = browserManager.getPath()
316
+ set(value) {
317
+ if (hasValidConfiguration()) {
318
+ browserManager.config = buildConfig()
319
+ (value ?: getDefaultPath())?.let { path ->
320
+ clearNavigationError()
321
+
322
+ // Cancel previous navigation to avoid race conditions
323
+ navigationJob?.cancel()
324
+
325
+ navigationJob =
326
+ mainScope.launch {
327
+ try {
328
+ browserManager.navigate(path)
329
+ } catch (e: CancellationException) {
330
+ throw e // Rethrow to properly cancel
331
+ } catch (e: Exception) {
332
+ handleBrowserException(e, path, "setting path: $path")
333
+ }
334
+ }
335
+ }
336
+ }
337
+ }
338
+
339
+ override var tabs: Array<Track>?
340
+ get() = browserManager.getTabs()
341
+ set(value) {}
342
+
343
+ override var configuration: NativeBrowserConfiguration
344
+ get() = _configuration
345
+ set(value) {
346
+ _configuration = value
347
+ browserManager.config = buildConfig()
348
+
349
+ // Notify player that browser configuration is ready (routes/tabs available)
350
+ // This allows Android Auto to start browsing content
351
+ connectedService?.player?.notifyBrowserConfigurationReady()
352
+
353
+ // Navigate to initial path or default to first tab
354
+ (value.path ?: getDefaultPath())?.let { path ->
355
+ clearNavigationError()
356
+
357
+ // Cancel previous navigation to avoid race conditions
358
+ navigationJob?.cancel()
359
+
360
+ navigationJob =
361
+ mainScope.launch {
362
+ try {
363
+ browserManager.navigate(path)
364
+ } catch (e: CancellationException) {
365
+ throw e // Rethrow to properly cancel
366
+ } catch (e: Exception) {
367
+ handleBrowserException(e, path, "setting configuration path: $path")
368
+ }
369
+ }
370
+ }
371
+ }
372
+
373
+ private var navigationError: NavigationError? = null
374
+ private var formattedNavigationError: FormattedNavigationError? = null
375
+
376
+ override fun getNavigationError(): NavigationError? = navigationError
377
+ override fun getFormattedNavigationError(): FormattedNavigationError? = formattedNavigationError
378
+
379
+ /** Creates a default formatted error from a NavigationError */
380
+ private fun defaultFormattedError(error: NavigationError): FormattedNavigationError {
381
+ val title = when (error.code) {
382
+ NavigationErrorType.CONTENT_NOT_FOUND -> "Content Not Found"
383
+ NavigationErrorType.NETWORK_ERROR -> "Network Error"
384
+ NavigationErrorType.HTTP_ERROR -> {
385
+ // Use system-localized HTTP status text (e.g., "Not Found", "Service Unavailable")
386
+ error.statusCode?.let { httpStatusText(it.toInt()) } ?: "Server Error"
387
+ }
388
+ NavigationErrorType.CALLBACK_ERROR -> "Error"
389
+ NavigationErrorType.UNKNOWN_ERROR -> "Error"
390
+ }
391
+ return FormattedNavigationError(title, error.message)
392
+ }
393
+
394
+ /** Returns localized HTTP status text for the given status code */
395
+ private fun httpStatusText(statusCode: Int): String {
396
+ return when (statusCode) {
397
+ 400 -> "Bad Request"
398
+ 401 -> "Unauthorized"
399
+ 403 -> "Forbidden"
400
+ 404 -> "Not Found"
401
+ 405 -> "Method Not Allowed"
402
+ 408 -> "Request Timeout"
403
+ 429 -> "Too Many Requests"
404
+ 500 -> "Internal Server Error"
405
+ 502 -> "Bad Gateway"
406
+ 503 -> "Service Unavailable"
407
+ 504 -> "Gateway Timeout"
408
+ else -> "Server Error"
409
+ }
410
+ }
411
+
412
+ private fun setNavigationError(
413
+ code: NavigationErrorType,
414
+ message: String,
415
+ path: String,
416
+ statusCode: Double? = null,
417
+ statusCodeSuccess: Boolean? = null,
418
+ ) {
419
+ val navError = NavigationError(code, message, statusCode, statusCodeSuccess)
420
+ navigationError = navError
421
+ onNavigationError(NavigationErrorEvent(navigationError))
422
+
423
+ // Format the error (async if using JS callback, sync for defaults)
424
+ val defaultFormatted = defaultFormattedError(navError)
425
+ val formatter = _configuration.formatNavigationError
426
+ if (formatter != null) {
427
+ mainScope.launch {
428
+ try {
429
+ val params = FormatNavigationErrorParams(navError, defaultFormatted, path)
430
+ val customFormatted = formatter(params).await()
431
+ formattedNavigationError = customFormatted ?: defaultFormatted
432
+ } catch (e: Exception) {
433
+ formattedNavigationError = defaultFormatted
434
+ }
435
+ onFormattedNavigationError(formattedNavigationError)
436
+ }
437
+ } else {
438
+ formattedNavigationError = defaultFormatted
439
+ onFormattedNavigationError(formattedNavigationError)
440
+ }
441
+ }
442
+
443
+ /** Maps common browser exceptions to navigation errors */
444
+ private fun handleBrowserException(e: Exception, path: String, logContext: String) {
445
+ when (e) {
446
+ is HttpStatusException -> {
447
+ Timber.e(e, "HTTP error $logContext")
448
+ setNavigationError(
449
+ NavigationErrorType.HTTP_ERROR,
450
+ e.message ?: "Server error",
451
+ path,
452
+ e.statusCode.toDouble(),
453
+ e.statusCode in 200..299,
454
+ )
455
+ }
456
+ is NetworkException -> {
457
+ Timber.e(e, "Network error $logContext")
458
+ setNavigationError(NavigationErrorType.NETWORK_ERROR, e.message ?: "Network request failed", path)
459
+ }
460
+ is ContentNotFoundException -> {
461
+ Timber.e(e, "Content not found $logContext")
462
+ setNavigationError(NavigationErrorType.CONTENT_NOT_FOUND, e.message ?: "Content not found", path)
463
+ }
464
+ is CallbackException -> {
465
+ Timber.e(e, "Callback error $logContext")
466
+ setNavigationError(NavigationErrorType.CALLBACK_ERROR, e.message ?: "An error occurred", path)
467
+ }
468
+ else -> {
469
+ Timber.e(e, "Unexpected error $logContext")
470
+ setNavigationError(NavigationErrorType.UNKNOWN_ERROR, e.message ?: "An unexpected error occurred", path)
471
+ }
472
+ }
473
+ }
474
+
475
+ private fun clearNavigationError() {
476
+ if (navigationError != null || formattedNavigationError != null) {
477
+ navigationError = null
478
+ formattedNavigationError = null
479
+ onNavigationError(NavigationErrorEvent(null))
480
+ onFormattedNavigationError(null)
481
+ }
482
+ }
483
+
484
+ // ============================================================================
485
+ // MARK: Browser Navigation Methods
486
+ // ============================================================================
487
+
488
+ override fun navigatePath(path: String) {
489
+ clearNavigationError()
490
+
491
+ // Cancel previous navigation to avoid race conditions
492
+ navigationJob?.cancel()
493
+
494
+ navigationJob =
495
+ mainScope.launch {
496
+ try {
497
+ Timber.d("Navigating to path: $path")
498
+ browserManager.navigate(path)
499
+ } catch (e: CancellationException) {
500
+ throw e // Rethrow to properly cancel
501
+ } catch (e: Exception) {
502
+ handleBrowserException(e, path, "navigating to path: $path")
503
+ }
504
+ }
505
+ }
506
+
507
+ override fun navigateTrack(track: Track) {
508
+ clearNavigationError()
509
+
510
+ // Cancel previous navigation to avoid race conditions
511
+ navigationJob?.cancel()
512
+
513
+ val url = track.url
514
+ navigationJob =
515
+ mainScope.launch {
516
+ try {
517
+ when {
518
+ // Check if this is a contextual URL (playable-only track with queue context)
519
+ url != null && BrowserPathHelper.isContextual(url) -> {
520
+ Timber.d("Navigating to contextual track URL: $url")
521
+
522
+ val parentPath = BrowserPathHelper.stripTrackId(url)
523
+ val trackId = BrowserPathHelper.extractTrackId(url)
524
+
525
+ // Check if queue already came from this parent path - just skip to the track
526
+ if (trackId != null && parentPath == player.queueSourcePath) {
527
+ val index = player.tracks.indexOfFirst { it.src == trackId }
528
+ if (index >= 0) {
529
+ Timber.d("Queue already from $parentPath, skipping to index $index")
530
+ player.skipTo(index)
531
+ player.play()
532
+ return@launch
533
+ }
534
+ }
535
+
536
+ // Expand the queue from the contextual URL
537
+ val expanded = browserManager.expandQueueFromContextualUrl(url)
538
+
539
+ if (expanded != null) {
540
+ val (tracks, startIndex) = expanded
541
+ Timber.d(
542
+ "Loading expanded queue: ${tracks.size} tracks, starting at index $startIndex"
543
+ )
544
+
545
+ // Replace queue and seek to selected track
546
+ // Use internal player methods directly to avoid blocking on main thread
547
+ player.setQueue(tracks, startIndex, sourcePath = parentPath)
548
+ player.play()
549
+ } else {
550
+ // Fallback: just load the single track
551
+ Timber.w("Queue expansion failed, loading single track")
552
+ player.load(track)
553
+ }
554
+ }
555
+ // Navigate to browsable track to show browsing UI
556
+ url != null -> {
557
+ Timber.d("Navigating to browsable track: $url")
558
+ browserManager.navigate(url)
559
+ }
560
+ // If track is playable (has src), load it into player
561
+ track.src != null -> {
562
+ Timber.d("Loading playable track into player: ${track.title}")
563
+ player.load(track)
564
+ }
565
+ else -> {
566
+ throw IllegalArgumentException("Track must have either an 'url' or an 'src' property")
567
+ }
568
+ }
569
+ } catch (e: CancellationException) {
570
+ throw e // Rethrow to properly cancel
571
+ } catch (e: Exception) {
572
+ handleBrowserException(e, url ?: track.src ?: "", "navigating to track: ${track.title}")
573
+ }
574
+ }
575
+ }
576
+
577
+ override fun onSearch(query: String): Promise<Array<Track>> {
578
+ return Promise.async(mainScope) {
579
+ Timber.d("Searching for: $query")
580
+ val searchResults = browserManager.search(query)
581
+ searchResults.children ?: emptyArray()
582
+ }
583
+ }
584
+
585
+ override fun getContent(): ResolvedTrack? {
586
+ return browserManager.getContent()
587
+ }
588
+
589
+ override fun notifyContentChanged(path: String) {
590
+ Timber.d("Notifying content changed for path: $path")
591
+
592
+ // Invalidate cached content so future navigations fetch fresh data
593
+ browserManager.invalidateContentCache(path)
594
+
595
+ // Notify external media controllers (Android Auto)
596
+ connectedService?.player?.notifyContentChanged(path)
597
+
598
+ // If we're currently viewing this path, refresh the content
599
+ if (browserManager.getPath() == path) {
600
+ mainScope.launch { browserManager.refresh() }
601
+ }
602
+ }
603
+
604
+ override fun setFavorites(favorites: Array<String>) {
605
+ browserManager.setFavorites(favorites.toList())
606
+ }
607
+
608
+ // ============================================================================
609
+ // MARK: Player Setup and Options
610
+ // ============================================================================
611
+
612
+ override fun setupPlayer(options: PartialSetupPlayerOptions): Promise<Unit> {
613
+ return Promise.async(mainScope) {
614
+ setupOptions.update(options)
615
+
616
+ connectedService?.let {
617
+ it.player.setup(setupOptions)
618
+ return@async
619
+ }
620
+
621
+ // Service not connected yet, bind to service
622
+ suspendCoroutine<Unit> { continuation ->
623
+ Timber.d("Binding to AudioBrowserService")
624
+ val bound =
625
+ context.bindService(
626
+ Intent(context, Service::class.java),
627
+ this@AudioBrowser,
628
+ Context.BIND_AUTO_CREATE,
629
+ )
630
+
631
+ if (!bound) {
632
+ continuation.resumeWithException(
633
+ RuntimeException("Failed to bind to AudioBrowserService")
634
+ )
635
+ } else {
636
+ // Service will resolve the promise in onServiceConnected
637
+ setupPromise = { continuation.resume(Unit) }
638
+ }
639
+ }
640
+ }
641
+ }
642
+
643
+ override fun updateOptions(options: NativeUpdateOptions) {
644
+ updateOptions.updateFromBridge(options)
645
+ // Only update the options if the service is around
646
+ connectedService?.let { player.applyOptions(updateOptions) }
647
+ }
648
+
649
+ override fun getOptions(): UpdateOptions {
650
+ return player.getOptions().toNitro()
651
+ }
652
+
653
+ // ============================================================================
654
+ // MARK: Player Control Methods
655
+ // ============================================================================
656
+
657
+ override fun load(track: Track) {
658
+ launchInScope { player.load(track) }
659
+ }
660
+
661
+ override fun reset() = runBlockingOnMain {
662
+ player.stop()
663
+ delay(300) // Allow playback to stop
664
+ player.clear()
665
+ }
666
+
667
+ override fun play() = runBlockingOnMain { player.play() }
668
+
669
+ override fun pause() = runBlockingOnMain { player.pause() }
670
+
671
+ override fun togglePlayback() = runBlockingOnMain { player.togglePlayback() }
672
+
673
+ override fun stop() = runBlockingOnMain { player.stop() }
674
+
675
+ override fun setPlayWhenReady(playWhenReady: Boolean) = runBlockingOnMain {
676
+ player.playWhenReady = playWhenReady
677
+ }
678
+
679
+ override fun getPlayWhenReady(): Boolean = runBlockingOnMain { player.playWhenReady }
680
+
681
+ override fun seekTo(position: Double) = runBlockingOnMain {
682
+ player.seekTo((position * 1000).toLong(), TimeUnit.MILLISECONDS)
683
+ }
684
+
685
+ override fun seekBy(offset: Double) = runBlockingOnMain {
686
+ player.seekBy((offset * 1000).toLong(), TimeUnit.MILLISECONDS)
687
+ }
688
+
689
+ override fun setVolume(level: Double) = runBlockingOnMain { player.volume = level.toFloat() }
690
+
691
+ override fun getVolume(): Double = runBlockingOnMain { player.volume.toDouble() }
692
+
693
+ override fun setRate(rate: Double) = runBlockingOnMain { player.playbackSpeed = rate.toFloat() }
694
+
695
+ override fun getRate(): Double = runBlockingOnMain { player.playbackSpeed.toDouble() }
696
+
697
+ override fun getProgress(): Progress = runBlockingOnMain {
698
+ Progress(
699
+ duration = player.duration.toSeconds(),
700
+ position = player.position.toSeconds(),
701
+ buffered = player.bufferedPosition.toSeconds(),
702
+ )
703
+ }
704
+
705
+ override fun getPlayback(): Playback = runBlockingOnMain { player.getPlayback() }
706
+
707
+ override fun getPlayingState(): PlayingState = runBlockingOnMain { player.getPlayingState() }
708
+
709
+ override fun getRepeatMode(): RepeatMode = runBlockingOnMain { player.repeatMode }
710
+
711
+ override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain { player.repeatMode = mode }
712
+
713
+ override fun getShuffleEnabled(): Boolean = runBlockingOnMain { player.shuffleMode }
714
+
715
+ override fun setShuffleEnabled(enabled: Boolean) = runBlockingOnMain {
716
+ player.shuffleMode = enabled
717
+ }
718
+
719
+ override fun getPlaybackError(): PlaybackError? = runBlockingOnMain { player.playbackError }
720
+
721
+ override fun retry() = runBlockingOnMain { player.prepare() }
722
+
723
+ // ============================================================================
724
+ // MARK: Queue Management
725
+ // ============================================================================
726
+
727
+ override fun add(tracks: Array<Track>, insertBeforeIndex: Double?) = runBlockingOnMain {
728
+ val inputIndex = insertBeforeIndex?.toInt() ?: -1
729
+ player.add(tracks, inputIndex)
730
+ }
731
+
732
+ override fun move(fromIndex: Double, toIndex: Double) = runBlockingOnMain {
733
+ player.move(fromIndex.toInt(), toIndex.toInt())
734
+ }
735
+
736
+ override fun remove(indexes: DoubleArray) = runBlockingOnMain {
737
+ val indexList = indexes.map { it.toInt() }
738
+ player.remove(indexList)
739
+ }
740
+
741
+ override fun removeUpcomingTracks() = runBlockingOnMain { player.removeUpcomingTracks() }
742
+
743
+ override fun skip(index: Double, initialPosition: Double?) = runBlockingOnMain {
744
+ player.skipTo(index.toInt())
745
+
746
+ if (initialPosition != null && initialPosition >= 0) {
747
+ player.seekTo((initialPosition * 1000).toLong(), TimeUnit.MILLISECONDS)
748
+ }
749
+ }
750
+
751
+ override fun skipToNext(initialPosition: Double?) = runBlockingOnMain {
752
+ player.next()
753
+
754
+ if (initialPosition != null && initialPosition >= 0) {
755
+ player.seekTo((initialPosition * 1000).toLong(), TimeUnit.MILLISECONDS)
756
+ }
757
+ }
758
+
759
+ override fun skipToPrevious(initialPosition: Double?) = runBlockingOnMain {
760
+ player.previous()
761
+
762
+ if (initialPosition != null && initialPosition >= 0) {
763
+ player.seekTo((initialPosition * 1000).toLong(), TimeUnit.MILLISECONDS)
764
+ }
765
+ }
766
+
767
+ override fun setQueue(tracks: Array<Track>, startIndex: Double?, startPositionMs: Double?) =
768
+ runBlockingOnMain {
769
+ player.setQueue(tracks, startIndex?.toInt() ?: 0, startPositionMs?.toLong() ?: 0)
770
+ }
771
+
772
+ override fun setActiveTrackFavorited(favorited: Boolean) = runBlockingOnMain {
773
+ player.setActiveTrackFavorited(favorited)
774
+ }
775
+
776
+ override fun toggleActiveTrackFavorited() = runBlockingOnMain {
777
+ player.toggleActiveTrackFavorited()
778
+ }
779
+
780
+ override fun getQueue(): Array<Track> = runBlockingOnMain { player.tracks }
781
+
782
+ override fun getTrack(index: Double): Track? = runBlockingOnMain {
783
+ try {
784
+ player.getTrack(index.toInt())
785
+ } catch (e: IllegalArgumentException) {
786
+ null
787
+ }
788
+ }
789
+
790
+ override fun getActiveTrackIndex(): Double? = runBlockingOnMain {
791
+ player.currentIndex?.toDouble()
792
+ }
793
+
794
+ override fun getActiveTrack(): Track? = runBlockingOnMain { player.currentTrack }
795
+
796
+ // ============================================================================
797
+ // MARK: Now Playing Metadata
798
+ // ============================================================================
799
+
800
+ override fun updateNowPlaying(update: NowPlayingUpdate?) = runBlockingOnMain {
801
+ player.updateNowPlaying(update)
802
+ }
803
+
804
+ override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain { player.getNowPlaying() }
805
+
806
+ // ============================================================================
807
+ // MARK: Network Connectivity
808
+ // ============================================================================
809
+
810
+ override fun getOnline(): Boolean = runBlockingOnMain { player.getOnline() }
811
+
812
+ // ============================================================================
813
+ // MARK: System Volume
814
+ // ============================================================================
815
+
816
+ override fun getSystemVolume(): Double = systemVolumeMonitor.getVolume()
817
+
818
+ override fun setSystemVolume(volume: Double) = systemVolumeMonitor.setVolume(volume)
819
+
820
+ // ============================================================================
821
+ // MARK: External Audio Output (iOS only, stub on Android)
822
+ // ============================================================================
823
+
824
+ override fun getIosOutput(): IosOutput? = null
825
+
826
+ override fun openIosOutputPicker() {
827
+ // No-op on Android
828
+ }
829
+
830
+ // ============================================================================
831
+ // MARK: Equalizer (Android only)
832
+ // ============================================================================
833
+
834
+ override fun getEqualizerSettings(): EqualizerSettings? = runBlockingOnMain {
835
+ player.getEqualizerSettings()
836
+ }
837
+
838
+ override fun setEqualizerEnabled(enabled: Boolean) = runBlockingOnMain {
839
+ player.setEqualizerEnabled(enabled)
840
+ }
841
+
842
+ override fun setEqualizerPreset(preset: String) = runBlockingOnMain {
843
+ player.setEqualizerPreset(preset)
844
+ }
845
+
846
+ override fun setEqualizerLevels(levels: DoubleArray) = runBlockingOnMain {
847
+ player.setEqualizerLevels(levels)
848
+ }
849
+
850
+ // ============================================================================
851
+ // MARK: Sleep Timer
852
+ // ============================================================================
853
+
854
+ override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.getSleepTimer() }
855
+
856
+ override fun setSleepTimer(seconds: Double) = runBlockingOnMain { player.setSleepTimer(seconds) }
857
+
858
+ override fun setSleepTimerToEndOfTrack() = runBlockingOnMain {
859
+ player.setSleepTimerToEndOfTrack()
860
+ }
861
+
862
+ override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.clearSleepTimer() }
863
+
864
+ // ============================================================================
865
+ // MARK: Battery Optimization (Android only)
866
+ // ============================================================================
867
+
868
+ /** Track last known status for change detection */
869
+ private var lastKnownBatteryStatus: BatteryOptimizationHelper.Status? = null
870
+
871
+ override fun getBatteryWarningPending(): Boolean {
872
+ val rawPending = BatteryWarningStore.isWarningPending(context)
873
+ val status = BatteryOptimizationHelper.getStatus(context)
874
+
875
+ // Auto-clear if status is now unrestricted
876
+ return if (rawPending && status == BatteryOptimizationHelper.Status.UNRESTRICTED) {
877
+ BatteryWarningStore.clearWarning(context)
878
+ post { onBatteryWarningPendingChanged(BatteryWarningPendingChangedEvent(false)) }
879
+ false
880
+ } else {
881
+ rawPending
882
+ }
883
+ }
884
+
885
+ override fun getBatteryOptimizationStatus(): BatteryOptimizationStatus {
886
+ return BatteryOptimizationHelper.getStatus(context).toNitro()
887
+ }
888
+
889
+ override fun dismissBatteryWarning() {
890
+ BatteryWarningStore.clearWarning(context)
891
+ post { onBatteryWarningPendingChanged(BatteryWarningPendingChangedEvent(false)) }
892
+ }
893
+
894
+ override fun openBatterySettings() {
895
+ BatteryOptimizationHelper.openSettings(context)
896
+ }
897
+
898
+ /**
899
+ * Check if battery status changed since last check and fire events if so. Called automatically
900
+ * when app comes to foreground via ProcessLifecycleOwner.
901
+ */
902
+ private fun checkBatteryStatusChange() {
903
+ val currentStatus = BatteryOptimizationHelper.getStatus(context)
904
+ if (lastKnownBatteryStatus != null && lastKnownBatteryStatus != currentStatus) {
905
+ post {
906
+ onBatteryOptimizationStatusChanged(
907
+ BatteryOptimizationStatusChangedEvent(currentStatus.toNitro())
908
+ )
909
+ }
910
+
911
+ // Auto-clear warning if now unrestricted
912
+ if (
913
+ currentStatus == BatteryOptimizationHelper.Status.UNRESTRICTED &&
914
+ BatteryWarningStore.isWarningPending(context)
915
+ ) {
916
+ BatteryWarningStore.clearWarning(context)
917
+ post { onBatteryWarningPendingChanged(BatteryWarningPendingChangedEvent(false)) }
918
+ }
919
+ }
920
+ lastKnownBatteryStatus = currentStatus
921
+ }
922
+
923
+ private fun BatteryOptimizationHelper.Status.toNitro(): BatteryOptimizationStatus {
924
+ return when (this) {
925
+ BatteryOptimizationHelper.Status.UNRESTRICTED -> BatteryOptimizationStatus.UNRESTRICTED
926
+ BatteryOptimizationHelper.Status.OPTIMIZED -> BatteryOptimizationStatus.OPTIMIZED
927
+ BatteryOptimizationHelper.Status.RESTRICTED -> BatteryOptimizationStatus.RESTRICTED
928
+ }
929
+ }
930
+
931
+ // ============================================================================
932
+ // MARK: Service Connection
933
+ // ============================================================================
934
+
935
+ override fun onServiceConnected(name: ComponentName, serviceBinder: IBinder) {
936
+ launchInScope {
937
+ connectedService =
938
+ (serviceBinder as Service.LocalBinder).service.apply {
939
+ player.setCallbacks(callbacks)
940
+ player.applyOptions(updateOptions)
941
+ player.setup(setupOptions)
942
+ // Start observing network connectivity changes
943
+ player.observeNetworkConnectivity(mainScope)
944
+ // Set browser reference for media URL transformation
945
+ player.browser = this@AudioBrowser
946
+
947
+ // If configuration was already set before service connected,
948
+ // notify player now so Android Auto can start browsing
949
+ if (_configuration.routes?.isNotEmpty() == true) {
950
+ player.notifyBrowserConfigurationReady()
951
+ }
952
+ }
953
+
954
+ // Wire up battery warning callback from service
955
+ connectedService?.onBatteryWarningPendingChanged = { pending ->
956
+ post {
957
+ this@AudioBrowser.onBatteryWarningPendingChanged(
958
+ BatteryWarningPendingChangedEvent(pending)
959
+ )
960
+ }
961
+ }
962
+
963
+ val sessionToken = SessionToken(context, ComponentName(context, Service::class.java))
964
+ mediaBrowserFuture = MediaBrowser.Builder(context, sessionToken).buildAsync()
965
+
966
+ setupPromise?.invoke(Unit)
967
+ setupPromise = null
968
+ }
969
+ }
970
+
971
+ override fun onServiceDisconnected(name: ComponentName) {
972
+ mainScope.coroutineContext.cancelChildren()
973
+ mediaBrowserFuture = null
974
+ connectedService = null
975
+ Timber.d("AudioBrowser.onServiceDisconnected()")
976
+ }
977
+
978
+ // ============================================================================
979
+ // MARK: Internal Helpers
980
+ // ============================================================================
981
+
982
+ private fun launchInScope(block: suspend () -> Unit) {
983
+ mainScope.launch { block() }
984
+ }
985
+
986
+ private fun <T> runBlockingOnMain(block: suspend () -> T): T {
987
+ return runBlocking(mainScope.coroutineContext) { block() }
988
+ }
989
+
990
+ private val service: Service
991
+ get() = connectedService ?: throw Exception("Player not initialized")
992
+
993
+ internal val player
994
+ get() = service.player
995
+
996
+ // ============================================================================
997
+ // MARK: Player Callbacks
998
+ // ============================================================================
999
+
1000
+ val callbacks =
1001
+ object : Callbacks {
1002
+ override fun onPlaybackChanged(playback: Playback) {
1003
+ post { this@AudioBrowser.onPlaybackChanged(playback) }
1004
+ }
1005
+
1006
+ override fun onPlaybackActiveTrackChanged(event: PlaybackActiveTrackChangedEvent) {
1007
+ post { this@AudioBrowser.onPlaybackActiveTrackChanged(event) }
1008
+ }
1009
+
1010
+ override fun onPlaybackProgressUpdated(event: PlaybackProgressUpdatedEvent) {
1011
+ post { this@AudioBrowser.onPlaybackProgressUpdated(event) }
1012
+ }
1013
+
1014
+ override fun onPlaybackPlayWhenReadyChanged(event: PlaybackPlayWhenReadyChangedEvent) {
1015
+ post { this@AudioBrowser.onPlaybackPlayWhenReadyChanged(event) }
1016
+ }
1017
+
1018
+ override fun onPlaybackPlayingState(event: PlayingState) {
1019
+ post {
1020
+ Timber.d(
1021
+ "AudioBrowser forwarding PlayingState to JS: playing=${event.playing}, buffering=${event.buffering}"
1022
+ )
1023
+ this@AudioBrowser.onPlaybackPlayingState(event)
1024
+ }
1025
+ }
1026
+
1027
+ override fun onPlaybackQueueEnded(event: PlaybackQueueEndedEvent) {
1028
+ post { this@AudioBrowser.onPlaybackQueueEnded(event) }
1029
+ }
1030
+
1031
+ override fun onPlaybackQueueChanged(queue: Array<Track>) {
1032
+ post { this@AudioBrowser.onPlaybackQueueChanged(queue) }
1033
+ }
1034
+
1035
+ override fun onPlaybackRepeatModeChanged(event: RepeatMode) {
1036
+ post { this@AudioBrowser.onPlaybackRepeatModeChanged(RepeatModeChangedEvent(event)) }
1037
+ }
1038
+
1039
+ override fun onPlaybackShuffleModeChanged(enabled: Boolean) {
1040
+ post { this@AudioBrowser.onPlaybackShuffleModeChanged(enabled) }
1041
+ }
1042
+
1043
+ override fun onPlaybackError(error: PlaybackError?) {
1044
+ post { this@AudioBrowser.onPlaybackError(PlaybackErrorEvent(error)) }
1045
+ }
1046
+
1047
+ override fun onTrackMetadata(metadata: TrackMetadata) {
1048
+ post { this@AudioBrowser.onTrackMetadata(metadata) }
1049
+ }
1050
+
1051
+ override fun onChapterMetadata(chapters: List<ChapterMetadata>) {
1052
+ post { this@AudioBrowser.onChapterMetadata(chapters.toTypedArray()) }
1053
+ }
1054
+
1055
+ override fun onTimedMetadata(metadata: TimedMetadata) {
1056
+ post { this@AudioBrowser.onTimedMetadata(metadata) }
1057
+ }
1058
+
1059
+ override fun handleRemotePlay(): Boolean {
1060
+ val handled =
1061
+ this@AudioBrowser.handleRemotePlay?.let {
1062
+ it.invoke()
1063
+ true
1064
+ } ?: false
1065
+
1066
+ // Defer notification until after play operation completes
1067
+ post { this@AudioBrowser.onRemotePlay() }
1068
+
1069
+ return handled
1070
+ }
1071
+
1072
+ override fun handleRemotePause(): Boolean {
1073
+ val handled =
1074
+ this@AudioBrowser.handleRemotePause?.let {
1075
+ it.invoke()
1076
+ true
1077
+ } ?: false
1078
+
1079
+ // Defer notification until after pause operation completes
1080
+ post { this@AudioBrowser.onRemotePause() }
1081
+
1082
+ return handled
1083
+ }
1084
+
1085
+ override fun handleRemoteStop(): Boolean {
1086
+ val handled =
1087
+ this@AudioBrowser.handleRemoteStop?.let {
1088
+ it.invoke()
1089
+ true
1090
+ } ?: false
1091
+
1092
+ // Defer notification until after stop operation completes
1093
+ post { this@AudioBrowser.onRemoteStop() }
1094
+
1095
+ return handled
1096
+ }
1097
+
1098
+ override fun handleRemoteNext(): Boolean {
1099
+ val handled =
1100
+ this@AudioBrowser.handleRemoteNext?.let {
1101
+ it.invoke()
1102
+ true
1103
+ } ?: false
1104
+
1105
+ // Defer notification until after next operation completes
1106
+ post { this@AudioBrowser.onRemoteNext() }
1107
+
1108
+ return handled
1109
+ }
1110
+
1111
+ override fun handleRemotePrevious(): Boolean {
1112
+ val handled =
1113
+ this@AudioBrowser.handleRemotePrevious?.let {
1114
+ it.invoke()
1115
+ true
1116
+ } ?: false
1117
+
1118
+ // Defer notification until after previous operation completes
1119
+ post { this@AudioBrowser.onRemotePrevious() }
1120
+
1121
+ return handled
1122
+ }
1123
+
1124
+ override fun handleRemoteJumpForward(event: RemoteJumpForwardEvent): Boolean {
1125
+ val handled =
1126
+ this@AudioBrowser.handleRemoteJumpForward?.let {
1127
+ it.invoke(event)
1128
+ true
1129
+ } ?: false
1130
+
1131
+ // Defer notification until after jump forward operation completes
1132
+ post { this@AudioBrowser.onRemoteJumpForward(event) }
1133
+
1134
+ return handled
1135
+ }
1136
+
1137
+ override fun handleRemoteJumpBackward(event: RemoteJumpBackwardEvent): Boolean {
1138
+ val handled =
1139
+ this@AudioBrowser.handleRemoteJumpBackward?.let {
1140
+ it.invoke(event)
1141
+ true
1142
+ } ?: false
1143
+
1144
+ // Defer notification until after jump backward operation completes
1145
+ post { this@AudioBrowser.onRemoteJumpBackward(event) }
1146
+
1147
+ return handled
1148
+ }
1149
+
1150
+ override fun handleRemoteSeek(event: RemoteSeekEvent): Boolean {
1151
+ val handled =
1152
+ this@AudioBrowser.handleRemoteSeek?.let {
1153
+ it.invoke(event)
1154
+ true
1155
+ } ?: false
1156
+
1157
+ // Defer notification until after seek operation completes
1158
+ post { this@AudioBrowser.onRemoteSeek(event) }
1159
+
1160
+ return handled
1161
+ }
1162
+
1163
+ override fun onRemoteSetRating(event: RemoteSetRatingEvent) {
1164
+ post { this@AudioBrowser.onRemoteSetRating(event) }
1165
+ }
1166
+
1167
+ override fun onOptionsChanged(options: PlayerUpdateOptions) {
1168
+ // Not currently emitted to JS
1169
+ }
1170
+
1171
+ override fun onFavoriteChanged(event: FavoriteChangedEvent) {
1172
+ post { this@AudioBrowser.onFavoriteChanged(event) }
1173
+ }
1174
+
1175
+ override fun onNowPlayingChanged(metadata: NowPlayingMetadata) {
1176
+ post { this@AudioBrowser.onNowPlayingChanged(metadata) }
1177
+ }
1178
+
1179
+ override fun onOnlineChanged(online: Boolean) {
1180
+ post { this@AudioBrowser.onOnlineChanged(online) }
1181
+ }
1182
+
1183
+ override fun onEqualizerChanged(settings: EqualizerSettings) {
1184
+ post { this@AudioBrowser.onEqualizerChanged(settings) }
1185
+ }
1186
+
1187
+ override fun onSleepTimerChanged(timer: SleepTimer?) {
1188
+ post { this@AudioBrowser.onSleepTimerChanged(timer) }
1189
+ }
1190
+ }
1191
+ }