react-native-audio-browser 0.2.0-next.8 → 0.2.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 (973) hide show
  1. package/AudioBrowser.podspec +1 -1
  2. package/README.md +2 -180
  3. package/android/build.gradle +1 -17
  4. package/android/gradle.properties +1 -1
  5. package/android/src/main/AndroidManifest.xml +0 -15
  6. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +141 -401
  7. package/android/src/main/java/com/audiobrowser/Callbacks.kt +6 -4
  8. package/android/src/main/java/com/audiobrowser/Service.kt +18 -67
  9. package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +178 -442
  10. package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +4 -41
  11. package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +4 -4
  12. package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +97 -109
  13. package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +10 -6
  14. package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +8 -40
  15. package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +46 -40
  16. package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +1 -4
  17. package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +1 -18
  18. package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +3 -15
  19. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +134 -422
  20. package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +404 -248
  21. package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +59 -0
  22. package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +5 -25
  23. package/android/src/main/java/com/audiobrowser/player/Player.kt +582 -469
  24. package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +67 -190
  25. package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +53 -118
  26. package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +3 -37
  27. package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +40 -85
  28. package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +0 -24
  29. package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +300 -23
  30. package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +23 -13
  31. package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +2 -2
  32. package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +3 -4
  33. package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +1 -2
  34. package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
  35. package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
  36. package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +111 -6
  37. package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +8 -22
  38. package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +80 -112
  39. package/android/src/main/res/values/strings.xml +0 -4
  40. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +0 -4
  41. package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +2 -1
  42. package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +0 -72
  43. package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +146 -0
  44. package/ios/Browser/BrowserConfig.swift +11 -41
  45. package/ios/Browser/BrowserManager+URLResolution.swift +93 -213
  46. package/ios/Browser/BrowserManager.swift +110 -303
  47. package/ios/Browser/BrowserPathHelper.swift +3 -32
  48. package/ios/Browser/JsonModels.swift +66 -287
  49. package/ios/CarPlay/CarPlayArtworkResolver.swift +6 -6
  50. package/ios/CarPlay/CarPlayController.swift +149 -739
  51. package/ios/CarPlay/CarPlayImageLoader.swift +8 -57
  52. package/ios/CarPlay/CarPlayListItemFactory.swift +35 -44
  53. package/ios/CarPlay/CarPlayNowPlayingManager.swift +36 -180
  54. package/ios/CarPlay/RNABAudioBrowser.h +10 -15
  55. package/ios/CarPlay/RNABAudioBrowser.m +14 -15
  56. package/ios/CarPlay/RNABCarPlaySceneDelegate.m +0 -2
  57. package/ios/CarPlay/RNABMediaIntentHandler.swift +43 -53
  58. package/ios/CarPlay/Track+CarPlay.swift +63 -0
  59. package/ios/Extension/Capability+RemoteCommand.swift +9 -7
  60. package/ios/Extension/ChapterMetadata+AVFoundation.swift +1 -1
  61. package/ios/Extension/NavigationError+Conversion.swift +1 -8
  62. package/ios/Extension/ResolvedTrack+Copying.swift +4 -10
  63. package/ios/Extension/TimedMetadata+AVFoundation.swift +1 -1
  64. package/ios/Extension/Track+AVPlayer.swift +4 -4
  65. package/ios/Extension/Track+Copying.swift +3 -9
  66. package/ios/Extension/TrackMetadata+AVFoundation.swift +1 -1
  67. package/ios/HybridAudioBrowser.swift +173 -751
  68. package/ios/Model/NitroTypeStubs.swift +224 -299
  69. package/ios/Model/PlayerUpdateOptions.swift +23 -23
  70. package/ios/Model/RemoteCommand.swift +6 -24
  71. package/ios/Model/TrackPlayerError.swift +18 -82
  72. package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
  73. package/ios/NowPlayingInfo/NowPlayingInfoController.swift +121 -99
  74. package/ios/Observer/PlayerItemNotificationObserver.swift +5 -45
  75. package/ios/Observer/PlayerItemPropertyObserver.swift +4 -27
  76. package/ios/Observer/PlayerTimeObserver.swift +53 -3
  77. package/ios/Option/SessionCategories.swift +11 -34
  78. package/ios/Player/LoadSeekCoordinator.swift +1 -16
  79. package/ios/Player/MediaLoader.swift +11 -31
  80. package/ios/Player/NowPlayingUpdater.swift +26 -119
  81. package/ios/Player/PlaybackCoordinator.swift +51 -285
  82. package/ios/Player/PlaybackCoordinatorCallbacks.swift +1 -6
  83. package/ios/Player/PlaybackEffectHandler.swift +9 -19
  84. package/ios/Player/PlaybackErrorHandler.swift +13 -97
  85. package/ios/Player/PlaybackProgressUpdateManager.swift +68 -0
  86. package/ios/Player/PlaybackStateMachine.swift +13 -18
  87. package/ios/Player/PlayingStateManager.swift +2 -3
  88. package/ios/Player/QueueManager.swift +61 -67
  89. package/ios/Player/RetryManager.swift +21 -98
  90. package/ios/Player/SleepTimerHandling.swift +0 -8
  91. package/ios/Player/SleepTimerManager.swift +11 -72
  92. package/ios/RemoteCommand/RemoteCommandController.swift +21 -40
  93. package/ios/Tests/BrowserPathHelperTests.swift +0 -28
  94. package/ios/Tests/CarPlayArtworkResolverTests.swift +39 -39
  95. package/ios/Tests/ChapterMetadataAVFoundationTests.swift +2 -2
  96. package/ios/Tests/LoadSeekCoordinatorTests.swift +7 -40
  97. package/ios/Tests/MediaLoaderTests.swift +20 -32
  98. package/ios/Tests/PlaybackCoordinatorTests.swift +13 -787
  99. package/ios/Tests/PlaybackErrorHandlerTests.swift +46 -380
  100. package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +166 -0
  101. package/ios/Tests/PlaybackStateMachineTests.swift +8 -33
  102. package/ios/Tests/QueueManagerTests.swift +18 -149
  103. package/ios/Tests/ResolvedTrackCopyingTests.swift +8 -15
  104. package/ios/Tests/Support/TestTypes.swift +20 -61
  105. package/ios/Tests/TrackSelectorTests.swift +15 -15
  106. package/ios/TrackPlayer.swift +58 -380
  107. package/ios/TrackPlayerCallbacks.swift +44 -5
  108. package/ios/TrackSelector.swift +5 -5
  109. package/ios/Util/ArtworkImageFetcher.swift +2 -4
  110. package/ios/Util/NetworkMonitor.swift +3 -7
  111. package/ios/Util/OnceValue.swift +0 -34
  112. package/lib/commonjs/AudioBrowser.js +11 -0
  113. package/lib/commonjs/AudioBrowser.js.map +1 -1
  114. package/lib/commonjs/features/browser.js +158 -59
  115. package/lib/commonjs/features/browser.js.map +1 -1
  116. package/lib/commonjs/features/equalizer.js +1 -1
  117. package/lib/commonjs/features/errors.js +5 -37
  118. package/lib/commonjs/features/errors.js.map +1 -1
  119. package/lib/commonjs/features/favorites.js +1 -1
  120. package/lib/commonjs/features/index.js +0 -22
  121. package/lib/commonjs/features/index.js.map +1 -1
  122. package/lib/commonjs/features/metadata.js +3 -3
  123. package/lib/commonjs/features/metadata.js.map +1 -1
  124. package/lib/commonjs/features/network.js +1 -1
  125. package/lib/commonjs/features/nowPlaying.js +1 -36
  126. package/lib/commonjs/features/nowPlaying.js.map +1 -1
  127. package/lib/commonjs/features/output.js +23 -37
  128. package/lib/commonjs/features/output.js.map +1 -1
  129. package/lib/commonjs/features/playback/controls.js +0 -9
  130. package/lib/commonjs/features/playback/controls.js.map +1 -1
  131. package/lib/commonjs/features/playback/index.js +0 -11
  132. package/lib/commonjs/features/playback/index.js.map +1 -1
  133. package/lib/commonjs/features/playback/playWhenReady.js +1 -1
  134. package/lib/commonjs/features/playback/playing.js +1 -1
  135. package/lib/commonjs/features/playback/progress.js +13 -29
  136. package/lib/commonjs/features/playback/progress.js.map +1 -1
  137. package/lib/commonjs/features/playback/state.js +1 -1
  138. package/lib/commonjs/features/playback/volume.js +2 -2
  139. package/lib/commonjs/features/player/options.js +29 -79
  140. package/lib/commonjs/features/player/options.js.map +1 -1
  141. package/lib/commonjs/features/player/setup.js +3 -256
  142. package/lib/commonjs/features/player/setup.js.map +1 -1
  143. package/lib/commonjs/features/queue/activeTrack.js +1 -1
  144. package/lib/commonjs/features/queue/queue.js +5 -12
  145. package/lib/commonjs/features/queue/queue.js.map +1 -1
  146. package/lib/commonjs/features/queue/repeatMode.js +1 -1
  147. package/lib/commonjs/features/queue/shuffle.js +1 -1
  148. package/lib/commonjs/features/rating.js +2 -0
  149. package/lib/commonjs/features/rating.js.map +1 -0
  150. package/lib/commonjs/features/remoteControls.js +104 -14
  151. package/lib/commonjs/features/remoteControls.js.map +1 -1
  152. package/lib/commonjs/features/sleepTimer.js +5 -10
  153. package/lib/commonjs/features/sleepTimer.js.map +1 -1
  154. package/lib/commonjs/native.js +0 -5
  155. package/lib/commonjs/native.js.map +1 -1
  156. package/lib/commonjs/native.web.js +1 -4
  157. package/lib/commonjs/native.web.js.map +1 -1
  158. package/lib/commonjs/types/player.js +2 -0
  159. package/lib/commonjs/types/player.js.map +1 -0
  160. package/lib/commonjs/utils/LazyNativeEmitter.js +8 -8
  161. package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
  162. package/lib/commonjs/utils/NativeUpdatedValue.js +3 -0
  163. package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
  164. package/lib/commonjs/web/NativeAudioBrowser.js +124 -301
  165. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
  166. package/lib/commonjs/web/SimpleRouter.test.js +174 -0
  167. package/lib/commonjs/web/SimpleRouter.test.js.map +1 -0
  168. package/lib/commonjs/web/TrackPlayer/Player.js +26 -90
  169. package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -1
  170. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +293 -0
  171. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  172. package/lib/commonjs/web/TrackPlayer/RepeatMode.js +1 -1
  173. package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -1
  174. package/lib/commonjs/web/TrackPlayer/SleepTimer.js +3 -34
  175. package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -1
  176. package/lib/commonjs/web/TrackPlayer/index.js +5 -13
  177. package/lib/commonjs/web/TrackPlayer/index.js.map +1 -1
  178. package/lib/commonjs/web/browser/BrowserManager.js +50 -176
  179. package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
  180. package/lib/commonjs/web/browser/NavigationErrorManager.js +1 -3
  181. package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -1
  182. package/lib/commonjs/web/browser/SearchManager.js +9 -11
  183. package/lib/commonjs/web/browser/SearchManager.js.map +1 -1
  184. package/lib/commonjs/web/http/HttpClient.js +23 -4
  185. package/lib/commonjs/web/http/HttpClient.js.map +1 -1
  186. package/lib/commonjs/web/http/RequestConfigBuilder.js +58 -107
  187. package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -1
  188. package/lib/commonjs/web/player/NowPlayingManager.js +5 -6
  189. package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
  190. package/lib/commonjs/web/player/OptionsManager.js +17 -9
  191. package/lib/commonjs/web/player/OptionsManager.js.map +1 -1
  192. package/lib/module/AudioBrowser.js +1 -4
  193. package/lib/module/AudioBrowser.js.map +1 -1
  194. package/lib/module/features/browser.js +156 -53
  195. package/lib/module/features/browser.js.map +1 -1
  196. package/lib/module/features/equalizer.js +1 -1
  197. package/lib/module/features/errors.js +5 -37
  198. package/lib/module/features/errors.js.map +1 -1
  199. package/lib/module/features/favorites.js +1 -1
  200. package/lib/module/features/index.js +0 -2
  201. package/lib/module/features/index.js.map +1 -1
  202. package/lib/module/features/metadata.js +3 -3
  203. package/lib/module/features/metadata.js.map +1 -1
  204. package/lib/module/features/network.js +1 -1
  205. package/lib/module/features/nowPlaying.js +1 -34
  206. package/lib/module/features/nowPlaying.js.map +1 -1
  207. package/lib/module/features/output.js +19 -32
  208. package/lib/module/features/output.js.map +1 -1
  209. package/lib/module/features/playback/controls.js +0 -8
  210. package/lib/module/features/playback/controls.js.map +1 -1
  211. package/lib/module/features/playback/index.js +0 -1
  212. package/lib/module/features/playback/index.js.map +1 -1
  213. package/lib/module/features/playback/playWhenReady.js +1 -1
  214. package/lib/module/features/playback/playing.js +1 -1
  215. package/lib/module/features/playback/progress.js +13 -29
  216. package/lib/module/features/playback/progress.js.map +1 -1
  217. package/lib/module/features/playback/state.js +1 -1
  218. package/lib/module/features/playback/volume.js +2 -2
  219. package/lib/module/features/player/options.js +29 -79
  220. package/lib/module/features/player/options.js.map +1 -1
  221. package/lib/module/features/player/setup.js +3 -256
  222. package/lib/module/features/player/setup.js.map +1 -1
  223. package/lib/module/features/queue/activeTrack.js +1 -1
  224. package/lib/module/features/queue/queue.js +5 -12
  225. package/lib/module/features/queue/queue.js.map +1 -1
  226. package/lib/module/features/queue/repeatMode.js +1 -1
  227. package/lib/module/features/queue/shuffle.js +1 -1
  228. package/lib/module/features/rating.js +2 -0
  229. package/lib/module/features/rating.js.map +1 -0
  230. package/lib/module/features/remoteControls.js +103 -13
  231. package/lib/module/features/remoteControls.js.map +1 -1
  232. package/lib/module/features/sleepTimer.js +5 -10
  233. package/lib/module/features/sleepTimer.js.map +1 -1
  234. package/lib/module/native.js +0 -5
  235. package/lib/module/native.js.map +1 -1
  236. package/lib/module/native.web.js +1 -4
  237. package/lib/module/native.web.js.map +1 -1
  238. package/lib/module/types/player.js +2 -0
  239. package/lib/module/types/player.js.map +1 -0
  240. package/lib/module/utils/LazyNativeEmitter.js +8 -8
  241. package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
  242. package/lib/module/utils/NativeUpdatedValue.js +3 -0
  243. package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
  244. package/lib/module/web/NativeAudioBrowser.js +125 -302
  245. package/lib/module/web/NativeAudioBrowser.js.map +1 -1
  246. package/lib/module/web/SimpleRouter.test.js +174 -0
  247. package/lib/module/web/SimpleRouter.test.js.map +1 -0
  248. package/lib/module/web/TrackPlayer/Player.js +26 -90
  249. package/lib/module/web/TrackPlayer/Player.js.map +1 -1
  250. package/lib/module/web/TrackPlayer/PlaylistPlayer.js +288 -0
  251. package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  252. package/lib/module/web/TrackPlayer/RepeatMode.js +1 -1
  253. package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -1
  254. package/lib/module/web/TrackPlayer/SleepTimer.js +3 -34
  255. package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -1
  256. package/lib/module/web/TrackPlayer/index.js +1 -2
  257. package/lib/module/web/TrackPlayer/index.js.map +1 -1
  258. package/lib/module/web/browser/BrowserManager.js +50 -176
  259. package/lib/module/web/browser/BrowserManager.js.map +1 -1
  260. package/lib/module/web/browser/NavigationErrorManager.js +1 -3
  261. package/lib/module/web/browser/NavigationErrorManager.js.map +1 -1
  262. package/lib/module/web/browser/SearchManager.js +9 -11
  263. package/lib/module/web/browser/SearchManager.js.map +1 -1
  264. package/lib/module/web/http/HttpClient.js +23 -4
  265. package/lib/module/web/http/HttpClient.js.map +1 -1
  266. package/lib/module/web/http/RequestConfigBuilder.js +58 -107
  267. package/lib/module/web/http/RequestConfigBuilder.js.map +1 -1
  268. package/lib/module/web/player/NowPlayingManager.js +5 -7
  269. package/lib/module/web/player/NowPlayingManager.js.map +1 -1
  270. package/lib/module/web/player/OptionsManager.js +17 -9
  271. package/lib/module/web/player/OptionsManager.js.map +1 -1
  272. package/lib/typescript/src/AudioBrowser.d.ts +1 -0
  273. package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
  274. package/lib/typescript/src/features/browser.d.ts +1 -40
  275. package/lib/typescript/src/features/browser.d.ts.map +1 -1
  276. package/lib/typescript/src/features/equalizer.d.ts +1 -1
  277. package/lib/typescript/src/features/errors.d.ts +6 -61
  278. package/lib/typescript/src/features/errors.d.ts.map +1 -1
  279. package/lib/typescript/src/features/favorites.d.ts +1 -1
  280. package/lib/typescript/src/features/index.d.ts +0 -2
  281. package/lib/typescript/src/features/index.d.ts.map +1 -1
  282. package/lib/typescript/src/features/metadata.d.ts +7 -9
  283. package/lib/typescript/src/features/metadata.d.ts.map +1 -1
  284. package/lib/typescript/src/features/network.d.ts +1 -1
  285. package/lib/typescript/src/features/nowPlaying.d.ts +1 -28
  286. package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -1
  287. package/lib/typescript/src/features/output.d.ts +18 -28
  288. package/lib/typescript/src/features/output.d.ts.map +1 -1
  289. package/lib/typescript/src/features/playback/controls.d.ts +0 -5
  290. package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
  291. package/lib/typescript/src/features/playback/index.d.ts +0 -1
  292. package/lib/typescript/src/features/playback/index.d.ts.map +1 -1
  293. package/lib/typescript/src/features/playback/playWhenReady.d.ts +1 -1
  294. package/lib/typescript/src/features/playback/playing.d.ts +1 -1
  295. package/lib/typescript/src/features/playback/progress.d.ts +1 -4
  296. package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
  297. package/lib/typescript/src/features/playback/state.d.ts +1 -1
  298. package/lib/typescript/src/features/playback/volume.d.ts +2 -2
  299. package/lib/typescript/src/features/player/options.d.ts +127 -176
  300. package/lib/typescript/src/features/player/options.d.ts.map +1 -1
  301. package/lib/typescript/src/features/player/setup.d.ts +167 -213
  302. package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
  303. package/lib/typescript/src/features/queue/activeTrack.d.ts +1 -1
  304. package/lib/typescript/src/features/queue/queue.d.ts +4 -11
  305. package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
  306. package/lib/typescript/src/features/queue/repeatMode.d.ts +1 -1
  307. package/lib/typescript/src/features/queue/shuffle.d.ts +1 -1
  308. package/lib/typescript/src/features/rating.d.ts +14 -0
  309. package/lib/typescript/src/features/rating.d.ts.map +1 -0
  310. package/lib/typescript/src/features/remoteControls.d.ts +35 -23
  311. package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
  312. package/lib/typescript/src/features/sleepTimer.d.ts +4 -19
  313. package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -1
  314. package/lib/typescript/src/index.d.ts.map +1 -1
  315. package/lib/typescript/src/native.d.ts +2 -1
  316. package/lib/typescript/src/native.d.ts.map +1 -1
  317. package/lib/typescript/src/native.web.d.ts +3 -0
  318. package/lib/typescript/src/native.web.d.ts.map +1 -0
  319. package/lib/typescript/src/specs/audio-browser.nitro.d.ts +225 -17
  320. package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
  321. package/lib/typescript/src/types/browser-native.d.ts +3 -9
  322. package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
  323. package/lib/typescript/src/types/browser-nodes.d.ts +13 -145
  324. package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
  325. package/lib/typescript/src/types/browser.d.ts +85 -349
  326. package/lib/typescript/src/types/browser.d.ts.map +1 -1
  327. package/lib/typescript/src/types/player.d.ts +64 -0
  328. package/lib/typescript/src/types/player.d.ts.map +1 -0
  329. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +6 -8
  330. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
  331. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +2 -0
  332. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
  333. package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -1
  334. package/lib/typescript/src/web/NativeAudioBrowser.d.ts +188 -0
  335. package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -0
  336. package/lib/typescript/src/web/SimpleRouter.d.ts +40 -0
  337. package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -0
  338. package/lib/typescript/src/web/SimpleRouter.test.d.ts +2 -0
  339. package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +1 -0
  340. package/lib/typescript/src/web/TrackPlayer/Event.d.ts +11 -0
  341. package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +1 -0
  342. package/lib/typescript/src/web/TrackPlayer/Player.d.ts +59 -0
  343. package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +1 -0
  344. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +39 -0
  345. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +1 -0
  346. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +6 -0
  347. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +1 -0
  348. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +4 -0
  349. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +1 -0
  350. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +34 -0
  351. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +1 -0
  352. package/lib/typescript/src/web/TrackPlayer/State.d.ts +13 -0
  353. package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +1 -0
  354. package/lib/typescript/src/web/TrackPlayer/index.d.ts +5 -0
  355. package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +1 -0
  356. package/lib/typescript/src/web/browser/BrowserManager.d.ts +154 -0
  357. package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +1 -0
  358. package/lib/typescript/src/web/browser/FavoriteManager.d.ts +42 -0
  359. package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +1 -0
  360. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +40 -0
  361. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +1 -0
  362. package/lib/typescript/src/web/browser/SearchManager.d.ts +22 -0
  363. package/lib/typescript/src/web/browser/SearchManager.d.ts.map +1 -0
  364. package/lib/typescript/src/web/http/HttpClient.d.ts +25 -0
  365. package/lib/typescript/src/web/http/HttpClient.d.ts.map +1 -0
  366. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +98 -0
  367. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +1 -0
  368. package/lib/typescript/src/web/player/NowPlayingManager.d.ts +34 -0
  369. package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +1 -0
  370. package/lib/typescript/src/web/player/OptionsManager.d.ts +32 -0
  371. package/lib/typescript/src/web/player/OptionsManager.d.ts.map +1 -0
  372. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +69 -0
  373. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +1 -0
  374. package/lib/typescript/src/web/util/shuffle.d.ts +8 -0
  375. package/lib/typescript/src/web/util/shuffle.d.ts.map +1 -0
  376. package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +2 -4
  377. package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +10 -24
  378. package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +6 -6
  379. package/nitrogen/generated/android/c++/JAndroidOptions.hpp +20 -10
  380. package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
  381. package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +1 -33
  382. package/nitrogen/generated/android/c++/JBrowseResult.hpp +0 -5
  383. package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +3 -3
  384. package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +0 -6
  385. package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +2 -3
  386. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +0 -6
  387. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +147 -0
  388. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +0 -8
  389. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +0 -6
  390. package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +0 -6
  391. package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
  392. package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +10 -0
  393. package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +9 -14
  394. package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +0 -2
  395. package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +0 -6
  396. package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +0 -2
  397. package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
  398. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +10 -10
  399. package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +0 -6
  400. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +0 -6
  401. package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
  402. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +221 -245
  403. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +22 -25
  404. package/nitrogen/generated/android/c++/JImageRowItem.hpp +3 -33
  405. package/nitrogen/generated/android/c++/{JOutput.hpp → JIosOutput.hpp} +15 -15
  406. package/nitrogen/generated/android/c++/JIosOutputType.hpp +85 -0
  407. package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +1 -33
  408. package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +28 -61
  409. package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +9 -20
  410. package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +24 -21
  411. package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +0 -6
  412. package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +20 -10
  413. package/nitrogen/generated/android/c++/{JRemoteButton.hpp → JNotificationButton.hpp} +20 -20
  414. package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
  415. package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +17 -3
  416. package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +3 -7
  417. package/nitrogen/generated/android/c++/JOptions.hpp +14 -19
  418. package/nitrogen/generated/android/c++/{JNativeAndroidSetupOptions.hpp → JPartialAndroidSetupPlayerOptions.hpp} +10 -10
  419. package/nitrogen/generated/android/c++/{JNativeIOSSetupOptions.hpp → JPartialIOSSetupPlayerOptions.hpp} +10 -10
  420. package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +96 -0
  421. package/nitrogen/generated/android/c++/JPercentageRating.hpp +57 -0
  422. package/nitrogen/generated/android/c++/JPlayback.hpp +0 -2
  423. package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +0 -6
  424. package/nitrogen/generated/android/c++/JPlaybackError.hpp +3 -18
  425. package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +0 -2
  426. package/nitrogen/generated/android/c++/JPlaybackState.hpp +3 -3
  427. package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
  428. package/nitrogen/generated/android/c++/JRatingType.hpp +73 -0
  429. package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
  430. package/nitrogen/generated/android/c++/JResolvedTrack.hpp +5 -23
  431. package/nitrogen/generated/android/c++/JRetryConfig.hpp +7 -11
  432. package/nitrogen/generated/android/c++/JSearchMode.hpp +9 -27
  433. package/nitrogen/generated/android/c++/JSearchParams.hpp +3 -9
  434. package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
  435. package/nitrogen/generated/android/c++/{JGateEvent.hpp → JThumbsRating.hpp} +15 -16
  436. package/nitrogen/generated/android/c++/JTrack.hpp +5 -23
  437. package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +0 -6
  438. package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +1 -14
  439. package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
  440. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +34 -0
  441. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +105 -0
  442. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +26 -0
  443. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +75 -0
  444. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +4 -4
  445. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +9 -3
  446. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
  447. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +4 -10
  448. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +3 -3
  449. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +2 -2
  450. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.kt → Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt} +12 -12
  451. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_Output.kt → Func_void_IosOutput.kt} +9 -9
  452. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_GateEvent.kt → Func_void_RemoteSetRatingEvent.kt} +9 -9
  453. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +9 -9
  454. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Gate.kt → HeartRating.kt} +6 -9
  455. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +109 -103
  456. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +3 -24
  457. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Output.kt → IosOutput.kt} +6 -6
  458. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +32 -0
  459. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +4 -10
  460. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +6 -18
  461. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +4 -4
  462. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +6 -6
  463. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +1 -3
  464. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +9 -3
  465. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoritesMatchMode.kt → NotificationButton.kt} +8 -5
  466. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
  467. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +6 -3
  468. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +3 -6
  469. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +3 -3
  470. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NativeAndroidSetupOptions.kt → PartialAndroidSetupPlayerOptions.kt} +5 -5
  471. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NativeIOSSetupOptions.kt → PartialIOSSetupPlayerOptions.kt} +5 -5
  472. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
  473. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateDecision.kt → PercentageRating.kt} +6 -9
  474. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +3 -12
  475. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +6 -6
  476. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
  477. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateReason.kt → RatingType.kt} +10 -5
  478. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{ArtworkVariants.kt → RemoteSetRatingEvent.kt} +6 -9
  479. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +3 -12
  480. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +4 -7
  481. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +6 -12
  482. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +3 -6
  483. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateEvent.kt → StarRating.kt} +6 -6
  484. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → ThumbsRating.kt} +6 -6
  485. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +3 -12
  486. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +4 -7
  487. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
  488. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +77 -0
  489. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Variant_NullType_RemoteButtonLayout.kt → Variant_NullType_NotificationButtonLayout.kt} +9 -9
  490. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +28 -139
  491. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +489 -1125
  492. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +45 -66
  493. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +118 -176
  494. package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +8 -8
  495. package/nitrogen/generated/ios/swift/AndroidOptions.swift +22 -12
  496. package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +119 -0
  497. package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +1 -95
  498. package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +4 -4
  499. package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +4 -17
  500. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +68 -0
  501. package/nitrogen/generated/ios/swift/{Func_void_Output.swift → Func_void_IosOutput.swift} +10 -10
  502. package/nitrogen/generated/ios/swift/{Func_void_GateEvent.swift → Func_void_RemoteSetRatingEvent.swift} +10 -10
  503. package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
  504. package/nitrogen/generated/ios/swift/{Func_void_std__shared_ptr_Promise_GateDecision__.swift → Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift} +17 -17
  505. package/nitrogen/generated/ios/swift/HeartRating.swift +29 -0
  506. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +14 -20
  507. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +197 -230
  508. package/nitrogen/generated/ios/swift/ImageRowItem.swift +2 -121
  509. package/nitrogen/generated/ios/swift/{Output.swift → IosOutput.swift} +7 -7
  510. package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
  511. package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +1 -107
  512. package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +22 -161
  513. package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +19 -19
  514. package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +25 -12
  515. package/nitrogen/generated/ios/swift/NavigationErrorType.swift +0 -8
  516. package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +41 -12
  517. package/nitrogen/generated/ios/swift/{RemoteButton.swift → NotificationButton.swift} +10 -10
  518. package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +92 -0
  519. package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +48 -1
  520. package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +1 -19
  521. package/nitrogen/generated/ios/swift/Options.swift +4 -10
  522. package/nitrogen/generated/ios/swift/{NativeAndroidSetupOptions.swift → PartialAndroidSetupPlayerOptions.swift} +5 -5
  523. package/nitrogen/generated/ios/swift/{NativeIOSSetupOptions.swift → PartialIOSSetupPlayerOptions.swift} +5 -5
  524. package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +101 -0
  525. package/nitrogen/generated/ios/swift/PercentageRating.swift +29 -0
  526. package/nitrogen/generated/ios/swift/PlaybackError.swift +2 -43
  527. package/nitrogen/generated/ios/swift/PlaybackState.swift +4 -4
  528. package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
  529. package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
  530. package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +58 -0
  531. package/nitrogen/generated/ios/swift/ResolvedTrack.swift +8 -74
  532. package/nitrogen/generated/ios/swift/RetryConfig.swift +4 -35
  533. package/nitrogen/generated/ios/swift/SearchMode.swift +12 -36
  534. package/nitrogen/generated/ios/swift/SearchParams.swift +2 -7
  535. package/nitrogen/generated/ios/swift/StarRating.swift +29 -0
  536. package/nitrogen/generated/ios/swift/ThumbsRating.swift +29 -0
  537. package/nitrogen/generated/ios/swift/Track.swift +8 -74
  538. package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +1 -60
  539. package/nitrogen/generated/ios/swift/UpdateOptions.swift +143 -0
  540. package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
  541. package/nitrogen/generated/ios/swift/{Variant_NullType_RemoteButtonLayout.swift → Variant_NullType_NotificationButtonLayout.swift} +3 -3
  542. package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +10 -10
  543. package/nitrogen/generated/shared/c++/AndroidOptions.hpp +19 -8
  544. package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +109 -0
  545. package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +2 -10
  546. package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +6 -6
  547. package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +2 -0
  548. package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +5 -6
  549. package/nitrogen/generated/shared/c++/{GateEvent.hpp → HeartRating.hpp} +17 -18
  550. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +18 -21
  551. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +35 -44
  552. package/nitrogen/generated/shared/c++/ImageRowItem.hpp +2 -33
  553. package/nitrogen/generated/shared/c++/{Output.hpp → IosOutput.hpp} +18 -18
  554. package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
  555. package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +2 -10
  556. package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +15 -31
  557. package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +5 -5
  558. package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +7 -9
  559. package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +0 -8
  560. package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +19 -8
  561. package/nitrogen/generated/shared/c++/{RemoteButton.hpp → NotificationButton.hpp} +25 -25
  562. package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +102 -0
  563. package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +19 -3
  564. package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +2 -6
  565. package/nitrogen/generated/shared/c++/Options.hpp +8 -8
  566. package/nitrogen/generated/shared/c++/{NativeAndroidSetupOptions.hpp → PartialAndroidSetupPlayerOptions.hpp} +11 -11
  567. package/nitrogen/generated/shared/c++/{NativeIOSSetupOptions.hpp → PartialIOSSetupPlayerOptions.hpp} +11 -11
  568. package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +104 -0
  569. package/nitrogen/generated/shared/c++/{FavoriteConfig.hpp → PercentageRating.hpp} +17 -18
  570. package/nitrogen/generated/shared/c++/PlaybackError.hpp +3 -18
  571. package/nitrogen/generated/shared/c++/PlaybackState.hpp +9 -9
  572. package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
  573. package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
  574. package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +94 -0
  575. package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +5 -24
  576. package/nitrogen/generated/shared/c++/RetryConfig.hpp +6 -10
  577. package/nitrogen/generated/shared/c++/SearchMode.hpp +15 -39
  578. package/nitrogen/generated/shared/c++/SearchParams.hpp +2 -9
  579. package/nitrogen/generated/shared/c++/{Gate.hpp → StarRating.hpp} +16 -21
  580. package/nitrogen/generated/shared/c++/{GateDecision.hpp → ThumbsRating.hpp} +17 -23
  581. package/nitrogen/generated/shared/c++/Track.hpp +5 -24
  582. package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +2 -6
  583. package/nitrogen/generated/shared/c++/UpdateOptions.hpp +111 -0
  584. package/package.json +5 -12
  585. package/src/AudioBrowser.ts +1 -4
  586. package/src/features/browser.ts +201 -58
  587. package/src/features/equalizer.ts +1 -1
  588. package/src/features/errors.ts +5 -71
  589. package/src/features/favorites.ts +1 -1
  590. package/src/features/index.ts +0 -2
  591. package/src/features/metadata.ts +15 -9
  592. package/src/features/network.ts +1 -1
  593. package/src/features/nowPlaying.ts +1 -37
  594. package/src/features/output.ts +22 -35
  595. package/src/features/playback/controls.ts +0 -8
  596. package/src/features/playback/index.ts +0 -1
  597. package/src/features/playback/playWhenReady.ts +1 -1
  598. package/src/features/playback/playing.ts +1 -1
  599. package/src/features/playback/progress.ts +13 -32
  600. package/src/features/playback/state.ts +1 -1
  601. package/src/features/playback/volume.ts +2 -2
  602. package/src/features/player/options.ts +110 -217
  603. package/src/features/player/setup.ts +175 -397
  604. package/src/features/queue/activeTrack.ts +1 -1
  605. package/src/features/queue/queue.ts +6 -17
  606. package/src/features/queue/repeatMode.ts +1 -1
  607. package/src/features/queue/shuffle.ts +1 -1
  608. package/src/features/rating.ts +17 -0
  609. package/src/features/remoteControls.ts +115 -13
  610. package/src/features/sleepTimer.ts +5 -24
  611. package/src/native.ts +0 -5
  612. package/src/native.web.ts +1 -4
  613. package/src/specs/audio-browser.nitro.ts +41 -131
  614. package/src/types/browser-native.ts +6 -19
  615. package/src/types/browser-nodes.ts +13 -160
  616. package/src/types/browser.ts +89 -377
  617. package/src/types/player.ts +69 -0
  618. package/src/utils/LazyNativeEmitter.ts +8 -9
  619. package/src/utils/NativeUpdatedValue.ts +2 -0
  620. package/src/web/NativeAudioBrowser.ts +158 -365
  621. package/src/web/TrackPlayer/Player.ts +39 -113
  622. package/src/web/TrackPlayer/PlaylistPlayer.ts +346 -0
  623. package/src/web/TrackPlayer/RepeatMode.ts +1 -1
  624. package/src/web/TrackPlayer/SleepTimer.ts +3 -38
  625. package/src/web/TrackPlayer/index.ts +1 -2
  626. package/src/web/browser/BrowserManager.ts +62 -231
  627. package/src/web/browser/NavigationErrorManager.ts +1 -3
  628. package/src/web/browser/SearchManager.ts +15 -11
  629. package/src/web/http/HttpClient.ts +35 -5
  630. package/src/web/http/RequestConfigBuilder.ts +63 -120
  631. package/src/web/player/NowPlayingManager.ts +5 -6
  632. package/src/web/player/OptionsManager.ts +18 -12
  633. package/android/src/main/java/com/audiobrowser/browser/ArtworkResolutionRegistry.kt +0 -37
  634. package/android/src/main/java/com/audiobrowser/browser/BrowseArtworkRegistry.kt +0 -34
  635. package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +0 -299
  636. package/android/src/main/java/com/audiobrowser/browser/JsonArtwork.kt +0 -79
  637. package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +0 -42
  638. package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +0 -35
  639. package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +0 -172
  640. package/android/src/main/java/com/audiobrowser/player/EqualizerController.kt +0 -153
  641. package/android/src/main/java/com/audiobrowser/player/InterceptingPlayer.kt +0 -141
  642. package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +0 -347
  643. package/android/src/main/java/com/audiobrowser/player/PlaybackErrorClassifier.kt +0 -129
  644. package/android/src/main/java/com/audiobrowser/player/PlaybackStateMachine.kt +0 -85
  645. package/android/src/main/java/com/audiobrowser/player/PlaybackTimer.kt +0 -56
  646. package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +0 -20
  647. package/android/src/main/java/com/audiobrowser/player/PlayerEngineFactory.kt +0 -130
  648. package/android/src/main/java/com/audiobrowser/player/SleepTimerManager.kt +0 -80
  649. package/android/src/main/java/com/audiobrowser/player/StuckRecoveryPolicy.kt +0 -50
  650. package/android/src/main/java/com/audiobrowser/player/VolumeFader.kt +0 -81
  651. package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +0 -141
  652. package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +0 -37
  653. package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +0 -41
  654. package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +0 -209
  655. package/android/src/main/java/com/audiobrowser/util/ArtworkContentProvider.kt +0 -161
  656. package/android/src/main/java/com/audiobrowser/util/ArtworkUris.kt +0 -28
  657. package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +0 -24
  658. package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoader.kt +0 -49
  659. package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoaderHolder.kt +0 -36
  660. package/android/src/main/java/com/audiobrowser/util/OutputMonitor.kt +0 -211
  661. package/android/src/main/java/com/audiobrowser/util/OutputSwitcher.kt +0 -58
  662. package/android/src/main/java/com/audiobrowser/util/RatingFavorites.kt +0 -14
  663. package/android/src/test/java/com/audiobrowser/TestFixtures.kt +0 -165
  664. package/android/src/test/java/com/audiobrowser/browser/ArtworkResolutionRegistryTest.kt +0 -46
  665. package/android/src/test/java/com/audiobrowser/browser/BrowseArtworkRegistryTest.kt +0 -39
  666. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerBuildApiRequestTest.kt +0 -114
  667. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +0 -141
  668. package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +0 -177
  669. package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +0 -55
  670. package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +0 -94
  671. package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +0 -203
  672. package/android/src/test/java/com/audiobrowser/player/DynamicLoadControlTest.kt +0 -56
  673. package/android/src/test/java/com/audiobrowser/player/EqualizerControllerTest.kt +0 -216
  674. package/android/src/test/java/com/audiobrowser/player/MediaSessionSlotMappingTest.kt +0 -45
  675. package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +0 -442
  676. package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +0 -190
  677. package/android/src/test/java/com/audiobrowser/player/PlaybackStateMachineTest.kt +0 -198
  678. package/android/src/test/java/com/audiobrowser/player/PlaybackTimerTest.kt +0 -137
  679. package/android/src/test/java/com/audiobrowser/player/PlayerEngineFactoryTest.kt +0 -36
  680. package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +0 -268
  681. package/android/src/test/java/com/audiobrowser/player/SessionErrorMaskTest.kt +0 -68
  682. package/android/src/test/java/com/audiobrowser/player/StuckRecoveryPolicyTest.kt +0 -40
  683. package/android/src/test/java/com/audiobrowser/player/TransformingDataSourceTest.kt +0 -193
  684. package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +0 -107
  685. package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +0 -73
  686. package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +0 -75
  687. package/android/src/test/java/com/audiobrowser/tls/CertFixtures.kt +0 -18
  688. package/android/src/test/java/com/audiobrowser/util/ArtworkContentProviderTest.kt +0 -163
  689. package/android/src/test/java/com/audiobrowser/util/ArtworkUrisTest.kt +0 -34
  690. package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +0 -28
  691. package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderHolderTest.kt +0 -53
  692. package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderTest.kt +0 -58
  693. package/android/src/test/java/com/audiobrowser/util/FakeImageLoader.kt +0 -57
  694. package/android/src/test/java/com/audiobrowser/util/PlayingStateFactoryTest.kt +0 -40
  695. package/android/src/test/java/com/audiobrowser/util/RatingFavoritesTest.kt +0 -34
  696. package/android/src/test/java/com/audiobrowser/util/TrackFactoryBrowseTest.kt +0 -50
  697. package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +0 -63
  698. package/android/src/test/java/com/audiobrowser/util/TrackFactoryRatingTest.kt +0 -35
  699. package/android/src/test/resources/certs/isrg-root-x1.pem +0 -31
  700. package/android/src/test/resources/certs/letsencrypt-r13.der +0 -0
  701. package/android/src/test/resources/certs/letsencrypt-r13.pem +0 -29
  702. package/android/src/test/resources/certs/stationplaylist-leaf.pem +0 -34
  703. package/ios/Browser/MediaResolveComposer.swift +0 -114
  704. package/ios/Browser/SearchDrillIn.swift +0 -44
  705. package/ios/Browser/SectionScope.swift +0 -35
  706. package/ios/Browser/TabBarEntries.swift +0 -15
  707. package/ios/CarPlay/CPInterfaceController+Safe.swift +0 -126
  708. package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
  709. package/ios/CarPlay/RNABMediaAddHandler.swift +0 -75
  710. package/ios/CarPlay/RNABMediaAffinityHandler.swift +0 -69
  711. package/ios/Extension/PlayerCapabilities+Favorite.swift +0 -20
  712. package/ios/Extension/RequestConfig+Copying.swift +0 -31
  713. package/ios/Extension/Variant+Artwork.swift +0 -49
  714. package/ios/NowPlayingInfo/SilentAudioPrimer.swift +0 -73
  715. package/ios/Player/AirPlayStallJudgement.swift +0 -25
  716. package/ios/Player/EndOfTrackJudgement.swift +0 -32
  717. package/ios/Player/MediaIntentCriteria.swift +0 -139
  718. package/ios/Player/PersistedPlaybackState.swift +0 -11
  719. package/ios/Player/PlaybackStateStore.swift +0 -27
  720. package/ios/Player/PlaybackTimer.swift +0 -61
  721. package/ios/Player/VolumeFader.swift +0 -77
  722. package/ios/RemoteCommand/RemoteCommandCallbacks.swift +0 -47
  723. package/ios/Tests/AirPlayStallJudgementTests.swift +0 -52
  724. package/ios/Tests/EndOfTrackJudgementTests.swift +0 -35
  725. package/ios/Tests/JsonModelsTests.swift +0 -58
  726. package/ios/Tests/MediaIntentCriteriaTests.swift +0 -170
  727. package/ios/Tests/MediaLoaderAssetOptionsTests.swift +0 -46
  728. package/ios/Tests/MediaResolveTests.swift +0 -126
  729. package/ios/Tests/OnceValueTests.swift +0 -79
  730. package/ios/Tests/PlaybackStateStoreTests.swift +0 -48
  731. package/ios/Tests/PlaybackTimerTests.swift +0 -55
  732. package/ios/Tests/PlayingStateManagerTests.swift +0 -57
  733. package/ios/Tests/RemoteCommandControllerTests.swift +0 -156
  734. package/ios/Tests/RemoteCommandTests.swift +0 -67
  735. package/ios/Tests/RetryManagerTests.swift +0 -89
  736. package/ios/Tests/SearchDrillInTests.swift +0 -63
  737. package/ios/Tests/SectionScopeTests.swift +0 -82
  738. package/ios/Tests/SleepTimerManagerTests.swift +0 -107
  739. package/ios/Tests/Support/ManualSleepTimerScheduler.swift +0 -47
  740. package/ios/Tests/TabBarEntriesTests.swift +0 -71
  741. package/lib/commonjs/features/browser-config.js +0 -227
  742. package/lib/commonjs/features/browser-config.js.map +0 -1
  743. package/lib/commonjs/features/carConnection.js +0 -42
  744. package/lib/commonjs/features/carConnection.js.map +0 -1
  745. package/lib/commonjs/features/gate.js +0 -149
  746. package/lib/commonjs/features/gate.js.map +0 -1
  747. package/lib/commonjs/features/playback/trackPlaybackTime.js +0 -86
  748. package/lib/commonjs/features/playback/trackPlaybackTime.js.map +0 -1
  749. package/lib/commonjs/features/player/validateOptions.js +0 -24
  750. package/lib/commonjs/features/player/validateOptions.js.map +0 -1
  751. package/lib/commonjs/utils/artwork.js +0 -31
  752. package/lib/commonjs/utils/artwork.js.map +0 -1
  753. package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +0 -71
  754. package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
  755. package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js +0 -34
  756. package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js.map +0 -1
  757. package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js +0 -21
  758. package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
  759. package/lib/commonjs/web/TrackPlayer/QueueManager.js +0 -273
  760. package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +0 -1
  761. package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +0 -158
  762. package/lib/commonjs/web/TrackPlayer/QueuePlayer.js.map +0 -1
  763. package/lib/commonjs/web/TrackPlayer/VolumeFader.js +0 -75
  764. package/lib/commonjs/web/TrackPlayer/VolumeFader.js.map +0 -1
  765. package/lib/commonjs/web/browser/assertBrowsePageShape.js +0 -22
  766. package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +0 -1
  767. package/lib/commonjs/web/browser/classifyTrackNavigation.js +0 -41
  768. package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +0 -1
  769. package/lib/commonjs/web/browser/parseSearchResponse.js +0 -20
  770. package/lib/commonjs/web/browser/parseSearchResponse.js.map +0 -1
  771. package/lib/commonjs/web/playbackErrorKind.js +0 -57
  772. package/lib/commonjs/web/playbackErrorKind.js.map +0 -1
  773. package/lib/commonjs/web/player/MediaSessionManager.js +0 -121
  774. package/lib/commonjs/web/player/MediaSessionManager.js.map +0 -1
  775. package/lib/commonjs/web/player/RemoteCommandController.js +0 -96
  776. package/lib/commonjs/web/player/RemoteCommandController.js.map +0 -1
  777. package/lib/module/features/browser-config.js +0 -221
  778. package/lib/module/features/browser-config.js.map +0 -1
  779. package/lib/module/features/carConnection.js +0 -37
  780. package/lib/module/features/carConnection.js.map +0 -1
  781. package/lib/module/features/gate.js +0 -144
  782. package/lib/module/features/gate.js.map +0 -1
  783. package/lib/module/features/playback/trackPlaybackTime.js +0 -83
  784. package/lib/module/features/playback/trackPlaybackTime.js.map +0 -1
  785. package/lib/module/features/player/validateOptions.js +0 -20
  786. package/lib/module/features/player/validateOptions.js.map +0 -1
  787. package/lib/module/utils/artwork.js +0 -26
  788. package/lib/module/utils/artwork.js.map +0 -1
  789. package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +0 -67
  790. package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
  791. package/lib/module/web/TrackPlayer/PlaybackTimer.js +0 -29
  792. package/lib/module/web/TrackPlayer/PlaybackTimer.js.map +0 -1
  793. package/lib/module/web/TrackPlayer/PlayingStateFactory.js +0 -17
  794. package/lib/module/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
  795. package/lib/module/web/TrackPlayer/QueueManager.js +0 -269
  796. package/lib/module/web/TrackPlayer/QueueManager.js.map +0 -1
  797. package/lib/module/web/TrackPlayer/QueuePlayer.js +0 -154
  798. package/lib/module/web/TrackPlayer/QueuePlayer.js.map +0 -1
  799. package/lib/module/web/TrackPlayer/VolumeFader.js +0 -70
  800. package/lib/module/web/TrackPlayer/VolumeFader.js.map +0 -1
  801. package/lib/module/web/browser/assertBrowsePageShape.js +0 -18
  802. package/lib/module/web/browser/assertBrowsePageShape.js.map +0 -1
  803. package/lib/module/web/browser/classifyTrackNavigation.js +0 -38
  804. package/lib/module/web/browser/classifyTrackNavigation.js.map +0 -1
  805. package/lib/module/web/browser/parseSearchResponse.js +0 -16
  806. package/lib/module/web/browser/parseSearchResponse.js.map +0 -1
  807. package/lib/module/web/playbackErrorKind.js +0 -52
  808. package/lib/module/web/playbackErrorKind.js.map +0 -1
  809. package/lib/module/web/player/MediaSessionManager.js +0 -116
  810. package/lib/module/web/player/MediaSessionManager.js.map +0 -1
  811. package/lib/module/web/player/RemoteCommandController.js +0 -92
  812. package/lib/module/web/player/RemoteCommandController.js.map +0 -1
  813. package/lib/typescript/src/features/browser-config.d.ts +0 -12
  814. package/lib/typescript/src/features/browser-config.d.ts.map +0 -1
  815. package/lib/typescript/src/features/carConnection.d.ts +0 -20
  816. package/lib/typescript/src/features/carConnection.d.ts.map +0 -1
  817. package/lib/typescript/src/features/gate.d.ts +0 -78
  818. package/lib/typescript/src/features/gate.d.ts.map +0 -1
  819. package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +0 -34
  820. package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +0 -1
  821. package/lib/typescript/src/features/player/validateOptions.d.ts +0 -2
  822. package/lib/typescript/src/features/player/validateOptions.d.ts.map +0 -1
  823. package/lib/typescript/src/utils/artwork.d.ts +0 -19
  824. package/lib/typescript/src/utils/artwork.d.ts.map +0 -1
  825. package/nitrogen/generated/android/c++/JArtworkVariants.hpp +0 -61
  826. package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
  827. package/nitrogen/generated/android/c++/JFavoritesMatchMode.hpp +0 -58
  828. package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +0 -100
  829. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.hpp +0 -112
  830. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +0 -121
  831. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +0 -123
  832. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +0 -133
  833. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +0 -121
  834. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.hpp +0 -139
  835. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.hpp +0 -134
  836. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +0 -131
  837. package/nitrogen/generated/android/c++/JFunc_void_GateEvent.hpp +0 -79
  838. package/nitrogen/generated/android/c++/JFunc_void_Output.hpp +0 -80
  839. package/nitrogen/generated/android/c++/JGate.hpp +0 -62
  840. package/nitrogen/generated/android/c++/JGateDecision.hpp +0 -64
  841. package/nitrogen/generated/android/c++/JGateReason.hpp +0 -58
  842. package/nitrogen/generated/android/c++/JIOSOptions.hpp +0 -95
  843. package/nitrogen/generated/android/c++/JMediaReference.hpp +0 -58
  844. package/nitrogen/generated/android/c++/JNativeGateRequest.hpp +0 -74
  845. package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +0 -182
  846. package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +0 -96
  847. package/nitrogen/generated/android/c++/JOutputType.hpp +0 -82
  848. package/nitrogen/generated/android/c++/JPlaybackErrorKind.hpp +0 -76
  849. package/nitrogen/generated/android/c++/JRemoteButtonLayout.hpp +0 -86
  850. package/nitrogen/generated/android/c++/JStallReason.hpp +0 -58
  851. package/nitrogen/generated/android/c++/JTrackRequest.hpp +0 -93
  852. package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +0 -26
  853. package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +0 -71
  854. package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.cpp +0 -26
  855. package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.hpp +0 -75
  856. package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.cpp +0 -41
  857. package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +0 -121
  858. package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.cpp +0 -26
  859. package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.hpp +0 -70
  860. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNowPlayingParams.kt +0 -50
  861. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.kt +0 -80
  862. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.kt +0 -80
  863. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___Track.kt +0 -80
  864. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.kt +0 -80
  865. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_std__string____Track.kt +0 -80
  866. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.kt +0 -80
  867. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.kt +0 -80
  868. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +0 -44
  869. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaReference.kt +0 -23
  870. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeGateRequest.kt +0 -44
  871. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeSetupPlayerOptions.kt +0 -66
  872. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +0 -44
  873. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/OutputType.kt +0 -31
  874. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorKind.kt +0 -29
  875. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButton.kt +0 -26
  876. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButtonLayout.kt +0 -44
  877. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StallReason.kt +0 -23
  878. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackRequest.kt +0 -44
  879. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
  880. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.kt +0 -65
  881. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_String_ArtworkVariants.kt +0 -53
  882. package/nitrogen/generated/ios/swift/ArtworkVariants.swift +0 -34
  883. package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
  884. package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
  885. package/nitrogen/generated/ios/swift/FormatNowPlayingParams.swift +0 -67
  886. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.swift +0 -54
  887. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +0 -69
  888. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___Track.swift +0 -54
  889. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.swift +0 -60
  890. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_std__string____Track.swift +0 -60
  891. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.swift +0 -61
  892. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.swift +0 -61
  893. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.swift +0 -77
  894. package/nitrogen/generated/ios/swift/Func_void_GateDecision.swift +0 -46
  895. package/nitrogen/generated/ios/swift/Func_void_TransformableRequestConfig.swift +0 -46
  896. package/nitrogen/generated/ios/swift/Func_void_std__optional_NowPlayingUpdate_.swift +0 -46
  897. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +0 -53
  898. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_TransformableRequestConfig__.swift +0 -66
  899. package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError____.swift +0 -81
  900. package/nitrogen/generated/ios/swift/Gate.swift +0 -47
  901. package/nitrogen/generated/ios/swift/GateDecision.swift +0 -40
  902. package/nitrogen/generated/ios/swift/GateEvent.swift +0 -29
  903. package/nitrogen/generated/ios/swift/GateReason.swift +0 -40
  904. package/nitrogen/generated/ios/swift/IOSOptions.swift +0 -51
  905. package/nitrogen/generated/ios/swift/MediaReference.swift +0 -40
  906. package/nitrogen/generated/ios/swift/NativeGateRequest.swift +0 -58
  907. package/nitrogen/generated/ios/swift/NativeSetupPlayerOptions.swift +0 -206
  908. package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +0 -90
  909. package/nitrogen/generated/ios/swift/OutputType.swift +0 -72
  910. package/nitrogen/generated/ios/swift/PlaybackErrorKind.swift +0 -64
  911. package/nitrogen/generated/ios/swift/RemoteButtonLayout.swift +0 -57
  912. package/nitrogen/generated/ios/swift/StallReason.swift +0 -40
  913. package/nitrogen/generated/ios/swift/TrackRequest.swift +0 -106
  914. package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
  915. package/nitrogen/generated/ios/swift/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.swift +0 -19
  916. package/nitrogen/generated/ios/swift/Variant_String_ArtworkVariants.swift +0 -18
  917. package/nitrogen/generated/shared/c++/ArtworkVariants.hpp +0 -87
  918. package/nitrogen/generated/shared/c++/FavoritesMatchMode.hpp +0 -76
  919. package/nitrogen/generated/shared/c++/FormatNowPlayingParams.hpp +0 -110
  920. package/nitrogen/generated/shared/c++/GateReason.hpp +0 -76
  921. package/nitrogen/generated/shared/c++/IOSOptions.hpp +0 -91
  922. package/nitrogen/generated/shared/c++/MediaReference.hpp +0 -76
  923. package/nitrogen/generated/shared/c++/NativeGateRequest.hpp +0 -97
  924. package/nitrogen/generated/shared/c++/NativeSetupPlayerOptions.hpp +0 -138
  925. package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +0 -92
  926. package/nitrogen/generated/shared/c++/OutputType.hpp +0 -108
  927. package/nitrogen/generated/shared/c++/PlaybackErrorKind.hpp +0 -100
  928. package/nitrogen/generated/shared/c++/RemoteButtonLayout.hpp +0 -94
  929. package/nitrogen/generated/shared/c++/StallReason.hpp +0 -76
  930. package/nitrogen/generated/shared/c++/TrackRequest.hpp +0 -93
  931. package/src/codegen-no-config-variant.test.ts +0 -70
  932. package/src/features/browser-config.test.ts +0 -110
  933. package/src/features/browser-config.ts +0 -293
  934. package/src/features/browser.test.ts +0 -19
  935. package/src/features/carConnection.ts +0 -36
  936. package/src/features/gate.test.ts +0 -72
  937. package/src/features/gate.ts +0 -155
  938. package/src/features/playback/trackPlaybackTime.test.ts +0 -80
  939. package/src/features/playback/trackPlaybackTime.ts +0 -101
  940. package/src/features/player/options.test.ts +0 -38
  941. package/src/features/player/setup.test.ts +0 -125
  942. package/src/features/player/validateOptions.ts +0 -22
  943. package/src/features/queue/queue.test.ts +0 -36
  944. package/src/public-surface.test.ts +0 -116
  945. package/src/utils/artwork.ts +0 -30
  946. package/src/web/NativeAudioBrowser.playWhenReady.test.ts +0 -301
  947. package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +0 -139
  948. package/src/web/TrackPlayer/PlaybackStateMachine.ts +0 -82
  949. package/src/web/TrackPlayer/PlaybackTimer.test.ts +0 -67
  950. package/src/web/TrackPlayer/PlaybackTimer.ts +0 -33
  951. package/src/web/TrackPlayer/Player.dispatch.test.ts +0 -229
  952. package/src/web/TrackPlayer/Player.load.test.ts +0 -86
  953. package/src/web/TrackPlayer/PlayingStateFactory.test.ts +0 -51
  954. package/src/web/TrackPlayer/PlayingStateFactory.ts +0 -24
  955. package/src/web/TrackPlayer/QueueManager.test.ts +0 -289
  956. package/src/web/TrackPlayer/QueueManager.ts +0 -302
  957. package/src/web/TrackPlayer/QueuePlayer.ts +0 -188
  958. package/src/web/TrackPlayer/VolumeFader.ts +0 -74
  959. package/src/web/browser/__tests__/layer-resolver.test.ts +0 -69
  960. package/src/web/browser/assertBrowsePageShape.test.ts +0 -27
  961. package/src/web/browser/assertBrowsePageShape.ts +0 -27
  962. package/src/web/browser/classifyTrackNavigation.test.ts +0 -41
  963. package/src/web/browser/classifyTrackNavigation.ts +0 -35
  964. package/src/web/browser/parseSearchResponse.test.ts +0 -25
  965. package/src/web/browser/parseSearchResponse.ts +0 -15
  966. package/src/web/http/RequestConfigBuilder.test.ts +0 -59
  967. package/src/web/playbackErrorKind.test.ts +0 -55
  968. package/src/web/playbackErrorKind.ts +0 -56
  969. package/src/web/player/MediaSessionManager.test.ts +0 -220
  970. package/src/web/player/MediaSessionManager.ts +0 -151
  971. package/src/web/player/NowPlayingManager.test.ts +0 -46
  972. package/src/web/player/RemoteCommandController.test.ts +0 -171
  973. package/src/web/player/RemoteCommandController.ts +0 -166
