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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1147) hide show
  1. package/AudioBrowser.podspec +45 -0
  2. package/LICENSE +21 -0
  3. package/README.md +3 -1
  4. package/android/CMakeLists.txt +32 -0
  5. package/android/build.gradle +214 -0
  6. package/android/fix-prefab.gradle +51 -0
  7. package/android/gradle.properties +6 -0
  8. package/android/src/main/AndroidManifest.xml +36 -0
  9. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  10. package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +1197 -0
  11. package/android/src/main/java/com/audiobrowser/AudioBrowserPackage.kt +21 -0
  12. package/android/src/main/java/com/audiobrowser/Callbacks.kt +92 -0
  13. package/android/src/main/java/com/audiobrowser/HeadlessTaskService.kt +59 -0
  14. package/android/src/main/java/com/audiobrowser/Service.kt +334 -0
  15. package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +1174 -0
  16. package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +134 -0
  17. package/android/src/main/java/com/audiobrowser/browser/RouteMatch.kt +9 -0
  18. package/android/src/main/java/com/audiobrowser/browser/SimpleRouter.kt +154 -0
  19. package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +45 -0
  20. package/android/src/main/java/com/audiobrowser/extension/EnumExtensions.kt +5 -0
  21. package/android/src/main/java/com/audiobrowser/extension/NumberExt.kt +13 -0
  22. package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +171 -0
  23. package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +251 -0
  24. package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +80 -0
  25. package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +101 -0
  26. package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +125 -0
  27. package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +256 -0
  28. package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +162 -0
  29. package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +117 -0
  30. package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +596 -0
  31. package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +578 -0
  32. package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +59 -0
  33. package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +246 -0
  34. package/android/src/main/java/com/audiobrowser/player/Player.kt +1510 -0
  35. package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +230 -0
  36. package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +191 -0
  37. package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +80 -0
  38. package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +147 -0
  39. package/android/src/main/java/com/audiobrowser/util/AndroidAudioContentTypeFactory.kt +17 -0
  40. package/android/src/main/java/com/audiobrowser/util/BatteryOptimizationHelper.kt +95 -0
  41. package/android/src/main/java/com/audiobrowser/util/BatteryWarningStore.kt +38 -0
  42. package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +155 -0
  43. package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +390 -0
  44. package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +197 -0
  45. package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +75 -0
  46. package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +97 -0
  47. package/android/src/main/java/com/audiobrowser/util/NetworkConnectivityMonitor.kt +121 -0
  48. package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +25 -0
  49. package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
  50. package/android/src/main/java/com/audiobrowser/util/RepeatModeFactory.kt +22 -0
  51. package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
  52. package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +130 -0
  53. package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +50 -0
  54. package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +125 -0
  55. package/android/src/main/res/values/strings.xml +6 -0
  56. package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +63 -0
  57. package/android/src/test/java/com/audiobrowser/browser/SimpleBrowserTest.kt +38 -0
  58. package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +165 -0
  59. package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +240 -0
  60. package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +146 -0
  61. package/android/src/test/resources/robolectric.properties +1 -0
  62. package/ios/Bridge.h +8 -0
  63. package/ios/Browser/BrowserConfig.swift +111 -0
  64. package/ios/Browser/BrowserManager+URLResolution.swift +260 -0
  65. package/ios/Browser/BrowserManager.swift +630 -0
  66. package/ios/Browser/BrowserPathHelper.swift +190 -0
  67. package/ios/Browser/JsonModels.swift +202 -0
  68. package/ios/Browser/SimpleRouter.swift +184 -0
  69. package/ios/CarPlay/CarPlayArtworkResolver.swift +107 -0
  70. package/ios/CarPlay/CarPlayController.swift +771 -0
  71. package/ios/CarPlay/CarPlayImageLoader.swift +180 -0
  72. package/ios/CarPlay/CarPlayListItemFactory.swift +209 -0
  73. package/ios/CarPlay/CarPlayNowPlayingManager.swift +302 -0
  74. package/ios/CarPlay/RNABAudioBrowser.h +23 -0
  75. package/ios/CarPlay/RNABAudioBrowser.m +22 -0
  76. package/ios/CarPlay/RNABCarPlaySceneDelegate.h +15 -0
  77. package/ios/CarPlay/RNABCarPlaySceneDelegate.m +59 -0
  78. package/ios/CarPlay/RNABMediaIntentHandler.swift +60 -0
  79. package/ios/CarPlay/Track+CarPlay.swift +63 -0
  80. package/ios/Extension/Capability+RemoteCommand.swift +76 -0
  81. package/ios/Extension/ChapterMetadata+AVFoundation.swift +40 -0
  82. package/ios/Extension/CxxVectorConformances.swift +20 -0
  83. package/ios/Extension/NavigationError+Conversion.swift +49 -0
  84. package/ios/Extension/ResolvedTrack+Copying.swift +59 -0
  85. package/ios/Extension/TimedMetadata+AVFoundation.swift +129 -0
  86. package/ios/Extension/Track+AVPlayer.swift +33 -0
  87. package/ios/Extension/Track+Copying.swift +53 -0
  88. package/ios/Extension/TrackMetadata+AVFoundation.swift +131 -0
  89. package/ios/Http/HttpClient.swift +237 -0
  90. package/ios/HybridAudioBrowser.swift +1292 -0
  91. package/ios/Model/MediaURL.swift +67 -0
  92. package/ios/Model/NitroTypeStubs.swift +228 -0
  93. package/ios/Model/PlayerUpdateOptions.swift +116 -0
  94. package/ios/Model/RemoteCommand.swift +71 -0
  95. package/ios/Model/SourceType.swift +6 -0
  96. package/ios/Model/TrackPlayerError.swift +73 -0
  97. package/ios/NowPlayingInfo/MediaItemProperty.swift +78 -0
  98. package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
  99. package/ios/NowPlayingInfo/NowPlayingInfoController.swift +191 -0
  100. package/ios/NowPlayingInfo/NowPlayingInfoKeyValue.swift +6 -0
  101. package/ios/NowPlayingInfo/NowPlayingInfoProperty.swift +220 -0
  102. package/ios/Observer/PlayerItemNotificationObserver.swift +79 -0
  103. package/ios/Observer/PlayerItemPropertyObserver.swift +110 -0
  104. package/ios/Observer/PlayerStateObserver.swift +50 -0
  105. package/ios/Observer/PlayerTimeObserver.swift +105 -0
  106. package/ios/Option/PitchAlgorithms.swift +17 -0
  107. package/ios/Option/SessionCategories.swift +100 -0
  108. package/ios/Option/TimeEventFrequency.swift +18 -0
  109. package/ios/PlaybackEvent.swift +15 -0
  110. package/ios/Player/LoadSeekCoordinator.swift +84 -0
  111. package/ios/Player/MediaLoader.swift +197 -0
  112. package/ios/Player/MediaLoaderDelegate.swift +11 -0
  113. package/ios/Player/NowPlayingUpdater.swift +106 -0
  114. package/ios/Player/PlaybackCoordinator.swift +520 -0
  115. package/ios/Player/PlaybackCoordinatorCallbacks.swift +19 -0
  116. package/ios/Player/PlaybackEffectHandler.swift +44 -0
  117. package/ios/Player/PlaybackErrorHandler.swift +91 -0
  118. package/ios/Player/PlaybackProgressUpdateManager.swift +68 -0
  119. package/ios/Player/PlaybackStateMachine.swift +31 -0
  120. package/ios/Player/PlayerStatusTypes.swift +9 -0
  121. package/ios/Player/PlayingStateManager.swift +32 -0
  122. package/ios/Player/QueueManager.swift +320 -0
  123. package/ios/Player/RetryManager.swift +246 -0
  124. package/ios/Player/SeekCompletionHandler.swift +3 -0
  125. package/ios/Player/ShuffleOrder.swift +191 -0
  126. package/ios/Player/SleepTimerHandling.swift +7 -0
  127. package/ios/Player/SleepTimerManager.swift +131 -0
  128. package/ios/RemoteCommand/RemoteCommandController.swift +406 -0
  129. package/ios/Support/RNTrackPlayer-Bridging-Header.h +7 -0
  130. package/ios/Tests/BrowserPathHelperTests.swift +110 -0
  131. package/ios/Tests/CarPlayArtworkResolverTests.swift +413 -0
  132. package/ios/Tests/ChapterMetadataAVFoundationTests.swift +88 -0
  133. package/ios/Tests/EmitterTests.swift +122 -0
  134. package/ios/Tests/LoadSeekCoordinatorTests.swift +294 -0
  135. package/ios/Tests/MediaLoaderTests.swift +228 -0
  136. package/ios/Tests/PlaybackCoordinatorTests.swift +486 -0
  137. package/ios/Tests/PlaybackErrorHandlerTests.swift +213 -0
  138. package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +166 -0
  139. package/ios/Tests/PlaybackStateMachineTests.swift +137 -0
  140. package/ios/Tests/QueueManagerTests.swift +880 -0
  141. package/ios/Tests/ResolvedTrackCopyingTests.swift +245 -0
  142. package/ios/Tests/SimpleRouterTests.swift +139 -0
  143. package/ios/Tests/Support/TestTypes.swift +180 -0
  144. package/ios/Tests/TimedMetadataAVFoundationTests.swift +152 -0
  145. package/ios/Tests/TrackMetadataAVFoundationTests.swift +176 -0
  146. package/ios/Tests/TrackSelectorTests.swift +268 -0
  147. package/ios/TrackPlayer.swift +692 -0
  148. package/ios/TrackPlayerCallbacks.swift +92 -0
  149. package/ios/TrackSelector.swift +141 -0
  150. package/ios/Util/ArtworkImageFetcher.swift +35 -0
  151. package/ios/Util/Emitter.swift +68 -0
  152. package/ios/Util/LRUCache.swift +182 -0
  153. package/ios/Util/MetadataAdapter.swift +131 -0
  154. package/ios/Util/NetworkMonitor.swift +65 -0
  155. package/ios/Util/OnceValue.swift +70 -0
  156. package/ios/Util/SFSymbolRenderer.swift +142 -0
  157. package/ios/Util/SVGProcessor.swift +56 -0
  158. package/lib/commonjs/AudioBrowser.js +50 -0
  159. package/lib/commonjs/AudioBrowser.js.map +1 -0
  160. package/lib/commonjs/features/battery.js +154 -0
  161. package/lib/commonjs/features/battery.js.map +1 -0
  162. package/lib/commonjs/features/browser.js +272 -0
  163. package/lib/commonjs/features/browser.js.map +1 -0
  164. package/lib/commonjs/features/equalizer.js +69 -0
  165. package/lib/commonjs/features/equalizer.js.map +1 -0
  166. package/lib/commonjs/features/errors.js +165 -0
  167. package/lib/commonjs/features/errors.js.map +1 -0
  168. package/lib/commonjs/features/favorites.js +101 -0
  169. package/lib/commonjs/features/favorites.js.map +1 -0
  170. package/lib/commonjs/features/index.js +160 -0
  171. package/lib/commonjs/features/index.js.map +1 -0
  172. package/lib/commonjs/features/metadata.js +54 -0
  173. package/lib/commonjs/features/metadata.js.map +1 -0
  174. package/lib/commonjs/features/network.js +40 -0
  175. package/lib/commonjs/features/network.js.map +1 -0
  176. package/lib/commonjs/features/nowPlaying.js +61 -0
  177. package/lib/commonjs/features/nowPlaying.js.map +1 -0
  178. package/lib/commonjs/features/output.js +54 -0
  179. package/lib/commonjs/features/output.js.map +1 -0
  180. package/lib/commonjs/features/playback/controls.js +79 -0
  181. package/lib/commonjs/features/playback/controls.js.map +1 -0
  182. package/lib/commonjs/features/playback/index.js +83 -0
  183. package/lib/commonjs/features/playback/index.js.map +1 -0
  184. package/lib/commonjs/features/playback/playWhenReady.js +55 -0
  185. package/lib/commonjs/features/playback/playWhenReady.js.map +1 -0
  186. package/lib/commonjs/features/playback/playing.js +41 -0
  187. package/lib/commonjs/features/playback/playing.js.map +1 -0
  188. package/lib/commonjs/features/playback/progress.js +104 -0
  189. package/lib/commonjs/features/playback/progress.js.map +1 -0
  190. package/lib/commonjs/features/playback/rate.js +29 -0
  191. package/lib/commonjs/features/playback/rate.js.map +1 -0
  192. package/lib/commonjs/features/playback/state.js +62 -0
  193. package/lib/commonjs/features/playback/state.js.map +1 -0
  194. package/lib/commonjs/features/playback/volume.js +68 -0
  195. package/lib/commonjs/features/playback/volume.js.map +1 -0
  196. package/lib/commonjs/features/player/index.js +28 -0
  197. package/lib/commonjs/features/player/index.js.map +1 -0
  198. package/lib/commonjs/features/player/options.js +182 -0
  199. package/lib/commonjs/features/player/options.js.map +1 -0
  200. package/lib/commonjs/features/player/setup.js +143 -0
  201. package/lib/commonjs/features/player/setup.js.map +1 -0
  202. package/lib/commonjs/features/queue/activeTrack.js +52 -0
  203. package/lib/commonjs/features/queue/activeTrack.js.map +1 -0
  204. package/lib/commonjs/features/queue/index.js +50 -0
  205. package/lib/commonjs/features/queue/index.js.map +1 -0
  206. package/lib/commonjs/features/queue/queue.js +177 -0
  207. package/lib/commonjs/features/queue/queue.js.map +1 -0
  208. package/lib/commonjs/features/queue/repeatMode.js +58 -0
  209. package/lib/commonjs/features/queue/repeatMode.js.map +1 -0
  210. package/lib/commonjs/features/queue/shuffle.js +57 -0
  211. package/lib/commonjs/features/queue/shuffle.js.map +1 -0
  212. package/lib/commonjs/features/rating.js +2 -0
  213. package/lib/commonjs/features/rating.js.map +1 -0
  214. package/lib/commonjs/features/remoteControls.js +286 -0
  215. package/lib/commonjs/features/remoteControls.js.map +1 -0
  216. package/lib/commonjs/features/sleepTimer.js +164 -0
  217. package/lib/commonjs/features/sleepTimer.js.map +1 -0
  218. package/lib/commonjs/index.js +22 -0
  219. package/lib/commonjs/index.js.map +1 -0
  220. package/lib/commonjs/native.js +9 -0
  221. package/lib/commonjs/native.js.map +1 -0
  222. package/lib/commonjs/native.web.js +10 -0
  223. package/lib/commonjs/native.web.js.map +1 -0
  224. package/lib/commonjs/package.json +1 -0
  225. package/lib/commonjs/specs/audio-browser.nitro.js +6 -0
  226. package/lib/commonjs/specs/audio-browser.nitro.js.map +1 -0
  227. package/lib/commonjs/types/browser-native.js +6 -0
  228. package/lib/commonjs/types/browser-native.js.map +1 -0
  229. package/lib/commonjs/types/browser-nodes.js +6 -0
  230. package/lib/commonjs/types/browser-nodes.js.map +1 -0
  231. package/lib/commonjs/types/browser.js +6 -0
  232. package/lib/commonjs/types/browser.js.map +1 -0
  233. package/lib/commonjs/types/index.js +28 -0
  234. package/lib/commonjs/types/index.js.map +1 -0
  235. package/lib/commonjs/types/player.js +2 -0
  236. package/lib/commonjs/types/player.js.map +1 -0
  237. package/lib/commonjs/utils/LazyNativeEmitter.js +58 -0
  238. package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -0
  239. package/lib/commonjs/utils/NativeUpdatedValue.js +59 -0
  240. package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -0
  241. package/lib/commonjs/utils/resolveAssetSource.js +11 -0
  242. package/lib/commonjs/utils/resolveAssetSource.js.map +1 -0
  243. package/lib/commonjs/utils/useDebug.js +221 -0
  244. package/lib/commonjs/utils/useDebug.js.map +1 -0
  245. package/lib/commonjs/utils/useNativeUpdatedValue.js +44 -0
  246. package/lib/commonjs/utils/useNativeUpdatedValue.js.map +1 -0
  247. package/lib/commonjs/utils/validation.js +23 -0
  248. package/lib/commonjs/utils/validation.js.map +1 -0
  249. package/lib/commonjs/web/NativeAudioBrowser.js +731 -0
  250. package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -0
  251. package/lib/commonjs/web/SimpleRouter.js +146 -0
  252. package/lib/commonjs/web/SimpleRouter.js.map +1 -0
  253. package/lib/commonjs/web/SimpleRouter.test.js +174 -0
  254. package/lib/commonjs/web/SimpleRouter.test.js.map +1 -0
  255. package/lib/commonjs/web/TrackPlayer/Event.js +19 -0
  256. package/lib/commonjs/web/TrackPlayer/Event.js.map +1 -0
  257. package/lib/commonjs/web/TrackPlayer/Player.js +301 -0
  258. package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -0
  259. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +293 -0
  260. package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  261. package/lib/commonjs/web/TrackPlayer/RepeatMode.js +12 -0
  262. package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -0
  263. package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js +13 -0
  264. package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
  265. package/lib/commonjs/web/TrackPlayer/SleepTimer.js +75 -0
  266. package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -0
  267. package/lib/commonjs/web/TrackPlayer/State.js +18 -0
  268. package/lib/commonjs/web/TrackPlayer/State.js.map +1 -0
  269. package/lib/commonjs/web/TrackPlayer/index.js +52 -0
  270. package/lib/commonjs/web/TrackPlayer/index.js.map +1 -0
  271. package/lib/commonjs/web/browser/BrowserManager.js +587 -0
  272. package/lib/commonjs/web/browser/BrowserManager.js.map +1 -0
  273. package/lib/commonjs/web/browser/FavoriteManager.js +80 -0
  274. package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -0
  275. package/lib/commonjs/web/browser/NavigationErrorManager.js +106 -0
  276. package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -0
  277. package/lib/commonjs/web/browser/SearchManager.js +80 -0
  278. package/lib/commonjs/web/browser/SearchManager.js.map +1 -0
  279. package/lib/commonjs/web/http/HttpClient.js +94 -0
  280. package/lib/commonjs/web/http/HttpClient.js.map +1 -0
  281. package/lib/commonjs/web/http/RequestConfigBuilder.js +294 -0
  282. package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -0
  283. package/lib/commonjs/web/player/NowPlayingManager.js +79 -0
  284. package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -0
  285. package/lib/commonjs/web/player/OptionsManager.js +88 -0
  286. package/lib/commonjs/web/player/OptionsManager.js.map +1 -0
  287. package/lib/commonjs/web/util/BrowserPathHelper.js +138 -0
  288. package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -0
  289. package/lib/commonjs/web/util/shuffle.js +21 -0
  290. package/lib/commonjs/web/util/shuffle.js.map +1 -0
  291. package/lib/module/AudioBrowser.js +7 -0
  292. package/lib/module/AudioBrowser.js.map +1 -0
  293. package/lib/module/features/battery.js +144 -0
  294. package/lib/module/features/battery.js.map +1 -0
  295. package/lib/module/features/browser.js +258 -0
  296. package/lib/module/features/browser.js.map +1 -0
  297. package/lib/module/features/equalizer.js +60 -0
  298. package/lib/module/features/equalizer.js.map +1 -0
  299. package/lib/module/features/errors.js +156 -0
  300. package/lib/module/features/errors.js.map +1 -0
  301. package/lib/module/features/favorites.js +95 -0
  302. package/lib/module/features/favorites.js.map +1 -0
  303. package/lib/module/features/index.js +26 -0
  304. package/lib/module/features/index.js.map +1 -0
  305. package/lib/module/features/metadata.js +51 -0
  306. package/lib/module/features/metadata.js.map +1 -0
  307. package/lib/module/features/network.js +35 -0
  308. package/lib/module/features/network.js.map +1 -0
  309. package/lib/module/features/nowPlaying.js +55 -0
  310. package/lib/module/features/nowPlaying.js.map +1 -0
  311. package/lib/module/features/output.js +47 -0
  312. package/lib/module/features/output.js.map +1 -0
  313. package/lib/module/features/playback/controls.js +69 -0
  314. package/lib/module/features/playback/controls.js.map +1 -0
  315. package/lib/module/features/playback/index.js +10 -0
  316. package/lib/module/features/playback/index.js.map +1 -0
  317. package/lib/module/features/playback/playWhenReady.js +49 -0
  318. package/lib/module/features/playback/playWhenReady.js.map +1 -0
  319. package/lib/module/features/playback/playing.js +36 -0
  320. package/lib/module/features/playback/playing.js.map +1 -0
  321. package/lib/module/features/playback/progress.js +98 -0
  322. package/lib/module/features/playback/progress.js.map +1 -0
  323. package/lib/module/features/playback/rate.js +25 -0
  324. package/lib/module/features/playback/rate.js.map +1 -0
  325. package/lib/module/features/playback/state.js +57 -0
  326. package/lib/module/features/playback/state.js.map +1 -0
  327. package/lib/module/features/playback/volume.js +60 -0
  328. package/lib/module/features/playback/volume.js.map +1 -0
  329. package/lib/module/features/player/index.js +5 -0
  330. package/lib/module/features/player/index.js.map +1 -0
  331. package/lib/module/features/player/options.js +176 -0
  332. package/lib/module/features/player/options.js.map +1 -0
  333. package/lib/module/features/player/setup.js +140 -0
  334. package/lib/module/features/player/setup.js.map +1 -0
  335. package/lib/module/features/queue/activeTrack.js +46 -0
  336. package/lib/module/features/queue/activeTrack.js.map +1 -0
  337. package/lib/module/features/queue/index.js +7 -0
  338. package/lib/module/features/queue/index.js.map +1 -0
  339. package/lib/module/features/queue/queue.js +162 -0
  340. package/lib/module/features/queue/queue.js.map +1 -0
  341. package/lib/module/features/queue/repeatMode.js +52 -0
  342. package/lib/module/features/queue/repeatMode.js.map +1 -0
  343. package/lib/module/features/queue/shuffle.js +50 -0
  344. package/lib/module/features/queue/shuffle.js.map +1 -0
  345. package/lib/module/features/rating.js +2 -0
  346. package/lib/module/features/rating.js.map +1 -0
  347. package/lib/module/features/remoteControls.js +275 -0
  348. package/lib/module/features/remoteControls.js.map +1 -0
  349. package/lib/module/features/sleepTimer.js +155 -0
  350. package/lib/module/features/sleepTimer.js.map +1 -0
  351. package/lib/module/index.js +6 -0
  352. package/lib/module/index.js.map +1 -0
  353. package/lib/module/native.js +5 -0
  354. package/lib/module/native.js.map +1 -0
  355. package/lib/module/native.web.js +7 -0
  356. package/lib/module/native.web.js.map +1 -0
  357. package/lib/module/package.json +1 -0
  358. package/lib/module/specs/audio-browser.nitro.js +4 -0
  359. package/lib/module/specs/audio-browser.nitro.js.map +1 -0
  360. package/lib/module/types/browser-native.js +4 -0
  361. package/lib/module/types/browser-native.js.map +1 -0
  362. package/lib/module/types/browser-nodes.js +4 -0
  363. package/lib/module/types/browser-nodes.js.map +1 -0
  364. package/lib/module/types/browser.js +4 -0
  365. package/lib/module/types/browser.js.map +1 -0
  366. package/lib/module/types/index.js +5 -0
  367. package/lib/module/types/index.js.map +1 -0
  368. package/lib/module/types/player.js +2 -0
  369. package/lib/module/types/player.js.map +1 -0
  370. package/lib/module/utils/LazyNativeEmitter.js +53 -0
  371. package/lib/module/utils/LazyNativeEmitter.js.map +1 -0
  372. package/lib/module/utils/NativeUpdatedValue.js +54 -0
  373. package/lib/module/utils/NativeUpdatedValue.js.map +1 -0
  374. package/lib/module/utils/resolveAssetSource.js +7 -0
  375. package/lib/module/utils/resolveAssetSource.js.map +1 -0
  376. package/lib/module/utils/useDebug.js +218 -0
  377. package/lib/module/utils/useDebug.js.map +1 -0
  378. package/lib/module/utils/useNativeUpdatedValue.js +40 -0
  379. package/lib/module/utils/useNativeUpdatedValue.js.map +1 -0
  380. package/lib/module/utils/validation.js +18 -0
  381. package/lib/module/utils/validation.js.map +1 -0
  382. package/lib/module/web/NativeAudioBrowser.js +727 -0
  383. package/lib/module/web/NativeAudioBrowser.js.map +1 -0
  384. package/lib/module/web/SimpleRouter.js +141 -0
  385. package/lib/module/web/SimpleRouter.js.map +1 -0
  386. package/lib/module/web/SimpleRouter.test.js +174 -0
  387. package/lib/module/web/SimpleRouter.test.js.map +1 -0
  388. package/lib/module/web/TrackPlayer/Event.js +15 -0
  389. package/lib/module/web/TrackPlayer/Event.js.map +1 -0
  390. package/lib/module/web/TrackPlayer/Player.js +296 -0
  391. package/lib/module/web/TrackPlayer/Player.js.map +1 -0
  392. package/lib/module/web/TrackPlayer/PlaylistPlayer.js +288 -0
  393. package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
  394. package/lib/module/web/TrackPlayer/RepeatMode.js +8 -0
  395. package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -0
  396. package/lib/module/web/TrackPlayer/SetupNotCalledError.js +8 -0
  397. package/lib/module/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
  398. package/lib/module/web/TrackPlayer/SleepTimer.js +70 -0
  399. package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -0
  400. package/lib/module/web/TrackPlayer/State.js +14 -0
  401. package/lib/module/web/TrackPlayer/State.js.map +1 -0
  402. package/lib/module/web/TrackPlayer/index.js +7 -0
  403. package/lib/module/web/TrackPlayer/index.js.map +1 -0
  404. package/lib/module/web/browser/BrowserManager.js +583 -0
  405. package/lib/module/web/browser/BrowserManager.js.map +1 -0
  406. package/lib/module/web/browser/FavoriteManager.js +75 -0
  407. package/lib/module/web/browser/FavoriteManager.js.map +1 -0
  408. package/lib/module/web/browser/NavigationErrorManager.js +101 -0
  409. package/lib/module/web/browser/NavigationErrorManager.js.map +1 -0
  410. package/lib/module/web/browser/SearchManager.js +76 -0
  411. package/lib/module/web/browser/SearchManager.js.map +1 -0
  412. package/lib/module/web/http/HttpClient.js +89 -0
  413. package/lib/module/web/http/HttpClient.js.map +1 -0
  414. package/lib/module/web/http/RequestConfigBuilder.js +291 -0
  415. package/lib/module/web/http/RequestConfigBuilder.js.map +1 -0
  416. package/lib/module/web/player/NowPlayingManager.js +74 -0
  417. package/lib/module/web/player/NowPlayingManager.js.map +1 -0
  418. package/lib/module/web/player/OptionsManager.js +83 -0
  419. package/lib/module/web/player/OptionsManager.js.map +1 -0
  420. package/lib/module/web/util/BrowserPathHelper.js +134 -0
  421. package/lib/module/web/util/BrowserPathHelper.js.map +1 -0
  422. package/lib/module/web/util/shuffle.js +17 -0
  423. package/lib/module/web/util/shuffle.js.map +1 -0
  424. package/lib/typescript/src/AudioBrowser.d.ts +5 -0
  425. package/lib/typescript/src/AudioBrowser.d.ts.map +1 -0
  426. package/lib/typescript/src/features/battery.d.ts +112 -0
  427. package/lib/typescript/src/features/battery.d.ts.map +1 -0
  428. package/lib/typescript/src/features/browser.d.ts +68 -0
  429. package/lib/typescript/src/features/browser.d.ts.map +1 -0
  430. package/lib/typescript/src/features/equalizer.d.ts +35 -0
  431. package/lib/typescript/src/features/equalizer.d.ts.map +1 -0
  432. package/lib/typescript/src/features/errors.d.ts +136 -0
  433. package/lib/typescript/src/features/errors.d.ts.map +1 -0
  434. package/lib/typescript/src/features/favorites.d.ts +84 -0
  435. package/lib/typescript/src/features/favorites.d.ts.map +1 -0
  436. package/lib/typescript/src/features/index.d.ts +23 -0
  437. package/lib/typescript/src/features/index.d.ts.map +1 -0
  438. package/lib/typescript/src/features/metadata.d.ts +103 -0
  439. package/lib/typescript/src/features/metadata.d.ts.map +1 -0
  440. package/lib/typescript/src/features/network.d.ts +18 -0
  441. package/lib/typescript/src/features/network.d.ts.map +1 -0
  442. package/lib/typescript/src/features/nowPlaying.d.ts +36 -0
  443. package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -0
  444. package/lib/typescript/src/features/output.d.ts +28 -0
  445. package/lib/typescript/src/features/output.d.ts.map +1 -0
  446. package/lib/typescript/src/features/playback/controls.d.ts +40 -0
  447. package/lib/typescript/src/features/playback/controls.d.ts.map +1 -0
  448. package/lib/typescript/src/features/playback/index.d.ts +8 -0
  449. package/lib/typescript/src/features/playback/index.d.ts.map +1 -0
  450. package/lib/typescript/src/features/playback/playWhenReady.d.ts +30 -0
  451. package/lib/typescript/src/features/playback/playWhenReady.d.ts.map +1 -0
  452. package/lib/typescript/src/features/playback/playing.d.ts +21 -0
  453. package/lib/typescript/src/features/playback/playing.d.ts.map +1 -0
  454. package/lib/typescript/src/features/playback/progress.d.ts +51 -0
  455. package/lib/typescript/src/features/playback/progress.d.ts.map +1 -0
  456. package/lib/typescript/src/features/playback/rate.d.ts +12 -0
  457. package/lib/typescript/src/features/playback/rate.d.ts.map +1 -0
  458. package/lib/typescript/src/features/playback/state.d.ts +43 -0
  459. package/lib/typescript/src/features/playback/state.d.ts.map +1 -0
  460. package/lib/typescript/src/features/playback/volume.d.ts +32 -0
  461. package/lib/typescript/src/features/playback/volume.d.ts.map +1 -0
  462. package/lib/typescript/src/features/player/index.d.ts +3 -0
  463. package/lib/typescript/src/features/player/index.d.ts.map +1 -0
  464. package/lib/typescript/src/features/player/options.d.ts +413 -0
  465. package/lib/typescript/src/features/player/options.d.ts.map +1 -0
  466. package/lib/typescript/src/features/player/setup.d.ts +471 -0
  467. package/lib/typescript/src/features/player/setup.d.ts.map +1 -0
  468. package/lib/typescript/src/features/queue/activeTrack.d.ts +38 -0
  469. package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -0
  470. package/lib/typescript/src/features/queue/index.d.ts +5 -0
  471. package/lib/typescript/src/features/queue/index.d.ts.map +1 -0
  472. package/lib/typescript/src/features/queue/queue.d.ts +111 -0
  473. package/lib/typescript/src/features/queue/queue.d.ts.map +1 -0
  474. package/lib/typescript/src/features/queue/repeatMode.d.ts +34 -0
  475. package/lib/typescript/src/features/queue/repeatMode.d.ts.map +1 -0
  476. package/lib/typescript/src/features/queue/shuffle.d.ts +27 -0
  477. package/lib/typescript/src/features/queue/shuffle.d.ts.map +1 -0
  478. package/lib/typescript/src/features/rating.d.ts +14 -0
  479. package/lib/typescript/src/features/rating.d.ts.map +1 -0
  480. package/lib/typescript/src/features/remoteControls.d.ts +164 -0
  481. package/lib/typescript/src/features/remoteControls.d.ts.map +1 -0
  482. package/lib/typescript/src/features/sleepTimer.d.ts +80 -0
  483. package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -0
  484. package/lib/typescript/src/index.d.ts +4 -0
  485. package/lib/typescript/src/index.d.ts.map +1 -0
  486. package/lib/typescript/src/native.d.ts +3 -0
  487. package/lib/typescript/src/native.d.ts.map +1 -0
  488. package/lib/typescript/src/native.web.d.ts +3 -0
  489. package/lib/typescript/src/native.web.d.ts.map +1 -0
  490. package/lib/typescript/src/specs/audio-browser.nitro.d.ts +242 -0
  491. package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -0
  492. package/lib/typescript/src/types/browser-native.d.ts +40 -0
  493. package/lib/typescript/src/types/browser-native.d.ts.map +1 -0
  494. package/lib/typescript/src/types/browser-nodes.d.ts +198 -0
  495. package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -0
  496. package/lib/typescript/src/types/browser.d.ts +742 -0
  497. package/lib/typescript/src/types/browser.d.ts.map +1 -0
  498. package/lib/typescript/src/types/index.d.ts +3 -0
  499. package/lib/typescript/src/types/index.d.ts.map +1 -0
  500. package/lib/typescript/src/types/player.d.ts +64 -0
  501. package/lib/typescript/src/types/player.d.ts.map +1 -0
  502. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +35 -0
  503. package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -0
  504. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +39 -0
  505. package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -0
  506. package/lib/typescript/src/utils/resolveAssetSource.d.ts +4 -0
  507. package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -0
  508. package/lib/typescript/src/utils/useDebug.d.ts +65 -0
  509. package/lib/typescript/src/utils/useDebug.d.ts.map +1 -0
  510. package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts +14 -0
  511. package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts.map +1 -0
  512. package/lib/typescript/src/utils/validation.d.ts +3 -0
  513. package/lib/typescript/src/utils/validation.d.ts.map +1 -0
  514. package/lib/typescript/src/web/NativeAudioBrowser.d.ts +188 -0
  515. package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -0
  516. package/lib/typescript/src/web/SimpleRouter.d.ts +40 -0
  517. package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -0
  518. package/lib/typescript/src/web/SimpleRouter.test.d.ts +2 -0
  519. package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +1 -0
  520. package/lib/typescript/src/web/TrackPlayer/Event.d.ts +11 -0
  521. package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +1 -0
  522. package/lib/typescript/src/web/TrackPlayer/Player.d.ts +59 -0
  523. package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +1 -0
  524. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +39 -0
  525. package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +1 -0
  526. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +6 -0
  527. package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +1 -0
  528. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +4 -0
  529. package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +1 -0
  530. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +34 -0
  531. package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +1 -0
  532. package/lib/typescript/src/web/TrackPlayer/State.d.ts +13 -0
  533. package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +1 -0
  534. package/lib/typescript/src/web/TrackPlayer/index.d.ts +5 -0
  535. package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +1 -0
  536. package/lib/typescript/src/web/browser/BrowserManager.d.ts +154 -0
  537. package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +1 -0
  538. package/lib/typescript/src/web/browser/FavoriteManager.d.ts +42 -0
  539. package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +1 -0
  540. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +40 -0
  541. package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +1 -0
  542. package/lib/typescript/src/web/browser/SearchManager.d.ts +22 -0
  543. package/lib/typescript/src/web/browser/SearchManager.d.ts.map +1 -0
  544. package/lib/typescript/src/web/http/HttpClient.d.ts +25 -0
  545. package/lib/typescript/src/web/http/HttpClient.d.ts.map +1 -0
  546. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +98 -0
  547. package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +1 -0
  548. package/lib/typescript/src/web/player/NowPlayingManager.d.ts +34 -0
  549. package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +1 -0
  550. package/lib/typescript/src/web/player/OptionsManager.d.ts +32 -0
  551. package/lib/typescript/src/web/player/OptionsManager.d.ts.map +1 -0
  552. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +69 -0
  553. package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +1 -0
  554. package/lib/typescript/src/web/util/shuffle.d.ts +8 -0
  555. package/lib/typescript/src/web/util/shuffle.d.ts.map +1 -0
  556. package/nitro.json +24 -0
  557. package/nitrogen/generated/.gitattributes +1 -0
  558. package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +88 -0
  559. package/nitrogen/generated/android/AudioBrowser+autolinking.gradle +27 -0
  560. package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +136 -0
  561. package/nitrogen/generated/android/AudioBrowserOnLoad.hpp +34 -0
  562. package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +67 -0
  563. package/nitrogen/generated/android/c++/JAndroidAudioOffloadSettings.hpp +61 -0
  564. package/nitrogen/generated/android/c++/JAndroidOptions.hpp +86 -0
  565. package/nitrogen/generated/android/c++/JAndroidPlayerWakeMode.hpp +61 -0
  566. package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
  567. package/nitrogen/generated/android/c++/JAppKilledPlaybackBehavior.hpp +61 -0
  568. package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +166 -0
  569. package/nitrogen/generated/android/c++/JBatteryOptimizationStatus.hpp +61 -0
  570. package/nitrogen/generated/android/c++/JBatteryOptimizationStatusChangedEvent.hpp +58 -0
  571. package/nitrogen/generated/android/c++/JBatteryWarningPendingChangedEvent.hpp +57 -0
  572. package/nitrogen/generated/android/c++/JBrowseError.hpp +57 -0
  573. package/nitrogen/generated/android/c++/JBrowseResult.cpp +26 -0
  574. package/nitrogen/generated/android/c++/JBrowseResult.hpp +87 -0
  575. package/nitrogen/generated/android/c++/JBrowserSourceCallbackParam.hpp +76 -0
  576. package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +64 -0
  577. package/nitrogen/generated/android/c++/JCarPlaySiriListButtonPosition.hpp +58 -0
  578. package/nitrogen/generated/android/c++/JChapterMetadata.hpp +70 -0
  579. package/nitrogen/generated/android/c++/JEqualizerSettings.hpp +125 -0
  580. package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +74 -0
  581. package/nitrogen/generated/android/c++/JFormatNavigationErrorParams.hpp +72 -0
  582. package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +61 -0
  583. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.hpp +111 -0
  584. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.hpp +134 -0
  585. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +143 -0
  586. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +139 -0
  587. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +147 -0
  588. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +159 -0
  589. package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +139 -0
  590. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  591. package/nitrogen/generated/android/c++/JFunc_void_BatteryOptimizationStatusChangedEvent.hpp +79 -0
  592. package/nitrogen/generated/android/c++/JFunc_void_BatteryWarningPendingChangedEvent.hpp +77 -0
  593. package/nitrogen/generated/android/c++/JFunc_void_EqualizerSettings.hpp +80 -0
  594. package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +91 -0
  595. package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
  596. package/nitrogen/generated/android/c++/JFunc_void_NavigationErrorEvent.hpp +83 -0
  597. package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +89 -0
  598. package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +98 -0
  599. package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +83 -0
  600. package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +91 -0
  601. package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +81 -0
  602. package/nitrogen/generated/android/c++/JFunc_void_PlaybackPlayWhenReadyChangedEvent.hpp +77 -0
  603. package/nitrogen/generated/android/c++/JFunc_void_PlaybackProgressUpdatedEvent.hpp +77 -0
  604. package/nitrogen/generated/android/c++/JFunc_void_PlaybackQueueEndedEvent.hpp +77 -0
  605. package/nitrogen/generated/android/c++/JFunc_void_PlayingState.hpp +77 -0
  606. package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpBackwardEvent.hpp +77 -0
  607. package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpForwardEvent.hpp +77 -0
  608. package/nitrogen/generated/android/c++/JFunc_void_RemotePlayIdEvent.hpp +79 -0
  609. package/nitrogen/generated/android/c++/JFunc_void_RemotePlaySearchEvent.hpp +78 -0
  610. package/nitrogen/generated/android/c++/JFunc_void_RemoteSeekEvent.hpp +77 -0
  611. package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
  612. package/nitrogen/generated/android/c++/JFunc_void_RemoteSkipEvent.hpp +77 -0
  613. package/nitrogen/generated/android/c++/JFunc_void_RepeatModeChangedEvent.hpp +79 -0
  614. package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +79 -0
  615. package/nitrogen/generated/android/c++/JFunc_void_TrackMetadata.hpp +79 -0
  616. package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
  617. package/nitrogen/generated/android/c++/JFunc_void_double.hpp +75 -0
  618. package/nitrogen/generated/android/c++/JFunc_void_std__optional_FormattedNavigationError_.hpp +79 -0
  619. package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +93 -0
  620. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.hpp +84 -0
  621. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
  622. package/nitrogen/generated/android/c++/JFunc_void_std__vector_ChapterMetadata_.hpp +98 -0
  623. package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +107 -0
  624. package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
  625. package/nitrogen/generated/android/c++/JHttpMethod.hpp +73 -0
  626. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +1835 -0
  627. package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +248 -0
  628. package/nitrogen/generated/android/c++/JIOSCategory.hpp +70 -0
  629. package/nitrogen/generated/android/c++/JIOSCategoryMode.hpp +79 -0
  630. package/nitrogen/generated/android/c++/JIOSCategoryOptions.hpp +73 -0
  631. package/nitrogen/generated/android/c++/JIOSCategoryPolicy.hpp +61 -0
  632. package/nitrogen/generated/android/c++/JImageContext.hpp +61 -0
  633. package/nitrogen/generated/android/c++/JImageQueryParams.hpp +62 -0
  634. package/nitrogen/generated/android/c++/JImageRowItem.hpp +75 -0
  635. package/nitrogen/generated/android/c++/JImageSource.hpp +86 -0
  636. package/nitrogen/generated/android/c++/JIosOutput.hpp +67 -0
  637. package/nitrogen/generated/android/c++/JIosOutputType.hpp +85 -0
  638. package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +156 -0
  639. package/nitrogen/generated/android/c++/JMediaTransformParams.hpp +69 -0
  640. package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +216 -0
  641. package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +151 -0
  642. package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +105 -0
  643. package/nitrogen/generated/android/c++/JNavigationError.hpp +72 -0
  644. package/nitrogen/generated/android/c++/JNavigationErrorEvent.hpp +62 -0
  645. package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +67 -0
  646. package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +86 -0
  647. package/nitrogen/generated/android/c++/JNotificationButton.hpp +67 -0
  648. package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
  649. package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +104 -0
  650. package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +62 -0
  651. package/nitrogen/generated/android/c++/JOptions.hpp +97 -0
  652. package/nitrogen/generated/android/c++/JPartialAndroidSetupPlayerOptions.hpp +104 -0
  653. package/nitrogen/generated/android/c++/JPartialIOSSetupPlayerOptions.hpp +100 -0
  654. package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +96 -0
  655. package/nitrogen/generated/android/c++/JPercentageRating.hpp +57 -0
  656. package/nitrogen/generated/android/c++/JPlayback.hpp +66 -0
  657. package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +86 -0
  658. package/nitrogen/generated/android/c++/JPlaybackError.hpp +61 -0
  659. package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +60 -0
  660. package/nitrogen/generated/android/c++/JPlaybackPlayWhenReadyChangedEvent.hpp +57 -0
  661. package/nitrogen/generated/android/c++/JPlaybackProgressUpdatedEvent.hpp +69 -0
  662. package/nitrogen/generated/android/c++/JPlaybackQueueEndedEvent.hpp +61 -0
  663. package/nitrogen/generated/android/c++/JPlaybackState.hpp +79 -0
  664. package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +101 -0
  665. package/nitrogen/generated/android/c++/JPlayingState.hpp +61 -0
  666. package/nitrogen/generated/android/c++/JProgress.hpp +65 -0
  667. package/nitrogen/generated/android/c++/JRatingType.hpp +73 -0
  668. package/nitrogen/generated/android/c++/JRemoteJumpBackwardEvent.hpp +57 -0
  669. package/nitrogen/generated/android/c++/JRemoteJumpForwardEvent.hpp +57 -0
  670. package/nitrogen/generated/android/c++/JRemotePlayIdEvent.hpp +62 -0
  671. package/nitrogen/generated/android/c++/JRemotePlaySearchEvent.hpp +57 -0
  672. package/nitrogen/generated/android/c++/JRemoteSeekEvent.hpp +57 -0
  673. package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
  674. package/nitrogen/generated/android/c++/JRemoteSkipEvent.hpp +57 -0
  675. package/nitrogen/generated/android/c++/JRepeatMode.hpp +61 -0
  676. package/nitrogen/generated/android/c++/JRepeatModeChangedEvent.hpp +58 -0
  677. package/nitrogen/generated/android/c++/JRequestConfig.hpp +115 -0
  678. package/nitrogen/generated/android/c++/JResolvedTrack.hpp +184 -0
  679. package/nitrogen/generated/android/c++/JRetryConfig.hpp +61 -0
  680. package/nitrogen/generated/android/c++/JSearchMode.hpp +70 -0
  681. package/nitrogen/generated/android/c++/JSearchParams.hpp +84 -0
  682. package/nitrogen/generated/android/c++/JSleepTimer.cpp +30 -0
  683. package/nitrogen/generated/android/c++/JSleepTimer.hpp +88 -0
  684. package/nitrogen/generated/android/c++/JSleepTimerEndOfTrack.hpp +57 -0
  685. package/nitrogen/generated/android/c++/JSleepTimerTime.hpp +57 -0
  686. package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
  687. package/nitrogen/generated/android/c++/JThumbsRating.hpp +57 -0
  688. package/nitrogen/generated/android/c++/JTimedMetadata.hpp +74 -0
  689. package/nitrogen/generated/android/c++/JTrack.hpp +154 -0
  690. package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +96 -0
  691. package/nitrogen/generated/android/c++/JTrackMetadata.hpp +118 -0
  692. package/nitrogen/generated/android/c++/JTrackStyle.hpp +58 -0
  693. package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +134 -0
  694. package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
  695. package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.cpp +26 -0
  696. package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.hpp +70 -0
  697. package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.cpp +26 -0
  698. package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.hpp +70 -0
  699. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +34 -0
  700. package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +105 -0
  701. package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
  702. package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
  703. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +26 -0
  704. package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +75 -0
  705. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +26 -0
  706. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioOffloadSettings.kt +41 -0
  707. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +50 -0
  708. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidPlayerWakeMode.kt +24 -0
  709. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
  710. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AppKilledPlaybackBehavior.kt +24 -0
  711. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +72 -0
  712. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AudioBrowserOnLoad.kt +35 -0
  713. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatus.kt +24 -0
  714. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatusChangedEvent.kt +38 -0
  715. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryWarningPendingChangedEvent.kt +38 -0
  716. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseError.kt +38 -0
  717. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseResult.kt +53 -0
  718. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowserSourceCallbackParam.kt +41 -0
  719. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +25 -0
  720. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlaySiriListButtonPosition.kt +23 -0
  721. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ChapterMetadata.kt +47 -0
  722. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/EqualizerSettings.kt +59 -0
  723. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FavoriteChangedEvent.kt +41 -0
  724. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNavigationErrorParams.kt +44 -0
  725. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +41 -0
  726. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.kt +80 -0
  727. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.kt +80 -0
  728. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.kt +80 -0
  729. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.kt +80 -0
  730. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt +80 -0
  731. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.kt +80 -0
  732. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.kt +80 -0
  733. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void.kt +80 -0
  734. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryOptimizationStatusChangedEvent.kt +80 -0
  735. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryWarningPendingChangedEvent.kt +80 -0
  736. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_EqualizerSettings.kt +80 -0
  737. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_FavoriteChangedEvent.kt +80 -0
  738. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_IosOutput.kt +80 -0
  739. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NavigationErrorEvent.kt +80 -0
  740. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NowPlayingMetadata.kt +80 -0
  741. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Options.kt +80 -0
  742. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Playback.kt +80 -0
  743. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackActiveTrackChangedEvent.kt +80 -0
  744. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackErrorEvent.kt +80 -0
  745. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackPlayWhenReadyChangedEvent.kt +80 -0
  746. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackProgressUpdatedEvent.kt +80 -0
  747. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackQueueEndedEvent.kt +80 -0
  748. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlayingState.kt +80 -0
  749. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpBackwardEvent.kt +80 -0
  750. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpForwardEvent.kt +80 -0
  751. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlayIdEvent.kt +80 -0
  752. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlaySearchEvent.kt +80 -0
  753. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSeekEvent.kt +80 -0
  754. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSetRatingEvent.kt +80 -0
  755. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSkipEvent.kt +80 -0
  756. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RepeatModeChangedEvent.kt +80 -0
  757. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TimedMetadata.kt +80 -0
  758. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TrackMetadata.kt +80 -0
  759. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +80 -0
  760. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_double.kt +80 -0
  761. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_FormattedNavigationError_.kt +80 -0
  762. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_ResolvedTrack_.kt +80 -0
  763. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.kt +80 -0
  764. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__string.kt +80 -0
  765. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_ChapterMetadata_.kt +80 -0
  766. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_Track_.kt +80 -0
  767. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HeartRating.kt +38 -0
  768. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HttpMethod.kt +28 -0
  769. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +1134 -0
  770. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategory.kt +27 -0
  771. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryMode.kt +30 -0
  772. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryOptions.kt +28 -0
  773. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryPolicy.kt +24 -0
  774. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageContext.kt +41 -0
  775. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageQueryParams.kt +41 -0
  776. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +47 -0
  777. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageSource.kt +47 -0
  778. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutput.kt +44 -0
  779. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +32 -0
  780. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +69 -0
  781. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaTransformParams.kt +41 -0
  782. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +72 -0
  783. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +63 -0
  784. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +53 -0
  785. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationError.kt +47 -0
  786. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorEvent.kt +38 -0
  787. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +26 -0
  788. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +50 -0
  789. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +26 -0
  790. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
  791. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +65 -0
  792. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +41 -0
  793. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +53 -0
  794. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialAndroidSetupPlayerOptions.kt +65 -0
  795. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialIOSSetupPlayerOptions.kt +50 -0
  796. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
  797. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PercentageRating.kt +38 -0
  798. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Playback.kt +41 -0
  799. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackActiveTrackChangedEvent.kt +50 -0
  800. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +41 -0
  801. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorEvent.kt +38 -0
  802. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackPlayWhenReadyChangedEvent.kt +38 -0
  803. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackProgressUpdatedEvent.kt +47 -0
  804. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackQueueEndedEvent.kt +41 -0
  805. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +30 -0
  806. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +71 -0
  807. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayingState.kt +41 -0
  808. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Progress.kt +44 -0
  809. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RatingType.kt +28 -0
  810. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpBackwardEvent.kt +38 -0
  811. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpForwardEvent.kt +38 -0
  812. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlayIdEvent.kt +41 -0
  813. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlaySearchEvent.kt +38 -0
  814. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSeekEvent.kt +38 -0
  815. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSetRatingEvent.kt +38 -0
  816. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSkipEvent.kt +38 -0
  817. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatMode.kt +24 -0
  818. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatModeChangedEvent.kt +38 -0
  819. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RequestConfig.kt +59 -0
  820. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +95 -0
  821. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +41 -0
  822. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +27 -0
  823. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +56 -0
  824. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimer.kt +65 -0
  825. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerEndOfTrack.kt +38 -0
  826. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerTime.kt +38 -0
  827. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StarRating.kt +38 -0
  828. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ThumbsRating.kt +38 -0
  829. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TimedMetadata.kt +50 -0
  830. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +89 -0
  831. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackLoadEvent.kt +44 -0
  832. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackMetadata.kt +83 -0
  833. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +23 -0
  834. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +66 -0
  835. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
  836. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_AndroidAudioOffloadSettings.kt +53 -0
  837. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_RetryConfig.kt +53 -0
  838. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +77 -0
  839. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_Double.kt +53 -0
  840. package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_NotificationButtonLayout.kt +53 -0
  841. package/nitrogen/generated/ios/AudioBrowser+autolinking.rb +60 -0
  842. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +424 -0
  843. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +2959 -0
  844. package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +309 -0
  845. package/nitrogen/generated/ios/AudioBrowserAutolinking.mm +33 -0
  846. package/nitrogen/generated/ios/AudioBrowserAutolinking.swift +26 -0
  847. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.cpp +11 -0
  848. package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +1214 -0
  849. package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +52 -0
  850. package/nitrogen/generated/ios/swift/AndroidAudioOffloadSettings.swift +60 -0
  851. package/nitrogen/generated/ios/swift/AndroidOptions.swift +81 -0
  852. package/nitrogen/generated/ios/swift/AndroidPlayerWakeMode.swift +44 -0
  853. package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +119 -0
  854. package/nitrogen/generated/ios/swift/AppKilledPlaybackBehavior.swift +44 -0
  855. package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +294 -0
  856. package/nitrogen/generated/ios/swift/BatteryOptimizationStatus.swift +44 -0
  857. package/nitrogen/generated/ios/swift/BatteryOptimizationStatusChangedEvent.swift +29 -0
  858. package/nitrogen/generated/ios/swift/BatteryWarningPendingChangedEvent.swift +29 -0
  859. package/nitrogen/generated/ios/swift/BrowseError.swift +29 -0
  860. package/nitrogen/generated/ios/swift/BrowseResult.swift +18 -0
  861. package/nitrogen/generated/ios/swift/BrowserSourceCallbackParam.swift +61 -0
  862. package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +48 -0
  863. package/nitrogen/generated/ios/swift/CarPlaySiriListButtonPosition.swift +40 -0
  864. package/nitrogen/generated/ios/swift/ChapterMetadata.swift +70 -0
  865. package/nitrogen/generated/ios/swift/EqualizerSettings.swift +95 -0
  866. package/nitrogen/generated/ios/swift/FavoriteChangedEvent.swift +34 -0
  867. package/nitrogen/generated/ios/swift/FormatNavigationErrorParams.swift +39 -0
  868. package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +34 -0
  869. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.swift +60 -0
  870. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.swift +61 -0
  871. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +76 -0
  872. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.swift +61 -0
  873. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +68 -0
  874. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.swift +67 -0
  875. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.swift +61 -0
  876. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  877. package/nitrogen/generated/ios/swift/Func_void_BatteryOptimizationStatusChangedEvent.swift +46 -0
  878. package/nitrogen/generated/ios/swift/Func_void_BatteryWarningPendingChangedEvent.swift +46 -0
  879. package/nitrogen/generated/ios/swift/Func_void_EqualizerSettings.swift +46 -0
  880. package/nitrogen/generated/ios/swift/Func_void_FavoriteChangedEvent.swift +46 -0
  881. package/nitrogen/generated/ios/swift/Func_void_IosOutput.swift +46 -0
  882. package/nitrogen/generated/ios/swift/Func_void_NavigationErrorEvent.swift +46 -0
  883. package/nitrogen/generated/ios/swift/Func_void_NowPlayingMetadata.swift +46 -0
  884. package/nitrogen/generated/ios/swift/Func_void_Options.swift +46 -0
  885. package/nitrogen/generated/ios/swift/Func_void_Playback.swift +46 -0
  886. package/nitrogen/generated/ios/swift/Func_void_PlaybackActiveTrackChangedEvent.swift +46 -0
  887. package/nitrogen/generated/ios/swift/Func_void_PlaybackErrorEvent.swift +46 -0
  888. package/nitrogen/generated/ios/swift/Func_void_PlaybackPlayWhenReadyChangedEvent.swift +46 -0
  889. package/nitrogen/generated/ios/swift/Func_void_PlaybackProgressUpdatedEvent.swift +46 -0
  890. package/nitrogen/generated/ios/swift/Func_void_PlaybackQueueEndedEvent.swift +46 -0
  891. package/nitrogen/generated/ios/swift/Func_void_PlayingState.swift +46 -0
  892. package/nitrogen/generated/ios/swift/Func_void_RemoteJumpBackwardEvent.swift +46 -0
  893. package/nitrogen/generated/ios/swift/Func_void_RemoteJumpForwardEvent.swift +46 -0
  894. package/nitrogen/generated/ios/swift/Func_void_RemotePlayIdEvent.swift +46 -0
  895. package/nitrogen/generated/ios/swift/Func_void_RemotePlaySearchEvent.swift +46 -0
  896. package/nitrogen/generated/ios/swift/Func_void_RemoteSeekEvent.swift +46 -0
  897. package/nitrogen/generated/ios/swift/Func_void_RemoteSetRatingEvent.swift +46 -0
  898. package/nitrogen/generated/ios/swift/Func_void_RemoteSkipEvent.swift +46 -0
  899. package/nitrogen/generated/ios/swift/Func_void_RepeatModeChangedEvent.swift +46 -0
  900. package/nitrogen/generated/ios/swift/Func_void_RequestConfig.swift +46 -0
  901. package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +46 -0
  902. package/nitrogen/generated/ios/swift/Func_void_TrackMetadata.swift +46 -0
  903. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  904. package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
  905. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  906. package/nitrogen/generated/ios/swift/Func_void_std__optional_FormattedNavigationError_.swift +46 -0
  907. package/nitrogen/generated/ios/swift/Func_void_std__optional_ResolvedTrack_.swift +46 -0
  908. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.swift +68 -0
  909. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_RequestConfig__.swift +66 -0
  910. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift +66 -0
  911. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_Track___.swift +66 -0
  912. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_void__.swift +64 -0
  913. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
  914. package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError_.swift +58 -0
  915. package/nitrogen/generated/ios/swift/Func_void_std__vector_ChapterMetadata_.swift +46 -0
  916. package/nitrogen/generated/ios/swift/Func_void_std__vector_Track_.swift +46 -0
  917. package/nitrogen/generated/ios/swift/HeartRating.swift +29 -0
  918. package/nitrogen/generated/ios/swift/HttpMethod.swift +60 -0
  919. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +180 -0
  920. package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +2401 -0
  921. package/nitrogen/generated/ios/swift/IOSCategory.swift +56 -0
  922. package/nitrogen/generated/ios/swift/IOSCategoryMode.swift +68 -0
  923. package/nitrogen/generated/ios/swift/IOSCategoryOptions.swift +60 -0
  924. package/nitrogen/generated/ios/swift/IOSCategoryPolicy.swift +44 -0
  925. package/nitrogen/generated/ios/swift/ImageContext.swift +60 -0
  926. package/nitrogen/generated/ios/swift/ImageQueryParams.swift +60 -0
  927. package/nitrogen/generated/ios/swift/ImageRowItem.swift +76 -0
  928. package/nitrogen/generated/ios/swift/ImageSource.swift +90 -0
  929. package/nitrogen/generated/ios/swift/IosOutput.swift +39 -0
  930. package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
  931. package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +295 -0
  932. package/nitrogen/generated/ios/swift/MediaTransformParams.swift +40 -0
  933. package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +271 -0
  934. package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +178 -0
  935. package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +143 -0
  936. package/nitrogen/generated/ios/swift/NavigationError.swift +70 -0
  937. package/nitrogen/generated/ios/swift/NavigationErrorEvent.swift +35 -0
  938. package/nitrogen/generated/ios/swift/NavigationErrorType.swift +52 -0
  939. package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +119 -0
  940. package/nitrogen/generated/ios/swift/NotificationButton.swift +52 -0
  941. package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +92 -0
  942. package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +233 -0
  943. package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +60 -0
  944. package/nitrogen/generated/ios/swift/Options.swift +92 -0
  945. package/nitrogen/generated/ios/swift/PartialAndroidSetupPlayerOptions.swift +228 -0
  946. package/nitrogen/generated/ios/swift/PartialIOSSetupPlayerOptions.swift +99 -0
  947. package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +101 -0
  948. package/nitrogen/generated/ios/swift/PercentageRating.swift +29 -0
  949. package/nitrogen/generated/ios/swift/Playback.swift +40 -0
  950. package/nitrogen/generated/ios/swift/PlaybackActiveTrackChangedEvent.swift +87 -0
  951. package/nitrogen/generated/ios/swift/PlaybackError.swift +34 -0
  952. package/nitrogen/generated/ios/swift/PlaybackErrorEvent.swift +35 -0
  953. package/nitrogen/generated/ios/swift/PlaybackPlayWhenReadyChangedEvent.swift +29 -0
  954. package/nitrogen/generated/ios/swift/PlaybackProgressUpdatedEvent.swift +44 -0
  955. package/nitrogen/generated/ios/swift/PlaybackQueueEndedEvent.swift +34 -0
  956. package/nitrogen/generated/ios/swift/PlaybackState.swift +68 -0
  957. package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +240 -0
  958. package/nitrogen/generated/ios/swift/PlayingState.swift +34 -0
  959. package/nitrogen/generated/ios/swift/Progress.swift +39 -0
  960. package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
  961. package/nitrogen/generated/ios/swift/RemoteJumpBackwardEvent.swift +29 -0
  962. package/nitrogen/generated/ios/swift/RemoteJumpForwardEvent.swift +29 -0
  963. package/nitrogen/generated/ios/swift/RemotePlayIdEvent.swift +47 -0
  964. package/nitrogen/generated/ios/swift/RemotePlaySearchEvent.swift +29 -0
  965. package/nitrogen/generated/ios/swift/RemoteSeekEvent.swift +29 -0
  966. package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +58 -0
  967. package/nitrogen/generated/ios/swift/RemoteSkipEvent.swift +29 -0
  968. package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
  969. package/nitrogen/generated/ios/swift/RepeatModeChangedEvent.swift +29 -0
  970. package/nitrogen/generated/ios/swift/RequestConfig.swift +189 -0
  971. package/nitrogen/generated/ios/swift/ResolvedTrack.swift +342 -0
  972. package/nitrogen/generated/ios/swift/RetryConfig.swift +47 -0
  973. package/nitrogen/generated/ios/swift/SearchMode.swift +56 -0
  974. package/nitrogen/generated/ios/swift/SearchParams.swift +130 -0
  975. package/nitrogen/generated/ios/swift/SleepTimer.swift +19 -0
  976. package/nitrogen/generated/ios/swift/SleepTimerEndOfTrack.swift +29 -0
  977. package/nitrogen/generated/ios/swift/SleepTimerTime.swift +29 -0
  978. package/nitrogen/generated/ios/swift/StarRating.swift +29 -0
  979. package/nitrogen/generated/ios/swift/ThumbsRating.swift +29 -0
  980. package/nitrogen/generated/ios/swift/TimedMetadata.swift +114 -0
  981. package/nitrogen/generated/ios/swift/Track.swift +320 -0
  982. package/nitrogen/generated/ios/swift/TrackLoadEvent.swift +45 -0
  983. package/nitrogen/generated/ios/swift/TrackMetadata.swift +312 -0
  984. package/nitrogen/generated/ios/swift/TrackStyle.swift +40 -0
  985. package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +248 -0
  986. package/nitrogen/generated/ios/swift/UpdateOptions.swift +143 -0
  987. package/nitrogen/generated/ios/swift/Variant_Bool_AndroidAudioOffloadSettings.swift +18 -0
  988. package/nitrogen/generated/ios/swift/Variant_Bool_RetryConfig.swift +18 -0
  989. package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
  990. package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
  991. package/nitrogen/generated/ios/swift/Variant_NullType_NotificationButtonLayout.swift +18 -0
  992. package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +88 -0
  993. package/nitrogen/generated/shared/c++/AndroidAudioOffloadSettings.hpp +87 -0
  994. package/nitrogen/generated/shared/c++/AndroidOptions.hpp +109 -0
  995. package/nitrogen/generated/shared/c++/AndroidPlayerWakeMode.hpp +80 -0
  996. package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +109 -0
  997. package/nitrogen/generated/shared/c++/AppKilledPlaybackBehavior.hpp +80 -0
  998. package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +141 -0
  999. package/nitrogen/generated/shared/c++/BatteryOptimizationStatus.hpp +80 -0
  1000. package/nitrogen/generated/shared/c++/BatteryOptimizationStatusChangedEvent.hpp +84 -0
  1001. package/nitrogen/generated/shared/c++/BatteryWarningPendingChangedEvent.hpp +83 -0
  1002. package/nitrogen/generated/shared/c++/BrowseError.hpp +83 -0
  1003. package/nitrogen/generated/shared/c++/BrowserSourceCallbackParam.hpp +89 -0
  1004. package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +84 -0
  1005. package/nitrogen/generated/shared/c++/CarPlaySiriListButtonPosition.hpp +76 -0
  1006. package/nitrogen/generated/shared/c++/ChapterMetadata.hpp +96 -0
  1007. package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +113 -0
  1008. package/nitrogen/generated/shared/c++/FavoriteChangedEvent.hpp +88 -0
  1009. package/nitrogen/generated/shared/c++/FormatNavigationErrorParams.hpp +96 -0
  1010. package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +87 -0
  1011. package/nitrogen/generated/shared/c++/HeartRating.hpp +83 -0
  1012. package/nitrogen/generated/shared/c++/HttpMethod.hpp +96 -0
  1013. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +207 -0
  1014. package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +375 -0
  1015. package/nitrogen/generated/shared/c++/IOSCategory.hpp +92 -0
  1016. package/nitrogen/generated/shared/c++/IOSCategoryMode.hpp +104 -0
  1017. package/nitrogen/generated/shared/c++/IOSCategoryOptions.hpp +96 -0
  1018. package/nitrogen/generated/shared/c++/IOSCategoryPolicy.hpp +80 -0
  1019. package/nitrogen/generated/shared/c++/ImageContext.hpp +87 -0
  1020. package/nitrogen/generated/shared/c++/ImageQueryParams.hpp +88 -0
  1021. package/nitrogen/generated/shared/c++/ImageRowItem.hpp +98 -0
  1022. package/nitrogen/generated/shared/c++/ImageSource.hpp +99 -0
  1023. package/nitrogen/generated/shared/c++/IosOutput.hpp +93 -0
  1024. package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
  1025. package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +131 -0
  1026. package/nitrogen/generated/shared/c++/MediaTransformParams.hpp +92 -0
  1027. package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +150 -0
  1028. package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +139 -0
  1029. package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +111 -0
  1030. package/nitrogen/generated/shared/c++/NavigationError.hpp +98 -0
  1031. package/nitrogen/generated/shared/c++/NavigationErrorEvent.hpp +85 -0
  1032. package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +88 -0
  1033. package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +109 -0
  1034. package/nitrogen/generated/shared/c++/NotificationButton.hpp +88 -0
  1035. package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +102 -0
  1036. package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +132 -0
  1037. package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +88 -0
  1038. package/nitrogen/generated/shared/c++/Options.hpp +113 -0
  1039. package/nitrogen/generated/shared/c++/PartialAndroidSetupPlayerOptions.hpp +129 -0
  1040. package/nitrogen/generated/shared/c++/PartialIOSSetupPlayerOptions.hpp +111 -0
  1041. package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +104 -0
  1042. package/nitrogen/generated/shared/c++/PercentageRating.hpp +83 -0
  1043. package/nitrogen/generated/shared/c++/Playback.hpp +92 -0
  1044. package/nitrogen/generated/shared/c++/PlaybackActiveTrackChangedEvent.hpp +101 -0
  1045. package/nitrogen/generated/shared/c++/PlaybackError.hpp +87 -0
  1046. package/nitrogen/generated/shared/c++/PlaybackErrorEvent.hpp +85 -0
  1047. package/nitrogen/generated/shared/c++/PlaybackPlayWhenReadyChangedEvent.hpp +83 -0
  1048. package/nitrogen/generated/shared/c++/PlaybackProgressUpdatedEvent.hpp +95 -0
  1049. package/nitrogen/generated/shared/c++/PlaybackQueueEndedEvent.hpp +87 -0
  1050. package/nitrogen/generated/shared/c++/PlaybackState.hpp +104 -0
  1051. package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +127 -0
  1052. package/nitrogen/generated/shared/c++/PlayingState.hpp +87 -0
  1053. package/nitrogen/generated/shared/c++/Progress.hpp +91 -0
  1054. package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
  1055. package/nitrogen/generated/shared/c++/RemoteJumpBackwardEvent.hpp +83 -0
  1056. package/nitrogen/generated/shared/c++/RemoteJumpForwardEvent.hpp +83 -0
  1057. package/nitrogen/generated/shared/c++/RemotePlayIdEvent.hpp +88 -0
  1058. package/nitrogen/generated/shared/c++/RemotePlaySearchEvent.hpp +83 -0
  1059. package/nitrogen/generated/shared/c++/RemoteSeekEvent.hpp +83 -0
  1060. package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +94 -0
  1061. package/nitrogen/generated/shared/c++/RemoteSkipEvent.hpp +83 -0
  1062. package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
  1063. package/nitrogen/generated/shared/c++/RepeatModeChangedEvent.hpp +84 -0
  1064. package/nitrogen/generated/shared/c++/RequestConfig.hpp +115 -0
  1065. package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +175 -0
  1066. package/nitrogen/generated/shared/c++/RetryConfig.hpp +87 -0
  1067. package/nitrogen/generated/shared/c++/SearchMode.hpp +92 -0
  1068. package/nitrogen/generated/shared/c++/SearchParams.hpp +110 -0
  1069. package/nitrogen/generated/shared/c++/SleepTimerEndOfTrack.hpp +83 -0
  1070. package/nitrogen/generated/shared/c++/SleepTimerTime.hpp +83 -0
  1071. package/nitrogen/generated/shared/c++/StarRating.hpp +83 -0
  1072. package/nitrogen/generated/shared/c++/ThumbsRating.hpp +83 -0
  1073. package/nitrogen/generated/shared/c++/TimedMetadata.hpp +100 -0
  1074. package/nitrogen/generated/shared/c++/Track.hpp +161 -0
  1075. package/nitrogen/generated/shared/c++/TrackLoadEvent.hpp +93 -0
  1076. package/nitrogen/generated/shared/c++/TrackMetadata.hpp +144 -0
  1077. package/nitrogen/generated/shared/c++/TrackStyle.hpp +76 -0
  1078. package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +124 -0
  1079. package/nitrogen/generated/shared/c++/UpdateOptions.hpp +111 -0
  1080. package/package.json +117 -6
  1081. package/src/AudioBrowser.ts +4 -0
  1082. package/src/features/battery.ts +176 -0
  1083. package/src/features/browser.ts +316 -0
  1084. package/src/features/equalizer.ts +64 -0
  1085. package/src/features/errors.ts +196 -0
  1086. package/src/features/favorites.ts +102 -0
  1087. package/src/features/index.ts +23 -0
  1088. package/src/features/metadata.ts +130 -0
  1089. package/src/features/network.ts +34 -0
  1090. package/src/features/nowPlaying.ts +56 -0
  1091. package/src/features/output.ts +50 -0
  1092. package/src/features/playback/controls.ts +66 -0
  1093. package/src/features/playback/index.ts +7 -0
  1094. package/src/features/playback/playWhenReady.ts +57 -0
  1095. package/src/features/playback/playing.ts +40 -0
  1096. package/src/features/playback/progress.ts +122 -0
  1097. package/src/features/playback/rate.ts +22 -0
  1098. package/src/features/playback/state.ts +72 -0
  1099. package/src/features/playback/volume.ts +59 -0
  1100. package/src/features/player/index.ts +2 -0
  1101. package/src/features/player/options.ts +479 -0
  1102. package/src/features/player/setup.ts +551 -0
  1103. package/src/features/queue/activeTrack.ts +59 -0
  1104. package/src/features/queue/index.ts +4 -0
  1105. package/src/features/queue/queue.ts +173 -0
  1106. package/src/features/queue/repeatMode.ts +58 -0
  1107. package/src/features/queue/shuffle.ts +49 -0
  1108. package/src/features/rating.ts +17 -0
  1109. package/src/features/remoteControls.ts +341 -0
  1110. package/src/features/sleepTimer.ts +186 -0
  1111. package/src/index.ts +5 -0
  1112. package/src/native.ts +5 -0
  1113. package/src/native.web.ts +4 -0
  1114. package/src/specs/audio-browser.nitro.ts +325 -0
  1115. package/src/types/browser-native.ts +68 -0
  1116. package/src/types/browser-nodes.ts +222 -0
  1117. package/src/types/browser.ts +828 -0
  1118. package/src/types/index.ts +2 -0
  1119. package/src/types/player.ts +69 -0
  1120. package/src/utils/LazyNativeEmitter.ts +58 -0
  1121. package/src/utils/NativeUpdatedValue.ts +56 -0
  1122. package/src/utils/resolveAssetSource.ts +4 -0
  1123. package/src/utils/useDebug.ts +283 -0
  1124. package/src/utils/useNativeUpdatedValue.ts +41 -0
  1125. package/src/utils/validation.ts +27 -0
  1126. package/src/web/NativeAudioBrowser.ts +884 -0
  1127. package/src/web/SimpleRouter.test.ts +160 -0
  1128. package/src/web/SimpleRouter.ts +194 -0
  1129. package/src/web/TrackPlayer/Event.ts +11 -0
  1130. package/src/web/TrackPlayer/Player.ts +351 -0
  1131. package/src/web/TrackPlayer/PlaylistPlayer.ts +346 -0
  1132. package/src/web/TrackPlayer/RepeatMode.ts +7 -0
  1133. package/src/web/TrackPlayer/SetupNotCalledError.ts +5 -0
  1134. package/src/web/TrackPlayer/SleepTimer.ts +71 -0
  1135. package/src/web/TrackPlayer/State.ts +15 -0
  1136. package/src/web/TrackPlayer/index.ts +4 -0
  1137. package/src/web/browser/BrowserManager.ts +699 -0
  1138. package/src/web/browser/FavoriteManager.ts +79 -0
  1139. package/src/web/browser/NavigationErrorManager.ts +119 -0
  1140. package/src/web/browser/SearchManager.ts +88 -0
  1141. package/src/web/http/HttpClient.ts +125 -0
  1142. package/src/web/http/RequestConfigBuilder.ts +363 -0
  1143. package/src/web/player/NowPlayingManager.ts +89 -0
  1144. package/src/web/player/OptionsManager.ts +102 -0
  1145. package/src/web/util/BrowserPathHelper.ts +148 -0
  1146. package/src/web/util/shuffle.ts +14 -0
  1147. package/index.js +0 -1
