react-native-audio-browser 0.2.0-next.9 → 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 (975) 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 +148 -433
  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 +196 -804
  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/ServiceBinding.kt +0 -46
  634. package/android/src/main/java/com/audiobrowser/browser/ArtworkResolutionRegistry.kt +0 -37
  635. package/android/src/main/java/com/audiobrowser/browser/BrowseArtworkRegistry.kt +0 -34
  636. package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +0 -299
  637. package/android/src/main/java/com/audiobrowser/browser/JsonArtwork.kt +0 -79
  638. package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +0 -42
  639. package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +0 -35
  640. package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +0 -172
  641. package/android/src/main/java/com/audiobrowser/player/EqualizerController.kt +0 -153
  642. package/android/src/main/java/com/audiobrowser/player/InterceptingPlayer.kt +0 -141
  643. package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +0 -347
  644. package/android/src/main/java/com/audiobrowser/player/PlaybackErrorClassifier.kt +0 -129
  645. package/android/src/main/java/com/audiobrowser/player/PlaybackStateMachine.kt +0 -85
  646. package/android/src/main/java/com/audiobrowser/player/PlaybackTimer.kt +0 -56
  647. package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +0 -20
  648. package/android/src/main/java/com/audiobrowser/player/PlayerEngineFactory.kt +0 -130
  649. package/android/src/main/java/com/audiobrowser/player/SleepTimerManager.kt +0 -80
  650. package/android/src/main/java/com/audiobrowser/player/StuckRecoveryPolicy.kt +0 -50
  651. package/android/src/main/java/com/audiobrowser/player/VolumeFader.kt +0 -81
  652. package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +0 -141
  653. package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +0 -37
  654. package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +0 -41
  655. package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +0 -209
  656. package/android/src/main/java/com/audiobrowser/util/ArtworkContentProvider.kt +0 -161
  657. package/android/src/main/java/com/audiobrowser/util/ArtworkUris.kt +0 -28
  658. package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +0 -24
  659. package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoader.kt +0 -49
  660. package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoaderHolder.kt +0 -36
  661. package/android/src/main/java/com/audiobrowser/util/OutputMonitor.kt +0 -211
  662. package/android/src/main/java/com/audiobrowser/util/OutputSwitcher.kt +0 -58
  663. package/android/src/main/java/com/audiobrowser/util/RatingFavorites.kt +0 -14
  664. package/android/src/test/java/com/audiobrowser/ServiceBindingTest.kt +0 -68
  665. package/android/src/test/java/com/audiobrowser/TestFixtures.kt +0 -165
  666. package/android/src/test/java/com/audiobrowser/browser/ArtworkResolutionRegistryTest.kt +0 -46
  667. package/android/src/test/java/com/audiobrowser/browser/BrowseArtworkRegistryTest.kt +0 -39
  668. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerBuildApiRequestTest.kt +0 -114
  669. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +0 -141
  670. package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +0 -177
  671. package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +0 -55
  672. package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +0 -94
  673. package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +0 -203
  674. package/android/src/test/java/com/audiobrowser/player/DynamicLoadControlTest.kt +0 -56
  675. package/android/src/test/java/com/audiobrowser/player/EqualizerControllerTest.kt +0 -216
  676. package/android/src/test/java/com/audiobrowser/player/MediaSessionSlotMappingTest.kt +0 -45
  677. package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +0 -442
  678. package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +0 -190
  679. package/android/src/test/java/com/audiobrowser/player/PlaybackStateMachineTest.kt +0 -198
  680. package/android/src/test/java/com/audiobrowser/player/PlaybackTimerTest.kt +0 -137
  681. package/android/src/test/java/com/audiobrowser/player/PlayerEngineFactoryTest.kt +0 -36
  682. package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +0 -268
  683. package/android/src/test/java/com/audiobrowser/player/SessionErrorMaskTest.kt +0 -68
  684. package/android/src/test/java/com/audiobrowser/player/StuckRecoveryPolicyTest.kt +0 -40
  685. package/android/src/test/java/com/audiobrowser/player/TransformingDataSourceTest.kt +0 -193
  686. package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +0 -107
  687. package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +0 -73
  688. package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +0 -75
  689. package/android/src/test/java/com/audiobrowser/tls/CertFixtures.kt +0 -18
  690. package/android/src/test/java/com/audiobrowser/util/ArtworkContentProviderTest.kt +0 -163
  691. package/android/src/test/java/com/audiobrowser/util/ArtworkUrisTest.kt +0 -34
  692. package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +0 -28
  693. package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderHolderTest.kt +0 -53
  694. package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderTest.kt +0 -58
  695. package/android/src/test/java/com/audiobrowser/util/FakeImageLoader.kt +0 -57
  696. package/android/src/test/java/com/audiobrowser/util/PlayingStateFactoryTest.kt +0 -40
  697. package/android/src/test/java/com/audiobrowser/util/RatingFavoritesTest.kt +0 -34
  698. package/android/src/test/java/com/audiobrowser/util/TrackFactoryBrowseTest.kt +0 -50
  699. package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +0 -63
  700. package/android/src/test/java/com/audiobrowser/util/TrackFactoryRatingTest.kt +0 -35
  701. package/android/src/test/resources/certs/isrg-root-x1.pem +0 -31
  702. package/android/src/test/resources/certs/letsencrypt-r13.der +0 -0
  703. package/android/src/test/resources/certs/letsencrypt-r13.pem +0 -29
  704. package/android/src/test/resources/certs/stationplaylist-leaf.pem +0 -34
  705. package/ios/Browser/MediaResolveComposer.swift +0 -114
  706. package/ios/Browser/SearchDrillIn.swift +0 -44
  707. package/ios/Browser/SectionScope.swift +0 -35
  708. package/ios/Browser/TabBarEntries.swift +0 -15
  709. package/ios/CarPlay/CPInterfaceController+Safe.swift +0 -126
  710. package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
  711. package/ios/CarPlay/RNABMediaAddHandler.swift +0 -75
  712. package/ios/CarPlay/RNABMediaAffinityHandler.swift +0 -69
  713. package/ios/Extension/PlayerCapabilities+Favorite.swift +0 -20
  714. package/ios/Extension/RequestConfig+Copying.swift +0 -31
  715. package/ios/Extension/Variant+Artwork.swift +0 -49
  716. package/ios/NowPlayingInfo/SilentAudioPrimer.swift +0 -73
  717. package/ios/Player/AirPlayStallJudgement.swift +0 -25
  718. package/ios/Player/EndOfTrackJudgement.swift +0 -32
  719. package/ios/Player/MediaIntentCriteria.swift +0 -139
  720. package/ios/Player/PersistedPlaybackState.swift +0 -11
  721. package/ios/Player/PlaybackStateStore.swift +0 -27
  722. package/ios/Player/PlaybackTimer.swift +0 -61
  723. package/ios/Player/VolumeFader.swift +0 -77
  724. package/ios/RemoteCommand/RemoteCommandCallbacks.swift +0 -47
  725. package/ios/Tests/AirPlayStallJudgementTests.swift +0 -52
  726. package/ios/Tests/EndOfTrackJudgementTests.swift +0 -35
  727. package/ios/Tests/JsonModelsTests.swift +0 -58
  728. package/ios/Tests/MediaIntentCriteriaTests.swift +0 -170
  729. package/ios/Tests/MediaLoaderAssetOptionsTests.swift +0 -46
  730. package/ios/Tests/MediaResolveTests.swift +0 -126
  731. package/ios/Tests/OnceValueTests.swift +0 -79
  732. package/ios/Tests/PlaybackStateStoreTests.swift +0 -48
  733. package/ios/Tests/PlaybackTimerTests.swift +0 -55
  734. package/ios/Tests/PlayingStateManagerTests.swift +0 -57
  735. package/ios/Tests/RemoteCommandControllerTests.swift +0 -156
  736. package/ios/Tests/RemoteCommandTests.swift +0 -67
  737. package/ios/Tests/RetryManagerTests.swift +0 -89
  738. package/ios/Tests/SearchDrillInTests.swift +0 -63
  739. package/ios/Tests/SectionScopeTests.swift +0 -82
  740. package/ios/Tests/SleepTimerManagerTests.swift +0 -107
  741. package/ios/Tests/Support/ManualSleepTimerScheduler.swift +0 -47
  742. package/ios/Tests/TabBarEntriesTests.swift +0 -71
  743. package/lib/commonjs/features/browser-config.js +0 -227
  744. package/lib/commonjs/features/browser-config.js.map +0 -1
  745. package/lib/commonjs/features/carConnection.js +0 -42
  746. package/lib/commonjs/features/carConnection.js.map +0 -1
  747. package/lib/commonjs/features/gate.js +0 -149
  748. package/lib/commonjs/features/gate.js.map +0 -1
  749. package/lib/commonjs/features/playback/trackPlaybackTime.js +0 -86
  750. package/lib/commonjs/features/playback/trackPlaybackTime.js.map +0 -1
  751. package/lib/commonjs/features/player/validateOptions.js +0 -24
  752. package/lib/commonjs/features/player/validateOptions.js.map +0 -1
  753. package/lib/commonjs/utils/artwork.js +0 -31
  754. package/lib/commonjs/utils/artwork.js.map +0 -1
  755. package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +0 -71
  756. package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
  757. package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js +0 -34
  758. package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js.map +0 -1
  759. package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js +0 -21
  760. package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
  761. package/lib/commonjs/web/TrackPlayer/QueueManager.js +0 -273
  762. package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +0 -1
  763. package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +0 -158
  764. package/lib/commonjs/web/TrackPlayer/QueuePlayer.js.map +0 -1
  765. package/lib/commonjs/web/TrackPlayer/VolumeFader.js +0 -75
  766. package/lib/commonjs/web/TrackPlayer/VolumeFader.js.map +0 -1
  767. package/lib/commonjs/web/browser/assertBrowsePageShape.js +0 -22
  768. package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +0 -1
  769. package/lib/commonjs/web/browser/classifyTrackNavigation.js +0 -41
  770. package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +0 -1
  771. package/lib/commonjs/web/browser/parseSearchResponse.js +0 -20
  772. package/lib/commonjs/web/browser/parseSearchResponse.js.map +0 -1
  773. package/lib/commonjs/web/playbackErrorKind.js +0 -57
  774. package/lib/commonjs/web/playbackErrorKind.js.map +0 -1
  775. package/lib/commonjs/web/player/MediaSessionManager.js +0 -121
  776. package/lib/commonjs/web/player/MediaSessionManager.js.map +0 -1
  777. package/lib/commonjs/web/player/RemoteCommandController.js +0 -96
  778. package/lib/commonjs/web/player/RemoteCommandController.js.map +0 -1
  779. package/lib/module/features/browser-config.js +0 -221
  780. package/lib/module/features/browser-config.js.map +0 -1
  781. package/lib/module/features/carConnection.js +0 -37
  782. package/lib/module/features/carConnection.js.map +0 -1
  783. package/lib/module/features/gate.js +0 -144
  784. package/lib/module/features/gate.js.map +0 -1
  785. package/lib/module/features/playback/trackPlaybackTime.js +0 -83
  786. package/lib/module/features/playback/trackPlaybackTime.js.map +0 -1
  787. package/lib/module/features/player/validateOptions.js +0 -20
  788. package/lib/module/features/player/validateOptions.js.map +0 -1
  789. package/lib/module/utils/artwork.js +0 -26
  790. package/lib/module/utils/artwork.js.map +0 -1
  791. package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +0 -67
  792. package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
  793. package/lib/module/web/TrackPlayer/PlaybackTimer.js +0 -29
  794. package/lib/module/web/TrackPlayer/PlaybackTimer.js.map +0 -1
  795. package/lib/module/web/TrackPlayer/PlayingStateFactory.js +0 -17
  796. package/lib/module/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
  797. package/lib/module/web/TrackPlayer/QueueManager.js +0 -269
  798. package/lib/module/web/TrackPlayer/QueueManager.js.map +0 -1
  799. package/lib/module/web/TrackPlayer/QueuePlayer.js +0 -154
  800. package/lib/module/web/TrackPlayer/QueuePlayer.js.map +0 -1
  801. package/lib/module/web/TrackPlayer/VolumeFader.js +0 -70
  802. package/lib/module/web/TrackPlayer/VolumeFader.js.map +0 -1
  803. package/lib/module/web/browser/assertBrowsePageShape.js +0 -18
  804. package/lib/module/web/browser/assertBrowsePageShape.js.map +0 -1
  805. package/lib/module/web/browser/classifyTrackNavigation.js +0 -38
  806. package/lib/module/web/browser/classifyTrackNavigation.js.map +0 -1
  807. package/lib/module/web/browser/parseSearchResponse.js +0 -16
  808. package/lib/module/web/browser/parseSearchResponse.js.map +0 -1
  809. package/lib/module/web/playbackErrorKind.js +0 -52
  810. package/lib/module/web/playbackErrorKind.js.map +0 -1
  811. package/lib/module/web/player/MediaSessionManager.js +0 -116
  812. package/lib/module/web/player/MediaSessionManager.js.map +0 -1
  813. package/lib/module/web/player/RemoteCommandController.js +0 -92
  814. package/lib/module/web/player/RemoteCommandController.js.map +0 -1
  815. package/lib/typescript/src/features/browser-config.d.ts +0 -12
  816. package/lib/typescript/src/features/browser-config.d.ts.map +0 -1
  817. package/lib/typescript/src/features/carConnection.d.ts +0 -20
  818. package/lib/typescript/src/features/carConnection.d.ts.map +0 -1
  819. package/lib/typescript/src/features/gate.d.ts +0 -78
  820. package/lib/typescript/src/features/gate.d.ts.map +0 -1
  821. package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +0 -34
  822. package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +0 -1
  823. package/lib/typescript/src/features/player/validateOptions.d.ts +0 -2
  824. package/lib/typescript/src/features/player/validateOptions.d.ts.map +0 -1
  825. package/lib/typescript/src/utils/artwork.d.ts +0 -19
  826. package/lib/typescript/src/utils/artwork.d.ts.map +0 -1
  827. package/nitrogen/generated/android/c++/JArtworkVariants.hpp +0 -61
  828. package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
  829. package/nitrogen/generated/android/c++/JFavoritesMatchMode.hpp +0 -58
  830. package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +0 -100
  831. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.hpp +0 -112
  832. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +0 -121
  833. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +0 -123
  834. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +0 -133
  835. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +0 -121
  836. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.hpp +0 -139
  837. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.hpp +0 -134
  838. 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
  839. package/nitrogen/generated/android/c++/JFunc_void_GateEvent.hpp +0 -79
  840. package/nitrogen/generated/android/c++/JFunc_void_Output.hpp +0 -80
  841. package/nitrogen/generated/android/c++/JGate.hpp +0 -62
  842. package/nitrogen/generated/android/c++/JGateDecision.hpp +0 -64
  843. package/nitrogen/generated/android/c++/JGateReason.hpp +0 -58
  844. package/nitrogen/generated/android/c++/JIOSOptions.hpp +0 -95
  845. package/nitrogen/generated/android/c++/JMediaReference.hpp +0 -58
  846. package/nitrogen/generated/android/c++/JNativeGateRequest.hpp +0 -74
  847. package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +0 -182
  848. package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +0 -96
  849. package/nitrogen/generated/android/c++/JOutputType.hpp +0 -82
  850. package/nitrogen/generated/android/c++/JPlaybackErrorKind.hpp +0 -76
  851. package/nitrogen/generated/android/c++/JRemoteButtonLayout.hpp +0 -86
  852. package/nitrogen/generated/android/c++/JStallReason.hpp +0 -58
  853. package/nitrogen/generated/android/c++/JTrackRequest.hpp +0 -93
  854. package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +0 -26
  855. package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +0 -71
  856. package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.cpp +0 -26
  857. package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.hpp +0 -75
  858. package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.cpp +0 -41
  859. package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +0 -121
  860. package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.cpp +0 -26
  861. package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.hpp +0 -70
  862. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNowPlayingParams.kt +0 -50
  863. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.kt +0 -80
  864. 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
  865. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___Track.kt +0 -80
  866. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.kt +0 -80
  867. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_std__string____Track.kt +0 -80
  868. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.kt +0 -80
  869. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.kt +0 -80
  870. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +0 -44
  871. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaReference.kt +0 -23
  872. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeGateRequest.kt +0 -44
  873. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeSetupPlayerOptions.kt +0 -66
  874. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +0 -44
  875. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/OutputType.kt +0 -31
  876. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorKind.kt +0 -29
  877. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButton.kt +0 -26
  878. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButtonLayout.kt +0 -44
  879. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StallReason.kt +0 -23
  880. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackRequest.kt +0 -44
  881. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
  882. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.kt +0 -65
  883. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_String_ArtworkVariants.kt +0 -53
  884. package/nitrogen/generated/ios/swift/ArtworkVariants.swift +0 -34
  885. package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
  886. package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
  887. package/nitrogen/generated/ios/swift/FormatNowPlayingParams.swift +0 -67
  888. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.swift +0 -54
  889. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +0 -69
  890. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___Track.swift +0 -54
  891. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.swift +0 -60
  892. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_std__string____Track.swift +0 -60
  893. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.swift +0 -61
  894. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.swift +0 -61
  895. 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
  896. package/nitrogen/generated/ios/swift/Func_void_GateDecision.swift +0 -46
  897. package/nitrogen/generated/ios/swift/Func_void_TransformableRequestConfig.swift +0 -46
  898. package/nitrogen/generated/ios/swift/Func_void_std__optional_NowPlayingUpdate_.swift +0 -46
  899. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +0 -53
  900. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_TransformableRequestConfig__.swift +0 -66
  901. package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError____.swift +0 -81
  902. package/nitrogen/generated/ios/swift/Gate.swift +0 -47
  903. package/nitrogen/generated/ios/swift/GateDecision.swift +0 -40
  904. package/nitrogen/generated/ios/swift/GateEvent.swift +0 -29
  905. package/nitrogen/generated/ios/swift/GateReason.swift +0 -40
  906. package/nitrogen/generated/ios/swift/IOSOptions.swift +0 -51
  907. package/nitrogen/generated/ios/swift/MediaReference.swift +0 -40
  908. package/nitrogen/generated/ios/swift/NativeGateRequest.swift +0 -58
  909. package/nitrogen/generated/ios/swift/NativeSetupPlayerOptions.swift +0 -206
  910. package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +0 -90
  911. package/nitrogen/generated/ios/swift/OutputType.swift +0 -72
  912. package/nitrogen/generated/ios/swift/PlaybackErrorKind.swift +0 -64
  913. package/nitrogen/generated/ios/swift/RemoteButtonLayout.swift +0 -57
  914. package/nitrogen/generated/ios/swift/StallReason.swift +0 -40
  915. package/nitrogen/generated/ios/swift/TrackRequest.swift +0 -106
  916. package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
  917. package/nitrogen/generated/ios/swift/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.swift +0 -19
  918. package/nitrogen/generated/ios/swift/Variant_String_ArtworkVariants.swift +0 -18
  919. package/nitrogen/generated/shared/c++/ArtworkVariants.hpp +0 -87
  920. package/nitrogen/generated/shared/c++/FavoritesMatchMode.hpp +0 -76
  921. package/nitrogen/generated/shared/c++/FormatNowPlayingParams.hpp +0 -110
  922. package/nitrogen/generated/shared/c++/GateReason.hpp +0 -76
  923. package/nitrogen/generated/shared/c++/IOSOptions.hpp +0 -91
  924. package/nitrogen/generated/shared/c++/MediaReference.hpp +0 -76
  925. package/nitrogen/generated/shared/c++/NativeGateRequest.hpp +0 -97
  926. package/nitrogen/generated/shared/c++/NativeSetupPlayerOptions.hpp +0 -138
  927. package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +0 -92
  928. package/nitrogen/generated/shared/c++/OutputType.hpp +0 -108
  929. package/nitrogen/generated/shared/c++/PlaybackErrorKind.hpp +0 -100
  930. package/nitrogen/generated/shared/c++/RemoteButtonLayout.hpp +0 -94
  931. package/nitrogen/generated/shared/c++/StallReason.hpp +0 -76
  932. package/nitrogen/generated/shared/c++/TrackRequest.hpp +0 -93
  933. package/src/codegen-no-config-variant.test.ts +0 -70
  934. package/src/features/browser-config.test.ts +0 -110
  935. package/src/features/browser-config.ts +0 -293
  936. package/src/features/browser.test.ts +0 -19
  937. package/src/features/carConnection.ts +0 -36
  938. package/src/features/gate.test.ts +0 -72
  939. package/src/features/gate.ts +0 -155
  940. package/src/features/playback/trackPlaybackTime.test.ts +0 -80
  941. package/src/features/playback/trackPlaybackTime.ts +0 -101
  942. package/src/features/player/options.test.ts +0 -38
  943. package/src/features/player/setup.test.ts +0 -125
  944. package/src/features/player/validateOptions.ts +0 -22
  945. package/src/features/queue/queue.test.ts +0 -36
  946. package/src/public-surface.test.ts +0 -123
  947. package/src/utils/artwork.ts +0 -30
  948. package/src/web/NativeAudioBrowser.playWhenReady.test.ts +0 -301
  949. package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +0 -139
  950. package/src/web/TrackPlayer/PlaybackStateMachine.ts +0 -82
  951. package/src/web/TrackPlayer/PlaybackTimer.test.ts +0 -67
  952. package/src/web/TrackPlayer/PlaybackTimer.ts +0 -33
  953. package/src/web/TrackPlayer/Player.dispatch.test.ts +0 -229
  954. package/src/web/TrackPlayer/Player.load.test.ts +0 -86
  955. package/src/web/TrackPlayer/PlayingStateFactory.test.ts +0 -51
  956. package/src/web/TrackPlayer/PlayingStateFactory.ts +0 -24
  957. package/src/web/TrackPlayer/QueueManager.test.ts +0 -289
  958. package/src/web/TrackPlayer/QueueManager.ts +0 -302
  959. package/src/web/TrackPlayer/QueuePlayer.ts +0 -188
  960. package/src/web/TrackPlayer/VolumeFader.ts +0 -74
  961. package/src/web/browser/__tests__/layer-resolver.test.ts +0 -69
  962. package/src/web/browser/assertBrowsePageShape.test.ts +0 -27
  963. package/src/web/browser/assertBrowsePageShape.ts +0 -27
  964. package/src/web/browser/classifyTrackNavigation.test.ts +0 -41
  965. package/src/web/browser/classifyTrackNavigation.ts +0 -35
  966. package/src/web/browser/parseSearchResponse.test.ts +0 -25
  967. package/src/web/browser/parseSearchResponse.ts +0 -15
  968. package/src/web/http/RequestConfigBuilder.test.ts +0 -59
  969. package/src/web/playbackErrorKind.test.ts +0 -55
  970. package/src/web/playbackErrorKind.ts +0 -56
  971. package/src/web/player/MediaSessionManager.test.ts +0 -220
  972. package/src/web/player/MediaSessionManager.ts +0 -151
  973. package/src/web/player/NowPlayingManager.test.ts +0 -46
  974. package/src/web/player/RemoteCommandController.test.ts +0 -171
  975. 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