@@ -8,7 +8,6 @@ import android.os.Handler
8
8
  import android.os.IBinder
9
9
  import android.os.Looper
10
10
  import androidx.annotation.Keep
11
- import androidx.car.app.connection.CarConnection
12
11
  import androidx.lifecycle.DefaultLifecycleObserver
13
12
  import androidx.lifecycle.LifecycleOwner
14
13
  import androidx.lifecycle.ProcessLifecycleOwner
@@ -16,41 +15,38 @@ import androidx.media3.session.MediaBrowser
16
15
  import androidx.media3.session.SessionToken
17
16
  import com.audiobrowser.browser.BrowserConfig
18
17
  import com.audiobrowser.browser.BrowserManager
18
+ import com.audiobrowser.browser.handleTrackLoad
19
19
  import com.audiobrowser.browser.CallbackException
20
20
  import com.audiobrowser.browser.ContentNotFoundException
21
21
  import com.audiobrowser.browser.HttpStatusException
22
22
  import com.audiobrowser.browser.NetworkException
23
- import com.audiobrowser.browser.handleTrackLoad
24
- import com.audiobrowser.browser.resolveMediaUrl
25
23
  import com.audiobrowser.extension.NumberExt.Companion.toSeconds
24
+ import com.audiobrowser.http.RequestConfigBuilder
25
+ import com.audiobrowser.model.PlaybackMetadata
26
26
  import com.audiobrowser.model.PlayerSetupOptions