@@ -0,0 +1,1292 @@
1
+ import AVFoundation
2
+ import AVKit
3
+ import Foundation
4
+ import MediaPlayer
5
+ import NitroModules
6
+ import os.log
7
+
8
+ @MainActor let playerAndConfiguredBrowser = OnceValue<(HybridAudioBrowser, TrackPlayer)> {
9
+ guard let browser = HybridAudioBrowser.shared,
10
+ browser.browserManager.isConfigured,
11
+ let player = browser.getPlayer() else { return nil }
12
+ return (browser, player)
13
+ }
14
+
15
+ /// Wraps a non-Sendable value for passing through MainActor.assumeIsolated.
16
+ /// Only safe when the caller blocks until the MainActor work completes (DispatchQueue.main.sync).
17
+ private struct UncheckedSendableBox<T>: @unchecked Sendable { let value: T }
18
+
19
+ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
20
+ private let logger = Logger(subsystem: "com.audiobrowser", category: "AudioBrowser")
21
+
22
+ // MARK: - Shared Instance for CarPlay
23
+
24
+ /// Shared instance for CarPlay access. Set when HybridAudioBrowser is created.
25
+ private(set) nonisolated(unsafe) weak static var shared: HybridAudioBrowser?
26
+
27
+ // MARK: - Private Properties
28
+
29
+ private var player: TrackPlayer?
30
+ private let networkMonitor = NetworkMonitor()
31
+ let browserManager = BrowserManager()
32
+ private let trackSelector: TrackSelector
33
+ private var volumeObservation: NSKeyValueObservation?
34
+ private var routeChangeObserver: NSObjectProtocol?
35
+ private var nowPlayingOverride: NowPlayingUpdate?
36
+ private let playerOptions = PlayerUpdateOptions()
37
+
38
+ /// Configured playback rates for the playback-rate capability (for CarPlay rate cycling)
39
+ var playbackRates: [Double] { playerOptions.playbackRates }
40
+ private var lastNavigationError: NavigationError? {
41
+ didSet {
42
+ // Skip if both nil (no real change)
43
+ guard oldValue != nil || lastNavigationError != nil else { return }
44
+ navigationErrorEmitter.emit(NavigationErrorEvent(error: lastNavigationError))
45
+ }
46
+ }
47
+
48
+ private var lastFormattedNavigationError: FormattedNavigationError? {
49
+ didSet {
50
+ // Skip if both nil (no real change)
51
+ guard oldValue != nil || lastFormattedNavigationError != nil else { return }
52
+ onFormattedNavigationError(lastFormattedNavigationError)
53
+ }
54
+ }
55
+
56
+ // MARK: - Multi-Listener Emitters
57
+
58
+ /// Emitters allow multiple listeners for each event type, avoiding callback hijacking
59
+ public let tabsChangedEmitter = Emitter<[Track]>()
60
+ public let contentChangedEmitter = Emitter<ResolvedTrack?>()
61
+ public let favoriteChangedEmitter = Emitter<FavoriteChangedEvent>()
62
+ public let activeTrackChangedEmitter = Emitter<PlaybackActiveTrackChangedEvent>()
63
+ public let queueChangedEmitter = Emitter<[Track]>()
64
+ public let navigationErrorEmitter = Emitter<NavigationErrorEvent>()
65
+ public let repeatModeChangedEmitter = Emitter<RepeatModeChangedEvent>()
66
+ public let externalContentChangedEmitter = Emitter<String>()
67
+
68
+ // MARK: - Thread Safety
69
+
70
+ /// Runs a closure on MainActor synchronously. Safe for non-Sendable return types
71
+ /// because DispatchQueue.main.sync blocks the caller — no concurrent access window.
72
+ private func onMainActor<T>(_ work: @MainActor () -> T) -> T {
73
+ if Thread.isMainThread {
74
+ return MainActor.assumeIsolated { UncheckedSendableBox(value: work()) }.value
75
+ } else {
76
+ return DispatchQueue.main.sync {
77
+ MainActor.assumeIsolated { UncheckedSendableBox(value: work()) }.value
78
+ }
79
+ }
80
+ }
81
+
82
+ private func onMainActor<T>(_ work: @MainActor () throws -> T) throws -> T {
83
+ if Thread.isMainThread {
84
+ return try MainActor.assumeIsolated { UncheckedSendableBox(value: try work()) }.value
85
+ } else {
86
+ return try DispatchQueue.main.sync {
87
+ try MainActor.assumeIsolated { UncheckedSendableBox(value: try work()) }.value
88
+ }
89
+ }
90
+ }
91
+
92
+ // MARK: - Browser Properties
93
+
94
+ public var path: String? {
95
+ get { onMainActor { browserManager.getPath() } }
96
+ set {
97
+ guard let newPath = newValue else { return }
98
+ Task {
99
+ do {
100
+ try await browserManager.navigate(newPath)
101
+ } catch {
102
+ handleNavigationError(error, path: newPath)
103
+ }
104
+ }
105
+ }
106
+ }
107
+
108
+ public var tabs: [Track]? {
109
+ get { onMainActor { browserManager.getTabs() } }
110
+ set { /* tabs are managed internally by browserManager */ }
111
+ }
112
+
113
+ public var configuration: NativeBrowserConfiguration = .init(
114
+ path: nil, request: nil, media: nil, artwork: nil, routes: nil,
115
+ singleTrack: nil, handleTrackLoad: nil, androidControllerOfflineError: nil,
116
+ carPlayUpNextButton: nil, carPlayNowPlayingButtons: nil, formatNavigationError: nil,
117
+ ) {
118
+ didSet {
119
+ onMainActor { browserManager.config = BrowserConfig(from: configuration) }
120
+
121
+ // Query tabs and navigate to initial path after config is set (matches Kotlin behavior)
122
+ Task { @MainActor in
123
+ // Notify waiting listeners (e.g., CarPlay cold start)
124
+ playerAndConfiguredBrowser.check()
125
+ }
126
+ Task {
127
+ let tabs = try? await browserManager.queryTabs()
128
+ // Navigate to configured path, first tab, or "/"
129
+ let initialPath = configuration.path ?? tabs?.first?.url ?? "/"
130
+ // Clear error before navigation (matches Kotlin clearNavigationError())
131
+ await MainActor.run {
132
+ lastNavigationError = nil
133
+ lastFormattedNavigationError = nil
134
+ }
135
+ do {
136
+ try await browserManager.navigate(initialPath)
137
+ } catch {
138
+ handleNavigationError(error, path: initialPath)
139
+ }
140
+ }
141
+ }
142
+ }
143
+
144
+ // MARK: - Browser Callbacks
145
+
146
+ public var onPathChanged: (String) -> Void = { _ in }
147
+ public var onContentChanged: (ResolvedTrack?) -> Void = { _ in }
148
+ public var onTabsChanged: ([Track]) -> Void = { _ in }
149
+ public var onNavigationError: (NavigationErrorEvent) -> Void = { _ in }
150
+ public var onFormattedNavigationError: (FormattedNavigationError?) -> Void = { _ in }
151
+
152
+ // MARK: - Player Callbacks
153
+
154
+ public var onChapterMetadata: ([ChapterMetadata]) -> Void = { _ in }
155
+ public var onTrackMetadata: (TrackMetadata) -> Void = { _ in }
156
+ public var onTimedMetadata: (TimedMetadata) -> Void = { _ in }
157
+ public var onPlaybackActiveTrackChanged: (PlaybackActiveTrackChangedEvent) -> Void = { _ in }
158
+ public var onPlaybackError: (PlaybackErrorEvent) -> Void = { _ in }
159
+ public var onPlaybackPlayWhenReadyChanged: (PlaybackPlayWhenReadyChangedEvent) -> Void = { _ in }
160
+ public var onPlaybackPlayingState: (PlayingState) -> Void = { _ in }
161
+ public var onPlaybackProgressUpdated: (PlaybackProgressUpdatedEvent) -> Void = { _ in }
162
+ public var onPlaybackQueueEnded: (PlaybackQueueEndedEvent) -> Void = { _ in }
163
+ public var onPlaybackQueueChanged: ([Track]) -> Void = { _ in }
164
+ public var onPlaybackRepeatModeChanged: (RepeatModeChangedEvent) -> Void = { _ in }
165
+ public var onPlaybackShuffleModeChanged: (Bool) -> Void = { _ in }
166
+ public var onSleepTimerChanged: (SleepTimer?) -> Void = { _ in }
167
+ public var onPlaybackChanged: (Playback) -> Void = { _ in }
168
+
169
+ // MARK: - Remote Callbacks
170
+
171
+ public var onRemoteBookmark: () -> Void = {}
172
+ public var onRemoteDislike: () -> Void = {}
173
+ public var onRemoteJumpBackward: (RemoteJumpBackwardEvent) -> Void = { _ in }
174
+ public var onRemoteJumpForward: (RemoteJumpForwardEvent) -> Void = { _ in }
175
+ public var onRemoteLike: () -> Void = {}
176
+ public var onRemoteNext: () -> Void = {}
177
+ public var onRemotePause: () -> Void = {}
178
+ public var onRemotePlay: () -> Void = {}
179
+ public var onRemotePlayId: (RemotePlayIdEvent) -> Void = { _ in }
180
+ public var onRemotePlaySearch: (RemotePlaySearchEvent) -> Void = { _ in }
181
+ public var onRemotePrevious: () -> Void = {}
182
+ public var onRemoteSeek: (RemoteSeekEvent) -> Void = { _ in }
183
+ public var onRemoteSetRating: (RemoteSetRatingEvent) -> Void = { _ in }
184
+ public var onRemoteSkip: (RemoteSkipEvent) -> Void = { _ in }
185
+ public var onRemoteStop: () -> Void = {}
186
+
187
+ // MARK: - Remote Handlers (optional overrides from JS)
188
+
189
+ public var handleRemoteBookmark: (() -> Void)?
190
+ public var handleRemoteDislike: (() -> Void)?
191
+ public var handleRemoteJumpBackward: ((RemoteJumpBackwardEvent) -> Void)?
192
+ public var handleRemoteJumpForward: ((RemoteJumpForwardEvent) -> Void)?
193
+ public var handleRemoteLike: (() -> Void)?
194
+ public var handleRemoteNext: (() -> Void)?
195
+ public var handleRemotePause: (() -> Void)?
196
+ public var handleRemotePlay: (() -> Void)?
197
+ public var handleRemotePlayId: ((RemotePlayIdEvent) -> Void)?
198
+ public var handleRemotePlaySearch: ((RemotePlaySearchEvent) -> Void)?
199
+ public var handleRemotePrevious: (() -> Void)?
200
+ public var handleRemoteSeek: ((RemoteSeekEvent) -> Void)?
201
+ public var handleRemoteSkip: (() -> Void)?
202
+ public var handleRemoteStop: (() -> Void)?
203
+
204
+ // MARK: - Other Callbacks
205
+
206
+ public var onOptionsChanged: (Options) -> Void = { _ in }
207
+ public var onFavoriteChanged: (FavoriteChangedEvent) -> Void = { _ in }
208
+ public var onNowPlayingChanged: (NowPlayingMetadata) -> Void = { _ in }
209
+ public var onOnlineChanged: (Bool) -> Void = { _ in } {
210
+ didSet {
211
+ networkMonitor.onChanged = { [weak self] isOnline in
212
+ self?.onOnlineChanged(isOnline)
213
+ }
214
+ // Immediately notify current state
215
+ onOnlineChanged(networkMonitor.isOnline)
216
+ }
217
+ }
218
+
219
+ public var onEqualizerChanged: (EqualizerSettings) -> Void = { _ in }
220
+ public var onBatteryWarningPendingChanged: (BatteryWarningPendingChangedEvent) -> Void = { _ in }
221
+ public var onBatteryOptimizationStatusChanged: (BatteryOptimizationStatusChangedEvent) -> Void = { _ in }
222
+ public var onSystemVolumeChanged: (Double) -> Void = { _ in } {
223
+ didSet {
224
+ setupVolumeObserver()
225
+ }
226
+ }
227
+
228
+ public var onIosOutputChanged: (IosOutput) -> Void = { _ in } {
229
+ didSet {
230
+ setupRouteChangeObserver()
231
+ }
232
+ }
233
+
234
+ // MARK: - Initialization
235
+
236
+ override public init() {
237
+ trackSelector = TrackSelector(browserManager: browserManager)
238
+ super.init()
239
+
240
+ // Clean up the previous instance (e.g., on JS runtime reload).
241
+ // The old HybridAudioBrowser may still be retained by the global
242
+ // playerAndConfiguredBrowser OnceValue, so we must explicitly stop
243
+ // its player to prevent two audio streams running simultaneously.
244
+ onMainActor {
245
+ HybridAudioBrowser.shared?.player?.destroy()
246
+ playerAndConfiguredBrowser.reset()
247
+ HybridAudioBrowser.shared = self
248
+ }
249
+ setupEmitterToNitroForwarding()
250
+ setupBrowserCallbacks()
251
+ }
252
+
253
+ deinit {
254
+ // Safety net: ensure the AVPlayer is stopped if this instance is deallocated.
255
+ let player = self.player
256
+ if Thread.isMainThread {
257
+ MainActor.assumeIsolated { player?.destroy() }
258
+ } else {
259
+ DispatchQueue.main.async { MainActor.assumeIsolated { player?.destroy() } }
260
+ }
261
+ }
262
+
263
+ /// Returns the TrackPlayer instance, if setup has been called.
264
+ func getPlayer() -> TrackPlayer? {
265
+ player
266
+ }
267
+
268
+ /// Sets up automatic forwarding from emitters to Nitro callbacks
269
+ private func setupEmitterToNitroForwarding() {
270
+ tabsChangedEmitter.addListener { [weak self] tabs in
271
+ self?.onTabsChanged(tabs)
272
+ }
273
+
274
+ contentChangedEmitter.addListener { [weak self] content in
275
+ self?.onContentChanged(content)
276
+ }
277
+
278
+ favoriteChangedEmitter.addListener { [weak self] event in
279
+ self?.onFavoriteChanged(event)
280
+ }
281
+
282
+ activeTrackChangedEmitter.addListener { [weak self] event in
283
+ self?.onPlaybackActiveTrackChanged(event)
284
+ }
285
+
286
+ queueChangedEmitter.addListener { [weak self] tracks in
287
+ self?.onPlaybackQueueChanged(tracks)
288
+ }
289
+
290
+ navigationErrorEmitter.addListener { [weak self] event in
291
+ self?.onNavigationError(event)
292
+ }
293
+
294
+ repeatModeChangedEmitter.addListener { [weak self] event in
295
+ self?.onPlaybackRepeatModeChanged(event)
296
+ }
297
+ }
298
+
299
+ private func setupBrowserCallbacks() {
300
+ onMainActor {
301
+ browserManager.onPathChanged = { [weak self] path in
302
+ self?.onPathChanged(path)
303
+ }
304
+ browserManager.onContentChanged = { [weak self] content in
305
+ self?.contentChangedEmitter.emit(content)
306
+ }
307
+ browserManager.onTabsChanged = { [weak self] tabs in
308
+ self?.tabsChangedEmitter.emit(tabs)
309
+ }
310
+ }
311
+ }
312
+
313
+ private func handleNavigationError(_ error: Error, path: String) {
314
+ let navError = NavigationError.from(error)
315
+
316
+ lastNavigationError = navError
317
+
318
+ // Format the error (async if using JS callback, sync for defaults)
319
+ let defaultFormatted = navError.defaultFormatted()
320
+ if let formatter = onMainActor({ browserManager.config.formatNavigationError }) {
321
+ let params = FormatNavigationErrorParams(error: navError, defaultFormatted: defaultFormatted, path: path)
322
+ // Dispatch to main thread for the Nitro bridge call to avoid C++ noexcept crashes
323
+ DispatchQueue.main.async { [weak self] in
324
+ formatter(params)
325
+ .then { customDisplay in
326
+ self?.lastFormattedNavigationError = customDisplay ?? defaultFormatted
327
+ }
328
+ .catch { _ in
329
+ self?.lastFormattedNavigationError = defaultFormatted
330
+ }
331
+ }
332
+ } else {
333
+ lastFormattedNavigationError = defaultFormatted
334
+ }
335
+ }
336
+
337
+ // MARK: - Browser Methods
338
+
339
+ public func navigatePath(path: String) throws {
340
+ // Clear error synchronously before starting navigation (didSet notifies JS)
341
+ lastNavigationError = nil
342
+ lastFormattedNavigationError = nil
343
+ Task {
344
+ do {
345
+ try await browserManager.navigate(path)
346
+ } catch {
347
+ handleNavigationError(error, path: path)
348
+ }
349
+ }
350
+ }
351
+
352
+ public func navigateTrack(track: Track) throws {
353
+ Task {
354
+ guard let player else { return }
355
+ let result = await trackSelector.select(track: track, player: player)
356
+ switch result {
357
+ case .play(let intent):
358
+ executePlayback(intent)
359
+ case .intercepted:
360
+ break
361
+ case .browse(let url):
362
+ navigateToBrowsableUrl(url)
363
+ case .none:
364
+ break
365
+ }
366
+ }
367
+ }
368
+
369
+ private func executePlayback(_ intent: TrackSelector.PlaybackIntent) {
370
+ onMainActor {
371
+ switch intent {
372
+ case .skipTo(let index):
373
+ do {
374
+ try player?.skipTo(index, playWhenReady: true)
375
+ } catch {
376
+ logger.error("Failed to skip to track at index \(index): \(error)")
377
+ }
378
+ case .setQueue(let tracks, let startIndex, let sourcePath):
379
+ player?.setQueue(tracks, initialIndex: startIndex, playWhenReady: true, sourcePath: sourcePath)
380
+ case .loadTrack(let track):
381
+ player?.load(track, playWhenReady: true)
382
+ }
383
+ }
384
+ }
385
+
386
+ private func navigateToBrowsableUrl(_ url: String) {
387
+ // Clear error synchronously before starting navigation (didSet notifies JS)
388
+ lastNavigationError = nil
389
+ lastFormattedNavigationError = nil
390
+ Task {
391
+ do {
392
+ try await browserManager.navigate(url)
393
+ } catch {
394
+ handleNavigationError(error, path: url)
395
+ }
396
+ }
397
+ }
398
+
399
+ public func onSearch(query: String) throws -> Promise<[Track]> {
400
+ Promise.async { [weak self] in
401
+ guard let self else { return [] }
402
+ let resolved = try await browserManager.search(query)
403
+ return resolved.children ?? []
404
+ }
405
+ }
406
+
407
+ public func getContent() throws -> ResolvedTrack? {
408
+ onMainActor { browserManager.getContent() }
409
+ }
410
+
411
+ public func getNavigationError() throws -> NavigationError? {
412
+ lastNavigationError
413
+ }
414
+
415
+ public func getFormattedNavigationError() throws -> FormattedNavigationError? {
416
+ lastFormattedNavigationError
417
+ }
418
+
419
+ public func notifyContentChanged(path: String) throws {
420
+ onMainActor { browserManager.invalidateContentCache(path) }
421
+
422
+ // Notify external controllers (CarPlay) that content changed
423
+ externalContentChangedEmitter.emit(path)
424
+
425
+ // Re-resolve the path if it's the current browser path
426
+ if onMainActor({ browserManager.getPath() }) == path {
427
+ Task {
428
+ do {
429
+ try await browserManager.navigate(path)
430
+ } catch {
431
+ handleNavigationError(error, path: path)
432
+ }
433
+ }
434
+ }
435
+ }
436
+
437
+ public func setFavorites(favorites: [String]) throws {
438
+ onMainActor { browserManager.setFavorites(favorites) }
439
+ }
440
+
441
+ // MARK: - Player Setup
442
+
443
+ public func setupPlayer(options: PartialSetupPlayerOptions) throws -> Promise<Void> {
444
+ Promise.async {
445
+ // Configure audio session
446
+ let session = AVAudioSession.sharedInstance()
447
+ try session.setCategory(.playback, mode: .default)
448
+ try session.setActive(true)
449
+
450
+ // Create player and configure on main actor
451
+ await MainActor.run { [weak self] in
452
+ guard let self else { return }
453
+
454
+ // Create player with self as callbacks delegate
455
+ player = TrackPlayer(callbacks: self)
456
+
457
+ // Apply buffer duration from options (in ms)
458
+ if let buffer = options.ios?.buffer {
459
+ player?.bufferDuration = buffer
460
+ }
461
+
462
+ // Apply retry configuration (top-level, cross-platform)
463
+ if let retry = options.retry {
464
+ player?.retryConfig = retry
465
+ }
466
+
467
+ // Wire up network monitor for accelerated retries when connectivity is restored
468
+ player?.networkMonitor = networkMonitor
469
+
470
+ // Configure media URL resolver
471
+ player?.mediaLoader.mediaUrlResolver = { [weak self] src in
472
+ guard let self else {
473
+ return MediaResolvedUrl(url: src, headers: nil, userAgent: nil)
474
+ }
475
+ return await browserManager.resolveMediaUrl(src)
476
+ }
477
+
478
+ // Configure artwork URL resolver for Now Playing (with size context)
479
+ player?.nowPlayingUpdater.artworkUrlResolver = { [weak self] track, imageContext in
480
+ guard let self else { return nil }
481
+ return await browserManager.resolveArtworkUrl(track: track, perRouteConfig: nil, imageContext: imageContext)
482
+ }
483
+
484
+ // Configure sleep timer callback
485
+ player?.sleepTimerManager.onChanged = { [weak self] state in
486
+ self?.onSleepTimerChanged(state)
487
+ }
488
+
489
+ // Apply default remote commands (play, pause, next, previous, seekTo)
490
+ applyRemoteCommands()
491
+
492
+ // Notify listeners that player is ready (e.g., CarPlay)
493
+ playerAndConfiguredBrowser.check()
494
+ }
495
+ }
496
+ }
497
+
498
+ public func updateOptions(options: NativeUpdateOptions) {
499
+ onMainActor {
500
+ let previousInterval = playerOptions.progressUpdateEventInterval
501
+
502
+ // Update stored options
503
+ playerOptions.update(from: options)
504
+
505
+ // Apply remote commands to player
506
+ applyRemoteCommands()
507
+
508
+ // Apply progress update interval if changed
509
+ if playerOptions.progressUpdateEventInterval != previousInterval {
510
+ player?.setProgressUpdateInterval(playerOptions.progressUpdateEventInterval)
511
+ }
512
+ }
513
+ }
514
+
515
+ /// Converts capabilities to remote commands and applies them to the player
516
+ @MainActor
517
+ private func applyRemoteCommands() {
518
+ guard let player else { return }
519
+
520
+ let remoteCommands = playerOptions.capabilities.buildRemoteCommands(
521
+ forwardJumpInterval: NSNumber(value: playerOptions.forwardJumpInterval),
522
+ backwardJumpInterval: NSNumber(value: playerOptions.backwardJumpInterval),
523
+ playbackRates: playerOptions.playbackRates,
524
+ )
525
+
526
+ player.remoteCommands = remoteCommands
527
+ }
528
+
529
+ public func getOptions() throws -> UpdateOptions {
530
+ playerOptions.toUpdateOptions()
531
+ }
532
+
533
+ // MARK: - Playback Control
534
+
535
+ public func load(track: Track) throws {
536
+ try onMainActor {
537
+ guard let player else {
538
+ throw NSError(domain: "AudioBrowser", code: 1, userInfo: [NSLocalizedDescriptionKey: "Player not initialized"])
539
+ }
540
+ player.load(track)
541
+ }
542
+ }
543
+
544
+ public func reset() throws {
545
+ onMainActor { player?.clear() }
546
+ }
547
+
548
+ public func play() throws {
549
+ onMainActor { player?.play() }
550
+ }
551
+
552
+ public func pause() throws {
553
+ onMainActor { player?.pause() }
554
+ }
555
+
556
+ public func togglePlayback() throws {
557
+ onMainActor { player?.togglePlayback() }
558
+ }
559
+
560
+ public func stop() throws {
561
+ onMainActor { player?.stop() }
562
+ }
563
+
564
+ public func setPlayWhenReady(playWhenReady: Bool) throws {
565
+ onMainActor { player?.playWhenReady = playWhenReady }
566
+ }
567
+
568
+ public func getPlayWhenReady() throws -> Bool {
569
+ onMainActor { player?.playWhenReady ?? false }
570
+ }
571
+
572
+ public func seekTo(position: Double) throws {
573
+ onMainActor { player?.seekTo(position) }
574
+ }
575
+
576
+ public func seekBy(offset: Double) throws {
577
+ onMainActor { player?.seekBy(offset) }
578
+ }
579
+
580
+ public func setVolume(level: Double) throws {
581
+ onMainActor { player?.volume = Float(level) }
582
+ }
583
+
584
+ public func getVolume() throws -> Double {
585
+ onMainActor { Double(player?.volume ?? 1.0) }
586
+ }
587
+
588
+ public func setRate(rate: Double) throws {
589
+ onMainActor { player?.rate = Float(rate) }
590
+ }
591
+
592
+ public func getRate() throws -> Double {
593
+ onMainActor { Double(player?.rate ?? 1.0) }
594
+ }
595
+
596
+ public func getProgress() throws -> Progress {
597
+ onMainActor {
598
+ Progress(
599
+ position: player?.currentTime ?? 0,
600
+ duration: player?.duration ?? 0,
601
+ buffered: player?.bufferedPosition ?? 0,
602
+ )
603
+ }
604
+ }
605
+
606
+ public func getPlayback() throws -> Playback {
607
+ onMainActor { player?.getPlayback() ?? Playback(state: .none, error: nil) }
608
+ }
609
+
610
+ public func getPlayingState() throws -> PlayingState {
611
+ onMainActor {
612
+ player?.playingStateManager.toPlayingState() ?? PlayingState(playing: false, buffering: false)
613
+ }
614
+ }
615
+
616
+ public func getRepeatMode() throws -> RepeatMode {
617
+ onMainActor { player?.repeatMode ?? .off }
618
+ }
619
+
620
+ public func setRepeatMode(mode: RepeatMode) throws {
621
+ onMainActor { player?.repeatMode = mode }
622
+ }
623
+
624
+ public func getShuffleEnabled() throws -> Bool {
625
+ onMainActor { player?.shuffleEnabled ?? false }
626
+ }
627
+
628
+ public func setShuffleEnabled(enabled: Bool) throws {
629
+ onMainActor { player?.shuffleEnabled = enabled }
630
+ }
631
+
632
+ public func getPlaybackError() throws -> PlaybackError? {
633
+ onMainActor { player?.playbackError?.toNitroError() }
634
+ }
635
+
636
+ public func retry() throws {
637
+ onMainActor { player?.reload(startFromCurrentTime: true) }
638
+ }
639
+
640
+ // MARK: - Sleep Timer
641
+
642
+ public func getSleepTimer() throws -> SleepTimer {
643
+ onMainActor {
644
+ if let state = player?.sleepTimerManager.get() {
645
+ return state
646
+ }
647
+ return .first(NullType.null)
648
+ }
649
+ }
650
+
651
+ public func setSleepTimer(seconds: Double) throws {
652
+ onMainActor {
653
+ player?.sleepTimerManager.set(seconds: seconds)
654
+ }
655
+ }
656
+
657
+ public func setSleepTimerToEndOfTrack() throws {
658
+ onMainActor {
659
+ player?.sleepTimerManager.setToEndOfTrack()
660
+ }
661
+ }
662
+
663
+ public func clearSleepTimer() throws -> Bool {
664
+ onMainActor {
665
+ player?.sleepTimerManager.clear() ?? false
666
+ }
667
+ }
668
+
669
+ // MARK: - Queue Management
670
+
671
+ public func add(tracks: [Track], insertBeforeIndex: Double?) throws {
672
+ try onMainActor {
673
+ guard let player else { return }
674
+ if let index = insertBeforeIndex {
675
+ try player.add(tracks, at: Int(index))
676
+ } else {
677
+ player.add(tracks)
678
+ }
679
+ }
680
+ }
681
+
682
+ public func move(fromIndex: Double, toIndex: Double) throws {
683
+ try onMainActor {
684
+ try player?.move(fromIndex: Int(fromIndex), toIndex: Int(toIndex))
685
+ }
686
+ }
687
+
688
+ public func remove(indexes: [Double]) throws {
689
+ try onMainActor {
690
+ guard let player else { return }
691
+ // Remove in reverse order to maintain index validity
692
+ for index in indexes.sorted().reversed() {
693
+ try player.remove(Int(index))
694
+ }
695
+ }
696
+ }
697
+
698
+ public func removeUpcomingTracks() throws {
699
+ onMainActor { player?.removeUpcomingTracks() }
700
+ }
701
+
702
+ public func skip(index: Double, initialPosition: Double?) throws {
703
+ try onMainActor {
704
+ try player?.skipTo(Int(index))
705
+ if let position = initialPosition {
706
+ player?.seekTo(position)
707
+ }
708
+ }
709
+ }
710
+
711
+ public func skipToNext(initialPosition: Double?) throws {
712
+ onMainActor {
713
+ player?.next()
714
+ if let position = initialPosition {
715
+ player?.seekTo(position)
716
+ }
717
+ }
718
+ }
719
+
720
+ public func skipToPrevious(initialPosition: Double?) throws {
721
+ onMainActor {
722
+ player?.previous()
723
+ if let position = initialPosition {
724
+ player?.seekTo(position)
725
+ }
726
+ }
727
+ }
728
+
729
+ public func setActiveTrackFavorited(favorited: Bool) throws {
730
+ onMainActor {
731
+ guard let track = player?.currentTrack, let src = track.src else { return }
732
+ guard let index = player?.currentIndex, index >= 0 else { return }
733
+ browserManager.updateFavorite(id: src, favorited: favorited)
734
+ // Create updated track with new favorited state
735
+ let updatedTrack = track.copying(favorited: favorited)
736
+ // Update the track in the player's queue so getActiveTrack() returns correct state
737
+ player?.replace(index, updatedTrack)
738
+ favoriteChangedEmitter.emit(FavoriteChangedEvent(track: updatedTrack, favorited: favorited))
739
+ // Fire active track changed so useActiveTrack() hook updates UI
740
+ let position = player?.currentTime ?? 0
741
+ activeTrackChangedEmitter.emit(PlaybackActiveTrackChangedEvent(
742
+ lastIndex: Double(index),
743
+ lastTrack: track,
744
+ lastPosition: position,
745
+ index: Double(index),
746
+ track: updatedTrack,
747
+ ))
748
+ }
749
+ }
750
+
751
+ public func toggleActiveTrackFavorited() throws {
752
+ onMainActor {
753
+ guard let track = player?.currentTrack, let src = track.src else { return }
754
+ // Check current favorited state from cache
755
+ let currentTrack = browserManager.getCachedTrack(src)
756
+ let isFavorited = currentTrack?.favorited ?? track.favorited ?? false
757
+ try? setActiveTrackFavorited(favorited: !isFavorited)
758
+ }
759
+ }
760
+
761
+ public func setQueue(tracks: [Track], startIndex: Double?, startPositionMs: Double?) throws {
762
+ try onMainActor {
763
+ guard let player else { return }
764
+ player.clear()
765
+ player.add(tracks)
766
+ if let index = startIndex, index >= 0 {
767
+ try player.skipTo(Int(index))
768
+ }
769
+ if let position = startPositionMs {
770
+ player.seekTo(position / 1000.0)
771
+ }
772
+ }
773
+ }
774
+
775
+ public func getQueue() throws -> [Track] {
776
+ onMainActor { player?.tracks ?? [] }
777
+ }
778
+
779
+ public func getTrack(index: Double) throws -> Track? {
780
+ onMainActor {
781
+ guard let tracks = player?.tracks else { return nil }
782
+ let i = Int(index)
783
+ guard i >= 0, i < tracks.count else { return nil }
784
+ return tracks[i]
785
+ }
786
+ }
787
+
788
+ public func getActiveTrackIndex() throws -> Double? {
789
+ onMainActor {
790
+ guard let index = player?.currentIndex, index >= 0 else { return nil }
791
+ return Double(index)
792
+ }
793
+ }
794
+
795
+ public func getActiveTrack() throws -> Track? {
796
+ onMainActor { player?.currentTrack }
797
+ }
798
+
799
+ // MARK: - Now Playing
800
+
801
+ public func updateNowPlaying(update: NowPlayingUpdate?) throws {
802
+ onMainActor {
803
+ nowPlayingOverride = update
804
+ applyNowPlayingMetadata()
805
+ }
806
+ }
807
+
808
+ public func getNowPlaying() throws -> NowPlayingMetadata? {
809
+ onMainActor {
810
+ guard let track = player?.currentTrack else { return nil }
811
+ let override = nowPlayingOverride
812
+ return NowPlayingMetadata(
813
+ elapsedTime: player?.currentTime,
814
+ title: override?.title ?? track.title,
815
+ album: track.album,
816
+ artist: override?.artist ?? track.artist,
817
+ duration: track.duration,
818
+ artwork: nowPlayingArtwork(for: track),
819
+ description: track.description,
820
+ mediaId: track.src ?? track.url,
821
+ genre: track.genre,
822
+ rating: nil,
823
+ )
824
+ }
825
+ }
826
+
827
+ /// Returns the artwork URI suitable for JS consumption.
828
+ /// Prefers the resolved artworkSource URI (e.g. file:// for rendered SF Symbols).
829
+ /// Falls back to the raw artwork string only if it's not an SF Symbol (which JS can't load).
830
+ private func nowPlayingArtwork(for track: Track) -> String? {
831
+ if let uri = track.artworkSource?.uri { return uri }
832
+ guard let artwork = track.artwork else { return nil }
833
+ return SFSymbolRenderer.isSFSymbol(artwork) ? nil : artwork
834
+ }
835
+
836
+ /// Applies the current now playing metadata (with override if set) to NowPlayingInfoCenter and notifies JS.
837
+ @MainActor
838
+ private func applyNowPlayingMetadata() {
839
+ guard let track = player?.currentTrack else { return }
840
+ let override = nowPlayingOverride
841
+
842
+ let nowPlaying = NowPlayingMetadata(
843
+ elapsedTime: player?.currentTime,
844
+ title: override?.title ?? track.title,
845
+ album: track.album,
846
+ artist: override?.artist ?? track.artist,
847
+ duration: track.duration,
848
+ artwork: nowPlayingArtwork(for: track),
849
+ description: track.description,
850
+ mediaId: track.src ?? track.url,
851
+ genre: track.genre,
852
+ rating: nil,
853
+ )
854
+
855
+ // Update NowPlayingInfoCenter with override values
856
+ if let override {
857
+ player?.nowPlayingInfoController.set(keyValue: MediaItemProperty.title(override.title ?? track.title))
858
+ player?.nowPlayingInfoController.set(keyValue: MediaItemProperty.artist(override.artist ?? track.artist))
859
+ }
860
+
861
+ onNowPlayingChanged(nowPlaying)
862
+ }
863
+
864
+ // MARK: - Network
865
+
866
+ public func getOnline() throws -> Bool {
867
+ networkMonitor.getOnline()
868
+ }
869
+
870
+ // MARK: - System Volume
871
+
872
+ /// Sets up KVO observer for system volume changes
873
+ private func setupVolumeObserver() {
874
+ // Remove existing observation if any
875
+ volumeObservation?.invalidate()
876
+
877
+ let audioSession = AVAudioSession.sharedInstance()
878
+ volumeObservation = audioSession.observe(\.outputVolume, options: [.new]) { [weak self] _, change in
879
+ guard let newVolume = change.newValue else { return }
880
+ self?.onSystemVolumeChanged(Double(newVolume))
881
+ }
882
+ }
883
+
884
+ public func getSystemVolume() throws -> Double {
885
+ Double(AVAudioSession.sharedInstance().outputVolume)
886
+ }
887
+
888
+ public func setSystemVolume(volume _: Double) throws {
889
+ // iOS doesn't provide a public API to set system volume programmatically.
890
+ // Users must adjust volume via hardware buttons or Control Center.
891
+ logger.debug("setSystemVolume is not supported on iOS - volume must be adjusted via hardware buttons or Control Center")
892
+ }
893
+
894
+ // MARK: - External Audio Output
895
+
896
+ /// Sets up observer for audio route changes
897
+ private func setupRouteChangeObserver() {
898
+ if let observer = routeChangeObserver {
899
+ NotificationCenter.default.removeObserver(observer)
900
+ }
901
+
902
+ routeChangeObserver = NotificationCenter.default.addObserver(
903
+ forName: AVAudioSession.routeChangeNotification,
904
+ object: nil,
905
+ queue: .main,
906
+ ) { [weak self] _ in
907
+ guard let self, let output = self.getCurrentOutput() else { return }
908
+ self.onIosOutputChanged(output)
909
+ }
910
+ }
911
+
912
+ /// Gets the current audio output info
913
+ private func getCurrentOutput() -> IosOutput? {
914
+ let session = AVAudioSession.sharedInstance()
915
+ guard let output = session.currentRoute.outputs.first else { return nil }
916
+
917
+ let (outputType, external): (IosOutputType, Bool) = switch output.portType {
918
+ case .builtInSpeaker:
919
+ (.builtInSpeaker, false)
920
+ case .builtInReceiver:
921
+ (.builtInReceiver, false)
922
+ case .airPlay:
923
+ (.airplay, true)
924
+ case .bluetoothA2DP:
925
+ (.bluetoothA2dp, true)
926
+ case .bluetoothHFP:
927
+ (.bluetoothHfp, true)
928
+ case .bluetoothLE:
929
+ (.bluetoothLe, true)
930
+ case .headphones:
931
+ (.headphones, true)
932
+ case .carAudio:
933
+ (.carAudio, true)
934
+ case .HDMI:
935
+ (.hdmi, true)
936
+ case .usbAudio:
937
+ (.usbAudio, true)
938
+ default:
939
+ (.other, true)
940
+ }
941
+
942
+ return IosOutput(type: outputType, name: output.portName, external: external)
943
+ }
944
+
945
+ public func getIosOutput() throws -> IosOutput? {
946
+ getCurrentOutput()
947
+ }
948
+
949
+ public func openIosOutputPicker() throws {
950
+ DispatchQueue.main.async { [weak self] in
951
+ guard let windowScene = UIApplication.shared.connectedScenes
952
+ .compactMap({ $0 as? UIWindowScene })
953
+ .first(where: { $0.activationState == .foregroundActive }),
954
+ let window = windowScene.windows.first(where: { $0.isKeyWindow }),
955
+ var topController = window.rootViewController
956
+ else {
957
+ self?.logger.debug("openIosOutputPicker: Could not find active window scene")
958
+ return
959
+ }
960
+
961
+ // Walk up to the topmost presented view controller
962
+ while let presented = topController.presentedViewController {
963
+ topController = presented
964
+ }
965
+
966
+ let routePicker = AVRoutePickerView(frame: .zero)
967
+ routePicker.isHidden = true
968
+ topController.view.addSubview(routePicker)
969
+
970
+ // Find the button inside AVRoutePickerView and trigger it
971
+ for subview in routePicker.subviews {
972
+ if let button = subview as? UIButton {
973
+ button.sendActions(for: .touchUpInside)
974
+ break
975
+ }
976
+ }
977
+
978
+ // Remove after a delay to ensure picker has opened
979
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
980
+ routePicker.removeFromSuperview()
981
+ }
982
+ }
983
+ }
984
+
985
+ // MARK: - Equalizer (unsupported on iOS)
986
+
987
+ public func getEqualizerSettings() throws -> EqualizerSettings? {
988
+ // No-op: equalizer unsupported on iOS
989
+ nil
990
+ }
991
+
992
+ public func setEqualizerEnabled(enabled _: Bool) throws {
993
+ // No-op: equalizer unsupported on iOS
994
+ }
995
+
996
+ public func setEqualizerPreset(preset _: String) throws {
997
+ // No-op: equalizer unsupported on iOS
998
+ }
999
+
1000
+ public func setEqualizerLevels(levels _: [Double]) throws {
1001
+ // No-op: equalizer unsupported on iOS
1002
+ }
1003
+
1004
+ // MARK: - Battery (Android-only, stub implementations)
1005
+
1006
+ public func getBatteryWarningPending() throws -> Bool {
1007
+ false
1008
+ }
1009
+
1010
+ public func getBatteryOptimizationStatus() throws -> BatteryOptimizationStatus {
1011
+ // iOS doesn't have battery optimization restrictions like Android
1012
+ .unrestricted
1013
+ }
1014
+
1015
+ public func dismissBatteryWarning() throws {
1016
+ // No-op on iOS
1017
+ }
1018
+
1019
+ public func openBatterySettings() throws {
1020
+ // No-op on iOS
1021
+ }
1022
+ }
1023
+
1024
+ // MARK: - TrackPlayerCallbacks
1025
+
1026
+ extension HybridAudioBrowser: TrackPlayerCallbacks {
1027
+ public func playerDidChangePlayback(_ playback: Playback) {
1028
+ onPlaybackChanged(playback)
1029
+ }
1030
+
1031
+ public func playerDidChangeActiveTrack(_ event: PlaybackActiveTrackChangedEvent) {
1032
+ // Clear now playing override when track changes (matches Kotlin behavior)
1033
+ nowPlayingOverride = nil
1034
+ activeTrackChangedEmitter.emit(event)
1035
+ // Also notify now playing changed when track changes
1036
+ applyNowPlayingMetadata()
1037
+ }
1038
+
1039
+ public func playerDidUpdateProgress(_ event: PlaybackProgressUpdatedEvent) {
1040
+ onPlaybackProgressUpdated(event)
1041
+ }
1042
+
1043
+ public func playerDidChangePlayWhenReady(_ playWhenReady: Bool) {
1044
+ onPlaybackPlayWhenReadyChanged(PlaybackPlayWhenReadyChangedEvent(playWhenReady: playWhenReady))
1045
+ }
1046
+
1047
+ public func playerDidChangePlayingState(_ state: PlayingState) {
1048
+ onPlaybackPlayingState(state)
1049
+ }
1050
+
1051
+ public func playerDidEndQueue(_ event: PlaybackQueueEndedEvent) {
1052
+ onPlaybackQueueEnded(event)
1053
+ }
1054
+
1055
+ public func playerDidChangeQueue(_ tracks: [Track]) {
1056
+ queueChangedEmitter.emit(tracks)
1057
+ }
1058
+
1059
+ public func playerDidChangeRepeatMode(_ event: RepeatModeChangedEvent) {
1060
+ repeatModeChangedEmitter.emit(event)
1061
+ }
1062
+
1063
+ public func playerDidChangeShuffleEnabled(_ enabled: Bool) {
1064
+ onPlaybackShuffleModeChanged(enabled)
1065
+ }
1066
+
1067
+ public func playerDidError(_ event: PlaybackErrorEvent) {
1068
+ onPlaybackError(event)
1069
+ }
1070
+
1071
+ public func playerDidReceiveCommonMetadata(_ items: [AVMetadataItem]) {
1072
+ let metadata = TrackMetadata.from(items: items)
1073
+ onTrackMetadata(metadata)
1074
+ }
1075
+
1076
+ public func playerDidReceiveTimedMetadata(_ groups: [AVTimedMetadataGroup]) {
1077
+ for group in groups {
1078
+ if let metadata = TimedMetadata.from(items: group.items) {
1079
+ onTimedMetadata(metadata)
1080
+ }
1081
+ }
1082
+ }
1083
+
1084
+ public func playerDidReceiveChapterMetadata(_ groups: [AVTimedMetadataGroup]) {
1085
+ let chapters = ChapterMetadata.from(groups: groups)
1086
+ onChapterMetadata(chapters)
1087
+ }
1088
+
1089
+ public func playerDidCompleteSeek(position _: Double, didFinish _: Bool) {
1090
+ // Not exposed to JS currently
1091
+ }
1092
+
1093
+ public func playerDidUpdateDuration(_: Double) {
1094
+ // Not exposed to JS currently
1095
+ }
1096
+
1097
+ public func remotePlay() {
1098
+ if let handler = handleRemotePlay {
1099
+ handler()
1100
+ } else {
1101
+ // Default behavior: play the player
1102
+ onMainActor { player?.play() }
1103
+ }
1104
+ onRemotePlay()
1105
+ }
1106
+
1107
+ public func remotePause() {
1108
+ if let handler = handleRemotePause {
1109
+ handler()
1110
+ } else {
1111
+ // Default behavior: pause the player
1112
+ onMainActor { player?.pause() }
1113
+ }
1114
+ onRemotePause()
1115
+ }
1116
+
1117
+ public func remoteStop() {
1118
+ if let handler = handleRemoteStop {
1119
+ handler()
1120
+ } else {
1121
+ // Default behavior: stop the player
1122
+ onMainActor { player?.stop() }
1123
+ }
1124
+ onRemoteStop()
1125
+ }
1126
+
1127
+ public func remotePlayPause() {
1128
+ // Toggle based on current state
1129
+ let isPlaying = onMainActor { player?.playWhenReady == true }
1130
+ if isPlaying {
1131
+ remotePause()
1132
+ } else {
1133
+ remotePlay()
1134
+ }
1135
+ }
1136
+
1137
+ public func remoteNext() {
1138
+ if let handler = handleRemoteNext {
1139
+ handler()
1140
+ } else {
1141
+ // Default behavior: skip to next track
1142
+ onMainActor { player?.next() }
1143
+ }
1144
+ onRemoteNext()
1145
+ }
1146
+
1147
+ public func remotePrevious() {
1148
+ if let handler = handleRemotePrevious {
1149
+ handler()
1150
+ } else {
1151
+ // Default behavior: skip to previous track
1152
+ onMainActor { player?.previous() }
1153
+ }
1154
+ onRemotePrevious()
1155
+ }
1156
+
1157
+ public func remoteJumpForward(interval: Double) {
1158
+ let event = RemoteJumpForwardEvent(interval: interval)
1159
+ if let handler = handleRemoteJumpForward {
1160
+ handler(event)
1161
+ } else {
1162
+ // Default behavior: seek forward by interval
1163
+ onMainActor { player?.seekBy(interval) }
1164
+ }
1165
+ onRemoteJumpForward(event)
1166
+ }
1167
+
1168
+ public func remoteJumpBackward(interval: Double) {
1169
+ let event = RemoteJumpBackwardEvent(interval: interval)
1170
+ if let handler = handleRemoteJumpBackward {
1171
+ handler(event)
1172
+ } else {
1173
+ // Default behavior: seek backward by interval
1174
+ onMainActor { player?.seekBy(-interval) }
1175
+ }
1176
+ onRemoteJumpBackward(event)
1177
+ }
1178
+
1179
+ public func remoteSeek(position: Double) {
1180
+ logger.info("remoteSeek called with position: \(position)")
1181
+ let event = RemoteSeekEvent(position: position)
1182
+ if let handler = handleRemoteSeek {
1183
+ handler(event)
1184
+ } else {
1185
+ // Default behavior: seek to position
1186
+ logger.info("remoteSeek: calling player.seekTo(\(position))")
1187
+ onMainActor { player?.seekTo(position) }
1188
+ }
1189
+ onRemoteSeek(event)
1190
+ }
1191
+
1192
+ public func remoteChangePlaybackPosition(position: Double) {
1193
+ remoteSeek(position: position)
1194
+ }
1195
+
1196
+ public func remoteSetRating(rating _: Any) {
1197
+ // TODO: Convert rating to RemoteSetRatingEvent
1198
+ }
1199
+
1200
+ public func remotePlayId(id: String, index: Int?) {
1201
+ let event = RemotePlayIdEvent(id: id, index: index.map { Double($0) })
1202
+ if let handler = handleRemotePlayId {
1203
+ handler(event)
1204
+ } else {
1205
+ onRemotePlayId(event)
1206
+ }
1207
+ }
1208
+
1209
+ public func remotePlaySearch(query: String) {
1210
+ let event = RemotePlaySearchEvent(query: query)
1211
+ if let handler = handleRemotePlaySearch {
1212
+ handler(event)
1213
+ } else {
1214
+ onRemotePlaySearch(event)
1215
+ }
1216
+ }
1217
+
1218
+ /// Handles an INPlayMediaIntent by searching for the given term and starting playback.
1219
+ ///
1220
+ /// Host apps should call this from their `INPlayMediaIntentHandling` implementation.
1221
+ /// Uses the browser's search route to find tracks, then queues and plays them.
1222
+ ///
1223
+ /// - Parameters:
1224
+ /// - searchTerm: The search query from Siri.
1225
+ /// - completion: Called with `true` if tracks were found and queued, `false` otherwise.
1226
+ public func handlePlayMediaIntent(searchTerm: String, completion: @escaping @Sendable (Bool) -> Void) {
1227
+ Task {
1228
+ do {
1229
+ let resolved = try await self.browserManager.search(searchTerm)
1230
+ guard let tracks = resolved.children, !tracks.isEmpty else {
1231
+ completion(false)
1232
+ return
1233
+ }
1234
+ await MainActor.run {
1235
+ self.getPlayer()?.setQueue(tracks, initialIndex: 0, playWhenReady: true)
1236
+ }
1237
+ completion(true)
1238
+ } catch {
1239
+ self.logger.error("handlePlayMediaIntent failed: \(error.localizedDescription)")
1240
+ completion(false)
1241
+ }
1242
+ }
1243
+ }
1244
+
1245
+ public func remoteLike() {
1246
+ if let handler = handleRemoteLike {
1247
+ handler()
1248
+ } else {
1249
+ onRemoteLike()
1250
+ }
1251
+ }
1252
+
1253
+ public func remoteDislike() {
1254
+ if let handler = handleRemoteDislike {
1255
+ handler()
1256
+ } else {
1257
+ onRemoteDislike()
1258
+ }
1259
+ }
1260
+
1261
+ public func remoteBookmark() {
1262
+ if let handler = handleRemoteBookmark {
1263
+ handler()
1264
+ } else {
1265
+ onRemoteBookmark()
1266
+ }
1267
+ }
1268
+
1269
+ public func remoteChangeRepeatMode(mode: RepeatMode) {
1270
+ // Apply the repeat mode change from CarPlay/lock screen
1271
+ try? setRepeatMode(mode: mode)
1272
+ }
1273
+
1274
+ public func remoteChangeShuffleMode(enabled: Bool) {
1275
+ // Apply the shuffle mode change from CarPlay/lock screen
1276
+ try? setShuffleEnabled(enabled: enabled)
1277
+ }
1278
+
1279
+ public func remoteChangePlaybackRate(rate: Float) {
1280
+ // Apply the playback rate change from CarPlay/lock screen
1281
+ onMainActor { player?.rate = rate }
1282
+ }
1283
+
1284
+ func playerDidChangeOptions(_: PlayerUpdateOptions) {
1285
+ // TODO: Convert to Options type
1286
+ }
1287
+ }
1288
+
1289
+ // MARK: - Autolinking Alias
1290
+
1291
+ /// Alias for Nitro autolinking - expects class named "AudioBrowser"
1292
+ public typealias AudioBrowser = HybridAudioBrowser