react-native-audio-browser 0.1.1 → 0.2.0-next.2
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 +180 -2
- package/android/build.gradle +10 -0
- package/android/gradle.properties +1 -1
- package/android/src/main/AndroidManifest.xml +15 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +401 -141
- 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/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 +443 -178
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +300 -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 +43 -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/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 +31 -37
- package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +4 -1
- package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +119 -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 +415 -131
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +154 -276
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +348 -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 +27 -5
- package/android/src/main/java/com/audiobrowser/player/PlaybackTimer.kt +56 -0
- package/android/src/main/java/com/audiobrowser/player/Player.kt +452 -576
- 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 +117 -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 +141 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +37 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +41 -0
- package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +209 -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 +26 -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 +111 -80
- package/android/src/main/res/values/strings.xml +4 -0
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +166 -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 +54 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +96 -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 +159 -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/NowPlayingUpdaterTest.kt +442 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +191 -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 +107 -0
- package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +73 -0
- package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +75 -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 -110
- 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 +750 -173
- package/ios/Model/NitroTypeStubs.swift +299 -224
- package/ios/Model/PlayerUpdateOptions.swift +23 -23
- package/ios/Model/RemoteCommand.swift +6 -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 +33 -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 +97 -13
- 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 +67 -61
- package/ios/Player/RetryManager.swift +97 -21
- package/ios/Player/SleepTimerHandling.swift +8 -0
- package/ios/Player/SleepTimerManager.swift +72 -11
- package/ios/Player/VolumeFader.swift +77 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +31 -15
- 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/LoadSeekCoordinatorTests.swift +38 -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 +380 -46
- package/ios/Tests/PlaybackStateMachineTests.swift +33 -8
- package/ios/Tests/PlaybackStateStoreTests.swift +48 -0
- package/ios/Tests/PlaybackTimerTests.swift +55 -0
- package/ios/Tests/PlayingStateManagerTests.swift +57 -0
- package/ios/Tests/QueueManagerTests.swift +149 -18
- package/ios/Tests/ResolvedTrackCopyingTests.swift +15 -8
- package/ios/Tests/RetryManagerTests.swift +89 -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 +380 -58
- package/ios/TrackPlayerCallbacks.swift +0 -6
- package/ios/TrackSelector.swift +5 -5
- package/ios/Util/ArtworkImageFetcher.swift +4 -2
- package/ios/Util/NetworkMonitor.swift +7 -3
- package/ios/Util/OnceValue.swift +34 -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 +59 -158
- 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/errors.js +34 -2
- package/lib/commonjs/features/errors.js.map +1 -1
- package/lib/commonjs/features/gate.js +149 -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.map +1 -1
- package/lib/commonjs/features/nowPlaying.js +35 -0
- 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/progress.js +28 -12
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/trackPlaybackTime.js +92 -0
- package/lib/commonjs/features/playback/trackPlaybackTime.js.map +1 -0
- package/lib/commonjs/features/playback/volume.js +1 -1
- package/lib/commonjs/features/player/options.js +49 -13
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +249 -3
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/queue/queue.js +10 -3
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/features/remoteControls.js +1 -12
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/features/sleepTimer.js +9 -4
- 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/utils/LazyNativeEmitter.js +0 -3
- 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 +301 -124
- 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/features/browser-config.js +221 -0
- package/lib/module/features/browser-config.js.map +1 -0
- package/lib/module/features/browser.js +53 -156
- 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/errors.js +34 -2
- package/lib/module/features/errors.js.map +1 -1
- package/lib/module/features/gate.js +144 -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.map +1 -1
- package/lib/module/features/nowPlaying.js +33 -0
- 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/progress.js +28 -12
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/trackPlaybackTime.js +88 -0
- package/lib/module/features/playback/trackPlaybackTime.js.map +1 -0
- package/lib/module/features/playback/volume.js +1 -1
- package/lib/module/features/player/options.js +48 -13
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +249 -3
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/queue/queue.js +10 -3
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/features/remoteControls.js +0 -11
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/features/sleepTimer.js +9 -4
- 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/utils/LazyNativeEmitter.js +0 -3
- 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 +302 -125
- 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/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/errors.d.ts +58 -3
- package/lib/typescript/src/features/errors.d.ts.map +1 -1
- package/lib/typescript/src/features/gate.d.ts +77 -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 +6 -4
- package/lib/typescript/src/features/metadata.d.ts.map +1 -1
- package/lib/typescript/src/features/nowPlaying.d.ts +27 -0
- 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/progress.d.ts +3 -0
- package/lib/typescript/src/features/playback/progress.d.ts.map +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 +1 -1
- package/lib/typescript/src/features/player/options.d.ts +92 -93
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts +206 -167
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +9 -2
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/features/remoteControls.d.ts +0 -13
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/features/sleepTimer.d.ts +18 -3
- 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/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 +0 -2
- 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 +3 -1
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +24 -10
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +6 -6
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +1 -11
- 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 +9 -4
- 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 +236 -212
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +25 -22
- 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 +16 -19
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +6 -0
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +1 -11
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +96 -0
- package/nitrogen/generated/android/c++/JNotificationButton.hpp +3 -3
- 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 +14 -9
- 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++/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_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 +2 -8
- 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/{ThumbsRating.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/{HeartRating.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/GateReason.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +103 -109
- 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 +2 -8
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +5 -5
- 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/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_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 +1098 -447
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +60 -39
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +170 -112
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +8 -8
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +2 -12
- 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 +20 -14
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +230 -197
- 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 +1 -30
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +90 -0
- package/nitrogen/generated/ios/swift/NotificationButton.swift +4 -4
- 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/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_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 +1 -12
- 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++/{HeartRating.hpp → Gate.hpp} +21 -16
- package/nitrogen/generated/shared/c++/{ThumbsRating.hpp → GateDecision.hpp} +23 -17
- package/nitrogen/generated/shared/c++/{PercentageRating.hpp → GateEvent.hpp} +18 -17
- package/nitrogen/generated/shared/c++/GateReason.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +21 -18
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +44 -35
- 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 +1 -12
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +92 -0
- package/nitrogen/generated/shared/c++/NotificationButton.hpp +8 -8
- 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++/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 +11 -6
- package/src/codegen-no-config-variant.test.ts +70 -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 +58 -201
- package/src/features/carConnection.ts +36 -0
- package/src/features/errors.ts +68 -2
- package/src/features/gate.test.ts +72 -0
- package/src/features/gate.ts +155 -0
- package/src/features/index.ts +2 -0
- package/src/features/metadata.ts +6 -12
- package/src/features/nowPlaying.ts +36 -0
- 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/progress.ts +31 -12
- package/src/features/playback/trackPlaybackTime.test.ts +66 -0
- package/src/features/playback/trackPlaybackTime.ts +106 -0
- package/src/features/playback/volume.ts +1 -1
- package/src/features/player/options.test.ts +38 -0
- package/src/features/player/options.ts +140 -75
- package/src/features/player/setup.test.ts +117 -0
- package/src/features/player/setup.ts +390 -175
- package/src/features/queue/queue.test.ts +36 -0
- package/src/features/queue/queue.ts +15 -4
- package/src/features/remoteControls.ts +0 -23
- package/src/features/sleepTimer.ts +23 -4
- package/src/native.ts +5 -0
- package/src/native.web.ts +4 -1
- package/src/specs/audio-browser.nitro.ts +131 -41
- 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 +0 -2
- package/src/utils/NativeUpdatedValue.ts +0 -2
- package/src/utils/artwork.ts +30 -0
- package/src/web/NativeAudioBrowser.playWhenReady.test.ts +301 -0
- package/src/web/NativeAudioBrowser.ts +365 -158
- 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/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++/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/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/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/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++/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/features/browser.ts
CHANGED
|
@@ -1,207 +1,14 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
BrowserConfiguration,
|
|
3
|
-
BrowserSource,
|
|
4
|
-
BrowserSourceCallback,
|
|
5
|
-
ResolvedTrack,
|
|
6
|
-
RouteConfig,
|
|
7
|
-
SearchSource,
|
|
8
|
-
SearchSourceCallback,
|
|
9
|
-
TabsSource,
|
|
10
|
-
Track,
|
|
11
|
-
TransformableRequestConfig
|
|
12
|
-
} from '../types'
|
|
13
|
-
import type {
|
|
14
|
-
NativeBrowserConfiguration,
|
|
15
|
-
NativeRouteEntry
|
|
16
|
-
} from '../types/browser-native'
|
|
1
|
+
import type { BrowserConfiguration, ResolvedTrack, Track } from '../types'
|
|
17
2
|
import { nativeBrowser } from '../native'
|
|
18
3
|
import { NativeUpdatedValue } from '../utils/NativeUpdatedValue'
|
|
19
4
|
import { useNativeUpdatedValue } from '../utils/useNativeUpdatedValue'
|
|
5
|
+
import {
|
|
6
|
+
SEARCH_ROUTE_PATH,
|
|
7
|
+
toNativeConfig,
|
|
8
|
+
validateBrowserConfiguration
|
|
9
|
+
} from './browser-config'
|
|
20
10
|
|
|
21
|
-
|
|
22
|
-
// Configuration Transformation
|
|
23
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
function isCallback(
|
|
26
|
-
source: unknown
|
|
27
|
-
): source is (...args: unknown[]) => unknown {
|
|
28
|
-
return typeof source === 'function'
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function isTransformableRequestConfig(
|
|
32
|
-
source: unknown
|
|
33
|
-
): source is TransformableRequestConfig {
|
|
34
|
-
if (typeof source !== 'object' || source === null) return false
|
|
35
|
-
const obj = source as Record<string, unknown>
|
|
36
|
-
// Has request config properties (not a ResolvedTrack which has 'title')
|
|
37
|
-
return (
|
|
38
|
-
'baseUrl' in obj ||
|
|
39
|
-
'path' in obj ||
|
|
40
|
-
'headers' in obj ||
|
|
41
|
-
'query' in obj ||
|
|
42
|
-
'transform' in obj
|
|
43
|
-
)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function isRouteConfig(source: unknown): source is RouteConfig {
|
|
47
|
-
if (typeof source !== 'object' || source === null) return false
|
|
48
|
-
const obj = source as Record<string, unknown>
|
|
49
|
-
// RouteConfig has browse/media/artwork properties at the top level
|
|
50
|
-
return 'browse' in obj || ('media' in obj && !('baseUrl' in obj))
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function flattenBrowseSource(source: BrowserSource | undefined): {
|
|
54
|
-
browseCallback?: NativeRouteEntry['browseCallback']
|
|
55
|
-
browseConfig?: NativeRouteEntry['browseConfig']
|
|
56
|
-
browseStatic?: NativeRouteEntry['browseStatic']
|
|
57
|
-
} {
|
|
58
|
-
if (!source) return {}
|
|
59
|
-
if (isCallback(source))
|
|
60
|
-
return { browseCallback: source as NativeRouteEntry['browseCallback'] }
|
|
61
|
-
if (isTransformableRequestConfig(source))
|
|
62
|
-
return { browseConfig: source as NativeRouteEntry['browseConfig'] }
|
|
63
|
-
return { browseStatic: source as NativeRouteEntry['browseStatic'] }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Converts a SearchSource to a NativeRouteEntry for the __search__ path.
|
|
68
|
-
*/
|
|
69
|
-
function searchSourceToRouteEntry(source: SearchSource): NativeRouteEntry {
|
|
70
|
-
if (isCallback(source)) {
|
|
71
|
-
return {
|
|
72
|
-
path: SEARCH_ROUTE_PATH,
|
|
73
|
-
searchCallback: source as SearchSourceCallback
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return {
|
|
77
|
-
path: SEARCH_ROUTE_PATH,
|
|
78
|
-
searchConfig: source as TransformableRequestConfig
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Wraps a Track[] into a ResolvedTrack for tabs.
|
|
84
|
-
* Tabs are represented as a special route that returns children.
|
|
85
|
-
*/
|
|
86
|
-
function wrapTracksAsResolvedTrack(tracks: Track[]): ResolvedTrack {
|
|
87
|
-
return {
|
|
88
|
-
url: TABS_ROUTE_PATH,
|
|
89
|
-
title: 'Tabs',
|
|
90
|
-
children: tracks
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Converts a TabsSource to a NativeRouteEntry for the __tabs__ path.
|
|
96
|
-
* Track[] is wrapped in ResolvedTrack, callbacks are wrapped to return ResolvedTrack.
|
|
97
|
-
*/
|
|
98
|
-
function tabsSourceToRouteEntry(source: TabsSource): NativeRouteEntry {
|
|
99
|
-
if (Array.isArray(source)) {
|
|
100
|
-
// Static Track[] - wrap as ResolvedTrack
|
|
101
|
-
return {
|
|
102
|
-
path: TABS_ROUTE_PATH,
|
|
103
|
-
browseStatic: wrapTracksAsResolvedTrack(source)
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (isCallback(source)) {
|
|
108
|
-
// Callback returning Track[] - wrap to return ResolvedTrack
|
|
109
|
-
const wrappedCallback: BrowserSourceCallback = async () => {
|
|
110
|
-
const tracks = await source()
|
|
111
|
-
return wrapTracksAsResolvedTrack(tracks)
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
path: TABS_ROUTE_PATH,
|
|
115
|
-
browseCallback: wrappedCallback
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// TransformableRequestConfig - native will handle wrapping the response
|
|
120
|
-
return {
|
|
121
|
-
path: TABS_ROUTE_PATH,
|
|
122
|
-
browseConfig: source
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function flattenRouteEntry(
|
|
127
|
-
path: string,
|
|
128
|
-
source: BrowserSource | RouteConfig
|
|
129
|
-
): NativeRouteEntry {
|
|
130
|
-
if (isRouteConfig(source)) {
|
|
131
|
-
return {
|
|
132
|
-
path,
|
|
133
|
-
...flattenBrowseSource(source.browse),
|
|
134
|
-
media: source.media,
|
|
135
|
-
artwork: source.artwork
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return { path, ...flattenBrowseSource(source) }
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** Internal path used for the default/root browse source */
|
|
142
|
-
const DEFAULT_ROUTE_PATH = '__default__'
|
|
143
|
-
|
|
144
|
-
/** Internal path used for navigation tabs */
|
|
145
|
-
const TABS_ROUTE_PATH = '__tabs__'
|
|
146
|
-
|
|
147
|
-
/** Internal path used for search */
|
|
148
|
-
const SEARCH_ROUTE_PATH = '__search__'
|
|
149
|
-
|
|
150
|
-
function flattenRoutes(
|
|
151
|
-
routes: Record<string, BrowserSource | RouteConfig> | undefined,
|
|
152
|
-
rootBrowse: BrowserSource | undefined,
|
|
153
|
-
tabs: TabsSource | undefined,
|
|
154
|
-
search: SearchSource | undefined
|
|
155
|
-
): NativeRouteEntry[] | undefined {
|
|
156
|
-
const entries: NativeRouteEntry[] = []
|
|
157
|
-
|
|
158
|
-
// Add explicit routes
|
|
159
|
-
if (routes) {
|
|
160
|
-
for (const [path, source] of Object.entries(routes)) {
|
|
161
|
-
entries.push(flattenRouteEntry(path, source))
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Add root browse as default fallback
|
|
166
|
-
if (rootBrowse) {
|
|
167
|
-
entries.push(flattenRouteEntry(DEFAULT_ROUTE_PATH, rootBrowse))
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Add tabs as special route
|
|
171
|
-
if (tabs) {
|
|
172
|
-
entries.push(tabsSourceToRouteEntry(tabs))
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Add search as special route
|
|
176
|
-
if (search) {
|
|
177
|
-
entries.push(searchSourceToRouteEntry(search))
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return entries.length > 0 ? entries : undefined
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function toNativeConfig(
|
|
184
|
-
config: BrowserConfiguration
|
|
185
|
-
): NativeBrowserConfiguration {
|
|
186
|
-
return {
|
|
187
|
-
path: config.path,
|
|
188
|
-
request: config.request,
|
|
189
|
-
media: config.media,
|
|
190
|
-
artwork: config.artwork,
|
|
191
|
-
routes: flattenRoutes(
|
|
192
|
-
config.routes,
|
|
193
|
-
config.browse,
|
|
194
|
-
config.tabs,
|
|
195
|
-
config.search
|
|
196
|
-
),
|
|
197
|
-
singleTrack: config.singleTrack,
|
|
198
|
-
handleTrackLoad: config.handleTrackLoad,
|
|
199
|
-
androidControllerOfflineError: config.androidControllerOfflineError,
|
|
200
|
-
carPlayUpNextButton: config.carPlayUpNextButton,
|
|
201
|
-
carPlayNowPlayingButtons: config.carPlayNowPlayingButtons,
|
|
202
|
-
formatNavigationError: config.formatNavigationError
|
|
203
|
-
}
|
|
204
|
-
}
|
|
11
|
+
let currentConfiguration: BrowserConfiguration | undefined
|
|
205
12
|
|
|
206
13
|
/**
|
|
207
14
|
* Configures the browser with routes, tabs, and other settings.
|
|
@@ -210,13 +17,30 @@ function toNativeConfig(
|
|
|
210
17
|
* - Android Auto / CarPlay browsing integration
|
|
211
18
|
* - Playback of browsable tracks via navigate()
|
|
212
19
|
*
|
|
20
|
+
* Calling this again REPLACES the entire configuration (no merging) and
|
|
21
|
+
* re-runs initial navigation — external browse UIs such as CarPlay reset to
|
|
22
|
+
* the first tab. For values that change at runtime (base URL, locale, auth
|
|
23
|
+
* token), don't reconfigure: read them inside a `request`/`browse` resolver
|
|
24
|
+
* or a `transform`, and call {@link invalidateAllContent} so every surface
|
|
25
|
+
* re-fetches in place.
|
|
26
|
+
*
|
|
213
27
|
* @param configuration - Browser configuration including routes, tabs, media config, etc.
|
|
214
28
|
*
|
|
215
29
|
* @example
|
|
216
30
|
* ```ts
|
|
217
31
|
* configureBrowser({
|
|
32
|
+
* request: { baseUrl: 'https://api.example.com' },
|
|
218
33
|
* routes: {
|
|
219
|
-
*
|
|
34
|
+
* // `{id}` is a route parameter — see the `routes` docs for matching rules.
|
|
35
|
+
* '/albums/{id}': async ({ routeParams }) => fetchAlbumPage(routeParams?.id),
|
|
36
|
+
* // Remapping a browse path to a different API path requires a transform;
|
|
37
|
+
* // a static `path` on a request config does NOT rewrite the path.
|
|
38
|
+
* '/artists/{id}': {
|
|
39
|
+
* transformSync: (request, routeParams) => ({
|
|
40
|
+
* ...request,
|
|
41
|
+
* path: `/api/v2/artists/${routeParams?.id}`
|
|
42
|
+
* })
|
|
43
|
+
* }
|
|
220
44
|
* },
|
|
221
45
|
* tabs: [
|
|
222
46
|
* { title: 'Home', url: '/' },
|
|
@@ -226,9 +50,26 @@ function toNativeConfig(
|
|
|
226
50
|
* ```
|
|
227
51
|
*/
|
|
228
52
|
export function configureBrowser(configuration: BrowserConfiguration): void {
|
|
53
|
+
// __DEV__ is a React Native global; absent under plain node (vitest).
|
|
54
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
55
|
+
validateBrowserConfiguration(configuration)
|
|
56
|
+
}
|
|
57
|
+
currentConfiguration = configuration
|
|
229
58
|
nativeBrowser.configuration = toNativeConfig(configuration)
|
|
230
59
|
}
|
|
231
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Returns the configuration last passed to {@link configureBrowser}, in its
|
|
63
|
+
* original public shape (the native getter exposes only the lowered internal
|
|
64
|
+
* form). `undefined` until the browser is configured.
|
|
65
|
+
*
|
|
66
|
+
* Treat the returned object as read-only: it is the live reference, and
|
|
67
|
+
* mutating it does NOT reconfigure the browser — call configureBrowser again.
|
|
68
|
+
*/
|
|
69
|
+
export function getBrowserConfiguration(): BrowserConfiguration | undefined {
|
|
70
|
+
return currentConfiguration
|
|
71
|
+
}
|
|
72
|
+
|
|
232
73
|
export function navigate(pathOrTrack: string | Track) {
|
|
233
74
|
if (typeof pathOrTrack === 'string') {
|
|
234
75
|
return nativeBrowser.navigatePath(pathOrTrack)
|
|
@@ -288,6 +129,22 @@ export const notifyContentChanged = (path: string): void => {
|
|
|
288
129
|
nativeBrowser.notifyContentChanged(path)
|
|
289
130
|
}
|
|
290
131
|
|
|
132
|
+
/**
|
|
133
|
+
* Invalidates all cached browse content and refreshes every currently-displayed
|
|
134
|
+
* browse surface. Use when something app-wide changed (locale switch, sign-out,
|
|
135
|
+
* etc.) and every browse path should re-fetch from its route handler — unlike
|
|
136
|
+
* {@link notifyContentChanged}, which targets a single path.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```ts
|
|
140
|
+
* // After the user changes the app language
|
|
141
|
+
* invalidateAllContent()
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export const invalidateAllContent = (): void => {
|
|
145
|
+
nativeBrowser.invalidateAllContent()
|
|
146
|
+
}
|
|
147
|
+
|
|
291
148
|
/**
|
|
292
149
|
* Returns whether search functionality is configured via `configureBrowser({ search: ... })`.
|
|
293
150
|
*/
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { nativeBrowser } from '../native'
|
|
2
|
+
import { NativeUpdatedValue } from '../utils/NativeUpdatedValue'
|
|
3
|
+
import { useNativeUpdatedValue } from '../utils/useNativeUpdatedValue'
|
|
4
|
+
|
|
5
|
+
// MARK: - Getters
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Whether a car is currently connected: a CarPlay scene on iOS, an
|
|
9
|
+
* Android Auto / Android Automotive connection on Android (via the
|
|
10
|
+
* androidx.car.app CarConnection provider). Always false on web.
|
|
11
|
+
*/
|
|
12
|
+
export function isCarConnected(): boolean {
|
|
13
|
+
return nativeBrowser.isCarConnected()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// MARK: - Event Callbacks
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Subscribes to car connection changes (CarPlay on iOS, Android Auto /
|
|
20
|
+
* Android Automotive on Android). Never fires on web.
|
|
21
|
+
* @param callback - Called with the new connection state
|
|
22
|
+
* @returns Cleanup function to unsubscribe
|
|
23
|
+
*/
|
|
24
|
+
export const onCarConnectedChanged = NativeUpdatedValue.emitterize<boolean>(
|
|
25
|
+
(cb) => (nativeBrowser.onCarConnectedChanged = cb)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
// MARK: - Hooks
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Hook that returns whether a car is connected and updates on changes
|
|
32
|
+
* (always false on web).
|
|
33
|
+
*/
|
|
34
|
+
export function useCarConnected(): boolean {
|
|
35
|
+
return useNativeUpdatedValue(isCarConnected, onCarConnectedChanged)
|
|
36
|
+
}
|
package/src/features/errors.ts
CHANGED
|
@@ -6,13 +6,73 @@ import { useNativeUpdatedValue } from '../utils/useNativeUpdatedValue'
|
|
|
6
6
|
// Re-export for Nitro spec
|
|
7
7
|
export type { FormattedNavigationError } from '../types/browser'
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Normalized, cross-platform classification of a playback failure.
|
|
11
|
+
*
|
|
12
|
+
* Both platforms map their native failure onto this set, so consumers can
|
|
13
|
+
* branch on it without knowing whether the error came from AVFoundation or
|
|
14
|
+
* ExoPlayer. Use this — not `code` — for anything user-visible.
|
|
15
|
+
*
|
|
16
|
+
* - `'offline'` - The device had no network connection at the moment of
|
|
17
|
+
* failure. The stream itself may be fine.
|
|
18
|
+
* - `'unreachable'` - The stream host could not be reached: DNS failure,
|
|
19
|
+
* connection refused, timed out, or the connection dropped while loading.
|
|
20
|
+
* - `'not-found'` - The server said this stream is gone (HTTP 404 / 410).
|
|
21
|
+
* Retrying will not help; the station is dead.
|
|
22
|
+
* - `'rejected'` - The server refused the request (HTTP 401 / 403), e.g.
|
|
23
|
+
* geo-blocking or an expired token.
|
|
24
|
+
* - `'server-error'` - The server responded with 5xx. Usually transient.
|
|
25
|
+
* - `'unplayable'` - The stream was fetched but cannot be played: unknown
|
|
26
|
+
* container, unsupported codec, or a decoder failure.
|
|
27
|
+
* - `'stalled'` - Playback had started and then stopped, and the player
|
|
28
|
+
* exhausted its recovery budget without recovering.
|
|
29
|
+
* - `'unknown'` - The failure could not be classified. Inspect `code`.
|
|
30
|
+
*/
|
|
31
|
+
export type PlaybackErrorKind =
|
|
32
|
+
| 'offline'
|
|
33
|
+
| 'unreachable'
|
|
34
|
+
| 'not-found'
|
|
35
|
+
| 'rejected'
|
|
36
|
+
| 'server-error'
|
|
37
|
+
| 'unplayable'
|
|
38
|
+
| 'stalled'
|
|
39
|
+
| 'unknown'
|
|
40
|
+
|
|
9
41
|
export type PlaybackError = {
|
|
42
|
+
/** Normalized classification. Branch on this, not on `code`. */
|
|
43
|
+
kind: PlaybackErrorKind
|
|
44
|
+
/**
|
|
45
|
+
* The raw native failure identifier, for diagnostics and telemetry only.
|
|
46
|
+
* Platform-specific and unstable: loader cases on iOS
|
|
47
|
+
* (`failed-to-load`, `playback-failed`, …), lower-cased ExoPlayer error
|
|
48
|
+
* names on Android (`io-bad-http-status`, `parsing-container-malformed`, …).
|
|
49
|
+
*/
|
|
10
50
|
code: string
|
|
11
51
|
message: string
|
|
52
|
+
/** HTTP status code, when the failure came from an HTTP response. */
|
|
53
|
+
statusCode?: number
|
|
54
|
+
/**
|
|
55
|
+
* True while the player is still retrying this failure in the background.
|
|
56
|
+
*
|
|
57
|
+
* A retrying error arrives via `onPlaybackChanged` with the playback state
|
|
58
|
+
* still `loading`/`buffering` (or `paused`) — show it as advisory ("Stream
|
|
59
|
+
* unreachable" over a spinner), because playback may yet recover. It clears
|
|
60
|
+
* (the next `Playback` carries no error) once data flows again, and hardens
|
|
61
|
+
* into a terminal error (state `error`, `retrying` absent) when the retry
|
|
62
|
+
* budget runs out. Absent when retry is disabled: every error is then
|
|
63
|
+
* terminal. Native platforms only — the web implementation has no automatic
|
|
64
|
+
* retry, so its errors are always terminal.
|
|
65
|
+
*/
|
|
66
|
+
retrying?: boolean
|
|
12
67
|
}
|
|
13
68
|
|
|
14
69
|
/**
|
|
15
70
|
* Emitted when a playback error occurs.
|
|
71
|
+
*
|
|
72
|
+
* Terminal errors only: this fires on both edges of the `error` state —
|
|
73
|
+
* entering it (with the error) and leaving it (with `error` undefined).
|
|
74
|
+
* Errors the player is still retrying (`retrying: true`) are surfaced through
|
|
75
|
+
* `onPlaybackChanged` instead, attached to the `loading`/`buffering` state.
|
|
16
76
|
*/
|
|
17
77
|
export interface PlaybackErrorEvent {
|
|
18
78
|
error?: PlaybackError
|
|
@@ -29,6 +89,10 @@ export interface PlaybackErrorEvent {
|
|
|
29
89
|
* - `'callback-error'` - The browse callback returned an error (e.g., `{ error: 'message' }`).
|
|
30
90
|
* Use this for business logic errors like authentication failures or subscription requirements.
|
|
31
91
|
* - `'unknown-error'` - An unexpected error occurred (e.g., invalid configuration).
|
|
92
|
+
* - `'empty-content'` - The path resolved successfully but the container has no children (e.g. an
|
|
93
|
+
* empty Favorites tab, a search with no results).
|
|
94
|
+
* - `'timeout'` - The resolve did not complete within the allotted time (a stalled request or
|
|
95
|
+
* unresponsive bridge). Surfaced on External surfaces that render their own browse list.
|
|
32
96
|
*/
|
|
33
97
|
export type NavigationErrorType =
|
|
34
98
|
| 'content-not-found'
|
|
@@ -36,6 +100,8 @@ export type NavigationErrorType =
|
|
|
36
100
|
| 'http-error'
|
|
37
101
|
| 'callback-error'
|
|
38
102
|
| 'unknown-error'
|
|
103
|
+
| 'empty-content'
|
|
104
|
+
| 'timeout'
|
|
39
105
|
|
|
40
106
|
export type NavigationError = {
|
|
41
107
|
code: NavigationErrorType
|
|
@@ -142,7 +208,7 @@ export const onFormattedNavigationError = NativeUpdatedValue.emitterize<
|
|
|
142
208
|
* Hook that returns the current navigation error formatted for display.
|
|
143
209
|
*
|
|
144
210
|
* Native formats the error using the `formatNavigationError` callback configured
|
|
145
|
-
* in
|
|
211
|
+
* in `BrowserConfiguration`, or falls back to default English messages.
|
|
146
212
|
*
|
|
147
213
|
* The same formatted error is used by CarPlay and Android Auto error dialogs,
|
|
148
214
|
* ensuring consistent error presentation across your app and external controllers.
|
|
@@ -183,7 +249,7 @@ export const onFormattedNavigationError = NativeUpdatedValue.emitterize<
|
|
|
183
249
|
* })
|
|
184
250
|
* ```
|
|
185
251
|
*
|
|
186
|
-
* @see
|
|
252
|
+
* @see `BrowserConfiguration.formatNavigationError` - Configure custom error formatting
|
|
187
253
|
* @see {@link useNavigationError} - Access the raw error with code and status details
|
|
188
254
|
*/
|
|
189
255
|
export function useFormattedNavigationError():
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, test, expect, vi, beforeEach } from 'vitest'
|
|
2
|
+
|
|
3
|
+
vi.mock('../native', () => ({ nativeBrowser: {} }))
|
|
4
|
+
|
|
5
|
+
import { nativeBrowser } from '../native'
|
|
6
|
+
import { setGate, clearGate } from './gate'
|
|
7
|
+
|
|
8
|
+
const chrome = { title: 'T', message: 'M' }
|
|
9
|
+
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
;(nativeBrowser as any).setGate = vi.fn()
|
|
12
|
+
;(nativeBrowser as any).clearGate = vi.fn()
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
describe('setGate', () => {
|
|
16
|
+
test('setGate(gate) → chrome + hasResolver false', () => {
|
|
17
|
+
setGate(chrome)
|
|
18
|
+
expect(nativeBrowser.setGate).toHaveBeenCalledWith(chrome, false)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test('setGate(gate, resolve) → chrome + hasResolver true', () => {
|
|
22
|
+
setGate(chrome, () => true)
|
|
23
|
+
expect(nativeBrowser.setGate).toHaveBeenCalledWith(chrome, true)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('setGate(resolve) → undefined chrome + hasResolver true', () => {
|
|
27
|
+
setGate(() => false)
|
|
28
|
+
expect(nativeBrowser.setGate).toHaveBeenCalledWith(undefined, true)
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
describe('resolveGate (native→JS bridge)', () => {
|
|
33
|
+
test('resolver true → gated, no override', async () => {
|
|
34
|
+
setGate(chrome, () => true)
|
|
35
|
+
expect(
|
|
36
|
+
await (nativeBrowser as any).resolveGate({ reason: 'browse', path: '/x' })
|
|
37
|
+
).toEqual({ gated: true })
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test('resolver false → not gated', async () => {
|
|
41
|
+
setGate(chrome, () => false)
|
|
42
|
+
expect(
|
|
43
|
+
await (nativeBrowser as any).resolveGate({ reason: 'browse', path: '/x' })
|
|
44
|
+
).toEqual({ gated: false })
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
test('resolver Gate → gated + override chrome', async () => {
|
|
48
|
+
const override = { title: 'O' }
|
|
49
|
+
setGate(chrome, () => override)
|
|
50
|
+
expect(
|
|
51
|
+
await (nativeBrowser as any).resolveGate({
|
|
52
|
+
reason: 'search',
|
|
53
|
+
search: { query: 'q' }
|
|
54
|
+
})
|
|
55
|
+
).toEqual({ gated: true, gate: override })
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
test('no resolver (static) → every request gated', async () => {
|
|
59
|
+
setGate(chrome)
|
|
60
|
+
expect(
|
|
61
|
+
await (nativeBrowser as any).resolveGate({ reason: 'browse', path: '/x' })
|
|
62
|
+
).toEqual({ gated: true })
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
describe('clearGate', () => {
|
|
67
|
+
test('clears native gate state', () => {
|
|
68
|
+
setGate(chrome, () => false)
|
|
69
|
+
clearGate()
|
|
70
|
+
expect(nativeBrowser.clearGate).toHaveBeenCalled()
|
|
71
|
+
})
|
|
72
|
+
})
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { SearchParams } from '../types/browser'
|
|
2
|
+
import { nativeBrowser } from '../native'
|
|
3
|
+
import { LazyNativeEmitter } from '../utils/LazyNativeEmitter'
|
|
4
|
+
|
|
5
|
+
// MARK: - Wire types (cross the Nitro bridge; native↔JS)
|
|
6
|
+
|
|
7
|
+
/** Discriminant for gate requests and events. */
|
|
8
|
+
export type GateReason = 'browse' | 'search'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Flat wire struct for a gate request (crosses the Nitro bridge).
|
|
12
|
+
* Use {@link GateRequest} in consumer-facing code; `gate.ts` converts between them.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export type NativeGateRequest = {
|
|
16
|
+
reason: GateReason
|
|
17
|
+
path?: string
|
|
18
|
+
search?: SearchParams
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Wire form of a resolver result (native awaits this from JS).
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export type GateDecision = { gated: boolean; gate?: Gate }
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Fired once per gated serve (each time the gate chrome is rendered for a
|
|
29
|
+
* request). This is **not** once per user action: on car surfaces a single
|
|
30
|
+
* action can serve the gate for several requests at once — e.g. building the
|
|
31
|
+
* tab bar resolves and serves each gated tab, firing one event per gated tab.
|
|
32
|
+
* There is no library-side dedup; debounce on the consumer side (e.g. record a
|
|
33
|
+
* gate-hit at most once per session).
|
|
34
|
+
*/
|
|
35
|
+
export type GateEvent = { reason: GateReason }
|
|
36
|
+
|
|
37
|
+
// MARK: - Public types (consumer-facing)
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A gate's chrome (title and optional message).
|
|
41
|
+
*
|
|
42
|
+
* While the gate is active, every browse or search request on car surfaces
|
|
43
|
+
* (CarPlay, Android Auto) shows this page instead of the real content.
|
|
44
|
+
* Playback, the queue, and now-playing are unaffected.
|
|
45
|
+
*
|
|
46
|
+
* - **CarPlay**: plain centered message page.
|
|
47
|
+
* - **Android Auto**: one non-playable list tile (message not shown).
|
|
48
|
+
*/
|
|
49
|
+
export type Gate = {
|
|
50
|
+
/** Headline shown on the gate page. */
|
|
51
|
+
title: string
|
|
52
|
+
/**
|
|
53
|
+
* The explanatory copy under the title. On CarPlay this is the centered
|
|
54
|
+
* message body; newlines become spaces. Android Auto does not display it.
|
|
55
|
+
*/
|
|
56
|
+
message?: string
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The gate chrome crosses the bridge as-is; this alias marks the wire side.
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
export type NativeGate = Gate
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Describes the request being decided by a {@link GateResolver}.
|
|
67
|
+
* Discriminated by `kind`: `'browse'` for content navigation, `'search'` for
|
|
68
|
+
* voice/manual search queries.
|
|
69
|
+
*/
|
|
70
|
+
export type GateRequest =
|
|
71
|
+
| { kind: 'browse'; path: string }
|
|
72
|
+
| { kind: 'search'; params: SearchParams }
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Decides per request whether to gate.
|
|
76
|
+
* - Return a {@link Gate} to gate with specific chrome for this request.
|
|
77
|
+
* - Return `true` to gate using the default chrome (or the built-in fallback).
|
|
78
|
+
* - Return `false` to allow the request through.
|
|
79
|
+
*/
|
|
80
|
+
export type GateResolver = (request: GateRequest) => Gate | boolean
|
|
81
|
+
|
|
82
|
+
// MARK: - Internal state
|
|
83
|
+
|
|
84
|
+
let resolver: GateResolver | undefined
|
|
85
|
+
|
|
86
|
+
function toPublicRequest(req: NativeGateRequest): GateRequest {
|
|
87
|
+
switch (req.reason) {
|
|
88
|
+
case 'browse':
|
|
89
|
+
return { kind: 'browse', path: req.path ?? '' }
|
|
90
|
+
case 'search':
|
|
91
|
+
// req.search is always present on a well-formed search request — the
|
|
92
|
+
// native wire contract guarantees it for reason:'search'. Assert the
|
|
93
|
+
// native contract with `!` so we never hand consumer code a SearchParams
|
|
94
|
+
// with its required `query` field missing.
|
|
95
|
+
return { kind: 'search', params: req.search! }
|
|
96
|
+
default: {
|
|
97
|
+
const _exhaustive: never = req.reason
|
|
98
|
+
throw new Error(`Unhandled GateReason: ${String(_exhaustive)}`)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Native awaits this per request at a serve site.
|
|
104
|
+
// No resolver → static gate → every request is gated (native applies stored default / built-in).
|
|
105
|
+
nativeBrowser.resolveGate = async (
|
|
106
|
+
req: NativeGateRequest
|
|
107
|
+
): Promise<GateDecision> => {
|
|
108
|
+
const result = resolver ? resolver(toPublicRequest(req)) : true
|
|
109
|
+
if (result === false) return { gated: false }
|
|
110
|
+
if (result === true) return { gated: true }
|
|
111
|
+
return { gated: true, gate: result }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// MARK: - Public API
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Raises the gate with default chrome, optionally with a per-request resolver.
|
|
118
|
+
* Calling it again while a gate is already up updates the chrome in place,
|
|
119
|
+
* keeping the current tab. Note this is **not** fully navigation-preserving: on
|
|
120
|
+
* some surfaces (CarPlay) any gate change pops pushed navigation back to root,
|
|
121
|
+
* so a page the user had drilled into is reset to the tab root. Set the gate
|
|
122
|
+
* before the car connects and it'll be there the moment it does.
|
|
123
|
+
*/
|
|
124
|
+
export function setGate(gate: Gate, resolve?: GateResolver): void
|
|
125
|
+
/**
|
|
126
|
+
* Raises the gate with a resolver only (no default chrome).
|
|
127
|
+
* The resolver must return a {@link Gate} or `true` for gated requests;
|
|
128
|
+
* native uses the built-in fallback chrome when `true` and no default is set.
|
|
129
|
+
*/
|
|
130
|
+
export function setGate(resolve: GateResolver): void
|
|
131
|
+
export function setGate(a: Gate | GateResolver, b?: GateResolver): void {
|
|
132
|
+
if (typeof a === 'function') {
|
|
133
|
+
resolver = a
|
|
134
|
+
nativeBrowser.setGate(undefined, true)
|
|
135
|
+
} else {
|
|
136
|
+
resolver = b
|
|
137
|
+
nativeBrowser.setGate(a, b != null)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Drops the gate — the real content comes back, and the current tab is kept.
|
|
143
|
+
*/
|
|
144
|
+
export function clearGate(): void {
|
|
145
|
+
resolver = undefined
|
|
146
|
+
nativeBrowser.clearGate()
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Subscribes to gate events (fired when a request is gated).
|
|
151
|
+
* @returns Cleanup function to unsubscribe.
|
|
152
|
+
*/
|
|
153
|
+
export const onGate = LazyNativeEmitter.emitterize<GateEvent>(
|
|
154
|
+
(cb) => (nativeBrowser.onGate = cb)
|
|
155
|
+
)
|
package/src/features/index.ts
CHANGED
|
@@ -12,7 +12,9 @@ export * from './playback'
|
|
|
12
12
|
export * from './player'
|
|
13
13
|
export * from './queue'
|
|
14
14
|
export * from './battery'
|
|
15
|
+
export * from './gate'
|
|
15
16
|
export * from './browser'
|
|
17
|
+
export * from './carConnection'
|
|
16
18
|
export * from './equalizer'
|
|
17
19
|
export * from './errors'
|
|
18
20
|
export * from './favorites'
|