27
27
  import com.audiobrowser.model.PlayerUpdateOptions
28
- import com.audiobrowser.player.Player
29
28
  import com.audiobrowser.util.BatteryOptimizationHelper
30
29
  import com.audiobrowser.util.BatteryWarningStore
31
30
  import com.audiobrowser.util.BrowserPathHelper
32
- import com.audiobrowser.util.OutputMonitor
33
- import com.audiobrowser.util.OutputSwitcher
31
+ import com.audiobrowser.util.CoilBitmapLoader
34
32
  import com.audiobrowser.util.SystemVolumeMonitor
35
33
  import com.facebook.proguard.annotations.DoNotStrip
36
34
  import com.google.common.util.concurrent.ListenableFuture
37
35
  import com.margelo.nitro.NitroModules
36
+ import com.margelo.nitro.audiobrowser.ChapterMetadata
37
+ import com.margelo.nitro.audiobrowser.TimedMetadata
38
+ import com.margelo.nitro.audiobrowser.TrackMetadata
38
39
  import com.margelo.nitro.audiobrowser.BatteryOptimizationStatus
39
40
  import com.margelo.nitro.audiobrowser.BatteryOptimizationStatusChangedEvent
40
41
  import com.margelo.nitro.audiobrowser.BatteryWarningPendingChangedEvent