@@ -90,7 +86,6 @@ import kotlin.coroutines.suspendCoroutine
90
86
  import kotlinx.coroutines.CancellationException
91
87
  import kotlinx.coroutines.Job
92
88
  import kotlinx.coroutines.MainScope
93
- import kotlinx.coroutines.cancel
94
89
  import kotlinx.coroutines.cancelChildren
95
90
  import kotlinx.coroutines.delay
96
91
  import kotlinx.coroutines.launch
@@ -100,41 +95,6 @@ import timber.log.Timber
100
95
  @Keep
101
96
  @DoNotStrip
102
97
  class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
103
-
104
- /**
105
- * Called by Nitro when the JS object is destroyed (incl. JS runtime reloads).
106
- *
107
- * The Service outlives this object, so everything registered in `init` or on connect has to be
108
- * undone here. Left alone, the running [Player] goes on invoking callbacks into a dead JSI
109
- * runtime, and every reload strands another ServiceConnection and lifecycle observer, each
110
- * retaining a BrowserManager.
111
- */
112
- override fun dispose() {
113
- systemVolumeMonitor.destroy()
114
- outputMonitor.destroy()
115
-
116
- connectedService?.let { service ->
117
- service.player.setCallbacks(null)
118
- service.player.browser = null
119
- service.onBatteryWarningPendingChanged = null
120
- }
121
- connectedService = null
122
- mediaBrowserFuture = null
123
-
124
- serviceBinding.unbind(this)
125
-
126
- // Only when still ours: on a reload the replacement instance may already own the slot.
127
- if (carConnectionTarget === onCarConnectedChanged) carConnectionTarget = null
128
-
129
- // Drop queued work first, then post the removal — LifecycleRegistry is main-thread only,
130
- // which is why the observer is added the same way.
131
- handler.removeCallbacksAndMessages(null)
132
- handler.post { ProcessLifecycleOwner.get().lifecycle.removeObserver(lifecycleObserver) }
133
-
134
- mainScope.cancel()
135
- super.dispose()
136
- }
137
-
138
98
  private val mainScope = MainScope()
