react-native-audio-browser 0.2.0-next.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +148 -433
- 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 +196 -804
- 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/ServiceBinding.kt +0 -46
- 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/ServiceBindingTest.kt +0 -68
- 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 -123
- 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
|
@@ -7,13 +7,10 @@ import com.audiobrowser.http.HttpClient
|
|
|
7
7
|
import com.audiobrowser.http.RequestConfigBuilder
|
|
8
8
|
import com.audiobrowser.util.BrowserPathHelper
|
|
9
9
|
import com.audiobrowser.util.TrackFactory
|
|
10
|
-
import com.audiobrowser.util.artworkOf
|
|
11
10
|
import com.margelo.nitro.audiobrowser.ArtworkRequestConfig
|
|
12
11
|
import com.margelo.nitro.audiobrowser.BrowserSourceCallbackParam
|
|
13
|
-
import com.margelo.nitro.audiobrowser.FavoritesMatchMode
|
|
14
|
-
import com.margelo.nitro.audiobrowser.Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____
|
|
15
12
|
import com.margelo.nitro.audiobrowser.ImageContext
|
|
16
|
-
import com.margelo.nitro.audiobrowser.
|
|
13
|
+
import com.margelo.nitro.audiobrowser.ImageSource
|
|
17
14
|
import com.margelo.nitro.audiobrowser.MediaRequestConfig
|
|
18
15
|
import com.margelo.nitro.audiobrowser.NativeRouteEntry
|
|
19
16
|
import com.margelo.nitro.audiobrowser.RequestConfig
|
|
@@ -49,7 +46,6 @@ class BrowserManager {
|
|
|
49
46
|
private var onPathChanged: ((String) -> Unit)? = null
|
|
50
47
|
private var onContentChanged: ((ResolvedTrack?) -> Unit)? = null
|
|
51
48
|
private var onTabsChanged: ((Array<Track>) -> Unit)? = null
|
|
52
|
-
private var onArtworkRegistriesCleared: (() -> Unit)? = null
|
|
53
49
|
|
|
54
50
|
private var path: String = "/"
|
|
55
51
|
set(value) {
|
|
@@ -90,64 +86,28 @@ class BrowserManager {
|
|
|
90
86
|
// Invalidated via invalidateContentCache() when content changes
|
|
91
87
|
private val contentCache = LruCache<String, ResolvedTrack>(20)
|
|
92
88
|
|
|
93
|
-
// Cache for
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
// Cache for search results - keyed by query string
|
|
90
|
+
private var lastSearchQuery: String? = null
|
|
91
|
+
private var lastSearchResults: Array<Track>? = null
|
|
96
92
|
|
|
97
93
|
// Set of favorited track identifiers (src)
|
|
98
94
|
private var favoriteIds = setOf<String>()
|
|
99
95
|
|
|
100
|
-
// Favorite match mode, propagated from the player's `favorite` capability.
|
|
101
|
-
// null = favoriting disabled (no row hearts). Set via setFavoriteMatch.
|
|
102
|
-
private var favoriteMatch: FavoritesMatchMode? = null
|
|
103
|
-
|
|
104
96
|
// Navigation tracking to prevent race conditions
|
|
105
97
|
@Volatile private var currentNavigationId = 0
|
|
106
98
|
|
|
107
99
|
/**
|
|
108
100
|
* Browser configuration containing routes, search, tabs, and request settings. This can be
|
|
109
101
|
* updated dynamically when the configuration changes.
|
|
110
|
-
*
|
|
111
|
-
* Setting a new config bumps [layerGeneration] so the cached request/browse resolver layers are
|
|
112
|
-
* re-resolved on the next request (the resolvers may close over config-derived state).
|
|
113
102
|
*/
|
|
114
103
|
var config: BrowserConfig = BrowserConfig()
|
|
115
|
-
set(value) {
|
|
116
|
-
field = value
|
|
117
|
-
layerGeneration += 1
|
|
118
|
-
// Registered artwork resolutions pin configs (and their JS callback handles)
|
|
119
|
-
// from the previous configuration — never resolve through them again.
|
|
120
|
-
artworkResolutions.clear()
|
|
121
|
-
onArtworkRegistriesCleared?.invoke()
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Resolver-layer caching. The request/browse layers may be resolver thunks
|
|
125
|
-
// (config.requestResolver / config.browseResolver) resolved once per *content generation*:
|
|
126
|
-
// re-resolved when content is invalidated (clearContentCache, from invalidateAllContent) or when
|
|
127
|
-
// a new config is set, cached, and merged per request.
|
|
128
|
-
private var layerGeneration = 0
|
|
129
|
-
private var resolvedLayerGeneration = -1
|
|
130
|
-
private var resolvedRequestLayer: TransformableRequestConfig? = null
|
|
131
|
-
private var resolvedBrowseLayer: TransformableRequestConfig? = null
|
|
132
|
-
|
|
133
|
-
/** Test-only accessors for the resolver-layer cache state (see ensureLayersResolved). */
|
|
134
|
-
internal val layerGenerationForTest: Int
|
|
135
|
-
get() = layerGeneration
|
|
136
|
-
|
|
137
|
-
internal val resolvedLayerGenerationForTest: Int
|
|
138
|
-
get() = resolvedLayerGeneration
|
|
139
|
-
|
|
140
|
-
internal val resolvedRequestLayerForTest: TransformableRequestConfig?
|
|
141
|
-
get() = resolvedRequestLayer
|
|
142
|
-
|
|
143
|
-
internal val resolvedBrowseLayerForTest: TransformableRequestConfig?
|
|
144
|
-
get() = resolvedBrowseLayer
|
|
145
104
|
|
|
146
105
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
106
|
+
* Callback to transform artwork URLs for tracks. Takes a track and optional per-route artwork
|
|
107
|
+
* config, returns ImageSource or null. Injected by AudioBrowser when artwork config is set.
|
|
108
|
+
* The ImageContext parameter provides size hints for CDN URL generation.
|
|
149
109
|
*/
|
|
150
|
-
|
|
110
|
+
var artworkUrlResolver: (suspend (Track, ArtworkRequestConfig?, ImageContext?) -> ImageSource?)? = null
|
|
151
111
|
|
|
152
112
|
/**
|
|
153
113
|
* Sets the favorited track identifiers. Tracks will have their favorited field hydrated based on
|
|
@@ -158,14 +118,6 @@ class BrowserManager {
|
|
|
158
118
|
Timber.d("Set ${favoriteIds.size} favorite IDs")
|
|
159
119
|
}
|
|
160
120
|
|
|
161
|
-
/**
|
|
162
|
-
* Sets the favorite match mode (propagated from the `favorite` capability). null disables
|
|
163
|
-
* row-heart hydration.
|
|
164
|
-
*/
|
|
165
|
-
fun setFavoriteMatch(match: FavoritesMatchMode?) {
|
|
166
|
-
favoriteMatch = match
|
|
167
|
-
}
|
|
168
|
-
|
|
169
121
|
/**
|
|
170
122
|
* Updates the favorite state for a single track identifier. Called when the heart button is
|
|
171
123
|
* tapped in media controllers.
|
|
@@ -181,30 +133,40 @@ class BrowserManager {
|
|
|
181
133
|
}
|
|
182
134
|
|
|
183
135
|
/**
|
|
184
|
-
* Hydrates the favorited field on a track based on the favoriteIds set.
|
|
185
|
-
* is
|
|
186
|
-
*
|
|
187
|
-
* overwrite API-provided values.
|
|
136
|
+
* Hydrates the favorited field on a track based on the favoriteIds set. Only hydrates if
|
|
137
|
+
* track.favorited is null (doesn't overwrite API-provided values). Only tracks with src can be
|
|
138
|
+
* favorited.
|
|
188
139
|
*/
|
|
189
140
|
private fun hydrateFavorite(track: Track): Track {
|
|
190
|
-
val match = favoriteMatch ?: return track
|
|
191
141
|
// Don't overwrite API-provided favorites
|
|
192
142
|
if (track.favorited != null) return track
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return
|
|
143
|
+
if (favoriteIds.isEmpty()) return track
|
|
144
|
+
|
|
145
|
+
val isFavorited = track.src?.let { favoriteIds.contains(it) } ?: false
|
|
146
|
+
if (!isFavorited) return track
|
|
147
|
+
|
|
148
|
+
return Track(
|
|
149
|
+
url = track.url,
|
|
150
|
+
src = track.src,
|
|
151
|
+
artwork = track.artwork,
|
|
152
|
+
artworkSource = track.artworkSource,
|
|
153
|
+
artworkCarPlayTinted = track.artworkCarPlayTinted,
|
|
154
|
+
title = track.title,
|
|
155
|
+
subtitle = track.subtitle,
|
|
156
|
+
artist = track.artist,
|
|
157
|
+
album = track.album,
|
|
158
|
+
description = track.description,
|
|
159
|
+
genre = track.genre,
|
|
160
|
+
duration = track.duration,
|
|
161
|
+
style = track.style,
|
|
162
|
+
childrenStyle = track.childrenStyle,
|
|
163
|
+
favorited = true,
|
|
164
|
+
groupTitle = track.groupTitle,
|
|
165
|
+
live = track.live,
|
|
166
|
+
imageRow = track.imageRow,
|
|
167
|
+
)
|
|
199
168
|
}
|
|
200
169
|
|
|
201
|
-
/** Whether [src] is favorited under the given match mode. */
|
|
202
|
-
private fun isFavorite(src: String, match: FavoritesMatchMode): Boolean =
|
|
203
|
-
when (match) {
|
|
204
|
-
FavoritesMatchMode.EXACT -> favoriteIds.contains(src)
|
|
205
|
-
FavoritesMatchMode.PARTIAL -> favoriteIds.any { BrowserPathHelper.containsSegment(src, it) }
|
|
206
|
-
}
|
|
207
|
-
|
|
208
170
|
/** Hydrates favorites on all children of a ResolvedTrack. */
|
|
209
171
|
private fun hydrateChildren(resolvedTrack: ResolvedTrack): ResolvedTrack {
|
|
210
172
|
val children = resolvedTrack.children ?: return resolvedTrack
|
|
@@ -212,29 +174,20 @@ class BrowserManager {
|
|
|
212
174
|
return resolvedTrack.copy(children = hydratedChildren)
|
|
213
175
|
}
|
|
214
176
|
|
|
215
|
-
/** Cache a track by
|
|
177
|
+
/** Cache a track by both url and src for O(1) lookup from either key. */
|
|
216
178
|
private fun cacheTrack(track: Track) {
|
|
217
|
-
track.id?.takeUnless { it.isBlank() }?.let { trackCache.put(it, track) }
|
|
218
179
|
track.url?.let { trackCache.put(it, track) }
|
|
219
180
|
track.src?.let { trackCache.put(it, track) }
|
|
220
181
|
}
|
|
221
182
|
|
|
222
183
|
private fun cacheChildren(resolvedTrack: ResolvedTrack) {
|
|
223
|
-
resolvedTrack.children?.forEach { track ->
|
|
224
|
-
cacheTrack(track)
|
|
225
|
-
// Image-row items are playable surfaces of their own: cache them (with
|
|
226
|
-
// their stamped contextual urls) so an id-keyed mediaId from an
|
|
227
|
-
// expanded Android Auto tile can find its way back to queue expansion.
|
|
228
|
-
track.imageRow?.forEach { item ->
|
|
229
|
-
cacheTrack(with(TrackFactory) { item.toTrack(groupTitle = track.title) })
|
|
230
|
-
}
|
|
231
|
-
}
|
|
184
|
+
resolvedTrack.children?.forEach { track -> cacheTrack(track) }
|
|
232
185
|
}
|
|
233
186
|
|
|
234
187
|
/**
|
|
235
|
-
* Get a cached Track by mediaId (
|
|
236
|
-
*
|
|
237
|
-
*
|
|
188
|
+
* Get a cached Track by mediaId (url or src), or null if not cached. Used by Media3 to rehydrate
|
|
189
|
+
* MediaItem shells with full track metadata. Re-hydrates favorites in case setFavoriteStates was
|
|
190
|
+
* called after caching.
|
|
238
191
|
*/
|
|
239
192
|
fun getCachedTrack(mediaId: String): Track? {
|
|
240
193
|
// Try direct lookup first (matches url or src)
|
|
@@ -259,76 +212,27 @@ class BrowserManager {
|
|
|
259
212
|
}
|
|
260
213
|
|
|
261
214
|
/**
|
|
262
|
-
* Resolves
|
|
263
|
-
*
|
|
264
|
-
* resolves through the track cache to the contextual url of the container it was most recently
|
|
265
|
-
* browsed in — a legacy car controller round-trips only the mediaId, so the cache is what
|
|
266
|
-
* remembers which list the row came from.
|
|
267
|
-
*/
|
|
268
|
-
fun contextualUrlFor(mediaId: String): String? {
|
|
269
|
-
if (BrowserPathHelper.isContextual(mediaId)) return mediaId
|
|
270
|
-
return getCachedTrack(mediaId)?.url?.takeIf { BrowserPathHelper.isContextual(it) }
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Resolves a single Media3 MediaItem to a Track. Prefers the track cache (keyed by id, url, and
|
|
275
|
-
* src).
|
|
215
|
+
* Resolves multiple media IDs from cache. Throws IllegalStateException if any mediaId is not
|
|
216
|
+
* found in cache.
|
|
276
217
|
*
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
* or the item's requestMetadata carries the playable uri (stamped by TrackFactory for stable-id
|
|
280
|
-
* mediaIds, and round-tripped by Media3 controllers), fall back to a minimal track built from the
|
|
281
|
-
* item's own metadata instead of failing playback.
|
|
282
|
-
*
|
|
283
|
-
* @throws IllegalStateException if the mediaId is not cached and no playable URL is available
|
|
218
|
+
* @param mediaIds The media IDs to resolve
|
|
219
|
+
* @return List of Track objects
|
|
284
220
|
*/
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
getCachedTrack(mediaId)?.let { cachedTrack ->
|
|
289
|
-
Timber.d("Resolved mediaId='$mediaId' from cache: '${cachedTrack.title}'")
|
|
290
|
-
return cachedTrack
|
|
291
|
-
}
|
|
221
|
+
fun resolveMediaIdsFromCache(mediaIds: List<String>): List<Track> {
|
|
222
|
+
return mediaIds.map { mediaId ->
|
|
223
|
+
Timber.d("=== Resolving from cache: mediaId='$mediaId' ===")
|
|
292
224
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
} else {
|
|
297
|
-
mediaItem.requestMetadata.mediaUri?.toString()
|
|
225
|
+
getCachedTrack(mediaId)?.let { cachedTrack ->
|
|
226
|
+
Timber.d("→ Found cached Track: '${cachedTrack.title}'")
|
|
227
|
+
return@map cachedTrack
|
|
298
228
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
// A mediaId distinct from the playable uri is the track's stable id —
|
|
305
|
-
// keep it so the item's identity (car now-playing row match) survives.
|
|
306
|
-
id = mediaId.takeIf { it != fallbackSrc },
|
|
307
|
-
url = null,
|
|
308
|
-
src = fallbackSrc,
|
|
309
|
-
artwork = artworkOf(metadata.artworkUri?.toString()),
|
|
310
|
-
artworkSource = null,
|
|
311
|
-
request = null,
|
|
312
|
-
artworkCarPlayTinted = null,
|
|
313
|
-
title = metadata.title?.toString() ?: mediaId,
|
|
314
|
-
subtitle = metadata.artist?.toString(),
|
|
315
|
-
artist = null,
|
|
316
|
-
albumUrl = null,
|
|
317
|
-
album = metadata.albumTitle?.toString(),
|
|
318
|
-
description = metadata.description?.toString(),
|
|
319
|
-
genre = metadata.genre?.toString(),
|
|
320
|
-
duration = null,
|
|
321
|
-
style = null,
|
|
322
|
-
childrenStyle = null,
|
|
323
|
-
favorited = null,
|
|
324
|
-
groupTitle = null,
|
|
325
|
-
live = null,
|
|
326
|
-
imageRow = null,
|
|
327
|
-
)
|
|
229
|
+
|
|
230
|
+
// Cache miss - this indicates a bug in our caching system
|
|
231
|
+
Timber.e("→ Cache MISS for mediaId='$mediaId' - this should not happen")
|
|
232
|
+
throw IllegalStateException(
|
|
233
|
+
"MediaItem not found in cache: $mediaId. This indicates a bug in the caching system."
|
|
328
234
|
)
|
|
329
235
|
}
|
|
330
|
-
|
|
331
|
-
throw IllegalStateException("MediaItem not found in cache: $mediaId")
|
|
332
236
|
}
|
|
333
237
|
|
|
334
238
|
/**
|
|
@@ -345,7 +249,7 @@ class BrowserManager {
|
|
|
345
249
|
* @param startIndex Index of the item to start playing
|
|
346
250
|
* @param startPositionMs Position within the start item to begin playback
|
|
347
251
|
* @return MediaSession.MediaItemsWithStartPosition ready for Media3
|
|
348
|
-
* @throws IllegalStateException if
|
|
252
|
+
* @throws IllegalStateException if any mediaId is not found in cache
|
|
349
253
|
*/
|
|
350
254
|
suspend fun resolveMediaItemsForPlayback(
|
|
351
255
|
mediaItems: List<MediaItem>,
|
|
@@ -366,13 +270,10 @@ class BrowserManager {
|
|
|
366
270
|
val searchTracks = searchResults.children
|
|
367
271
|
|
|
368
272
|
if (searchTracks != null && searchTracks.isNotEmpty()) {
|
|
369
|
-
// Find the selected track in search results
|
|
370
|
-
// when the track has one, else url/src — see TrackFactory)
|
|
273
|
+
// Find the selected track in search results
|
|
371
274
|
val mediaId = mediaItem.mediaId
|
|
372
275
|
val selectedIndex =
|
|
373
|
-
searchTracks.indexOfFirst { track ->
|
|
374
|
-
track.id == mediaId || track.url == mediaId || track.src == mediaId
|
|
375
|
-
}
|
|
276
|
+
searchTracks.indexOfFirst { track -> track.url == mediaId || track.src == mediaId }
|
|
376
277
|
|
|
377
278
|
if (selectedIndex >= 0) {
|
|
378
279
|
Timber.d(
|
|
@@ -396,14 +297,11 @@ class BrowserManager {
|
|
|
396
297
|
}
|
|
397
298
|
|
|
398
299
|
val mediaId = mediaItems[0].mediaId
|
|
399
|
-
// A failed search match falls through to plain resolution, never to browse
|
|
400
|
-
// expansion — the user asked for that one result, not a browsed list.
|
|
401
|
-
val contextualUrl = if (searchQuery == null) contextualUrlFor(mediaId) else null
|
|
402
300
|
|
|
403
|
-
if (
|
|
404
|
-
Timber.d("Attempting queue expansion for mediaId='$mediaId'
|
|
301
|
+
if (BrowserPathHelper.isContextual(mediaId)) {
|
|
302
|
+
Timber.d("Attempting queue expansion for mediaId='$mediaId'")
|
|
405
303
|
|
|
406
|
-
val expanded = expandQueueFromContextualUrl(
|
|
304
|
+
val expanded = expandQueueFromContextualUrl(mediaId)
|
|
407
305
|
|
|
408
306
|
if (expanded != null) {
|
|
409
307
|
val (tracks, selectedIndex) = expanded
|
|
@@ -420,11 +318,12 @@ class BrowserManager {
|
|
|
420
318
|
}
|
|
421
319
|
}
|
|
422
320
|
|
|
423
|
-
// No expansion - resolve from cache
|
|
424
|
-
val
|
|
321
|
+
// No expansion - resolve from cache
|
|
322
|
+
val mediaIds = mediaItems.map { it.mediaId }
|
|
323
|
+
val cachedTracks = resolveMediaIdsFromCache(mediaIds)
|
|
425
324
|
|
|
426
325
|
// Convert to Media3 MediaItems
|
|
427
|
-
val resolvedMediaItems =
|
|
326
|
+
val resolvedMediaItems = cachedTracks.map { track -> TrackFactory.toMedia3(track) }
|
|
428
327
|
|
|
429
328
|
return MediaSession.MediaItemsWithStartPosition(resolvedMediaItems, startIndex, startPositionMs)
|
|
430
329
|
}
|
|
@@ -456,11 +355,6 @@ class BrowserManager {
|
|
|
456
355
|
if (useCache) {
|
|
457
356
|
contentCache.get(normalizedPath)?.let { cached ->
|
|
458
357
|
Timber.d("Content cache HIT for path='$normalizedPath'")
|
|
459
|
-
// Re-key the track cache even on a hit: an id-keyed lookup (stable-id
|
|
460
|
-
// mediaId → contextual url, see contextualUrlFor) must reflect the
|
|
461
|
-
// most recently *browsed* container, which a cached re-display
|
|
462
|
-
// otherwise wouldn't re-register.
|
|
463
|
-
cacheChildren(cached)
|
|
464
358
|
// Re-hydrate favorites in case they changed since caching
|
|
465
359
|
return hydrateChildren(cached)
|
|
466
360
|
}
|
|
@@ -493,37 +387,35 @@ class BrowserManager {
|
|
|
493
387
|
Timber.d("Invalidated content cache for path='$path'")
|
|
494
388
|
}
|
|
495
389
|
|
|
496
|
-
/** Clears all cached content. */
|
|
390
|
+
/** Clears all cached content. Used when artwork resolver is wired up to force re-fetch. */
|
|
497
391
|
fun clearContentCache() {
|
|
498
392
|
contentCache.evictAll()
|
|
499
|
-
// Bump the layer generation so request/browse resolver thunks are re-resolved on the next
|
|
500
|
-
// request (invalidateAllContent → clearContentCache is the documented re-resolve trigger).
|
|
501
|
-
layerGeneration += 1
|
|
502
|
-
// Invalidated content's artwork resolutions go with it (same staleness rule as the
|
|
503
|
-
// config setter).
|
|
504
|
-
artworkResolutions.clear()
|
|
505
|
-
onArtworkRegistriesCleared?.invoke()
|
|
506
393
|
Timber.d("Cleared all content cache")
|
|
507
394
|
}
|
|
508
395
|
|
|
509
396
|
private suspend fun resolveUncached(path: String): ResolvedTrack {
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
val resolvedTrack: ResolvedTrack
|
|
515
|
-
val effectiveArtworkConfig: ArtworkRequestConfig?
|
|
516
|
-
if (match != null) {
|
|
517
|
-
val (routeEntry, routeParams) = match
|
|
518
|
-
Timber.d("Matched route: ${routeEntry.path} with params: $routeParams")
|
|
519
|
-
resolvedTrack = resolveRouteEntry(routeEntry, path, routeParams)
|
|
520
|
-
effectiveArtworkConfig = routeEntry.artwork ?: config.artwork
|
|
521
|
-
} else {
|
|
522
|
-
Timber.d("No route matched for path: $path — using implicit default")
|
|
523
|
-
resolvedTrack = executeApiRequest(null, path, mapOf("path" to path))
|
|
524
|
-
effectiveArtworkConfig = config.artwork
|
|
397
|
+
val routes = config.routes
|
|
398
|
+
if (routes.isNullOrEmpty()) {
|
|
399
|
+
Timber.e("No routes configured for path: $path")
|
|
400
|
+
throw ContentNotFoundException(path)
|
|
525
401
|
}
|
|
526
402
|
|
|
403
|
+
// Find best matching route
|
|
404
|
+
val (routeEntry, routeParams) =
|
|
405
|
+
findBestRouteMatch(path, routes)
|
|
406
|
+
?: run {
|
|
407
|
+
Timber.e("No route matched for path: $path")
|
|
408
|
+
throw ContentNotFoundException(path)
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
Timber.d("Matched route: ${routeEntry.path} with params: $routeParams")
|
|
412
|
+
|
|
413
|
+
// Resolve the track from the route
|
|
414
|
+
val resolvedTrack = resolveRouteEntry(routeEntry, path, routeParams)
|
|
415
|
+
|
|
416
|
+
// Get effective artwork config: per-route overrides global
|
|
417
|
+
val effectiveArtworkConfig = routeEntry.artwork ?: config.artwork
|
|
418
|
+
|
|
527
419
|
// Transform children: generate contextual URLs and transform artwork URLs
|
|
528
420
|
val transformedChildren =
|
|
529
421
|
resolvedTrack.children?.let { children ->
|
|
@@ -531,11 +423,8 @@ class BrowserManager {
|
|
|
531
423
|
children
|
|
532
424
|
.mapIndexed { index, track ->
|
|
533
425
|
async {
|
|
534
|
-
// Validate that track has stable identifier
|
|
535
|
-
|
|
536
|
-
// selected, navigated to, or cached (its items carry their own
|
|
537
|
-
// identity; on Android Auto it expands into them).
|
|
538
|
-
if (track.imageRow.isNullOrEmpty()) validateTrack(track, "Child track")
|
|
426
|
+
// Validate that track has stable identifier
|
|
427
|
+
validateTrack(track, "Child track")
|
|
539
428
|
|
|
540
429
|
var transformedTrack = track
|
|
541
430
|
|
|
@@ -557,35 +446,22 @@ class BrowserManager {
|
|
|
557
446
|
)
|
|
558
447
|
}
|
|
559
448
|
|
|
560
|
-
//
|
|
561
|
-
//
|
|
562
|
-
|
|
563
|
-
|
|
449
|
+
// Transform artwork URL if resolver is configured
|
|
450
|
+
// At browse-time, we don't have display size info
|
|
451
|
+
val resolver = artworkUrlResolver
|
|
452
|
+
if (resolver != null) {
|
|
453
|
+
val browseContext = ImageContext(null, null)
|
|
564
454
|
transformedTrack =
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
item
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
.toTypedArray()
|
|
455
|
+
transformArtworkUrl(
|
|
456
|
+
transformedTrack,
|
|
457
|
+
effectiveArtworkConfig,
|
|
458
|
+
resolver,
|
|
459
|
+
path,
|
|
460
|
+
index,
|
|
461
|
+
browseContext,
|
|
576
462
|
)
|
|
577
463
|
}
|
|
578
464
|
|
|
579
|
-
// Transform artwork URL. At browse-time there is no display size info.
|
|
580
|
-
transformedTrack =
|
|
581
|
-
transformArtworkUrl(
|
|
582
|
-
transformedTrack,
|
|
583
|
-
effectiveArtworkConfig,
|
|
584
|
-
path,
|
|
585
|
-
index,
|
|
586
|
-
ImageContext(null, null),
|
|
587
|
-
)
|
|
588
|
-
|
|
589
465
|
transformedTrack
|
|
590
466
|
}
|
|
591
467
|
}
|
|
@@ -602,7 +478,7 @@ class BrowserManager {
|
|
|
602
478
|
}
|
|
603
479
|
|
|
604
480
|
/**
|
|
605
|
-
* Transforms a track's artwork
|
|
481
|
+
* Transforms a track's artwork using the configured resolver. Populates artworkSource with the
|
|
606
482
|
* transformed ImageSource, keeping artwork unchanged. Handles all edge cases: undefined returns,
|
|
607
483
|
* errors, missing artwork.
|
|
608
484
|
*
|
|
@@ -611,6 +487,7 @@ class BrowserManager {
|
|
|
611
487
|
private suspend fun transformArtworkUrl(
|
|
612
488
|
track: Track,
|
|
613
489
|
artworkConfig: ArtworkRequestConfig?,
|
|
490
|
+
resolver: suspend (Track, ArtworkRequestConfig?, ImageContext?) -> ImageSource?,
|
|
614
491
|
path: String,
|
|
615
492
|
index: Int,
|
|
616
493
|
imageContext: ImageContext? = null,
|
|
@@ -621,7 +498,7 @@ class BrowserManager {
|
|
|
621
498
|
}
|
|
622
499
|
|
|
623
500
|
return try {
|
|
624
|
-
val imageSource =
|
|
501
|
+
val imageSource = resolver(track, artworkConfig, imageContext)
|
|
625
502
|
|
|
626
503
|
when {
|
|
627
504
|
// resolve returned null → no artwork source
|
|
@@ -634,15 +511,6 @@ class BrowserManager {
|
|
|
634
511
|
// resolve returned ImageSource → set artworkSource
|
|
635
512
|
else -> {
|
|
636
513
|
Timber.d("[$path] Child[$index] '${track.title}': artworkSource set: ${imageSource.uri}")
|
|
637
|
-
// Remember how this URI was produced so display-time loading (which only
|
|
638
|
-
// gets a URI from Media3) can re-resolve Track-first with a size hint.
|
|
639
|
-
// Register the per-route config only when it isn't the global fallback,
|
|
640
|
-
// so display-time resolution reads the *current* config.artwork.
|
|
641
|
-
artworkResolutions.register(
|
|
642
|
-
imageSource.uri,
|
|
643
|
-
track,
|
|
644
|
-
artworkConfig?.takeIf { it !== config.artwork },
|
|
645
|
-
)
|
|
646
514
|
track.copy(artworkSource = imageSource)
|
|
647
515
|
}
|
|
648
516
|
}
|
|
@@ -681,20 +549,8 @@ class BrowserManager {
|
|
|
681
549
|
return null
|
|
682
550
|
}
|
|
683
551
|
|
|
684
|
-
// Queue scope is the tapped section, not the whole page (ADR 0006). An
|
|
685
|
-
// id that no longer appears on the page aborts the expansion — the
|
|
686
|
-
// caller falls back to the stored single track; silently queueing the
|
|
687
|
-
// changed list would resume the wrong station.
|
|
688
|
-
val sectionTracks =
|
|
689
|
-
when (val section = SectionScope.section(children.toList(), trackId)) {
|
|
690
|
-
is SectionScope.Section.ImageRow ->
|
|
691
|
-
with(TrackFactory) { section.items.map { it.toTrack(groupTitle = null) } }
|
|
692
|
-
is SectionScope.Section.Run -> section.tracks
|
|
693
|
-
null -> return null
|
|
694
|
-
}
|
|
695
|
-
|
|
696
552
|
// Filter to only playable tracks (tracks with src)
|
|
697
|
-
val playableTracks =
|
|
553
|
+
val playableTracks = children.filter { track -> track.src != null }
|
|
698
554
|
|
|
699
555
|
if (playableTracks.isEmpty()) {
|
|
700
556
|
Timber.w("Parent has no playable tracks, cannot expand queue")
|
|
@@ -786,9 +642,8 @@ class BrowserManager {
|
|
|
786
642
|
* @return Array of Track results, or null if not found
|
|
787
643
|
*/
|
|
788
644
|
fun getCachedSearchResults(query: String): Array<Track>? {
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
return cachedResults.map { hydrateFavorite(it) }.toTypedArray()
|
|
645
|
+
if (query != lastSearchQuery) return null
|
|
646
|
+
return lastSearchResults?.map { hydrateFavorite(it) }?.toTypedArray()
|
|
792
647
|
}
|
|
793
648
|
|
|
794
649
|
/**
|
|
@@ -807,7 +662,6 @@ class BrowserManager {
|
|
|
807
662
|
album = null,
|
|
808
663
|
title = null,
|
|
809
664
|
playlist = null,
|
|
810
|
-
reference = MediaReference.UNKNOWN,
|
|
811
665
|
)
|
|
812
666
|
)
|
|
813
667
|
}
|
|
@@ -832,11 +686,10 @@ class BrowserManager {
|
|
|
832
686
|
|
|
833
687
|
// Check if result is browsable-only (container/route) vs playable
|
|
834
688
|
// If it's browsable but also playable (has src or playable=true), treat it as playable
|
|
835
|
-
val firstResultUrl = firstResult.url
|
|
836
689
|
val tracksToFilter =
|
|
837
|
-
if (firstResult.src == null
|
|
838
|
-
Timber.d("First search result is browsable-only, resolving: $
|
|
839
|
-
val resolvedTrack = resolve(
|
|
690
|
+
if (firstResult.src == null) {
|
|
691
|
+
Timber.d("First search result is browsable-only, resolving: ${firstResult.url}")
|
|
692
|
+
val resolvedTrack = resolve(firstResult.url!!)
|
|
840
693
|
resolvedTrack.children
|
|
841
694
|
?.filter { it.src != null }
|
|
842
695
|
?.takeIf { it.isNotEmpty() }
|
|
@@ -864,7 +717,6 @@ class BrowserManager {
|
|
|
864
717
|
album = null,
|
|
865
718
|
title = null,
|
|
866
719
|
playlist = null,
|
|
867
|
-
reference = MediaReference.UNKNOWN,
|
|
868
720
|
)
|
|
869
721
|
)
|
|
870
722
|
}
|
|
@@ -883,34 +735,20 @@ class BrowserManager {
|
|
|
883
735
|
val searchPath = BrowserPathHelper.createSearchPath(params.query)
|
|
884
736
|
|
|
885
737
|
try {
|
|
886
|
-
// Execute search
|
|
887
|
-
|
|
888
|
-
// downstream conversion (TrackFactory.toMedia3) and browsable-result resolution require one.
|
|
889
|
-
val searchResults =
|
|
890
|
-
resolveSearch(params)
|
|
891
|
-
.filter { track ->
|
|
892
|
-
val valid = track.url != null || track.src != null
|
|
893
|
-
if (!valid) {
|
|
894
|
-
Timber.w("Dropping search result without url or src: '${track.title}'")
|
|
895
|
-
}
|
|
896
|
-
valid
|
|
897
|
-
}
|
|
898
|
-
.toTypedArray()
|
|
738
|
+
// Execute search
|
|
739
|
+
val searchResults = resolveSearch(params)
|
|
899
740
|
|
|
900
741
|
// Create ResolvedTrack
|
|
901
742
|
val searchResolvedTrack =
|
|
902
743
|
ResolvedTrack(
|
|
903
|
-
id = null,
|
|
904
744
|
url = searchPath,
|
|
905
745
|
title = "Search: ${params.query}",
|
|
906
746
|
children = searchResults,
|
|
907
747
|
carPlaySiriListButton = null,
|
|
908
748
|
artwork = null,
|
|
909
749
|
artworkSource = null,
|
|
910
|
-
request = null,
|
|
911
750
|
artworkCarPlayTinted = null,
|
|
912
751
|
artist = null,
|
|
913
|
-
albumUrl = null,
|
|
914
752
|
description = null,
|
|
915
753
|
subtitle = null,
|
|
916
754
|
album = null,
|
|
@@ -926,7 +764,8 @@ class BrowserManager {
|
|
|
926
764
|
)
|
|
927
765
|
|
|
928
766
|
// Cache search results for getCachedSearchResults()
|
|
929
|
-
|
|
767
|
+
lastSearchQuery = params.query
|
|
768
|
+
lastSearchResults = searchResults
|
|
930
769
|
|
|
931
770
|
// Cache individual tracks for Media3 lookups
|
|
932
771
|
cacheChildren(searchResolvedTrack)
|
|
@@ -941,17 +780,14 @@ class BrowserManager {
|
|
|
941
780
|
// Return empty search result on error
|
|
942
781
|
val emptySearchResult =
|
|
943
782
|
ResolvedTrack(
|
|
944
|
-
id = null,
|
|
945
783
|
url = searchPath,
|
|
946
784
|
title = "Search: ${params.query}",
|
|
947
785
|
children = emptyArray(),
|
|
948
786
|
carPlaySiriListButton = null,
|
|
949
787
|
artwork = null,
|
|
950
788
|
artworkSource = null,
|
|
951
|
-
request = null,
|
|
952
789
|
artworkCarPlayTinted = null,
|
|
953
790
|
artist = null,
|
|
954
|
-
albumUrl = null,
|
|
955
791
|
description = null,
|
|
956
792
|
subtitle = null,
|
|
957
793
|
album = null,
|
|
@@ -1012,15 +848,6 @@ class BrowserManager {
|
|
|
1012
848
|
onTabsChanged = callback
|
|
1013
849
|
}
|
|
1014
850
|
|
|
1015
|
-
/**
|
|
1016
|
-
* Set callback invoked whenever both [artworkResolutions] and the browse-artwork registry are
|
|
1017
|
-
* cleared (config swap or content invalidation). The caller should clear any parallel
|
|
1018
|
-
* [com.audiobrowser.browser.BrowseArtworkRegistry] instance it owns.
|
|
1019
|
-
*/
|
|
1020
|
-
fun setOnArtworkRegistriesCleared(callback: () -> Unit) {
|
|
1021
|
-
onArtworkRegistriesCleared = callback
|
|
1022
|
-
}
|
|
1023
|
-
|
|
1024
851
|
/**
|
|
1025
852
|
* Query navigation tabs from the configured tabs source. This is an async operation that resolves
|
|
1026
853
|
* the tabs configuration.
|
|
@@ -1098,25 +925,15 @@ class BrowserManager {
|
|
|
1098
925
|
entry.browseCallback?.let { callback ->
|
|
1099
926
|
Timber.d("Resolving route via callback")
|
|
1100
927
|
val param = BrowserSourceCallbackParam(path, routeParams)
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
.
|
|
1109
|
-
|
|
1110
|
-
second = { browseError -> throw CallbackException(browseError.error) },
|
|
1111
|
-
third = { promise ->
|
|
1112
|
-
promise
|
|
1113
|
-
.await()
|
|
1114
|
-
.match(
|
|
1115
|
-
first = { resolvedTrack -> resolvedTrack },
|
|
1116
|
-
second = { browseError -> throw CallbackException(browseError.error) },
|
|
1117
|
-
)
|
|
1118
|
-
},
|
|
1119
|
-
)
|
|
928
|
+
val promise = callback.invoke(param)
|
|
929
|
+
val innerPromise = promise.await()
|
|
930
|
+
val result = innerPromise.await()
|
|
931
|
+
|
|
932
|
+
// Handle BrowseResult variant: either ResolvedTrack or BrowseError
|
|
933
|
+
return result.match(
|
|
934
|
+
first = { resolvedTrack -> resolvedTrack },
|
|
935
|
+
second = { browseError -> throw CallbackException(browseError.error) }
|
|
936
|
+
)
|
|
1120
937
|
}
|
|
1121
938
|
|
|
1122
939
|
entry.browseConfig?.let { apiConfig ->
|
|
@@ -1182,119 +999,34 @@ class BrowserManager {
|
|
|
1182
999
|
}
|
|
1183
1000
|
|
|
1184
1001
|
/**
|
|
1185
|
-
*
|
|
1186
|
-
*
|
|
1187
|
-
* Promise.resolve), so its native shape is `Promise<Promise<TransformableRequestConfig>>` — a
|
|
1188
|
-
* double await. When there is no resolver the static layer config is returned as-is.
|
|
1189
|
-
*/
|
|
1190
|
-
private suspend fun resolveLayer(
|
|
1191
|
-
staticConfig: TransformableRequestConfig?,
|
|
1192
|
-
resolver: Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____?,
|
|
1193
|
-
): TransformableRequestConfig? {
|
|
1194
|
-
if (resolver == null) return staticConfig
|
|
1195
|
-
// Promise-only resolver (the TS layer wraps a sync-or-async thunk in
|
|
1196
|
-
// Promise.resolve) → double await: the bridge promise, then the JS promise.
|
|
1197
|
-
return resolver.invoke().await().await()
|
|
1198
|
-
}
|
|
1199
|
-
|
|
1200
|
-
/**
|
|
1201
|
-
* Ensures the request/browse resolver layers are resolved for the current [layerGeneration],
|
|
1202
|
-
* caching the result. Re-resolves when the generation changes (config set or content
|
|
1203
|
-
* invalidation). Uses a simple generation guard with no in-flight cache: a benign idempotent
|
|
1204
|
-
* double-resolve under concurrent first-requests is acceptable, and on a thrown resolver nothing
|
|
1205
|
-
* is cached so the next request retries naturally.
|
|
1206
|
-
*/
|
|
1207
|
-
internal suspend fun ensureLayersResolved() {
|
|
1208
|
-
if (resolvedLayerGeneration == layerGeneration) return
|
|
1209
|
-
val generation = layerGeneration
|
|
1210
|
-
val req = resolveLayer(config.request, config.requestResolver)
|
|
1211
|
-
val brw = resolveLayer(config.browse, config.browseResolver)
|
|
1212
|
-
// A newer generation started while we were awaiting — drop this stale result.
|
|
1213
|
-
if (generation != layerGeneration) return
|
|
1214
|
-
resolvedRequestLayer = req
|
|
1215
|
-
resolvedBrowseLayer = brw
|
|
1216
|
-
resolvedLayerGeneration = generation
|
|
1217
|
-
}
|
|
1218
|
-
|
|
1219
|
-
/**
|
|
1220
|
-
* Ensures the request layer is resolved for the current generation and returns it (the resolver
|
|
1221
|
-
* result when a [BrowserConfig.requestResolver] is configured, else the static
|
|
1222
|
-
* [BrowserConfig.request]).
|
|
1223
|
-
*
|
|
1224
|
-
* Consumers outside the browse path (media URL building, artwork) must obtain the request layer
|
|
1225
|
-
* through this accessor rather than reading the static `config.request`, so a resolver-only
|
|
1226
|
-
* consumer still gets a baseUrl/headers/transform for media, artwork, and now-playing artwork.
|
|
1227
|
-
*/
|
|
1228
|
-
internal suspend fun resolvedRequestConfig(): TransformableRequestConfig? {
|
|
1229
|
-
ensureLayersResolved()
|
|
1230
|
-
return resolvedRequestLayer
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1233
|
-
/**
|
|
1234
|
-
* Builds the HTTP request for an API-backed path by layering request (shared) → kind
|
|
1235
|
-
* (browse/search) → route configs. Each layer's transform receives the previous layer's output; a
|
|
1236
|
-
* layer with no transform merges its static fields.
|
|
1237
|
-
*
|
|
1238
|
-
* `initialQuery` seeds query params onto the BASE the kind layer receives (e.g. search q/mode/…):
|
|
1239
|
-
* a layer with a transform "wins completely" and is handed only the base, so params placed on a
|
|
1240
|
-
* layer's own static query would be dropped before the transform runs. The same goes for `path`:
|
|
1241
|
-
* it is carried from the base through every layer (only a transform may change it), so a kind
|
|
1242
|
-
* whose config supplies the path (search) must seed it via the `path` parameter. Mirrors iOS
|
|
1243
|
-
* `buildApiRequest`.
|
|
1244
|
-
*
|
|
1245
|
-
* @throws ContentNotFoundException when no layer supplies a baseUrl — there is nothing to fetch,
|
|
1246
|
-
* so the path is genuinely "not found" rather than a network error (mirrors iOS's `guard let
|
|
1247
|
-
* baseUrl`).
|
|
1248
|
-
*/
|
|
1249
|
-
internal suspend fun buildApiRequest(
|
|
1250
|
-
kindConfig: TransformableRequestConfig?,
|
|
1251
|
-
routeConfig: TransformableRequestConfig?,
|
|
1252
|
-
path: String?,
|
|
1253
|
-
params: Map<String, String>,
|
|
1254
|
-
initialQuery: Map<String, String>? = null,
|
|
1255
|
-
): HttpClient.HttpRequest {
|
|
1256
|
-
// Resolve the request/browse resolver thunks once per content generation (cached).
|
|
1257
|
-
ensureLayersResolved()
|
|
1258
|
-
|
|
1259
|
-
var merged =
|
|
1260
|
-
RequestConfig(
|
|
1261
|
-
method = null,
|
|
1262
|
-
path = path,
|
|
1263
|
-
baseUrl = null,
|
|
1264
|
-
headers = null,
|
|
1265
|
-
query = null,
|
|
1266
|
-
body = null,
|
|
1267
|
-
contentType = null,
|
|
1268
|
-
userAgent = null,
|
|
1269
|
-
)
|
|
1270
|
-
resolvedRequestLayer?.let { merged = RequestConfigBuilder.mergeConfig(merged, it, params) }
|
|
1271
|
-
if (!initialQuery.isNullOrEmpty()) {
|
|
1272
|
-
merged = merged.copy(query = (merged.query ?: emptyMap()) + initialQuery)
|
|
1273
|
-
}
|
|
1274
|
-
kindConfig?.let { merged = RequestConfigBuilder.mergeConfig(merged, it, params) }
|
|
1275
|
-
routeConfig?.let { merged = RequestConfigBuilder.mergeConfig(merged, it, params) }
|
|
1276
|
-
|
|
1277
|
-
if (merged.baseUrl.isNullOrBlank()) {
|
|
1278
|
-
throw ContentNotFoundException(path ?: "")
|
|
1279
|
-
}
|
|
1280
|
-
return RequestConfigBuilder.buildHttpRequest(merged)
|
|
1281
|
-
}
|
|
1282
|
-
|
|
1283
|
-
/**
|
|
1284
|
-
* Execute an API request for browser content. Request building (layering + transforms + baseUrl
|
|
1285
|
-
* guard) lives in [buildApiRequest]; this adds the browse-specific response shape (a
|
|
1286
|
-
* ResolvedTrack page object).
|
|
1002
|
+
* Execute an API request for browser content. Handles URL parameter substitution, config merging,
|
|
1003
|
+
* and transforms.
|
|
1287
1004
|
*/
|
|
1288
1005
|
private suspend fun executeApiRequest(
|
|
1289
|
-
apiConfig: TransformableRequestConfig
|
|
1006
|
+
apiConfig: TransformableRequestConfig,
|
|
1290
1007
|
path: String,
|
|
1291
1008
|
routeParams: Map<String, String>,
|
|
1292
1009
|
): ResolvedTrack {
|
|
1293
1010
|
return withContext(Dispatchers.IO) {
|
|
1294
|
-
//
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1011
|
+
// 1. Start with base config, using the navigation path as default
|
|
1012
|
+
val baseConfig =
|
|
1013
|
+
config.request?.let { req ->
|
|
1014
|
+
RequestConfigBuilder.toRequestConfig(req).copy(path = req.path ?: path)
|
|
1015
|
+
}
|
|
1016
|
+
?: RequestConfig(
|
|
1017
|
+
path = path,
|
|
1018
|
+
method = null,
|
|
1019
|
+
baseUrl = null,
|
|
1020
|
+
headers = null,
|
|
1021
|
+
query = null,
|
|
1022
|
+
body = null,
|
|
1023
|
+
contentType = null,
|
|
1024
|
+
userAgent = null,
|
|
1025
|
+
)
|
|
1026
|
+
val mergedConfig = RequestConfigBuilder.mergeConfig(baseConfig, apiConfig, routeParams)
|
|
1027
|
+
|
|
1028
|
+
// 2. Build and execute HTTP request
|
|
1029
|
+
val httpRequest = RequestConfigBuilder.buildHttpRequest(mergedConfig)
|
|
1298
1030
|
val response = httpClient.request(httpRequest)
|
|
1299
1031
|
|
|
1300
1032
|
response.fold(
|
|
@@ -1334,10 +1066,24 @@ class BrowserManager {
|
|
|
1334
1066
|
): Array<Track> {
|
|
1335
1067
|
return withContext(Dispatchers.IO) {
|
|
1336
1068
|
try {
|
|
1069
|
+
// 1. Start with base config
|
|
1070
|
+
val baseConfig =
|
|
1071
|
+
config.request?.let { RequestConfigBuilder.toRequestConfig(it) }
|
|
1072
|
+
?: RequestConfig(
|
|
1073
|
+
method = null,
|
|
1074
|
+
path = null,
|
|
1075
|
+
baseUrl = null,
|
|
1076
|
+
headers = null,
|
|
1077
|
+
query = null,
|
|
1078
|
+
body = null,
|
|
1079
|
+
contentType = null,
|
|
1080
|
+
userAgent = null,
|
|
1081
|
+
)
|
|
1082
|
+
|
|
1083
|
+
// 2. Build query parameters from SearchParams
|
|
1337
1084
|
val searchQueryParams = buildMap {
|
|
1338
1085
|
put("q", params.query)
|
|
1339
1086
|
params.mode?.let { put("mode", it.toString().lowercase()) }
|
|
1340
|
-
if (params.reference == MediaReference.MY) put("reference", "my")
|
|
1341
1087
|
params.genre?.let { put("genre", it) }
|
|
1342
1088
|
params.artist?.let { put("artist", it) }
|
|
1343
1089
|
params.album?.let { put("album", it) }
|
|
@@ -1345,26 +1091,31 @@ class BrowserManager {
|
|
|
1345
1091
|
params.playlist?.let { put("playlist", it) }
|
|
1346
1092
|
}
|
|
1347
1093
|
|
|
1348
|
-
//
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
val httpRequest =
|
|
1354
|
-
buildApiRequest(
|
|
1355
|
-
kindConfig = apiConfig,
|
|
1356
|
-
routeConfig = null,
|
|
1094
|
+
// 3. Create a copy of API config with added search parameters
|
|
1095
|
+
val searchConfig =
|
|
1096
|
+
TransformableRequestConfig(
|
|
1097
|
+
transform = apiConfig.transform,
|
|
1098
|
+
method = apiConfig.method,
|
|
1357
1099
|
path = apiConfig.path,
|
|
1358
|
-
|
|
1359
|
-
|
|
1100
|
+
baseUrl = apiConfig.baseUrl,
|
|
1101
|
+
headers = apiConfig.headers,
|
|
1102
|
+
query = (apiConfig.query ?: emptyMap()) + searchQueryParams,
|
|
1103
|
+
body = apiConfig.body,
|
|
1104
|
+
contentType = apiConfig.contentType,
|
|
1105
|
+
userAgent = apiConfig.userAgent,
|
|
1360
1106
|
)
|
|
1107
|
+
|
|
1108
|
+
// 3. Merge configs and apply transform if provided
|
|
1109
|
+
var mergedConfig = RequestConfigBuilder.mergeConfig(baseConfig, searchConfig, emptyMap())
|
|
1110
|
+
|
|
1111
|
+
// 4. Build and execute HTTP request
|
|
1112
|
+
val httpRequest = RequestConfigBuilder.buildHttpRequest(mergedConfig)
|
|
1361
1113
|
val response = httpClient.request(httpRequest)
|
|
1362
1114
|
|
|
1363
1115
|
response.fold(
|
|
1364
1116
|
onSuccess = { httpResponse ->
|
|
1365
1117
|
if (httpResponse.isSuccessful) {
|
|
1366
|
-
//
|
|
1367
|
-
// which returns a page object). iOS parses it the same way.
|
|
1118
|
+
// 4. Parse response as Track array
|
|
1368
1119
|
val jsonTracks = json.decodeFromString<List<JsonTrack>>(httpResponse.body)
|
|
1369
1120
|
jsonTracks.map { it.toNitro() }.toTypedArray()
|
|
1370
1121
|
} else {
|
|
@@ -1405,23 +1156,8 @@ class CallbackException(message: String) : Exception(message)
|
|
|
1405
1156
|
*/
|
|
1406
1157
|
data class BrowserConfig(
|
|
1407
1158
|
val request: TransformableRequestConfig? = null,
|
|
1408
|
-
// Resolver thunk for the shared request layer. When set, it is resolved once per content
|
|
1409
|
-
// generation (re-resolved after invalidateAllContent), cached, and merged per request — instead
|
|
1410
|
-
// of carrying a static `request`. `request` and `requestResolver` are mutually exclusive in
|
|
1411
|
-
// practice (the consumer sets one or the other), but both are merged if present.
|
|
1412
|
-
val requestResolver:
|
|
1413
|
-
Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____? =
|
|
1414
|
-
null,
|
|
1415
|
-
val browse: TransformableRequestConfig? = null,
|
|
1416
|
-
// Resolver thunk for the browse layer. See `requestResolver`.
|
|
1417
|
-
val browseResolver:
|
|
1418
|
-
Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____? =
|
|
1419
|
-
null,
|
|
1420
1159
|
val media: MediaRequestConfig? = null,
|
|
1421
1160
|
val artwork: ArtworkRequestConfig? = null,
|
|
1422
|
-
// Now-playing-only artwork configuration (lock screen / notification / Android Auto now-playing).
|
|
1423
|
-
// A distinct kind from `artwork`; the now-playing path falls back to `artwork` when this is null.
|
|
1424
|
-
val nowPlayingArtwork: ArtworkRequestConfig? = null,
|
|
1425
1161
|
// Routes as array with flattened entries (includes __tabs__, __search__, and __default__ special
|
|
1426
1162
|
// routes)
|
|
1427
1163
|
val routes: Array<NativeRouteEntry>? = null,
|