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
|
@@ -1,41 +1,35 @@
|
|
|
1
1
|
package com.audiobrowser.player
|
|
2
2
|
|
|
3
3
|
import android.os.Bundle
|
|
4
|
+
import androidx.media3.common.HeartRating
|
|
4
5
|
import androidx.media3.common.MediaItem
|
|
5
6
|
import androidx.media3.common.MediaMetadata
|
|
6
7
|
import androidx.media3.common.Rating
|
|
7
8
|
import androidx.media3.session.LibraryResult
|
|
8
|
-
import androidx.media3.session.MediaConstants
|
|
9
9
|
import androidx.media3.session.MediaLibraryService
|
|
10
10
|
import androidx.media3.session.MediaSession
|
|
11
|
+
import androidx.media3.session.MediaConstants
|
|
11
12
|
import androidx.media3.session.SessionCommand
|
|
12
13
|
import androidx.media3.session.SessionError
|
|
13
14
|
import androidx.media3.session.SessionResult
|
|
15
|
+
import com.audiobrowser.AudioBrowser
|
|
14
16
|
import com.audiobrowser.browser.handleTrackLoad
|
|
15
|
-
import com.audiobrowser.extension.toTrack
|
|
16
17
|
import com.audiobrowser.util.BrowserPathHelper
|
|
17
|
-
import com.audiobrowser.util.
|
|
18
|
+
import com.audiobrowser.util.RatingFactory
|
|
19
|
+
import com.audiobrowser.util.ResolvedTrackFactory
|
|
18
20
|
import com.audiobrowser.util.TrackFactory
|
|
21
|
+
import com.margelo.nitro.audiobrowser.Track
|
|
19
22
|
import com.google.common.collect.ImmutableList
|
|
20
23
|
import com.google.common.util.concurrent.Futures
|
|
21
24
|
import com.google.common.util.concurrent.ListenableFuture
|
|
22
|
-
import com.margelo.nitro.audiobrowser.
|
|
23
|
-
import com.margelo.nitro.audiobrowser.
|
|
24
|
-
import com.margelo.nitro.audiobrowser.GateReason
|
|
25
|
-
import com.margelo.nitro.audiobrowser.MediaReference
|
|
26
|
-
import com.margelo.nitro.audiobrowser.NativeGateRequest
|
|
25
|
+
import com.margelo.nitro.audiobrowser.FavoriteChangedEvent
|
|
26
|
+
import com.margelo.nitro.audiobrowser.NotificationButtonLayout
|
|
27
27
|
import com.margelo.nitro.audiobrowser.PlayerCapabilities
|
|
28
|
-
import com.margelo.nitro.audiobrowser.
|
|
29
|
-
import com.margelo.nitro.audiobrowser.SearchParams
|
|
30
|
-
import com.margelo.nitro.audiobrowser.Track
|
|
31
|
-
import kotlinx.coroutines.CancellationException
|
|
28
|
+
import com.margelo.nitro.audiobrowser.RemoteSetRatingEvent
|
|
32
29
|
import kotlinx.coroutines.CoroutineScope
|
|
33
30
|
import kotlinx.coroutines.Dispatchers
|
|
34
31
|
import kotlinx.coroutines.SupervisorJob
|
|
35
|
-
import kotlinx.coroutines.TimeoutCancellationException
|
|
36
|
-
import kotlinx.coroutines.cancel
|
|
37
32
|
import kotlinx.coroutines.guava.future
|
|
38
|
-
import kotlinx.coroutines.launch
|
|
39
33
|
import kotlinx.coroutines.withContext
|
|
40
34
|
import timber.log.Timber
|
|
41
35
|
|
|
@@ -48,9 +42,7 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
48
42
|
internal val commandManager = MediaSessionCommandManager()
|
|
49
43
|
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
|
|
50
44
|
|
|
51
|
-
// Track which controllers are subscribed to which media IDs
|
|
52
|
-
// Mutated on the Media3 application thread (onSubscribe/onUnsubscribe) but read from other
|
|
53
|
-
// threads (network observer, JS-triggered notifies) — guard all access with synchronized(this).
|
|
45
|
+
// Track which controllers are subscribed to which media IDs
|
|
54
46
|
private val parentIdSubscriptions =
|
|
55
47
|
mutableMapOf<String, MutableSet<MediaSession.ControllerInfo>>()
|
|
56
48
|
private var mediaLibrarySession: MediaLibraryService.MediaLibrarySession? = null
|
|
@@ -59,8 +51,7 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
59
51
|
* Recommended artwork size in pixels from the connected media browser (e.g., Android Auto).
|
|
60
52
|
* Updated when onGetLibraryRoot is called with EXTRAS_KEY_MEDIA_ART_SIZE_PIXELS hint.
|
|
61
53
|
*/
|
|
62
|
-
@Volatile
|
|
63
|
-
var artworkSizeHintPixels: Int? = null
|
|
54
|
+
@Volatile var artworkSizeHintPixels: Int? = null
|
|
64
55
|
private set
|
|
65
56
|
|
|
66
57
|
init {
|
|
@@ -81,99 +72,36 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
81
72
|
}
|
|
82
73
|
|
|
83
74
|
/** Creates an offline error MediaItem. */
|
|
84
|
-
private fun createOfflineMediaItem(): MediaItem
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Builds a non-browsable, non-playable [MediaItem] used to surface an error inside an Android
|
|
94
|
-
* Auto / AAOS browse list. Rendered as a greyed-out, non-interactive tile, which is the only
|
|
95
|
-
* side-effect-free way to communicate a browse failure to legacy controllers (Media3 drops
|
|
96
|
-
* [LibraryResult.ofError] on the legacy browse bridge, leaving an empty "No items" screen).
|
|
97
|
-
*/
|
|
98
|
-
private fun createErrorMediaItem(mediaId: String, title: String, subtitle: String): MediaItem =
|
|
99
|
-
MediaItem.Builder()
|
|
100
|
-
.setMediaId(mediaId)
|
|
75
|
+
private fun createOfflineMediaItem(): MediaItem {
|
|
76
|
+
val errorTitle = player.context.getString(com.audiobrowser.R.string.audio_browser_offline_error)
|
|
77
|
+
val errorSubtitle =
|
|
78
|
+
player.context.getString(com.audiobrowser.R.string.audio_browser_offline_error_subtitle)
|
|
79
|
+
return MediaItem.Builder()
|
|
80
|
+
.setMediaId(BrowserPathHelper.OFFLINE_PATH)
|
|
101
81
|
.setMediaMetadata(
|
|
102
82
|
MediaMetadata.Builder()
|
|
103
|
-
.setTitle(
|
|
104
|
-
.setSubtitle(
|
|
105
|
-
// Non-browsable, non-playable. Android Auto ignores these flags and still drills into a
|
|
106
|
-
// tapped tile, but onGetChildren returns an empty list for the sentinel paths so it's a
|
|
107
|
-
// harmless "No Items" dead-end rather than an endless stack of error pages.
|
|
83
|
+
.setTitle(errorTitle)
|
|
84
|
+
.setSubtitle(errorSubtitle)
|
|
108
85
|
.setIsBrowsable(false)
|
|
109
86
|
.setIsPlayable(false)
|
|
110
87
|
.build()
|
|
111
88
|
)
|
|
112
89
|
.build()
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Builds the gate tile from a per-request chrome: while a gate is active, tabs stay visible but a
|
|
116
|
-
* gated browse/search level serves this single tile (see the gate checks in [onGetChildren] /
|
|
117
|
-
* [onGetSearchResult]). Same shape as the error tiles — non-browsable, non-playable — and
|
|
118
|
-
* deliberately NOT accompanied by a SessionError: a gate is deliberate app state, not a failure.
|
|
119
|
-
* The message renders as the tile's subtitle (newlines collapse to spaces — list rows are
|
|
120
|
-
* single-line).
|
|
121
|
-
*/
|
|
122
|
-
/**
|
|
123
|
-
* Wraps a raw external-search query string into the structured [SearchParams] the gate request
|
|
124
|
-
* carries. The car search surfaces only give a free-text query, so the other fields stay null —
|
|
125
|
-
* mirrors BrowserManager's query→SearchParams construction.
|
|
126
|
-
*/
|
|
127
|
-
private fun searchParams(query: String): SearchParams =
|
|
128
|
-
SearchParams(
|
|
129
|
-
mode = null,
|
|
130
|
-
query = query,
|
|
131
|
-
genre = null,
|
|
132
|
-
artist = null,
|
|
133
|
-
album = null,
|
|
134
|
-
title = null,
|
|
135
|
-
playlist = null,
|
|
136
|
-
reference = MediaReference.UNKNOWN,
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
private fun createGateMediaItem(gate: Gate): MediaItem =
|
|
140
|
-
createErrorMediaItem(
|
|
141
|
-
mediaId = BrowserPathHelper.GATE_PATH,
|
|
142
|
-
title = gate.title,
|
|
143
|
-
subtitle = gate.message?.replace('\n', ' ') ?: "",
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Builds a generic "something went wrong" error tile for a browse failure. The true offline case
|
|
148
|
-
* is handled separately by the [networkMonitor] guard in [onGetChildren]; anything reaching the
|
|
149
|
-
* catch block is an online-but-failed request (e.g. server down, bad status), so it must NOT be
|
|
150
|
-
* labelled "no internet connection".
|
|
151
|
-
*/
|
|
152
|
-
private fun createBrowseErrorMediaItem(): MediaItem =
|
|
153
|
-
createErrorMediaItem(
|
|
154
|
-
mediaId = BrowserPathHelper.ERROR_PATH,
|
|
155
|
-
title = player.context.getString(com.audiobrowser.R.string.audio_browser_browse_error),
|
|
156
|
-
subtitle =
|
|
157
|
-
player.context.getString(com.audiobrowser.R.string.audio_browser_browse_error_subtitle),
|
|
158
|
-
)
|
|
90
|
+
}
|
|
159
91
|
|
|
160
92
|
fun updateMediaSession(
|
|
161
93
|
mediaSession: MediaSession,
|
|
162
94
|
capabilities: PlayerCapabilities,
|
|
163
|
-
|
|
95
|
+
notificationButtons: NotificationButtonLayout?,
|
|
164
96
|
searchAvailable: Boolean,
|
|
165
|
-
forwardJumpInterval: Double,
|
|
166
|
-
backwardJumpInterval: Double,
|
|
167
97
|
) {
|
|
168
98
|
// Store as MediaLibrarySession for notifyChildrenChanged support
|
|
169
99
|
this.mediaLibrarySession = mediaSession as? MediaLibraryService.MediaLibrarySession
|
|
170
100
|
commandManager.updateMediaSession(
|
|
171
101
|
mediaSession,
|
|
172
102
|
capabilities,
|
|
173
|
-
|
|
103
|
+
notificationButtons,
|
|
174
104
|
searchAvailable,
|
|
175
|
-
forwardJumpInterval,
|
|
176
|
-
backwardJumpInterval,
|
|
177
105
|
)
|
|
178
106
|
}
|
|
179
107
|
|
|
@@ -185,6 +113,18 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
185
113
|
return commandManager.buildConnectionResult(session)
|
|
186
114
|
}
|
|
187
115
|
|
|
116
|
+
/** Updates the favorite state of the current track and emits onFavoriteChanged. */
|
|
117
|
+
private fun setFavorited(favorited: Boolean) {
|
|
118
|
+
val currentTrack = player.currentTrack ?: return
|
|
119
|
+
|
|
120
|
+
// Update native favorites cache (only tracks with src can be favorited)
|
|
121
|
+
currentTrack.src?.let { src -> player.browser?.browserManager?.updateFavorite(src, favorited) }
|
|
122
|
+
|
|
123
|
+
player.setActiveTrackFavorited(favorited)
|
|
124
|
+
val event = FavoriteChangedEvent(player.currentTrack ?: currentTrack, favorited)
|
|
125
|
+
player.callbacks?.onFavoriteChanged(event)
|
|
126
|
+
}
|
|
127
|
+
|
|
188
128
|
override fun onCustomCommand(
|
|
189
129
|
session: MediaSession,
|
|
190
130
|
controller: MediaSession.ControllerInfo,
|
|
@@ -195,7 +135,7 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
195
135
|
if (command.customAction == MediaSessionCommandManager.CUSTOM_ACTION_FAVORITE) {
|
|
196
136
|
val currentFavorited = player.currentTrack?.favorited ?: false
|
|
197
137
|
Timber.d("Favorite button tapped - toggling from $currentFavorited to ${!currentFavorited}")
|
|
198
|
-
|
|
138
|
+
setFavorited(!currentFavorited)
|
|
199
139
|
return Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS))
|
|
200
140
|
}
|
|
201
141
|
|
|
@@ -210,10 +150,15 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
210
150
|
controller: MediaSession.ControllerInfo,
|
|
211
151
|
rating: Rating,
|
|
212
152
|
): ListenableFuture<SessionResult> {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
153
|
+
if (rating is HeartRating) {
|
|
154
|
+
setFavorited(rating.isHeart)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Also emit onRemoteSetRating for listeners
|
|
158
|
+
RatingFactory.media3ToBridge(rating)?.let {
|
|
159
|
+
val event = RemoteSetRatingEvent(it)
|
|
160
|
+
player.callbacks?.onRemoteSetRating(event)
|
|
161
|
+
}
|
|
217
162
|
return super.onSetRating(session, controller, rating)
|
|
218
163
|
}
|
|
219
164
|
|
|
@@ -275,55 +220,25 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
275
220
|
)
|
|
276
221
|
return scope.future {
|
|
277
222
|
// Wait for browser to be registered if it's not available yet
|
|
278
|
-
val
|
|
279
|
-
player
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
// non-root level is resolved per request: a gated path — including re-queries of the gate
|
|
284
|
-
// tile's own sentinel path — serves the single gate tile, so drilling into it re-shows the
|
|
285
|
-
// message instead of dead-ending in "No items"; an allowed path falls through to real
|
|
286
|
-
// children. Checked before the offline guard: gated content isn't coming back with
|
|
287
|
-
// connectivity, so the gate copy is the truer message.
|
|
288
|
-
if (parentId != BrowserPathHelper.ROOT_PATH) {
|
|
289
|
-
val outcome =
|
|
290
|
-
audioBrowser.gateDecision(
|
|
291
|
-
NativeGateRequest(reason = GateReason.BROWSE, path = parentId, search = null)
|
|
292
|
-
)
|
|
293
|
-
if (outcome.gated) {
|
|
294
|
-
audioBrowser.onGate(GateEvent(GateReason.BROWSE))
|
|
295
|
-
// gateDecision guarantees non-null chrome on a gated decision (override → default →
|
|
296
|
-
// built-in).
|
|
297
|
-
return@future LibraryResult.ofItemList(
|
|
298
|
-
ImmutableList.of(createGateMediaItem(outcome.chrome!!)),
|
|
299
|
-
params,
|
|
300
|
-
)
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// The error / offline tiles are dead-ends. Some controllers (e.g. Android Auto when online)
|
|
305
|
-
// treat a non-browsable tile as tappable and subscribe to its mediaId anyway; returning the
|
|
306
|
-
// error tile again here would push an endless stack of error pages. Return nothing instead.
|
|
307
|
-
// For the offline tile, re-send the alert when still offline so a tap surfaces the
|
|
308
|
-
// explanation again — but only then, since these paths are also re-queried by
|
|
309
|
-
// notifyChildrenChanged (e.g. when connectivity returns) without any user action.
|
|
310
|
-
if (parentId == BrowserPathHelper.OFFLINE_PATH || parentId == BrowserPathHelper.ERROR_PATH) {
|
|
311
|
-
if (parentId == BrowserPathHelper.OFFLINE_PATH && !player.networkMonitor.isOnline.value) {
|
|
312
|
-
sendBrowseError(session, browser, offline = true)
|
|
313
|
-
}
|
|
314
|
-
return@future LibraryResult.ofItemList(ImmutableList.of<MediaItem>(), params)
|
|
315
|
-
}
|
|
223
|
+
val browserManager =
|
|
224
|
+
player
|
|
225
|
+
.awaitBrowser()
|
|
226
|
+
.also { Timber.d("Browser ready, proceeding with onGetChildren") }
|
|
227
|
+
.browserManager
|
|
316
228
|
|
|
317
229
|
// Show offline error when offline:
|
|
318
230
|
if (
|
|
319
231
|
!player.networkMonitor.isOnline.value && browserManager.config.androidControllerOfflineError
|
|
320
232
|
) {
|
|
321
233
|
Timber.w("Network offline - returning error message for: $parentId")
|
|
322
|
-
sendBrowseError(session, browser, offline = true)
|
|
323
234
|
return@future LibraryResult.ofItemList(ImmutableList.of(createOfflineMediaItem()), params)
|
|
324
235
|
}
|
|
325
236
|
|
|
326
237
|
try {
|
|
238
|
+
// Get context and imageLoader for SVG pre-rendering
|
|
239
|
+
val context = player.context
|
|
240
|
+
val imageLoader = player.imageLoader
|
|
241
|
+
|
|
327
242
|
val children =
|
|
328
243
|
if (parentId == BrowserPathHelper.RECENT_PATH) {
|
|
329
244
|
// TODO: implement recent media items
|
|
@@ -331,90 +246,36 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
331
246
|
} else if (parentId == BrowserPathHelper.ROOT_PATH) {
|
|
332
247
|
// Return tabs as root children (limited to 4 for automotive platform compatibility)
|
|
333
248
|
// TODO: Check what Android Auto does with empty tabs list - may need to return error?
|
|
334
|
-
val tabs = browserManager.queryTabs()
|
|
335
|
-
if (
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
)
|
|
249
|
+
val tabs = browserManager.queryTabs().take(4)
|
|
250
|
+
if (imageLoader != null) {
|
|
251
|
+
tabs.map { tab -> TrackFactory.toMedia3WithSvgSupport(tab, context, imageLoader) }
|
|
252
|
+
} else {
|
|
253
|
+
tabs.map { tab -> TrackFactory.toMedia3(tab) }
|
|
339
254
|
}
|
|
340
|
-
toMediaItems(tabs.take(4))
|
|
341
255
|
} else {
|
|
342
256
|
// Resolve the specific path and get its children
|
|
343
257
|
val resolvedTrack = browserManager.resolve(parentId)
|
|
344
258
|
|
|
345
259
|
// Convert children to MediaItems (url is already set to contextual URL)
|
|
346
|
-
val trackChildren =
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
260
|
+
val trackChildren = resolvedTrack.children
|
|
261
|
+
?: throw IllegalStateException(
|
|
262
|
+
"Expected browsed ResolvedTrack to have a children array"
|
|
263
|
+
)
|
|
264
|
+
if (imageLoader != null) {
|
|
265
|
+
trackChildren.map { track -> TrackFactory.toMedia3WithSvgSupport(track, context, imageLoader) }
|
|
266
|
+
} else {
|
|
267
|
+
trackChildren.map { track -> TrackFactory.toMedia3(track) }
|
|
268
|
+
}
|
|
352
269
|
}
|
|
353
270
|
|
|
354
271
|
LibraryResult.ofItemList(ImmutableList.copyOf(children.paginate(page, pageSize)), params)
|
|
355
272
|
} catch (e: Exception) {
|
|
356
|
-
// A cancelled browse (controller disconnected) is not a failure — don't render it as an
|
|
357
|
-
// error tile. awaitBrowser's TimeoutCancellationException IS a real failure, keep that.
|
|
358
|
-
if (e is CancellationException && e !is TimeoutCancellationException) throw e
|
|
359
273
|
Timber.e(e, "Error getting children for parentId: $parentId")
|
|
360
|
-
|
|
361
|
-
// legacy browse bridge, which would otherwise leave an empty "No items" screen in Android
|
|
362
|
-
// Auto. See https://github.com/androidx/media/issues/2901
|
|
363
|
-
//
|
|
364
|
-
// Verified on a head unit (2026-06): the AA browse list NEVER renders error text — not for
|
|
365
|
-
// transient sendError, sticky non-fatal replication, or fatal replication
|
|
366
|
-
// (setLibraryErrorReplicationMode). Fatal replication does show the message on the
|
|
367
|
-
// playback screen, but presents the session as STATE_ERROR with no actions, hiding the
|
|
368
|
-
// now-playing item and transport controls — not worth it. Tiles remain the only in-browse
|
|
369
|
-
// signal we control.
|
|
370
|
-
sendBrowseError(session, browser, offline = false)
|
|
371
|
-
LibraryResult.ofItemList(ImmutableList.of(createBrowseErrorMediaItem()), params)
|
|
274
|
+
LibraryResult.ofError(SessionError.ERROR_UNKNOWN)
|
|
372
275
|
}
|
|
373
276
|
}
|
|
374
277
|
}
|
|
375
278
|
|
|
376
|
-
/**
|
|
377
|
-
* Sends a non-fatal [SessionError] to the controller whose browse failed, complementing the error
|
|
378
|
-
* tile. Media3 browsers receive it via MediaController.Listener.onError; for legacy controllers
|
|
379
|
-
* Media3 transiently attaches the error code/message to the platform session's playback state
|
|
380
|
-
* without entering STATE_ERROR.
|
|
381
|
-
*
|
|
382
|
-
* NOTE: current Android Auto renders NOTHING for this (verified on a head unit — see
|
|
383
|
-
* androidx/media#2901; the transient state is cleared microseconds after being set). It is kept
|
|
384
|
-
* because it is the correct Media3-API error signal, costs nothing, and becomes user-visible if
|
|
385
|
-
* Android Auto moves to consuming SessionError via the Media3 controller API.
|
|
386
|
-
*
|
|
387
|
-
* Dispatched to the main thread: the session and its legacy stub are application-thread bound.
|
|
388
|
-
*/
|
|
389
|
-
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
|
|
390
|
-
private fun sendBrowseError(
|
|
391
|
-
session: MediaLibraryService.MediaLibrarySession,
|
|
392
|
-
browser: MediaSession.ControllerInfo,
|
|
393
|
-
offline: Boolean,
|
|
394
|
-
) {
|
|
395
|
-
val message =
|
|
396
|
-
player.context.getString(
|
|
397
|
-
if (offline) com.audiobrowser.R.string.audio_browser_offline_error
|
|
398
|
-
else com.audiobrowser.R.string.audio_browser_browse_error
|
|
399
|
-
)
|
|
400
|
-
val code = if (offline) SessionError.ERROR_IO else SessionError.ERROR_UNKNOWN
|
|
401
|
-
scope.launch(Dispatchers.Main) { session.sendError(browser, SessionError(code, message)) }
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* Converts tracks to MediaItems for browse delivery, routing http(s) artwork through the
|
|
406
|
-
* content:// provider so Android Auto can load it via the ArtworkContentProvider. Image-row
|
|
407
|
-
* tracks (a CarPlay-only rendering) are expanded into their items as regular grouped rows first —
|
|
408
|
-
* see [TrackFactory.expandImageRows].
|
|
409
|
-
*/
|
|
410
|
-
private fun toMediaItems(tracks: List<Track>): List<MediaItem> {
|
|
411
|
-
val registry = player.browseArtworkRegistry
|
|
412
|
-
val authority = com.audiobrowser.util.ArtworkUris.authorityFor(player.context.packageName)
|
|
413
|
-
return TrackFactory.expandImageRows(tracks).map {
|
|
414
|
-
TrackFactory.toBrowseMediaItem(it, registry, authority)
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
279
|
override fun onGetItem(
|
|
419
280
|
session: MediaLibraryService.MediaLibrarySession,
|
|
420
281
|
browser: MediaSession.ControllerInfo,
|
|
@@ -427,30 +288,6 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
427
288
|
return@future LibraryResult.ofItem(createOfflineMediaItem(), null)
|
|
428
289
|
}
|
|
429
290
|
|
|
430
|
-
// Return the error tile as a non-browsable item so tapping it can't re-browse into a
|
|
431
|
-
// failing path (which would push another error page onto the stack).
|
|
432
|
-
if (mediaId == BrowserPathHelper.ERROR_PATH) {
|
|
433
|
-
return@future LibraryResult.ofItem(createBrowseErrorMediaItem(), null)
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
if (mediaId == BrowserPathHelper.GATE_PATH) {
|
|
437
|
-
// A direct fetch of the gate tile's own sentinel (a controller re-reading the item it was
|
|
438
|
-
// served). Resolve the chrome for the gate path but do NOT emit onGate — that fires at the
|
|
439
|
-
// browse/search serve sites, not on an item lookup.
|
|
440
|
-
val outcome =
|
|
441
|
-
player
|
|
442
|
-
.awaitBrowser()
|
|
443
|
-
.gateDecision(
|
|
444
|
-
NativeGateRequest(
|
|
445
|
-
reason = GateReason.BROWSE,
|
|
446
|
-
path = BrowserPathHelper.GATE_PATH,
|
|
447
|
-
search = null,
|
|
448
|
-
)
|
|
449
|
-
)
|
|
450
|
-
if (!outcome.gated) return@future LibraryResult.ofError(SessionError.ERROR_BAD_VALUE)
|
|
451
|
-
return@future LibraryResult.ofItem(createGateMediaItem(outcome.chrome!!), null)
|
|
452
|
-
}
|
|
453
|
-
|
|
454
291
|
if (mediaId == BrowserPathHelper.ROOT_PATH || mediaId == BrowserPathHelper.RECENT_PATH) {
|
|
455
292
|
return@future LibraryResult.ofItem(
|
|
456
293
|
MediaItem.Builder()
|
|
@@ -466,33 +303,11 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
466
303
|
// Wait for browser to be registered if it's not available yet
|
|
467
304
|
val browserManager = player.awaitBrowser().browserManager
|
|
468
305
|
|
|
469
|
-
// Serve tracks from the track cache first (keyed by url and src). Besides avoiding an HTTP
|
|
470
|
-
// resolve, this keeps item identity correct for contextual mediaIds: resolve() strips
|
|
471
|
-
// __trackId and would return the *parent container's* metadata as the item.
|
|
472
|
-
val browseAuthority =
|
|
473
|
-
com.audiobrowser.util.ArtworkUris.authorityFor(player.context.packageName)
|
|
474
|
-
browserManager.getCachedTrack(mediaId)?.let { track ->
|
|
475
|
-
return@future LibraryResult.ofItem(
|
|
476
|
-
TrackFactory.toBrowseMediaItem(track, player.browseArtworkRegistry, browseAuthority),
|
|
477
|
-
null,
|
|
478
|
-
)
|
|
479
|
-
}
|
|
480
|
-
|
|
481
306
|
try {
|
|
482
307
|
val resolvedTrack = browserManager.resolve(mediaId)
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
// and the item's tag is a Track, as fromMedia3 expects.
|
|
486
|
-
LibraryResult.ofItem(
|
|
487
|
-
TrackFactory.toBrowseMediaItem(
|
|
488
|
-
resolvedTrack.toTrack(),
|
|
489
|
-
player.browseArtworkRegistry,
|
|
490
|
-
browseAuthority,
|
|
491
|
-
),
|
|
492
|
-
null,
|
|
493
|
-
)
|
|
308
|
+
val mediaItem = ResolvedTrackFactory.toMedia3(resolvedTrack)
|
|
309
|
+
LibraryResult.ofItem(mediaItem, null)
|
|
494
310
|
} catch (e: Exception) {
|
|
495
|
-
if (e is CancellationException && e !is TimeoutCancellationException) throw e
|
|
496
311
|
Timber.e(e, "Error getting item for mediaId: $mediaId")
|
|
497
312
|
LibraryResult.ofError(SessionError.ERROR_UNKNOWN)
|
|
498
313
|
}
|
|
@@ -507,17 +322,8 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
507
322
|
): ListenableFuture<LibraryResult<Void>> {
|
|
508
323
|
Timber.d("onSubscribe: ${browser.packageName}, parentId = $parentId")
|
|
509
324
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
// Don't call super: Media3's default onSubscribe validates the parent by calling
|
|
513
|
-
// onGetItem(parentId), which for us is a full resolve() — an HTTP fetch whose result the
|
|
514
|
-
// legacy stub discards for Android Auto controllers. onGetChildren already surfaces browse
|
|
515
|
-
// failures. Keep the default's other behavior: notify Media3 (non-legacy) browsers so they
|
|
516
|
-
// fetch the children; legacy browsers get onLoadChildren from the framework after subscribing.
|
|
517
|
-
if (browser.controllerVersion != MediaSession.ControllerInfo.LEGACY_CONTROLLER_VERSION) {
|
|
518
|
-
session.notifyChildrenChanged(browser, parentId, Int.MAX_VALUE, params)
|
|
519
|
-
}
|
|
520
|
-
return Futures.immediateFuture(LibraryResult.ofVoid())
|
|
325
|
+
parentIdSubscriptions.getOrPut(parentId) { mutableSetOf() }.add(browser)
|
|
326
|
+
return super.onSubscribe(session, browser, parentId, params)
|
|
521
327
|
}
|
|
522
328
|
|
|
523
329
|
override fun onUnsubscribe(
|
|
@@ -527,11 +333,9 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
527
333
|
): ListenableFuture<LibraryResult<Void>> {
|
|
528
334
|
Timber.d("onUnsubscribe: ${browser.packageName}, parentId = $parentId")
|
|
529
335
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
parentIdSubscriptions.remove(parentId)
|
|
534
|
-
}
|
|
336
|
+
parentIdSubscriptions[parentId]?.remove(browser)
|
|
337
|
+
if (parentIdSubscriptions[parentId]?.isEmpty() == true) {
|
|
338
|
+
parentIdSubscriptions.remove(parentId)
|
|
535
339
|
}
|
|
536
340
|
|
|
537
341
|
return super.onUnsubscribe(session, browser, parentId)
|
|
@@ -540,38 +344,22 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
540
344
|
/**
|
|
541
345
|
* Notifies all subscribed controllers to refresh their content. Called internally when network
|
|
542
346
|
* state changes to refresh all subscribed paths.
|
|
543
|
-
*
|
|
544
|
-
* Safe to call from any thread: snapshots the subscribed paths and dispatches the session calls
|
|
545
|
-
* to the main (Media3 application) thread.
|
|
546
347
|
*/
|
|
547
348
|
private fun notifySubscribedChildrenChanged() {
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
scope.launch(Dispatchers.Main) {
|
|
551
|
-
parentIds.forEach { parentId -> session.notifyChildrenChanged(parentId, Int.MAX_VALUE, null) }
|
|
349
|
+
parentIdSubscriptions.keys.forEach { parentId ->
|
|
350
|
+
mediaLibrarySession?.notifyChildrenChanged(parentId, Int.MAX_VALUE, null)
|
|
552
351
|
}
|
|
553
352
|
}
|
|
554
353
|
|
|
555
354
|
/**
|
|
556
355
|
* Notifies external controllers that content at the given path has changed. Controllers
|
|
557
|
-
* subscribed to this path will refresh their UI.
|
|
356
|
+
* subscribed to this path will refresh their UI.
|
|
558
357
|
*
|
|
559
358
|
* @param path The path where content has changed
|
|
560
359
|
*/
|
|
561
360
|
fun notifyContentChanged(path: String) {
|
|
562
361
|
Timber.d("Notifying content changed for path: $path")
|
|
563
|
-
|
|
564
|
-
scope.launch(Dispatchers.Main) { session.notifyChildrenChanged(path, Int.MAX_VALUE, null) }
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
/**
|
|
568
|
-
* Notifies all subscribed controllers that content everywhere has changed (e.g. on a locale
|
|
569
|
-
* switch) so they re-query their children. Pairs with AudioBrowser.invalidateAllContent(), which
|
|
570
|
-
* clears the content cache first.
|
|
571
|
-
*/
|
|
572
|
-
fun invalidateAllContent() {
|
|
573
|
-
Timber.d("Invalidating all content - notifying all subscribed paths")
|
|
574
|
-
notifySubscribedChildrenChanged()
|
|
362
|
+
mediaLibrarySession?.notifyChildrenChanged(path, Int.MAX_VALUE, null)
|
|
575
363
|
}
|
|
576
364
|
|
|
577
365
|
/**
|
|
@@ -579,15 +367,10 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
579
367
|
* controllers to refresh their content.
|
|
580
368
|
*/
|
|
581
369
|
fun notifyBrowserReady() {
|
|
582
|
-
Timber.d("Browser ready - notifying
|
|
370
|
+
Timber.d("Browser ready - notifying ${parentIdSubscriptions.size} subscribed paths")
|
|
583
371
|
notifySubscribedChildrenChanged()
|
|
584
372
|
}
|
|
585
373
|
|
|
586
|
-
/** Cancels in-flight browse/search work. Call when the owning player is destroyed. */
|
|
587
|
-
fun destroy() {
|
|
588
|
-
scope.cancel()
|
|
589
|
-
}
|
|
590
|
-
|
|
591
374
|
override fun onSearch(
|
|
592
375
|
session: MediaLibraryService.MediaLibrarySession,
|
|
593
376
|
browser: MediaSession.ControllerInfo,
|
|
@@ -596,27 +379,11 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
596
379
|
): ListenableFuture<LibraryResult<Void>> {
|
|
597
380
|
Timber.d("onSearch: ${browser.packageName}, query = $query")
|
|
598
381
|
return scope.future {
|
|
599
|
-
|
|
600
|
-
// doesn't fail before JS has configured the browser.
|
|
601
|
-
val audioBrowser =
|
|
602
|
-
try {
|
|
603
|
-
player.awaitBrowser()
|
|
604
|
-
} catch (e: TimeoutCancellationException) {
|
|
605
|
-
Timber.w("Timed out waiting for browser - search not available")
|
|
606
|
-
return@future LibraryResult.ofError(SessionError.ERROR_NOT_SUPPORTED)
|
|
607
|
-
}
|
|
608
|
-
val browserManager = audioBrowser.browserManager
|
|
382
|
+
val browserManager = player.browser?.browserManager
|
|
609
383
|
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
audioBrowser.gateDecision(
|
|
614
|
-
NativeGateRequest(reason = GateReason.SEARCH, path = null, search = searchParams(query))
|
|
615
|
-
)
|
|
616
|
-
if (searchOutcome.gated) {
|
|
617
|
-
audioBrowser.onGate(GateEvent(GateReason.SEARCH))
|
|
618
|
-
session.notifySearchResultChanged(browser, query, 1, params)
|
|
619
|
-
return@future LibraryResult.ofVoid()
|
|
384
|
+
if (browserManager == null) {
|
|
385
|
+
Timber.w("AudioBrowser not registered - search not available")
|
|
386
|
+
return@future LibraryResult.ofError(SessionError.ERROR_NOT_SUPPORTED)
|
|
620
387
|
}
|
|
621
388
|
|
|
622
389
|
// Check if search is configured
|
|
@@ -637,7 +404,6 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
637
404
|
|
|
638
405
|
LibraryResult.ofVoid()
|
|
639
406
|
} catch (e: Exception) {
|
|
640
|
-
if (e is CancellationException && e !is TimeoutCancellationException) throw e
|
|
641
407
|
Timber.e(e, "Error during search for query: $query")
|
|
642
408
|
LibraryResult.ofError(SessionError.ERROR_UNKNOWN)
|
|
643
409
|
}
|
|
@@ -656,38 +422,21 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
656
422
|
"onGetSearchResult: ${browser.packageName}, query = $query, page = $page, pageSize = $pageSize"
|
|
657
423
|
)
|
|
658
424
|
return scope.future {
|
|
659
|
-
val
|
|
660
|
-
try {
|
|
661
|
-
player.awaitBrowser()
|
|
662
|
-
} catch (e: TimeoutCancellationException) {
|
|
663
|
-
Timber.w("Timed out waiting for browser - search not available")
|
|
664
|
-
return@future LibraryResult.ofError(SessionError.ERROR_NOT_SUPPORTED)
|
|
665
|
-
}
|
|
666
|
-
val browserManager = audioBrowser.browserManager
|
|
425
|
+
val browserManager = player.browser?.browserManager
|
|
667
426
|
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
NativeGateRequest(reason = GateReason.SEARCH, path = null, search = searchParams(query))
|
|
672
|
-
)
|
|
673
|
-
if (searchOutcome.gated) {
|
|
674
|
-
audioBrowser.onGate(GateEvent(GateReason.SEARCH))
|
|
675
|
-
return@future LibraryResult.ofItemList(
|
|
676
|
-
ImmutableList.of(createGateMediaItem(searchOutcome.chrome!!)),
|
|
677
|
-
params,
|
|
678
|
-
)
|
|
427
|
+
if (browserManager == null) {
|
|
428
|
+
Timber.w("AudioBrowser not registered - search not available")
|
|
429
|
+
return@future LibraryResult.ofError(SessionError.ERROR_NOT_SUPPORTED)
|
|
679
430
|
}
|
|
680
431
|
|
|
681
432
|
try {
|
|
682
433
|
// Get cached search results from BrowserManager
|
|
683
434
|
browserManager.getCachedSearchResults(query)?.let { tracks ->
|
|
684
435
|
// Convert to MediaItems
|
|
685
|
-
val searchAuthority =
|
|
686
|
-
com.audiobrowser.util.ArtworkUris.authorityFor(player.context.packageName)
|
|
687
436
|
val mediaItems =
|
|
688
437
|
tracks.map { track ->
|
|
689
438
|
Timber.d("Search result: ${track.title} (url=${track.url}, src=${track.src})")
|
|
690
|
-
TrackFactory.
|
|
439
|
+
TrackFactory.toMedia3(track)
|
|
691
440
|
}
|
|
692
441
|
|
|
693
442
|
val paginatedItems = mediaItems.paginate(page, pageSize)
|
|
@@ -699,7 +448,6 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
699
448
|
LibraryResult.ofItemList(ImmutableList.of(), params)
|
|
700
449
|
}
|
|
701
450
|
} catch (e: Exception) {
|
|
702
|
-
if (e is CancellationException && e !is TimeoutCancellationException) throw e
|
|
703
451
|
Timber.e(e, "Error getting search results for query: $query")
|
|
704
452
|
LibraryResult.ofError(SessionError.ERROR_UNKNOWN)
|
|
705
453
|
}
|
|
@@ -714,84 +462,65 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
714
462
|
startPositionMs: Long,
|
|
715
463
|
): ListenableFuture<MediaSession.MediaItemsWithStartPosition> {
|
|
716
464
|
Timber.Forest.d(
|
|
717
|
-
"onSetMediaItems: ${controller.packageName}, count=${mediaItems.size}, mediaId=${mediaItems.
|
|
465
|
+
"onSetMediaItems: ${controller.packageName}, count=${mediaItems.size}, mediaId=${mediaItems[0].mediaId}, uri=${mediaItems[0].localConfiguration?.uri}, title=${mediaItems[0].mediaMetadata.title}"
|
|
718
466
|
)
|
|
719
467
|
|
|
720
|
-
if (mediaItems.isEmpty()) {
|
|
721
|
-
return Futures.immediateFuture(
|
|
722
|
-
MediaSession.MediaItemsWithStartPosition(emptyList(), 0, startPositionMs)
|
|
723
|
-
)
|
|
724
|
-
}
|
|
725
|
-
|
|
726
468
|
return scope.future {
|
|
727
469
|
val audioBrowser = player.awaitBrowser()
|
|
728
470
|
|
|
729
|
-
// Helper: returns the current player state unchanged so Media3 doesn't modify playback
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
471
|
+
// Helper: returns the current player state unchanged so Media3 doesn't modify playback
|
|
472
|
+
fun currentPlayerState(): MediaSession.MediaItemsWithStartPosition {
|
|
473
|
+
val currentItems = player.tracks.map { TrackFactory.toMedia3(it) }
|
|
474
|
+
val currentIndex = player.currentIndex ?: 0
|
|
475
|
+
return MediaSession.MediaItemsWithStartPosition(
|
|
476
|
+
currentItems,
|
|
477
|
+
currentIndex,
|
|
478
|
+
startPositionMs,
|
|
479
|
+
)
|
|
480
|
+
}
|
|
739
481
|
|
|
740
|
-
//
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
val track = queueTracks[index]
|
|
763
|
-
return@future handleTrackLoad(
|
|
764
|
-
audioBrowser.configuration.handleTrackLoad,
|
|
765
|
-
track,
|
|
766
|
-
queueTracks,
|
|
767
|
-
index.toDouble(),
|
|
768
|
-
::currentPlayerState,
|
|
769
|
-
) {
|
|
770
|
-
// Return the existing queue items with the new start index
|
|
771
|
-
val existingItems = queueTracks.map { TrackFactory.toMedia3(it) }
|
|
772
|
-
MediaSession.MediaItemsWithStartPosition(existingItems, index, startPositionMs)
|
|
482
|
+
// Check if this is a single contextual URL that matches the current queue source
|
|
483
|
+
if (mediaItems.size == 1) {
|
|
484
|
+
val mediaId = mediaItems[0].mediaId
|
|
485
|
+
if (BrowserPathHelper.isContextual(mediaId)) {
|
|
486
|
+
val parentPath = BrowserPathHelper.stripTrackId(mediaId)
|
|
487
|
+
val trackId = BrowserPathHelper.extractTrackId(mediaId)
|
|
488
|
+
|
|
489
|
+
// Check if queue already came from this parent path - just skip to the track
|
|
490
|
+
if (trackId != null && parentPath == player.queueSourcePath) {
|
|
491
|
+
val index = player.tracks.indexOfFirst { it.src == trackId }
|
|
492
|
+
if (index >= 0) {
|
|
493
|
+
Timber.d("Queue already from $parentPath, skipping to index $index")
|
|
494
|
+
val track = player.tracks[index]
|
|
495
|
+
return@future handleTrackLoad(audioBrowser.configuration.handleTrackLoad, track, player.tracks, index.toDouble(), ::currentPlayerState) {
|
|
496
|
+
// Return the existing queue items with the new start index
|
|
497
|
+
val existingItems = player.tracks.map { TrackFactory.toMedia3(it) }
|
|
498
|
+
MediaSession.MediaItemsWithStartPosition(
|
|
499
|
+
existingItems,
|
|
500
|
+
index,
|
|
501
|
+
startPositionMs,
|
|
502
|
+
)
|
|
503
|
+
}
|
|
773
504
|
}
|
|
774
505
|
}
|
|
775
506
|
}
|
|
776
507
|
}
|
|
777
508
|
|
|
509
|
+
val browserManager = audioBrowser.browserManager
|
|
778
510
|
val result =
|
|
779
511
|
browserManager.resolveMediaItemsForPlayback(mediaItems, startIndex, startPositionMs)
|
|
780
512
|
|
|
781
513
|
val tracks = result.mediaItems.map { TrackFactory.fromMedia3(it) }.toTypedArray()
|
|
782
514
|
val selectedTrack = tracks.getOrElse(result.startIndex) { tracks.first() }
|
|
783
515
|
|
|
784
|
-
handleTrackLoad(
|
|
785
|
-
audioBrowser.configuration.handleTrackLoad,
|
|
786
|
-
selectedTrack,
|
|
787
|
-
tracks,
|
|
788
|
-
result.startIndex.toDouble(),
|
|
789
|
-
::currentPlayerState,
|
|
790
|
-
) {
|
|
516
|
+
handleTrackLoad(audioBrowser.configuration.handleTrackLoad, selectedTrack, tracks, result.startIndex.toDouble(), ::currentPlayerState) {
|
|
791
517
|
// If this was a contextual URL expansion, track the source path (only for default behavior)
|
|
792
|
-
if (
|
|
793
|
-
val
|
|
794
|
-
|
|
518
|
+
if (mediaItems.size == 1) {
|
|
519
|
+
val mediaId = mediaItems[0].mediaId
|
|
520
|
+
if (BrowserPathHelper.isContextual(mediaId)) {
|
|
521
|
+
val parentPath = BrowserPathHelper.stripTrackId(mediaId)
|
|
522
|
+
withContext(Dispatchers.Main) { player.queueSourcePath = parentPath }
|
|
523
|
+
}
|
|
795
524
|
}
|
|
796
525
|
result
|
|
797
526
|
}
|
|
@@ -808,42 +537,25 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
808
537
|
*
|
|
809
538
|
* @param mediaSession The media session
|
|
810
539
|
* @param controller The controller requesting resumption
|
|
811
|
-
* @param
|
|
812
|
-
* boot-time resumption notification (no network; local metadata only).
|
|
540
|
+
* @param playback True if playback should start, false if just gathering info for UI
|
|
813
541
|
* @see https://developer.android.com/media/media3/session/background-playback#resumption
|
|
814
542
|
*/
|
|
815
543
|
override fun onPlaybackResumption(
|
|
816
544
|
mediaSession: MediaSession,
|
|
817
545
|
controller: MediaSession.ControllerInfo,
|
|
818
|
-
isForPlayback: Boolean,
|
|
819
546
|
): ListenableFuture<MediaSession.MediaItemsWithStartPosition> {
|
|
820
547
|
Timber.d("${controller.packageName}")
|
|
821
548
|
|
|
822
549
|
return scope.future {
|
|
823
|
-
//
|
|
824
|
-
// live player, emitting option-changed events to JS) belong to actual resumption only.
|
|
550
|
+
// Restore player settings and persisted state
|
|
825
551
|
val state =
|
|
826
|
-
|
|
552
|
+
// restore() sets player properties which must happen on main thread
|
|
553
|
+
withContext(Dispatchers.Main) { player.playbackStateStore.restore() }
|
|
827
554
|
?: run {
|
|
828
555
|
Timber.w("No persisted playback state found")
|
|
829
556
|
throw IllegalStateException("No playback state to resume")
|
|
830
557
|
}
|
|
831
558
|
|
|
832
|
-
// isForPlayback == false is the device-boot-time notification case: network may be
|
|
833
|
-
// unavailable and we must not start playback. Return just the locally-stored track with its
|
|
834
|
-
// already-local metadata; skip the settings restore and network queue expansion below.
|
|
835
|
-
if (!isForPlayback) {
|
|
836
|
-
Timber.d("Info-gathering resumption (boot-time); returning stored track without expansion")
|
|
837
|
-
return@future MediaSession.MediaItemsWithStartPosition(
|
|
838
|
-
ImmutableList.of(TrackFactory.toMedia3(state.track)),
|
|
839
|
-
0,
|
|
840
|
-
state.positionMs,
|
|
841
|
-
)
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
// restore() sets player properties which must happen on main thread
|
|
845
|
-
withContext(Dispatchers.Main) { player.playbackStateStore.restore() }
|
|
846
|
-
|
|
847
559
|
val url = state.track.url
|
|
848
560
|
Timber.d("Resuming from url=$url, positionMs=${state.positionMs}")
|
|
849
561
|
|