139
99
  private var navigationJob: Job? = null
140
100
  private val handler = Handler(Looper.getMainLooper())
@@ -147,18 +107,14 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
147
107
  NativeBrowserConfiguration(
148
108
  path = null,
149
109
  request = null,
150
- requestResolver = null,
151
- browse = null,
152
- browseResolver = null,
153
110
  media = null,
154
111
  artwork = null,
155
- nowPlayingArtwork = null,
156
112
  routes = null,
157
113
  singleTrack = null,
158
114
  handleTrackLoad = null,
159
115
  androidControllerOfflineError = null,
160
- carPlayLoadingTitle = null,
161
- resolveAlbumUrl = null,
116
+ carPlayUpNextButton = null,
117
+ carPlayNowPlayingButtons = null,
162
118
  formatNavigationError = null,
163
119
  )
164
120
 
@@ -167,26 +123,17 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
167
123
  setOnPathChanged { path -> onPathChanged(path) }
168
124
  setOnContentChanged { content -> onContentChanged(content) }
169
125
  setOnTabsChanged { tabs -> onTabsChanged(tabs) }
170
- setOnArtworkRegistriesCleared { connectedService?.player?.browseArtworkRegistry?.clear() }
171
126
  }
172
127
 
173
128
  private val systemVolumeMonitor = SystemVolumeMonitor(context)