41
- import com.margelo.nitro.audiobrowser.ChapterMetadata
42
42
  import com.margelo.nitro.audiobrowser.EqualizerSettings
43
43
  import com.margelo.nitro.audiobrowser.FavoriteChangedEvent
44
44
  import com.margelo.nitro.audiobrowser.FormatNavigationErrorParams
45
45
  import com.margelo.nitro.audiobrowser.FormattedNavigationError
46
- import com.margelo.nitro.audiobrowser.Gate
47
- import com.margelo.nitro.audiobrowser.GateDecision
48
- import com.margelo.nitro.audiobrowser.GateEvent
49
46
  import com.margelo.nitro.audiobrowser.HybridAudioBrowserSpec
47
+ import com.margelo.nitro.audiobrowser.IosOutput
50
48
  import com.margelo.nitro.audiobrowser.MediaRequestConfig
51
49
  import com.margelo.nitro.audiobrowser.NativeBrowserConfiguration
52
- import com.margelo.nitro.audiobrowser.NativeGateRequest
53
- import com.margelo.nitro.audiobrowser.NativeSetupPlayerOptions
54
50
  import com.margelo.nitro.audiobrowser.NativeUpdateOptions
55
51
  import com.margelo.nitro.audiobrowser.NavigationError
56
52
  import com.margelo.nitro.audiobrowser.NavigationErrorEvent
