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