174
- private val outputMonitor = OutputMonitor(context)
175
129
 
176
130
  // MARK: Player state
177
131
  private var updateOptions: PlayerUpdateOptions = PlayerUpdateOptions()
178
132
  private var mediaBrowserFuture: ListenableFuture<MediaBrowser>? = null
179
133
  private var setupOptions = PlayerSetupOptions()
180
134
  private var connectedService: Service? = null
181
-
182
- private val serviceBinding = ServiceBinding(context)
183
135
  private var setupPromise: ((Unit) -> Unit)? = null
184
136
 
185
- // Initial player state staged before the player exists — from setup options or the imperative
186
- // setters called pre-bind. Strict last-write-wins; consumed when the player comes up.
187
- private var pendingPlayWhenReady: Boolean? = null
188
- private var pendingRepeatMode: RepeatMode? = null
189
-
190
137
  /** Post callback to main handler for consistent async delivery to JS - avoids deadlocks */
191
138
  private fun post(block: () -> Unit) = handler.post(block)
192
139
 
@@ -197,21 +144,13 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
197
144
  override var onNavigationError: (NavigationErrorEvent) -> Unit = {}
198
145
  override var onFormattedNavigationError: (FormattedNavigationError?) -> Unit = {}
199
146
 
200
- // MARK: Gate callbacks (native→JS; set from JS, native CALLS them)
201
- // Default resolver: only reachable in the init window where the native side has recorded
202
- // hasResolver=true but JS hasn't yet assigned the real `resolveGate` slot. It DENIES by default
203
- // (gated=true) so an active gate never serves content during that window — same fail-closed
204
- // direction as the resolver-error path in [gateDecision]. The static-gate fast path skips it
205
- // entirely once a resolver-less gate is set.
206
- override var resolveGate: (request: NativeGateRequest) -> Promise<Promise<GateDecision>> = {
207
- Promise.resolved(Promise.resolved(GateDecision(gated = true, gate = null)))
208
- }
209
- override var onGate: (event: GateEvent) -> Unit = {}
210
-
211
147
  // MARK: Player callbacks
212
148
  override var onPlaybackChanged: (data: Playback) -> Unit = {}
149
+ override var onRemoteBookmark: () -> Unit = {}
150
+ override var onRemoteDislike: () -> Unit = {}
213
151
  override var onRemoteJumpBackward: (RemoteJumpBackwardEvent) -> Unit = {}
214
152
  override var onRemoteJumpForward: (RemoteJumpForwardEvent) -> Unit = {}
153
+ override var onRemoteLike: () -> Unit = {}
215
154
  override var onRemoteNext: () -> Unit = {}
216
155
  override var onRemotePause: () -> Unit = {}
217
156
  override var onChapterMetadata: (chapters: Array<ChapterMetadata>) -> Unit = {}
@@ -223,7 +162,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
223
162
  {}
224
163
  override var onPlaybackPlayingState: (data: PlayingState) -> Unit = {}
225
164
  override var onPlaybackProgressUpdated: (data: PlaybackProgressUpdatedEvent) -> Unit = {}
226
- override var onPlaybackInterval: () -> Unit = {}
227
165
  override var onPlaybackQueueEnded: (data: PlaybackQueueEndedEvent) -> Unit = {}
228
166
  override var onPlaybackQueueChanged: (queue: Array<Track>) -> Unit = {}
229
167
  override var onPlaybackRepeatModeChanged: (data: RepeatModeChangedEvent) -> Unit = {}
@@ -233,6 +171,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
233
171
  override var onRemotePlaySearch: (RemotePlaySearchEvent) -> Unit = {}
234
172
  override var onRemotePrevious: () -> Unit = {}
235
173
  override var onRemoteSeek: (RemoteSeekEvent) -> Unit = {}
174
+ override var onRemoteSetRating: (RemoteSetRatingEvent) -> Unit = {}
236
175
  override var onRemoteSkip: (RemoteSkipEvent) -> Unit = {}
237
176
  override var onRemoteStop: () -> Unit = {}
238
177
  override var onOptionsChanged: (Options) -> Unit = {}
@@ -245,11 +184,14 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
245
184
  override var onBatteryOptimizationStatusChanged: (BatteryOptimizationStatusChangedEvent) -> Unit =
246
185
  {}
247
186
  override var onSystemVolumeChanged: (Double) -> Unit = {}
248
- override var onOutputChanged: (Output) -> Unit = {}
187
+ override var onIosOutputChanged: (IosOutput) -> Unit = {}
249
188
 
250
189
  // MARK: Remote handlers
190
+ override var handleRemoteBookmark: (() -> Unit)? = null
191
+ override var handleRemoteDislike: (() -> Unit)? = null
251
192
  override var handleRemoteJumpBackward: ((RemoteJumpBackwardEvent) -> Unit)? = null