@@ -58,7 +54,7 @@ import com.margelo.nitro.audiobrowser.NavigationErrorType
58
54
  import com.margelo.nitro.audiobrowser.NowPlayingMetadata
59
55
  import com.margelo.nitro.audiobrowser.NowPlayingUpdate
60
56
  import com.margelo.nitro.audiobrowser.Options
61
- import com.margelo.nitro.audiobrowser.Output
57
+ import com.margelo.nitro.audiobrowser.PartialSetupPlayerOptions
62
58
  import com.margelo.nitro.audiobrowser.Playback
63
59
  import com.margelo.nitro.audiobrowser.PlaybackActiveTrackChangedEvent
64
60
  import com.margelo.nitro.audiobrowser.PlaybackError
@@ -66,7 +62,6 @@ import com.margelo.nitro.audiobrowser.PlaybackErrorEvent
66
62
  import com.margelo.nitro.audiobrowser.PlaybackPlayWhenReadyChangedEvent
67
63
  import com.margelo.nitro.audiobrowser.PlaybackProgressUpdatedEvent
68
64
  import com.margelo.nitro.audiobrowser.PlaybackQueueEndedEvent
69
- import com.margelo.nitro.audiobrowser.PlaybackState
70
65
  import com.margelo.nitro.audiobrowser.PlayingState
71
66
  import com.margelo.nitro.audiobrowser.Progress
72
67
  import com.margelo.nitro.audiobrowser.RemoteJumpBackwardEvent
@@ -74,14 +69,15 @@ import com.margelo.nitro.audiobrowser.RemoteJumpForwardEvent
74
69
  import com.margelo.nitro.audiobrowser.RemotePlayIdEvent
75
70
  import com.margelo.nitro.audiobrowser.RemotePlaySearchEvent
76
71
  import com.margelo.nitro.audiobrowser.RemoteSeekEvent
72
+ import com.margelo.nitro.audiobrowser.RemoteSetRatingEvent
77
73
  import com.margelo.nitro.audiobrowser.RemoteSkipEvent
78
74
  import com.margelo.nitro.audiobrowser.RepeatMode
79
75
  import com.margelo.nitro.audiobrowser.RepeatModeChangedEvent
76
+ import com.margelo.nitro.audiobrowser.RequestConfig
80
77
  import com.margelo.nitro.audiobrowser.ResolvedTrack
81
78
  import com.margelo.nitro.audiobrowser.SleepTimer
82
- import com.margelo.nitro.audiobrowser.TimedMetadata
83
79
  import com.margelo.nitro.audiobrowser.Track
84
- import com.margelo.nitro.audiobrowser.TrackMetadata
80
+ import com.margelo.nitro.audiobrowser.UpdateOptions
85
81
  import com.margelo.nitro.core.Promise
86
82
  import java.util.concurrent.TimeUnit
87
83
  import kotlin.coroutines.resume
@@ -99,14 +95,6 @@ import timber.log.Timber
99
95
  @Keep
100
96
  @DoNotStrip
101
97
  class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
