react-native-audio-browser 0.1.1 → 0.2.0-next.10
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 +184 -2
- package/android/build.gradle +17 -5
- package/android/gradle.properties +2 -2
- package/android/src/main/AndroidManifest.xml +18 -1
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +473 -158
- package/android/src/main/java/com/audiobrowser/AudioBrowserLifecycleModule.kt +38 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowserPackage.kt +18 -2
- package/android/src/main/java/com/audiobrowser/Callbacks.kt +4 -6
- package/android/src/main/java/com/audiobrowser/Service.kt +67 -18
- package/android/src/main/java/com/audiobrowser/ServiceBinding.kt +48 -0
- package/android/src/main/java/com/audiobrowser/browser/ArtworkResolutionRegistry.kt +37 -0
- package/android/src/main/java/com/audiobrowser/browser/BrowseArtworkRegistry.kt +34 -0
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +442 -178
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +299 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonArtwork.kt +79 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +41 -4
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +42 -0
- package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +4 -4
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +35 -0
- package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +20 -3
- package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +109 -97
- package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +6 -10
- package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +40 -8
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +40 -46
- package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +4 -1
- package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +172 -0
- package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +18 -1
- package/android/src/main/java/com/audiobrowser/player/EqualizerController.kt +153 -0
- package/android/src/main/java/com/audiobrowser/player/InterceptingPlayer.kt +141 -0
- package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +15 -3
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +422 -134
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +248 -404
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +347 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackErrorClassifier.kt +129 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateMachine.kt +85 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +25 -5
- package/android/src/main/java/com/audiobrowser/player/PlaybackTimer.kt +56 -0
- package/android/src/main/java/com/audiobrowser/player/Player.kt +475 -577
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +20 -0
- package/android/src/main/java/com/audiobrowser/player/PlayerEngineFactory.kt +130 -0
- package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +190 -67
- package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +118 -53
- package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +37 -3
- package/android/src/main/java/com/audiobrowser/player/SleepTimerManager.kt +80 -0
- package/android/src/main/java/com/audiobrowser/player/StuckRecoveryPolicy.kt +50 -0
- package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +85 -40
- package/android/src/main/java/com/audiobrowser/player/VolumeFader.kt +81 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +156 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingExtendedTrustManager.kt +109 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +37 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +55 -0
- package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +265 -0
- package/android/src/main/java/com/audiobrowser/util/ArtworkContentProvider.kt +161 -0
- package/android/src/main/java/com/audiobrowser/util/ArtworkUris.kt +28 -0
- package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +24 -0
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +24 -0
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoader.kt +49 -0
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoaderHolder.kt +36 -0
- package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +23 -300
- package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +13 -23
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +2 -2
- package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +4 -3
- package/android/src/main/java/com/audiobrowser/util/OutputMonitor.kt +211 -0
- package/android/src/main/java/com/audiobrowser/util/OutputSwitcher.kt +58 -0
- package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +2 -1
- package/android/src/main/java/com/audiobrowser/util/RatingFavorites.kt +14 -0
- package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +6 -111
- package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +22 -8
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +112 -80
- package/android/src/main/res/values/strings.xml +4 -0
- package/android/src/test/java/com/audiobrowser/ServiceBindingTest.kt +87 -0
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +165 -0
- package/android/src/test/java/com/audiobrowser/browser/ArtworkResolutionRegistryTest.kt +46 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowseArtworkRegistryTest.kt +39 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerBuildApiRequestTest.kt +114 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +141 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +4 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +177 -0
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +55 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +94 -0
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +1 -2
- package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +72 -0
- package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +203 -0
- package/android/src/test/java/com/audiobrowser/player/DynamicLoadControlTest.kt +56 -0
- package/android/src/test/java/com/audiobrowser/player/EqualizerControllerTest.kt +216 -0
- package/android/src/test/java/com/audiobrowser/player/MediaSessionSlotMappingTest.kt +45 -0
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +442 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +190 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateMachineTest.kt +198 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackTimerTest.kt +137 -0
- package/android/src/test/java/com/audiobrowser/player/PlayerEngineFactoryTest.kt +36 -0
- package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +268 -0
- package/android/src/test/java/com/audiobrowser/player/SessionErrorMaskTest.kt +68 -0
- package/android/src/test/java/com/audiobrowser/player/StuckRecoveryPolicyTest.kt +40 -0
- package/android/src/test/java/com/audiobrowser/player/TransformingDataSourceTest.kt +193 -0
- package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +153 -0
- package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +186 -0
- package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +158 -0
- package/android/src/test/java/com/audiobrowser/tls/CertFixtures.kt +18 -0
- package/android/src/test/java/com/audiobrowser/util/ArtworkContentProviderTest.kt +163 -0
- package/android/src/test/java/com/audiobrowser/util/ArtworkUrisTest.kt +34 -0
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +28 -0
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderHolderTest.kt +53 -0
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderTest.kt +58 -0
- package/android/src/test/java/com/audiobrowser/util/FakeImageLoader.kt +57 -0
- package/android/src/test/java/com/audiobrowser/util/PlayingStateFactoryTest.kt +40 -0
- package/android/src/test/java/com/audiobrowser/util/RatingFavoritesTest.kt +34 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryBrowseTest.kt +50 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +63 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryRatingTest.kt +35 -0
- package/android/src/test/resources/certs/isrg-root-x1.pem +31 -0
- package/android/src/test/resources/certs/letsencrypt-r13.der +0 -0
- package/android/src/test/resources/certs/letsencrypt-r13.pem +29 -0
- package/android/src/test/resources/certs/stationplaylist-leaf.pem +34 -0
- package/ios/Browser/BrowserConfig.swift +41 -11
- package/ios/Browser/BrowserManager+URLResolution.swift +213 -93
- package/ios/Browser/BrowserManager.swift +303 -135
- package/ios/Browser/BrowserPathHelper.swift +32 -3
- package/ios/Browser/JsonModels.swift +287 -66
- package/ios/Browser/MediaResolveComposer.swift +114 -0
- package/ios/Browser/SearchDrillIn.swift +44 -0
- package/ios/Browser/SectionScope.swift +35 -0
- package/ios/Browser/TabBarEntries.swift +15 -0
- package/ios/CarPlay/CPInterfaceController+Safe.swift +126 -0
- package/ios/CarPlay/CarPlayArtworkResolver.swift +6 -6
- package/ios/CarPlay/CarPlayController.swift +739 -149
- package/ios/CarPlay/CarPlayImageLoader.swift +57 -8
- package/ios/CarPlay/CarPlayListItemFactory.swift +44 -35
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +180 -36
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +19 -0
- package/ios/CarPlay/RNABAudioBrowser.h +15 -10
- package/ios/CarPlay/RNABAudioBrowser.m +15 -14
- package/ios/CarPlay/RNABCarPlaySceneDelegate.m +2 -0
- package/ios/CarPlay/RNABMediaAddHandler.swift +75 -0
- package/ios/CarPlay/RNABMediaAffinityHandler.swift +69 -0
- package/ios/CarPlay/RNABMediaIntentHandler.swift +53 -43
- package/ios/Extension/Capability+RemoteCommand.swift +7 -9
- package/ios/Extension/ChapterMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/NavigationError+Conversion.swift +8 -1
- package/ios/Extension/PlayerCapabilities+Favorite.swift +20 -0
- package/ios/Extension/RequestConfig+Copying.swift +31 -0
- package/ios/Extension/ResolvedTrack+Copying.swift +10 -4
- package/ios/Extension/TimedMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/Track+AVPlayer.swift +4 -4
- package/ios/Extension/Track+Copying.swift +9 -3
- package/ios/Extension/TrackMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/Variant+Artwork.swift +49 -0
- package/ios/HybridAudioBrowser.swift +805 -197
- package/ios/Model/NitroTypeStubs.swift +299 -224
- package/ios/Model/PlayerUpdateOptions.swift +23 -23
- package/ios/Model/RemoteCommand.swift +24 -6
- package/ios/Model/TrackPlayerError.swift +82 -18
- package/ios/NowPlayingInfo/NowPlayingInfoController.swift +99 -121
- package/ios/NowPlayingInfo/SilentAudioPrimer.swift +73 -0
- package/ios/Observer/PlayerItemNotificationObserver.swift +45 -5
- package/ios/Observer/PlayerItemPropertyObserver.swift +27 -4
- package/ios/Observer/PlayerTimeObserver.swift +3 -53
- package/ios/Option/SessionCategories.swift +34 -11
- package/ios/Player/AirPlayStallJudgement.swift +25 -0
- package/ios/Player/EndOfTrackJudgement.swift +32 -0
- package/ios/Player/LoadSeekCoordinator.swift +16 -1
- package/ios/Player/MediaIntentCriteria.swift +139 -0
- package/ios/Player/MediaLoader.swift +31 -11
- package/ios/Player/NowPlayingUpdater.swift +119 -26
- package/ios/Player/PersistedPlaybackState.swift +11 -0
- package/ios/Player/PlaybackCoordinator.swift +285 -51
- package/ios/Player/PlaybackCoordinatorCallbacks.swift +6 -1
- package/ios/Player/PlaybackEffectHandler.swift +19 -9
- package/ios/Player/PlaybackErrorHandler.swift +98 -14
- package/ios/Player/PlaybackStateMachine.swift +18 -13
- package/ios/Player/PlaybackStateStore.swift +27 -0
- package/ios/Player/PlaybackTimer.swift +61 -0
- package/ios/Player/PlayingStateManager.swift +3 -2
- package/ios/Player/QueueManager.swift +77 -64
- package/ios/Player/RetryManager.swift +175 -38
- package/ios/Player/ShuffleOrder.swift +10 -0
- package/ios/Player/SleepTimerHandling.swift +8 -0
- package/ios/Player/SleepTimerManager.swift +72 -11
- package/ios/Player/VolumeFader.swift +77 -0
- package/ios/RemoteCommand/RemoteCommandCallbacks.swift +47 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +40 -21
- package/ios/Tests/AirPlayStallJudgementTests.swift +52 -0
- package/ios/Tests/BrowserPathHelperTests.swift +28 -0
- package/ios/Tests/CarPlayArtworkResolverTests.swift +39 -39
- package/ios/Tests/ChapterMetadataAVFoundationTests.swift +2 -2
- package/ios/Tests/EndOfTrackJudgementTests.swift +35 -0
- package/ios/Tests/JsonModelsTests.swift +58 -0
- package/ios/Tests/LRUCacheTests.swift +111 -0
- package/ios/Tests/LoadSeekCoordinatorTests.swift +40 -7
- package/ios/Tests/MediaIntentCriteriaTests.swift +170 -0
- package/ios/Tests/MediaLoaderAssetOptionsTests.swift +46 -0
- package/ios/Tests/MediaLoaderTests.swift +32 -20
- package/ios/Tests/MediaResolveTests.swift +126 -0
- package/ios/Tests/OnceValueTests.swift +79 -0
- package/ios/Tests/PlaybackCoordinatorTests.swift +787 -13
- package/ios/Tests/PlaybackErrorHandlerTests.swift +383 -47
- package/ios/Tests/PlaybackStateMachineTests.swift +33 -8
- package/ios/Tests/PlaybackStateStoreTests.swift +48 -0
- package/ios/Tests/PlaybackTimerTests.swift +55 -0
- package/ios/Tests/PlayerTimeObserverTests.swift +37 -0
- package/ios/Tests/PlayingStateManagerTests.swift +57 -0
- package/ios/Tests/QueueManagerTests.swift +195 -18
- package/ios/Tests/RemoteCommandControllerTests.swift +156 -0
- package/ios/Tests/RemoteCommandTests.swift +67 -0
- package/ios/Tests/ResolvedTrackCopyingTests.swift +15 -8
- package/ios/Tests/RetryManagerTests.swift +178 -0
- package/ios/Tests/SearchDrillInTests.swift +63 -0
- package/ios/Tests/SectionScopeTests.swift +82 -0
- package/ios/Tests/SleepTimerManagerTests.swift +107 -0
- package/ios/Tests/Support/ManualSleepTimerScheduler.swift +47 -0
- package/ios/Tests/Support/TestTypes.swift +61 -20
- package/ios/Tests/TabBarEntriesTests.swift +71 -0
- package/ios/Tests/TrackSelectorTests.swift +15 -15
- package/ios/TrackPlayer.swift +385 -58
- package/ios/TrackPlayerCallbacks.swift +5 -44
- package/ios/TrackSelector.swift +5 -5
- package/ios/Util/ArtworkImageFetcher.swift +4 -2
- package/ios/Util/LRUCache.swift +4 -1
- package/ios/Util/NetworkMonitor.swift +7 -3
- package/ios/Util/OnceValue.swift +34 -0
- package/lib/commonjs/AudioBrowser.js +0 -11
- package/lib/commonjs/AudioBrowser.js.map +1 -1
- package/lib/commonjs/CLAUDE.md +52 -0
- package/lib/commonjs/features/browser-config.js +227 -0
- package/lib/commonjs/features/browser-config.js.map +1 -0
- package/lib/commonjs/features/browser.js +60 -159
- package/lib/commonjs/features/browser.js.map +1 -1
- package/lib/commonjs/features/carConnection.js +42 -0
- package/lib/commonjs/features/carConnection.js.map +1 -0
- package/lib/commonjs/features/equalizer.js +1 -1
- package/lib/commonjs/features/errors.js +37 -5
- package/lib/commonjs/features/errors.js.map +1 -1
- package/lib/commonjs/features/favorites.js +1 -1
- package/lib/commonjs/features/gate.js +164 -0
- package/lib/commonjs/features/gate.js.map +1 -0
- package/lib/commonjs/features/index.js +22 -0
- package/lib/commonjs/features/index.js.map +1 -1
- package/lib/commonjs/features/metadata.js +20 -3
- package/lib/commonjs/features/metadata.js.map +1 -1
- package/lib/commonjs/features/network.js +1 -1
- package/lib/commonjs/features/nowPlaying.js +36 -1
- package/lib/commonjs/features/nowPlaying.js.map +1 -1
- package/lib/commonjs/features/output.js +37 -23
- package/lib/commonjs/features/output.js.map +1 -1
- package/lib/commonjs/features/playback/controls.js +9 -0
- package/lib/commonjs/features/playback/controls.js.map +1 -1
- package/lib/commonjs/features/playback/index.js +11 -0
- 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 +29 -13
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/state.js +1 -1
- package/lib/commonjs/features/playback/trackPlaybackTime.js +86 -0
- package/lib/commonjs/features/playback/trackPlaybackTime.js.map +1 -0
- package/lib/commonjs/features/playback/volume.js +2 -2
- package/lib/commonjs/features/player/options.js +79 -29
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +256 -3
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/player/validateOptions.js +21 -0
- package/lib/commonjs/features/player/validateOptions.js.map +1 -0
- package/lib/commonjs/features/queue/activeTrack.js +1 -1
- package/lib/commonjs/features/queue/queue.js +12 -5
- 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/remoteControls.js +14 -104
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/features/sleepTimer.js +22 -5
- package/lib/commonjs/features/sleepTimer.js.map +1 -1
- package/lib/commonjs/native.js +5 -0
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/native.web.js +4 -1
- package/lib/commonjs/native.web.js.map +1 -1
- package/lib/commonjs/test-utils/reactNativeStub.js +65 -0
- package/lib/commonjs/test-utils/reactNativeStub.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 +0 -3
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/commonjs/utils/artwork.js +31 -0
- package/lib/commonjs/utils/artwork.js.map +1 -0
- package/lib/commonjs/web/NativeAudioBrowser.js +302 -125
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +71 -0
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js +34 -0
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Player.js +90 -26
- package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js +21 -0
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +273 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +158 -0
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.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 +34 -3
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js +75 -0
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/index.js +13 -5
- package/lib/commonjs/web/TrackPlayer/index.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +176 -50
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
- package/lib/commonjs/web/browser/NavigationErrorManager.js +3 -1
- package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/commonjs/web/browser/SearchManager.js +11 -9
- package/lib/commonjs/web/browser/SearchManager.js.map +1 -1
- package/lib/commonjs/web/browser/assertBrowsePageShape.js +22 -0
- package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +1 -0
- package/lib/commonjs/web/browser/classifyTrackNavigation.js +41 -0
- package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +1 -0
- package/lib/commonjs/web/browser/parseSearchResponse.js +20 -0
- package/lib/commonjs/web/browser/parseSearchResponse.js.map +1 -0
- package/lib/commonjs/web/http/HttpClient.js +4 -23
- package/lib/commonjs/web/http/HttpClient.js.map +1 -1
- package/lib/commonjs/web/http/RequestConfigBuilder.js +107 -58
- package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/commonjs/web/playbackErrorKind.js +57 -0
- package/lib/commonjs/web/playbackErrorKind.js.map +1 -0
- package/lib/commonjs/web/player/MediaSessionManager.js +121 -0
- package/lib/commonjs/web/player/MediaSessionManager.js.map +1 -0
- package/lib/commonjs/web/player/NowPlayingManager.js +6 -5
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
- package/lib/commonjs/web/player/OptionsManager.js +9 -17
- package/lib/commonjs/web/player/OptionsManager.js.map +1 -1
- package/lib/commonjs/web/player/RemoteCommandController.js +96 -0
- package/lib/commonjs/web/player/RemoteCommandController.js.map +1 -0
- package/lib/module/AudioBrowser.js +1 -1
- package/lib/module/AudioBrowser.js.map +1 -1
- package/lib/module/CLAUDE.md +52 -0
- package/lib/module/features/browser-config.js +221 -0
- package/lib/module/features/browser-config.js.map +1 -0
- package/lib/module/features/browser.js +54 -157
- package/lib/module/features/browser.js.map +1 -1
- package/lib/module/features/carConnection.js +37 -0
- package/lib/module/features/carConnection.js.map +1 -0
- package/lib/module/features/equalizer.js +1 -1
- package/lib/module/features/errors.js +37 -5
- package/lib/module/features/errors.js.map +1 -1
- package/lib/module/features/favorites.js +1 -1
- package/lib/module/features/gate.js +159 -0
- package/lib/module/features/gate.js.map +1 -0
- package/lib/module/features/index.js +2 -0
- package/lib/module/features/index.js.map +1 -1
- package/lib/module/features/metadata.js +20 -3
- package/lib/module/features/metadata.js.map +1 -1
- package/lib/module/features/network.js +1 -1
- package/lib/module/features/nowPlaying.js +34 -1
- package/lib/module/features/nowPlaying.js.map +1 -1
- package/lib/module/features/output.js +32 -19
- package/lib/module/features/output.js.map +1 -1
- package/lib/module/features/playback/controls.js +8 -0
- package/lib/module/features/playback/controls.js.map +1 -1
- package/lib/module/features/playback/index.js +1 -0
- 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 +29 -13
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/state.js +1 -1
- package/lib/module/features/playback/trackPlaybackTime.js +83 -0
- package/lib/module/features/playback/trackPlaybackTime.js.map +1 -0
- package/lib/module/features/playback/volume.js +2 -2
- package/lib/module/features/player/options.js +79 -29
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +256 -3
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/player/validateOptions.js +17 -0
- package/lib/module/features/player/validateOptions.js.map +1 -0
- package/lib/module/features/queue/activeTrack.js +1 -1
- package/lib/module/features/queue/queue.js +12 -5
- 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/remoteControls.js +13 -103
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/features/sleepTimer.js +22 -5
- package/lib/module/features/sleepTimer.js.map +1 -1
- package/lib/module/native.js +5 -0
- package/lib/module/native.js.map +1 -1
- package/lib/module/native.web.js +4 -1
- package/lib/module/native.web.js.map +1 -1
- package/lib/module/test-utils/reactNativeStub.js +58 -0
- package/lib/module/test-utils/reactNativeStub.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 +0 -3
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/module/utils/artwork.js +26 -0
- package/lib/module/utils/artwork.js.map +1 -0
- package/lib/module/web/NativeAudioBrowser.js +303 -126
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +67 -0
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +1 -0
- package/lib/module/web/TrackPlayer/PlaybackTimer.js +29 -0
- package/lib/module/web/TrackPlayer/PlaybackTimer.js.map +1 -0
- package/lib/module/web/TrackPlayer/Player.js +90 -26
- package/lib/module/web/TrackPlayer/Player.js.map +1 -1
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js +17 -0
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js.map +1 -0
- package/lib/module/web/TrackPlayer/QueueManager.js +269 -0
- package/lib/module/web/TrackPlayer/QueueManager.js.map +1 -0
- package/lib/module/web/TrackPlayer/QueuePlayer.js +154 -0
- package/lib/module/web/TrackPlayer/QueuePlayer.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 +34 -3
- package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/module/web/TrackPlayer/VolumeFader.js +70 -0
- package/lib/module/web/TrackPlayer/VolumeFader.js.map +1 -0
- package/lib/module/web/TrackPlayer/index.js +2 -1
- package/lib/module/web/TrackPlayer/index.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +176 -50
- package/lib/module/web/browser/BrowserManager.js.map +1 -1
- package/lib/module/web/browser/NavigationErrorManager.js +3 -1
- package/lib/module/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/module/web/browser/SearchManager.js +11 -9
- package/lib/module/web/browser/SearchManager.js.map +1 -1
- package/lib/module/web/browser/assertBrowsePageShape.js +18 -0
- package/lib/module/web/browser/assertBrowsePageShape.js.map +1 -0
- package/lib/module/web/browser/classifyTrackNavigation.js +38 -0
- package/lib/module/web/browser/classifyTrackNavigation.js.map +1 -0
- package/lib/module/web/browser/parseSearchResponse.js +16 -0
- package/lib/module/web/browser/parseSearchResponse.js.map +1 -0
- package/lib/module/web/http/HttpClient.js +4 -23
- package/lib/module/web/http/HttpClient.js.map +1 -1
- package/lib/module/web/http/RequestConfigBuilder.js +107 -58
- package/lib/module/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/module/web/playbackErrorKind.js +52 -0
- package/lib/module/web/playbackErrorKind.js.map +1 -0
- package/lib/module/web/player/MediaSessionManager.js +116 -0
- package/lib/module/web/player/MediaSessionManager.js.map +1 -0
- package/lib/module/web/player/NowPlayingManager.js +7 -5
- package/lib/module/web/player/NowPlayingManager.js.map +1 -1
- package/lib/module/web/player/OptionsManager.js +9 -17
- package/lib/module/web/player/OptionsManager.js.map +1 -1
- package/lib/module/web/player/RemoteCommandController.js +92 -0
- package/lib/module/web/player/RemoteCommandController.js.map +1 -0
- package/lib/typescript/src/AudioBrowser.d.ts +0 -1
- package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
- package/lib/typescript/src/features/browser-config.d.ts +12 -0
- package/lib/typescript/src/features/browser-config.d.ts.map +1 -0
- package/lib/typescript/src/features/browser.d.ts +40 -1
- package/lib/typescript/src/features/browser.d.ts.map +1 -1
- package/lib/typescript/src/features/carConnection.d.ts +20 -0
- package/lib/typescript/src/features/carConnection.d.ts.map +1 -0
- package/lib/typescript/src/features/equalizer.d.ts +1 -1
- package/lib/typescript/src/features/errors.d.ts +61 -6
- 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/gate.d.ts +93 -0
- package/lib/typescript/src/features/gate.d.ts.map +1 -0
- package/lib/typescript/src/features/index.d.ts +2 -0
- package/lib/typescript/src/features/index.d.ts.map +1 -1
- package/lib/typescript/src/features/metadata.d.ts +26 -7
- 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 +28 -1
- package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -1
- package/lib/typescript/src/features/output.d.ts +28 -18
- package/lib/typescript/src/features/output.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/controls.d.ts +5 -0
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/index.d.ts +1 -0
- 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 +4 -1
- 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/trackPlaybackTime.d.ts +34 -0
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/volume.d.ts +2 -2
- package/lib/typescript/src/features/player/options.d.ts +176 -127
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts +216 -167
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/player/validateOptions.d.ts +9 -0
- package/lib/typescript/src/features/player/validateOptions.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/activeTrack.d.ts +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +11 -4
- 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/remoteControls.d.ts +23 -35
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/features/sleepTimer.d.ts +19 -4
- 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 +1 -2
- package/lib/typescript/src/native.d.ts.map +1 -1
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts +17 -225
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
- package/lib/typescript/src/test-utils/reactNativeStub.d.ts +36 -0
- package/lib/typescript/src/test-utils/reactNativeStub.d.ts.map +1 -0
- package/lib/typescript/src/types/browser-native.d.ts +9 -3
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +145 -13
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +349 -85
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +8 -6
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +0 -2
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
- package/lib/typescript/src/utils/artwork.d.ts +19 -0
- package/lib/typescript/src/utils/artwork.d.ts.map +1 -0
- package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -1
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +4 -2
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +24 -10
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +6 -6
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +10 -20
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +33 -1
- package/nitrogen/generated/android/c++/JArtworkVariants.hpp +61 -0
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +5 -0
- package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +3 -3
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +58 -0
- package/nitrogen/generated/android/c++/JFavoritesMatchMode.hpp +58 -0
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +100 -0
- package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +3 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.hpp +112 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +121 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +123 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +133 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +121 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.hpp +139 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.hpp +134 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +8 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +131 -0
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_GateEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +0 -10
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +14 -9
- package/nitrogen/generated/android/c++/JFunc_void_Output.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +10 -10
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +6 -0
- package/nitrogen/generated/android/c++/JGate.hpp +62 -0
- package/nitrogen/generated/android/c++/JGateDecision.hpp +64 -0
- package/nitrogen/generated/android/c++/{JThumbsRating.hpp → JGateEvent.hpp} +16 -15
- package/nitrogen/generated/android/c++/JGateReason.hpp +58 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +247 -223
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +26 -23
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +95 -0
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +33 -3
- package/nitrogen/generated/android/c++/JMediaReference.hpp +58 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +33 -1
- package/nitrogen/generated/android/c++/{JPartialAndroidSetupPlayerOptions.hpp → JNativeAndroidSetupOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +61 -28
- package/nitrogen/generated/android/c++/JNativeGateRequest.hpp +74 -0
- package/nitrogen/generated/android/c++/{JPartialIOSSetupPlayerOptions.hpp → JNativeIOSSetupOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +20 -9
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +182 -0
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +21 -24
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +6 -0
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +10 -20
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +96 -0
- package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +3 -17
- package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +7 -3
- package/nitrogen/generated/android/c++/JOptions.hpp +19 -14
- package/nitrogen/generated/android/c++/{JIosOutput.hpp → JOutput.hpp} +15 -15
- package/nitrogen/generated/android/c++/JOutputType.hpp +82 -0
- package/nitrogen/generated/android/c++/JPlayback.hpp +2 -0
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JPlaybackError.hpp +18 -3
- package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +2 -0
- package/nitrogen/generated/android/c++/JPlaybackErrorKind.hpp +76 -0
- package/nitrogen/generated/android/c++/JPlaybackState.hpp +3 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +11 -5
- package/nitrogen/generated/android/c++/{JNotificationButton.hpp → JRemoteButton.hpp} +20 -20
- package/nitrogen/generated/android/c++/JRemoteButtonLayout.hpp +86 -0
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +23 -5
- package/nitrogen/generated/android/c++/JRetryConfig.hpp +11 -7
- package/nitrogen/generated/android/c++/JSearchMode.hpp +27 -9
- package/nitrogen/generated/android/c++/JSearchParams.hpp +9 -3
- package/nitrogen/generated/android/c++/JStallReason.hpp +58 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +23 -5
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JTrackRequest.hpp +93 -0
- package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +14 -1
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +71 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.hpp +75 -0
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.cpp +41 -0
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +121 -0
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.hpp +70 -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 +3 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +10 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkVariants.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{HeartRating.kt → FavoriteConfig.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{RatingType.kt → FavoritesMatchMode.kt} +5 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNowPlayingParams.kt +50 -0
- 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_RequestConfig___MediaTransformParams.kt +80 -0
- 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 +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___Track.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_std__string____Track.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt → Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.kt} +12 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_RemoteSetRatingEvent.kt → Func_void_GateEvent.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_IosOutput.kt → Func_void_Output.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/{ThumbsRating.kt → Gate.kt} +9 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{PercentageRating.kt → GateDecision.kt} +9 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{StarRating.kt → GateEvent.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NotificationButton.kt → GateReason.kt} +5 -8
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +104 -110
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +24 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaReference.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +10 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{PartialAndroidSetupPlayerOptions.kt → NativeAndroidSetupOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +18 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{RemoteSetRatingEvent.kt → NativeGateRequest.kt} +12 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{PartialIOSSetupPlayerOptions.kt → NativeIOSSetupOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeSetupPlayerOptions.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +3 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +3 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{IosOutput.kt → Output.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/OutputType.kt +31 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorKind.kt +29 -0
- 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/RemoteButton.kt +26 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButtonLayout.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +7 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +12 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StallReason.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackRequest.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +7 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Variant_NullType_NotificationButtonLayout.kt → Variant_NullType_RemoteButtonLayout.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_String_ArtworkVariants.kt +53 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +139 -28
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +1126 -490
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +66 -45
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +178 -120
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +8 -8
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +12 -22
- package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +95 -1
- package/nitrogen/generated/ios/swift/ArtworkVariants.swift +34 -0
- package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +4 -4
- package/nitrogen/generated/ios/swift/FavoriteConfig.swift +29 -0
- package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +40 -0
- package/nitrogen/generated/ios/swift/FormatNowPlayingParams.swift +67 -0
- package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +17 -4
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.swift +54 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +69 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___Track.swift +54 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.swift +60 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_std__string____Track.swift +60 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.swift +77 -0
- package/nitrogen/generated/ios/swift/Func_void_GateDecision.swift +46 -0
- package/nitrogen/generated/ios/swift/{Func_void_RemoteSetRatingEvent.swift → Func_void_GateEvent.swift} +10 -10
- package/nitrogen/generated/ios/swift/{Func_void_IosOutput.swift → Func_void_Output.swift} +10 -10
- package/nitrogen/generated/ios/swift/Func_void_TransformableRequestConfig.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NowPlayingUpdate_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +53 -0
- package/nitrogen/generated/ios/swift/{Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift → Func_void_std__shared_ptr_Promise_GateDecision__.swift} +17 -17
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_TransformableRequestConfig__.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError____.swift +81 -0
- package/nitrogen/generated/ios/swift/Gate.swift +47 -0
- package/nitrogen/generated/ios/swift/GateDecision.swift +40 -0
- package/nitrogen/generated/ios/swift/GateEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/GateReason.swift +40 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +21 -15
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +232 -199
- package/nitrogen/generated/ios/swift/IOSOptions.swift +51 -0
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +121 -2
- package/nitrogen/generated/ios/swift/MediaReference.swift +40 -0
- package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +107 -1
- package/nitrogen/generated/ios/swift/{PartialAndroidSetupPlayerOptions.swift → NativeAndroidSetupOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +161 -22
- package/nitrogen/generated/ios/swift/NativeGateRequest.swift +58 -0
- package/nitrogen/generated/ios/swift/{PartialIOSSetupPlayerOptions.swift → NativeIOSSetupOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +19 -19
- package/nitrogen/generated/ios/swift/NativeSetupPlayerOptions.swift +206 -0
- package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +12 -25
- package/nitrogen/generated/ios/swift/NavigationErrorType.swift +8 -0
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +12 -41
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +90 -0
- package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +1 -48
- package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +19 -1
- package/nitrogen/generated/ios/swift/Options.swift +10 -4
- package/nitrogen/generated/ios/swift/{IosOutput.swift → Output.swift} +7 -7
- package/nitrogen/generated/ios/swift/OutputType.swift +72 -0
- package/nitrogen/generated/ios/swift/PlaybackError.swift +43 -2
- package/nitrogen/generated/ios/swift/PlaybackErrorKind.swift +64 -0
- package/nitrogen/generated/ios/swift/PlaybackState.swift +4 -4
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +27 -8
- package/nitrogen/generated/ios/swift/{NotificationButton.swift → RemoteButton.swift} +10 -10
- package/nitrogen/generated/ios/swift/RemoteButtonLayout.swift +57 -0
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +74 -8
- package/nitrogen/generated/ios/swift/RetryConfig.swift +35 -4
- package/nitrogen/generated/ios/swift/SearchMode.swift +36 -12
- package/nitrogen/generated/ios/swift/SearchParams.swift +7 -2
- package/nitrogen/generated/ios/swift/StallReason.swift +40 -0
- package/nitrogen/generated/ios/swift/Track.swift +74 -8
- package/nitrogen/generated/ios/swift/TrackRequest.swift +106 -0
- package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +60 -1
- package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +18 -0
- package/nitrogen/generated/ios/swift/{Variant_NullType_NotificationButtonLayout.swift → Variant_NullType_RemoteButtonLayout.swift} +3 -3
- package/nitrogen/generated/ios/swift/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.swift +19 -0
- package/nitrogen/generated/ios/swift/Variant_String_ArtworkVariants.swift +18 -0
- package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +10 -10
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +8 -19
- package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +10 -2
- package/nitrogen/generated/shared/c++/ArtworkVariants.hpp +87 -0
- package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +6 -6
- package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +0 -2
- package/nitrogen/generated/shared/c++/{StarRating.hpp → FavoriteConfig.hpp} +18 -17
- package/nitrogen/generated/shared/c++/FavoritesMatchMode.hpp +76 -0
- package/nitrogen/generated/shared/c++/FormatNowPlayingParams.hpp +110 -0
- package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +6 -5
- package/nitrogen/generated/shared/c++/{PercentageRating.hpp → Gate.hpp} +21 -16
- package/nitrogen/generated/shared/c++/{HeartRating.hpp → GateDecision.hpp} +23 -17
- package/nitrogen/generated/shared/c++/{ThumbsRating.hpp → GateEvent.hpp} +18 -17
- package/nitrogen/generated/shared/c++/GateReason.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +22 -19
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +45 -36
- package/nitrogen/generated/shared/c++/IOSOptions.hpp +91 -0
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +33 -2
- package/nitrogen/generated/shared/c++/MediaReference.hpp +76 -0
- package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +10 -2
- package/nitrogen/generated/shared/c++/{PartialAndroidSetupPlayerOptions.hpp → NativeAndroidSetupOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +31 -15
- package/nitrogen/generated/shared/c++/NativeGateRequest.hpp +97 -0
- package/nitrogen/generated/shared/c++/{PartialIOSSetupPlayerOptions.hpp → NativeIOSSetupOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +5 -5
- package/nitrogen/generated/shared/c++/NativeSetupPlayerOptions.hpp +138 -0
- package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +9 -7
- package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +8 -0
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +8 -19
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +92 -0
- package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +3 -19
- package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +6 -2
- package/nitrogen/generated/shared/c++/Options.hpp +8 -8
- package/nitrogen/generated/shared/c++/{IosOutput.hpp → Output.hpp} +18 -18
- package/nitrogen/generated/shared/c++/OutputType.hpp +108 -0
- package/nitrogen/generated/shared/c++/PlaybackError.hpp +18 -3
- package/nitrogen/generated/shared/c++/PlaybackErrorKind.hpp +100 -0
- package/nitrogen/generated/shared/c++/PlaybackState.hpp +9 -9
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +9 -6
- package/nitrogen/generated/shared/c++/{NotificationButton.hpp → RemoteButton.hpp} +25 -25
- package/nitrogen/generated/shared/c++/RemoteButtonLayout.hpp +94 -0
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +24 -5
- package/nitrogen/generated/shared/c++/RetryConfig.hpp +10 -6
- package/nitrogen/generated/shared/c++/SearchMode.hpp +39 -15
- package/nitrogen/generated/shared/c++/SearchParams.hpp +9 -2
- package/nitrogen/generated/shared/c++/StallReason.hpp +76 -0
- package/nitrogen/generated/shared/c++/Track.hpp +24 -5
- package/nitrogen/generated/shared/c++/TrackRequest.hpp +93 -0
- package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +6 -2
- package/package.json +20 -8
- package/src/AudioBrowser.ts +1 -1
- package/src/CLAUDE.md +52 -0
- package/src/codegen-no-config-variant.test.ts +70 -0
- package/src/features/battery.test.ts +79 -0
- package/src/features/browser-config.test.ts +110 -0
- package/src/features/browser-config.ts +293 -0
- package/src/features/browser.test.ts +19 -0
- package/src/features/browser.ts +59 -202
- package/src/features/carConnection.ts +36 -0
- package/src/features/equalizer.ts +1 -1
- package/src/features/errors.ts +71 -5
- package/src/features/favorites.ts +1 -1
- package/src/features/gate.test.ts +72 -0
- package/src/features/gate.ts +170 -0
- package/src/features/hook-wiring.test.ts +254 -0
- package/src/features/index.ts +2 -0
- package/src/features/metadata.ts +26 -15
- package/src/features/network.ts +1 -1
- package/src/features/nowPlaying.ts +37 -1
- package/src/features/output.ts +35 -22
- package/src/features/playback/controls.ts +8 -0
- package/src/features/playback/index.ts +1 -0
- package/src/features/playback/playWhenReady.ts +1 -1
- package/src/features/playback/playing.ts +1 -1
- package/src/features/playback/progress.test.ts +169 -0
- package/src/features/playback/progress.ts +32 -13
- package/src/features/playback/state.ts +1 -1
- package/src/features/playback/trackPlaybackTime.test.ts +76 -0
- package/src/features/playback/trackPlaybackTime.ts +101 -0
- package/src/features/playback/volume.ts +2 -2
- package/src/features/player/options.test.ts +38 -0
- package/src/features/player/options.ts +217 -110
- package/src/features/player/setup.test.ts +125 -0
- package/src/features/player/setup.ts +400 -175
- package/src/features/player/validateOptions.ts +19 -0
- package/src/features/queue/activeTrack.ts +1 -1
- package/src/features/queue/queue.test.ts +36 -0
- package/src/features/queue/queue.ts +17 -6
- package/src/features/queue/repeatMode.ts +1 -1
- package/src/features/queue/shuffle.ts +1 -1
- package/src/features/remoteControls.ts +13 -115
- package/src/features/sleepTimer.test.ts +172 -0
- package/src/features/sleepTimer.ts +32 -5
- package/src/native.ts +5 -0
- package/src/native.web.ts +4 -1
- package/src/public-surface.test.ts +107 -0
- package/src/specs/audio-browser.nitro.ts +132 -42
- package/src/test-utils/reactNativeStub.ts +60 -0
- package/src/types/browser-native.ts +19 -6
- package/src/types/browser-nodes.ts +160 -13
- package/src/types/browser.ts +377 -89
- package/src/utils/LazyNativeEmitter.ts +9 -8
- package/src/utils/NativeUpdatedValue.ts +0 -2
- package/src/utils/artwork.ts +30 -0
- package/src/utils/useDebug.test.ts +182 -0
- package/src/utils/useNativeUpdatedValue.test.ts +103 -0
- package/src/web/NativeAudioBrowser.playWhenReady.test.ts +301 -0
- package/src/web/NativeAudioBrowser.ts +366 -159
- package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +139 -0
- package/src/web/TrackPlayer/PlaybackStateMachine.ts +82 -0
- package/src/web/TrackPlayer/PlaybackTimer.test.ts +67 -0
- package/src/web/TrackPlayer/PlaybackTimer.ts +33 -0
- package/src/web/TrackPlayer/Player.dispatch.test.ts +229 -0
- package/src/web/TrackPlayer/Player.load.test.ts +86 -0
- package/src/web/TrackPlayer/Player.ts +113 -39
- package/src/web/TrackPlayer/PlayingStateFactory.test.ts +51 -0
- package/src/web/TrackPlayer/PlayingStateFactory.ts +24 -0
- package/src/web/TrackPlayer/QueueManager.test.ts +289 -0
- package/src/web/TrackPlayer/QueueManager.ts +302 -0
- package/src/web/TrackPlayer/QueuePlayer.ts +188 -0
- package/src/web/TrackPlayer/RepeatMode.ts +1 -1
- package/src/web/TrackPlayer/SleepTimer.ts +38 -3
- package/src/web/TrackPlayer/VolumeFader.ts +74 -0
- package/src/web/TrackPlayer/index.ts +2 -1
- package/src/web/browser/BrowserManager.ts +231 -62
- package/src/web/browser/NavigationErrorManager.ts +3 -1
- package/src/web/browser/SearchManager.ts +11 -15
- package/src/web/browser/__tests__/layer-resolver.test.ts +69 -0
- package/src/web/browser/assertBrowsePageShape.test.ts +27 -0
- package/src/web/browser/assertBrowsePageShape.ts +27 -0
- package/src/web/browser/classifyTrackNavigation.test.ts +41 -0
- package/src/web/browser/classifyTrackNavigation.ts +35 -0
- package/src/web/browser/parseSearchResponse.test.ts +25 -0
- package/src/web/browser/parseSearchResponse.ts +15 -0
- package/src/web/http/HttpClient.ts +5 -35
- package/src/web/http/RequestConfigBuilder.test.ts +59 -0
- package/src/web/http/RequestConfigBuilder.ts +120 -63
- package/src/web/playbackErrorKind.test.ts +55 -0
- package/src/web/playbackErrorKind.ts +56 -0
- package/src/web/player/MediaSessionManager.test.ts +220 -0
- package/src/web/player/MediaSessionManager.ts +151 -0
- package/src/web/player/NowPlayingManager.test.ts +46 -0
- package/src/web/player/NowPlayingManager.ts +6 -5
- package/src/web/player/OptionsManager.ts +12 -18
- package/src/web/player/RemoteCommandController.test.ts +171 -0
- package/src/web/player/RemoteCommandController.ts +166 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +0 -59
- package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +0 -72
- package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +0 -36
- package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +0 -146
- package/ios/CarPlay/Track+CarPlay.swift +0 -63
- package/ios/Model/MediaURL.swift +0 -67
- package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +0 -9
- package/ios/Player/PlaybackProgressUpdateManager.swift +0 -68
- package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +0 -166
- package/lib/commonjs/features/rating.js +0 -2
- package/lib/commonjs/features/rating.js.map +0 -1
- package/lib/commonjs/types/player.js +0 -2
- package/lib/commonjs/types/player.js.map +0 -1
- package/lib/commonjs/web/SimpleRouter.test.js +0 -174
- package/lib/commonjs/web/SimpleRouter.test.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +0 -293
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +0 -1
- package/lib/module/features/rating.js +0 -2
- package/lib/module/features/rating.js.map +0 -1
- package/lib/module/types/player.js +0 -2
- package/lib/module/types/player.js.map +0 -1
- package/lib/module/web/SimpleRouter.test.js +0 -174
- package/lib/module/web/SimpleRouter.test.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js +0 -288
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +0 -1
- package/lib/typescript/src/features/rating.d.ts +0 -14
- package/lib/typescript/src/features/rating.d.ts.map +0 -1
- package/lib/typescript/src/native.web.d.ts +0 -3
- package/lib/typescript/src/native.web.d.ts.map +0 -1
- package/lib/typescript/src/types/player.d.ts +0 -64
- package/lib/typescript/src/types/player.d.ts.map +0 -1
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +0 -188
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +0 -1
- package/lib/typescript/src/web/SimpleRouter.d.ts +0 -40
- package/lib/typescript/src/web/SimpleRouter.d.ts.map +0 -1
- package/lib/typescript/src/web/SimpleRouter.test.d.ts +0 -2
- package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts +0 -11
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts +0 -59
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +0 -39
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +0 -6
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +0 -4
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +0 -34
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/State.d.ts +0 -13
- package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/index.d.ts +0 -5
- package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/BrowserManager.d.ts +0 -154
- package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts +0 -42
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +0 -40
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/SearchManager.d.ts +0 -22
- package/lib/typescript/src/web/browser/SearchManager.d.ts.map +0 -1
- package/lib/typescript/src/web/http/HttpClient.d.ts +0 -25
- package/lib/typescript/src/web/http/HttpClient.d.ts.map +0 -1
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +0 -98
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +0 -1
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts +0 -34
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +0 -1
- package/lib/typescript/src/web/player/OptionsManager.d.ts +0 -32
- package/lib/typescript/src/web/player/OptionsManager.d.ts.map +0 -1
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +0 -69
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +0 -1
- package/lib/typescript/src/web/util/shuffle.d.ts +0 -8
- package/lib/typescript/src/web/util/shuffle.d.ts.map +0 -1
- package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +0 -86
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +0 -147
- package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +0 -80
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +0 -87
- package/nitrogen/generated/android/c++/JHeartRating.hpp +0 -57
- package/nitrogen/generated/android/c++/JIosOutputType.hpp +0 -85
- package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +0 -94
- package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +0 -96
- package/nitrogen/generated/android/c++/JPercentageRating.hpp +0 -57
- package/nitrogen/generated/android/c++/JRatingType.hpp +0 -73
- package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +0 -66
- package/nitrogen/generated/android/c++/JStarRating.hpp +0 -57
- package/nitrogen/generated/android/c++/JUpdateOptions.hpp +0 -105
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +0 -34
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +0 -105
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +0 -75
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +0 -32
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +0 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +0 -53
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +0 -77
- package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +0 -119
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +0 -68
- package/nitrogen/generated/ios/swift/HeartRating.swift +0 -29
- package/nitrogen/generated/ios/swift/IosOutputType.swift +0 -76
- package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +0 -92
- package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +0 -101
- package/nitrogen/generated/ios/swift/PercentageRating.swift +0 -29
- package/nitrogen/generated/ios/swift/RatingType.swift +0 -60
- package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +0 -58
- package/nitrogen/generated/ios/swift/StarRating.swift +0 -29
- package/nitrogen/generated/ios/swift/ThumbsRating.swift +0 -29
- package/nitrogen/generated/ios/swift/UpdateOptions.swift +0 -143
- package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +0 -20
- package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +0 -109
- package/nitrogen/generated/shared/c++/IosOutputType.hpp +0 -112
- package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +0 -102
- package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +0 -104
- package/nitrogen/generated/shared/c++/RatingType.hpp +0 -96
- package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +0 -94
- package/nitrogen/generated/shared/c++/UpdateOptions.hpp +0 -111
- package/src/features/rating.ts +0 -17
- package/src/types/player.ts +0 -69
- package/src/web/TrackPlayer/PlaylistPlayer.ts +0 -346
package/src/types/browser.ts
CHANGED
|
@@ -56,66 +56,123 @@ export type BrowseResult = ResolvedTrack | BrowseError
|
|
|
56
56
|
|
|
57
57
|
export type BrowserSourceCallback = (
|
|
58
58
|
param: BrowserSourceCallbackParam
|
|
59
|
-
) => Promise<BrowseResult>
|
|
59
|
+
) => BrowseResult | Promise<BrowseResult>
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* Search mode
|
|
62
|
+
* Search mode — the *container vertical*: what KIND of result the user asked
|
|
63
|
+
* for. Orthogonal to the filter props (`genre`/`artist`/`album`/`title`/
|
|
64
|
+
* `playlist`), which say *which* item. `mode` is optional: when absent, the
|
|
65
|
+
* request is unstructured (text-search `query`) or unclassified.
|
|
63
66
|
*
|
|
64
|
-
* - `any`:
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* - `
|
|
68
|
-
* - `
|
|
69
|
-
* - `
|
|
67
|
+
* - `any`: play anything sensible — "play something" / smart shuffle (query
|
|
68
|
+
* empty). Android also maps its generic "play music" focus here, since it
|
|
69
|
+
* can't isolate the music vertical the way iOS can.
|
|
70
|
+
* - `song`: an individual track
|
|
71
|
+
* - `playlist`: a named playlist / mix
|
|
72
|
+
* - `station`: a live radio station / channel
|
|
73
|
+
* - `podcast`: a podcast (series, episode, or station)
|
|
74
|
+
* - `audiobook`: an audiobook
|
|
75
|
+
* - `news`: news content
|
|
76
|
+
* - `music`: the music vertical, as opposed to talk/podcasts/audiobooks
|
|
77
|
+
* ("play music" on iOS, via the music media type)
|
|
78
|
+
* - `music-video` / `movie` / `tv-show` / `tv-show-episode`: video kinds
|
|
79
|
+
* (an audio app cannot play these; surfaced so consumers may special-case —
|
|
80
|
+
* ignoring them degrades to an unstructured search)
|
|
81
|
+
*
|
|
82
|
+
* NOTE: there is intentionally no `genre`/`artist`/`album` member — those are
|
|
83
|
+
* filters, not result shapes. Read them from `SearchParams.genre`/`.artist`/
|
|
84
|
+
* `.album` directly.
|
|
70
85
|
*
|
|
71
86
|
* @see BrowserConfiguration.search
|
|
72
87
|
* @see SearchParams
|
|
73
88
|
*/
|
|
74
89
|
export type SearchMode =
|
|
75
90
|
| 'any'
|
|
76
|
-
| 'genre'
|
|
77
|
-
| 'artist'
|
|
78
|
-
| 'album'
|
|
79
91
|
| 'song'
|
|
80
92
|
| 'playlist'
|
|
93
|
+
| 'station'
|
|
94
|
+
| 'podcast'
|
|
95
|
+
| 'audiobook'
|
|
96
|
+
| 'news'
|
|
97
|
+
| 'music'
|
|
98
|
+
| 'music-video'
|
|
99
|
+
| 'movie'
|
|
100
|
+
| 'tv-show'
|
|
101
|
+
| 'tv-show-episode'
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The media-reference axis from a voice intent.
|
|
105
|
+
*
|
|
106
|
+
* - `my`: the user's own collection ("play my favorites") — routed to the
|
|
107
|
+
* `search` source so the consumer resolves it against their library.
|
|
108
|
+
* - `unknown`: no reference (the default; Android always emits this).
|
|
109
|
+
*
|
|
110
|
+
* NOTE: "currently playing" ("play this") is resolved natively (resume) and
|
|
111
|
+
* never reaches the consumer, so it is not a value here.
|
|
112
|
+
*/
|
|
113
|
+
export type MediaReference = 'my' | 'unknown'
|
|
81
114
|
|
|
82
115
|
/**
|
|
83
|
-
* Structured search parameters from voice
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* - "play something"
|
|
87
|
-
* - "play music"
|
|
88
|
-
* - "play jazz"
|
|
89
|
-
* - "play
|
|
90
|
-
* - "play
|
|
91
|
-
* - "play
|
|
116
|
+
* Structured search parameters normalized from a voice/search intent — one
|
|
117
|
+
* cross-platform shape (iOS SiriKit + Android MediaSession). `mode` is the
|
|
118
|
+
* container vertical; the remaining fields are filters. Example mappings:
|
|
119
|
+
* - "play something" → mode='any', query="" (smart shuffle)
|
|
120
|
+
* - "play music" → mode='music' (iOS) / 'any' (Android), query=""
|
|
121
|
+
* - "play jazz" → genre="jazz", query="jazz" (mode undefined)
|
|
122
|
+
* - "play the radishes" → artist="the radishes", query="the radishes"
|
|
123
|
+
* - "play greens by the radishes" → album="greens", artist="the radishes"
|
|
124
|
+
* - "play sweet pea" → mode='song', title="sweet pea", query="sweet pea"
|
|
125
|
+
* - "play my favorites" → reference='my', query=""
|
|
126
|
+
* - "play a jazz podcast" → mode='podcast', genre="jazz"
|
|
92
127
|
*/
|
|
93
128
|
export interface SearchParams {
|
|
94
|
-
/**
|
|
129
|
+
/** Container vertical, or undefined for an unstructured / unclassified search. */
|
|
95
130
|
mode?: SearchMode
|
|
96
131
|
/**
|
|
97
132
|
* The original search query string (always present, but may be empty string "").
|
|
98
|
-
*
|
|
133
|
+
* With mode='any' and empty query, return any content the user would like
|
|
99
134
|
* (e.g., recently played, favorites, or smart shuffle).
|
|
100
135
|
*/
|
|
101
136
|
query: string
|
|
102
|
-
/** Genre
|
|
137
|
+
/** Genre filter, when the intent named one. */
|
|
103
138
|
genre?: string
|
|
104
|
-
/** Artist
|
|
139
|
+
/** Artist filter (artist / album / song intents). */
|
|
105
140
|
artist?: string
|
|
106
|
-
/** Album
|
|
141
|
+
/** Album filter. */
|
|
107
142
|
album?: string
|
|
108
|
-
/**
|
|
143
|
+
/** Track title, for a song intent. */
|
|
109
144
|
title?: string
|
|
110
|
-
/** Playlist name for playlist
|
|
145
|
+
/** Playlist name, for a playlist intent. */
|
|
111
146
|
playlist?: string
|
|
147
|
+
/**
|
|
148
|
+
* Media-reference axis. `'my'` = resolve against the user's own collection
|
|
149
|
+
* ("play my favorites"); `'unknown'` = no reference (the default). Android
|
|
150
|
+
* always emits `'unknown'`.
|
|
151
|
+
*
|
|
152
|
+
* Resolve it however your collection lives: a `SearchSourceCallback` can read
|
|
153
|
+
* `params.reference` and return the matching tracks directly, or — when using
|
|
154
|
+
* an HTTP `TransformableRequestConfig` — branch in `transform` on
|
|
155
|
+
* `request.query.reference === 'my'` to rewrite the request toward a
|
|
156
|
+
* favorites endpoint (e.g. injecting locally-stored identifiers into the body).
|
|
157
|
+
*/
|
|
158
|
+
reference: MediaReference
|
|
112
159
|
}
|
|
113
160
|
|
|
114
161
|
export type SearchSourceCallback = (params: SearchParams) => Promise<Track[]>
|
|
162
|
+
// Sync and async transforms are SEPARATE fields (`transform` / `transformSync`),
|
|
163
|
+
// never a `T | Promise<T>` union. A union lowers to a Nitro `variant<Struct,
|
|
164
|
+
// Promise<Struct>>`, and an all-optional struct's `canConvert` also accepts a
|
|
165
|
+
// Promise — so the async case is silently misread as an empty config. Two
|
|
166
|
+
// single-typed fields keep both paths unambiguous, and the sync field allocates
|
|
167
|
+
// no Promise. When both are set they run as a pipeline: async first, then sync.
|
|
115
168
|
export type RequestConfigTransformer = (
|
|
116
169
|
request: RequestConfig,
|
|
117
170
|
routeParams?: Record<string, string>
|
|
118
171
|
) => Promise<RequestConfig>
|
|
172
|
+
export type RequestConfigTransformerSync = (
|
|
173
|
+
request: RequestConfig,
|
|
174
|
+
routeParams?: Record<string, string>
|
|
175
|
+
) => RequestConfig
|
|
119
176
|
|
|
120
177
|
export type HttpMethod =
|
|
121
178
|
| 'GET'
|
|
@@ -215,9 +272,13 @@ export interface MediaTransformParams {
|
|
|
215
272
|
* }
|
|
216
273
|
* ```
|
|
217
274
|
*/
|
|
275
|
+
// Split sync/async — see RequestConfigTransformer. Set `transform` and/or `transformSync`.
|
|
218
276
|
export type MediaRequestConfigTransformer = (
|
|
219
277
|
params: MediaTransformParams
|
|
220
278
|
) => Promise<RequestConfig>
|
|
279
|
+
export type MediaRequestConfigTransformerSync = (
|
|
280
|
+
params: MediaTransformParams
|
|
281
|
+
) => RequestConfig
|
|
221
282
|
|
|
222
283
|
/**
|
|
223
284
|
* Request configuration that supports async transformation.
|
|
@@ -227,6 +288,11 @@ export type MediaRequestConfigTransformer = (
|
|
|
227
288
|
* before the request is made. This is useful for adding dynamic headers,
|
|
228
289
|
* signing URLs, or other request-time modifications.
|
|
229
290
|
*
|
|
291
|
+
* Note: when a layer provides a transform, the layer's other static fields
|
|
292
|
+
* are NOT merged — the transform receives the merged config from the layers
|
|
293
|
+
* below it, and its return value replaces that config entirely. Spread the
|
|
294
|
+
* incoming request (`{ ...request, ... }`) to keep its fields.
|
|
295
|
+
*
|
|
230
296
|
* @example
|
|
231
297
|
* ```typescript
|
|
232
298
|
* const config: TransformableRequestConfig = {
|
|
@@ -242,9 +308,46 @@ export type MediaRequestConfigTransformer = (
|
|
|
242
308
|
* ```
|
|
243
309
|
*/
|
|
244
310
|
export interface TransformableRequestConfig extends RequestConfig {
|
|
311
|
+
/** Async per-request transform. When both are set, runs BEFORE `transformSync`. */
|
|
245
312
|
transform?: RequestConfigTransformer
|
|
313
|
+
/** Sync per-request transform (no Promise allocation). When both are set, runs AFTER `transform`. */
|
|
314
|
+
transformSync?: RequestConfigTransformerSync
|
|
246
315
|
}
|
|
247
316
|
|
|
317
|
+
/**
|
|
318
|
+
* Lazily builds the config for a `request` or `browse` layer. Reach for it when
|
|
319
|
+
* the config depends on a value that changes now and then — a base URL, a
|
|
320
|
+
* locale — but not on every request.
|
|
321
|
+
*
|
|
322
|
+
* How it differs from a `transform`: **a resolver runs once and its result is
|
|
323
|
+
* cached**, then reused for every browse/search/media/artwork request — whereas a
|
|
324
|
+
* `transform` runs on *every* request. The resolver re-runs only when you call
|
|
325
|
+
* `invalidateAllContent()`, so call that after (say) an environment or locale
|
|
326
|
+
* switch to pick up the new value.
|
|
327
|
+
*
|
|
328
|
+
* Return the config directly — no `async`/Promise needed in the common case — or
|
|
329
|
+
* a `Promise` when you must await (e.g. fetching a token). The cached config
|
|
330
|
+
* flows through the normal layering, so its `query` merges additively and its
|
|
331
|
+
* `baseUrl` overrides, exactly like a static config; it may also include a
|
|
332
|
+
* `transform` if you additionally need genuine per-request logic.
|
|
333
|
+
*
|
|
334
|
+
* @example
|
|
335
|
+
* ```typescript
|
|
336
|
+
* configureBrowser({
|
|
337
|
+
* // Read once and cached; re-read after the next invalidateAllContent().
|
|
338
|
+
* request: () => ({ baseUrl: currentBaseUrl() }),
|
|
339
|
+
* // Browse-only locale param, merged into every browse request's query.
|
|
340
|
+
* browse: () => ({ query: { hl: currentLocale() } }),
|
|
341
|
+
* })
|
|
342
|
+
*
|
|
343
|
+
* // Async resolver (e.g. awaiting a token) — still runs once, then cached:
|
|
344
|
+
* request: async () => ({ headers: { authorization: await freshToken() } })
|
|
345
|
+
* ```
|
|
346
|
+
*/
|
|
347
|
+
export type RequestConfigResolver = () =>
|
|
348
|
+
| TransformableRequestConfig
|
|
349
|
+
| Promise<TransformableRequestConfig>
|
|
350
|
+
|
|
248
351
|
/**
|
|
249
352
|
* Configuration for artwork image requests
|
|
250
353
|
*
|
|
@@ -372,13 +475,13 @@ export interface MediaRequestConfig extends TransformableRequestConfig {
|
|
|
372
475
|
*
|
|
373
476
|
* Called for each track to generate the final request configuration.
|
|
374
477
|
* Receives the full Track object, allowing URL generation based on
|
|
375
|
-
* track metadata (artist, album, src, etc.).
|
|
478
|
+
* track metadata (id, artist, album, src, etc.).
|
|
376
479
|
*
|
|
377
480
|
* The returned config is merged with base configs, then passed to
|
|
378
481
|
* `transform` if provided.
|
|
379
482
|
*
|
|
380
483
|
* @param track - The track being requested
|
|
381
|
-
* @returns Request configuration for this specific track
|
|
484
|
+
* @returns Request configuration for this specific track (sync or async)
|
|
382
485
|
*
|
|
383
486
|
* @example
|
|
384
487
|
* ```typescript
|
|
@@ -388,7 +491,10 @@ export interface MediaRequestConfig extends TransformableRequestConfig {
|
|
|
388
491
|
* })
|
|
389
492
|
* ```
|
|
390
493
|
*/
|
|
494
|
+
/** Async per-track resolution. When both are set, runs (merged) BEFORE `resolveSync`. */
|
|
391
495
|
resolve?: (track: Track) => Promise<RequestConfig>
|
|
496
|
+
/** Sync per-track resolution (no Promise allocation). When both are set, runs (merged) AFTER `resolve`. */
|
|
497
|
+
resolveSync?: (track: Track) => RequestConfig
|
|
392
498
|
}
|
|
393
499
|
|
|
394
500
|
export interface ArtworkRequestConfig extends RequestConfig {
|
|
@@ -396,7 +502,7 @@ export interface ArtworkRequestConfig extends RequestConfig {
|
|
|
396
502
|
* Per-track request resolution callback.
|
|
397
503
|
*
|
|
398
504
|
* Called for each track to generate the request configuration based on
|
|
399
|
-
* track metadata (artist, album, src, etc.).
|
|
505
|
+
* track metadata (id, artist, album, src, etc.).
|
|
400
506
|
*
|
|
401
507
|
* The returned config is merged with base configs, then passed to
|
|
402
508
|
* `transform` if provided.
|
|
@@ -414,7 +520,10 @@ export interface ArtworkRequestConfig extends RequestConfig {
|
|
|
414
520
|
* }
|
|
415
521
|
* ```
|
|
416
522
|
*/
|
|
523
|
+
/** Async per-track resolution. When both are set, runs (merged) BEFORE `resolveSync`. */
|
|
417
524
|
resolve?: (track: Track) => Promise<RequestConfig>
|
|
525
|
+
/** Sync per-track resolution (no Promise allocation). When both are set, runs (merged) AFTER `resolve`. */
|
|
526
|
+
resolveSync?: (track: Track) => RequestConfig
|
|
418
527
|
|
|
419
528
|
/**
|
|
420
529
|
* Final transformation callback for media/artwork requests.
|
|
@@ -445,7 +554,10 @@ export interface ArtworkRequestConfig extends RequestConfig {
|
|
|
445
554
|
* }
|
|
446
555
|
* ```
|
|
447
556
|
*/
|
|
557
|
+
/** Async final transform. When both are set, runs BEFORE `transformSync`. */
|
|
448
558
|
transform?: MediaRequestConfigTransformer
|
|
559
|
+
/** Sync final transform (no Promise allocation). When both are set, runs AFTER `transform`. */
|
|
560
|
+
transformSync?: MediaRequestConfigTransformerSync
|
|
449
561
|
|
|
450
562
|
/**
|
|
451
563
|
* Query parameter names for automatic context injection from CarPlay/Android Auto.
|
|
@@ -473,6 +585,19 @@ export interface ArtworkRequestConfig extends RequestConfig {
|
|
|
473
585
|
imageQueryParams?: ImageQueryParams
|
|
474
586
|
}
|
|
475
587
|
|
|
588
|
+
/**
|
|
589
|
+
* Source for a browse container's contents.
|
|
590
|
+
*
|
|
591
|
+
* **Response shape (HTTP / `TransformableRequestConfig`):** the endpoint must
|
|
592
|
+
* return a single **page object** — a {@link ResolvedTrack}
|
|
593
|
+
* (`{ title, url?, children: Track[] }`). The `children` array holds the rows
|
|
594
|
+
* shown for the container; each child is a playable leaf (`src`) or a navigable
|
|
595
|
+
* sub-container (`url`). A callback / static `ResolvedTrack` returns the same
|
|
596
|
+
* page object directly.
|
|
597
|
+
*
|
|
598
|
+
* {@link SearchSource} and {@link TabsSource} HTTP endpoints return this same
|
|
599
|
+
* page shape; only the meaning of `children` differs (results / tabs).
|
|
600
|
+
*/
|
|
476
601
|
export type BrowserSource =
|
|
477
602
|
| ResolvedTrack
|
|
478
603
|
| BrowserSourceCallback
|
|
@@ -503,12 +628,15 @@ export type RouteConfig = {
|
|
|
503
628
|
artwork?: ArtworkRequestConfig
|
|
504
629
|
}
|
|
505
630
|
|
|
506
|
-
export type TabsSourceCallback = () => Promise<Track[]>
|
|
631
|
+
export type TabsSourceCallback = () => Track[] | Promise<Track[]>
|
|
507
632
|
/**
|
|
508
633
|
* Tab source configuration for navigation tabs.
|
|
509
634
|
*
|
|
510
|
-
* When using API configuration (TransformableRequestConfig), the request path
|
|
511
|
-
*
|
|
635
|
+
* When using API configuration (TransformableRequestConfig), the request path
|
|
636
|
+
* defaults to '/' and the endpoint must return a page object
|
|
637
|
+
* `{ title?, children: Track[] }` whose `children` are the tabs — the same
|
|
638
|
+
* shape a browse endpoint returns. Callback/static sources provide `Track[]`
|
|
639
|
+
* directly.
|
|
512
640
|
*/
|
|
513
641
|
export type TabsSource =
|
|
514
642
|
| Track[]
|
|
@@ -518,30 +646,103 @@ export type TabsSource =
|
|
|
518
646
|
/**
|
|
519
647
|
* Search source configuration for handling search requests.
|
|
520
648
|
*
|
|
649
|
+
* **Response shape (HTTP / `TransformableRequestConfig`):** the endpoint must
|
|
650
|
+
* return a page object — `{ title?, children: Track[] }` — whose `children`
|
|
651
|
+
* are the result rows, the same shape a browse endpoint returns. (The web
|
|
652
|
+
* implementation additionally accepts a bare `Track[]` for back-compat;
|
|
653
|
+
* iOS/Android do not.) Callback sources return `Track[]` directly.
|
|
654
|
+
*
|
|
521
655
|
* @see BrowserConfiguration.search
|
|
522
656
|
*/
|
|
523
657
|
export type SearchSource = SearchSourceCallback | TransformableRequestConfig
|
|
524
658
|
|
|
659
|
+
/**
|
|
660
|
+
* How ids passed to `setFavorites` are matched against a
|
|
661
|
+
* track's `src` to hydrate its `favorited` flag.
|
|
662
|
+
*
|
|
663
|
+
* - `'exact'`: the id must equal `src`.
|
|
664
|
+
* - `'partial'`: the id matches if it appears as a complete path segment within
|
|
665
|
+
* `src` (delimited by `/`, `?`, `#`, or the string boundaries). Useful when
|
|
666
|
+
* favorites are stored as a stable identifier that is embedded in — but not
|
|
667
|
+
* equal to — the playable `src` URL.
|
|
668
|
+
*
|
|
669
|
+
* @example
|
|
670
|
+
* ```text
|
|
671
|
+
* setFavorites(['abc123']) + track.src = '/stream/jazz-fm/abc123'
|
|
672
|
+
*
|
|
673
|
+
* 'exact' 'abc123' === '/stream/jazz-fm/abc123' → not favorited
|
|
674
|
+
* 'partial' 'abc123' is the last segment of the src → favorited
|
|
675
|
+
*
|
|
676
|
+
* setFavorites(['https://cdn.example.com/jazz-fm/abc123.mp3'])
|
|
677
|
+
*
|
|
678
|
+
* 'exact' id === src → favorited
|
|
679
|
+
* 'partial' id is a full segment of src → favorited
|
|
680
|
+
* ```
|
|
681
|
+
*/
|
|
682
|
+
export type FavoritesMatchMode = 'exact' | 'partial'
|
|
683
|
+
|
|
684
|
+
/**
|
|
685
|
+
* Object form of the `favorite` capability — enables favoriting with an explicit
|
|
686
|
+
* {@link FavoritesMatchMode}. (A bare `true` is shorthand for `{ match: 'exact' }`.)
|
|
687
|
+
*/
|
|
688
|
+
export interface FavoriteConfig {
|
|
689
|
+
match: FavoritesMatchMode
|
|
690
|
+
}
|
|
691
|
+
|
|
525
692
|
export type BrowserConfiguration = {
|
|
526
693
|
/**
|
|
527
|
-
* Initial navigation path. Setting this triggers initial navigation to the
|
|
694
|
+
* Initial navigation path. Setting this triggers initial navigation to the
|
|
695
|
+
* specified path. When unset, the first tab's URL is used; when there are
|
|
696
|
+
* no tabs either, `/`.
|
|
528
697
|
*/
|
|
529
698
|
path?: string | undefined
|
|
530
699
|
|
|
531
700
|
// ─── Request Defaults (applied to all requests) ────────────────────────────
|
|
532
701
|
|
|
533
702
|
/**
|
|
534
|
-
* Shared request settings applied to
|
|
535
|
-
*
|
|
703
|
+
* Shared request settings applied to every HTTP request (browse, search,
|
|
704
|
+
* media, artwork). Layered before the per-kind config and (for browse) the
|
|
705
|
+
* route — so request → `<kind>` → route. Specific configs override these
|
|
706
|
+
* defaults.
|
|
707
|
+
*
|
|
708
|
+
* Either a static {@link TransformableRequestConfig} (its optional `transform`
|
|
709
|
+
* runs per request), or a {@link RequestConfigResolver} thunk resolved once per
|
|
710
|
+
* content generation and re-resolved on `invalidateAllContent()`. Reach for the
|
|
711
|
+
* resolver when a value changes rarely (a base URL, an auth host) so it is read
|
|
712
|
+
* once per generation and merged natively — rather than recomputed on every
|
|
713
|
+
* browse/search/media/artwork request via a `transform`.
|
|
536
714
|
*/
|
|
537
|
-
request?: TransformableRequestConfig
|
|
715
|
+
request?: TransformableRequestConfig | RequestConfigResolver
|
|
538
716
|
|
|
539
|
-
// ───
|
|
717
|
+
// ─── Per-kind request configuration ─────────────────────────────────────────
|
|
540
718
|
|
|
541
|
-
/**
|
|
542
|
-
|
|
719
|
+
/**
|
|
720
|
+
* Request shaping applied to every browse request (all routes, including the
|
|
721
|
+
* implicit default), layered between `request` and the matched route:
|
|
722
|
+
* `request` → `browse` → route. This is the browse-kind analogue of `media`
|
|
723
|
+
* and `artwork` — the place for browse-only concerns (e.g. a content-type
|
|
724
|
+
* marker query, or a locale param) that should not leak onto media/artwork.
|
|
725
|
+
*
|
|
726
|
+
* A browse path with no matching `routes` entry is fetched using
|
|
727
|
+
* `request` + `browse` applied to the path, so this also defines the default
|
|
728
|
+
* browse behaviour. Register a `routes['*']` entry only to override that
|
|
729
|
+
* default with a callback / static / bespoke config.
|
|
730
|
+
*
|
|
731
|
+
* Like `request`, this may be a static {@link TransformableRequestConfig} or a
|
|
732
|
+
* {@link RequestConfigResolver} thunk (resolved once per content generation) —
|
|
733
|
+
* e.g. a locale query param that only changes when `invalidateAllContent()` is
|
|
734
|
+
* called. A resolver's `query` is merged additively into each browse request's
|
|
735
|
+
* query, exactly as a static `query` would be.
|
|
736
|
+
*/
|
|
737
|
+
browse?: TransformableRequestConfig | RequestConfigResolver
|
|
543
738
|
|
|
544
|
-
/**
|
|
739
|
+
/**
|
|
740
|
+
* Media/audio stream request configuration.
|
|
741
|
+
*
|
|
742
|
+
* Unlike `request`/`browse`, this does not accept a resolver thunk. For
|
|
743
|
+
* values that change at runtime, use the shared `request` resolver (it
|
|
744
|
+
* applies to media requests too), a per-track `resolve`, or a `transform`.
|
|
745
|
+
*/
|
|
545
746
|
media?: MediaRequestConfig
|
|
546
747
|
|
|
547
748
|
/**
|
|
@@ -552,8 +753,9 @@ export type BrowserConfiguration = {
|
|
|
552
753
|
* Artwork URLs are transformed when tracks are processed (before being passed to media controllers
|
|
553
754
|
* like Android Auto). This is different from media requests which are transformed at playback time.
|
|
554
755
|
*
|
|
555
|
-
*
|
|
556
|
-
*
|
|
756
|
+
* Headers ARE applied to artwork requests: the library fetches CarPlay and
|
|
757
|
+
* Android Auto images in-process, and in-app consumers receive them via
|
|
758
|
+
* `artworkSource` (which carries the headers for React Native's `<Image>`).
|
|
557
759
|
*
|
|
558
760
|
* @example
|
|
559
761
|
* ```typescript
|
|
@@ -575,41 +777,82 @@ export type BrowserConfiguration = {
|
|
|
575
777
|
*/
|
|
576
778
|
artwork?: ArtworkRequestConfig
|
|
577
779
|
|
|
780
|
+
/**
|
|
781
|
+
* Artwork configuration for the NOW-PLAYING surface only (lock screen / CarPlay /
|
|
782
|
+
* Android Auto now-playing) — distinct from `artwork`, which configures browse-list
|
|
783
|
+
* thumbnails. When set, the now-playing artwork is resolved from THIS config instead of
|
|
784
|
+
* `artwork`; browse lists never read it, so they're unaffected. When unset, now-playing
|
|
785
|
+
* falls back to `artwork` / the track's own `artwork`.
|
|
786
|
+
*
|
|
787
|
+
* Being a full `RequestConfig`, it supports `path`, `query`, and `headers`. The token
|
|
788
|
+
* `{id}` in any of those values is replaced with the track's `id` during resolution, and
|
|
789
|
+
* the result flows through the shared `request` layer (so a relative path gets `baseUrl`
|
|
790
|
+
* prepended). For logic that can't be expressed as a template, use `resolve(track)`.
|
|
791
|
+
*
|
|
792
|
+
* The `{id}` templating is specific to `nowPlayingArtwork` — static values
|
|
793
|
+
* in other configs are not templated. Not implemented by the web
|
|
794
|
+
* implementation.
|
|
795
|
+
*
|
|
796
|
+
* @example
|
|
797
|
+
* // 302-redirect endpoint keyed by the track id:
|
|
798
|
+
* nowPlayingArtwork: { path: '/artwork/{id}' }
|
|
799
|
+
*/
|
|
800
|
+
nowPlayingArtwork?: ArtworkRequestConfig
|
|
801
|
+
|
|
578
802
|
// ─── Navigation ────────────────────────────────────────────────────────────
|
|
579
803
|
|
|
580
804
|
/**
|
|
581
805
|
* Configuration for search functionality.
|
|
582
806
|
* Enables search capabilities in the media browser, typically accessed through voice commands or search UI.
|
|
583
807
|
*
|
|
808
|
+
* See the [Search guide](https://audiobrowser.dev/guide/search) for a walkthrough of
|
|
809
|
+
* modes, filters, the `reference` axis, and mixed audio/video.
|
|
810
|
+
*
|
|
584
811
|
* Optional - if not provided, search functionality will be disabled.
|
|
585
812
|
* Required for Android Auto/CarPlay voice search integration with support for structured voice commands.
|
|
586
813
|
*
|
|
587
814
|
* Search receives structured parameters from voice commands like:
|
|
588
|
-
* - "play
|
|
589
|
-
* - "play
|
|
590
|
-
* - "play
|
|
591
|
-
* - "play
|
|
592
|
-
* - "play
|
|
815
|
+
* - "play something" → mode='any', query="" (smart shuffle)
|
|
816
|
+
* - "play music" → mode='music' (iOS) / 'any' (Android), query=""
|
|
817
|
+
* - "play jazz" → genre="jazz", query="jazz" (genre is a filter, no mode)
|
|
818
|
+
* - "play the radishes" → artist="the radishes", query="the radishes"
|
|
819
|
+
* - "play sweet pea" → mode='song', title="sweet pea", query="sweet pea"
|
|
820
|
+
* - "play my favorites" → reference='my', query=""
|
|
593
821
|
*
|
|
594
822
|
* Can be either:
|
|
595
|
-
* - SearchSourceCallback: Receives SearchParams with query
|
|
596
|
-
* -
|
|
823
|
+
* - SearchSourceCallback: Receives SearchParams with query + reference, plus the
|
|
824
|
+
* optional container-vertical `mode` and the genre/artist/album/title/playlist filters
|
|
825
|
+
* - TransformableRequestConfig: API endpoint where search parameters are automatically added to request.query:
|
|
597
826
|
* - q: search query string (always present)
|
|
598
|
-
* - mode:
|
|
599
|
-
*
|
|
827
|
+
* - mode: container vertical (any/song/playlist/station/podcast/audiobook/news/music/
|
|
828
|
+
* music-video/movie/tv-show/tv-show-episode) - omitted for unstructured search
|
|
829
|
+
* - reference: 'my' when the user asked for their own collection ("play my
|
|
830
|
+
* favorites"); omitted otherwise
|
|
831
|
+
* - artist, album, genre, title, playlist: filters, included when present
|
|
832
|
+
*
|
|
833
|
+
* These query-param keys are fixed (not configurable). If your endpoint
|
|
834
|
+
* expects different names, rename them in `transform` — it receives the params
|
|
835
|
+
* already on `request.query`, e.g. `query: { search: request.query?.q }`.
|
|
836
|
+
*
|
|
837
|
+
* Response shape: the endpoint must return a page object
|
|
838
|
+
* `{ children: Track[] }` — see {@link SearchSource}.
|
|
600
839
|
*
|
|
601
840
|
* @example
|
|
602
841
|
* ```typescript
|
|
603
842
|
* // Callback approach - direct access to structured parameters
|
|
604
843
|
* search: async (params) => {
|
|
605
|
-
* //
|
|
606
|
-
* if (params.
|
|
607
|
-
*
|
|
608
|
-
*
|
|
609
|
-
* if (params.mode === 'album' && params.album && params.artist) {
|
|
844
|
+
* // "play my favorites" → resolve against the user's own collection
|
|
845
|
+
* if (params.reference === 'my') return await getFavorites();
|
|
846
|
+
* // Filters are read directly from their props (not derived from `mode`)
|
|
847
|
+
* if (params.album && params.artist) {
|
|
610
848
|
* return await db.query('SELECT * FROM tracks WHERE album = ? AND artist = ?',
|
|
611
849
|
* [params.album, params.artist]);
|
|
612
850
|
* }
|
|
851
|
+
* if (params.artist) {
|
|
852
|
+
* return await db.query('SELECT * FROM tracks WHERE artist = ?', [params.artist]);
|
|
853
|
+
* }
|
|
854
|
+
* // `mode` is the container vertical — narrow by it when present
|
|
855
|
+
* if (params.mode === 'podcast') return await searchPodcasts(params.query);
|
|
613
856
|
* // Fall back to full-text search
|
|
614
857
|
* return await searchByQuery(params.query);
|
|
615
858
|
* }
|
|
@@ -617,11 +860,11 @@ export type BrowserConfiguration = {
|
|
|
617
860
|
* // API configuration - parameters automatically added to query string
|
|
618
861
|
* search: {
|
|
619
862
|
* baseUrl: 'https://api.example.com/search',
|
|
620
|
-
* // GET /search?q=
|
|
863
|
+
* // GET /search?q=greens&mode=album&album=greens&artist=the+radishes&limit=20
|
|
621
864
|
* transform(request) {
|
|
622
865
|
* return {
|
|
623
866
|
* ...request,
|
|
624
|
-
* query: { ...request.query, limit: 20 }
|
|
867
|
+
* query: { ...request.query, limit: '20' }
|
|
625
868
|
* };
|
|
626
869
|
* }
|
|
627
870
|
* }
|
|
@@ -641,20 +884,47 @@ export type BrowserConfiguration = {
|
|
|
641
884
|
tabs?: TabsSource
|
|
642
885
|
|
|
643
886
|
/**
|
|
644
|
-
* Route-specific configurations. Maps URL
|
|
645
|
-
*
|
|
887
|
+
* Route-specific configurations. Maps URL path patterns to browse sources.
|
|
888
|
+
*
|
|
889
|
+
* ## Matching
|
|
890
|
+
*
|
|
891
|
+
* Patterns match on **exact segment count** — `/artists` does NOT match
|
|
892
|
+
* `/artists/123`. Segments may be:
|
|
893
|
+
* - a constant: `/favorites`
|
|
894
|
+
* - a parameter: `/albums/{id}` — captured into `routeParams.id` and passed
|
|
895
|
+
* to callbacks and transforms
|
|
896
|
+
* - a single-segment wildcard: `*`
|
|
897
|
+
* - a tail wildcard: `/files/**` — matches any depth; the remainder is
|
|
898
|
+
* captured into `routeParams.tail`
|
|
899
|
+
*
|
|
900
|
+
* When several patterns match, the most specific wins
|
|
901
|
+
* (constants > parameters > wildcards > tail wildcard).
|
|
902
|
+
*
|
|
903
|
+
* ## Defaults and reserved keys
|
|
904
|
+
*
|
|
905
|
+
* A path matching no route is fetched over HTTP via the `request` →
|
|
906
|
+
* `browse` layers with the path applied — most APIs only need explicit
|
|
907
|
+
* routes for exceptions. The special key `'*'` overrides that default with
|
|
908
|
+
* its own source. Keys starting with `__` are reserved for internal use.
|
|
646
909
|
*
|
|
647
|
-
*
|
|
910
|
+
* Note: a static `path` on a route's request config does not rewrite the
|
|
911
|
+
* request path (the navigated path is used); remap paths in a `transform`,
|
|
912
|
+
* which receives `routeParams` as its second argument.
|
|
913
|
+
*
|
|
914
|
+
* Values can be a `BrowserSource` (callback, request config, or static page
|
|
915
|
+
* object) or a `RouteConfig` with per-route `media`/`artwork` overrides.
|
|
648
916
|
*
|
|
649
917
|
* @example
|
|
650
918
|
* ```typescript
|
|
651
919
|
* routes: {
|
|
652
|
-
* '/favorites': async () =>
|
|
653
|
-
* '/
|
|
920
|
+
* '/favorites': async () => getFavoritesPage(),
|
|
921
|
+
* '/albums/{id}': async ({ routeParams }) => fetchAlbumPage(routeParams?.id),
|
|
654
922
|
* '/premium': {
|
|
655
|
-
* browse: { baseUrl: 'https://premium-api.com' },
|
|
656
|
-
* artwork: { baseUrl: 'https://premium-images.
|
|
657
|
-
* }
|
|
923
|
+
* browse: { baseUrl: 'https://premium-api.example.com' },
|
|
924
|
+
* artwork: { baseUrl: 'https://premium-images.example.com' }
|
|
925
|
+
* },
|
|
926
|
+
* // Custom default for anything no other route matches:
|
|
927
|
+
* '*': { baseUrl: 'https://api.example.com' }
|
|
658
928
|
* }
|
|
659
929
|
* ```
|
|
660
930
|
*/
|
|
@@ -693,34 +963,42 @@ export type BrowserConfiguration = {
|
|
|
693
963
|
*/
|
|
694
964
|
androidControllerOfflineError?: boolean
|
|
695
965
|
|
|
696
|
-
// ─── CarPlay Options ──────────────────────────────────────────────────────────
|
|
697
|
-
|
|
698
966
|
/**
|
|
699
|
-
*
|
|
967
|
+
* Title shown (as the list's centered empty state) on CarPlay screens whose
|
|
968
|
+
* content is still loading — browse destinations while they resolve, and the
|
|
969
|
+
* startup screen while tabs load. Supply your app's localized "Loading…"
|
|
970
|
+
* string. On iOS 18.4+ the system loading spinner is shown instead.
|
|
700
971
|
*
|
|
701
|
-
* When
|
|
702
|
-
*
|
|
972
|
+
* When unset, loading screens are left blank (apart from the spinner on
|
|
973
|
+
* iOS 18.4+) rather than showing un-localized copy.
|
|
703
974
|
*
|
|
704
|
-
*
|
|
975
|
+
* @example
|
|
976
|
+
* ```typescript
|
|
977
|
+
* carPlayLoadingTitle: t('loading')
|
|
978
|
+
* ```
|
|
705
979
|
*
|
|
706
|
-
* @default true
|
|
707
980
|
* @platform ios
|
|
708
981
|
*/
|
|
709
|
-
|
|
982
|
+
carPlayLoadingTitle?: string
|
|
710
983
|
|
|
711
984
|
/**
|
|
712
|
-
*
|
|
713
|
-
*
|
|
985
|
+
* Called when the album line on the CarPlay Now Playing screen is tapped
|
|
986
|
+
* and the active track has no {@link Track.albumUrl}. Return a browse path
|
|
987
|
+
* to navigate the CarPlay browse stack there, or `undefined` if the tap was
|
|
988
|
+
* handled (or should do nothing).
|
|
989
|
+
*
|
|
990
|
+
* The album line is tappable whenever the active track has an `albumUrl`
|
|
991
|
+
* or this callback is configured.
|
|
714
992
|
*
|
|
715
993
|
* @example
|
|
716
994
|
* ```typescript
|
|
717
|
-
*
|
|
995
|
+
* resolveAlbumUrl: (track) =>
|
|
996
|
+
* track.album ? `/album/${slugify(track.album)}` : undefined
|
|
718
997
|
* ```
|
|
719
998
|
*
|
|
720
|
-
* @default []
|
|
721
999
|
* @platform ios
|
|
722
1000
|
*/
|
|
723
|
-
|
|
1001
|
+
resolveAlbumUrl?: ResolveAlbumUrlCallback
|
|
724
1002
|
|
|
725
1003
|
/**
|
|
726
1004
|
* Callback to customize error messages for navigation errors.
|
|
@@ -730,12 +1008,15 @@ export type BrowserConfiguration = {
|
|
|
730
1008
|
*
|
|
731
1009
|
* @example
|
|
732
1010
|
* ```typescript
|
|
733
|
-
* formatNavigationError: (error) =>
|
|
734
|
-
*
|
|
735
|
-
*
|
|
736
|
-
*
|
|
737
|
-
*
|
|
738
|
-
*
|
|
1011
|
+
* formatNavigationError: ({ error, defaultFormatted }) => {
|
|
1012
|
+
* if (error.code === 'http-error') {
|
|
1013
|
+
* return {
|
|
1014
|
+
* title: t('error.serverError'),
|
|
1015
|
+
* message: t('error.httpMessage', { status: error.statusCode })
|
|
1016
|
+
* }
|
|
1017
|
+
* }
|
|
1018
|
+
* return defaultFormatted
|
|
1019
|
+
* }
|
|
739
1020
|
* ```
|
|
740
1021
|
*/
|
|
741
1022
|
formatNavigationError?: FormatNavigationErrorCallback
|
|
@@ -781,11 +1062,12 @@ export type FormattedNavigationError = {
|
|
|
781
1062
|
*/
|
|
782
1063
|
title: string
|
|
783
1064
|
/**
|
|
784
|
-
*
|
|
1065
|
+
* Optional second line — the body in the error action sheet, the subtitle in
|
|
1066
|
+
* the browse error/empty view. Omit it to show a title only.
|
|
785
1067
|
*
|
|
786
|
-
* Default value: `error.message`
|
|
1068
|
+
* Default value: `error.message` (omitted when that is empty).
|
|
787
1069
|
*/
|
|
788
|
-
message
|
|
1070
|
+
message?: string
|
|
789
1071
|
}
|
|
790
1072
|
|
|
791
1073
|
/**
|
|
@@ -826,3 +1108,9 @@ export type FormatNavigationErrorParams = {
|
|
|
826
1108
|
export type FormatNavigationErrorCallback = (
|
|
827
1109
|
params: FormatNavigationErrorParams
|
|
828
1110
|
) => FormattedNavigationError | undefined
|
|
1111
|
+
|
|
1112
|
+
/**
|
|
1113
|
+
* Maps the tapped active track to a browse path for the CarPlay album line,
|
|
1114
|
+
* or `undefined` to do nothing. See `resolveAlbumUrl`.
|
|
1115
|
+
*/
|
|
1116
|
+
export type ResolveAlbumUrlCallback = (track: Track) => string | undefined
|