252
193
  override var handleRemoteJumpForward: ((RemoteJumpForwardEvent) -> Unit)? = null
194
+ override var handleRemoteLike: (() -> Unit)? = null
253
195
  override var handleRemoteNext: (() -> Unit)? = null
254
196
  override var handleRemotePause: (() -> Unit)? = null
255
197
  override var handleRemotePlay: (() -> Unit)? = null
@@ -274,7 +216,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
274
216
  try {
275
217
  Timber.d("Attempting to auto-bind to existing AudioBrowserService from AudioBrowser")
276
218
  val intent = Intent(context, Service::class.java)
277
- val bound = serviceBinding.bind(intent, this@AudioBrowser)
219
+ val bound = context.bindService(intent, this@AudioBrowser, Context.BIND_AUTO_CREATE)
278
220
  Timber.d("Auto-bind result: $bound")
279
221
 
280
222
  if (!bound) {
@@ -290,14 +232,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
290
232
  handler.post { ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleObserver) }
291
233
 
292
234
  // Observe system volume changes
293
- systemVolumeMonitor.setOnVolumeChanged { volume -> post { onSystemVolumeChanged(volume) } }
294
-
295
- // Observe current audio output changes (active media route via AudioManager)
296
- outputMonitor.setOnOutputChanged { output -> post { onOutputChanged(output) } }
297
- outputMonitor.start()
298
-
299
- // Observe the car connection (Android Auto / Android Automotive)
300
- startCarConnectionObserver(context, handler)
235
+ systemVolumeMonitor.setOnVolumeChanged { volume ->
236
+ post { onSystemVolumeChanged(volume) }
237
+ }
301
238
  }
302
239
 
303
240
  // ============================================================================
@@ -307,12 +244,8 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
307
244
  internal fun buildConfig(): BrowserConfig {
308
245
  return BrowserConfig(
309
246
  request = _configuration.request,
310
- requestResolver = _configuration.requestResolver,
311
- browse = _configuration.browse,
312
- browseResolver = _configuration.browseResolver,
313
247
  media = _configuration.media,
314
248
  artwork = _configuration.artwork,
315
- nowPlayingArtwork = _configuration.nowPlayingArtwork,
316
249
  routes = _configuration.routes,
317
250
  singleTrack = _configuration.singleTrack ?: false,
318
251
  androidControllerOfflineError = _configuration.androidControllerOfflineError ?: true,
@@ -320,14 +253,34 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
320
253
  }
321
254
 
322
255
  /**
323
- * Media URL transformation for [com.audiobrowser.player.TransformingDataSource]. Resolution lives
324
- * in [resolveMediaUrl] (browser/BrowserUrlResolution.kt); this shell owns only the blocking
325
- * bridge: it runs on ExoPlayer's IO thread (TransformingDataSource.open), so blocking here is
326
- * 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.
327
270
  */
328
271
  fun getMediaRequestConfig(originalUrl: String): MediaRequestConfig? {
272
+ val mediaConfig = _configuration.media ?: return null
273
+
329
274
  return try {
330
- 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) }
331
284
  } catch (e: Exception) {
332
285
  Timber.e(e, "Failed to transform media URL: $originalUrl")
333
286
  null
@@ -339,15 +292,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
339
292
  return _configuration.routes?.any { it.path != BrowserManager.SEARCH_ROUTE_PATH } == true
340
293
  }
341
294
 
342
- // Suspending on purpose: queryTabs() resolves tabs by invoking JS callbacks,
343
- // which can only run on the JS thread. Callers MUST invoke this from a
344
- // coroutine (off the JS thread) — never via runBlocking on a synchronous Nitro
345
- // setter, which runs on the JS thread and would deadlock (the JS thread blocks
346
- // waiting for callbacks that need that same thread to run).
347
- private suspend fun getDefaultPath(): String? {
295
+ private fun getDefaultPath(): String? {
348
296
  return try {
349
297
  browserManager.config = buildConfig()
350
- val tabs = browserManager.queryTabs()
298
+ val tabs = runBlocking { browserManager.queryTabs() }
351
299
  if (tabs.isNotEmpty()) {
352
300
  Timber.d("Using first tab as default path: ${tabs[0].url}")
353
301
  tabs[0].url
@@ -355,8 +303,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
355
303
  Timber.d("Using root path as default: /")
356
304
  "/"
357
305
  }
358
- } catch (e: CancellationException) {
359
- throw e // Rethrow so cooperative cancellation isn't swallowed
360
306
  } catch (e: Exception) {
361
307
  Timber.e(e, "Failed to get default path, falling back to /")
362
308
  "/"
@@ -372,25 +318,23 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
372
318
  set(value) {
373
319
  if (hasValidConfiguration()) {
374
320
  browserManager.config = buildConfig()
375
- clearNavigationError()
376
-
377
- // Cancel previous navigation to avoid race conditions
378
- navigationJob?.cancel()
379
-
380
- // Resolve the default path inside the coroutine (getDefaultPath queries
381
- // tabs via JS callbacks) so it never blocks the JS thread this setter
382
- // runs on.
383
- navigationJob =
384
- mainScope.launch {
385
- val path = value ?: getDefaultPath() ?: return@launch
386
- try {
387
- browserManager.navigate(path)
388
- } catch (e: CancellationException) {
389
- throw e // Rethrow to properly cancel
390
- } catch (e: Exception) {
391
- 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
+ }
392
336
  }
393
- }
337
+ }
394
338
  }
395
339
  }
396
340
 
@@ -408,54 +352,45 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
408
352
  // This allows Android Auto to start browsing content
409
353
  connectedService?.player?.notifyBrowserConfigurationReady()
410
354
 
411
- clearNavigationError()
412
-
413
- // Cancel previous navigation to avoid race conditions
414
- navigationJob?.cancel()
415
-
416
- // Navigate to the initial path, or default to the first tab. The default
417
- // path is resolved inside the coroutine (getDefaultPath queries tabs via
418
- // JS callbacks) so it never blocks the JS thread this setter runs on —
419
- // doing it synchronously here via runBlocking deadlocked: the JS callbacks
420
- // can't run because the JS thread is blocked waiting for them.
421
- navigationJob =
422
- mainScope.launch {
423
- val path = value.path ?: getDefaultPath() ?: return@launch
424
- try {
425
- browserManager.navigate(path)
426
- } catch (e: CancellationException) {
427
- throw e // Rethrow to properly cancel
428
- } catch (e: Exception) {
429
- 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
+ }
430
371
  }
431
- }
372
+ }
432
373
  }
433
374
 
434
375
  private var navigationError: NavigationError? = null
435
376
  private var formattedNavigationError: FormattedNavigationError? = null
436
377
 
437
378
  override fun getNavigationError(): NavigationError? = navigationError
438
-
439
379
  override fun getFormattedNavigationError(): FormattedNavigationError? = formattedNavigationError
440
380
 
441
381
  /** Creates a default formatted error from a NavigationError */
442
382
  private fun defaultFormattedError(error: NavigationError): FormattedNavigationError {
443
- val title =
444
- when (error.code) {
445
- NavigationErrorType.CONTENT_NOT_FOUND -> "Content Not Found"
446
- NavigationErrorType.NETWORK_ERROR -> "Network Error"
447
- NavigationErrorType.HTTP_ERROR -> {
448
- // Use system-localized HTTP status text (e.g., "Not Found", "Service Unavailable")
449
- error.statusCode?.let { httpStatusText(it.toInt()) } ?: "Server Error"
450
- }
451
- NavigationErrorType.CALLBACK_ERROR -> "Error"
452
- NavigationErrorType.UNKNOWN_ERROR -> "Error"
453
- // Not a failure — a container that resolved with no children. Neutral copy. See ADR 0001.
454
- NavigationErrorType.EMPTY_CONTENT -> "Nothing here"
455
- 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"
456
389
  }
457
- // Omit an empty message so it renders as title-only (e.g. the empty-content case).
458
- 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)
459
394
  }