102
-
103
- /** Called by Nitro when the JS object is destroyed (incl. JS runtime reloads). */
104
- override fun dispose() {
105
- systemVolumeMonitor.destroy()
106
- outputMonitor.destroy()
107
- super.dispose()
108
- }
109
-
110
98
  private val mainScope = MainScope()
111
99
  private var navigationJob: Job? = null
112
100
  private val handler = Handler(Looper.getMainLooper())
@@ -119,18 +107,14 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
119
107
  NativeBrowserConfiguration(
120
108
  path = null,
121
109
  request = null,
122
- requestResolver = null,
123
- browse = null,
124
- browseResolver = null,
125
110
  media = null,
126
111
  artwork = null,
127
- nowPlayingArtwork = null,
128
112
  routes = null,
129
113
  singleTrack = null,
130
114
  handleTrackLoad = null,
131
115
  androidControllerOfflineError = null,
132
- carPlayLoadingTitle = null,
133
- resolveAlbumUrl = null,
116
+ carPlayUpNextButton = null,
117
+ carPlayNowPlayingButtons = null,
134
118
  formatNavigationError = null,
135
119
  )
136
120
 
@@ -139,11 +123,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
139
123
  setOnPathChanged { path -> onPathChanged(path) }
140
124
  setOnContentChanged { content -> onContentChanged(content) }
141
125
  setOnTabsChanged { tabs -> onTabsChanged(tabs) }
142
- setOnArtworkRegistriesCleared { connectedService?.player?.browseArtworkRegistry?.clear() }
143
126
  }
144
127
 
145
128
  private val systemVolumeMonitor = SystemVolumeMonitor(context)
146
- private val outputMonitor = OutputMonitor(context)
147
129
 
148
130
  // MARK: Player state
149
131
  private var updateOptions: PlayerUpdateOptions = PlayerUpdateOptions()
@@ -152,11 +134,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
152
134
  private var connectedService: Service? = null
153
135
  private var setupPromise: ((Unit) -> Unit)? = null
154
136
 
155
- // Initial player state staged before the player exists — from setup options or the imperative
156
- // setters called pre-bind. Strict last-write-wins; consumed when the player comes up.
157
- private var pendingPlayWhenReady: Boolean? = null
158
- private var pendingRepeatMode: RepeatMode? = null
159
-
160
137
  /** Post callback to main handler for consistent async delivery to JS - avoids deadlocks */
161
138
  private fun post(block: () -> Unit) = handler.post(block)
162
139
 
@@ -167,21 +144,13 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
167
144
  override var onNavigationError: (NavigationErrorEvent) -> Unit = {}
168
145
  override var onFormattedNavigationError: (FormattedNavigationError?) -> Unit = {}
169
146
 
170
- // MARK: Gate callbacks (native→JS; set from JS, native CALLS them)
171
- // Default resolver: only reachable in the init window where the native side has recorded
172
- // hasResolver=true but JS hasn't yet assigned the real `resolveGate` slot. It DENIES by default
173
- // (gated=true) so an active gate never serves content during that window — same fail-closed
174
- // direction as the resolver-error path in [gateDecision]. The static-gate fast path skips it
175
- // entirely once a resolver-less gate is set.
176
- override var resolveGate: (request: NativeGateRequest) -> Promise<Promise<GateDecision>> = {
177
- Promise.resolved(Promise.resolved(GateDecision(gated = true, gate = null)))
178
- }
179
- override var onGate: (event: GateEvent) -> Unit = {}
180
-
181
147
  // MARK: Player callbacks
182
148
  override var onPlaybackChanged: (data: Playback) -> Unit = {}
149
+ override var onRemoteBookmark: () -> Unit = {}
150
+ override var onRemoteDislike: () -> Unit = {}
183
151
  override var onRemoteJumpBackward: (RemoteJumpBackwardEvent) -> Unit = {}
184
152
  override var onRemoteJumpForward: (RemoteJumpForwardEvent) -> Unit = {}
153
+ override var onRemoteLike: () -> Unit = {}
185
154
  override var onRemoteNext: () -> Unit = {}
186
155
  override var onRemotePause: () -> Unit = {}
187
156
  override var onChapterMetadata: (chapters: Array<ChapterMetadata>) -> Unit = {}
@@ -193,7 +162,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
193
162
  {}
194
163
  override var onPlaybackPlayingState: (data: PlayingState) -> Unit = {}
195
164
  override var onPlaybackProgressUpdated: (data: PlaybackProgressUpdatedEvent) -> Unit = {}
196
- override var onPlaybackInterval: () -> Unit = {}
197
165
  override var onPlaybackQueueEnded: (data: PlaybackQueueEndedEvent) -> Unit = {}
198
166
  override var onPlaybackQueueChanged: (queue: Array<Track>) -> Unit = {}
199
167
  override var onPlaybackRepeatModeChanged: (data: RepeatModeChangedEvent) -> Unit = {}
@@ -203,6 +171,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
203
171
  override var onRemotePlaySearch: (RemotePlaySearchEvent) -> Unit = {}
204
172
  override var onRemotePrevious: () -> Unit = {}
205
173
  override var onRemoteSeek: (RemoteSeekEvent) -> Unit = {}
174
+ override var onRemoteSetRating: (RemoteSetRatingEvent) -> Unit = {}
206
175
  override var onRemoteSkip: (RemoteSkipEvent) -> Unit = {}
207
176
  override var onRemoteStop: () -> Unit = {}
208
177
  override var onOptionsChanged: (Options) -> Unit = {}
@@ -215,11 +184,14 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
215
184
  override var onBatteryOptimizationStatusChanged: (BatteryOptimizationStatusChangedEvent) -> Unit =
216
185
  {}
217
186
  override var onSystemVolumeChanged: (Double) -> Unit = {}
218
- override var onOutputChanged: (Output) -> Unit = {}
187
+ override var onIosOutputChanged: (IosOutput) -> Unit = {}
219
188
 
220
189
  // MARK: Remote handlers
190
+ override var handleRemoteBookmark: (() -> Unit)? = null
191
+ override var handleRemoteDislike: (() -> Unit)? = null
221
192
  override var handleRemoteJumpBackward: ((RemoteJumpBackwardEvent) -> Unit)? = null
222
193
  override var handleRemoteJumpForward: ((RemoteJumpForwardEvent) -> Unit)? = null
194
+ override var handleRemoteLike: (() -> Unit)? = null
223
195
  override var handleRemoteNext: (() -> Unit)? = null
224
196
  override var handleRemotePause: (() -> Unit)? = null
225
197
  override var handleRemotePlay: (() -> Unit)? = null
@@ -260,14 +232,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
260
232
  handler.post { ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleObserver) }
261
233
 
262
234
  // Observe system volume changes
263
- systemVolumeMonitor.setOnVolumeChanged { volume -> post { onSystemVolumeChanged(volume) } }
264
-
265
- // Observe current audio output changes (active media route via AudioManager)
266
- outputMonitor.setOnOutputChanged { output -> post { onOutputChanged(output) } }
267
- outputMonitor.start()
268
-
269
- // Observe the car connection (Android Auto / Android Automotive)
270
- startCarConnectionObserver(context, handler)
235
+ systemVolumeMonitor.setOnVolumeChanged { volume ->
236
+ post { onSystemVolumeChanged(volume) }
237
+ }
271
238
  }
272
239
 
273
240
  // ============================================================================
