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
|
@@ -7,7 +7,6 @@ import type {
|
|
|
7
7
|
PlayingState,
|
|
8
8
|
RepeatModeChangedEvent,
|
|
9
9
|
NativeUpdateOptions,
|
|
10
|
-
UpdateOptions,
|
|
11
10
|
Options,
|
|
12
11
|
Playback,
|
|
13
12
|
PlaybackActiveTrackChangedEvent,
|
|
@@ -20,11 +19,14 @@ import type {
|
|
|
20
19
|
RemotePlayIdEvent,
|
|
21
20
|
RemotePlaySearchEvent,
|
|
22
21
|
RemoteSeekEvent,
|
|
23
|
-
RemoteSetRatingEvent,
|
|
24
22
|
RemoteSkipEvent,
|
|
25
23
|
SleepTimer,
|
|
26
24
|
SleepTimerChangedEvent,
|
|
27
25
|
FavoriteChangedEvent,
|
|
26
|
+
NativeGate,
|
|
27
|
+
NativeGateRequest,
|
|
28
|
+
GateDecision,
|
|
29
|
+
GateEvent,
|
|
28
30
|
NavigationError,
|
|
29
31
|
NavigationErrorEvent,
|
|
30
32
|
FormattedNavigationError,
|
|
@@ -34,15 +36,16 @@ import type {
|
|
|
34
36
|
BatteryOptimizationStatus,
|
|
35
37
|
BatteryOptimizationStatusChangedEvent,
|
|
36
38
|
BatteryWarningPendingChangedEvent,
|
|
37
|
-
|
|
39
|
+
NativeSetupPlayerOptions
|
|
38
40
|
} from '../features'
|
|
39
41
|
import type {
|
|
40
42
|
AudioBrowser as AudioBrowserSpec,
|
|
41
|
-
|
|
43
|
+
Output
|
|
42
44
|
} from '../specs/audio-browser.nitro'
|
|
43
45
|
import type { ResolvedTrack, Track, TrackLoadEvent } from '../types'
|
|
44
46
|
import type { NativeBrowserConfiguration } from '../types/browser-native'
|
|
45
47
|
import { BrowserManager } from './browser/BrowserManager'
|
|
48
|
+
import { classifyTrackNavigation } from './browser/classifyTrackNavigation'
|
|
46
49
|
import { FavoriteManager } from './browser/FavoriteManager'
|
|
47
50
|
import { NavigationErrorManager } from './browser/NavigationErrorManager'
|
|
48
51
|
import { SearchManager } from './browser/SearchManager'
|
|
@@ -50,14 +53,16 @@ import { HttpClient } from './http/HttpClient'
|
|
|
50
53
|
import { RequestConfigBuilder } from './http/RequestConfigBuilder'
|
|
51
54
|
import { NowPlayingManager } from './player/NowPlayingManager'
|
|
52
55
|
import { OptionsManager } from './player/OptionsManager'
|
|
53
|
-
import {
|
|
54
|
-
import {
|
|
56
|
+
import { RemoteCommandController } from './player/RemoteCommandController'
|
|
57
|
+
import { QueuePlayer, SleepTimerManager, VolumeFader } from './TrackPlayer'
|
|
58
|
+
import { PlaybackTimer } from './TrackPlayer/PlaybackTimer'
|
|
59
|
+
import { derivePlayingState } from './TrackPlayer/PlayingStateFactory'
|
|
55
60
|
|
|
56
61
|
/**
|
|
57
62
|
* Web implementation of AudioBrowser (unified browser + player)
|
|
58
63
|
*/
|
|
59
64
|
export class NativeAudioBrowser
|
|
60
|
-
extends
|
|
65
|
+
extends QueuePlayer
|
|
61
66
|
implements AudioBrowserSpec
|
|
62
67
|
{
|
|
63
68
|
// HybridObject stuff
|
|
@@ -67,6 +72,8 @@ export class NativeAudioBrowser
|
|
|
67
72
|
}
|
|
68
73
|
dispose() {
|
|
69
74
|
this.clearUpdateEventInterval()
|
|
75
|
+
this.setPlaybackIntervalEnabled(false)
|
|
76
|
+
this.remoteCommands.dispose()
|
|
70
77
|
// Remove window event listeners to prevent memory leaks
|
|
71
78
|
if (typeof window !== 'undefined' && this.onlineHandler) {
|
|
72
79
|
window.removeEventListener('online', this.onlineHandler)
|
|
@@ -84,23 +91,35 @@ export class NativeAudioBrowser
|
|
|
84
91
|
private searchManager: SearchManager
|
|
85
92
|
private optionsManager: OptionsManager
|
|
86
93
|
private nowPlayingManager: NowPlayingManager
|
|
94
|
+
private remoteCommands: RemoteCommandController
|
|
87
95
|
|
|
88
96
|
// Player state
|
|
89
97
|
private currentLoadId = 0
|
|
90
|
-
private
|
|
98
|
+
private progressTimer = new PlaybackTimer()
|
|
99
|
+
private intervalTimer = new PlaybackTimer()
|
|
91
100
|
private _online: boolean =
|
|
92
101
|
typeof navigator !== 'undefined' ? navigator.onLine : true
|
|
93
102
|
private onlineHandler: (() => void) | undefined
|
|
94
103
|
private offlineHandler: (() => void) | undefined
|
|
104
|
+
private sleepFader = new VolumeFader(
|
|
105
|
+
() => this.getVolume(),
|
|
106
|
+
(volume) => this.setVolume(volume)
|
|
107
|
+
)
|
|
95
108
|
private sleepTimer = new (class extends SleepTimerManager {
|
|
96
109
|
constructor(private parent: NativeAudioBrowser) {
|
|
97
110
|
super()
|
|
98
111
|
}
|
|
99
112
|
protected onComplete(): void {
|
|
100
|
-
console.log('Sleep timer completed,
|
|
101
|
-
this.parent.
|
|
113
|
+
console.log('Sleep timer completed, pausing playback')
|
|
114
|
+
this.parent.sleepFader.resolve(() => this.parent.pause())
|
|
102
115
|
this.parent.onSleepTimerChanged(null)
|
|
103
116
|
}
|
|
117
|
+
protected onFadeStart(durationSeconds: number): void {
|
|
118
|
+
this.parent.sleepFader.start(durationSeconds)
|
|
119
|
+
}
|
|
120
|
+
protected onFadeCancel(): void {
|
|
121
|
+
this.parent.sleepFader.cancel(true)
|
|
122
|
+
}
|
|
104
123
|
})(this)
|
|
105
124
|
|
|
106
125
|
// MARK: Browser properties
|
|
@@ -151,17 +170,15 @@ export class NativeAudioBrowser
|
|
|
151
170
|
onPlaybackPlayingState: (data: PlayingState) => void = () => {}
|
|
152
171
|
onPlaybackProgressUpdated: (data: PlaybackProgressUpdatedEvent) => void =
|
|
153
172
|
() => {}
|
|
173
|
+
onPlaybackInterval: () => void = () => {}
|
|
154
174
|
onPlaybackQueueEnded: (data: PlaybackQueueEndedEvent) => void = () => {}
|
|
155
175
|
onPlaybackQueueChanged: (queue: Track[]) => void = () => {}
|
|
156
176
|
onPlaybackRepeatModeChanged: (data: RepeatModeChangedEvent) => void = () => {}
|
|
157
177
|
onPlaybackShuffleModeChanged: (enabled: boolean) => void = () => {}
|
|
158
178
|
onSleepTimerChanged: (data: SleepTimerChangedEvent) => void = () => {}
|
|
159
179
|
onPlaybackChanged: (data: Playback) => void = () => {}
|
|
160
|
-
onRemoteBookmark: () => void = () => {}
|
|
161
|
-
onRemoteDislike: () => void = () => {}
|
|
162
180
|
onRemoteJumpBackward: (event: RemoteJumpBackwardEvent) => void = () => {}
|
|
163
181
|
onRemoteJumpForward: (event: RemoteJumpForwardEvent) => void = () => {}
|
|
164
|
-
onRemoteLike: () => void = () => {}
|
|
165
182
|
onRemoteNext: () => void = () => {}
|
|
166
183
|
onRemotePause: () => void = () => {}
|
|
167
184
|
onRemotePlay: () => void = () => {}
|
|
@@ -169,7 +186,6 @@ export class NativeAudioBrowser
|
|
|
169
186
|
onRemotePlaySearch: (event: RemotePlaySearchEvent) => void = () => {}
|
|
170
187
|
onRemotePrevious: () => void = () => {}
|
|
171
188
|
onRemoteSeek: (event: RemoteSeekEvent) => void = () => {}
|
|
172
|
-
onRemoteSetRating: (event: RemoteSetRatingEvent) => void = () => {}
|
|
173
189
|
onRemoteSkip: (event: RemoteSkipEvent) => void = () => {}
|
|
174
190
|
onRemoteStop: () => void = () => {}
|
|
175
191
|
onOptionsChanged: (event: Options) => void = () => {}
|
|
@@ -184,18 +200,22 @@ export class NativeAudioBrowser
|
|
|
184
200
|
event: BatteryOptimizationStatusChangedEvent
|
|
185
201
|
) => void = () => {}
|
|
186
202
|
onSystemVolumeChanged: (volume: number) => void = () => {}
|
|
187
|
-
|
|
203
|
+
onOutputChanged: (output: Output) => void = () => {}
|
|
204
|
+
onGate: (event: GateEvent) => void = () => {}
|
|
205
|
+
// Fail closed by default: only reachable in the init window before gate.ts
|
|
206
|
+
// re-binds resolveGate. Web has no serve sites, so this is never called in
|
|
207
|
+
// practice, but the default must agree with the fail-closed contract.
|
|
208
|
+
resolveGate: (request: NativeGateRequest) => Promise<GateDecision> =
|
|
209
|
+
async () => ({ gated: true })
|
|
210
|
+
onCarConnectedChanged: (connected: boolean) => void = () => {}
|
|
188
211
|
|
|
189
212
|
// MARK: Remote handlers
|
|
190
|
-
handleRemoteBookmark: (() => void) | undefined = undefined
|
|
191
|
-
handleRemoteDislike: (() => void) | undefined = undefined
|
|
192
213
|
handleRemoteJumpBackward:
|
|
193
214
|
| ((event: RemoteJumpBackwardEvent) => void)
|
|
194
215
|
| undefined = undefined
|
|
195
216
|
handleRemoteJumpForward:
|
|
196
217
|
| ((event: RemoteJumpForwardEvent) => void)
|
|
197
218
|
| undefined = undefined
|
|
198
|
-
handleRemoteLike: (() => void) | undefined = undefined
|
|
199
219
|
handleRemoteNext: (() => void) | undefined = undefined
|
|
200
220
|
handleRemotePause: (() => void) | undefined = undefined
|
|
201
221
|
handleRemotePlay: (() => void) | undefined = undefined
|
|
@@ -205,8 +225,6 @@ export class NativeAudioBrowser
|
|
|
205
225
|
undefined
|
|
206
226
|
handleRemotePrevious: (() => void) | undefined = undefined
|
|
207
227
|
handleRemoteSeek: ((event: RemoteSeekEvent) => void) | undefined = undefined
|
|
208
|
-
handleRemoteSetRating: ((event: RemoteSetRatingEvent) => void) | undefined =
|
|
209
|
-
undefined
|
|
210
228
|
handleRemoteSkip: (() => void) | undefined = undefined
|
|
211
229
|
handleRemoteStop: (() => void) | undefined = undefined
|
|
212
230
|
|
|
@@ -220,6 +238,7 @@ export class NativeAudioBrowser
|
|
|
220
238
|
this.navigationErrorManager = new NavigationErrorManager()
|
|
221
239
|
this.optionsManager = new OptionsManager()
|
|
222
240
|
this.nowPlayingManager = new NowPlayingManager()
|
|
241
|
+
this.remoteCommands = new RemoteCommandController(this)
|
|
223
242
|
|
|
224
243
|
this.browserManager = new BrowserManager(
|
|
225
244
|
this.httpClient,
|
|
@@ -227,7 +246,7 @@ export class NativeAudioBrowser
|
|
|
227
246
|
this.navigationErrorManager
|
|
228
247
|
)
|
|
229
248
|
|
|
230
|
-
this.searchManager = new SearchManager(this.browserManager
|
|
249
|
+
this.searchManager = new SearchManager(this.browserManager)
|
|
231
250
|
|
|
232
251
|
// Wire up event callbacks from managers to class callbacks
|
|
233
252
|
this.browserManager.onPathChanged = (path) => this.onPathChanged(path)
|
|
@@ -241,7 +260,7 @@ export class NativeAudioBrowser
|
|
|
241
260
|
this.optionsManager.onOptionsChanged = (options) =>
|
|
242
261
|
this.onOptionsChanged(options)
|
|
243
262
|
this.nowPlayingManager.onNowPlayingChanged = (metadata) =>
|
|
244
|
-
this.
|
|
263
|
+
this.publishNowPlaying(metadata)
|
|
245
264
|
|
|
246
265
|
// Setup online/offline listeners
|
|
247
266
|
if (typeof window !== 'undefined') {
|
|
@@ -280,59 +299,81 @@ export class NativeAudioBrowser
|
|
|
280
299
|
|
|
281
300
|
// Call callbacks
|
|
282
301
|
this.onPlaybackChanged(newState)
|
|
283
|
-
this.
|
|
302
|
+
this.refreshPlayingState()
|
|
303
|
+
this.remoteCommands.syncPlaybackState()
|
|
284
304
|
|
|
285
305
|
if (newState.state === 'error' && newState.error) {
|
|
286
306
|
this.onPlaybackError({ error: newState.error })
|
|
287
307
|
}
|
|
288
308
|
}
|
|
289
309
|
|
|
310
|
+
private lastPlayingState?: PlayingState
|
|
311
|
+
|
|
290
312
|
/**
|
|
291
|
-
*
|
|
292
|
-
*
|
|
313
|
+
* Re-derives the playing state and emits on change. Called from both of its
|
|
314
|
+
* inputs' change points — the state setter and the playWhenReady setter —
|
|
315
|
+
* with a dedupe so identical derivations don't double-emit (parity with
|
|
316
|
+
* Android's refreshPlayingState / iOS's PlayingStateManager).
|
|
293
317
|
*/
|
|
294
|
-
private
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
playing
|
|
299
|
-
|
|
300
|
-
|
|
318
|
+
private refreshPlayingState(): void {
|
|
319
|
+
const next = derivePlayingState(this._playWhenReady, this.state.state)
|
|
320
|
+
if (
|
|
321
|
+
this.lastPlayingState !== undefined &&
|
|
322
|
+
this.lastPlayingState.playing === next.playing &&
|
|
323
|
+
this.lastPlayingState.buffering === next.buffering
|
|
324
|
+
) {
|
|
325
|
+
return
|
|
301
326
|
}
|
|
327
|
+
this.lastPlayingState = next
|
|
328
|
+
this.onPlaybackPlayingState(next)
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Emits now-playing metadata to JS consumers and mirrors it to the OS media
|
|
333
|
+
* controls (lockscreen / notification / media keys).
|
|
334
|
+
*/
|
|
335
|
+
private publishNowPlaying(metadata: NowPlayingMetadata): void {
|
|
336
|
+
this.onNowPlayingChanged(metadata)
|
|
337
|
+
this.remoteCommands.setMetadata(metadata)
|
|
302
338
|
}
|
|
303
339
|
|
|
304
340
|
protected setupProgressUpdates(interval?: number) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
341
|
+
// Match Android: emit progress during loading, buffering, and playing.
|
|
342
|
+
this.progressTimer.start(
|
|
343
|
+
(interval ?? 0) * 1000,
|
|
344
|
+
() => {
|
|
308
345
|
const state = this.state.state
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
)
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
}, interval * 1000)
|
|
323
|
-
}
|
|
346
|
+
return (
|
|
347
|
+
state === 'playing' || state === 'loading' || state === 'buffering'
|
|
348
|
+
)
|
|
349
|
+
},
|
|
350
|
+
() => {
|
|
351
|
+
const progress = this.getProgress()
|
|
352
|
+
this.onPlaybackProgressUpdated({
|
|
353
|
+
...progress,
|
|
354
|
+
track: this.queue.currentIndex || 0
|
|
355
|
+
})
|
|
356
|
+
this.remoteCommands.updateProgress()
|
|
357
|
+
}
|
|
358
|
+
)
|
|
324
359
|
}
|
|
325
360
|
|
|
326
361
|
protected clearUpdateEventInterval() {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
362
|
+
this.progressTimer.stop()
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
setPlaybackIntervalEnabled(enabled: boolean): void {
|
|
366
|
+
this.intervalTimer.start(
|
|
367
|
+
enabled ? 1000 : 0,
|
|
368
|
+
() => this.state.state === 'playing',
|
|
369
|
+
() => this.onPlaybackInterval()
|
|
370
|
+
)
|
|
330
371
|
}
|
|
331
372
|
|
|
332
|
-
protected
|
|
333
|
-
super.
|
|
373
|
+
protected onQueueEnded() {
|
|
374
|
+
super.onQueueEnded()
|
|
334
375
|
this.onPlaybackQueueEnded({
|
|
335
|
-
track: this.currentIndex ?? 0,
|
|
376
|
+
track: this.queue.currentIndex ?? 0,
|
|
336
377
|
position: this.element?.currentTime ?? 0
|
|
337
378
|
})
|
|
338
379
|
}
|
|
@@ -343,9 +384,8 @@ export class NativeAudioBrowser
|
|
|
343
384
|
}
|
|
344
385
|
|
|
345
386
|
navigateTrack(track: Track): void {
|
|
346
|
-
const url = track.url
|
|
347
387
|
// Execute async navigation logic without blocking
|
|
348
|
-
void this.navigateTrackAsync(track
|
|
388
|
+
void this.navigateTrackAsync(track)
|
|
349
389
|
}
|
|
350
390
|
|
|
351
391
|
/**
|
|
@@ -418,7 +458,12 @@ export class NativeAudioBrowser
|
|
|
418
458
|
}
|
|
419
459
|
|
|
420
460
|
await this.handleLoad(track, result.tracks, result.startIndex, () => {
|
|
461
|
+
// setQueue keeps the current play/pause state, so start playback
|
|
462
|
+
// explicitly — selecting a track is an intent to play (matches the
|
|
463
|
+
// skip-to-existing-queue-track path). Without this the first track of a
|
|
464
|
+
// freshly expanded queue loads but stays paused.
|
|
421
465
|
this.setQueue(result.tracks, result.startIndex)
|
|
466
|
+
this.play()
|
|
422
467
|
})
|
|
423
468
|
return true
|
|
424
469
|
}
|
|
@@ -427,58 +472,57 @@ export class NativeAudioBrowser
|
|
|
427
472
|
* Async implementation of track navigation with queue expansion support.
|
|
428
473
|
* Matches Android's MediaSessionCallback behavior.
|
|
429
474
|
*/
|
|
430
|
-
private async navigateTrackAsync(
|
|
431
|
-
track: Track,
|
|
432
|
-
url: string | undefined
|
|
433
|
-
): Promise<void> {
|
|
475
|
+
private async navigateTrackAsync(track: Track): Promise<void> {
|
|
434
476
|
try {
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
477
|
+
const nav = classifyTrackNavigation(track)
|
|
478
|
+
switch (nav.kind) {
|
|
479
|
+
case 'contextual':
|
|
480
|
+
// Optimization: skip to the track if it's already in the queue.
|
|
481
|
+
if (
|
|
482
|
+
nav.trackId &&
|
|
483
|
+
(await this.trySkipToExistingQueueTrack(
|
|
484
|
+
nav.trackId,
|
|
485
|
+
nav.parentPath
|
|
486
|
+
))
|
|
487
|
+
) {
|
|
488
|
+
return
|
|
489
|
+
}
|
|
490
|
+
// Otherwise expand the queue from the contextual URL, falling back to
|
|
491
|
+
// loading the single track if expansion yields nothing.
|
|
492
|
+
if (await this.expandQueueAndPlay(track)) return
|
|
493
|
+
await this.playSingleTrack(track)
|
|
445
494
|
return
|
|
446
|
-
}
|
|
447
495
|
|
|
448
|
-
|
|
449
|
-
|
|
496
|
+
case 'browse':
|
|
497
|
+
this.browserManager.navigateTrack(track).catch((error: unknown) => {
|
|
498
|
+
console.error('Failed to navigate to track:', error)
|
|
499
|
+
})
|
|
450
500
|
return
|
|
451
|
-
}
|
|
452
501
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
// Handle browsable track (has URL but not contextual)
|
|
459
|
-
if (url) {
|
|
460
|
-
this.browserManager.navigateTrack(track).catch((error: unknown) => {
|
|
461
|
-
console.error('Failed to navigate to track:', error)
|
|
462
|
-
})
|
|
463
|
-
return
|
|
464
|
-
}
|
|
502
|
+
case 'playable':
|
|
503
|
+
await this.playSingleTrack(track)
|
|
504
|
+
return
|
|
465
505
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
await this.handleLoad(track, [track], 0, () => this.load(track))
|
|
469
|
-
return
|
|
506
|
+
case 'invalid':
|
|
507
|
+
throw new Error("Track must have either 'url' or 'src' property")
|
|
470
508
|
}
|
|
471
|
-
|
|
472
|
-
throw new Error("Track must have either 'url' or 'src' property")
|
|
473
509
|
} catch (error) {
|
|
474
510
|
const message = error instanceof Error ? error.message : 'Unknown error'
|
|
475
511
|
this.navigationErrorManager.setNavigationError('unknown-error', message)
|
|
476
512
|
}
|
|
477
513
|
}
|
|
478
514
|
|
|
515
|
+
/** Loads a single track as its own queue and starts playback. */
|
|
516
|
+
private async playSingleTrack(track: Track): Promise<void> {
|
|
517
|
+
await this.handleLoad(track, [track], 0, () => {
|
|
518
|
+
this.load(track)
|
|
519
|
+
this.play()
|
|
520
|
+
})
|
|
521
|
+
}
|
|
522
|
+
|
|
479
523
|
async onSearch(query: string): Promise<Track[]> {
|
|
480
524
|
// Wrap query string in SearchParams (matches Android's search(query: String) overload)
|
|
481
|
-
return this.searchManager.search({ query })
|
|
525
|
+
return this.searchManager.search({ query, reference: 'unknown' })
|
|
482
526
|
}
|
|
483
527
|
|
|
484
528
|
getContent(): ResolvedTrack | undefined {
|
|
@@ -497,13 +541,24 @@ export class NativeAudioBrowser
|
|
|
497
541
|
this.browserManager.notifyContentChanged(path)
|
|
498
542
|
}
|
|
499
543
|
|
|
544
|
+
invalidateAllContent(): void {
|
|
545
|
+
this.browserManager.invalidateAllContent()
|
|
546
|
+
}
|
|
547
|
+
|
|
500
548
|
setFavorites(favorites: string[]): void {
|
|
501
549
|
this.favoriteManager.setFavorites(favorites)
|
|
502
550
|
}
|
|
503
551
|
|
|
504
552
|
// MARK: Player init and config
|
|
505
|
-
async setupPlayer(options:
|
|
553
|
+
async setupPlayer(options: NativeSetupPlayerOptions): Promise<void> {
|
|
506
554
|
await super.setupPlayer(options)
|
|
555
|
+
// Apply the launch options and initial state bundled in setup — same
|
|
556
|
+
// atomic contract as the native platforms.
|
|
557
|
+
if (options.options) this.updateOptions(options.options)
|
|
558
|
+
if (options.repeatMode !== undefined) this.setRepeatMode(options.repeatMode)
|
|
559
|
+
if (options.playWhenReady !== undefined) {
|
|
560
|
+
this.setPlayWhenReady(options.playWhenReady)
|
|
561
|
+
}
|
|
507
562
|
}
|
|
508
563
|
|
|
509
564
|
updateOptions(options: NativeUpdateOptions): void {
|
|
@@ -520,7 +575,7 @@ export class NativeAudioBrowser
|
|
|
520
575
|
}
|
|
521
576
|
}
|
|
522
577
|
|
|
523
|
-
getOptions():
|
|
578
|
+
getOptions(): Options {
|
|
524
579
|
return this.optionsManager.getOptions()
|
|
525
580
|
}
|
|
526
581
|
|
|
@@ -533,8 +588,25 @@ export class NativeAudioBrowser
|
|
|
533
588
|
* Mirrors Android's MediaFactory.getMediaRequestConfig behavior.
|
|
534
589
|
*/
|
|
535
590
|
private async resolveMediaUrl(src: string): Promise<string> {
|
|
536
|
-
const
|
|
537
|
-
return RequestConfigBuilder.resolveMediaUrl(src,
|
|
591
|
+
const { request, media } = this.browserManager.configuration
|
|
592
|
+
return RequestConfigBuilder.resolveMediaUrl(src, request, media)
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
* Reload from the queue's own entry, whose `src` is still unresolved —
|
|
597
|
+
* `current` holds the resolved track, and re-feeding it into `load()` would
|
|
598
|
+
* re-resolve the resolved URL (double-applying a `transform`) and replace
|
|
599
|
+
* the queue entry with it.
|
|
600
|
+
*/
|
|
601
|
+
protected override reloadCurrent(): void {
|
|
602
|
+
const index = this.queue.currentIndex
|
|
603
|
+
const sourceTrack =
|
|
604
|
+
index !== undefined ? this.queue.getTrack(index) : undefined
|
|
605
|
+
if (sourceTrack) {
|
|
606
|
+
this.load(sourceTrack)
|
|
607
|
+
} else {
|
|
608
|
+
super.reloadCurrent()
|
|
609
|
+
}
|
|
538
610
|
}
|
|
539
611
|
|
|
540
612
|
load(track: Track, callback?: (track: Track) => void): void {
|
|
@@ -545,22 +617,22 @@ export class NativeAudioBrowser
|
|
|
545
617
|
|
|
546
618
|
// Match Android: load() modifies the queue.
|
|
547
619
|
// If queue is empty, add the track. If queue has items, replace at currentIndex.
|
|
548
|
-
if (this.
|
|
549
|
-
this.
|
|
550
|
-
this.
|
|
551
|
-
this.
|
|
620
|
+
if (this.queue.length === 0) {
|
|
621
|
+
this.queue.setTracks([track])
|
|
622
|
+
this.queue.currentIndex = 0
|
|
623
|
+
this.emitQueueChanged()
|
|
552
624
|
} else if (
|
|
553
|
-
this.currentIndex !== undefined &&
|
|
554
|
-
this.
|
|
625
|
+
this.queue.currentIndex !== undefined &&
|
|
626
|
+
this.queue.getTrack(this.queue.currentIndex) !== track
|
|
555
627
|
) {
|
|
556
|
-
this.
|
|
557
|
-
this.
|
|
628
|
+
this.queue.replaceTrack(this.queue.currentIndex, track)
|
|
629
|
+
this.emitQueueChanged()
|
|
558
630
|
}
|
|
559
631
|
|
|
560
632
|
const lastTrack = this.current
|
|
561
633
|
const lastPosition = element.currentTime
|
|
562
|
-
const lastIndex = this.lastIndex
|
|
563
|
-
const currentIndex = this.currentIndex
|
|
634
|
+
const lastIndex = this.queue.lastIndex
|
|
635
|
+
const currentIndex = this.queue.currentIndex
|
|
564
636
|
|
|
565
637
|
// Set loading flag early so seekTo() calls during async URL resolution
|
|
566
638
|
// are captured as pending seeks rather than silently dropped
|
|
@@ -591,7 +663,7 @@ export class NativeAudioBrowser
|
|
|
591
663
|
// Update now playing metadata
|
|
592
664
|
const nowPlaying = this.getNowPlaying()
|
|
593
665
|
if (nowPlaying) {
|
|
594
|
-
this.
|
|
666
|
+
this.publishNowPlaying(nowPlaying)
|
|
595
667
|
}
|
|
596
668
|
|
|
597
669
|
// Call the provided callback if any
|
|
@@ -603,12 +675,20 @@ export class NativeAudioBrowser
|
|
|
603
675
|
|
|
604
676
|
// Execute async load without blocking, with error handling
|
|
605
677
|
doLoad().catch((error: unknown) => {
|
|
678
|
+
// Only the active load may surface a resolution failure.
|
|
679
|
+
if (loadId !== this.currentLoadId) return
|
|
606
680
|
this._loadInProgress = false
|
|
607
681
|
this._pendingSeek = undefined
|
|
608
682
|
console.error('Error loading track:', error)
|
|
609
683
|
const message =
|
|
610
684
|
error instanceof Error ? error.message : 'Failed to load track'
|
|
611
|
-
|
|
685
|
+
// Track resolution failed before playback was ever attempted, so nothing
|
|
686
|
+
// is known about the stream itself.
|
|
687
|
+
const playbackError: PlaybackError = {
|
|
688
|
+
kind: 'unknown',
|
|
689
|
+
code: 'load-error',
|
|
690
|
+
message
|
|
691
|
+
}
|
|
612
692
|
this.state = { state: 'error', error: playbackError }
|
|
613
693
|
})
|
|
614
694
|
}
|
|
@@ -617,15 +697,89 @@ export class NativeAudioBrowser
|
|
|
617
697
|
super.togglePlayback()
|
|
618
698
|
}
|
|
619
699
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
700
|
+
/**
|
|
701
|
+
* Copies before emitting: the queue mutates in place, and handing out the
|
|
702
|
+
* live array defeats React's reference-equality change detection.
|
|
703
|
+
*/
|
|
704
|
+
private emitQueueChanged(): void {
|
|
705
|
+
this.onPlaybackQueueChanged([...this.queue.tracks])
|
|
706
|
+
}
|
|
623
707
|
|
|
708
|
+
// Queue mutations must reach onPlaybackQueueChanged (the contract covers
|
|
709
|
+
// added/removed/reordered; Android emits via onTimelineChanged).
|
|
710
|
+
override add(tracks: Track[], insertBeforeIndex?: number): void {
|
|
711
|
+
super.add(tracks, insertBeforeIndex)
|
|
712
|
+
this.emitQueueChanged()
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
override remove(indexes: number[]): void {
|
|
716
|
+
super.remove(indexes)
|
|
717
|
+
this.emitQueueChanged()
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
override move(fromIndex: number, toIndex: number): void {
|
|
721
|
+
super.move(fromIndex, toIndex)
|
|
722
|
+
this.emitQueueChanged()
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
override removeUpcomingTracks(): void {
|
|
726
|
+
super.removeUpcomingTracks()
|
|
727
|
+
this.emitQueueChanged()
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
override reset(): void {
|
|
731
|
+
super.reset()
|
|
732
|
+
this.emitQueueChanged()
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// Override playWhenReady to emit events (mirrors the state override): the
|
|
736
|
+
// base transport methods (play/pause/stop, the queue-end intent clear)
|
|
737
|
+
// assign through this accessor, so the change event and MediaSession sync
|
|
738
|
+
// fire for every writer — not only setPlayWhenReady().
|
|
739
|
+
public override get playWhenReady(): boolean {
|
|
740
|
+
return super.playWhenReady
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
public override set playWhenReady(pwr: boolean) {
|
|
744
|
+
const didChange = pwr !== super.playWhenReady
|
|
745
|
+
super.playWhenReady = pwr
|
|
624
746
|
if (didChange) {
|
|
625
|
-
this.onPlaybackPlayWhenReadyChanged({
|
|
626
|
-
|
|
627
|
-
|
|
747
|
+
this.onPlaybackPlayWhenReadyChanged({ playWhenReady: pwr })
|
|
748
|
+
this.refreshPlayingState()
|
|
749
|
+
this.remoteCommands.syncPlaybackState()
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
setPlayWhenReady(pwr: boolean): void {
|
|
754
|
+
if (!pwr) {
|
|
755
|
+
if (this.element) {
|
|
756
|
+
// pause() halts first and its override then clears a fading sleep
|
|
757
|
+
// timer — restoring the volume before the halt would let full-volume
|
|
758
|
+
// audio slip out (VolumeFader's invariant).
|
|
759
|
+
this.pause()
|
|
760
|
+
} else {
|
|
761
|
+
this.clearSleepTimerIfFading()
|
|
762
|
+
this.playWhenReady = false
|
|
763
|
+
}
|
|
764
|
+
return
|
|
628
765
|
}
|
|
766
|
+
// Mirror native: raising the intent restarts playback from terminal
|
|
767
|
+
// states (reload/replay via play()) and resumes a settled paused/ready
|
|
768
|
+
// player. While loading/buffering the flag alone is correct — load()'s
|
|
769
|
+
// auto-play starts playback once the source is ready.
|
|
770
|
+
const { state } = this.state
|
|
771
|
+
if (
|
|
772
|
+
this.current !== undefined &&
|
|
773
|
+
(state === 'ended' ||
|
|
774
|
+
state === 'stopped' ||
|
|
775
|
+
state === 'error' ||
|
|
776
|
+
state === 'paused' ||
|
|
777
|
+
state === 'ready')
|
|
778
|
+
) {
|
|
779
|
+
this.play()
|
|
780
|
+
return
|
|
781
|
+
}
|
|
782
|
+
this.playWhenReady = true
|
|
629
783
|
}
|
|
630
784
|
|
|
631
785
|
getPlayWhenReady(): boolean {
|
|
@@ -637,7 +791,7 @@ export class NativeAudioBrowser
|
|
|
637
791
|
}
|
|
638
792
|
|
|
639
793
|
getPlayingState(): PlayingState {
|
|
640
|
-
return this.
|
|
794
|
+
return derivePlayingState(this._playWhenReady, this.state.state)
|
|
641
795
|
}
|
|
642
796
|
|
|
643
797
|
getRepeatMode(): RepeatModeType {
|
|
@@ -645,7 +799,7 @@ export class NativeAudioBrowser
|
|
|
645
799
|
}
|
|
646
800
|
|
|
647
801
|
setRepeatMode(mode: RepeatModeType): void {
|
|
648
|
-
const didChange = this.repeatMode !== mode
|
|
802
|
+
const didChange = this.queue.repeatMode !== mode
|
|
649
803
|
super.setRepeatMode(mode)
|
|
650
804
|
this.optionsManager.setRepeatMode(mode)
|
|
651
805
|
|
|
@@ -681,11 +835,35 @@ export class NativeAudioBrowser
|
|
|
681
835
|
return null
|
|
682
836
|
}
|
|
683
837
|
|
|
684
|
-
setSleepTimer(seconds: number): void {
|
|
685
|
-
this.sleepTimer.sleepAfter(seconds)
|
|
838
|
+
setSleepTimer(seconds: number, fadeDuration?: number): void {
|
|
839
|
+
this.sleepTimer.sleepAfter(seconds, fadeDuration)
|
|
686
840
|
this.onSleepTimerChanged(this.getSleepTimer())
|
|
687
841
|
}
|
|
688
842
|
|
|
843
|
+
/**
|
|
844
|
+
* An explicit pause intent during the sleep fade is the timer's goal
|
|
845
|
+
* arriving early: clear the timer (which restores the pre-fade volume).
|
|
846
|
+
* Called after the halt lands so the restore never precedes it. Mirrors
|
|
847
|
+
* the native playWhenReady hooks.
|
|
848
|
+
*/
|
|
849
|
+
private clearSleepTimerIfFading(): void {
|
|
850
|
+
if (this.sleepFader.isActive) this.clearSleepTimer()
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
override pause(): void {
|
|
854
|
+
super.pause()
|
|
855
|
+
this.clearSleepTimerIfFading()
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
override stop(): void {
|
|
859
|
+
// Invalidate any in-flight load: its post-await continuation would call
|
|
860
|
+
// super.load(), whose first line re-arms the player (_isStopped = false)
|
|
861
|
+
// and revives the state out of Stopped.
|
|
862
|
+
this.currentLoadId++
|
|
863
|
+
super.stop()
|
|
864
|
+
this.clearSleepTimerIfFading()
|
|
865
|
+
}
|
|
866
|
+
|
|
689
867
|
setSleepTimerToEndOfTrack(): void {
|
|
690
868
|
this.sleepTimer.setToEndOfTrack()
|
|
691
869
|
this.onSleepTimerChanged(this.getSleepTimer())
|
|
@@ -705,9 +883,9 @@ export class NativeAudioBrowser
|
|
|
705
883
|
protected onTrackEnded(): void {
|
|
706
884
|
// Check if sleep timer is set to end on track completion
|
|
707
885
|
if (this.sleepTimer.sleepWhenPlayedToEnd) {
|
|
708
|
-
console.log('Sleep timer triggered on track end,
|
|
886
|
+
console.log('Sleep timer triggered on track end, pausing playback')
|
|
709
887
|
this.sleepTimer.clear()
|
|
710
|
-
this.
|
|
888
|
+
this.pause()
|
|
711
889
|
this.onSleepTimerChanged(null)
|
|
712
890
|
return
|
|
713
891
|
}
|
|
@@ -717,49 +895,43 @@ export class NativeAudioBrowser
|
|
|
717
895
|
}
|
|
718
896
|
|
|
719
897
|
// MARK: Queue management
|
|
720
|
-
setQueue(
|
|
721
|
-
tracks: Track[],
|
|
722
|
-
startIndex?: number,
|
|
723
|
-
startPositionMs?: number
|
|
724
|
-
): void {
|
|
898
|
+
setQueue(tracks: Track[], startIndex?: number, startPosition?: number): void {
|
|
725
899
|
this.stop()
|
|
726
900
|
// Clear stale references from previous queue
|
|
727
901
|
this.current = undefined
|
|
728
|
-
this._currentIndex = undefined
|
|
729
902
|
// Hydrate favorites and transform artwork URLs on all tracks in the queue
|
|
730
|
-
const
|
|
731
|
-
this.
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
super.setShuffleEnabled(true) // Regenerates shuffle order
|
|
748
|
-
}
|
|
903
|
+
const { request, artwork } = this.browserManager.configuration
|
|
904
|
+
this.queue.setTracks(
|
|
905
|
+
tracks.map((track) => {
|
|
906
|
+
try {
|
|
907
|
+
const hydratedTrack = this.favoriteManager.hydrateFavorite(track)
|
|
908
|
+
return RequestConfigBuilder.transformTrackArtwork(
|
|
909
|
+
hydratedTrack,
|
|
910
|
+
request,
|
|
911
|
+
artwork
|
|
912
|
+
)
|
|
913
|
+
} catch (error) {
|
|
914
|
+
console.error('Failed to transform track:', error)
|
|
915
|
+
return track // Use original track as fallback
|
|
916
|
+
}
|
|
917
|
+
})
|
|
918
|
+
)
|
|
919
|
+
this.emitQueueChanged()
|
|
749
920
|
|
|
750
|
-
if (startIndex !== undefined && this.
|
|
751
|
-
this.skip(startIndex,
|
|
921
|
+
if (startIndex !== undefined && this.queue.getTrack(startIndex)) {
|
|
922
|
+
this.skip(startIndex, startPosition)
|
|
752
923
|
}
|
|
753
924
|
}
|
|
754
925
|
|
|
755
926
|
getQueue(): Track[] {
|
|
756
|
-
|
|
927
|
+
// Copy — see emitQueueChanged.
|
|
928
|
+
return [...this.queue.tracks]
|
|
757
929
|
}
|
|
758
930
|
|
|
759
931
|
getActiveTrackIndex(): number | undefined {
|
|
760
932
|
this.requireElement()
|
|
761
933
|
this.requirePlayer()
|
|
762
|
-
return this.currentIndex
|
|
934
|
+
return this.queue.currentIndex
|
|
763
935
|
}
|
|
764
936
|
|
|
765
937
|
getActiveTrack(): Track | undefined {
|
|
@@ -784,8 +956,8 @@ export class NativeAudioBrowser
|
|
|
784
956
|
favorited
|
|
785
957
|
}
|
|
786
958
|
|
|
787
|
-
// Replace the track in the
|
|
788
|
-
this.
|
|
959
|
+
// Replace the track in the queue
|
|
960
|
+
this.queue.replaceTrack(index, updatedTrack)
|
|
789
961
|
|
|
790
962
|
// Emit favorite changed event
|
|
791
963
|
this.onFavoriteChanged({ track: updatedTrack, favorited })
|
|
@@ -800,7 +972,7 @@ export class NativeAudioBrowser
|
|
|
800
972
|
})
|
|
801
973
|
|
|
802
974
|
// Emit queue changed so useQueue() hook updates
|
|
803
|
-
this.
|
|
975
|
+
this.emitQueueChanged()
|
|
804
976
|
}
|
|
805
977
|
|
|
806
978
|
toggleActiveTrackFavorited(): void {
|
|
@@ -824,6 +996,26 @@ export class NativeAudioBrowser
|
|
|
824
996
|
return this.nowPlayingManager.getNowPlaying(track, duration)
|
|
825
997
|
}
|
|
826
998
|
|
|
999
|
+
private nowPlayingFlashRevert: ReturnType<typeof setTimeout> | undefined
|
|
1000
|
+
|
|
1001
|
+
flashNowPlaying(update: NowPlayingUpdate, durationMs: number): void {
|
|
1002
|
+
// Web approximation: an override + timer is sufficient here — the
|
|
1003
|
+
// background-timer and formatter-priority concerns are native-only.
|
|
1004
|
+
this.updateNowPlaying(update)
|
|
1005
|
+
if (this.nowPlayingFlashRevert) clearTimeout(this.nowPlayingFlashRevert)
|
|
1006
|
+
this.nowPlayingFlashRevert = setTimeout(() => {
|
|
1007
|
+
this.nowPlayingFlashRevert = undefined
|
|
1008
|
+
this.updateNowPlaying(undefined)
|
|
1009
|
+
}, durationMs)
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
clearNowPlayingFlash(): void {
|
|
1013
|
+
if (!this.nowPlayingFlashRevert) return
|
|
1014
|
+
clearTimeout(this.nowPlayingFlashRevert)
|
|
1015
|
+
this.nowPlayingFlashRevert = undefined
|
|
1016
|
+
this.updateNowPlaying(undefined)
|
|
1017
|
+
}
|
|
1018
|
+
|
|
827
1019
|
// MARK: Network connectivity
|
|
828
1020
|
getOnline(): boolean {
|
|
829
1021
|
return this._online
|
|
@@ -877,12 +1069,27 @@ export class NativeAudioBrowser
|
|
|
877
1069
|
// No-op on web - browsers can't set system volume
|
|
878
1070
|
}
|
|
879
1071
|
|
|
880
|
-
// MARK:
|
|
881
|
-
|
|
1072
|
+
// MARK: Gate (no-op — web has no external browse surfaces)
|
|
1073
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1074
|
+
setGate(_gate: NativeGate | undefined, _hasResolver: boolean): void {}
|
|
1075
|
+
|
|
1076
|
+
clearGate(): void {}
|
|
1077
|
+
|
|
1078
|
+
// MARK: Car connection (not applicable on web)
|
|
1079
|
+
isCarConnected(): boolean {
|
|
1080
|
+
return false
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
// MARK: audio output (not applicable on web)
|
|
1084
|
+
getOutput(): Output | undefined {
|
|
882
1085
|
return undefined
|
|
883
1086
|
}
|
|
884
1087
|
|
|
885
|
-
|
|
1088
|
+
openOutputPicker(): void {
|
|
886
1089
|
// No-op on web
|
|
887
1090
|
}
|
|
1091
|
+
|
|
1092
|
+
supportsOutputSwitcher(): boolean {
|
|
1093
|
+
return false
|
|
1094
|
+
}
|
|
888
1095
|
}
|