460
395
 
461
396
  /** Returns localized HTTP status text for the given status code */
@@ -522,35 +457,19 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
522
457
  }
523
458
  is NetworkException -> {
524
459
  Timber.e(e, "Network error $logContext")
525
- setNavigationError(
526
- NavigationErrorType.NETWORK_ERROR,
527
- e.message ?: "Network request failed",
528
- path,
529
- )
460
+ setNavigationError(NavigationErrorType.NETWORK_ERROR, e.message ?: "Network request failed", path)
530
461
  }
531
462
  is ContentNotFoundException -> {
532
463
  Timber.e(e, "Content not found $logContext")
533
- setNavigationError(
534
- NavigationErrorType.CONTENT_NOT_FOUND,
535
- e.message ?: "Content not found",
536
- path,
537
- )
464
+ setNavigationError(NavigationErrorType.CONTENT_NOT_FOUND, e.message ?: "Content not found", path)
538
465
  }
539
466
  is CallbackException -> {
540
467
  Timber.e(e, "Callback error $logContext")
541
- setNavigationError(
542
- NavigationErrorType.CALLBACK_ERROR,
543
- e.message ?: "An error occurred",
544
- path,
545
- )
468
+ setNavigationError(NavigationErrorType.CALLBACK_ERROR, e.message ?: "An error occurred", path)
546
469
  }
547
470
  else -> {
548
471
  Timber.e(e, "Unexpected error $logContext")
549
- setNavigationError(
550
- NavigationErrorType.UNKNOWN_ERROR,
551
- e.message ?: "An unexpected error occurred",
552
- path,
553
- )
472
+ setNavigationError(NavigationErrorType.UNKNOWN_ERROR, e.message ?: "An unexpected error occurred", path)
554
473
  }
555
474
  }
556
475
  }
@@ -610,17 +529,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
610
529
  val index = player.tracks.indexOfFirst { it.src == trackId }
611
530
  if (index >= 0) {
612
531
  Timber.d("Queue already from $parentPath, skipping to index $index")
613
- handleTrackLoad(
614
- _configuration.handleTrackLoad,
615
- track,
616
- player.tracks,
617
- index.toDouble(),
618
- intercepted = {},
619
- defaultBehavior = {
620
- player.skipTo(index)
621
- player.play()
622
- },
623
- )
532
+ handleTrackLoad(_configuration.handleTrackLoad, track, player.tracks, index.toDouble(), intercepted = {}, defaultBehavior = {
533
+ player.skipTo(index)
534
+ player.play()
535
+ })
624
536
  return@launch
625
537
  }
626
538
  }
@@ -633,31 +545,17 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
633
545
  Timber.d(
634
546
  "Loading expanded queue: ${tracks.size} tracks, starting at index $startIndex"
635
547
  )
636
- handleTrackLoad(
637
- _configuration.handleTrackLoad,
638
- track,
639
- tracks,
640
- startIndex.toDouble(),
641
- intercepted = {},
642
- defaultBehavior = {
643
- // Replace queue and seek to selected track
644
- // Use internal player methods directly to avoid blocking on main thread
645
- player.setQueue(tracks, startIndex, sourcePath = parentPath)
646
- player.play()
647
- },
648
- )
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
+ })
649
554
  return@launch
650
555
  } else {
651
556
  // Fallback: just load the single track
652
557
  Timber.w("Queue expansion failed, loading single track")
653
- handleTrackLoad(
654
- _configuration.handleTrackLoad,
655
- track,
656
- arrayOf(track),
657
- 0.0,
658
- intercepted = {},
659
- defaultBehavior = { player.load(track) },
660
- )
558
+ handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
661
559
  }
662
560
  }
663
561
  // Navigate to browsable track to show browsing UI
@@ -668,14 +566,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
668
566
  // If track is playable (has src), load it into player
669
567
  track.src != null -> {
670
568
  Timber.d("Loading playable track into player: ${track.title}")
671
- handleTrackLoad(
672
- _configuration.handleTrackLoad,
673
- track,
674
- arrayOf(track),
675
- 0.0,
676
- intercepted = {},
677
- defaultBehavior = { player.load(track) },
678
- )
569
+ handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
679
570
  }
680
571
  else -> {
681
572
  throw IllegalArgumentException("Track must have either an 'url' or an 'src' property")
@@ -716,132 +607,32 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
716
607
  }
717
608
  }
718
609
 
719
- override fun invalidateAllContent() {
720
- Timber.d("Invalidating all content")
721
-
722
- // Clear all cached content so every path re-fetches fresh data
723
- browserManager.clearContentCache()
724
-
725
- // Notify external media controllers (Android Auto) to refresh subscribed paths
726
- connectedService?.player?.invalidateAllContent()
727
-
728
- // Refresh whatever the browser is currently viewing
729
- mainScope.launch { browserManager.refresh() }
730
- }
731
-
732
610
  override fun setFavorites(favorites: Array<String>) {
733
611
  browserManager.setFavorites(favorites.toList())
734
612
  }
735
613
 
736
- // MARK: Gate
737
-
738
- /** A gate decision for one request: whether to gate, and which chrome to render. */
739
- data class GateOutcome(val gated: Boolean, val chrome: Gate?)
740
-
741
- // The minimal chrome rendered when a gate is active but no override or stored
742
- // default chrome exists (the resolver-only setGate overload).
743
- private val builtInGate = Gate("Unavailable", null)
744
-
745
- /**
746
- * The three gate fields as one immutable triple so [gateDecision] reads them as a unit. Written
747
- * from the JS thread, read from the Media3 application thread (the enforcement sites in
748
- * MediaSessionCallback consult it) — hence the single field is @Volatile.
749
- *
750
- * Folding the three former @Volatile fields into one reference is what makes the read atomic:
751
- *
752
- * @Volatile gives per-field visibility but NO atomicity across a compound read, so reading three
753
- * separate volatiles in [gateDecision] could interleave with a concurrent [clearGate] and yield
754
- * a torn `(active=true, chrome=null)` state that crashed the force-unwrap at the serve sites.
755
- * One volatile reference read once cannot tear.
756
- */
757
- private data class GateState(val active: Boolean, val chrome: Gate?, val hasResolver: Boolean)
758
-
759
- @Volatile private var gateState = GateState(active = false, chrome = null, hasResolver = false)
760
-
761
- override fun setGate(gate: Gate?, hasResolver: Boolean) {
762
- // Single atomic assignment — readers never see a half-updated triple.
763
- gateState = GateState(active = true, chrome = gate, hasResolver = hasResolver)
764
- // Re-query every subscribed parent so a connected controller (Android
765
- // Auto) swaps its lists for the gate tile without reconnecting. Notify
766
- // only — the content cache stays warm for when the gate clears.
767
- connectedService?.player?.invalidateAllContent()
768
- }
769
-
770
- override fun clearGate() {
771
- if (!gateState.active) return
772
- // Single atomic assignment — readers never see a half-cleared triple.
773
- gateState = GateState(active = false, chrome = null, hasResolver = false)
774
- connectedService?.player?.invalidateAllContent()
775
- }
776
-
777
- /**
778
- * The single gate choke point. Each enforcement site (browse / search) calls this for the current
779
- * request and serves the gate chrome when [GateOutcome.gated] is true. Structurally similar to
780
- * the iOS `gateDecision(for:)` helper, but note the concurrency model differs: iOS confines gate
781
- * state to `@MainActor`; here the consistent read comes from snapshotting the single [gateState]
782
- * reference once (see [GateState]).
783
- * - No active gate → allow.
784
- * - Active gate, no resolver → static fast path: gate with the stored default chrome (or built-in
785
- * if none), no JS hop.
786
- * - Active gate with a resolver → ask JS per request. A resolver that throws / rejects / times
787
- * out FAILS CLOSED by design: while a gate is active the consumer has declared content blocked,
788
- * so the only safe fallback when we cannot compute the per-request decision is the gate's own
789
- * chrome — never the content. A *successful* `gated:false` still allows. Chrome order on a
790
- * gated decision: override → stored default → built-in.
791
- *
792
- * Every gated return guards chrome against null (`?: builtInGate`) so a gated outcome always
793
- * carries a renderable chrome — the serve sites force-unwrap it.
794
- */
795
- suspend fun gateDecision(request: NativeGateRequest): GateOutcome {
796
- // Read the whole gate triple once; a single volatile reference can't tear (see [GateState]).
797
- val s = gateState
798
- if (!s.active) return GateOutcome(false, null)
799
- if (!s.hasResolver) return GateOutcome(true, s.chrome ?: builtInGate) // static fast path
800
- val decision =
801
- runCatching { resolveGate(request).await().await() }.getOrNull()
802
- ?: return GateOutcome(true, s.chrome ?: builtInGate) // fail CLOSED on resolver error
803
- if (!decision.gated) return GateOutcome(false, null) // explicit allow
804
- return GateOutcome(true, decision.gate ?: s.chrome ?: builtInGate)
805
- }
806
-
807
- // MARK: Car connection (Android Auto / Android Automotive)
808
-
809
- override fun isCarConnected(): Boolean = carConnected
810
-
811
- override var onCarConnectedChanged: (Boolean) -> Unit = {}
812
- set(value) {
813
- field = value
814
- carConnectionTarget = value
815
- // Immediately notify current state (the car may have connected before
816
- // this JS runtime subscribed) — mirrors the iOS behavior.
817
- value(carConnected)
818
- }
819
-
820
614
  // ============================================================================