@@ -277,12 +244,8 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
277
244
  internal fun buildConfig(): BrowserConfig {
278
245
  return BrowserConfig(
279
246
  request = _configuration.request,
280
- requestResolver = _configuration.requestResolver,
281
- browse = _configuration.browse,
282
- browseResolver = _configuration.browseResolver,
283
247
  media = _configuration.media,
284
248
  artwork = _configuration.artwork,
285
- nowPlayingArtwork = _configuration.nowPlayingArtwork,
286
249
  routes = _configuration.routes,
287
250
  singleTrack = _configuration.singleTrack ?: false,
288
251
  androidControllerOfflineError = _configuration.androidControllerOfflineError ?: true,
@@ -290,14 +253,34 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
290
253
  }
291
254
 
292
255
  /**
293
- * Media URL transformation for [com.audiobrowser.player.TransformingDataSource]. Resolution lives
294
- * in [resolveMediaUrl] (browser/BrowserUrlResolution.kt); this shell owns only the blocking
295
- * bridge: it runs on ExoPlayer's IO thread (TransformingDataSource.open), so blocking here is
296
- * safe and intentional.
256
+ * Returns the artwork configuration for use by CoilBitmapLoader. This provides access to the base
257
+ * request config and artwork-specific config.
258
+ */
259
+ fun getArtworkConfig(): CoilBitmapLoader.ArtworkConfig? {
260
+ val artworkConfig = _configuration.artwork ?: return null
261
+ val baseConfig =
262
+ _configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
263
+ ?: RequestConfig(null, null, null, null, null, null, null, null)
264
+ return CoilBitmapLoader.ArtworkConfig(baseConfig, artworkConfig)
265
+ }
266
+
267
+ /**
268
+ * Creates a request config for media URL transformation by merging base and media configs.
269
+ * Returns null if no media configuration is set.
297
270
  */
298
271
  fun getMediaRequestConfig(originalUrl: String): MediaRequestConfig? {
272
+ val mediaConfig = _configuration.media ?: return null
273
+
299
274
  return try {
300
- runBlocking { browserManager.resolveMediaUrl(originalUrl) }
275
+ // Create base request config with the original URL as path
276
+ val baseConfig =
277
+ _configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
278
+ ?: RequestConfig(null, null, null, null, null, null, null, null)
279
+ val urlRequestConfig = RequestConfig(null, originalUrl, null, null, null, null, null, null)
280
+ val mergedBaseConfig = RequestConfigBuilder.mergeConfig(baseConfig, urlRequestConfig)
281
+
282
+ // Apply media transformation
283
+ runBlocking { RequestConfigBuilder.mergeConfig(mergedBaseConfig, mediaConfig) }
301
284
  } catch (e: Exception) {
302
285
  Timber.e(e, "Failed to transform media URL: $originalUrl")
303
286
  null
@@ -309,15 +292,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
309
292
  return _configuration.routes?.any { it.path != BrowserManager.SEARCH_ROUTE_PATH } == true
310
293
  }
311
294
 
312
- // Suspending on purpose: queryTabs() resolves tabs by invoking JS callbacks,
313
- // which can only run on the JS thread. Callers MUST invoke this from a
314
- // coroutine (off the JS thread) — never via runBlocking on a synchronous Nitro
315
- // setter, which runs on the JS thread and would deadlock (the JS thread blocks
316
- // waiting for callbacks that need that same thread to run).
317
- private suspend fun getDefaultPath(): String? {
295
+ private fun getDefaultPath(): String? {
318
296
  return try {
319
297
  browserManager.config = buildConfig()
320
- val tabs = browserManager.queryTabs()
298
+ val tabs = runBlocking { browserManager.queryTabs() }
321
299
  if (tabs.isNotEmpty()) {
322
300
  Timber.d("Using first tab as default path: ${tabs[0].url}")
323
301
  tabs[0].url
@@ -325,8 +303,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
325
303
  Timber.d("Using root path as default: /")
326
304
  "/"
327
305
  }
328
- } catch (e: CancellationException) {
329
- throw e // Rethrow so cooperative cancellation isn't swallowed
330
306
  } catch (e: Exception) {
331
307
  Timber.e(e, "Failed to get default path, falling back to /")
332
308
  "/"
@@ -342,25 +318,23 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
342
318
  set(value) {
343
319
  if (hasValidConfiguration()) {
344
320
  browserManager.config = buildConfig()
345
- clearNavigationError()
346
-
347
- // Cancel previous navigation to avoid race conditions
348
- navigationJob?.cancel()
349
-
350
- // Resolve the default path inside the coroutine (getDefaultPath queries
351
- // tabs via JS callbacks) so it never blocks the JS thread this setter
352
- // runs on.
353
- navigationJob =
354
- mainScope.launch {
355
- val path = value ?: getDefaultPath() ?: return@launch
356
- try {
357
- browserManager.navigate(path)
358
- } catch (e: CancellationException) {
359
- throw e // Rethrow to properly cancel
360
- } catch (e: Exception) {
361
- handleBrowserException(e, path, "setting path: $path")
321
+ (value ?: getDefaultPath())?.let { path ->
322
+ clearNavigationError()
323
+
324
+ // Cancel previous navigation to avoid race conditions
325
+ navigationJob?.cancel()
326
+
327
+ navigationJob =
328
+ mainScope.launch {
329
+ try {
330
+ browserManager.navigate(path)
331
+ } catch (e: CancellationException) {
332
+ throw e // Rethrow to properly cancel
333
+ } catch (e: Exception) {
334
+ handleBrowserException(e, path, "setting path: $path")
335
+ }
362
336
  }
363
- }
337
+ }
364
338
  }
365
339
  }
366
340
 
@@ -378,54 +352,45 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
378
352
  // This allows Android Auto to start browsing content
379
353
  connectedService?.player?.notifyBrowserConfigurationReady()
380
354
 
381
- clearNavigationError()
382
-
383
- // Cancel previous navigation to avoid race conditions
384
- navigationJob?.cancel()
385
-
386
- // Navigate to the initial path, or default to the first tab. The default
387
- // path is resolved inside the coroutine (getDefaultPath queries tabs via
388
- // JS callbacks) so it never blocks the JS thread this setter runs on —
389
- // doing it synchronously here via runBlocking deadlocked: the JS callbacks
390
- // can't run because the JS thread is blocked waiting for them.
391
- navigationJob =
392
- mainScope.launch {
393
- val path = value.path ?: getDefaultPath() ?: return@launch
394
- try {
395
- browserManager.navigate(path)
396
- } catch (e: CancellationException) {
397
- throw e // Rethrow to properly cancel
398
- } catch (e: Exception) {
399
- handleBrowserException(e, path, "setting configuration path: $path")
355
+ // Navigate to initial path or default to first tab
356
+ (value.path ?: getDefaultPath())?.let { path ->
357
+ clearNavigationError()
358
+
359
+ // Cancel previous navigation to avoid race conditions
360
+ navigationJob?.cancel()
361
+
362
+ navigationJob =
363
+ mainScope.launch {
364
+ try {
365
+ browserManager.navigate(path)
366
+ } catch (e: CancellationException) {
367
+ throw e // Rethrow to properly cancel
368
+ } catch (e: Exception) {
369
+ handleBrowserException(e, path, "setting configuration path: $path")
370
+ }
400
371
  }
401
- }
372
+ }
402
373
  }
403
374
 
404
375
  private var navigationError: NavigationError? = null
405
376
  private var formattedNavigationError: FormattedNavigationError? = null
406
377
 
407
378
  override fun getNavigationError(): NavigationError? = navigationError
408
-
409
379
  override fun getFormattedNavigationError(): FormattedNavigationError? = formattedNavigationError
410
380
 
411
381
  /** Creates a default formatted error from a NavigationError */
412
382
  private fun defaultFormattedError(error: NavigationError): FormattedNavigationError {
413
- val title =
414
- when (error.code) {
415
- NavigationErrorType.CONTENT_NOT_FOUND -> "Content Not Found"
416
- NavigationErrorType.NETWORK_ERROR -> "Network Error"
417
- NavigationErrorType.HTTP_ERROR -> {
418
- // Use system-localized HTTP status text (e.g., "Not Found", "Service Unavailable")
419
- error.statusCode?.let { httpStatusText(it.toInt()) } ?: "Server Error"
420
- }
421
- NavigationErrorType.CALLBACK_ERROR -> "Error"
422
- NavigationErrorType.UNKNOWN_ERROR -> "Error"
423
- // Not a failure — a container that resolved with no children. Neutral copy. See ADR 0001.
424
- NavigationErrorType.EMPTY_CONTENT -> "Nothing here"
425
- NavigationErrorType.TIMEOUT -> "Couldn't load"
383
+ val title = when (error.code) {
384
+ NavigationErrorType.CONTENT_NOT_FOUND -> "Content Not Found"
385
+ NavigationErrorType.NETWORK_ERROR -> "Network Error"
386
+ NavigationErrorType.HTTP_ERROR -> {
387
+ // Use system-localized HTTP status text (e.g., "Not Found", "Service Unavailable")
388
+ error.statusCode?.let { httpStatusText(it.toInt()) } ?: "Server Error"
426
389
  }
427
- // Omit an empty message so it renders as title-only (e.g. the empty-content case).
428
- return FormattedNavigationError(title, error.message.takeIf { it.isNotEmpty() })
390
+ NavigationErrorType.CALLBACK_ERROR -> "Error"
391
+ NavigationErrorType.UNKNOWN_ERROR -> "Error"
392
+ }
393
+ return FormattedNavigationError(title, error.message)
429
394
  }
430
395
 
431
396
  /** Returns localized HTTP status text for the given status code */
@@ -492,35 +457,19 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
492
457
  }
493
458
  is NetworkException -> {
494
459
  Timber.e(e, "Network error $logContext")
495
- setNavigationError(
496
- NavigationErrorType.NETWORK_ERROR,
497
- e.message ?: "Network request failed",
498
- path,
499
- )
460
+ setNavigationError(NavigationErrorType.NETWORK_ERROR, e.message ?: "Network request failed", path)
500
461
  }
501
462
  is ContentNotFoundException -> {
502
463
  Timber.e(e, "Content not found $logContext")
503
- setNavigationError(
504
- NavigationErrorType.CONTENT_NOT_FOUND,
505
- e.message ?: "Content not found",
506
- path,
507
- )
464
+ setNavigationError(NavigationErrorType.CONTENT_NOT_FOUND, e.message ?: "Content not found", path)
508
465
  }
509
466
  is CallbackException -> {
510
467
  Timber.e(e, "Callback error $logContext")
511
- setNavigationError(
512
- NavigationErrorType.CALLBACK_ERROR,
513
- e.message ?: "An error occurred",
514
- path,
515
- )
468
+ setNavigationError(NavigationErrorType.CALLBACK_ERROR, e.message ?: "An error occurred", path)
516
469
  }
517
470
  else -> {
518
471
  Timber.e(e, "Unexpected error $logContext")
519
- setNavigationError(
520
- NavigationErrorType.UNKNOWN_ERROR,
521
- e.message ?: "An unexpected error occurred",
522
- path,
523
- )
472
+ setNavigationError(NavigationErrorType.UNKNOWN_ERROR, e.message ?: "An unexpected error occurred", path)
524
473
  }
525
474
  }
526
475
  }
@@ -580,17 +529,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
580
529
  val index = player.tracks.indexOfFirst { it.src == trackId }
581
530
  if (index >= 0) {
582
531
  Timber.d("Queue already from $parentPath, skipping to index $index")
583
- handleTrackLoad(
584
- _configuration.handleTrackLoad,
585
- track,
586
- player.tracks,
587
- index.toDouble(),
588
- intercepted = {},
589
- defaultBehavior = {
590
- player.skipTo(index)
591
- player.play()
592
- },
593
- )
532
+ handleTrackLoad(_configuration.handleTrackLoad, track, player.tracks, index.toDouble(), intercepted = {}, defaultBehavior = {
533
+ player.skipTo(index)
534
+ player.play()
535
+ })
594
536
  return@launch
595
537
  }
596
538
  }
@@ -603,31 +545,17 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
603
545
  Timber.d(
604
546
  "Loading expanded queue: ${tracks.size} tracks, starting at index $startIndex"
605
547
  )
606
- handleTrackLoad(
607
- _configuration.handleTrackLoad,
608
- track,
609
- tracks,
610
- startIndex.toDouble(),
611
- intercepted = {},
612
- defaultBehavior = {
613
- // Replace queue and seek to selected track
614
- // Use internal player methods directly to avoid blocking on main thread
615
- player.setQueue(tracks, startIndex, sourcePath = parentPath)
616
- player.play()
617
- },
618
- )
548
+ handleTrackLoad(_configuration.handleTrackLoad, track, tracks, startIndex.toDouble(), intercepted = {}, defaultBehavior = {
549
+ // Replace queue and seek to selected track
550
+ // Use internal player methods directly to avoid blocking on main thread
551
+ player.setQueue(tracks, startIndex, sourcePath = parentPath)
552
+ player.play()
553
+ })
619
554
  return@launch
620
555
  } else {
621
556
  // Fallback: just load the single track
622
557
  Timber.w("Queue expansion failed, loading single track")
623
- handleTrackLoad(
624
- _configuration.handleTrackLoad,
625
- track,
626
- arrayOf(track),
627
- 0.0,
628
- intercepted = {},
629
- defaultBehavior = { player.load(track) },
630
- )
558
+ handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
631
559
  }
632
560
  }
633
561
  // Navigate to browsable track to show browsing UI
@@ -638,14 +566,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
638
566
  // If track is playable (has src), load it into player
639
567
  track.src != null -> {
640
568
  Timber.d("Loading playable track into player: ${track.title}")
641
- handleTrackLoad(
642
- _configuration.handleTrackLoad,
643
- track,
644
- arrayOf(track),
645
- 0.0,
646
- intercepted = {},
647
- defaultBehavior = { player.load(track) },
648
- )
569
+ handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
649
570
  }
650
571
  else -> {
651
572
  throw IllegalArgumentException("Track must have either an 'url' or an 'src' property")
@@ -686,125 +607,20 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
686
607
  }
687
608
  }
688
609
 
689
- override fun invalidateAllContent() {
690
- Timber.d("Invalidating all content")
691
-
692
- // Clear all cached content so every path re-fetches fresh data
693
- browserManager.clearContentCache()
694
-
695
- // Notify external media controllers (Android Auto) to refresh subscribed paths
696
- connectedService?.player?.invalidateAllContent()
697
-
698
- // Refresh whatever the browser is currently viewing
699
- mainScope.launch { browserManager.refresh() }
700
- }
701
-
702
610
  override fun setFavorites(favorites: Array<String>) {
703
611
  browserManager.setFavorites(favorites.toList())
704
612
  }
705
613
 
706
- // MARK: Gate
707
-
708
- /** A gate decision for one request: whether to gate, and which chrome to render. */
709
- data class GateOutcome(val gated: Boolean, val chrome: Gate?)
710
-
711
- // The minimal chrome rendered when a gate is active but no override or stored
712
- // default chrome exists (the resolver-only setGate overload).
713
- private val builtInGate = Gate("Unavailable", null)
714
-
715
- /**
716
- * The three gate fields as one immutable triple so [gateDecision] reads them as a unit. Written
717
- * from the JS thread, read from the Media3 application thread (the enforcement sites in
718
- * MediaSessionCallback consult it) — hence the single field is @Volatile.
719
- *
720
- * Folding the three former @Volatile fields into one reference is what makes the read atomic:
721
- *
722
- * @Volatile gives per-field visibility but NO atomicity across a compound read, so reading three
723
- * separate volatiles in [gateDecision] could interleave with a concurrent [clearGate] and yield
724
- * a torn `(active=true, chrome=null)` state that crashed the force-unwrap at the serve sites.
725
- * One volatile reference read once cannot tear.
726
- */
727
- private data class GateState(val active: Boolean, val chrome: Gate?, val hasResolver: Boolean)
728
-
729
- @Volatile private var gateState = GateState(active = false, chrome = null, hasResolver = false)
730
-
731
- override fun setGate(gate: Gate?, hasResolver: Boolean) {
732
- // Single atomic assignment — readers never see a half-updated triple.
733
- gateState = GateState(active = true, chrome = gate, hasResolver = hasResolver)
734
- // Re-query every subscribed parent so a connected controller (Android
735
- // Auto) swaps its lists for the gate tile without reconnecting. Notify
736
- // only — the content cache stays warm for when the gate clears.
737
- connectedService?.player?.invalidateAllContent()
738
- }
739
-
740
- override fun clearGate() {
741
- if (!gateState.active) return
742
- // Single atomic assignment — readers never see a half-cleared triple.
743
- gateState = GateState(active = false, chrome = null, hasResolver = false)
744
- connectedService?.player?.invalidateAllContent()
745
- }
746
-
747
- /**
748
- * The single gate choke point. Each enforcement site (browse / search) calls this for the current
749
- * request and serves the gate chrome when [GateOutcome.gated] is true. Structurally similar to
750
- * the iOS `gateDecision(for:)` helper, but note the concurrency model differs: iOS confines gate
751
- * state to `@MainActor`; here the consistent read comes from snapshotting the single [gateState]
752
- * reference once (see [GateState]).
753
- * - No active gate → allow.
754
- * - Active gate, no resolver → static fast path: gate with the stored default chrome (or built-in
755
- * if none), no JS hop.
756
- * - Active gate with a resolver → ask JS per request. A resolver that throws / rejects / times
757
- * out FAILS CLOSED by design: while a gate is active the consumer has declared content blocked,
758
- * so the only safe fallback when we cannot compute the per-request decision is the gate's own
759
- * chrome — never the content. A *successful* `gated:false` still allows. Chrome order on a
760
- * gated decision: override → stored default → built-in.
761
- *
762
- * Every gated return guards chrome against null (`?: builtInGate`) so a gated outcome always
763
- * carries a renderable chrome — the serve sites force-unwrap it.
764
- */
765
- suspend fun gateDecision(request: NativeGateRequest): GateOutcome {
766
- // Read the whole gate triple once; a single volatile reference can't tear (see [GateState]).
767
- val s = gateState
768
- if (!s.active) return GateOutcome(false, null)
769
- if (!s.hasResolver) return GateOutcome(true, s.chrome ?: builtInGate) // static fast path
770
- val decision =
771
- runCatching { resolveGate(request).await().await() }.getOrNull()
772
- ?: return GateOutcome(true, s.chrome ?: builtInGate) // fail CLOSED on resolver error
773
- if (!decision.gated) return GateOutcome(false, null) // explicit allow
774
- return GateOutcome(true, decision.gate ?: s.chrome ?: builtInGate)
775
- }
776
-
777
- // MARK: Car connection (Android Auto / Android Automotive)
778
-
779
- override fun isCarConnected(): Boolean = carConnected
780
-
781
- override var onCarConnectedChanged: (Boolean) -> Unit = {}
782
- set(value) {
783
- field = value
784
- carConnectionTarget = value
785
- // Immediately notify current state (the car may have connected before
786
- // this JS runtime subscribed) — mirrors the iOS behavior.
787
- value(carConnected)
788
- }
789
-
790
614
  // ============================================================================
791
615
  // MARK: Player Setup and Options
792
616
  // ============================================================================
