react-native-audio-browser 0.0.1 → 0.1.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AudioBrowser.podspec +45 -0
- package/LICENSE +21 -0
- package/README.md +3 -1
- package/android/CMakeLists.txt +32 -0
- package/android/build.gradle +214 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +6 -0
- package/android/src/main/AndroidManifest.xml +36 -0
- package/android/src/main/cpp/cpp-adapter.cpp +9 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +1197 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowserPackage.kt +21 -0
- package/android/src/main/java/com/audiobrowser/Callbacks.kt +92 -0
- package/android/src/main/java/com/audiobrowser/HeadlessTaskService.kt +59 -0
- package/android/src/main/java/com/audiobrowser/Service.kt +334 -0
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +1174 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +134 -0
- package/android/src/main/java/com/audiobrowser/browser/RouteMatch.kt +9 -0
- package/android/src/main/java/com/audiobrowser/browser/SimpleRouter.kt +154 -0
- package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +45 -0
- package/android/src/main/java/com/audiobrowser/extension/EnumExtensions.kt +5 -0
- package/android/src/main/java/com/audiobrowser/extension/NumberExt.kt +13 -0
- package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +171 -0
- package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +251 -0
- package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +80 -0
- package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +101 -0
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +125 -0
- package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +256 -0
- package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +162 -0
- package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +117 -0
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +596 -0
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +578 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +59 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +246 -0
- package/android/src/main/java/com/audiobrowser/player/Player.kt +1510 -0
- package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +230 -0
- package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +191 -0
- package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +80 -0
- package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +147 -0
- package/android/src/main/java/com/audiobrowser/util/AndroidAudioContentTypeFactory.kt +17 -0
- package/android/src/main/java/com/audiobrowser/util/BatteryOptimizationHelper.kt +95 -0
- package/android/src/main/java/com/audiobrowser/util/BatteryWarningStore.kt +38 -0
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +155 -0
- package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +390 -0
- package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +197 -0
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +75 -0
- package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +97 -0
- package/android/src/main/java/com/audiobrowser/util/NetworkConnectivityMonitor.kt +121 -0
- package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +25 -0
- package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
- package/android/src/main/java/com/audiobrowser/util/RepeatModeFactory.kt +22 -0
- package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
- package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +130 -0
- package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +50 -0
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +125 -0
- package/android/src/main/res/values/strings.xml +6 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +63 -0
- package/android/src/test/java/com/audiobrowser/browser/SimpleBrowserTest.kt +38 -0
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +165 -0
- package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +240 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +146 -0
- package/android/src/test/resources/robolectric.properties +1 -0
- package/ios/Bridge.h +8 -0
- package/ios/Browser/BrowserConfig.swift +111 -0
- package/ios/Browser/BrowserManager+URLResolution.swift +260 -0
- package/ios/Browser/BrowserManager.swift +630 -0
- package/ios/Browser/BrowserPathHelper.swift +190 -0
- package/ios/Browser/JsonModels.swift +202 -0
- package/ios/Browser/SimpleRouter.swift +184 -0
- package/ios/CarPlay/CarPlayArtworkResolver.swift +107 -0
- package/ios/CarPlay/CarPlayController.swift +771 -0
- package/ios/CarPlay/CarPlayImageLoader.swift +180 -0
- package/ios/CarPlay/CarPlayListItemFactory.swift +209 -0
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +302 -0
- package/ios/CarPlay/RNABAudioBrowser.h +23 -0
- package/ios/CarPlay/RNABAudioBrowser.m +22 -0
- package/ios/CarPlay/RNABCarPlaySceneDelegate.h +15 -0
- package/ios/CarPlay/RNABCarPlaySceneDelegate.m +59 -0
- package/ios/CarPlay/RNABMediaIntentHandler.swift +60 -0
- package/ios/CarPlay/Track+CarPlay.swift +63 -0
- package/ios/Extension/Capability+RemoteCommand.swift +76 -0
- package/ios/Extension/ChapterMetadata+AVFoundation.swift +40 -0
- package/ios/Extension/CxxVectorConformances.swift +20 -0
- package/ios/Extension/NavigationError+Conversion.swift +49 -0
- package/ios/Extension/ResolvedTrack+Copying.swift +59 -0
- package/ios/Extension/TimedMetadata+AVFoundation.swift +129 -0
- package/ios/Extension/Track+AVPlayer.swift +33 -0
- package/ios/Extension/Track+Copying.swift +53 -0
- package/ios/Extension/TrackMetadata+AVFoundation.swift +131 -0
- package/ios/Http/HttpClient.swift +237 -0
- package/ios/HybridAudioBrowser.swift +1292 -0
- package/ios/Model/MediaURL.swift +67 -0
- package/ios/Model/NitroTypeStubs.swift +228 -0
- package/ios/Model/PlayerUpdateOptions.swift +116 -0
- package/ios/Model/RemoteCommand.swift +71 -0
- package/ios/Model/SourceType.swift +6 -0
- package/ios/Model/TrackPlayerError.swift +73 -0
- package/ios/NowPlayingInfo/MediaItemProperty.swift +78 -0
- package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
- package/ios/NowPlayingInfo/NowPlayingInfoController.swift +191 -0
- package/ios/NowPlayingInfo/NowPlayingInfoKeyValue.swift +6 -0
- package/ios/NowPlayingInfo/NowPlayingInfoProperty.swift +220 -0
- package/ios/Observer/PlayerItemNotificationObserver.swift +79 -0
- package/ios/Observer/PlayerItemPropertyObserver.swift +110 -0
- package/ios/Observer/PlayerStateObserver.swift +50 -0
- package/ios/Observer/PlayerTimeObserver.swift +105 -0
- package/ios/Option/PitchAlgorithms.swift +17 -0
- package/ios/Option/SessionCategories.swift +100 -0
- package/ios/Option/TimeEventFrequency.swift +18 -0
- package/ios/PlaybackEvent.swift +15 -0
- package/ios/Player/LoadSeekCoordinator.swift +84 -0
- package/ios/Player/MediaLoader.swift +197 -0
- package/ios/Player/MediaLoaderDelegate.swift +11 -0
- package/ios/Player/NowPlayingUpdater.swift +106 -0
- package/ios/Player/PlaybackCoordinator.swift +520 -0
- package/ios/Player/PlaybackCoordinatorCallbacks.swift +19 -0
- package/ios/Player/PlaybackEffectHandler.swift +44 -0
- package/ios/Player/PlaybackErrorHandler.swift +91 -0
- package/ios/Player/PlaybackProgressUpdateManager.swift +68 -0
- package/ios/Player/PlaybackStateMachine.swift +31 -0
- package/ios/Player/PlayerStatusTypes.swift +9 -0
- package/ios/Player/PlayingStateManager.swift +32 -0
- package/ios/Player/QueueManager.swift +320 -0
- package/ios/Player/RetryManager.swift +246 -0
- package/ios/Player/SeekCompletionHandler.swift +3 -0
- package/ios/Player/ShuffleOrder.swift +191 -0
- package/ios/Player/SleepTimerHandling.swift +7 -0
- package/ios/Player/SleepTimerManager.swift +131 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +406 -0
- package/ios/Support/RNTrackPlayer-Bridging-Header.h +7 -0
- package/ios/Tests/BrowserPathHelperTests.swift +110 -0
- package/ios/Tests/CarPlayArtworkResolverTests.swift +413 -0
- package/ios/Tests/ChapterMetadataAVFoundationTests.swift +88 -0
- package/ios/Tests/EmitterTests.swift +122 -0
- package/ios/Tests/LoadSeekCoordinatorTests.swift +294 -0
- package/ios/Tests/MediaLoaderTests.swift +228 -0
- package/ios/Tests/PlaybackCoordinatorTests.swift +486 -0
- package/ios/Tests/PlaybackErrorHandlerTests.swift +213 -0
- package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +166 -0
- package/ios/Tests/PlaybackStateMachineTests.swift +137 -0
- package/ios/Tests/QueueManagerTests.swift +880 -0
- package/ios/Tests/ResolvedTrackCopyingTests.swift +245 -0
- package/ios/Tests/SimpleRouterTests.swift +139 -0
- package/ios/Tests/Support/TestTypes.swift +180 -0
- package/ios/Tests/TimedMetadataAVFoundationTests.swift +152 -0
- package/ios/Tests/TrackMetadataAVFoundationTests.swift +176 -0
- package/ios/Tests/TrackSelectorTests.swift +268 -0
- package/ios/TrackPlayer.swift +692 -0
- package/ios/TrackPlayerCallbacks.swift +92 -0
- package/ios/TrackSelector.swift +141 -0
- package/ios/Util/ArtworkImageFetcher.swift +35 -0
- package/ios/Util/Emitter.swift +68 -0
- package/ios/Util/LRUCache.swift +182 -0
- package/ios/Util/MetadataAdapter.swift +131 -0
- package/ios/Util/NetworkMonitor.swift +65 -0
- package/ios/Util/OnceValue.swift +70 -0
- package/ios/Util/SFSymbolRenderer.swift +142 -0
- package/ios/Util/SVGProcessor.swift +56 -0
- package/lib/commonjs/AudioBrowser.js +50 -0
- package/lib/commonjs/AudioBrowser.js.map +1 -0
- package/lib/commonjs/features/battery.js +154 -0
- package/lib/commonjs/features/battery.js.map +1 -0
- package/lib/commonjs/features/browser.js +272 -0
- package/lib/commonjs/features/browser.js.map +1 -0
- package/lib/commonjs/features/equalizer.js +69 -0
- package/lib/commonjs/features/equalizer.js.map +1 -0
- package/lib/commonjs/features/errors.js +165 -0
- package/lib/commonjs/features/errors.js.map +1 -0
- package/lib/commonjs/features/favorites.js +101 -0
- package/lib/commonjs/features/favorites.js.map +1 -0
- package/lib/commonjs/features/index.js +160 -0
- package/lib/commonjs/features/index.js.map +1 -0
- package/lib/commonjs/features/metadata.js +54 -0
- package/lib/commonjs/features/metadata.js.map +1 -0
- package/lib/commonjs/features/network.js +40 -0
- package/lib/commonjs/features/network.js.map +1 -0
- package/lib/commonjs/features/nowPlaying.js +61 -0
- package/lib/commonjs/features/nowPlaying.js.map +1 -0
- package/lib/commonjs/features/output.js +54 -0
- package/lib/commonjs/features/output.js.map +1 -0
- package/lib/commonjs/features/playback/controls.js +79 -0
- package/lib/commonjs/features/playback/controls.js.map +1 -0
- package/lib/commonjs/features/playback/index.js +83 -0
- package/lib/commonjs/features/playback/index.js.map +1 -0
- package/lib/commonjs/features/playback/playWhenReady.js +55 -0
- package/lib/commonjs/features/playback/playWhenReady.js.map +1 -0
- package/lib/commonjs/features/playback/playing.js +41 -0
- package/lib/commonjs/features/playback/playing.js.map +1 -0
- package/lib/commonjs/features/playback/progress.js +104 -0
- package/lib/commonjs/features/playback/progress.js.map +1 -0
- package/lib/commonjs/features/playback/rate.js +29 -0
- package/lib/commonjs/features/playback/rate.js.map +1 -0
- package/lib/commonjs/features/playback/state.js +62 -0
- package/lib/commonjs/features/playback/state.js.map +1 -0
- package/lib/commonjs/features/playback/volume.js +68 -0
- package/lib/commonjs/features/playback/volume.js.map +1 -0
- package/lib/commonjs/features/player/index.js +28 -0
- package/lib/commonjs/features/player/index.js.map +1 -0
- package/lib/commonjs/features/player/options.js +182 -0
- package/lib/commonjs/features/player/options.js.map +1 -0
- package/lib/commonjs/features/player/setup.js +143 -0
- package/lib/commonjs/features/player/setup.js.map +1 -0
- package/lib/commonjs/features/queue/activeTrack.js +52 -0
- package/lib/commonjs/features/queue/activeTrack.js.map +1 -0
- package/lib/commonjs/features/queue/index.js +50 -0
- package/lib/commonjs/features/queue/index.js.map +1 -0
- package/lib/commonjs/features/queue/queue.js +177 -0
- package/lib/commonjs/features/queue/queue.js.map +1 -0
- package/lib/commonjs/features/queue/repeatMode.js +58 -0
- package/lib/commonjs/features/queue/repeatMode.js.map +1 -0
- package/lib/commonjs/features/queue/shuffle.js +57 -0
- package/lib/commonjs/features/queue/shuffle.js.map +1 -0
- package/lib/commonjs/features/rating.js +2 -0
- package/lib/commonjs/features/rating.js.map +1 -0
- package/lib/commonjs/features/remoteControls.js +286 -0
- package/lib/commonjs/features/remoteControls.js.map +1 -0
- package/lib/commonjs/features/sleepTimer.js +164 -0
- package/lib/commonjs/features/sleepTimer.js.map +1 -0
- package/lib/commonjs/index.js +22 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/native.js +9 -0
- package/lib/commonjs/native.js.map +1 -0
- package/lib/commonjs/native.web.js +10 -0
- package/lib/commonjs/native.web.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/specs/audio-browser.nitro.js +6 -0
- package/lib/commonjs/specs/audio-browser.nitro.js.map +1 -0
- package/lib/commonjs/types/browser-native.js +6 -0
- package/lib/commonjs/types/browser-native.js.map +1 -0
- package/lib/commonjs/types/browser-nodes.js +6 -0
- package/lib/commonjs/types/browser-nodes.js.map +1 -0
- package/lib/commonjs/types/browser.js +6 -0
- package/lib/commonjs/types/browser.js.map +1 -0
- package/lib/commonjs/types/index.js +28 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/commonjs/types/player.js +2 -0
- package/lib/commonjs/types/player.js.map +1 -0
- package/lib/commonjs/utils/LazyNativeEmitter.js +58 -0
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -0
- package/lib/commonjs/utils/NativeUpdatedValue.js +59 -0
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -0
- package/lib/commonjs/utils/resolveAssetSource.js +11 -0
- package/lib/commonjs/utils/resolveAssetSource.js.map +1 -0
- package/lib/commonjs/utils/useDebug.js +221 -0
- package/lib/commonjs/utils/useDebug.js.map +1 -0
- package/lib/commonjs/utils/useNativeUpdatedValue.js +44 -0
- package/lib/commonjs/utils/useNativeUpdatedValue.js.map +1 -0
- package/lib/commonjs/utils/validation.js +23 -0
- package/lib/commonjs/utils/validation.js.map +1 -0
- package/lib/commonjs/web/NativeAudioBrowser.js +731 -0
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -0
- package/lib/commonjs/web/SimpleRouter.js +146 -0
- package/lib/commonjs/web/SimpleRouter.js.map +1 -0
- package/lib/commonjs/web/SimpleRouter.test.js +174 -0
- package/lib/commonjs/web/SimpleRouter.test.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Event.js +19 -0
- package/lib/commonjs/web/TrackPlayer/Event.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Player.js +301 -0
- package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +293 -0
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js +12 -0
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js +13 -0
- package/lib/commonjs/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js +75 -0
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/State.js +18 -0
- package/lib/commonjs/web/TrackPlayer/State.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/index.js +52 -0
- package/lib/commonjs/web/TrackPlayer/index.js.map +1 -0
- package/lib/commonjs/web/browser/BrowserManager.js +587 -0
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -0
- package/lib/commonjs/web/browser/FavoriteManager.js +80 -0
- package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -0
- package/lib/commonjs/web/browser/NavigationErrorManager.js +106 -0
- package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -0
- package/lib/commonjs/web/browser/SearchManager.js +80 -0
- package/lib/commonjs/web/browser/SearchManager.js.map +1 -0
- package/lib/commonjs/web/http/HttpClient.js +94 -0
- package/lib/commonjs/web/http/HttpClient.js.map +1 -0
- package/lib/commonjs/web/http/RequestConfigBuilder.js +294 -0
- package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -0
- package/lib/commonjs/web/player/NowPlayingManager.js +79 -0
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -0
- package/lib/commonjs/web/player/OptionsManager.js +88 -0
- package/lib/commonjs/web/player/OptionsManager.js.map +1 -0
- package/lib/commonjs/web/util/BrowserPathHelper.js +138 -0
- package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -0
- package/lib/commonjs/web/util/shuffle.js +21 -0
- package/lib/commonjs/web/util/shuffle.js.map +1 -0
- package/lib/module/AudioBrowser.js +7 -0
- package/lib/module/AudioBrowser.js.map +1 -0
- package/lib/module/features/battery.js +144 -0
- package/lib/module/features/battery.js.map +1 -0
- package/lib/module/features/browser.js +258 -0
- package/lib/module/features/browser.js.map +1 -0
- package/lib/module/features/equalizer.js +60 -0
- package/lib/module/features/equalizer.js.map +1 -0
- package/lib/module/features/errors.js +156 -0
- package/lib/module/features/errors.js.map +1 -0
- package/lib/module/features/favorites.js +95 -0
- package/lib/module/features/favorites.js.map +1 -0
- package/lib/module/features/index.js +26 -0
- package/lib/module/features/index.js.map +1 -0
- package/lib/module/features/metadata.js +51 -0
- package/lib/module/features/metadata.js.map +1 -0
- package/lib/module/features/network.js +35 -0
- package/lib/module/features/network.js.map +1 -0
- package/lib/module/features/nowPlaying.js +55 -0
- package/lib/module/features/nowPlaying.js.map +1 -0
- package/lib/module/features/output.js +47 -0
- package/lib/module/features/output.js.map +1 -0
- package/lib/module/features/playback/controls.js +69 -0
- package/lib/module/features/playback/controls.js.map +1 -0
- package/lib/module/features/playback/index.js +10 -0
- package/lib/module/features/playback/index.js.map +1 -0
- package/lib/module/features/playback/playWhenReady.js +49 -0
- package/lib/module/features/playback/playWhenReady.js.map +1 -0
- package/lib/module/features/playback/playing.js +36 -0
- package/lib/module/features/playback/playing.js.map +1 -0
- package/lib/module/features/playback/progress.js +98 -0
- package/lib/module/features/playback/progress.js.map +1 -0
- package/lib/module/features/playback/rate.js +25 -0
- package/lib/module/features/playback/rate.js.map +1 -0
- package/lib/module/features/playback/state.js +57 -0
- package/lib/module/features/playback/state.js.map +1 -0
- package/lib/module/features/playback/volume.js +60 -0
- package/lib/module/features/playback/volume.js.map +1 -0
- package/lib/module/features/player/index.js +5 -0
- package/lib/module/features/player/index.js.map +1 -0
- package/lib/module/features/player/options.js +176 -0
- package/lib/module/features/player/options.js.map +1 -0
- package/lib/module/features/player/setup.js +140 -0
- package/lib/module/features/player/setup.js.map +1 -0
- package/lib/module/features/queue/activeTrack.js +46 -0
- package/lib/module/features/queue/activeTrack.js.map +1 -0
- package/lib/module/features/queue/index.js +7 -0
- package/lib/module/features/queue/index.js.map +1 -0
- package/lib/module/features/queue/queue.js +162 -0
- package/lib/module/features/queue/queue.js.map +1 -0
- package/lib/module/features/queue/repeatMode.js +52 -0
- package/lib/module/features/queue/repeatMode.js.map +1 -0
- package/lib/module/features/queue/shuffle.js +50 -0
- package/lib/module/features/queue/shuffle.js.map +1 -0
- package/lib/module/features/rating.js +2 -0
- package/lib/module/features/rating.js.map +1 -0
- package/lib/module/features/remoteControls.js +275 -0
- package/lib/module/features/remoteControls.js.map +1 -0
- package/lib/module/features/sleepTimer.js +155 -0
- package/lib/module/features/sleepTimer.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native.js +5 -0
- package/lib/module/native.js.map +1 -0
- package/lib/module/native.web.js +7 -0
- package/lib/module/native.web.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/specs/audio-browser.nitro.js +4 -0
- package/lib/module/specs/audio-browser.nitro.js.map +1 -0
- package/lib/module/types/browser-native.js +4 -0
- package/lib/module/types/browser-native.js.map +1 -0
- package/lib/module/types/browser-nodes.js +4 -0
- package/lib/module/types/browser-nodes.js.map +1 -0
- package/lib/module/types/browser.js +4 -0
- package/lib/module/types/browser.js.map +1 -0
- package/lib/module/types/index.js +5 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/types/player.js +2 -0
- package/lib/module/types/player.js.map +1 -0
- package/lib/module/utils/LazyNativeEmitter.js +53 -0
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -0
- package/lib/module/utils/NativeUpdatedValue.js +54 -0
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -0
- package/lib/module/utils/resolveAssetSource.js +7 -0
- package/lib/module/utils/resolveAssetSource.js.map +1 -0
- package/lib/module/utils/useDebug.js +218 -0
- package/lib/module/utils/useDebug.js.map +1 -0
- package/lib/module/utils/useNativeUpdatedValue.js +40 -0
- package/lib/module/utils/useNativeUpdatedValue.js.map +1 -0
- package/lib/module/utils/validation.js +18 -0
- package/lib/module/utils/validation.js.map +1 -0
- package/lib/module/web/NativeAudioBrowser.js +727 -0
- package/lib/module/web/NativeAudioBrowser.js.map +1 -0
- package/lib/module/web/SimpleRouter.js +141 -0
- package/lib/module/web/SimpleRouter.js.map +1 -0
- package/lib/module/web/SimpleRouter.test.js +174 -0
- package/lib/module/web/SimpleRouter.test.js.map +1 -0
- package/lib/module/web/TrackPlayer/Event.js +15 -0
- package/lib/module/web/TrackPlayer/Event.js.map +1 -0
- package/lib/module/web/TrackPlayer/Player.js +296 -0
- package/lib/module/web/TrackPlayer/Player.js.map +1 -0
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js +288 -0
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +1 -0
- package/lib/module/web/TrackPlayer/RepeatMode.js +8 -0
- package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -0
- package/lib/module/web/TrackPlayer/SetupNotCalledError.js +8 -0
- package/lib/module/web/TrackPlayer/SetupNotCalledError.js.map +1 -0
- package/lib/module/web/TrackPlayer/SleepTimer.js +70 -0
- package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -0
- package/lib/module/web/TrackPlayer/State.js +14 -0
- package/lib/module/web/TrackPlayer/State.js.map +1 -0
- package/lib/module/web/TrackPlayer/index.js +7 -0
- package/lib/module/web/TrackPlayer/index.js.map +1 -0
- package/lib/module/web/browser/BrowserManager.js +583 -0
- package/lib/module/web/browser/BrowserManager.js.map +1 -0
- package/lib/module/web/browser/FavoriteManager.js +75 -0
- package/lib/module/web/browser/FavoriteManager.js.map +1 -0
- package/lib/module/web/browser/NavigationErrorManager.js +101 -0
- package/lib/module/web/browser/NavigationErrorManager.js.map +1 -0
- package/lib/module/web/browser/SearchManager.js +76 -0
- package/lib/module/web/browser/SearchManager.js.map +1 -0
- package/lib/module/web/http/HttpClient.js +89 -0
- package/lib/module/web/http/HttpClient.js.map +1 -0
- package/lib/module/web/http/RequestConfigBuilder.js +291 -0
- package/lib/module/web/http/RequestConfigBuilder.js.map +1 -0
- package/lib/module/web/player/NowPlayingManager.js +74 -0
- package/lib/module/web/player/NowPlayingManager.js.map +1 -0
- package/lib/module/web/player/OptionsManager.js +83 -0
- package/lib/module/web/player/OptionsManager.js.map +1 -0
- package/lib/module/web/util/BrowserPathHelper.js +134 -0
- package/lib/module/web/util/BrowserPathHelper.js.map +1 -0
- package/lib/module/web/util/shuffle.js +17 -0
- package/lib/module/web/util/shuffle.js.map +1 -0
- package/lib/typescript/src/AudioBrowser.d.ts +5 -0
- package/lib/typescript/src/AudioBrowser.d.ts.map +1 -0
- package/lib/typescript/src/features/battery.d.ts +112 -0
- package/lib/typescript/src/features/battery.d.ts.map +1 -0
- package/lib/typescript/src/features/browser.d.ts +68 -0
- package/lib/typescript/src/features/browser.d.ts.map +1 -0
- package/lib/typescript/src/features/equalizer.d.ts +35 -0
- package/lib/typescript/src/features/equalizer.d.ts.map +1 -0
- package/lib/typescript/src/features/errors.d.ts +136 -0
- package/lib/typescript/src/features/errors.d.ts.map +1 -0
- package/lib/typescript/src/features/favorites.d.ts +84 -0
- package/lib/typescript/src/features/favorites.d.ts.map +1 -0
- package/lib/typescript/src/features/index.d.ts +23 -0
- package/lib/typescript/src/features/index.d.ts.map +1 -0
- package/lib/typescript/src/features/metadata.d.ts +103 -0
- package/lib/typescript/src/features/metadata.d.ts.map +1 -0
- package/lib/typescript/src/features/network.d.ts +18 -0
- package/lib/typescript/src/features/network.d.ts.map +1 -0
- package/lib/typescript/src/features/nowPlaying.d.ts +36 -0
- package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -0
- package/lib/typescript/src/features/output.d.ts +28 -0
- package/lib/typescript/src/features/output.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/controls.d.ts +40 -0
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/index.d.ts +8 -0
- package/lib/typescript/src/features/playback/index.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/playWhenReady.d.ts +30 -0
- package/lib/typescript/src/features/playback/playWhenReady.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/playing.d.ts +21 -0
- package/lib/typescript/src/features/playback/playing.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/progress.d.ts +51 -0
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/rate.d.ts +12 -0
- package/lib/typescript/src/features/playback/rate.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/state.d.ts +43 -0
- package/lib/typescript/src/features/playback/state.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/volume.d.ts +32 -0
- package/lib/typescript/src/features/playback/volume.d.ts.map +1 -0
- package/lib/typescript/src/features/player/index.d.ts +3 -0
- package/lib/typescript/src/features/player/index.d.ts.map +1 -0
- package/lib/typescript/src/features/player/options.d.ts +413 -0
- package/lib/typescript/src/features/player/options.d.ts.map +1 -0
- package/lib/typescript/src/features/player/setup.d.ts +471 -0
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/activeTrack.d.ts +38 -0
- package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/index.d.ts +5 -0
- package/lib/typescript/src/features/queue/index.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/queue.d.ts +111 -0
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/repeatMode.d.ts +34 -0
- package/lib/typescript/src/features/queue/repeatMode.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/shuffle.d.ts +27 -0
- package/lib/typescript/src/features/queue/shuffle.d.ts.map +1 -0
- package/lib/typescript/src/features/rating.d.ts +14 -0
- package/lib/typescript/src/features/rating.d.ts.map +1 -0
- package/lib/typescript/src/features/remoteControls.d.ts +164 -0
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -0
- package/lib/typescript/src/features/sleepTimer.d.ts +80 -0
- package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/native.d.ts +3 -0
- package/lib/typescript/src/native.d.ts.map +1 -0
- package/lib/typescript/src/native.web.d.ts +3 -0
- package/lib/typescript/src/native.web.d.ts.map +1 -0
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts +242 -0
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -0
- package/lib/typescript/src/types/browser-native.d.ts +40 -0
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -0
- package/lib/typescript/src/types/browser-nodes.d.ts +198 -0
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -0
- package/lib/typescript/src/types/browser.d.ts +742 -0
- package/lib/typescript/src/types/browser.d.ts.map +1 -0
- package/lib/typescript/src/types/index.d.ts +3 -0
- package/lib/typescript/src/types/index.d.ts.map +1 -0
- package/lib/typescript/src/types/player.d.ts +64 -0
- package/lib/typescript/src/types/player.d.ts.map +1 -0
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +35 -0
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -0
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +39 -0
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -0
- package/lib/typescript/src/utils/resolveAssetSource.d.ts +4 -0
- package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -0
- package/lib/typescript/src/utils/useDebug.d.ts +65 -0
- package/lib/typescript/src/utils/useDebug.d.ts.map +1 -0
- package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts +14 -0
- package/lib/typescript/src/utils/useNativeUpdatedValue.d.ts.map +1 -0
- package/lib/typescript/src/utils/validation.d.ts +3 -0
- package/lib/typescript/src/utils/validation.d.ts.map +1 -0
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +188 -0
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -0
- package/lib/typescript/src/web/SimpleRouter.d.ts +40 -0
- package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -0
- package/lib/typescript/src/web/SimpleRouter.test.d.ts +2 -0
- package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts +11 -0
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts +59 -0
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +39 -0
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +6 -0
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +4 -0
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +34 -0
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/State.d.ts +13 -0
- package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/index.d.ts +5 -0
- package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/BrowserManager.d.ts +154 -0
- package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts +42 -0
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +40 -0
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/SearchManager.d.ts +22 -0
- package/lib/typescript/src/web/browser/SearchManager.d.ts.map +1 -0
- package/lib/typescript/src/web/http/HttpClient.d.ts +25 -0
- package/lib/typescript/src/web/http/HttpClient.d.ts.map +1 -0
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +98 -0
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +1 -0
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts +34 -0
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +1 -0
- package/lib/typescript/src/web/player/OptionsManager.d.ts +32 -0
- package/lib/typescript/src/web/player/OptionsManager.d.ts.map +1 -0
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +69 -0
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +1 -0
- package/lib/typescript/src/web/util/shuffle.d.ts +8 -0
- package/lib/typescript/src/web/util/shuffle.d.ts.map +1 -0
- package/nitro.json +24 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +88 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.gradle +27 -0
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +136 -0
- package/nitrogen/generated/android/AudioBrowserOnLoad.hpp +34 -0
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +67 -0
- package/nitrogen/generated/android/c++/JAndroidAudioOffloadSettings.hpp +61 -0
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JAndroidPlayerWakeMode.hpp +61 -0
- package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JAppKilledPlaybackBehavior.hpp +61 -0
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +166 -0
- package/nitrogen/generated/android/c++/JBatteryOptimizationStatus.hpp +61 -0
- package/nitrogen/generated/android/c++/JBatteryOptimizationStatusChangedEvent.hpp +58 -0
- package/nitrogen/generated/android/c++/JBatteryWarningPendingChangedEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JBrowseError.hpp +57 -0
- package/nitrogen/generated/android/c++/JBrowseResult.cpp +26 -0
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +87 -0
- package/nitrogen/generated/android/c++/JBrowserSourceCallbackParam.hpp +76 -0
- package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +64 -0
- package/nitrogen/generated/android/c++/JCarPlaySiriListButtonPosition.hpp +58 -0
- package/nitrogen/generated/android/c++/JChapterMetadata.hpp +70 -0
- package/nitrogen/generated/android/c++/JEqualizerSettings.hpp +125 -0
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +74 -0
- package/nitrogen/generated/android/c++/JFormatNavigationErrorParams.hpp +72 -0
- package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +61 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.hpp +111 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.hpp +134 -0
- 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
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +139 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +147 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +159 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +139 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_BatteryOptimizationStatusChangedEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_BatteryWarningPendingChangedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_EqualizerSettings.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +91 -0
- package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_NavigationErrorEvent.hpp +83 -0
- package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +89 -0
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +98 -0
- package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +83 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +91 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +81 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackPlayWhenReadyChangedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackProgressUpdatedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackQueueEndedEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlayingState.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpBackwardEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpForwardEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemotePlayIdEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemotePlaySearchEvent.hpp +78 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSeekEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSkipEvent.hpp +77 -0
- package/nitrogen/generated/android/c++/JFunc_void_RepeatModeChangedEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_TrackMetadata.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_double.hpp +75 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_FormattedNavigationError_.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +93 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.hpp +84 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +76 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_ChapterMetadata_.hpp +98 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +107 -0
- package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JHttpMethod.hpp +73 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +1835 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +248 -0
- package/nitrogen/generated/android/c++/JIOSCategory.hpp +70 -0
- package/nitrogen/generated/android/c++/JIOSCategoryMode.hpp +79 -0
- package/nitrogen/generated/android/c++/JIOSCategoryOptions.hpp +73 -0
- package/nitrogen/generated/android/c++/JIOSCategoryPolicy.hpp +61 -0
- package/nitrogen/generated/android/c++/JImageContext.hpp +61 -0
- package/nitrogen/generated/android/c++/JImageQueryParams.hpp +62 -0
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +75 -0
- package/nitrogen/generated/android/c++/JImageSource.hpp +86 -0
- package/nitrogen/generated/android/c++/JIosOutput.hpp +67 -0
- package/nitrogen/generated/android/c++/JIosOutputType.hpp +85 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +156 -0
- package/nitrogen/generated/android/c++/JMediaTransformParams.hpp +69 -0
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +216 -0
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +151 -0
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +105 -0
- package/nitrogen/generated/android/c++/JNavigationError.hpp +72 -0
- package/nitrogen/generated/android/c++/JNavigationErrorEvent.hpp +62 -0
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +67 -0
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JNotificationButton.hpp +67 -0
- package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
- package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +104 -0
- package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +62 -0
- package/nitrogen/generated/android/c++/JOptions.hpp +97 -0
- package/nitrogen/generated/android/c++/JPartialAndroidSetupPlayerOptions.hpp +104 -0
- package/nitrogen/generated/android/c++/JPartialIOSSetupPlayerOptions.hpp +100 -0
- package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +96 -0
- package/nitrogen/generated/android/c++/JPercentageRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JPlayback.hpp +66 -0
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +86 -0
- package/nitrogen/generated/android/c++/JPlaybackError.hpp +61 -0
- package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +60 -0
- package/nitrogen/generated/android/c++/JPlaybackPlayWhenReadyChangedEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JPlaybackProgressUpdatedEvent.hpp +69 -0
- package/nitrogen/generated/android/c++/JPlaybackQueueEndedEvent.hpp +61 -0
- package/nitrogen/generated/android/c++/JPlaybackState.hpp +79 -0
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +101 -0
- package/nitrogen/generated/android/c++/JPlayingState.hpp +61 -0
- package/nitrogen/generated/android/c++/JProgress.hpp +65 -0
- package/nitrogen/generated/android/c++/JRatingType.hpp +73 -0
- package/nitrogen/generated/android/c++/JRemoteJumpBackwardEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemoteJumpForwardEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemotePlayIdEvent.hpp +62 -0
- package/nitrogen/generated/android/c++/JRemotePlaySearchEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemoteSeekEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
- package/nitrogen/generated/android/c++/JRemoteSkipEvent.hpp +57 -0
- package/nitrogen/generated/android/c++/JRepeatMode.hpp +61 -0
- package/nitrogen/generated/android/c++/JRepeatModeChangedEvent.hpp +58 -0
- package/nitrogen/generated/android/c++/JRequestConfig.hpp +115 -0
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +184 -0
- package/nitrogen/generated/android/c++/JRetryConfig.hpp +61 -0
- package/nitrogen/generated/android/c++/JSearchMode.hpp +70 -0
- package/nitrogen/generated/android/c++/JSearchParams.hpp +84 -0
- package/nitrogen/generated/android/c++/JSleepTimer.cpp +30 -0
- package/nitrogen/generated/android/c++/JSleepTimer.hpp +88 -0
- package/nitrogen/generated/android/c++/JSleepTimerEndOfTrack.hpp +57 -0
- package/nitrogen/generated/android/c++/JSleepTimerTime.hpp +57 -0
- package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JThumbsRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JTimedMetadata.hpp +74 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +154 -0
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +96 -0
- package/nitrogen/generated/android/c++/JTrackMetadata.hpp +118 -0
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +58 -0
- package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +134 -0
- package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.hpp +70 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.hpp +70 -0
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +34 -0
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +105 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +69 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +75 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioOffloadSettings.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidPlayerWakeMode.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AppKilledPlaybackBehavior.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +72 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AudioBrowserOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatus.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatusChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryWarningPendingChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseError.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseResult.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowserSourceCallbackParam.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlaySiriListButtonPosition.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ChapterMetadata.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/EqualizerSettings.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FavoriteChangedEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNavigationErrorParams.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.kt +80 -0
- 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
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.kt +80 -0
- 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
- 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
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryOptimizationStatusChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryWarningPendingChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_EqualizerSettings.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_FavoriteChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_IosOutput.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NavigationErrorEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NowPlayingMetadata.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Options.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Playback.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackActiveTrackChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackErrorEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackPlayWhenReadyChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackProgressUpdatedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackQueueEndedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlayingState.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpBackwardEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpForwardEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlayIdEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlaySearchEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSeekEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSetRatingEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSkipEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RepeatModeChangedEvent.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TimedMetadata.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TrackMetadata.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_double.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_FormattedNavigationError_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_ResolvedTrack_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__string.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_ChapterMetadata_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_Track_.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HeartRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HttpMethod.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +1134 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategory.kt +27 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryMode.kt +30 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryOptions.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryPolicy.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageContext.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageQueryParams.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageSource.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutput.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +32 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +69 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaTransformParams.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +72 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +63 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationError.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialAndroidSetupPlayerOptions.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialIOSSetupPlayerOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PercentageRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Playback.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackActiveTrackChangedEvent.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackPlayWhenReadyChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackProgressUpdatedEvent.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackQueueEndedEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +30 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +71 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayingState.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Progress.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RatingType.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpBackwardEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpForwardEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlayIdEvent.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlaySearchEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSeekEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSetRatingEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSkipEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatMode.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatModeChangedEvent.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RequestConfig.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +95 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +27 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +56 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimer.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerEndOfTrack.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerTime.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StarRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ThumbsRating.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TimedMetadata.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +89 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackLoadEvent.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackMetadata.kt +83 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_AndroidAudioOffloadSettings.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_RetryConfig.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +77 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_Double.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_NotificationButtonLayout.kt +53 -0
- package/nitrogen/generated/ios/AudioBrowser+autolinking.rb +60 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +424 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +2959 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +309 -0
- package/nitrogen/generated/ios/AudioBrowserAutolinking.mm +33 -0
- package/nitrogen/generated/ios/AudioBrowserAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +1214 -0
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +52 -0
- package/nitrogen/generated/ios/swift/AndroidAudioOffloadSettings.swift +60 -0
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +81 -0
- package/nitrogen/generated/ios/swift/AndroidPlayerWakeMode.swift +44 -0
- package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +119 -0
- package/nitrogen/generated/ios/swift/AppKilledPlaybackBehavior.swift +44 -0
- package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +294 -0
- package/nitrogen/generated/ios/swift/BatteryOptimizationStatus.swift +44 -0
- package/nitrogen/generated/ios/swift/BatteryOptimizationStatusChangedEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/BatteryWarningPendingChangedEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/BrowseError.swift +29 -0
- package/nitrogen/generated/ios/swift/BrowseResult.swift +18 -0
- package/nitrogen/generated/ios/swift/BrowserSourceCallbackParam.swift +61 -0
- package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +48 -0
- package/nitrogen/generated/ios/swift/CarPlaySiriListButtonPosition.swift +40 -0
- package/nitrogen/generated/ios/swift/ChapterMetadata.swift +70 -0
- package/nitrogen/generated/ios/swift/EqualizerSettings.swift +95 -0
- package/nitrogen/generated/ios/swift/FavoriteChangedEvent.swift +34 -0
- package/nitrogen/generated/ios/swift/FormatNavigationErrorParams.swift +39 -0
- package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +34 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.swift +60 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.swift +61 -0
- 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
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +68 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.swift +67 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_BatteryOptimizationStatusChangedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_BatteryWarningPendingChangedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_EqualizerSettings.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_FavoriteChangedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_IosOutput.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_NavigationErrorEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_NowPlayingMetadata.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_Options.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_Playback.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackActiveTrackChangedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackErrorEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackPlayWhenReadyChangedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackProgressUpdatedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PlaybackQueueEndedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PlayingState.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteJumpBackwardEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteJumpForwardEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RemotePlayIdEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RemotePlaySearchEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteSeekEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteSetRatingEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RemoteSkipEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RepeatModeChangedEvent.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_RequestConfig.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_TrackMetadata.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_FormattedNavigationError_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_ResolvedTrack_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.swift +68 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_RequestConfig__.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_Track___.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_void__.swift +64 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError_.swift +58 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_ChapterMetadata_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_Track_.swift +46 -0
- package/nitrogen/generated/ios/swift/HeartRating.swift +29 -0
- package/nitrogen/generated/ios/swift/HttpMethod.swift +60 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +180 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +2401 -0
- package/nitrogen/generated/ios/swift/IOSCategory.swift +56 -0
- package/nitrogen/generated/ios/swift/IOSCategoryMode.swift +68 -0
- package/nitrogen/generated/ios/swift/IOSCategoryOptions.swift +60 -0
- package/nitrogen/generated/ios/swift/IOSCategoryPolicy.swift +44 -0
- package/nitrogen/generated/ios/swift/ImageContext.swift +60 -0
- package/nitrogen/generated/ios/swift/ImageQueryParams.swift +60 -0
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +76 -0
- package/nitrogen/generated/ios/swift/ImageSource.swift +90 -0
- package/nitrogen/generated/ios/swift/IosOutput.swift +39 -0
- package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
- package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +295 -0
- package/nitrogen/generated/ios/swift/MediaTransformParams.swift +40 -0
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +271 -0
- package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +178 -0
- package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +143 -0
- package/nitrogen/generated/ios/swift/NavigationError.swift +70 -0
- package/nitrogen/generated/ios/swift/NavigationErrorEvent.swift +35 -0
- package/nitrogen/generated/ios/swift/NavigationErrorType.swift +52 -0
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +119 -0
- package/nitrogen/generated/ios/swift/NotificationButton.swift +52 -0
- package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +92 -0
- package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +233 -0
- package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +60 -0
- package/nitrogen/generated/ios/swift/Options.swift +92 -0
- package/nitrogen/generated/ios/swift/PartialAndroidSetupPlayerOptions.swift +228 -0
- package/nitrogen/generated/ios/swift/PartialIOSSetupPlayerOptions.swift +99 -0
- package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +101 -0
- package/nitrogen/generated/ios/swift/PercentageRating.swift +29 -0
- package/nitrogen/generated/ios/swift/Playback.swift +40 -0
- package/nitrogen/generated/ios/swift/PlaybackActiveTrackChangedEvent.swift +87 -0
- package/nitrogen/generated/ios/swift/PlaybackError.swift +34 -0
- package/nitrogen/generated/ios/swift/PlaybackErrorEvent.swift +35 -0
- package/nitrogen/generated/ios/swift/PlaybackPlayWhenReadyChangedEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/PlaybackProgressUpdatedEvent.swift +44 -0
- package/nitrogen/generated/ios/swift/PlaybackQueueEndedEvent.swift +34 -0
- package/nitrogen/generated/ios/swift/PlaybackState.swift +68 -0
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +240 -0
- package/nitrogen/generated/ios/swift/PlayingState.swift +34 -0
- package/nitrogen/generated/ios/swift/Progress.swift +39 -0
- package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
- package/nitrogen/generated/ios/swift/RemoteJumpBackwardEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/RemoteJumpForwardEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/RemotePlayIdEvent.swift +47 -0
- package/nitrogen/generated/ios/swift/RemotePlaySearchEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/RemoteSeekEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +58 -0
- package/nitrogen/generated/ios/swift/RemoteSkipEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/RepeatMode.swift +44 -0
- package/nitrogen/generated/ios/swift/RepeatModeChangedEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/RequestConfig.swift +189 -0
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +342 -0
- package/nitrogen/generated/ios/swift/RetryConfig.swift +47 -0
- package/nitrogen/generated/ios/swift/SearchMode.swift +56 -0
- package/nitrogen/generated/ios/swift/SearchParams.swift +130 -0
- package/nitrogen/generated/ios/swift/SleepTimer.swift +19 -0
- package/nitrogen/generated/ios/swift/SleepTimerEndOfTrack.swift +29 -0
- package/nitrogen/generated/ios/swift/SleepTimerTime.swift +29 -0
- package/nitrogen/generated/ios/swift/StarRating.swift +29 -0
- package/nitrogen/generated/ios/swift/ThumbsRating.swift +29 -0
- package/nitrogen/generated/ios/swift/TimedMetadata.swift +114 -0
- package/nitrogen/generated/ios/swift/Track.swift +320 -0
- package/nitrogen/generated/ios/swift/TrackLoadEvent.swift +45 -0
- package/nitrogen/generated/ios/swift/TrackMetadata.swift +312 -0
- package/nitrogen/generated/ios/swift/TrackStyle.swift +40 -0
- package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +248 -0
- package/nitrogen/generated/ios/swift/UpdateOptions.swift +143 -0
- package/nitrogen/generated/ios/swift/Variant_Bool_AndroidAudioOffloadSettings.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_Bool_RetryConfig.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_NotificationButtonLayout.swift +18 -0
- package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +88 -0
- package/nitrogen/generated/shared/c++/AndroidAudioOffloadSettings.hpp +87 -0
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +109 -0
- package/nitrogen/generated/shared/c++/AndroidPlayerWakeMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +109 -0
- package/nitrogen/generated/shared/c++/AppKilledPlaybackBehavior.hpp +80 -0
- package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +141 -0
- package/nitrogen/generated/shared/c++/BatteryOptimizationStatus.hpp +80 -0
- package/nitrogen/generated/shared/c++/BatteryOptimizationStatusChangedEvent.hpp +84 -0
- package/nitrogen/generated/shared/c++/BatteryWarningPendingChangedEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/BrowseError.hpp +83 -0
- package/nitrogen/generated/shared/c++/BrowserSourceCallbackParam.hpp +89 -0
- package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +84 -0
- package/nitrogen/generated/shared/c++/CarPlaySiriListButtonPosition.hpp +76 -0
- package/nitrogen/generated/shared/c++/ChapterMetadata.hpp +96 -0
- package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +113 -0
- package/nitrogen/generated/shared/c++/FavoriteChangedEvent.hpp +88 -0
- package/nitrogen/generated/shared/c++/FormatNavigationErrorParams.hpp +96 -0
- package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +87 -0
- package/nitrogen/generated/shared/c++/HeartRating.hpp +83 -0
- package/nitrogen/generated/shared/c++/HttpMethod.hpp +96 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +207 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +375 -0
- package/nitrogen/generated/shared/c++/IOSCategory.hpp +92 -0
- package/nitrogen/generated/shared/c++/IOSCategoryMode.hpp +104 -0
- package/nitrogen/generated/shared/c++/IOSCategoryOptions.hpp +96 -0
- package/nitrogen/generated/shared/c++/IOSCategoryPolicy.hpp +80 -0
- package/nitrogen/generated/shared/c++/ImageContext.hpp +87 -0
- package/nitrogen/generated/shared/c++/ImageQueryParams.hpp +88 -0
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +98 -0
- package/nitrogen/generated/shared/c++/ImageSource.hpp +99 -0
- package/nitrogen/generated/shared/c++/IosOutput.hpp +93 -0
- package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
- package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +131 -0
- package/nitrogen/generated/shared/c++/MediaTransformParams.hpp +92 -0
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +150 -0
- package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +139 -0
- package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +111 -0
- package/nitrogen/generated/shared/c++/NavigationError.hpp +98 -0
- package/nitrogen/generated/shared/c++/NavigationErrorEvent.hpp +85 -0
- package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +88 -0
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +109 -0
- package/nitrogen/generated/shared/c++/NotificationButton.hpp +88 -0
- package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +102 -0
- package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +132 -0
- package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +88 -0
- package/nitrogen/generated/shared/c++/Options.hpp +113 -0
- package/nitrogen/generated/shared/c++/PartialAndroidSetupPlayerOptions.hpp +129 -0
- package/nitrogen/generated/shared/c++/PartialIOSSetupPlayerOptions.hpp +111 -0
- package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +104 -0
- package/nitrogen/generated/shared/c++/PercentageRating.hpp +83 -0
- package/nitrogen/generated/shared/c++/Playback.hpp +92 -0
- package/nitrogen/generated/shared/c++/PlaybackActiveTrackChangedEvent.hpp +101 -0
- package/nitrogen/generated/shared/c++/PlaybackError.hpp +87 -0
- package/nitrogen/generated/shared/c++/PlaybackErrorEvent.hpp +85 -0
- package/nitrogen/generated/shared/c++/PlaybackPlayWhenReadyChangedEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/PlaybackProgressUpdatedEvent.hpp +95 -0
- package/nitrogen/generated/shared/c++/PlaybackQueueEndedEvent.hpp +87 -0
- package/nitrogen/generated/shared/c++/PlaybackState.hpp +104 -0
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +127 -0
- package/nitrogen/generated/shared/c++/PlayingState.hpp +87 -0
- package/nitrogen/generated/shared/c++/Progress.hpp +91 -0
- package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
- package/nitrogen/generated/shared/c++/RemoteJumpBackwardEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/RemoteJumpForwardEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/RemotePlayIdEvent.hpp +88 -0
- package/nitrogen/generated/shared/c++/RemotePlaySearchEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/RemoteSeekEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +94 -0
- package/nitrogen/generated/shared/c++/RemoteSkipEvent.hpp +83 -0
- package/nitrogen/generated/shared/c++/RepeatMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/RepeatModeChangedEvent.hpp +84 -0
- package/nitrogen/generated/shared/c++/RequestConfig.hpp +115 -0
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +175 -0
- package/nitrogen/generated/shared/c++/RetryConfig.hpp +87 -0
- package/nitrogen/generated/shared/c++/SearchMode.hpp +92 -0
- package/nitrogen/generated/shared/c++/SearchParams.hpp +110 -0
- package/nitrogen/generated/shared/c++/SleepTimerEndOfTrack.hpp +83 -0
- package/nitrogen/generated/shared/c++/SleepTimerTime.hpp +83 -0
- package/nitrogen/generated/shared/c++/StarRating.hpp +83 -0
- package/nitrogen/generated/shared/c++/ThumbsRating.hpp +83 -0
- package/nitrogen/generated/shared/c++/TimedMetadata.hpp +100 -0
- package/nitrogen/generated/shared/c++/Track.hpp +161 -0
- package/nitrogen/generated/shared/c++/TrackLoadEvent.hpp +93 -0
- package/nitrogen/generated/shared/c++/TrackMetadata.hpp +144 -0
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +76 -0
- package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +124 -0
- package/nitrogen/generated/shared/c++/UpdateOptions.hpp +111 -0
- package/package.json +117 -6
- package/src/AudioBrowser.ts +4 -0
- package/src/features/battery.ts +176 -0
- package/src/features/browser.ts +316 -0
- package/src/features/equalizer.ts +64 -0
- package/src/features/errors.ts +196 -0
- package/src/features/favorites.ts +102 -0
- package/src/features/index.ts +23 -0
- package/src/features/metadata.ts +130 -0
- package/src/features/network.ts +34 -0
- package/src/features/nowPlaying.ts +56 -0
- package/src/features/output.ts +50 -0
- package/src/features/playback/controls.ts +66 -0
- package/src/features/playback/index.ts +7 -0
- package/src/features/playback/playWhenReady.ts +57 -0
- package/src/features/playback/playing.ts +40 -0
- package/src/features/playback/progress.ts +122 -0
- package/src/features/playback/rate.ts +22 -0
- package/src/features/playback/state.ts +72 -0
- package/src/features/playback/volume.ts +59 -0
- package/src/features/player/index.ts +2 -0
- package/src/features/player/options.ts +479 -0
- package/src/features/player/setup.ts +551 -0
- package/src/features/queue/activeTrack.ts +59 -0
- package/src/features/queue/index.ts +4 -0
- package/src/features/queue/queue.ts +173 -0
- package/src/features/queue/repeatMode.ts +58 -0
- package/src/features/queue/shuffle.ts +49 -0
- package/src/features/rating.ts +17 -0
- package/src/features/remoteControls.ts +341 -0
- package/src/features/sleepTimer.ts +186 -0
- package/src/index.ts +5 -0
- package/src/native.ts +5 -0
- package/src/native.web.ts +4 -0
- package/src/specs/audio-browser.nitro.ts +325 -0
- package/src/types/browser-native.ts +68 -0
- package/src/types/browser-nodes.ts +222 -0
- package/src/types/browser.ts +828 -0
- package/src/types/index.ts +2 -0
- package/src/types/player.ts +69 -0
- package/src/utils/LazyNativeEmitter.ts +58 -0
- package/src/utils/NativeUpdatedValue.ts +56 -0
- package/src/utils/resolveAssetSource.ts +4 -0
- package/src/utils/useDebug.ts +283 -0
- package/src/utils/useNativeUpdatedValue.ts +41 -0
- package/src/utils/validation.ts +27 -0
- package/src/web/NativeAudioBrowser.ts +884 -0
- package/src/web/SimpleRouter.test.ts +160 -0
- package/src/web/SimpleRouter.ts +194 -0
- package/src/web/TrackPlayer/Event.ts +11 -0
- package/src/web/TrackPlayer/Player.ts +351 -0
- package/src/web/TrackPlayer/PlaylistPlayer.ts +346 -0
- package/src/web/TrackPlayer/RepeatMode.ts +7 -0
- package/src/web/TrackPlayer/SetupNotCalledError.ts +5 -0
- package/src/web/TrackPlayer/SleepTimer.ts +71 -0
- package/src/web/TrackPlayer/State.ts +15 -0
- package/src/web/TrackPlayer/index.ts +4 -0
- package/src/web/browser/BrowserManager.ts +699 -0
- package/src/web/browser/FavoriteManager.ts +79 -0
- package/src/web/browser/NavigationErrorManager.ts +119 -0
- package/src/web/browser/SearchManager.ts +88 -0
- package/src/web/http/HttpClient.ts +125 -0
- package/src/web/http/RequestConfigBuilder.ts +363 -0
- package/src/web/player/NowPlayingManager.ts +89 -0
- package/src/web/player/OptionsManager.ts +102 -0
- package/src/web/util/BrowserPathHelper.ts +148 -0
- package/src/web/util/shuffle.ts +14 -0
- 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
|