821
615
  // MARK: Player Setup and Options
822
616
  // ============================================================================
823
617
 
824
- override fun setupPlayer(options: NativeSetupPlayerOptions): Promise<Unit> {
618
+ override fun setupPlayer(options: PartialSetupPlayerOptions): Promise<Unit> {
825
619
  return Promise.async(mainScope) {
826
620
  setupOptions.update(options)
827
- // The bundled runtime options and initial state are part of the atomic launch
828
- // description: stage them here, apply them together with the engine below (or at
829
- // service connect). Last-write-wins with their imperative counterparts.
830
- options.options?.let { updateOptions.updateFromBridge(it) }
831
- options.repeatMode?.let { pendingRepeatMode = it }
832
- options.playWhenReady?.let { pendingPlayWhenReady = it }
833
621
 
834
622
  connectedService?.let {
835
- it.player.applyOptions(updateOptions)
836
623
  it.player.setup(setupOptions)
837
- applyPendingPlayerState(it.player)
838
624
  return@async
839
625
  }
840
626
 
841
627
  // Service not connected yet, bind to service
842
628
  suspendCoroutine<Unit> { continuation ->
843
629
  Timber.d("Binding to AudioBrowserService")
844
- val bound = serviceBinding.bind(Intent(context, Service::class.java), this@AudioBrowser)
630
+ val bound =
631
+ context.bindService(
632
+ Intent(context, Service::class.java),
633
+ this@AudioBrowser,
634
+ Context.BIND_AUTO_CREATE,
635
+ )
845
636
 
846
637
  if (!bound) {
847
638
  continuation.resumeWithException(
@@ -861,10 +652,8 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
861
652
  connectedService?.let { player.applyOptions(updateOptions) }
862
653
  }
863
654
 
864
- override fun getOptions(): Options {
865
- // The holder is the source of truth whether or not the player exists yet — updateOptions
866
- // merges into it and setup/connect applies it to the player.
867
- return updateOptions.toNitro()
655
+ override fun getOptions(): UpdateOptions {
656
+ return player.getOptions().toNitro()
868
657
  }
869
658
 
870
659
  // ============================================================================
@@ -879,9 +668,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
879
668
  player.stop()
880
669
  delay(300) // Allow playback to stop
881
670
  player.clear()
882
- // clear() while IDLE emits no engine event, so the state machine never
883
- // leaves STOPPED — a reset queue is "nothing loaded".
884
- player.setPlaybackState(PlaybackState.NONE)
885
671
  }
886
672
 
887
673
  override fun play() = runBlockingOnMain { player.play() }
@@ -893,14 +679,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
893
679
  override fun stop() = runBlockingOnMain { player.stop() }
894
680
 
895
681
  override fun setPlayWhenReady(playWhenReady: Boolean) = runBlockingOnMain {
896
- // Pre-setup this stages the intent for the player to come up with — never throws.
897
- connectedService?.player?.let { it.playWhenReady = playWhenReady }
898
- ?: run { pendingPlayWhenReady = playWhenReady }
682
+ player.playWhenReady = playWhenReady
899
683
  }
900
684
 
901
- override fun getPlayWhenReady(): Boolean = runBlockingOnMain {
902
- connectedService?.player?.playWhenReady ?: pendingPlayWhenReady ?: false
903
- }
685
+ override fun getPlayWhenReady(): Boolean = runBlockingOnMain { player.playWhenReady }
904
686
 
905
687
  override fun seekTo(position: Double) = runBlockingOnMain {
906
688
  player.seekTo((position * 1000).toLong(), TimeUnit.MILLISECONDS)
@@ -910,8 +692,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
910
692
  player.seekBy((offset * 1000).toLong(), TimeUnit.MILLISECONDS)
911
693
  }
912
694
 
913
- override fun seekToLiveEdge() = runBlockingOnMain { player.seekToLiveEdge() }
914
-
915
695
  override fun setVolume(level: Double) = runBlockingOnMain { player.volume = level.toFloat() }
916
696
 
917
697
  override fun getVolume(): Double = runBlockingOnMain { player.volume.toDouble() }
@@ -932,14 +712,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
932
712
 
933
713
  override fun getPlayingState(): PlayingState = runBlockingOnMain { player.getPlayingState() }
934
714
 
935
- override fun getRepeatMode(): RepeatMode = runBlockingOnMain {
936
- connectedService?.player?.repeatMode ?: pendingRepeatMode ?: RepeatMode.OFF
937
- }
715
+ override fun getRepeatMode(): RepeatMode = runBlockingOnMain { player.repeatMode }
938
716
 
939
- override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain {
940
- // Pre-setup this stages the mode for the player to come up with — never throws.
941
- connectedService?.player?.let { it.repeatMode = mode } ?: run { pendingRepeatMode = mode }
942
- }
717
+ override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain { player.repeatMode = mode }
943
718
 
944
719
  override fun getShuffleEnabled(): Boolean = runBlockingOnMain { player.shuffleMode }
945
720
 
@@ -947,10 +722,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
947
722
  player.shuffleMode = enabled
948
723
  }
949
724
 
950
- override fun setPlaybackIntervalEnabled(enabled: Boolean) = runBlockingOnMain {
951
- player.setPlaybackIntervalEnabled(enabled)
952
- }
953
-
954
725
  override fun getPlaybackError(): PlaybackError? = runBlockingOnMain { player.playbackError }
955
726
 
956
727
  override fun retry() = runBlockingOnMain { player.prepare() }
@@ -999,9 +770,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
999
770
  }
1000
771
  }
1001
772
 
1002
- override fun setQueue(tracks: Array<Track>, startIndex: Double?, startPosition: Double?) =
773
+ override fun setQueue(tracks: Array<Track>, startIndex: Double?, startPositionMs: Double?) =
1003
774
  runBlockingOnMain {
1004
- player.setQueue(tracks, startIndex?.toInt() ?: 0, ((startPosition ?: 0.0) * 1000).toLong())
775
+ player.setQueue(tracks, startIndex?.toInt() ?: 0, startPositionMs?.toLong() ?: 0)
1005
776
  }
1006
777
 
1007
778
  override fun setActiveTrackFavorited(favorited: Boolean) = runBlockingOnMain {
@@ -1033,20 +804,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1033
804
  // ============================================================================
1034
805
 
1035
806
  override fun updateNowPlaying(update: NowPlayingUpdate?) = runBlockingOnMain {
1036
- player.nowPlaying.updateNowPlaying(update)
1037
- }
1038
-
1039
- override fun flashNowPlaying(update: NowPlayingUpdate, durationMs: Double) = runBlockingOnMain {
1040
- player.nowPlaying.flashNowPlaying(update, durationMs)
807
+ player.updateNowPlaying(update)
1041
808
  }
1042
809
 
1043
- override fun clearNowPlayingFlash() = runBlockingOnMain {
1044
- player.nowPlaying.clearNowPlayingFlash()
1045
- }
1046
-
1047
- override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain {
1048
- player.nowPlaying.getNowPlaying()
1049
- }
810
+ override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain { player.getNowPlaying() }
1050
811
 
1051
812
  // ============================================================================
1052
813
  // MARK: Network Connectivity
@@ -1063,15 +824,13 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1063
824
  override fun setSystemVolume(volume: Double) = systemVolumeMonitor.setVolume(volume)
1064
825
 
1065
826
  // ============================================================================
1066
- // MARK: External Audio Output
827
+ // MARK: External Audio Output (iOS only, stub on Android)
1067
828
  // ============================================================================
1068
829
 
1069
- override fun getOutput(): Output? = outputMonitor.current
1070
-
1071
- override fun supportsOutputSwitcher(): Boolean = OutputSwitcher.isSupported()
830
+ override fun getIosOutput(): IosOutput? = null
1072
831
 
1073
- override fun openOutputPicker() {
1074
- OutputSwitcher.open(context)
832
+ override fun openIosOutputPicker() {
833
+ // No-op on Android
1075
834
  }
1076
835
 
1077
836
  // ============================================================================
@@ -1079,34 +838,34 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1079
838
  // ============================================================================
1080
839
 
1081
840
  override fun getEqualizerSettings(): EqualizerSettings? = runBlockingOnMain {
1082
- player.equalizer.getSettings()
841
+ player.getEqualizerSettings()
1083
842
  }
1084
843
 
1085
844
  override fun setEqualizerEnabled(enabled: Boolean) = runBlockingOnMain {
1086
- player.equalizer.setEnabled(enabled)
845
+ player.setEqualizerEnabled(enabled)
1087
846
  }
1088
847
 
1089
848
  override fun setEqualizerPreset(preset: String) = runBlockingOnMain {
1090
- player.equalizer.setPreset(preset)
849
+ player.setEqualizerPreset(preset)
1091
850
  }
1092
851
 
1093
852
  override fun setEqualizerLevels(levels: DoubleArray) = runBlockingOnMain {
1094
- player.equalizer.setLevels(levels)
853
+ player.setEqualizerLevels(levels)
1095
854
  }
1096
855
 
1097
856
  // ============================================================================
1098
857
  // MARK: Sleep Timer
1099
858
  // ============================================================================
1100
859
 
1101
- override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.sleepTimer.get() }
860
+ override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.getSleepTimer() }
1102
861
 
1103
- override fun setSleepTimer(seconds: Double, fadeDuration: Double?) = runBlockingOnMain {
1104
- player.sleepTimer.setAfter(seconds, fadeDuration)
1105
- }
862
+ override fun setSleepTimer(seconds: Double) = runBlockingOnMain { player.setSleepTimer(seconds) }
1106
863
 
1107
- override fun setSleepTimerToEndOfTrack() = runBlockingOnMain { player.sleepTimer.setEndOfTrack() }
864
+ override fun setSleepTimerToEndOfTrack() = runBlockingOnMain {
865
+ player.setSleepTimerToEndOfTrack()
866
+ }
1108
867
 
1109
- override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.sleepTimer.clear() }
868
+ override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.clearSleepTimer() }
1110
869
 