793
617
 
794
- override fun setupPlayer(options: NativeSetupPlayerOptions): Promise<Unit> {
618
+ override fun setupPlayer(options: PartialSetupPlayerOptions): Promise<Unit> {
795
619
  return Promise.async(mainScope) {
796
620
  setupOptions.update(options)
797
- // The bundled runtime options and initial state are part of the atomic launch
798
- // description: stage them here, apply them together with the engine below (or at
799
- // service connect). Last-write-wins with their imperative counterparts.
800
- options.options?.let { updateOptions.updateFromBridge(it) }
801
- options.repeatMode?.let { pendingRepeatMode = it }
802
- options.playWhenReady?.let { pendingPlayWhenReady = it }
803
621
 
804
622
  connectedService?.let {
805
- it.player.applyOptions(updateOptions)
806
623
  it.player.setup(setupOptions)
807
- applyPendingPlayerState(it.player)
808
624
  return@async
809
625
  }
810
626
 
@@ -836,10 +652,8 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
836
652
  connectedService?.let { player.applyOptions(updateOptions) }
837
653
  }
838
654
 
839
- override fun getOptions(): Options {
840
- // The holder is the source of truth whether or not the player exists yet — updateOptions
841
- // merges into it and setup/connect applies it to the player.
842
- return updateOptions.toNitro()
655
+ override fun getOptions(): UpdateOptions {
656
+ return player.getOptions().toNitro()
843
657
  }
844
658
 
845
659
  // ============================================================================
@@ -854,9 +668,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
854
668
  player.stop()
855
669
  delay(300) // Allow playback to stop
856
670
  player.clear()
857
- // clear() while IDLE emits no engine event, so the state machine never
858
- // leaves STOPPED — a reset queue is "nothing loaded".
859
- player.setPlaybackState(PlaybackState.NONE)
860
671
  }
861
672
 
862
673
  override fun play() = runBlockingOnMain { player.play() }
@@ -868,14 +679,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
868
679
  override fun stop() = runBlockingOnMain { player.stop() }
869
680
 
870
681
  override fun setPlayWhenReady(playWhenReady: Boolean) = runBlockingOnMain {
871
- // Pre-setup this stages the intent for the player to come up with — never throws.
872
- connectedService?.player?.let { it.playWhenReady = playWhenReady }
873
- ?: run { pendingPlayWhenReady = playWhenReady }
682
+ player.playWhenReady = playWhenReady
874
683
  }
875
684
 
876
- override fun getPlayWhenReady(): Boolean = runBlockingOnMain {
877
- connectedService?.player?.playWhenReady ?: pendingPlayWhenReady ?: false
878
- }
685
+ override fun getPlayWhenReady(): Boolean = runBlockingOnMain { player.playWhenReady }
879
686
 
880
687
  override fun seekTo(position: Double) = runBlockingOnMain {
881
688
  player.seekTo((position * 1000).toLong(), TimeUnit.MILLISECONDS)
@@ -885,8 +692,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
885
692
  player.seekBy((offset * 1000).toLong(), TimeUnit.MILLISECONDS)
886
693
  }
887
694
 
888
- override fun seekToLiveEdge() = runBlockingOnMain { player.seekToLiveEdge() }
889
-
890
695
  override fun setVolume(level: Double) = runBlockingOnMain { player.volume = level.toFloat() }
891
696
 
892
697
  override fun getVolume(): Double = runBlockingOnMain { player.volume.toDouble() }
@@ -907,14 +712,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
907
712
 
908
713
  override fun getPlayingState(): PlayingState = runBlockingOnMain { player.getPlayingState() }
909
714
 
910
- override fun getRepeatMode(): RepeatMode = runBlockingOnMain {
911
- connectedService?.player?.repeatMode ?: pendingRepeatMode ?: RepeatMode.OFF
912
- }
715
+ override fun getRepeatMode(): RepeatMode = runBlockingOnMain { player.repeatMode }
913
716
 
914
- override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain {
915
- // Pre-setup this stages the mode for the player to come up with — never throws.
916
- connectedService?.player?.let { it.repeatMode = mode } ?: run { pendingRepeatMode = mode }
917
- }
717
+ override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain { player.repeatMode = mode }
918
718
 
919
719
  override fun getShuffleEnabled(): Boolean = runBlockingOnMain { player.shuffleMode }
920
720
 
@@ -922,10 +722,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
922
722
  player.shuffleMode = enabled
923
723
  }
924
724
 
925
- override fun setPlaybackIntervalEnabled(enabled: Boolean) = runBlockingOnMain {
926
- player.setPlaybackIntervalEnabled(enabled)
927
- }
928
-
929
725
  override fun getPlaybackError(): PlaybackError? = runBlockingOnMain { player.playbackError }
930
726
 
931
727
  override fun retry() = runBlockingOnMain { player.prepare() }
@@ -974,9 +770,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
974
770
  }
975
771
  }
976
772
 
977
- override fun setQueue(tracks: Array<Track>, startIndex: Double?, startPosition: Double?) =
773
+ override fun setQueue(tracks: Array<Track>, startIndex: Double?, startPositionMs: Double?) =
978
774
  runBlockingOnMain {
979
- player.setQueue(tracks, startIndex?.toInt() ?: 0, ((startPosition ?: 0.0) * 1000).toLong())
775
+ player.setQueue(tracks, startIndex?.toInt() ?: 0, startPositionMs?.toLong() ?: 0)
980
776
  }
981
777
 
982
778
  override fun setActiveTrackFavorited(favorited: Boolean) = runBlockingOnMain {
@@ -1008,20 +804,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1008
804
  // ============================================================================
1009
805
 
1010
806
  override fun updateNowPlaying(update: NowPlayingUpdate?) = runBlockingOnMain {
1011
- player.nowPlaying.updateNowPlaying(update)
807
+ player.updateNowPlaying(update)
1012
808
  }
1013
809
 
1014
- override fun flashNowPlaying(update: NowPlayingUpdate, durationMs: Double) = runBlockingOnMain {
1015
- player.nowPlaying.flashNowPlaying(update, durationMs)
1016
- }
1017
-
1018
- override fun clearNowPlayingFlash() = runBlockingOnMain {
1019
- player.nowPlaying.clearNowPlayingFlash()
1020
- }
1021
-
1022
- override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain {
1023
- player.nowPlaying.getNowPlaying()
1024
- }
810
+ override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain { player.getNowPlaying() }
1025
811
 
1026
812
  // ============================================================================
1027
813
  // MARK: Network Connectivity
@@ -1038,15 +824,13 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1038
824
  override fun setSystemVolume(volume: Double) = systemVolumeMonitor.setVolume(volume)
1039
825
 
1040
826
  // ============================================================================
1041
- // MARK: External Audio Output
827
+ // MARK: External Audio Output (iOS only, stub on Android)
1042
828
  // ============================================================================
1043
829
 
1044
- override fun getOutput(): Output? = outputMonitor.current
1045
-
1046
- override fun supportsOutputSwitcher(): Boolean = OutputSwitcher.isSupported()
830
+ override fun getIosOutput(): IosOutput? = null
1047
831
 
1048
- override fun openOutputPicker() {
1049
- OutputSwitcher.open(context)
832
+ override fun openIosOutputPicker() {
833
+ // No-op on Android
1050
834
  }
1051
835
 
1052
836
  // ============================================================================
@@ -1054,34 +838,34 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1054
838
  // ============================================================================
1055
839
 
1056
840
  override fun getEqualizerSettings(): EqualizerSettings? = runBlockingOnMain {
1057
- player.equalizer.getSettings()
841
+ player.getEqualizerSettings()
1058
842
  }
1059
843
 
1060
844
  override fun setEqualizerEnabled(enabled: Boolean) = runBlockingOnMain {
1061
- player.equalizer.setEnabled(enabled)
845
+ player.setEqualizerEnabled(enabled)
1062
846
  }
1063
847
 
1064
848
  override fun setEqualizerPreset(preset: String) = runBlockingOnMain {
1065
- player.equalizer.setPreset(preset)
849
+ player.setEqualizerPreset(preset)
1066
850
  }
1067
851
 
1068
852
  override fun setEqualizerLevels(levels: DoubleArray) = runBlockingOnMain {
1069
- player.equalizer.setLevels(levels)
853
+ player.setEqualizerLevels(levels)
1070
854
  }
1071
855
 
1072
856
  // ============================================================================
1073
857
  // MARK: Sleep Timer
1074
858
  // ============================================================================
1075
859
 
1076
- override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.sleepTimer.get() }
860
+ override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.getSleepTimer() }
1077
861
 
1078
- override fun setSleepTimer(seconds: Double, fadeDuration: Double?) = runBlockingOnMain {
1079
- player.sleepTimer.setAfter(seconds, fadeDuration)
1080
- }
862
+ override fun setSleepTimer(seconds: Double) = runBlockingOnMain { player.setSleepTimer(seconds) }
1081
863
 
1082
- override fun setSleepTimerToEndOfTrack() = runBlockingOnMain { player.sleepTimer.setEndOfTrack() }
864
+ override fun setSleepTimerToEndOfTrack() = runBlockingOnMain {
865
+ player.setSleepTimerToEndOfTrack()
866
+ }
1083
867
 
1084
- override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.sleepTimer.clear() }
868
+ override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.clearSleepTimer() }
1085
869
 
1086
870
  // ============================================================================
1087
871
  // MARK: Battery Optimization (Android only)
@@ -1161,7 +945,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1161
945
  player.setCallbacks(callbacks)
1162
946
  player.applyOptions(updateOptions)
1163
947
  player.setup(setupOptions)
1164
- applyPendingPlayerState(player)
1165
948
  // Start observing network connectivity changes
1166
949
  player.observeNetworkConnectivity(mainScope)
1167
950
  // Set browser reference for media URL transformation
@@ -1191,21 +974,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1191
974
  }
1192
975
  }
1193
976
 
1194
- /**
1195
- * Applies initial player state staged before the player existed. Consumed on apply so a later
1196
- * re-setup doesn't replay stale state.
1197
- */
1198
- private fun applyPendingPlayerState(player: Player) {
1199
- pendingRepeatMode?.let {
1200
- player.repeatMode = it
1201
- pendingRepeatMode = null
1202
- }
1203
- pendingPlayWhenReady?.let {
1204
- player.playWhenReady = it
1205
- pendingPlayWhenReady = null
1206
- }
1207
- }
1208
-
1209
977
  override fun onServiceDisconnected(name: ComponentName) {
1210
978
  mainScope.coroutineContext.cancelChildren()
1211
979
  mediaBrowserFuture = null
@@ -1249,10 +1017,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1249
1017
  post { this@AudioBrowser.onPlaybackProgressUpdated(event) }
1250
1018
  }
1251
1019
 
1252
- override fun onPlaybackInterval() {
1253
- post { this@AudioBrowser.onPlaybackInterval() }
1254
- }
1255
-
1256
1020
  override fun onPlaybackPlayWhenReadyChanged(event: PlaybackPlayWhenReadyChangedEvent) {
1257
1021
  post { this@AudioBrowser.onPlaybackPlayWhenReadyChanged(event) }
1258
1022
  }
@@ -1402,8 +1166,12 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1402
1166
  return handled
1403
1167
  }
1404
1168
 
1169
+ override fun onRemoteSetRating(event: RemoteSetRatingEvent) {
1170
+ post { this@AudioBrowser.onRemoteSetRating(event) }
1171
+ }
1172
+
1405
1173
  override fun onOptionsChanged(options: PlayerUpdateOptions) {
1406
- post { this@AudioBrowser.onOptionsChanged(options.toNitro()) }
1174
+ // Not currently emitted to JS
1407
1175
  }
1408
1176
 
1409
1177
  override fun onFavoriteChanged(event: FavoriteChangedEvent) {
@@ -1426,32 +1194,4 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1426
1194
  post { this@AudioBrowser.onSleepTimerChanged(timer) }
1427
1195
  }
1428
1196
  }
1429
-
1430
- companion object {
1431
- // Process-wide car-connection state, from the androidx.car.app
1432
- // CarConnection provider — the documented Android Auto / Automotive
1433
- // connection signal, served by the car system app. Observed ONCE per
1434
- // process: AudioBrowser instances are re-created on a JS reload, and a
1435
- // per-instance observeForever would leak each one. The latest instance's
1436
- // callback registers as the single notification target (mirrors the iOS
1437
- // static + shared-instance pattern).
1438
- @Volatile private var carConnected = false
1439
- @Volatile private var carConnectionTarget: ((Boolean) -> Unit)? = null
1440
- private var carConnectionObserverStarted = false
1441
-
1442
- private fun startCarConnectionObserver(context: Context, handler: Handler) {
1443
- // Posted to main: LiveData observation is main-thread only, and the
1444
- // single-start guard is then only ever touched from one thread.
1445
- handler.post {
1446
- if (carConnectionObserverStarted) return@post
1447
- carConnectionObserverStarted = true
1448
- CarConnection(context.applicationContext).type.observeForever { type ->
1449
- val connected = type != CarConnection.CONNECTION_TYPE_NOT_CONNECTED
1450
- if (connected == carConnected) return@observeForever
1451
- carConnected = connected
1452
- carConnectionTarget?.invoke(connected)
1453
- }
1454
- }
1455
- }
1456
- }
1457
1197
  }