react-native-audio-browser 0.2.0-next.2 → 0.2.0-next.21
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/README.md +35 -21
- package/android/build.gradle +35 -12
- package/android/gradle.properties +2 -2
- package/android/src/main/AndroidManifest.xml +3 -1
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +389 -164
- package/android/src/main/java/com/audiobrowser/AudioBrowserLifecycleModule.kt +38 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowserPackage.kt +18 -2
- package/android/src/main/java/com/audiobrowser/ServiceBinding.kt +48 -0
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +315 -213
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +24 -5
- package/android/src/main/java/com/audiobrowser/browser/InertStyleDiagnostic.kt +267 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +97 -58
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +70 -29
- package/android/src/main/java/com/audiobrowser/browser/StyleResolver.kt +60 -0
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +20 -7
- package/android/src/main/java/com/audiobrowser/extension/TappedTrack.kt +20 -0
- package/android/src/main/java/com/audiobrowser/extension/TrackIdentity.kt +15 -0
- package/android/src/main/java/com/audiobrowser/http/HttpClient.kt +20 -3
- package/android/src/main/java/com/audiobrowser/model/IcyTitle.kt +24 -0
- package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +10 -6
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +12 -12
- package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +111 -58
- package/android/src/main/java/com/audiobrowser/player/CrossOriginHeaderStripper.kt +77 -0
- package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +28 -10
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +509 -230
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +218 -252
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +21 -25
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +113 -78
- package/android/src/main/java/com/audiobrowser/player/Player.kt +81 -38
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +2 -15
- package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +1 -1
- package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +2 -1
- package/android/src/main/java/com/audiobrowser/player/ShuffleOrderLedBy.kt +30 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +67 -11
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingExtendedTrustManager.kt +168 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +58 -14
- package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +35 -7
- package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +278 -59
- package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +7 -9
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +56 -40
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +28 -23
- package/android/src/main/java/com/audiobrowser/util/StyleWire.kt +108 -0
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +56 -52
- package/android/src/main/res/values/strings.xml +25 -5
- package/android/src/test/java/com/audiobrowser/ServiceBindingTest.kt +87 -0
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +119 -33
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerFavoritesTest.kt +153 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +15 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +346 -8
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +38 -0
- package/android/src/test/java/com/audiobrowser/browser/InertStyleDiagnosticTest.kt +277 -0
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +3 -2
- package/android/src/test/java/com/audiobrowser/browser/JsonStyleTest.kt +147 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +128 -55
- package/android/src/test/java/com/audiobrowser/browser/StyleResolverTest.kt +154 -0
- package/android/src/test/java/com/audiobrowser/extension/TappedTrackTest.kt +43 -0
- package/android/src/test/java/com/audiobrowser/extension/TrackIdentityTest.kt +41 -0
- package/android/src/test/java/com/audiobrowser/model/IcyTitleTest.kt +49 -0
- package/android/src/test/java/com/audiobrowser/player/BrowseTilesTest.kt +385 -0
- package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +101 -58
- package/android/src/test/java/com/audiobrowser/player/CrossOriginHeaderStripperTest.kt +94 -0
- package/android/src/test/java/com/audiobrowser/player/MediaSessionSlotMappingTest.kt +45 -0
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +42 -2
- package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +3 -4
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateStoreTrackJsonTest.kt +55 -0
- package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +3 -3
- package/android/src/test/java/com/audiobrowser/player/ShuffleOrderLedByTest.kt +79 -0
- package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +197 -7
- package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +325 -4
- package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherCallSiteTest.kt +322 -0
- package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +83 -0
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +41 -16
- package/android/src/test/java/com/audiobrowser/util/MediaExtrasBuilderTest.kt +162 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +7 -7
- package/ios/Browser/BrowserConfig.swift +102 -5
- package/ios/Browser/BrowserManager+URLResolution.swift +18 -14
- package/ios/Browser/BrowserManager.swift +230 -205
- package/ios/Browser/BrowserPathHelper.swift +44 -44
- package/ios/Browser/InertStyleDiagnostic.swift +279 -0
- package/ios/Browser/JsonModels.swift +264 -106
- package/ios/Browser/SearchDrillIn.swift +7 -7
- package/ios/Browser/SectionPresentation.swift +64 -0
- package/ios/Browser/SectionScope.swift +58 -24
- package/ios/Browser/StyleResolver.swift +58 -0
- package/ios/Browser/TabBarEntries.swift +9 -3
- package/ios/Browser/TrackIdTemplate.swift +37 -0
- package/ios/CarPlay/CarPlayArtworkResolver.swift +8 -7
- package/ios/CarPlay/CarPlayController.swift +227 -85
- package/ios/CarPlay/CarPlayImageLoader.swift +42 -20
- package/ios/CarPlay/CarPlayListItemFactory.swift +289 -84
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +15 -12
- package/ios/CarPlay/RNABMediaAddHandler.swift +6 -6
- package/ios/CarPlay/RNABMediaAffinityHandler.swift +2 -2
- package/ios/CarPlay/RNABMediaIntentHandler.swift +16 -16
- package/ios/Extension/Capability+RemoteCommand.swift +1 -1
- package/ios/Extension/PlayerCapabilities+Favorite.swift +1 -15
- package/ios/Extension/ResolvedTrack+Copying.swift +13 -15
- package/ios/Extension/Section+Copying.swift +29 -0
- package/ios/Extension/String+IcyCharset.swift +21 -0
- package/ios/Extension/TimedMetadata+AVFoundation.swift +6 -4
- package/ios/Extension/Track+Copying.swift +8 -12
- package/ios/Extension/Track+Identity.swift +18 -0
- package/ios/Extension/UIApplication+ActiveScene.swift +27 -0
- package/ios/Http/HttpClient.swift +8 -2
- package/ios/HybridAudioBrowser.swift +253 -100
- package/ios/Model/NitroTypeStubs.swift +125 -23
- package/ios/Model/PlayerUpdateOptions.swift +7 -0
- package/ios/Model/RemoteCommand.swift +18 -0
- package/ios/Model/TrackPlayerError.swift +2 -2
- package/ios/Option/SessionCategories.swift +3 -2
- package/ios/Player/MediaIntentCriteria.swift +17 -9
- package/ios/Player/MediaLoader.swift +33 -9
- package/ios/Player/NowPlayingUpdater.swift +54 -6
- package/ios/Player/PlaybackCoordinator.swift +13 -6
- package/ios/Player/PlaybackErrorHandler.swift +4 -4
- package/ios/Player/PlaybackTimer.swift +8 -2
- package/ios/Player/QueueManager.swift +46 -13
- package/ios/Player/RetryManager.swift +80 -18
- package/ios/Player/SeekCompletionHandler.swift +3 -1
- package/ios/Player/ShuffleOrder.swift +33 -0
- package/ios/Player/SleepTimerHandling.swift +13 -0
- package/ios/RemoteCommand/RemoteCommandCallbacks.swift +47 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +62 -24
- package/ios/Tests/BrowserPathHelperTests.swift +50 -20
- package/ios/Tests/CarPlayArtworkResolverTests.swift +24 -41
- package/ios/Tests/InertStyleDiagnosticTests.swift +200 -0
- package/ios/Tests/JsonModelsTests.swift +150 -1
- package/ios/Tests/LRUCacheTests.swift +111 -0
- package/ios/Tests/LoadSeekCoordinatorTests.swift +3 -1
- package/ios/Tests/MediaIntentCriteriaTests.swift +2 -2
- package/ios/Tests/PlaybackCoordinatorTests.swift +1 -1
- package/ios/Tests/PlaybackErrorHandlerTests.swift +3 -1
- package/ios/Tests/PlaybackStateStoreTests.swift +4 -3
- package/ios/Tests/PlayerTimeObserverTests.swift +37 -0
- package/ios/Tests/QueueManagerTests.swift +122 -10
- package/ios/Tests/RemoteCommandControllerTests.swift +172 -0
- package/ios/Tests/RemoteCommandTests.swift +67 -0
- package/ios/Tests/ResolvedTrackCopyingTests.swift +39 -35
- package/ios/Tests/RetryManagerTests.swift +89 -0
- package/ios/Tests/SearchDrillInTests.swift +16 -16
- package/ios/Tests/SectionPresentationTests.swift +90 -0
- package/ios/Tests/SectionScopeTests.swift +87 -55
- package/ios/Tests/StyleResolverTests.swift +127 -0
- package/ios/Tests/Support/TestTypes.swift +8 -1
- package/ios/Tests/TabBarEntriesTests.swift +19 -19
- package/ios/Tests/TimedMetadataAVFoundationTests.swift +42 -0
- package/ios/Tests/TrackIdTemplateTests.swift +67 -0
- package/ios/Tests/TrackIdentityTests.swift +20 -0
- package/ios/Tests/TrackSelectorTests.swift +168 -33
- package/ios/TrackPlayer.swift +63 -35
- package/ios/TrackPlayerCallbacks.swift +5 -38
- package/ios/TrackSelector.swift +45 -30
- package/ios/Util/ArtworkImageFetcher.swift +16 -1
- package/ios/Util/LRUCache.swift +4 -1
- package/ios/Util/NetworkMonitor.swift +43 -26
- package/ios/Util/SFSymbolRenderer.swift +24 -2
- package/ios/Util/SVGProcessor.swift +9 -2
- package/lib/commonjs/AudioBrowser.js +8 -8
- package/lib/commonjs/AudioBrowser.js.map +1 -1
- package/lib/commonjs/CLAUDE.md +52 -0
- package/lib/commonjs/features/browser-config.js +12 -8
- package/lib/commonjs/features/browser-config.js.map +1 -1
- package/lib/commonjs/features/browser.js +11 -3
- package/lib/commonjs/features/browser.js.map +1 -1
- package/lib/commonjs/features/carConnection.js +1 -1
- package/lib/commonjs/features/equalizer.js +1 -1
- package/lib/commonjs/features/errors.js +3 -3
- package/lib/commonjs/features/favorites.js +14 -11
- package/lib/commonjs/features/favorites.js.map +1 -1
- package/lib/commonjs/features/gate.js +16 -1
- package/lib/commonjs/features/gate.js.map +1 -1
- package/lib/commonjs/features/metadata.js +20 -3
- package/lib/commonjs/features/metadata.js.map +1 -1
- package/lib/commonjs/features/network.js +1 -1
- package/lib/commonjs/features/nowPlaying.js +1 -1
- package/lib/commonjs/features/output.js +1 -1
- package/lib/commonjs/features/playback/controls.js +4 -2
- package/lib/commonjs/features/playback/controls.js.map +1 -1
- package/lib/commonjs/features/playback/playWhenReady.js +1 -1
- package/lib/commonjs/features/playback/playing.js +1 -1
- package/lib/commonjs/features/playback/progress.js +3 -2
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/rate.js +8 -1
- package/lib/commonjs/features/playback/rate.js.map +1 -1
- package/lib/commonjs/features/playback/state.js +3 -4
- package/lib/commonjs/features/playback/state.js.map +1 -1
- package/lib/commonjs/features/playback/trackPlaybackTime.js +0 -6
- package/lib/commonjs/features/playback/trackPlaybackTime.js.map +1 -1
- package/lib/commonjs/features/playback/volume.js +1 -1
- package/lib/commonjs/features/player/options.js +48 -34
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +18 -9
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/player/validateOptions.js +23 -0
- package/lib/commonjs/features/player/validateOptions.js.map +1 -0
- package/lib/commonjs/features/queue/activeTrack.js +15 -4
- package/lib/commonjs/features/queue/activeTrack.js.map +1 -1
- package/lib/commonjs/features/queue/queue.js +13 -6
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/features/queue/repeatMode.js +1 -1
- package/lib/commonjs/features/queue/shuffle.js +1 -1
- package/lib/commonjs/features/remoteControls.js +13 -92
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/features/sleepTimer.js +13 -1
- package/lib/commonjs/features/sleepTimer.js.map +1 -1
- package/lib/commonjs/test-utils/reactNativeStub.js +65 -0
- package/lib/commonjs/test-utils/reactNativeStub.js.map +1 -0
- package/lib/commonjs/utils/LazyNativeEmitter.js +28 -14
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/commonjs/utils/NativeUpdatedValue.js +31 -13
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/commonjs/utils/getTrackIdentity.js +24 -0
- package/lib/commonjs/utils/getTrackIdentity.js.map +1 -0
- package/lib/commonjs/utils/useNativeValueRefreshedBy.js +33 -0
- package/lib/commonjs/utils/useNativeValueRefreshedBy.js.map +1 -0
- package/lib/commonjs/web/NativeAudioBrowser.js +200 -75
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/LoadAttempt.js +37 -0
- package/lib/commonjs/web/TrackPlayer/LoadAttempt.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +18 -2
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/Player.js +254 -39
- package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +33 -12
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +175 -100
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
- package/lib/commonjs/web/browser/FavoriteManager.js +30 -21
- package/lib/commonjs/web/browser/FavoriteManager.js.map +1 -1
- package/lib/commonjs/web/browser/SearchManager.js +18 -23
- package/lib/commonjs/web/browser/SearchManager.js.map +1 -1
- package/lib/commonjs/web/browser/assertBrowsePageShape.js +2 -2
- package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +1 -1
- package/lib/commonjs/web/browser/classifyTrackNavigation.js +9 -9
- package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +1 -1
- package/lib/commonjs/web/browser/sections.js +89 -0
- package/lib/commonjs/web/browser/sections.js.map +1 -0
- package/lib/commonjs/web/http/RequestConfigBuilder.js +110 -27
- package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/commonjs/web/http/followMediaRedirect.js +219 -0
- package/lib/commonjs/web/http/followMediaRedirect.js.map +1 -0
- package/lib/commonjs/web/player/NowPlayingManager.js +4 -3
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
- package/lib/commonjs/web/util/BrowserPathHelper.js +56 -11
- package/lib/commonjs/web/util/BrowserPathHelper.js.map +1 -1
- package/lib/module/AudioBrowser.js +2 -1
- package/lib/module/AudioBrowser.js.map +1 -1
- package/lib/module/CLAUDE.md +52 -0
- package/lib/module/features/browser-config.js +12 -8
- package/lib/module/features/browser-config.js.map +1 -1
- package/lib/module/features/browser.js +11 -3
- package/lib/module/features/browser.js.map +1 -1
- package/lib/module/features/carConnection.js +1 -1
- package/lib/module/features/equalizer.js +1 -1
- package/lib/module/features/errors.js +3 -3
- package/lib/module/features/favorites.js +14 -11
- package/lib/module/features/favorites.js.map +1 -1
- package/lib/module/features/gate.js +16 -1
- package/lib/module/features/gate.js.map +1 -1
- package/lib/module/features/metadata.js +20 -3
- package/lib/module/features/metadata.js.map +1 -1
- package/lib/module/features/network.js +1 -1
- package/lib/module/features/nowPlaying.js +1 -1
- package/lib/module/features/output.js +1 -1
- package/lib/module/features/playback/controls.js +4 -2
- package/lib/module/features/playback/controls.js.map +1 -1
- package/lib/module/features/playback/playWhenReady.js +1 -1
- package/lib/module/features/playback/playing.js +1 -1
- package/lib/module/features/playback/progress.js +3 -2
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/rate.js +8 -1
- package/lib/module/features/playback/rate.js.map +1 -1
- package/lib/module/features/playback/state.js +3 -4
- package/lib/module/features/playback/state.js.map +1 -1
- package/lib/module/features/playback/trackPlaybackTime.js +0 -5
- package/lib/module/features/playback/trackPlaybackTime.js.map +1 -1
- package/lib/module/features/playback/volume.js +1 -1
- package/lib/module/features/player/options.js +47 -32
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +17 -8
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/player/validateOptions.js +19 -0
- package/lib/module/features/player/validateOptions.js.map +1 -0
- package/lib/module/features/queue/activeTrack.js +15 -4
- package/lib/module/features/queue/activeTrack.js.map +1 -1
- package/lib/module/features/queue/queue.js +13 -6
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/features/queue/repeatMode.js +1 -1
- package/lib/module/features/queue/shuffle.js +1 -1
- package/lib/module/features/remoteControls.js +13 -92
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/features/sleepTimer.js +13 -1
- package/lib/module/features/sleepTimer.js.map +1 -1
- package/lib/module/test-utils/reactNativeStub.js +58 -0
- package/lib/module/test-utils/reactNativeStub.js.map +1 -0
- package/lib/module/utils/LazyNativeEmitter.js +28 -14
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/module/utils/NativeUpdatedValue.js +31 -13
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/module/utils/getTrackIdentity.js +20 -0
- package/lib/module/utils/getTrackIdentity.js.map +1 -0
- package/lib/module/utils/useNativeValueRefreshedBy.js +29 -0
- package/lib/module/utils/useNativeValueRefreshedBy.js.map +1 -0
- package/lib/module/web/NativeAudioBrowser.js +200 -75
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/TrackPlayer/LoadAttempt.js +32 -0
- package/lib/module/web/TrackPlayer/LoadAttempt.js.map +1 -0
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +18 -2
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +1 -1
- package/lib/module/web/TrackPlayer/Player.js +254 -39
- package/lib/module/web/TrackPlayer/Player.js.map +1 -1
- package/lib/module/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/module/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/module/web/TrackPlayer/QueuePlayer.js +33 -12
- package/lib/module/web/TrackPlayer/QueuePlayer.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +175 -100
- package/lib/module/web/browser/BrowserManager.js.map +1 -1
- package/lib/module/web/browser/FavoriteManager.js +31 -21
- package/lib/module/web/browser/FavoriteManager.js.map +1 -1
- package/lib/module/web/browser/SearchManager.js +18 -23
- package/lib/module/web/browser/SearchManager.js.map +1 -1
- package/lib/module/web/browser/assertBrowsePageShape.js +2 -2
- package/lib/module/web/browser/assertBrowsePageShape.js.map +1 -1
- package/lib/module/web/browser/classifyTrackNavigation.js +9 -9
- package/lib/module/web/browser/classifyTrackNavigation.js.map +1 -1
- package/lib/module/web/browser/sections.js +83 -0
- package/lib/module/web/browser/sections.js.map +1 -0
- package/lib/module/web/http/RequestConfigBuilder.js +110 -27
- package/lib/module/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/module/web/http/followMediaRedirect.js +215 -0
- package/lib/module/web/http/followMediaRedirect.js.map +1 -0
- package/lib/module/web/player/NowPlayingManager.js +4 -3
- package/lib/module/web/player/NowPlayingManager.js.map +1 -1
- package/lib/module/web/util/BrowserPathHelper.js +56 -11
- package/lib/module/web/util/BrowserPathHelper.js.map +1 -1
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/AudioBrowser.d.ts +1 -1
- package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
- package/lib/typescript/src/features/browser-config.d.ts.map +1 -1
- package/lib/typescript/src/features/browser.d.ts +10 -2
- package/lib/typescript/src/features/browser.d.ts.map +1 -1
- package/lib/typescript/src/features/carConnection.d.ts +1 -1
- package/lib/typescript/src/features/equalizer.d.ts +1 -1
- package/lib/typescript/src/features/errors.d.ts +3 -3
- package/lib/typescript/src/features/favorites.d.ts +14 -11
- package/lib/typescript/src/features/favorites.d.ts.map +1 -1
- package/lib/typescript/src/features/gate.d.ts +18 -2
- package/lib/typescript/src/features/gate.d.ts.map +1 -1
- package/lib/typescript/src/features/metadata.d.ts +20 -3
- package/lib/typescript/src/features/metadata.d.ts.map +1 -1
- package/lib/typescript/src/features/network.d.ts +1 -1
- package/lib/typescript/src/features/nowPlaying.d.ts +1 -1
- package/lib/typescript/src/features/output.d.ts +1 -1
- package/lib/typescript/src/features/playback/controls.d.ts +4 -2
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/playWhenReady.d.ts +1 -1
- package/lib/typescript/src/features/playback/playing.d.ts +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/rate.d.ts +8 -1
- package/lib/typescript/src/features/playback/rate.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/state.d.ts +3 -4
- package/lib/typescript/src/features/playback/state.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +1 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/volume.d.ts +1 -1
- package/lib/typescript/src/features/player/options.d.ts +108 -56
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts +14 -4
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/player/validateOptions.d.ts +2 -0
- package/lib/typescript/src/features/player/validateOptions.d.ts.map +1 -0
- package/lib/typescript/src/features/queue/activeTrack.d.ts +9 -2
- package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +7 -4
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/repeatMode.d.ts +1 -1
- package/lib/typescript/src/features/queue/shuffle.d.ts +1 -1
- package/lib/typescript/src/features/remoteControls.d.ts +23 -22
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/features/sleepTimer.d.ts +1 -1
- package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -1
- package/lib/typescript/src/test-utils/reactNativeStub.d.ts +36 -0
- package/lib/typescript/src/test-utils/reactNativeStub.d.ts.map +1 -0
- package/lib/typescript/src/types/browser-native.d.ts +3 -2
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +380 -126
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +82 -57
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +19 -16
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +24 -19
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
- package/lib/typescript/src/utils/getTrackIdentity.d.ts +18 -0
- package/lib/typescript/src/utils/getTrackIdentity.d.ts.map +1 -0
- package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts +21 -0
- package/lib/typescript/src/utils/useNativeValueRefreshedBy.d.ts.map +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +1 -2
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +2 -0
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +10 -10
- package/nitrogen/generated/android/c++/{JFavoritesMatchMode.hpp → JArtworkRendering.hpp} +15 -15
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +8 -3
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +16 -4
- package/nitrogen/generated/android/c++/JCarPlayPlayingIndicatorLocation.hpp +58 -0
- package/nitrogen/generated/android/c++/JCardImage.hpp +58 -0
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +8 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +8 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__string__.hpp +102 -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 +16 -4
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +7 -10
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +15 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +8 -2
- package/nitrogen/generated/android/c++/JGridTile.hpp +61 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +45 -25
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +1 -1
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JImageShape.hpp +58 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +8 -3
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +36 -11
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +14 -2
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +15 -12
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +7 -10
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +10 -10
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JOptions.hpp +7 -10
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +8 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
- package/nitrogen/generated/android/c++/{JNotificationButton.hpp → JRemoteButton.hpp} +19 -19
- package/nitrogen/generated/android/c++/JRemoteButtonLayout.hpp +86 -0
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +57 -49
- package/nitrogen/generated/android/c++/JSection.hpp +116 -0
- package/nitrogen/generated/android/c++/JSectionStyle.hpp +96 -0
- package/nitrogen/generated/android/c++/JStyleDisplay.hpp +58 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +25 -46
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +8 -2
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +46 -18
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.hpp +75 -0
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +16 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoritesMatchMode.kt → ArtworkRendering.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayPlayingIndicatorLocation.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CardImage.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__string__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/GridTile.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageShape.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +8 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NotificationButton.kt → RemoteButton.kt} +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButtonLayout.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +12 -15
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → Section.kt} +15 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SectionStyle.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StyleDisplay.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +6 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +35 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Variant_NullType_NotificationButtonLayout.kt → Variant_NullType_RemoteButtonLayout.kt} +9 -9
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +9 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +244 -133
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +31 -16
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +33 -18
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +12 -12
- package/nitrogen/generated/ios/swift/ArtworkRendering.swift +40 -0
- package/nitrogen/generated/ios/swift/CarPlayPlayingIndicatorLocation.swift +40 -0
- package/nitrogen/generated/ios/swift/CardImage.swift +40 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__string__.swift +54 -0
- package/nitrogen/generated/ios/swift/GridTile.swift +44 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +2 -2
- package/nitrogen/generated/ios/swift/IOSOptions.swift +7 -2
- package/nitrogen/generated/ios/swift/ImageShape.swift +40 -0
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +52 -5
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +12 -12
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +12 -1
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
- package/nitrogen/generated/ios/swift/{NotificationButton.swift → RemoteButton.swift} +6 -6
- package/nitrogen/generated/ios/swift/RemoteButtonLayout.swift +57 -0
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +62 -73
- package/nitrogen/generated/ios/swift/Section.swift +82 -0
- package/nitrogen/generated/ios/swift/SectionStyle.swift +133 -0
- package/nitrogen/generated/ios/swift/StyleDisplay.swift +40 -0
- package/nitrogen/generated/ios/swift/Track.swift +28 -63
- package/nitrogen/generated/ios/swift/TrackStyle.swift +86 -22
- package/nitrogen/generated/ios/swift/{Variant_NullType_NotificationButtonLayout.swift → Variant_NullType_RemoteButtonLayout.swift} +3 -3
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +8 -8
- package/nitrogen/generated/shared/c++/{FavoritesMatchMode.hpp → ArtworkRendering.hpp} +17 -17
- package/nitrogen/generated/shared/c++/CarPlayPlayingIndicatorLocation.hpp +76 -0
- package/nitrogen/generated/shared/c++/CardImage.hpp +76 -0
- package/nitrogen/generated/shared/c++/GridTile.hpp +80 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +1 -1
- package/nitrogen/generated/shared/c++/IOSOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/ImageShape.hpp +76 -0
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +10 -6
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +8 -8
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
- package/nitrogen/generated/shared/c++/{NotificationButton.hpp → RemoteButton.hpp} +19 -19
- package/nitrogen/generated/shared/c++/RemoteButtonLayout.hpp +94 -0
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +33 -37
- package/nitrogen/generated/shared/c++/Section.hpp +102 -0
- package/nitrogen/generated/shared/c++/SectionStyle.hpp +126 -0
- package/nitrogen/generated/shared/c++/StyleDisplay.hpp +76 -0
- package/nitrogen/generated/shared/c++/Track.hpp +18 -30
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +73 -34
- package/package.json +24 -11
- package/src/AudioBrowser.ts +2 -1
- package/src/CLAUDE.md +52 -0
- package/src/features/battery.test.ts +79 -0
- package/src/features/browser-config.test.ts +21 -6
- package/src/features/browser-config.ts +12 -8
- package/src/features/browser.test.ts +1 -1
- package/src/features/browser.ts +11 -3
- package/src/features/carConnection.ts +1 -1
- package/src/features/equalizer.ts +1 -1
- package/src/features/errors.ts +3 -3
- package/src/features/favorites.ts +14 -11
- package/src/features/gate.ts +16 -1
- package/src/features/hook-wiring.test.ts +302 -0
- package/src/features/metadata.ts +20 -3
- package/src/features/network.ts +1 -1
- package/src/features/nowPlaying.ts +1 -1
- package/src/features/output.ts +1 -1
- package/src/features/playback/controls.ts +4 -2
- package/src/features/playback/playWhenReady.ts +1 -1
- package/src/features/playback/playing.ts +1 -1
- package/src/features/playback/progress.test.ts +169 -0
- package/src/features/playback/progress.ts +3 -2
- package/src/features/playback/rate.ts +8 -1
- package/src/features/playback/state.ts +3 -4
- package/src/features/playback/trackPlaybackTime.test.ts +16 -6
- package/src/features/playback/trackPlaybackTime.ts +1 -6
- package/src/features/playback/volume.ts +1 -1
- package/src/features/player/options.ts +126 -76
- package/src/features/player/setup.test.ts +24 -7
- package/src/features/player/setup.ts +22 -10
- package/src/features/player/validateOptions.ts +21 -0
- package/src/features/queue/activeTrack.ts +15 -4
- package/src/features/queue/queue.ts +13 -6
- package/src/features/queue/repeatMode.ts +1 -1
- package/src/features/queue/shuffle.ts +1 -1
- package/src/features/remoteControls.ts +13 -92
- package/src/features/sleepTimer.test.ts +172 -0
- package/src/features/sleepTimer.ts +9 -1
- package/src/nitro-stub-drift.test.ts +277 -0
- package/src/public-surface.test.ts +147 -0
- package/src/specs/audio-browser.nitro.ts +5 -4
- package/src/style-resolution.test.ts +210 -0
- package/src/test-utils/reactNativeStub.ts +60 -0
- package/src/types/browser-native.ts +7 -3
- package/src/types/browser-nodes.ts +396 -134
- package/src/types/browser.ts +85 -59
- package/src/utils/LazyNativeEmitter.ts +28 -15
- package/src/utils/NativeUpdatedValue.ts +29 -13
- package/src/utils/getTrackIdentity.ts +20 -0
- package/src/utils/useDebug.test.ts +182 -0
- package/src/utils/useNativeUpdatedValue.test.ts +103 -0
- package/src/utils/useNativeValueRefreshedBy.ts +38 -0
- package/src/web/NativeAudioBrowser.playWhenReady.test.ts +232 -2
- package/src/web/NativeAudioBrowser.ts +239 -82
- package/src/web/TrackPlayer/LoadAttempt.ts +29 -0
- package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +60 -13
- package/src/web/TrackPlayer/PlaybackStateMachine.ts +22 -6
- package/src/web/TrackPlayer/Player.dispatch.test.ts +5 -3
- package/src/web/TrackPlayer/Player.load.test.ts +137 -1
- package/src/web/TrackPlayer/Player.ts +284 -37
- package/src/web/TrackPlayer/QueueManager.test.ts +29 -0
- package/src/web/TrackPlayer/QueueManager.ts +14 -0
- package/src/web/TrackPlayer/QueuePlayer.ts +33 -14
- package/src/web/__tests__/lifecycle.test.ts +345 -0
- package/src/web/__tests__/lifecycleHarness.ts +351 -0
- package/src/web/__tests__/loadEdgeCases.test.ts +246 -0
- package/src/web/__tests__/loadSupersession.test.ts +175 -0
- package/src/web/__tests__/retry.test.ts +169 -0
- package/src/web/browser/BrowserManager.ts +209 -111
- package/src/web/browser/FavoriteManager.test.ts +84 -0
- package/src/web/browser/FavoriteManager.ts +28 -23
- package/src/web/browser/SearchManager.test.ts +75 -0
- package/src/web/browser/SearchManager.ts +25 -28
- package/src/web/browser/__tests__/artwork-resolution.test.ts +117 -0
- package/src/web/browser/__tests__/layer-resolver.test.ts +35 -0
- package/src/web/browser/__tests__/search-artwork.test.ts +46 -0
- package/src/web/browser/__tests__/search-navigation.test.ts +76 -0
- package/src/web/browser/assertBrowsePageShape.test.ts +1 -1
- package/src/web/browser/assertBrowsePageShape.ts +5 -3
- package/src/web/browser/classifyTrackNavigation.test.ts +10 -8
- package/src/web/browser/classifyTrackNavigation.ts +9 -9
- package/src/web/browser/parseSearchResponse.test.ts +8 -2
- package/src/web/browser/sections.test.ts +91 -0
- package/src/web/browser/sections.ts +72 -0
- package/src/web/http/RequestConfigBuilder.test.ts +241 -1
- package/src/web/http/RequestConfigBuilder.ts +140 -33
- package/src/web/http/followMediaRedirect.test.ts +289 -0
- package/src/web/http/followMediaRedirect.ts +253 -0
- package/src/web/player/NowPlayingManager.ts +4 -3
- package/src/web/util/BrowserPathHelper.test.ts +52 -0
- package/src/web/util/BrowserPathHelper.ts +61 -13
- package/website/guide/android-auto.md +114 -0
- package/website/guide/android-certificates.md +409 -0
- package/website/guide/artwork.md +255 -0
- package/website/guide/audio-output.md +135 -0
- package/website/guide/automotive.md +86 -0
- package/website/guide/basic-usage.md +151 -0
- package/website/guide/battery.md +115 -0
- package/website/guide/browser.md +581 -0
- package/website/guide/carplay.md +620 -0
- package/website/guide/configuration.md +173 -0
- package/website/guide/equalizer.md +231 -0
- package/website/guide/errors.md +310 -0
- package/website/guide/favorites.md +154 -0
- package/website/guide/gate.md +143 -0
- package/website/guide/getting-started.md +46 -0
- package/website/guide/hooks.md +238 -0
- package/website/guide/live-streams.md +125 -0
- package/website/guide/metadata.md +239 -0
- package/website/guide/migrating-from-track-player.md +244 -0
- package/website/guide/native-callback-fetch.md +127 -0
- package/website/guide/network.md +86 -0
- package/website/guide/now-playing.md +175 -0
- package/website/guide/playback.md +328 -0
- package/website/guide/queue.md +300 -0
- package/website/guide/remote-controls.md +256 -0
- package/website/guide/search.md +255 -0
- package/website/guide/sleep-timer.md +268 -0
- package/website/guide/track.md +247 -0
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
- package/ios/Model/MediaURL.swift +0 -67
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +0 -105
- package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +0 -94
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +0 -71
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +0 -75
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +0 -68
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
- package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
- package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +0 -195
- package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +0 -92
- package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
- package/nitrogen/generated/shared/c++/FavoriteConfig.hpp +0 -84
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +0 -129
- package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +0 -102
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.followMediaRedirect = followMediaRedirect;
|
|
7
|
+
/**
|
|
8
|
+
* Resolves a media URL that is authenticated by a header.
|
|
9
|
+
*
|
|
10
|
+
* Shaka only routes manifest requests through its networking engine, where a
|
|
11
|
+
* request filter can attach headers. A progressive file is played by assigning
|
|
12
|
+
* `mediaElement.src`, and a media element cannot send custom headers — so such
|
|
13
|
+
* a URL is unplayable that way. Following the redirect here yields the signed,
|
|
14
|
+
* public URL these endpoints hand back, which needs no auth of its own.
|
|
15
|
+
*
|
|
16
|
+
* Best effort and bounded: anything that fails — including taking too long, see
|
|
17
|
+
* {@link PROBE_TIMEOUT_MS} — falls back to the original URL, so the load fails
|
|
18
|
+
* or succeeds on its own terms rather than ours. It must never be the reason a
|
|
19
|
+
* load hangs: `load()` awaits this before Shaka sees the URL at all.
|
|
20
|
+
*
|
|
21
|
+
* Gated, because the probe is not free: a HEAD at a third-party stream host
|
|
22
|
+
* costs a CORS preflight, and most will refuse it, so an app that never
|
|
23
|
+
* authenticates its media would pay a round trip on every play for a result it
|
|
24
|
+
* always discards. It runs only for headers that look like media credentials
|
|
25
|
+
* ({@link isMediaAuth}), on media a media element actually has to play
|
|
26
|
+
* ({@link isManifestUrl}), and never on a URL the browser resolves locally.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/** URLs the browser resolves locally; there is no redirect to follow. */
|
|
30
|
+
const isLocalUrl = url => /^(file|blob|data|mediasource):/i.test(url);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Extensions Shaka types as a manifest, from its own `EXTENSIONS_TO_MIME_TYPES_`
|
|
34
|
+
* map: HLS, DASH and Smooth Streaming.
|
|
35
|
+
*/
|
|
36
|
+
const MANIFEST_EXTENSIONS = new Set(['m3u8', 'mpd', 'ism']);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Whether Shaka will parse this as a manifest rather than hand it to the media
|
|
40
|
+
* element — in which case the probe has nothing to offer and something to cost.
|
|
41
|
+
*
|
|
42
|
+
* A manifest goes through Shaka's networking engine, where the request filter
|
|
43
|
+
* attaches the headers to the manifest, its segments and any key requests. The
|
|
44
|
+
* probe cannot improve on that, and it actively breaks it: on a cross-origin
|
|
45
|
+
* redirect the probe clears the headers, so the segments that Android still
|
|
46
|
+
* authenticates would go out bare and 401. So this is a correctness fix as much
|
|
47
|
+
* as it is one fewer round trip.
|
|
48
|
+
*
|
|
49
|
+
* Extension-based, and therefore partial — Shaka guesses the same way
|
|
50
|
+
* (`NetworkingUtils.getExtension`), but plenty of HLS endpoints have no
|
|
51
|
+
* extension at all. Those still get probed, which is the status quo rather than
|
|
52
|
+
* a regression. Nothing on `Track` carries a MIME type to do better with.
|
|
53
|
+
*/
|
|
54
|
+
const isManifestUrl = url => {
|
|
55
|
+
const path = url.split(/[?#]/)[0] ?? '';
|
|
56
|
+
const filename = path.slice(path.lastIndexOf('/') + 1);
|
|
57
|
+
const pieces = filename.split('.');
|
|
58
|
+
return pieces.length > 1 && MANIFEST_EXTENSIONS.has(pieces[pieces.length - 1].toLowerCase());
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* How long the probe may take before the original URL is played instead.
|
|
62
|
+
*
|
|
63
|
+
* The same 8s the Android media client allows a connect or a read
|
|
64
|
+
* (`MediaFactory.mediaHttpClient`), which is generous for a HEAD but errs the
|
|
65
|
+
* safe way: a slow-but-working auth endpoint should not be abandoned, since
|
|
66
|
+
* giving up means playing a URL that will 401.
|
|
67
|
+
*/
|
|
68
|
+
const PROBE_TIMEOUT_MS = 8_000;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* `AbortSignal.timeout` where it exists (Safari 16+, Chrome 103+, Node 17.3+),
|
|
72
|
+
* else a hand-rolled equivalent, else nothing — an environment with neither
|
|
73
|
+
* still gets the deadline below, just without cancelling the request.
|
|
74
|
+
*/
|
|
75
|
+
const timeoutSignal = ms => {
|
|
76
|
+
if (typeof AbortSignal === 'undefined') return undefined;
|
|
77
|
+
if (typeof AbortSignal.timeout === 'function') return AbortSignal.timeout(ms);
|
|
78
|
+
if (typeof AbortController === 'undefined') return undefined;
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
setTimeout(() => controller.abort(), ms);
|
|
81
|
+
return controller.signal;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The probe, with a deadline. `load()` awaits this before Shaka is asked to
|
|
86
|
+
* play anything, so an unreachable host would otherwise stall the load
|
|
87
|
+
* indefinitely — no audio, and no error to show for it.
|
|
88
|
+
*
|
|
89
|
+
* Two mechanisms, each with its own job: the signal cancels the request, so a
|
|
90
|
+
* dead host does not hold a connection open behind us, and the race bounds *us*
|
|
91
|
+
* even where the fetch implementation ignores the signal. Whichever fires, the
|
|
92
|
+
* caller treats it as any other probe failure and plays the original URL.
|
|
93
|
+
*/
|
|
94
|
+
const fetchWithDeadline = async (doFetch, url, headers, timeoutMs) => {
|
|
95
|
+
let timer;
|
|
96
|
+
try {
|
|
97
|
+
return await Promise.race([doFetch(url, {
|
|
98
|
+
method: 'HEAD',
|
|
99
|
+
headers,
|
|
100
|
+
redirect: 'follow',
|
|
101
|
+
signal: timeoutSignal(timeoutMs)
|
|
102
|
+
}), new Promise((_resolve, reject) => {
|
|
103
|
+
timer = setTimeout(() => reject(new Error(`Media redirect probe timed out (${timeoutMs}ms)`)), timeoutMs);
|
|
104
|
+
})]);
|
|
105
|
+
} finally {
|
|
106
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Whether these headers look like a media credential — the only thing the
|
|
112
|
+
* probe can fix, and the only thing worth a preflight.
|
|
113
|
+
*
|
|
114
|
+
* A header the `media` layer set is media-specific by construction. Otherwise
|
|
115
|
+
* only `Authorization` counts: an app authenticating one API for browse and
|
|
116
|
+
* media alike puts it on the shared `request` layer, and that is the common
|
|
117
|
+
* shape. Shared plumbing that also rides browse requests — an `X-Client-Version`
|
|
118
|
+
* — is not a credential and must not trigger the probe.
|
|
119
|
+
*
|
|
120
|
+
* The residual case is a shared layer carrying a custom auth header, say
|
|
121
|
+
* `X-Api-Key`, for media that needs it: move it to the `media` layer and the
|
|
122
|
+
* probe runs.
|
|
123
|
+
*/
|
|
124
|
+
const isMediaAuth = (headers, mediaLayerHeaders) => mediaLayerHeaders || Object.keys(headers).some(key => key.toLowerCase() === 'authorization');
|
|
125
|
+
/**
|
|
126
|
+
* Origin of an http(s) URL, or undefined when it cannot be determined.
|
|
127
|
+
*
|
|
128
|
+
* Relative URLs are resolved against the document, because that is what the
|
|
129
|
+
* probe's own `fetch` does — a `src` of `/api/authed/7` is a request to the
|
|
130
|
+
* page's origin, so the credential went there. Without this a relative `src`
|
|
131
|
+
* has no origin, never matches the absolute URL the response reports, and the
|
|
132
|
+
* headers are dropped from every load that uses one.
|
|
133
|
+
*
|
|
134
|
+
* Parsed rather than pattern-matched so the comparison normalizes the way
|
|
135
|
+
* Android's `CrossOriginHeaderStripper.sameOrigin` does: `URL.host` omits a
|
|
136
|
+
* default port, so `https://a.com` and `https://a.com:443` are one origin, and
|
|
137
|
+
* it excludes userinfo, so `https://user@a.com` is not a third.
|
|
138
|
+
*/
|
|
139
|
+
const originOf = url => {
|
|
140
|
+
try {
|
|
141
|
+
const base = typeof location === 'undefined' ? undefined : location.href;
|
|
142
|
+
const {
|
|
143
|
+
protocol,
|
|
144
|
+
host
|
|
145
|
+
} = new URL(url, base);
|
|
146
|
+
if (protocol !== 'http:' && protocol !== 'https:') return undefined;
|
|
147
|
+
return `${protocol}//${host}`;
|
|
148
|
+
} catch {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Whether the redirect left the origin the credential was addressed to.
|
|
155
|
+
*
|
|
156
|
+
* Only when both origins are known and differ. An origin we could not work out
|
|
157
|
+
* — a relative URL with no document base, outside a browser — is not evidence
|
|
158
|
+
* of a hop, and treating it as one is how the headers went missing before.
|
|
159
|
+
*/
|
|
160
|
+
const leftTheOrigin = (from, to) => {
|
|
161
|
+
const origin = originOf(from);
|
|
162
|
+
return origin !== undefined && originOf(to) !== origin;
|
|
163
|
+
};
|
|
164
|
+
async function followMediaRedirect(url, headers, {
|
|
165
|
+
fetchImpl,
|
|
166
|
+
mediaLayerHeaders = false,
|
|
167
|
+
timeoutMs = PROBE_TIMEOUT_MS
|
|
168
|
+
} = {}) {
|
|
169
|
+
if (!headers || Object.keys(headers).length === 0) return {
|
|
170
|
+
src: url,
|
|
171
|
+
headers
|
|
172
|
+
};
|
|
173
|
+
if (!isMediaAuth(headers, mediaLayerHeaders)) return {
|
|
174
|
+
src: url,
|
|
175
|
+
headers
|
|
176
|
+
};
|
|
177
|
+
if (isManifestUrl(url)) return {
|
|
178
|
+
src: url,
|
|
179
|
+
headers
|
|
180
|
+
};
|
|
181
|
+
if (isLocalUrl(url)) return {
|
|
182
|
+
src: url,
|
|
183
|
+
headers
|
|
184
|
+
};
|
|
185
|
+
const doFetch = fetchImpl ?? globalThis.fetch;
|
|
186
|
+
if (typeof doFetch !== 'function') return {
|
|
187
|
+
src: url,
|
|
188
|
+
headers
|
|
189
|
+
};
|
|
190
|
+
try {
|
|
191
|
+
// HEAD walks the chain without tripping download counting, which keys off
|
|
192
|
+
// ranged GETs. Deadlined, because the load waits on it.
|
|
193
|
+
const response = await fetchWithDeadline(doFetch, url, headers, timeoutMs);
|
|
194
|
+
const src = response.url || url;
|
|
195
|
+
|
|
196
|
+
// The status belongs to the *last* hop, so it only speaks for the
|
|
197
|
+
// authenticating endpoint when there was no redirect. Once one has
|
|
198
|
+
// happened, hop one authenticated and handed us its target, and a refusal
|
|
199
|
+
// past that is routinely about the method rather than the credential:
|
|
200
|
+
// presigned S3 and GCS URLs sign it — SigV4's canonical request opens with
|
|
201
|
+
// HTTPMethod, GCS V4's with HTTP_VERB — so a URL signed for GET answers a
|
|
202
|
+
// HEAD with 403. Keep the signed URL, which is the whole point of the walk,
|
|
203
|
+
// and let a real error surface through the player.
|
|
204
|
+
if (!response.ok && src === url) return {
|
|
205
|
+
src: url,
|
|
206
|
+
headers
|
|
207
|
+
};
|
|
208
|
+
return {
|
|
209
|
+
src,
|
|
210
|
+
headers: leftTheOrigin(url, src) ? undefined : headers
|
|
211
|
+
};
|
|
212
|
+
} catch {
|
|
213
|
+
return {
|
|
214
|
+
src: url,
|
|
215
|
+
headers
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=followMediaRedirect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isLocalUrl","url","test","MANIFEST_EXTENSIONS","Set","isManifestUrl","path","split","filename","slice","lastIndexOf","pieces","length","has","toLowerCase","PROBE_TIMEOUT_MS","timeoutSignal","ms","AbortSignal","undefined","timeout","AbortController","controller","setTimeout","abort","signal","fetchWithDeadline","doFetch","headers","timeoutMs","timer","Promise","race","method","redirect","_resolve","reject","Error","clearTimeout","isMediaAuth","mediaLayerHeaders","Object","keys","some","key","originOf","base","location","href","protocol","host","URL","leftTheOrigin","from","to","origin","followMediaRedirect","fetchImpl","src","globalThis","fetch","response","ok"],"sourceRoot":"../../../../src","sources":["web/http/followMediaRedirect.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.NowPlayingManager = void 0;
|
|
7
7
|
var _artwork = require("../../utils/artwork");
|
|
8
|
+
var _getTrackIdentity = require("../../utils/getTrackIdentity");
|
|
8
9
|
/**
|
|
9
10
|
* Manages now playing metadata overrides.
|
|
10
11
|
* Allows temporary metadata changes for the currently playing track
|
|
@@ -31,7 +32,7 @@ class NowPlayingManager {
|
|
|
31
32
|
album: update.album ?? currentTrack.album,
|
|
32
33
|
artwork: (0, _artwork.artworkUrl)(currentTrack.artwork),
|
|
33
34
|
description: currentTrack.description,
|
|
34
|
-
mediaId: currentTrack
|
|
35
|
+
mediaId: (0, _getTrackIdentity.getTrackIdentity)(currentTrack) ?? currentTrack.path,
|
|
35
36
|
genre: currentTrack.genre,
|
|
36
37
|
duration
|
|
37
38
|
} : {
|
|
@@ -40,7 +41,7 @@ class NowPlayingManager {
|
|
|
40
41
|
album: currentTrack.album,
|
|
41
42
|
artwork: (0, _artwork.artworkUrl)(currentTrack.artwork),
|
|
42
43
|
description: currentTrack.description,
|
|
43
|
-
mediaId: currentTrack
|
|
44
|
+
mediaId: (0, _getTrackIdentity.getTrackIdentity)(currentTrack) ?? currentTrack.path,
|
|
44
45
|
genre: currentTrack.genre,
|
|
45
46
|
duration
|
|
46
47
|
};
|
|
@@ -62,7 +63,7 @@ class NowPlayingManager {
|
|
|
62
63
|
album: this.override?.album ?? currentTrack.album,
|
|
63
64
|
artwork: (0, _artwork.artworkUrl)(currentTrack.artwork),
|
|
64
65
|
description: currentTrack.description,
|
|
65
|
-
mediaId: currentTrack
|
|
66
|
+
mediaId: (0, _getTrackIdentity.getTrackIdentity)(currentTrack) ?? currentTrack.path,
|
|
66
67
|
genre: currentTrack.genre,
|
|
67
68
|
duration
|
|
68
69
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_artwork","require","NowPlayingManager","onNowPlayingChanged","updateNowPlaying","update","currentTrack","duration","override","metadata","title","artist","album","artwork","artworkUrl","description","mediaId","
|
|
1
|
+
{"version":3,"names":["_artwork","require","_getTrackIdentity","NowPlayingManager","onNowPlayingChanged","updateNowPlaying","update","currentTrack","duration","override","metadata","title","artist","album","artwork","artworkUrl","description","mediaId","getTrackIdentity","path","genre","getNowPlaying","undefined","clearNowPlayingOverride","exports"],"sourceRoot":"../../../../src","sources":["web/player/NowPlayingManager.ts"],"mappings":";;;;;;AAEA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,MAAME,iBAAiB,CAAC;EAG7B;EACAC,mBAAmB,GAA2CA,CAAA,KAAM,CAAC,CAAC;;EAEtE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,gBAAgBA,CACdC,MAAoC,EACpCC,YAA+B,EAC/BC,QAAgB,EACV;IACN,IAAI,CAACC,QAAQ,GAAGH,MAAM;IAEtB,IAAI,CAACC,YAAY,EAAE;IAEnB,MAAMG,QAA4B,GAAGJ,MAAM,GACvC;MACEK,KAAK,EAAEL,MAAM,CAACK,KAAK,IAAIJ,YAAY,CAACI,KAAK;MACzCC,MAAM,EAAEN,MAAM,CAACM,MAAM,IAAIL,YAAY,CAACK,MAAM;MAC5CC,KAAK,EAAEP,MAAM,CAACO,KAAK,IAAIN,YAAY,CAACM,KAAK;MACzCC,OAAO,EAAE,IAAAC,mBAAU,EAACR,YAAY,CAACO,OAAO,CAAC;MACzCE,WAAW,EAAET,YAAY,CAACS,WAAW;MACrCC,OAAO,EAAE,IAAAC,kCAAgB,EAACX,YAAY,CAAC,IAAIA,YAAY,CAACY,IAAI;MAC5DC,KAAK,EAAEb,YAAY,CAACa,KAAK;MACzBZ;IACF,CAAC,GACD;MACEG,KAAK,EAAEJ,YAAY,CAACI,KAAK;MACzBC,MAAM,EAAEL,YAAY,CAACK,MAAM;MAC3BC,KAAK,EAAEN,YAAY,CAACM,KAAK;MACzBC,OAAO,EAAE,IAAAC,mBAAU,EAACR,YAAY,CAACO,OAAO,CAAC;MACzCE,WAAW,EAAET,YAAY,CAACS,WAAW;MACrCC,OAAO,EAAE,IAAAC,kCAAgB,EAACX,YAAY,CAAC,IAAIA,YAAY,CAACY,IAAI;MAC5DC,KAAK,EAAEb,YAAY,CAACa,KAAK;MACzBZ;IACF,CAAC;IAEL,IAAI,CAACJ,mBAAmB,CAACM,QAAQ,CAAC;EACpC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEW,aAAaA,CACXd,YAA+B,EAC/BC,QAAgB,EACgB;IAChC,IAAI,CAACD,YAAY,EAAE,OAAOe,SAAS;IAEnC,OAAO;MACLX,KAAK,EAAE,IAAI,CAACF,QAAQ,EAAEE,KAAK,IAAIJ,YAAY,CAACI,KAAK;MACjDC,MAAM,EAAE,IAAI,CAACH,QAAQ,EAAEG,MAAM,IAAIL,YAAY,CAACK,MAAM;MACpDC,KAAK,EAAE,IAAI,CAACJ,QAAQ,EAAEI,KAAK,IAAIN,YAAY,CAACM,KAAK;MACjDC,OAAO,EAAE,IAAAC,mBAAU,EAACR,YAAY,CAACO,OAAO,CAAC;MACzCE,WAAW,EAAET,YAAY,CAACS,WAAW;MACrCC,OAAO,EAAE,IAAAC,kCAAgB,EAACX,YAAY,CAAC,IAAIA,YAAY,CAACY,IAAI;MAC5DC,KAAK,EAAEb,YAAY,CAACa,KAAK;MACzBZ;IACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACEe,uBAAuBA,CAAA,EAAS;IAC9B,IAAI,CAACd,QAAQ,GAAGa,SAAS;EAC3B;AACF;AAACE,OAAA,CAAArB,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
|
@@ -12,8 +12,12 @@ exports.BrowserPathHelper = void 0;
|
|
|
12
12
|
* 1. System paths (prefixed with `/__`): Root, recent, and search paths
|
|
13
13
|
* 2. Contextual URLs: Embed parent context in track identifiers for Media3 integration
|
|
14
14
|
*
|
|
15
|
-
* Contextual URL format: `{parentPath}?__trackId={
|
|
16
|
-
* Example: "/library/radio?__trackId=song.mp3"
|
|
15
|
+
* Contextual URL format: `{parentPath}?__trackId={trackIdentity}&__index={childIndex}`
|
|
16
|
+
* Example: "/library/radio?__trackId=song.mp3&__index=2"
|
|
17
|
+
*
|
|
18
|
+
* `__trackId` is the identity check; `__index` (the child's position on the
|
|
19
|
+
* page at stamp time) is only a tie-breaker between surfaces that carry the
|
|
20
|
+
* same identity — a stale index never selects a different track.
|
|
17
21
|
*
|
|
18
22
|
* This allows:
|
|
19
23
|
* - Media3 to reference playable-only tracks (tracks with `src` but no `url`)
|
|
@@ -25,6 +29,8 @@ const BrowserPathHelper = exports.BrowserPathHelper = {
|
|
|
25
29
|
SEARCH_PATH_PREFIX: '/__search',
|
|
26
30
|
/** Query parameter name for contextual track identifiers */
|
|
27
31
|
CONTEXTUAL_TRACK_PARAM: '__trackId',
|
|
32
|
+
/** Query parameter name for the tapped child's page position (tie-breaker) */
|
|
33
|
+
CONTEXTUAL_INDEX_PARAM: '__index',
|
|
28
34
|
/**
|
|
29
35
|
* Create a search path for a given query
|
|
30
36
|
*/
|
|
@@ -42,13 +48,13 @@ const BrowserPathHelper = exports.BrowserPathHelper = {
|
|
|
42
48
|
return path.includes(`?${this.CONTEXTUAL_TRACK_PARAM}=`) || path.includes(`&${this.CONTEXTUAL_TRACK_PARAM}=`);
|
|
43
49
|
},
|
|
44
50
|
/**
|
|
45
|
-
* Strips the __trackId
|
|
46
|
-
* If the URL is not contextual, returns it unchanged.
|
|
51
|
+
* Strips the contextual parameters (__trackId and __index) from a contextual
|
|
52
|
+
* URL to get the parent path. If the URL is not contextual, returns it unchanged.
|
|
47
53
|
*
|
|
48
54
|
* @param url The URL to process
|
|
49
|
-
* @returns The URL without the
|
|
55
|
+
* @returns The URL without the contextual parameters
|
|
50
56
|
*
|
|
51
|
-
* Example: "/library/radio?__trackId=song.mp3" → "/library/radio"
|
|
57
|
+
* Example: "/library/radio?__trackId=song.mp3&__index=2" → "/library/radio"
|
|
52
58
|
* Example: "/search?q=jazz&__trackId=song.mp3" → "/search?q=jazz"
|
|
53
59
|
*/
|
|
54
60
|
stripTrackId(url) {
|
|
@@ -60,8 +66,9 @@ const BrowserPathHelper = exports.BrowserPathHelper = {
|
|
|
60
66
|
const isFullUrl = url.startsWith('http://') || url.startsWith('https://');
|
|
61
67
|
const urlObj = new URL(url, isFullUrl ? undefined : 'http://placeholder');
|
|
62
68
|
|
|
63
|
-
// Remove the
|
|
69
|
+
// Remove the contextual parameters
|
|
64
70
|
urlObj.searchParams.delete(this.CONTEXTUAL_TRACK_PARAM);
|
|
71
|
+
urlObj.searchParams.delete(this.CONTEXTUAL_INDEX_PARAM);
|
|
65
72
|
|
|
66
73
|
// Return the appropriate format
|
|
67
74
|
if (isFullUrl) {
|
|
@@ -72,7 +79,7 @@ const BrowserPathHelper = exports.BrowserPathHelper = {
|
|
|
72
79
|
}
|
|
73
80
|
} catch {
|
|
74
81
|
// Fallback: simple string manipulation
|
|
75
|
-
const paramPattern = new RegExp(`[?&]
|
|
82
|
+
const paramPattern = new RegExp(`[?&](?:${this.CONTEXTUAL_TRACK_PARAM}|${this.CONTEXTUAL_INDEX_PARAM})=[^&]*`, 'g');
|
|
76
83
|
let result = url.replace(paramPattern, '');
|
|
77
84
|
// Clean up any trailing ? or &
|
|
78
85
|
result = result.replace(/[?&]$/, '');
|
|
@@ -81,6 +88,22 @@ const BrowserPathHelper = exports.BrowserPathHelper = {
|
|
|
81
88
|
return result;
|
|
82
89
|
}
|
|
83
90
|
},
|
|
91
|
+
/**
|
|
92
|
+
* Builds a contextual URL by appending a track identifier — and optionally
|
|
93
|
+
* the tapped child's page position — to a parent path.
|
|
94
|
+
*
|
|
95
|
+
* @param parentPath The parent container path
|
|
96
|
+
* @param trackId The track identity (`id` when non-blank, else `src`)
|
|
97
|
+
* @param index The child's position on the page at stamp time (tie-breaker)
|
|
98
|
+
* @returns A contextual URL combining parent path, track ID, and index
|
|
99
|
+
*
|
|
100
|
+
* Example: build("/library", "song.mp3", 2) → "/library?__trackId=song.mp3&__index=2"
|
|
101
|
+
*/
|
|
102
|
+
build(parentPath, trackId, index) {
|
|
103
|
+
const separator = parentPath.includes('?') ? '&' : '?';
|
|
104
|
+
const indexParam = index === undefined ? '' : `&${this.CONTEXTUAL_INDEX_PARAM}=${index}`;
|
|
105
|
+
return `${parentPath}${separator}${this.CONTEXTUAL_TRACK_PARAM}=${encodeURIComponent(trackId)}${indexParam}`;
|
|
106
|
+
},
|
|
84
107
|
/**
|
|
85
108
|
* Extracts the track ID from a contextual URL.
|
|
86
109
|
* Returns undefined if the URL is not contextual or doesn't contain the track ID parameter.
|
|
@@ -94,14 +117,36 @@ const BrowserPathHelper = exports.BrowserPathHelper = {
|
|
|
94
117
|
if (!this.isContextual(path)) {
|
|
95
118
|
return undefined;
|
|
96
119
|
}
|
|
120
|
+
return this.extractParam(path, this.CONTEXTUAL_TRACK_PARAM);
|
|
121
|
+
},
|
|
122
|
+
/**
|
|
123
|
+
* Extracts the stamped page index from a contextual URL, or undefined when
|
|
124
|
+
* the URL is not contextual or carries no (valid, non-negative) index.
|
|
125
|
+
*
|
|
126
|
+
* Example: "/library/radio?__trackId=song.mp3&__index=2" → 2
|
|
127
|
+
*/
|
|
128
|
+
extractIndex(path) {
|
|
129
|
+
if (!this.isContextual(path)) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
const raw = this.extractParam(path, this.CONTEXTUAL_INDEX_PARAM);
|
|
133
|
+
if (raw === undefined || !/^\d+$/.test(raw)) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
return Number.parseInt(raw, 10);
|
|
137
|
+
},
|
|
138
|
+
/**
|
|
139
|
+
* Extracts a single query parameter, handling both full URLs and paths,
|
|
140
|
+
* with a regex fallback for input the URL parser rejects.
|
|
141
|
+
*/
|
|
142
|
+
extractParam(path, param) {
|
|
97
143
|
try {
|
|
98
|
-
// Parse the URL - handle both full URLs and paths
|
|
99
144
|
const isFullUrl = path.startsWith('http://') || path.startsWith('https://');
|
|
100
145
|
const urlObj = new URL(path, isFullUrl ? undefined : 'http://placeholder');
|
|
101
|
-
return urlObj.searchParams.get(
|
|
146
|
+
return urlObj.searchParams.get(param) ?? undefined;
|
|
102
147
|
} catch {
|
|
103
148
|
// Fallback: regex extraction
|
|
104
|
-
const match = path.match(new RegExp(`[?&]${
|
|
149
|
+
const match = path.match(new RegExp(`[?&]${param}=([^&]*)`));
|
|
105
150
|
return match?.[1] ? decodeURIComponent(match[1]) : undefined;
|
|
106
151
|
}
|
|
107
152
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BrowserPathHelper","exports","SEARCH_PATH_PREFIX","CONTEXTUAL_TRACK_PARAM","createSearchPath","query","encodedQuery","encodeURIComponent","isContextual","path","includes","stripTrackId","url","isFullUrl","startsWith","urlObj","URL","undefined","searchParams","delete","toString","search","pathname","paramPattern","RegExp","result","replace","extractTrackId","get","match","decodeURIComponent","buildUrl","baseUrl","normalizedBase","normalizedPath"],"sourceRoot":"../../../../src","sources":["web/util/BrowserPathHelper.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG;EAC/B;EACAE,kBAAkB,EAAE,WAAW;EAE/B;EACAC,sBAAsB,EAAE,WAAW;EAEnC;AACF;AACA;EACEC,gBAAgBA,CAACC,KAAa,EAAU;IACtC,MAAMC,YAAY,GAAGC,kBAAkB,CAACF,KAAK,CAAC;IAC9C,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"names":["BrowserPathHelper","exports","SEARCH_PATH_PREFIX","CONTEXTUAL_TRACK_PARAM","CONTEXTUAL_INDEX_PARAM","createSearchPath","query","encodedQuery","encodeURIComponent","isContextual","path","includes","stripTrackId","url","isFullUrl","startsWith","urlObj","URL","undefined","searchParams","delete","toString","search","pathname","paramPattern","RegExp","result","replace","build","parentPath","trackId","index","separator","indexParam","extractTrackId","extractParam","extractIndex","raw","test","Number","parseInt","param","get","match","decodeURIComponent","buildUrl","baseUrl","normalizedBase","normalizedPath"],"sourceRoot":"../../../../src","sources":["web/util/BrowserPathHelper.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
// `./native` is deliberately not re-exported — see public-surface.test.ts.
|
|
3
4
|
export * from './features';
|
|
4
|
-
export * from './native';
|
|
5
5
|
export * from './types';
|
|
6
|
+
export * from './utils/getTrackIdentity';
|
|
6
7
|
export * from './utils/useDebug';
|
|
7
8
|
//# sourceMappingURL=AudioBrowser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../src","sources":["AudioBrowser.ts"],"mappings":";;AAAA,cAAc,YAAY;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["AudioBrowser.ts"],"mappings":";;AAAA;AACA,cAAc,YAAY;AAC1B,cAAc,SAAS;AACvB,cAAc,0BAA0B;AACxC,cAAc,kBAAkB","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# TypeScript API
|
|
2
|
+
|
|
3
|
+
The rules here are about the shape of the package's public surface. Both are
|
|
4
|
+
enforced by tests, but the tests only tell you _after_ you've written it.
|
|
5
|
+
|
|
6
|
+
## Everything you export is public
|
|
7
|
+
|
|
8
|
+
`index.ts` → `AudioBrowser.ts` → `features/index.ts` is a chain of unfiltered
|
|
9
|
+
`export *`. There is no allowlist to add a symbol to: a new `export` in any
|
|
10
|
+
feature module joins the package's public surface the moment you write it.
|
|
11
|
+
|
|
12
|
+
`@internal` does **not** make a value private. `stripInternal` honours it when
|
|
13
|
+
building `lib/typescript` — what a consumer's TypeScript sees — but React Native
|
|
14
|
+
resolves `"react-native": "src/index"`, so Metro bundles the _source_, where
|
|
15
|
+
nothing was stripped. An `@internal` value is invisible to the type checker and
|
|
16
|
+
fully reachable at runtime via `require()`.
|
|
17
|
+
|
|
18
|
+
So an internal value needs a module the barrels don't re-export, imported
|
|
19
|
+
directly by its callers — `features/player/validateOptions.ts` is the pattern.
|
|
20
|
+
Types are exempt: they have no runtime representation, so `stripInternal` really
|
|
21
|
+
does remove them, and `@internal` is enough.
|
|
22
|
+
|
|
23
|
+
`native.ts` is the sharp case and stays out of the barrel permanently. It holds
|
|
24
|
+
the raw Nitro object, whose `on*` properties are single callback slots that the
|
|
25
|
+
emitters below already occupy — a consumer assigning one unsubscribes every hook
|
|
26
|
+
in the library. Feature modules import it relatively; nothing else touches it.
|
|
27
|
+
|
|
28
|
+
`public-surface.test.ts` walks the `export *` graph and fails on any reachable
|
|
29
|
+
value that is `@internal`, `__`-prefixed, or `nativeBrowser`.
|
|
30
|
+
|
|
31
|
+
## Events are emitters, not functions
|
|
32
|
+
|
|
33
|
+
Every `on*` export is an object you subscribe to with `addListener(cb)`, which
|
|
34
|
+
returns an unsubscribe function. Never export a bare `on*(cb)` subscribe
|
|
35
|
+
function — that split is what made the whole remote-controls guide a compile
|
|
36
|
+
error until it was unified.
|
|
37
|
+
|
|
38
|
+
Two emitter classes, picked by what the event _is_:
|
|
39
|
+
|
|
40
|
+
- `NativeUpdatedValue` — state with a current value (playback, options,
|
|
41
|
+
progress). Subscribes to native at module load so no update is missed, and
|
|
42
|
+
caches `lastValue` so hooks can read synchronously.
|
|
43
|
+
- `LazyNativeEmitter` — discrete events with no current value (remote controls,
|
|
44
|
+
gate hits). Assigns the native callback on the first `addListener`, so an
|
|
45
|
+
event nobody listens to costs nothing.
|
|
46
|
+
|
|
47
|
+
Both are created via `emitterize(cb => (nativeBrowser.onThing = cb))` and both
|
|
48
|
+
return the instance. Neither class is exported from the package.
|
|
49
|
+
|
|
50
|
+
`on*` observes; `handle*` overrides. `handleRemoteNext(cb)` is a plain setter
|
|
51
|
+
that replaces the default behaviour and takes `undefined` to clear it, while
|
|
52
|
+
`onRemoteNext` fires on every press regardless of who handled it.
|
|
@@ -16,9 +16,12 @@ function isObjectValue(value) {
|
|
|
16
16
|
}
|
|
17
17
|
function isTransformableRequestConfig(source) {
|
|
18
18
|
if (!isObjectValue(source)) return false;
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
19
|
+
// A static ResolvedTrack page also carries a top-level `path`, so `path`
|
|
20
|
+
// alone cannot mark a request config. A page is recognised by its required
|
|
21
|
+
// `title` — no RequestConfig field is named `title`.
|
|
22
|
+
if ('title' in source) return false;
|
|
23
|
+
// Any RequestConfig key marks a request config. (A static ResolvedTrack's
|
|
24
|
+
// per-track request override is nested under `request`, not top-level.)
|
|
22
25
|
return 'baseUrl' in source || 'path' in source || 'headers' in source || 'query' in source || 'method' in source || 'body' in source || 'contentType' in source || 'userAgent' in source || 'transform' in source || 'transformSync' in source;
|
|
23
26
|
}
|
|
24
27
|
function isRouteConfig(source) {
|
|
@@ -81,7 +84,7 @@ function searchSourceToRouteEntry(source) {
|
|
|
81
84
|
*/
|
|
82
85
|
function wrapTracksAsResolvedTrack(tracks) {
|
|
83
86
|
return {
|
|
84
|
-
|
|
87
|
+
path: TABS_ROUTE_PATH,
|
|
85
88
|
title: 'Tabs',
|
|
86
89
|
children: tracks
|
|
87
90
|
};
|
|
@@ -185,10 +188,10 @@ export function validateBrowserConfiguration(config) {
|
|
|
185
188
|
continue;
|
|
186
189
|
}
|
|
187
190
|
if (!isCallback(source) && !isRouteConfig(source) && !isTransformableRequestConfig(source)) {
|
|
188
|
-
// Falls through to the static-page branch; a page needs
|
|
191
|
+
// Falls through to the static-page branch; a page needs path + title.
|
|
189
192
|
const page = source;
|
|
190
|
-
if (typeof page.
|
|
191
|
-
warn(`route "${path}" matched no source shape — expected a callback, ` + `a request config ({ baseUrl, path, headers, ... }), a ` + `RouteConfig ({ browse, media, artwork }), or a static page ` + `({
|
|
193
|
+
if (typeof page.path !== 'string' || typeof page.title !== 'string') {
|
|
194
|
+
warn(`route "${path}" matched no source shape — expected a callback, ` + `a request config ({ baseUrl, path, headers, ... }), a ` + `RouteConfig ({ browse, media, artwork }), or a static page ` + `({ path, title, children? }). It will be served as static ` + `content and likely render a blank screen.`);
|
|
192
195
|
}
|
|
193
196
|
}
|
|
194
197
|
}
|
|
@@ -213,8 +216,9 @@ export function toNativeConfig(config) {
|
|
|
213
216
|
singleTrack: config.singleTrack,
|
|
214
217
|
handleTrackLoad: config.handleTrackLoad,
|
|
215
218
|
androidControllerOfflineError: config.androidControllerOfflineError,
|
|
219
|
+
viewMoreTitle: config.viewMoreTitle,
|
|
216
220
|
carPlayLoadingTitle: config.carPlayLoadingTitle,
|
|
217
|
-
|
|
221
|
+
resolveAlbumPath: config.resolveAlbumPath,
|
|
218
222
|
formatNavigationError: config.formatNavigationError
|
|
219
223
|
};
|
|
220
224
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isCallback","source","isObjectValue","value","isTransformableRequestConfig","isRouteConfig","artwork","splitLayer","layer","resolve","resolver","Promise","config","flattenBrowseSource","browseCallback","browseConfig","browseStatic","searchSourceToRouteEntry","path","SEARCH_ROUTE_PATH","searchCallback","searchConfig","wrapTracksAsResolvedTrack","tracks","
|
|
1
|
+
{"version":3,"names":["isCallback","source","isObjectValue","value","isTransformableRequestConfig","isRouteConfig","artwork","splitLayer","layer","resolve","resolver","Promise","config","flattenBrowseSource","browseCallback","browseConfig","browseStatic","searchSourceToRouteEntry","path","SEARCH_ROUTE_PATH","searchCallback","searchConfig","wrapTracksAsResolvedTrack","tracks","TABS_ROUTE_PATH","title","children","tabsSourceToRouteEntry","Array","isArray","wrappedCallback","flattenRouteEntry","browse","media","DEFAULT_ROUTE_PATH","flattenRoutes","routes","tabs","search","entries","Object","push","length","undefined","MAX_TABS","validateBrowserConfiguration","warn","message","console","startsWith","page","toNativeConfig","request","requestResolver","browseResolver","nowPlayingArtwork","singleTrack","handleTrackLoad","androidControllerOfflineError","viewMoreTitle","carPlayLoadingTitle","resolveAlbumPath","formatNavigationError"],"sourceRoot":"../../../src","sources":["features/browser-config.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -39,8 +39,8 @@ let currentConfiguration;
|
|
|
39
39
|
* }
|
|
40
40
|
* },
|
|
41
41
|
* tabs: [
|
|
42
|
-
* { title: 'Home',
|
|
43
|
-
* { title: 'Search',
|
|
42
|
+
* { title: 'Home', path: '/' },
|
|
43
|
+
* { title: 'Search', path: '/search' }
|
|
44
44
|
* ]
|
|
45
45
|
* })
|
|
46
46
|
* ```
|
|
@@ -138,8 +138,16 @@ export function hasSearch() {
|
|
|
138
138
|
/**
|
|
139
139
|
* Searches for tracks using the configured search source.
|
|
140
140
|
*
|
|
141
|
+
* Resolves `[]` only when the source found nothing; a failed search rejects,
|
|
142
|
+
* so a caller can tell "no results" from "the request failed". The rejection's
|
|
143
|
+
* message describes the failure — native platforms reject with the underlying
|
|
144
|
+
* throwable and JS sees only its message. On web the `Error` also carries a
|
|
145
|
+
* `code`, the {@link NavigationErrorType} the browse path reports as a
|
|
146
|
+
* {@link NavigationError} (`'http-error'`, `'network-error'`).
|
|
147
|
+
*
|
|
141
148
|
* @param query - The search query string
|
|
142
149
|
* @returns Promise resolving to an array of matching tracks
|
|
150
|
+
* @throws When the search source or its request fails
|
|
143
151
|
*
|
|
144
152
|
* @see {@link configureBrowser}
|
|
145
153
|
*
|
|
@@ -150,6 +158,6 @@ export function hasSearch() {
|
|
|
150
158
|
* ```
|
|
151
159
|
*/
|
|
152
160
|
export async function search(query) {
|
|
153
|
-
return nativeBrowser.
|
|
161
|
+
return nativeBrowser.search(query);
|
|
154
162
|
}
|
|
155
163
|
//# sourceMappingURL=browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["nativeBrowser","NativeUpdatedValue","useNativeUpdatedValue","SEARCH_ROUTE_PATH","toNativeConfig","validateBrowserConfiguration","currentConfiguration","configureBrowser","configuration","__DEV__","getBrowserConfiguration","navigate","pathOrTrack","navigatePath","navigateTrack","getPath","path","onPathChanged","emitterize","cb","usePath","getContent","onContentChanged","useContent","getTabs","tabs","onTabsChanged","useTabs","notifyContentChanged","invalidateAllContent","hasSearch","config","searchRoute","routes","find","r","searchCallback","searchConfig","search","query"
|
|
1
|
+
{"version":3,"names":["nativeBrowser","NativeUpdatedValue","useNativeUpdatedValue","SEARCH_ROUTE_PATH","toNativeConfig","validateBrowserConfiguration","currentConfiguration","configureBrowser","configuration","__DEV__","getBrowserConfiguration","navigate","pathOrTrack","navigatePath","navigateTrack","getPath","path","onPathChanged","emitterize","cb","usePath","getContent","onContentChanged","useContent","getTabs","tabs","onTabsChanged","useTabs","notifyContentChanged","invalidateAllContent","hasSearch","config","searchRoute","routes","find","r","searchCallback","searchConfig","search","query"],"sourceRoot":"../../../src","sources":["features/browser.ts"],"mappings":"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","ignoreList":[]}
|