1111
870
  // ============================================================================
1112
871
  // MARK: Battery Optimization (Android only)
@@ -1186,7 +945,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1186
945
  player.setCallbacks(callbacks)
1187
946
  player.applyOptions(updateOptions)
1188
947
  player.setup(setupOptions)
1189
- applyPendingPlayerState(player)
1190
948
  // Start observing network connectivity changes
1191
949
  player.observeNetworkConnectivity(mainScope)
1192
950
  // Set browser reference for media URL transformation
@@ -1216,21 +974,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1216
974
  }
1217
975
  }
1218
976
 
1219
- /**
1220
- * Applies initial player state staged before the player existed. Consumed on apply so a later
1221
- * re-setup doesn't replay stale state.
1222
- */
1223
- private fun applyPendingPlayerState(player: Player) {
1224
- pendingRepeatMode?.let {
1225
- player.repeatMode = it
1226
- pendingRepeatMode = null
1227
- }
1228
- pendingPlayWhenReady?.let {
1229
- player.playWhenReady = it
1230
- pendingPlayWhenReady = null
1231
- }
1232
- }
1233
-
1234
977
  override fun onServiceDisconnected(name: ComponentName) {
1235
978
  mainScope.coroutineContext.cancelChildren()
1236
979
  mediaBrowserFuture = null
@@ -1274,10 +1017,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1274
1017
  post { this@AudioBrowser.onPlaybackProgressUpdated(event) }
1275
1018
  }
1276
1019
 
1277
- override fun onPlaybackInterval() {
1278
- post { this@AudioBrowser.onPlaybackInterval() }
1279
- }
1280
-
1281
1020
  override fun onPlaybackPlayWhenReadyChanged(event: PlaybackPlayWhenReadyChangedEvent) {
1282
1021
  post { this@AudioBrowser.onPlaybackPlayWhenReadyChanged(event) }
1283
1022
  }
@@ -1427,8 +1166,12 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1427
1166
  return handled
1428
1167
  }
1429
1168
 
1169
+ override fun onRemoteSetRating(event: RemoteSetRatingEvent) {
1170
+ post { this@AudioBrowser.onRemoteSetRating(event) }
1171
+ }
1172
+
1430
1173
  override fun onOptionsChanged(options: PlayerUpdateOptions) {
1431
- post { this@AudioBrowser.onOptionsChanged(options.toNitro()) }
1174
+ // Not currently emitted to JS
1432
1175
  }
1433
1176
 
1434
1177
  override fun onFavoriteChanged(event: FavoriteChangedEvent) {
@@ -1451,32 +1194,4 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
1451
1194
  post { this@AudioBrowser.onSleepTimerChanged(timer) }
1452
1195
  }
1453
1196
  }
1454
-
1455
- companion object {
1456
- // Process-wide car-connection state, from the androidx.car.app
1457
- // CarConnection provider — the documented Android Auto / Automotive
1458
- // connection signal, served by the car system app. Observed ONCE per
1459
- // process: AudioBrowser instances are re-created on a JS reload, and a
1460
- // per-instance observeForever would leak each one. The latest instance's
1461
- // callback registers as the single notification target (mirrors the iOS
1462
- // static + shared-instance pattern).
1463
- @Volatile private var carConnected = false
1464
- @Volatile private var carConnectionTarget: ((Boolean) -> Unit)? = null
1465
- private var carConnectionObserverStarted = false
1466
-
1467
- private fun startCarConnectionObserver(context: Context, handler: Handler) {
1468
- // Posted to main: LiveData observation is main-thread only, and the
1469
- // single-start guard is then only ever touched from one thread.
1470
- handler.post {
1471
- if (carConnectionObserverStarted) return@post
1472
- carConnectionObserverStarted = true
1473
- CarConnection(context.applicationContext).type.observeForever { type ->
1474
- val connected = type != CarConnection.CONNECTION_TYPE_NOT_CONNECTED
1475
- if (connected == carConnected) return@observeForever
1476
- carConnected = connected
1477
- carConnectionTarget?.invoke(connected)
1478
- }
1479
- }
1480
- }
1481
- }
1482
1197
  }