react-native-audio-browser 0.2.0-next.11 → 0.2.0-next.12
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 +4 -4
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +110 -25
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +254 -188
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +23 -3
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +77 -58
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +68 -26
- package/android/src/main/java/com/audiobrowser/browser/StyleResolver.kt +49 -0
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +9 -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/player/MediaSessionCallback.kt +120 -67
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +21 -24
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +93 -73
- package/android/src/main/java/com/audiobrowser/player/Player.kt +48 -30
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +2 -15
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +44 -40
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +28 -23
- package/android/src/main/java/com/audiobrowser/util/StyleWire.kt +35 -0
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +45 -53
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +26 -39
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerFavoritesTest.kt +153 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +228 -50
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +38 -0
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +1 -1
- package/android/src/test/java/com/audiobrowser/browser/JsonStyleTest.kt +91 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +128 -53
- package/android/src/test/java/com/audiobrowser/browser/StyleResolverTest.kt +87 -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/player/CapabilityControlsTest.kt +1 -2
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +42 -2
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateStoreTrackJsonTest.kt +55 -0
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +41 -16
- package/android/src/test/java/com/audiobrowser/util/MediaExtrasBuilderTest.kt +161 -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 +131 -143
- package/ios/Browser/BrowserPathHelper.swift +44 -44
- package/ios/Browser/JsonModels.swift +187 -106
- package/ios/Browser/SearchDrillIn.swift +6 -6
- package/ios/Browser/SectionPresentation.swift +34 -0
- package/ios/Browser/SectionScope.swift +58 -24
- package/ios/Browser/StyleResolver.swift +47 -0
- package/ios/Browser/TabBarEntries.swift +2 -2
- package/ios/Browser/TrackIdTemplate.swift +37 -0
- package/ios/CarPlay/CarPlayArtworkResolver.swift +8 -7
- package/ios/CarPlay/CarPlayController.swift +105 -67
- package/ios/CarPlay/CarPlayImageLoader.swift +38 -18
- package/ios/CarPlay/CarPlayListItemFactory.swift +217 -84
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +15 -12
- package/ios/Extension/Capability+RemoteCommand.swift +1 -1
- package/ios/Extension/PlayerCapabilities+Favorite.swift +1 -15
- package/ios/Extension/ResolvedTrack+Copying.swift +11 -15
- package/ios/Extension/Section+Copying.swift +31 -0
- package/ios/Extension/Track+Copying.swift +6 -12
- package/ios/Extension/Track+Identity.swift +18 -0
- package/ios/HybridAudioBrowser.swift +113 -35
- package/ios/Model/NitroTypeStubs.swift +46 -21
- package/ios/Model/PlayerUpdateOptions.swift +7 -0
- package/ios/Player/NowPlayingUpdater.swift +1 -1
- package/ios/Player/PlaybackCoordinator.swift +2 -2
- package/ios/Player/RetryManager.swift +4 -3
- package/ios/Tests/BrowserPathHelperTests.swift +50 -20
- package/ios/Tests/CarPlayArtworkResolverTests.swift +24 -41
- package/ios/Tests/JsonModelsTests.swift +75 -1
- package/ios/Tests/PlaybackStateStoreTests.swift +4 -3
- package/ios/Tests/ResolvedTrackCopyingTests.swift +37 -35
- package/ios/Tests/SearchDrillInTests.swift +16 -16
- package/ios/Tests/SectionPresentationTests.swift +61 -0
- package/ios/Tests/SectionScopeTests.swift +87 -55
- package/ios/Tests/StyleResolverTests.swift +67 -0
- package/ios/Tests/TabBarEntriesTests.swift +18 -18
- package/ios/Tests/TrackIdTemplateTests.swift +67 -0
- package/ios/Tests/TrackIdentityTests.swift +20 -0
- package/ios/Tests/TrackSelectorTests.swift +168 -33
- package/ios/TrackSelector.swift +45 -30
- package/ios/Util/ArtworkImageFetcher.swift +16 -1
- package/lib/commonjs/AudioBrowser.js +11 -0
- package/lib/commonjs/AudioBrowser.js.map +1 -1
- package/lib/commonjs/features/browser-config.js +11 -8
- package/lib/commonjs/features/browser-config.js.map +1 -1
- package/lib/commonjs/features/browser.js +2 -2
- package/lib/commonjs/features/favorites.js +13 -10
- package/lib/commonjs/features/favorites.js.map +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/state.js +2 -3
- package/lib/commonjs/features/playback/state.js.map +1 -1
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +3 -1
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/player/validateOptions.js +2 -0
- package/lib/commonjs/features/player/validateOptions.js.map +1 -1
- package/lib/commonjs/features/queue/activeTrack.js +14 -3
- package/lib/commonjs/features/queue/activeTrack.js.map +1 -1
- package/lib/commonjs/features/queue/queue.js +11 -4
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/utils/LazyNativeEmitter.js +21 -10
- 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 +32 -24
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +144 -87
- 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/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/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 +1 -0
- package/lib/module/AudioBrowser.js.map +1 -1
- package/lib/module/features/browser-config.js +11 -8
- package/lib/module/features/browser-config.js.map +1 -1
- package/lib/module/features/browser.js +2 -2
- package/lib/module/features/favorites.js +13 -10
- package/lib/module/features/favorites.js.map +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/state.js +2 -3
- package/lib/module/features/playback/state.js.map +1 -1
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +3 -1
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/player/validateOptions.js +2 -0
- package/lib/module/features/player/validateOptions.js.map +1 -1
- package/lib/module/features/queue/activeTrack.js +14 -3
- package/lib/module/features/queue/activeTrack.js.map +1 -1
- package/lib/module/features/queue/queue.js +11 -4
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/utils/LazyNativeEmitter.js +21 -10
- 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 +32 -24
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +144 -87
- 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/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/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/src/AudioBrowser.d.ts +1 -0
- 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 +2 -2
- package/lib/typescript/src/features/favorites.d.ts +13 -10
- package/lib/typescript/src/features/favorites.d.ts.map +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/state.d.ts +2 -3
- 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/player/options.d.ts +21 -19
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/player/validateOptions.d.ts +1 -8
- package/lib/typescript/src/features/player/validateOptions.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts +8 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +5 -2
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-native.d.ts +2 -2
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +260 -127
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +33 -53
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +16 -17
- 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 +0 -1
- package/nitrogen/generated/android/c++/{JFavoritesMatchMode.hpp → JArtworkRendering.hpp} +15 -15
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +4 -3
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +10 -4
- package/nitrogen/generated/android/c++/JCarPlayPlayingIndicatorLocation.hpp +58 -0
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +4 -3
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +4 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +4 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +4 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +4 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +4 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +4 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +4 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +10 -4
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +4 -3
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +2 -5
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +4 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +9 -3
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +4 -2
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +21 -14
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +4 -3
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +16 -10
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +8 -2
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +6 -7
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +2 -5
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +9 -3
- package/nitrogen/generated/android/c++/JOptions.hpp +2 -5
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +4 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +49 -51
- package/nitrogen/generated/android/c++/JSection.hpp +114 -0
- package/nitrogen/generated/android/c++/JSectionStyle.hpp +69 -0
- package/nitrogen/generated/android/c++/JStyleDisplay.hpp +58 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +19 -48
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +4 -2
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +25 -18
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +10 -4
- 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/IOSOptions.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +5 -5
- 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/ResolvedTrack.kt +12 -18
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Section.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → SectionStyle.kt} +12 -6
- 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 -15
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +23 -5
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +104 -82
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +16 -10
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +16 -10
- package/nitrogen/generated/ios/swift/ArtworkRendering.swift +40 -0
- package/nitrogen/generated/ios/swift/CarPlayPlayingIndicatorLocation.swift +40 -0
- package/nitrogen/generated/ios/swift/IOSOptions.swift +7 -2
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +5 -5
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +12 -1
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +54 -83
- package/nitrogen/generated/ios/swift/Section.swift +100 -0
- package/nitrogen/generated/ios/swift/SectionStyle.swift +64 -0
- package/nitrogen/generated/ios/swift/StyleDisplay.swift +40 -0
- package/nitrogen/generated/ios/swift/Track.swift +20 -73
- package/nitrogen/generated/ios/swift/TrackStyle.swift +28 -22
- 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++/IOSOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +6 -6
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +9 -2
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +30 -38
- package/nitrogen/generated/shared/c++/Section.hpp +106 -0
- package/nitrogen/generated/shared/c++/SectionStyle.hpp +96 -0
- package/nitrogen/generated/shared/c++/StyleDisplay.hpp +76 -0
- package/nitrogen/generated/shared/c++/Track.hpp +15 -31
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +50 -34
- package/package.json +1 -1
- package/src/AudioBrowser.ts +1 -0
- package/src/features/browser-config.test.ts +21 -6
- package/src/features/browser-config.ts +11 -8
- package/src/features/browser.test.ts +1 -1
- package/src/features/browser.ts +2 -2
- package/src/features/favorites.ts +13 -10
- package/src/features/hook-wiring.test.ts +63 -15
- package/src/features/playback/controls.ts +4 -2
- package/src/features/playback/state.ts +2 -3
- package/src/features/playback/trackPlaybackTime.ts +1 -1
- package/src/features/player/options.ts +27 -19
- package/src/features/player/setup.test.ts +12 -3
- package/src/features/player/setup.ts +3 -1
- package/src/features/player/validateOptions.ts +2 -0
- package/src/features/queue/activeTrack.ts +14 -3
- package/src/features/queue/queue.ts +11 -4
- package/src/nitro-stub-drift.test.ts +40 -0
- package/src/public-surface.test.ts +40 -0
- package/src/specs/audio-browser.nitro.ts +4 -3
- package/src/style-resolution.test.ts +139 -0
- package/src/types/browser-native.ts +2 -2
- package/src/types/browser-nodes.ts +268 -136
- package/src/types/browser.ts +34 -55
- package/src/utils/LazyNativeEmitter.ts +20 -10
- package/src/utils/NativeUpdatedValue.ts +29 -13
- package/src/utils/getTrackIdentity.ts +20 -0
- package/src/utils/useNativeValueRefreshedBy.ts +38 -0
- package/src/web/NativeAudioBrowser.ts +37 -22
- package/src/web/browser/BrowserManager.ts +176 -95
- package/src/web/browser/FavoriteManager.test.ts +84 -0
- package/src/web/browser/FavoriteManager.ts +28 -23
- 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/player/NowPlayingManager.ts +4 -3
- package/src/web/util/BrowserPathHelper.test.ts +52 -0
- package/src/web/util/BrowserPathHelper.ts +61 -13
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +0 -105
- 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/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +0 -68
- 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/Variant_Bool_FavoriteConfig.swift +0 -18
- package/nitrogen/generated/shared/c++/FavoriteConfig.hpp +0 -84
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +0 -129
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activeTrack.d.ts","sourceRoot":"","sources":["../../../../../src/features/queue/activeTrack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"activeTrack.d.ts","sourceRoot":"","sources":["../../../../../src/features/queue/activeTrack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAInE;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,KAAK,CAAA;IACjB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAA;IACpB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iFAAiF;IACjF,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAID;;GAEG;AACH,wBAAgB,cAAc,IAAI,KAAK,GAAG,SAAS,CAElD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAExD;AAID;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,qDAG9B,CAAA;AAOH;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,KAAK,GAAG,SAAS,CAElD"}
|
|
@@ -105,13 +105,16 @@ export declare function getQueue(): Track[];
|
|
|
105
105
|
export declare const onQueueEnded: NativeUpdatedValue<PlaybackQueueEndedEvent>;
|
|
106
106
|
/**
|
|
107
107
|
* Subscribes to queue change events.
|
|
108
|
-
* Called when tracks are added, removed, reordered
|
|
108
|
+
* Called when tracks are added, removed, or reordered. An in-place mutation of
|
|
109
|
+
* a queued track's metadata (a favorite toggle) emits `onFavoriteChanged`
|
|
110
|
+
* instead; {@link useQueue} subscribes to both.
|
|
109
111
|
* @param callback - Called with the updated queue
|
|
110
112
|
* @returns An emitter — subscribe with `addListener(callback)`, which returns a cleanup function
|
|
111
113
|
*/
|
|
112
114
|
export declare const onQueueChanged: NativeUpdatedValue<Track[]>;
|
|
113
115
|
/**
|
|
114
|
-
* Hook that returns the current queue
|
|
116
|
+
* Hook that returns the current queue, updating on queue changes AND on
|
|
117
|
+
* in-place mutations of queued tracks (favorite toggles).
|
|
115
118
|
* @returns The current queue
|
|
116
119
|
*/
|
|
117
120
|
export declare function useQueue(): Track[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../../../src/features/queue/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../../../src/features/queue/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAMnE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;IACb,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAA;CACjB;AAID;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;AACtE;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;AAQnE;;;GAGG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAEvC;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AAC/C;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;AAO3C;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,KAAK,EAAE,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAEN;AAID;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEzD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,KAAK,EAAE,CAElC;AAID;;;;GAIG;AACH,eAAO,MAAM,YAAY,6CAGtB,CAAA;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,6BAE1B,CAAA;AAOD;;;;GAIG;AACH,wBAAgB,QAAQ,IAAI,KAAK,EAAE,CAElC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* into separate optional properties to reduce generated code complexity.
|
|
6
6
|
* Users should use BrowserConfiguration, not these types directly.
|
|
7
7
|
*/
|
|
8
|
-
import type { ArtworkRequestConfig, BrowserSourceCallback,
|
|
8
|
+
import type { ArtworkRequestConfig, BrowserSourceCallback, ResolveAlbumPathCallback, FormatNavigationErrorCallback, HandleTrackLoadCallback, MediaRequestConfig, SearchSourceCallback, TransformableRequestConfig } from './browser';
|
|
9
9
|
import type { ResolvedTrack } from './browser-nodes';
|
|
10
10
|
type NativeRequestConfigResolver = () => Promise<TransformableRequestConfig>;
|
|
11
11
|
/**
|
|
@@ -39,7 +39,7 @@ export interface NativeBrowserConfiguration {
|
|
|
39
39
|
handleTrackLoad?: HandleTrackLoadCallback;
|
|
40
40
|
androidControllerOfflineError?: boolean;
|
|
41
41
|
carPlayLoadingTitle?: string;
|
|
42
|
-
|
|
42
|
+
resolveAlbumPath?: ResolveAlbumPathCallback;
|
|
43
43
|
formatNavigationError?: FormatNavigationErrorCallback;
|
|
44
44
|
}
|
|
45
45
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-native.d.ts","sourceRoot":"","sources":["../../../../src/types/browser-native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"browser-native.d.ts","sourceRoot":"","sources":["../../../../src/types/browser-native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,6BAA6B,EAC7B,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,WAAW,CAAA;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAMpD,KAAK,2BAA2B,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAA;AAE5E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IAEZ,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC,YAAY,CAAC,EAAE,0BAA0B,CAAA;IACzC,YAAY,CAAC,EAAE,aAAa,CAAA;IAE5B,cAAc,CAAC,EAAE,oBAAoB,CAAA;IACrC,YAAY,CAAC,EAAE,0BAA0B,CAAA;IAEzC,KAAK,CAAC,EAAE,kBAAkB,CAAA;IAC1B,OAAO,CAAC,EAAE,oBAAoB,CAAA;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IAKb,OAAO,CAAC,EAAE,0BAA0B,CAAA;IACpC,eAAe,CAAC,EAAE,2BAA2B,CAAA;IAG7C,MAAM,CAAC,EAAE,0BAA0B,CAAA;IACnC,cAAc,CAAC,EAAE,2BAA2B,CAAA;IAC5C,KAAK,CAAC,EAAE,kBAAkB,CAAA;IAC1B,OAAO,CAAC,EAAE,oBAAoB,CAAA;IAC9B,iBAAiB,CAAC,EAAE,oBAAoB,CAAA;IAQxC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAG3B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,eAAe,CAAC,EAAE,uBAAuB,CAAA;IACzC,6BAA6B,CAAC,EAAE,OAAO,CAAA;IAGvC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,gBAAgB,CAAC,EAAE,wBAAwB,CAAA;IAC3C,qBAAqB,CAAC,EAAE,6BAA6B,CAAA;CACtD"}
|
|
@@ -1,5 +1,114 @@
|
|
|
1
1
|
import type { CarPlaySiriListButtonPosition, HttpMethod } from './browser';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* How a holder's *children* lay out — CSS's inner display type, honored
|
|
4
|
+
* literally (`display: 'grid'` in CSS describes the children, not the
|
|
5
|
+
* element).
|
|
6
|
+
*
|
|
7
|
+
* - `'list'` (default) — full-width rows on every surface.
|
|
8
|
+
* - `'grid'` — artwork tiles; wraps unless {@link SectionStyle.gridWrap}
|
|
9
|
+
* is `false`. Tiles presume artwork: an artwork-less child renders a
|
|
10
|
+
* placeholder tile plus its title. On CarPlay a *wrapping* grid needs
|
|
11
|
+
* iOS 26+ and renders a list before that; a single-line grid renders
|
|
12
|
+
* on every OS.
|
|
13
|
+
*/
|
|
14
|
+
export type StyleDisplay = 'list' | 'grid';
|
|
15
|
+
/**
|
|
16
|
+
* How a track's artwork is rendered.
|
|
17
|
+
*
|
|
18
|
+
* - `'original'` (default) — drawn as-is.
|
|
19
|
+
* - `'stencil'` — treated as a monochrome glyph and tinted to the
|
|
20
|
+
* surface's appearance (black in light mode, white in dark). For
|
|
21
|
+
* monochrome logos and icons; full-color artwork should stay
|
|
22
|
+
* `'original'`.
|
|
23
|
+
*/
|
|
24
|
+
export type ArtworkRendering = 'original' | 'stencil';
|
|
25
|
+
/**
|
|
26
|
+
* The style declaration block a {@link Track} may carry: *inherited item
|
|
27
|
+
* properties* (resolved `track ?? section ?? page ?? default`, per
|
|
28
|
+
* property — they travel with the track) plus the *positional*
|
|
29
|
+
* {@link TrackStyle.display} (each holder's own children; never
|
|
30
|
+
* inherited).
|
|
31
|
+
*
|
|
32
|
+
* Rules governing every property:
|
|
33
|
+
*
|
|
34
|
+
* - **Declarations are aspirational.** Each surface renders the
|
|
35
|
+
* properties it understands and ignores the rest — inert, never an
|
|
36
|
+
* error.
|
|
37
|
+
* - **Presentation only.** No style property affects queue scope,
|
|
38
|
+
* playback, or navigation: rendering may truncate what is visible, it
|
|
39
|
+
* never changes what plays. (This is why {@link Track.disabled} is NOT
|
|
40
|
+
* here — it carries behavior, so it lives on Track as a content fact.)
|
|
41
|
+
* - **The inheritance boundary**: a handle's block styles the handle; a
|
|
42
|
+
* page's block is inherited by the page's descendants; nothing
|
|
43
|
+
* inherits across resolution.
|
|
44
|
+
*/
|
|
45
|
+
export interface TrackStyle {
|
|
46
|
+
/**
|
|
47
|
+
* How this entity's *children* lay out. The meaning is uniform at
|
|
48
|
+
* every position; only the children differ:
|
|
49
|
+
*
|
|
50
|
+
* - On a {@link Section}: the section's children.
|
|
51
|
+
* - On a resolved page ({@link ResolvedTrack.style}): the declaration
|
|
52
|
+
* for the whole page — a section overrides it for its own children.
|
|
53
|
+
* - On a browsable {@link Track} (the handle): the *advertised*
|
|
54
|
+
* layout of the page it opens. Android Auto decides a page's
|
|
55
|
+
* layout before resolving it, so it is the one reader that acts
|
|
56
|
+
* on the handle's declaration. Declared or it doesn't exist: no
|
|
57
|
+
* value → nothing advertised. The resolved page is the truth.
|
|
58
|
+
* - On a track rendered *playable* (`src` wins the rendering): inert —
|
|
59
|
+
* playables open no page.
|
|
60
|
+
*
|
|
61
|
+
* Never *item*-inherited — each holder speaks only for its own
|
|
62
|
+
* children. Between containers it resolves by scope override, not
|
|
63
|
+
* inheritance: the page declares for its whole scope, a section
|
|
64
|
+
* overrides for its own children.
|
|
65
|
+
*
|
|
66
|
+
* @default 'list'
|
|
67
|
+
*
|
|
68
|
+
* @see https://developer.android.com/training/cars/media/create-media-browser/content-styles
|
|
69
|
+
*/
|
|
70
|
+
display?: StyleDisplay;
|
|
71
|
+
/**
|
|
72
|
+
* Inherited (`track ?? section ?? page`): how this item's artwork is
|
|
73
|
+
* rendered — `'stencil'` tints a monochrome glyph to the surface's
|
|
74
|
+
* light/dark appearance.
|
|
75
|
+
*
|
|
76
|
+
* @default 'original'
|
|
77
|
+
*
|
|
78
|
+
* @platform carplay
|
|
79
|
+
*/
|
|
80
|
+
artworkRendering?: ArtworkRendering;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A {@link Section}'s (or resolved page's) style declaration block: the
|
|
84
|
+
* *container* properties below, plus — via `extends` — a section-wide
|
|
85
|
+
* value for every inherited {@link TrackStyle} item property (and the
|
|
86
|
+
* section's own positional `display`).
|
|
87
|
+
*
|
|
88
|
+
* Container properties resolve by scope override, not inheritance: the
|
|
89
|
+
* page declares for its whole scope, a section overrides for its own
|
|
90
|
+
* children (`section ?? page ?? default`) — they never flow to items.
|
|
91
|
+
*/
|
|
92
|
+
export interface SectionStyle extends TrackStyle {
|
|
93
|
+
/**
|
|
94
|
+
* Whether grid tiles wrap to multiple lines. `false` renders exactly
|
|
95
|
+
* one line — the teaser shelf: a preview of a larger collection,
|
|
96
|
+
* typically paired with {@link Section.path} as the "view all" target.
|
|
97
|
+
*
|
|
98
|
+
* Rendered by CarPlay (a single line of tiles). Android Auto has no
|
|
99
|
+
* single-line tile container — its grid wraps, showing more, never
|
|
100
|
+
* less. Phone UIs typically honor `false` as a horizontal scroller.
|
|
101
|
+
*
|
|
102
|
+
* Inert unless {@link TrackStyle.display} is `'grid'`.
|
|
103
|
+
*
|
|
104
|
+
* @default true
|
|
105
|
+
*
|
|
106
|
+
* @platform carplay
|
|
107
|
+
*
|
|
108
|
+
* @see https://developer.apple.com/documentation/carplay/cplistimagerowitem
|
|
109
|
+
*/
|
|
110
|
+
gridWrap?: boolean;
|
|
111
|
+
}
|
|
3
112
|
/**
|
|
4
113
|
* Image source for React Native's `<Image>` component.
|
|
5
114
|
* Contains all information needed to load an image, including URL transformation
|
|
@@ -50,74 +159,84 @@ export interface ArtworkVariants {
|
|
|
50
159
|
}
|
|
51
160
|
/** A single artwork URL, or one per appearance. */
|
|
52
161
|
export type TrackArtwork = string | ArtworkVariants;
|
|
53
|
-
|
|
162
|
+
/**
|
|
163
|
+
* A titled, styled group of Tracks within a resolved page — the unit of
|
|
164
|
+
* queue scope. Tapping a playable child queues the section it sits in,
|
|
165
|
+
* identically on every platform and screen width: rendering may truncate
|
|
166
|
+
* what is visible, it never changes what plays.
|
|
167
|
+
*/
|
|
168
|
+
export interface Section {
|
|
169
|
+
/** Header text. Absent = headerless group. */
|
|
170
|
+
title?: string;
|
|
54
171
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
172
|
+
* Secondary line for the section's navigation surface — e.g. the label
|
|
173
|
+
* of the "view all" link a tile section gets on Android Auto.
|
|
57
174
|
*/
|
|
58
|
-
|
|
59
|
-
/** Navigation path. Tapping this thumbnail navigates to this URL. */
|
|
60
|
-
url?: string;
|
|
175
|
+
subtitle?: string;
|
|
61
176
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
177
|
+
* Presentation, separated from content. Each surface renders the
|
|
178
|
+
* declared layout's nearest supported form; on CarPlay
|
|
179
|
+
* a wrapping grid requires iOS 26+ and renders a list before that,
|
|
180
|
+
* since CarPlay's only earlier tile container truncates at a width the
|
|
181
|
+
* system doesn't report. Use the artwork `resolve` hook to supply
|
|
182
|
+
* fallback art for tile layouts.
|
|
65
183
|
*/
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
album?: string;
|
|
77
|
-
/** Navigation target of the album line when played via `src` (mirrors `Track.albumUrl`). */
|
|
78
|
-
albumUrl?: string;
|
|
79
|
-
/** Live stream indicator when played via `src` (mirrors `Track.live`). */
|
|
80
|
-
live?: boolean;
|
|
81
|
-
/** Per-item media-request override when played via `src` (mirrors `Track.request`). */
|
|
82
|
-
request?: TrackRequest;
|
|
184
|
+
style?: SectionStyle;
|
|
185
|
+
/**
|
|
186
|
+
* Navigation target for the section header / "view all" surface. A
|
|
187
|
+
* tile section's header tap (CarPlay) and appended "view all" link
|
|
188
|
+
* (Android Auto) navigate here. Absent = a pure preview; the header is
|
|
189
|
+
* not tappable.
|
|
190
|
+
*/
|
|
191
|
+
path?: string;
|
|
192
|
+
/** The section's tracks. */
|
|
193
|
+
children: Track[];
|
|
83
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* The one node type of the browse tree — every tab, folder, station,
|
|
197
|
+
* episode, and queue item is a Track. What a Track *is* follows from which
|
|
198
|
+
* address fields it carries: a {@link path} makes it **browsable** (it opens
|
|
199
|
+
* as a page), a {@link src} makes it **playable** (it can be loaded into the
|
|
200
|
+
* player); at least one of the two is required. The remaining fields are
|
|
201
|
+
* display metadata ({@link title}, {@link artist}, {@link artwork}, …) and
|
|
202
|
+
* content state ({@link favorited}, {@link live}, {@link disabled}).
|
|
203
|
+
*/
|
|
84
204
|
export interface Track {
|
|
85
205
|
/**
|
|
86
206
|
* Opaque, stable identifier for this track.
|
|
87
207
|
*
|
|
208
|
+
* A track's **identity** is `id` when set (non-blank), falling back to
|
|
209
|
+
* `src`. That single rule drives every comparison the library makes:
|
|
210
|
+
* favorites matching (`setFavorites`), the CarPlay / Android Auto
|
|
211
|
+
* "now playing" row indicator, section scoping and skip-in-place, and the
|
|
212
|
+
* contextual queue re-expansion. Two tracks refer to the same item iff
|
|
213
|
+
* their identities are equal — so set `id` consistently on every surface,
|
|
214
|
+
* or on none.
|
|
215
|
+
*
|
|
88
216
|
* The library never parses or derives anything from this value — it is
|
|
89
|
-
* round-tripped verbatim through `setQueue`, `getActiveTrack`, the queue,
|
|
90
|
-
* `onActiveTrackChanged`,
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* (absolute vs relative URLs, volatile query params) — otherwise the
|
|
100
|
-
* indicator never matches.
|
|
101
|
-
*
|
|
102
|
-
* It is also handed to the per-track `MediaRequestConfig.resolve` and
|
|
103
|
-
* `ArtworkRequestConfig.resolve` hooks, so requests can be built from a stable
|
|
104
|
-
* id (e.g. supply tracks with only an `id` and synthesise `src` in `resolve`).
|
|
105
|
-
*
|
|
106
|
-
* Optional: consumers whose `url`/`src` strings are already stable across
|
|
107
|
-
* surfaces can ignore it.
|
|
108
|
-
*
|
|
109
|
-
* Note: an Android Auto item selected directly from the browse tree that the
|
|
110
|
-
* consumer never queued is identified only by `url`/`src`, so `id` may be
|
|
111
|
-
* undefined on that specific path.
|
|
217
|
+
* round-tripped verbatim through `setQueue`, `getActiveTrack`, the queue,
|
|
218
|
+
* `onActiveTrackChanged`, and `onFavoriteChanged`, and handed to the
|
|
219
|
+
* per-track `MediaRequestConfig.resolve` / `ArtworkRequestConfig.resolve`
|
|
220
|
+
* hooks so requests can be built from the stable id.
|
|
221
|
+
*
|
|
222
|
+
* Optional: consumers whose `src` strings are identical wherever the same
|
|
223
|
+
* item appears can ignore it — their identity is the `src`. Assign ids when
|
|
224
|
+
* `src` strings for the same item can differ between surfaces (absolute vs
|
|
225
|
+
* relative URLs, volatile query params), or when favorites are stored as an
|
|
226
|
+
* identifier that isn't the playable URL.
|
|
112
227
|
*/
|
|
113
228
|
id?: string;
|
|
114
229
|
/**
|
|
115
230
|
* Navigation path. When present, this track is a container (tab, album, playlist, folder)
|
|
116
231
|
* that can be navigated into to view its contents.
|
|
117
232
|
*
|
|
118
|
-
* At least one of `
|
|
233
|
+
* At least one of `path` or `src` must be defined. When both are set, current
|
|
234
|
+
* surfaces treat the track as playable — `src` wins the rendering, and the
|
|
235
|
+
* browse pipeline replaces a playable track's `path` with its contextual
|
|
236
|
+
* path — so a consumer-supplied `path` on a playable track is not reachable
|
|
237
|
+
* today.
|
|
119
238
|
*/
|
|
120
|
-
|
|
239
|
+
path?: string;
|
|
121
240
|
/**
|
|
122
241
|
* Direct audio source identifier. When present, this track can be played directly.
|
|
123
242
|
*
|
|
@@ -125,7 +244,7 @@ export interface Track {
|
|
|
125
244
|
* any string (file path, custom identifier, etc.) that will be passed to
|
|
126
245
|
* MediaRequestConfig.resolve to transform it into the actual media request.
|
|
127
246
|
*
|
|
128
|
-
* At least one of `
|
|
247
|
+
* At least one of `path` or `src` must be defined.
|
|
129
248
|
*/
|
|
130
249
|
src?: string;
|
|
131
250
|
/**
|
|
@@ -138,7 +257,8 @@ export interface Track {
|
|
|
138
257
|
* Pass an {@link ArtworkVariants} pair to supply genuinely different images
|
|
139
258
|
* per appearance — a logo that changes colour, say. For a monochrome glyph
|
|
140
259
|
* that only needs recolouring, prefer a single URL plus
|
|
141
|
-
* {
|
|
260
|
+
* `style: { artworkRendering: 'stencil' }`, which is one fetch instead
|
|
261
|
+
* of two.
|
|
142
262
|
*
|
|
143
263
|
* **iOS:** supports {@link https://developer.apple.com/sf-symbols/ | SF Symbols}
|
|
144
264
|
* with the `sf:` prefix and optional color params:
|
|
@@ -165,22 +285,6 @@ export interface Track {
|
|
|
165
285
|
readonly artworkSource?: ImageSource;
|
|
166
286
|
/** Per-track media-request override; merged last (request → media → track.request). */
|
|
167
287
|
request?: TrackRequest;
|
|
168
|
-
/**
|
|
169
|
-
* Whether this artwork should be tinted based on CarPlay's current appearance (light/dark mode).
|
|
170
|
-
*
|
|
171
|
-
* When `true`, the artwork is treated as a monochrome icon and tinted:
|
|
172
|
-
* - Light mode: tinted black for visibility on light backgrounds
|
|
173
|
-
* - Dark mode: tinted white for visibility on dark backgrounds
|
|
174
|
-
*
|
|
175
|
-
* This is useful for SVG or PNG icons that need to adapt to CarPlay's light/dark themes.
|
|
176
|
-
* Full-color artwork (album covers, logos) should not use this.
|
|
177
|
-
*
|
|
178
|
-
* **iOS CarPlay only** - Android Auto is dark-only, so content providers should
|
|
179
|
-
* provide appropriately colored icons directly (e.g., white icons).
|
|
180
|
-
*
|
|
181
|
-
* @default false
|
|
182
|
-
*/
|
|
183
|
-
artworkCarPlayTinted?: boolean;
|
|
184
288
|
/** Primary line shown for this item, in both browse lists and now-playing. */
|
|
185
289
|
title: string;
|
|
186
290
|
/**
|
|
@@ -202,9 +306,9 @@ export interface Track {
|
|
|
202
306
|
artist?: string;
|
|
203
307
|
/**
|
|
204
308
|
* Browse path the {@link album} line navigates to (same path namespace as
|
|
205
|
-
* {@link
|
|
309
|
+
* {@link path}). On CarPlay, when the active track has an `albumPath`, its
|
|
206
310
|
* album line on the Now Playing screen becomes tappable and navigates the
|
|
207
|
-
* browse stack there. See also `
|
|
311
|
+
* browse stack there. See also `resolveAlbumPath` in the browser
|
|
208
312
|
* configuration for a dynamic fallback.
|
|
209
313
|
*
|
|
210
314
|
* Requires {@link album} to be set: CarPlay renders the tappable line from
|
|
@@ -212,9 +316,25 @@ export interface Track {
|
|
|
212
316
|
*
|
|
213
317
|
* @platform ios
|
|
214
318
|
*/
|
|
215
|
-
|
|
319
|
+
albumPath?: string;
|
|
320
|
+
/**
|
|
321
|
+
* Album name, shown on now-playing surfaces that have an album slot
|
|
322
|
+
* (CarPlay, Android Auto, Bluetooth metadata — the iOS lock screen has
|
|
323
|
+
* none). With {@link albumPath} set, CarPlay renders it as a tappable
|
|
324
|
+
* line that navigates there.
|
|
325
|
+
*/
|
|
216
326
|
album?: string;
|
|
327
|
+
/**
|
|
328
|
+
* Longer free-form text about the item, passed to the platform's
|
|
329
|
+
* description metadata slot where one exists. Not shown on browse rows
|
|
330
|
+
* (those render {@link title} / {@link subtitle}) or the lock screen.
|
|
331
|
+
*/
|
|
217
332
|
description?: string;
|
|
333
|
+
/**
|
|
334
|
+
* Genre name, passed to the platform's genre metadata slot where one
|
|
335
|
+
* exists. Catalog metadata only — the library never matches search or
|
|
336
|
+
* browse against it.
|
|
337
|
+
*/
|
|
218
338
|
genre?: string;
|
|
219
339
|
/**
|
|
220
340
|
* Duration in seconds, as catalog metadata for app UI (e.g. an episode
|
|
@@ -223,67 +343,61 @@ export interface Track {
|
|
|
223
343
|
*/
|
|
224
344
|
duration?: number;
|
|
225
345
|
/**
|
|
226
|
-
*
|
|
227
|
-
* -
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
* (e.g., `android.resource://com.myapp/drawable/ic_folder`), the library
|
|
232
|
-
* automatically uses 'category' styling which adds margins around the icon
|
|
233
|
-
* and enables system tinting for vector drawables.
|
|
234
|
-
*
|
|
235
|
-
* @see https://developer.android.com/training/cars/media#default-content-style
|
|
346
|
+
* The track's style declaration block: inherited item properties (a
|
|
347
|
+
* per-item override of section/page values — they travel with the
|
|
348
|
+
* track), plus the positional {@link TrackStyle.display} — on a
|
|
349
|
+
* browsable track, the advertised layout of the page it opens, read
|
|
350
|
+
* by Android Auto, which picks a page's layout before resolving it.
|
|
236
351
|
*/
|
|
237
352
|
style?: TrackStyle;
|
|
238
353
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
354
|
+
* Unavailable — a content-state fact beside `favorited` and `live`,
|
|
355
|
+
* with full behavioral weight (content facts may carry behavior; style
|
|
356
|
+
* never does): a disabled track never plays — tap refused, queue
|
|
357
|
+
* expansion excludes it, voice search won't match it.
|
|
358
|
+
*
|
|
359
|
+
* Rendering ladder, never a trap: **grayed + inert** where the surface
|
|
360
|
+
* can draw it (CarPlay) → **hidden** where it can't (Android Auto) —
|
|
361
|
+
* never a normal-looking dead control. Hiding is behavior-safe because
|
|
362
|
+
* the track is inert everywhere regardless; the cost is losing the
|
|
363
|
+
* "Available at 9 PM" tease on surfaces that hide, so put the reason
|
|
364
|
+
* in the title for the ones that gray. Applied at page (re-)serve,
|
|
365
|
+
* like style.
|
|
366
|
+
*
|
|
367
|
+
* @default false
|
|
247
368
|
*/
|
|
248
|
-
|
|
369
|
+
disabled?: boolean;
|
|
249
370
|
/**
|
|
250
371
|
* Whether this track is favorited. When the `favorite` capability is enabled,
|
|
251
372
|
* displays a filled/empty heart icon in media controllers (notification, Android Auto).
|
|
252
373
|
*/
|
|
253
374
|
favorited?: boolean;
|
|
254
375
|
/**
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*/
|
|
259
|
-
groupTitle?: string;
|
|
260
|
-
/**
|
|
261
|
-
* Whether this track is a live stream. When true, displays a "live" indicator
|
|
262
|
-
* in iOS now playing interfaces.
|
|
263
|
-
*/
|
|
264
|
-
live?: boolean;
|
|
265
|
-
/**
|
|
266
|
-
* When present, renders this track as a horizontal row of tappable artwork
|
|
267
|
-
* thumbnails instead of a standard list item.
|
|
376
|
+
* Declares this track a live broadcast rather than a file. The players
|
|
377
|
+
* detect *transport* liveness (sliding windows, buffering) themselves;
|
|
378
|
+
* this declaration drives the semantic decisions they can't infer:
|
|
268
379
|
*
|
|
269
|
-
* -
|
|
270
|
-
*
|
|
271
|
-
* -
|
|
272
|
-
*
|
|
380
|
+
* - **End of stream** (iOS): a live track "ending" is judged a dropped
|
|
381
|
+
* broadcast and recovered by rejoining the edge, never a queue advance.
|
|
382
|
+
* - **Stall recovery** (iOS): a live track that runs dry reconnects at
|
|
383
|
+
* the edge; a non-live one resumes its existing connection.
|
|
384
|
+
* - **`seekToLiveEdge()`** (all platforms): the call only acts on a
|
|
385
|
+
* track declared live — without the declaration it is a no-op.
|
|
386
|
+
* - **Persistence** (iOS): no position is stored, so a cold-start resume
|
|
387
|
+
* rejoins the current broadcast instead of seeking a stale timestamp.
|
|
388
|
+
* - **Now-playing** (iOS): the live indicator and live-style
|
|
389
|
+
* (non-scrubbing) progress UI.
|
|
273
390
|
*
|
|
274
|
-
*
|
|
275
|
-
*
|
|
276
|
-
*
|
|
391
|
+
* The iOS-heavy list is deliberate, not a gap: on Android, ExoPlayer's
|
|
392
|
+
* own classification already covers these — a dropped live connection
|
|
393
|
+
* surfaces as a load error (never end-of-stream), and persistence keys
|
|
394
|
+
* off its detected liveness — so the declaration's only Android reader
|
|
395
|
+
* is the `seekToLiveEdge()` gate. Android Auto has no live badge.
|
|
277
396
|
*
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
* per-item content-style hint, list rows otherwise) grouped under the
|
|
281
|
-
* track's title, followed by the track itself as a browsable "view all"
|
|
282
|
-
* link when it has a `url`.
|
|
283
|
-
*
|
|
284
|
-
* On app side: consumable by React Native UI for horizontal thumbnail layouts.
|
|
397
|
+
* Omitting it never breaks playback — it silently breaks these judgment
|
|
398
|
+
* calls. Declare it on every live track.
|
|
285
399
|
*/
|
|
286
|
-
|
|
400
|
+
live?: boolean;
|
|
287
401
|
}
|
|
288
402
|
/**
|
|
289
403
|
* A Track that has been resolved with its children through browsing.
|
|
@@ -295,21 +409,40 @@ export interface Track {
|
|
|
295
409
|
* ```ts
|
|
296
410
|
* // navigate() is fire-and-forget (returns void); read the resolved page
|
|
297
411
|
* // from getContent() / useContent() / onContentChanged.
|
|
298
|
-
* navigate('albums/abbey-road');
|
|
412
|
+
* navigate('/albums/abbey-road');
|
|
299
413
|
* const resolved = getContent();
|
|
300
|
-
* console.log(resolved?.
|
|
414
|
+
* console.log(resolved?.path); // "/albums/abbey-road"
|
|
301
415
|
* console.log(resolved?.title); // "Abbey Road"
|
|
302
|
-
* console.log(resolved?.
|
|
416
|
+
* console.log(resolved?.sections); // the album's tracks, as sections
|
|
303
417
|
* ```
|
|
304
418
|
*/
|
|
305
419
|
export interface ResolvedTrack extends Track {
|
|
306
420
|
/**
|
|
307
|
-
*
|
|
421
|
+
* Browse path of this resolved track. Always present since you navigated to this location.
|
|
422
|
+
*/
|
|
423
|
+
path: string;
|
|
424
|
+
/**
|
|
425
|
+
* A page is a Track that is also the container of its sections, so its
|
|
426
|
+
* block widens to {@link SectionStyle}: the declaration for the whole
|
|
427
|
+
* page. Item properties set here are inherited by every item on the
|
|
428
|
+
* page unless a section or track declares its own; the container
|
|
429
|
+
* property (`gridWrap`) and the positional `display` are the page-wide
|
|
430
|
+
* values a section overrides for its own children.
|
|
431
|
+
*/
|
|
432
|
+
style?: SectionStyle;
|
|
433
|
+
/**
|
|
434
|
+
* The page's sections — the canonical resolved shape. Every resolved page
|
|
435
|
+
* with content carries `sections`; a page authored with plain `children`
|
|
436
|
+
* resolves to a single untitled section.
|
|
308
437
|
*/
|
|
309
|
-
|
|
438
|
+
sections?: Section[];
|
|
310
439
|
/**
|
|
311
|
-
*
|
|
312
|
-
*
|
|
440
|
+
* Authoring sugar for a flat page: equivalent to declaring one untitled,
|
|
441
|
+
* style-less section holding these tracks (which therefore takes the
|
|
442
|
+
* page block's scope-wide values, like any undeclared section). Accepted
|
|
443
|
+
* anywhere a page is authored (static routes, browse callbacks, JSON
|
|
444
|
+
* payloads); never populated on a *resolved* page — read `sections`
|
|
445
|
+
* instead.
|
|
313
446
|
*/
|
|
314
447
|
children?: Track[];
|
|
315
448
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-nodes.d.ts","sourceRoot":"","sources":["../../../../src/types/browser-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE1E,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"browser-nodes.d.ts","sourceRoot":"","sources":["../../../../src/types/browser-nodes.ts"],"names":[],"mappings":"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"}
|