react-native-audio-browser 0.1.1 → 0.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AudioBrowser.podspec +1 -1
- package/README.md +180 -2
- package/android/build.gradle +10 -0
- package/android/gradle.properties +1 -1
- package/android/src/main/AndroidManifest.xml +15 -0
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +401 -141
- package/android/src/main/java/com/audiobrowser/Callbacks.kt +4 -6
- package/android/src/main/java/com/audiobrowser/Service.kt +67 -18
- package/android/src/main/java/com/audiobrowser/browser/ArtworkResolutionRegistry.kt +37 -0
- package/android/src/main/java/com/audiobrowser/browser/BrowseArtworkRegistry.kt +34 -0
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +443 -178
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +300 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonArtwork.kt +79 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +41 -4
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +43 -0
- package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +4 -4
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +35 -0
- package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +109 -97
- package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +6 -10
- package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +40 -8
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +31 -37
- package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +4 -1
- package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +119 -0
- package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +18 -1
- package/android/src/main/java/com/audiobrowser/player/EqualizerController.kt +153 -0
- package/android/src/main/java/com/audiobrowser/player/InterceptingPlayer.kt +141 -0
- package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +15 -3
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +415 -131
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +154 -276
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +348 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackErrorClassifier.kt +129 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateMachine.kt +85 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +27 -5
- package/android/src/main/java/com/audiobrowser/player/PlaybackTimer.kt +56 -0
- package/android/src/main/java/com/audiobrowser/player/Player.kt +452 -576
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +20 -0
- package/android/src/main/java/com/audiobrowser/player/PlayerEngineFactory.kt +130 -0
- package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +190 -67
- package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +117 -53
- package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +37 -3
- package/android/src/main/java/com/audiobrowser/player/SleepTimerManager.kt +80 -0
- package/android/src/main/java/com/audiobrowser/player/StuckRecoveryPolicy.kt +50 -0
- package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +84 -40
- package/android/src/main/java/com/audiobrowser/player/VolumeFader.kt +81 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +141 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +37 -0
- package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +41 -0
- package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +209 -0
- package/android/src/main/java/com/audiobrowser/util/ArtworkContentProvider.kt +161 -0
- package/android/src/main/java/com/audiobrowser/util/ArtworkUris.kt +28 -0
- package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +26 -0
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +24 -0
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoader.kt +49 -0
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoaderHolder.kt +36 -0
- package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +23 -300
- package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +13 -23
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +2 -2
- package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +4 -3
- package/android/src/main/java/com/audiobrowser/util/OutputMonitor.kt +211 -0
- package/android/src/main/java/com/audiobrowser/util/OutputSwitcher.kt +58 -0
- package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +2 -1
- package/android/src/main/java/com/audiobrowser/util/RatingFavorites.kt +14 -0
- package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +6 -111
- package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +22 -8
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +111 -80
- package/android/src/main/res/values/strings.xml +4 -0
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +166 -0
- package/android/src/test/java/com/audiobrowser/browser/ArtworkResolutionRegistryTest.kt +46 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowseArtworkRegistryTest.kt +39 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerBuildApiRequestTest.kt +114 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +141 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +4 -0
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +177 -0
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +54 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +96 -0
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +1 -2
- package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +72 -0
- package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +159 -0
- package/android/src/test/java/com/audiobrowser/player/DynamicLoadControlTest.kt +56 -0
- package/android/src/test/java/com/audiobrowser/player/EqualizerControllerTest.kt +216 -0
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +442 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +191 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateMachineTest.kt +198 -0
- package/android/src/test/java/com/audiobrowser/player/PlaybackTimerTest.kt +137 -0
- package/android/src/test/java/com/audiobrowser/player/PlayerEngineFactoryTest.kt +36 -0
- package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +268 -0
- package/android/src/test/java/com/audiobrowser/player/SessionErrorMaskTest.kt +68 -0
- package/android/src/test/java/com/audiobrowser/player/StuckRecoveryPolicyTest.kt +40 -0
- package/android/src/test/java/com/audiobrowser/player/TransformingDataSourceTest.kt +193 -0
- package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +107 -0
- package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +73 -0
- package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +75 -0
- package/android/src/test/java/com/audiobrowser/tls/CertFixtures.kt +18 -0
- package/android/src/test/java/com/audiobrowser/util/ArtworkContentProviderTest.kt +163 -0
- package/android/src/test/java/com/audiobrowser/util/ArtworkUrisTest.kt +34 -0
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +28 -0
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderHolderTest.kt +53 -0
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderTest.kt +58 -0
- package/android/src/test/java/com/audiobrowser/util/FakeImageLoader.kt +57 -0
- package/android/src/test/java/com/audiobrowser/util/PlayingStateFactoryTest.kt +40 -0
- package/android/src/test/java/com/audiobrowser/util/RatingFavoritesTest.kt +34 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryBrowseTest.kt +50 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +63 -0
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryRatingTest.kt +35 -0
- package/android/src/test/resources/certs/isrg-root-x1.pem +31 -0
- package/android/src/test/resources/certs/letsencrypt-r13.der +0 -0
- package/android/src/test/resources/certs/letsencrypt-r13.pem +29 -0
- package/android/src/test/resources/certs/stationplaylist-leaf.pem +34 -0
- package/ios/Browser/BrowserConfig.swift +41 -11
- package/ios/Browser/BrowserManager+URLResolution.swift +213 -93
- package/ios/Browser/BrowserManager.swift +303 -110
- package/ios/Browser/BrowserPathHelper.swift +32 -3
- package/ios/Browser/JsonModels.swift +287 -66
- package/ios/Browser/MediaResolveComposer.swift +114 -0
- package/ios/Browser/SearchDrillIn.swift +44 -0
- package/ios/Browser/SectionScope.swift +35 -0
- package/ios/Browser/TabBarEntries.swift +15 -0
- package/ios/CarPlay/CPInterfaceController+Safe.swift +126 -0
- package/ios/CarPlay/CarPlayArtworkResolver.swift +6 -6
- package/ios/CarPlay/CarPlayController.swift +739 -149
- package/ios/CarPlay/CarPlayImageLoader.swift +57 -8
- package/ios/CarPlay/CarPlayListItemFactory.swift +44 -35
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +180 -36
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +19 -0
- package/ios/CarPlay/RNABAudioBrowser.h +15 -10
- package/ios/CarPlay/RNABAudioBrowser.m +15 -14
- package/ios/CarPlay/RNABCarPlaySceneDelegate.m +2 -0
- package/ios/CarPlay/RNABMediaAddHandler.swift +75 -0
- package/ios/CarPlay/RNABMediaAffinityHandler.swift +69 -0
- package/ios/CarPlay/RNABMediaIntentHandler.swift +53 -43
- package/ios/Extension/Capability+RemoteCommand.swift +7 -9
- package/ios/Extension/ChapterMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/NavigationError+Conversion.swift +8 -1
- package/ios/Extension/PlayerCapabilities+Favorite.swift +20 -0
- package/ios/Extension/RequestConfig+Copying.swift +31 -0
- package/ios/Extension/ResolvedTrack+Copying.swift +10 -4
- package/ios/Extension/TimedMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/Track+AVPlayer.swift +4 -4
- package/ios/Extension/Track+Copying.swift +9 -3
- package/ios/Extension/TrackMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/Variant+Artwork.swift +49 -0
- package/ios/HybridAudioBrowser.swift +750 -173
- package/ios/Model/NitroTypeStubs.swift +299 -224
- package/ios/Model/PlayerUpdateOptions.swift +23 -23
- package/ios/Model/RemoteCommand.swift +6 -6
- package/ios/Model/TrackPlayerError.swift +82 -18
- package/ios/NowPlayingInfo/NowPlayingInfoController.swift +99 -121
- package/ios/NowPlayingInfo/SilentAudioPrimer.swift +73 -0
- package/ios/Observer/PlayerItemNotificationObserver.swift +45 -5
- package/ios/Observer/PlayerItemPropertyObserver.swift +27 -4
- package/ios/Observer/PlayerTimeObserver.swift +3 -53
- package/ios/Option/SessionCategories.swift +33 -11
- package/ios/Player/AirPlayStallJudgement.swift +25 -0
- package/ios/Player/EndOfTrackJudgement.swift +32 -0
- package/ios/Player/LoadSeekCoordinator.swift +16 -1
- package/ios/Player/MediaIntentCriteria.swift +139 -0
- package/ios/Player/MediaLoader.swift +28 -10
- package/ios/Player/NowPlayingUpdater.swift +119 -26
- package/ios/Player/PersistedPlaybackState.swift +11 -0
- package/ios/Player/PlaybackCoordinator.swift +282 -51
- package/ios/Player/PlaybackCoordinatorCallbacks.swift +6 -1
- package/ios/Player/PlaybackEffectHandler.swift +19 -9
- package/ios/Player/PlaybackErrorHandler.swift +97 -13
- package/ios/Player/PlaybackStateMachine.swift +18 -13
- package/ios/Player/PlaybackStateStore.swift +27 -0
- package/ios/Player/PlaybackTimer.swift +61 -0
- package/ios/Player/PlayingStateManager.swift +3 -2
- package/ios/Player/QueueManager.swift +67 -61
- package/ios/Player/RetryManager.swift +97 -21
- package/ios/Player/SleepTimerHandling.swift +8 -0
- package/ios/Player/SleepTimerManager.swift +38 -5
- package/ios/Player/VolumeFader.swift +77 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +31 -15
- package/ios/Tests/AirPlayStallJudgementTests.swift +52 -0
- package/ios/Tests/BrowserPathHelperTests.swift +28 -0
- package/ios/Tests/CarPlayArtworkResolverTests.swift +39 -39
- package/ios/Tests/ChapterMetadataAVFoundationTests.swift +2 -2
- package/ios/Tests/EndOfTrackJudgementTests.swift +35 -0
- package/ios/Tests/JsonModelsTests.swift +58 -0
- package/ios/Tests/LoadSeekCoordinatorTests.swift +38 -7
- package/ios/Tests/MediaIntentCriteriaTests.swift +170 -0
- package/ios/Tests/MediaLoaderAssetOptionsTests.swift +46 -0
- package/ios/Tests/MediaLoaderTests.swift +23 -8
- package/ios/Tests/MediaResolveTests.swift +126 -0
- package/ios/Tests/OnceValueTests.swift +79 -0
- package/ios/Tests/PlaybackCoordinatorTests.swift +784 -13
- package/ios/Tests/PlaybackErrorHandlerTests.swift +380 -46
- package/ios/Tests/PlaybackStateMachineTests.swift +33 -8
- package/ios/Tests/PlaybackStateStoreTests.swift +48 -0
- package/ios/Tests/PlaybackTimerTests.swift +55 -0
- package/ios/Tests/PlayingStateManagerTests.swift +57 -0
- package/ios/Tests/QueueManagerTests.swift +149 -18
- package/ios/Tests/ResolvedTrackCopyingTests.swift +15 -8
- package/ios/Tests/RetryManagerTests.swift +89 -0
- package/ios/Tests/SearchDrillInTests.swift +63 -0
- package/ios/Tests/SectionScopeTests.swift +82 -0
- package/ios/Tests/SleepTimerManagerTests.swift +104 -0
- package/ios/Tests/Support/TestTypes.swift +61 -20
- package/ios/Tests/TabBarEntriesTests.swift +71 -0
- package/ios/Tests/TrackSelectorTests.swift +15 -15
- package/ios/TrackPlayer.swift +380 -58
- package/ios/TrackPlayerCallbacks.swift +0 -6
- package/ios/TrackSelector.swift +5 -5
- package/ios/Util/ArtworkImageFetcher.swift +4 -2
- package/ios/Util/NetworkMonitor.swift +7 -3
- package/ios/Util/OnceValue.swift +34 -0
- package/lib/commonjs/features/browser-config.js +227 -0
- package/lib/commonjs/features/browser-config.js.map +1 -0
- package/lib/commonjs/features/browser.js +59 -158
- package/lib/commonjs/features/browser.js.map +1 -1
- package/lib/commonjs/features/carConnection.js +42 -0
- package/lib/commonjs/features/carConnection.js.map +1 -0
- package/lib/commonjs/features/errors.js +34 -2
- package/lib/commonjs/features/errors.js.map +1 -1
- package/lib/commonjs/features/gate.js +149 -0
- package/lib/commonjs/features/gate.js.map +1 -0
- package/lib/commonjs/features/index.js +22 -0
- package/lib/commonjs/features/index.js.map +1 -1
- package/lib/commonjs/features/metadata.js.map +1 -1
- package/lib/commonjs/features/nowPlaying.js +35 -0
- package/lib/commonjs/features/nowPlaying.js.map +1 -1
- package/lib/commonjs/features/output.js +37 -23
- package/lib/commonjs/features/output.js.map +1 -1
- package/lib/commonjs/features/playback/controls.js +9 -0
- package/lib/commonjs/features/playback/controls.js.map +1 -1
- package/lib/commonjs/features/playback/index.js +11 -0
- package/lib/commonjs/features/playback/index.js.map +1 -1
- package/lib/commonjs/features/playback/progress.js +28 -12
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/trackPlaybackTime.js +92 -0
- package/lib/commonjs/features/playback/trackPlaybackTime.js.map +1 -0
- package/lib/commonjs/features/playback/volume.js +1 -1
- package/lib/commonjs/features/player/options.js +49 -13
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +249 -3
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/queue/queue.js +10 -3
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/features/remoteControls.js +1 -12
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/features/sleepTimer.js +9 -4
- package/lib/commonjs/features/sleepTimer.js.map +1 -1
- package/lib/commonjs/native.js +5 -0
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/native.web.js +4 -1
- package/lib/commonjs/native.web.js.map +1 -1
- package/lib/commonjs/utils/LazyNativeEmitter.js +0 -3
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/commonjs/utils/NativeUpdatedValue.js +0 -3
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/commonjs/utils/artwork.js +31 -0
- package/lib/commonjs/utils/artwork.js.map +1 -0
- package/lib/commonjs/web/NativeAudioBrowser.js +301 -124
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +71 -0
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js +34 -0
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Player.js +90 -26
- package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js +21 -0
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +273 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +158 -0
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js +1 -1
- package/lib/commonjs/web/TrackPlayer/RepeatMode.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js +34 -3
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js +75 -0
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/index.js +13 -5
- package/lib/commonjs/web/TrackPlayer/index.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +176 -50
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
- package/lib/commonjs/web/browser/NavigationErrorManager.js +3 -1
- package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/commonjs/web/browser/SearchManager.js +11 -9
- package/lib/commonjs/web/browser/SearchManager.js.map +1 -1
- package/lib/commonjs/web/browser/assertBrowsePageShape.js +22 -0
- package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +1 -0
- package/lib/commonjs/web/browser/classifyTrackNavigation.js +41 -0
- package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +1 -0
- package/lib/commonjs/web/browser/parseSearchResponse.js +20 -0
- package/lib/commonjs/web/browser/parseSearchResponse.js.map +1 -0
- package/lib/commonjs/web/http/HttpClient.js +4 -23
- package/lib/commonjs/web/http/HttpClient.js.map +1 -1
- package/lib/commonjs/web/http/RequestConfigBuilder.js +107 -58
- package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/commonjs/web/playbackErrorKind.js +57 -0
- package/lib/commonjs/web/playbackErrorKind.js.map +1 -0
- package/lib/commonjs/web/player/MediaSessionManager.js +121 -0
- package/lib/commonjs/web/player/MediaSessionManager.js.map +1 -0
- package/lib/commonjs/web/player/NowPlayingManager.js +6 -5
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
- package/lib/commonjs/web/player/OptionsManager.js +9 -17
- package/lib/commonjs/web/player/OptionsManager.js.map +1 -1
- package/lib/commonjs/web/player/RemoteCommandController.js +96 -0
- package/lib/commonjs/web/player/RemoteCommandController.js.map +1 -0
- package/lib/module/features/browser-config.js +221 -0
- package/lib/module/features/browser-config.js.map +1 -0
- package/lib/module/features/browser.js +53 -156
- package/lib/module/features/browser.js.map +1 -1
- package/lib/module/features/carConnection.js +37 -0
- package/lib/module/features/carConnection.js.map +1 -0
- package/lib/module/features/errors.js +34 -2
- package/lib/module/features/errors.js.map +1 -1
- package/lib/module/features/gate.js +144 -0
- package/lib/module/features/gate.js.map +1 -0
- package/lib/module/features/index.js +2 -0
- package/lib/module/features/index.js.map +1 -1
- package/lib/module/features/metadata.js.map +1 -1
- package/lib/module/features/nowPlaying.js +33 -0
- package/lib/module/features/nowPlaying.js.map +1 -1
- package/lib/module/features/output.js +32 -19
- package/lib/module/features/output.js.map +1 -1
- package/lib/module/features/playback/controls.js +8 -0
- package/lib/module/features/playback/controls.js.map +1 -1
- package/lib/module/features/playback/index.js +1 -0
- package/lib/module/features/playback/index.js.map +1 -1
- package/lib/module/features/playback/progress.js +28 -12
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/trackPlaybackTime.js +88 -0
- package/lib/module/features/playback/trackPlaybackTime.js.map +1 -0
- package/lib/module/features/playback/volume.js +1 -1
- package/lib/module/features/player/options.js +48 -13
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +249 -3
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/queue/queue.js +10 -3
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/features/remoteControls.js +0 -11
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/features/sleepTimer.js +9 -4
- package/lib/module/features/sleepTimer.js.map +1 -1
- package/lib/module/native.js +5 -0
- package/lib/module/native.js.map +1 -1
- package/lib/module/native.web.js +4 -1
- package/lib/module/native.web.js.map +1 -1
- package/lib/module/utils/LazyNativeEmitter.js +0 -3
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/module/utils/NativeUpdatedValue.js +0 -3
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/module/utils/artwork.js +26 -0
- package/lib/module/utils/artwork.js.map +1 -0
- package/lib/module/web/NativeAudioBrowser.js +302 -125
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +67 -0
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +1 -0
- package/lib/module/web/TrackPlayer/PlaybackTimer.js +29 -0
- package/lib/module/web/TrackPlayer/PlaybackTimer.js.map +1 -0
- package/lib/module/web/TrackPlayer/Player.js +90 -26
- package/lib/module/web/TrackPlayer/Player.js.map +1 -1
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js +17 -0
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js.map +1 -0
- package/lib/module/web/TrackPlayer/QueueManager.js +269 -0
- package/lib/module/web/TrackPlayer/QueueManager.js.map +1 -0
- package/lib/module/web/TrackPlayer/QueuePlayer.js +154 -0
- package/lib/module/web/TrackPlayer/QueuePlayer.js.map +1 -0
- package/lib/module/web/TrackPlayer/RepeatMode.js +1 -1
- package/lib/module/web/TrackPlayer/RepeatMode.js.map +1 -1
- package/lib/module/web/TrackPlayer/SleepTimer.js +34 -3
- package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/module/web/TrackPlayer/VolumeFader.js +70 -0
- package/lib/module/web/TrackPlayer/VolumeFader.js.map +1 -0
- package/lib/module/web/TrackPlayer/index.js +2 -1
- package/lib/module/web/TrackPlayer/index.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +176 -50
- package/lib/module/web/browser/BrowserManager.js.map +1 -1
- package/lib/module/web/browser/NavigationErrorManager.js +3 -1
- package/lib/module/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/module/web/browser/SearchManager.js +11 -9
- package/lib/module/web/browser/SearchManager.js.map +1 -1
- package/lib/module/web/browser/assertBrowsePageShape.js +18 -0
- package/lib/module/web/browser/assertBrowsePageShape.js.map +1 -0
- package/lib/module/web/browser/classifyTrackNavigation.js +38 -0
- package/lib/module/web/browser/classifyTrackNavigation.js.map +1 -0
- package/lib/module/web/browser/parseSearchResponse.js +16 -0
- package/lib/module/web/browser/parseSearchResponse.js.map +1 -0
- package/lib/module/web/http/HttpClient.js +4 -23
- package/lib/module/web/http/HttpClient.js.map +1 -1
- package/lib/module/web/http/RequestConfigBuilder.js +107 -58
- package/lib/module/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/module/web/playbackErrorKind.js +52 -0
- package/lib/module/web/playbackErrorKind.js.map +1 -0
- package/lib/module/web/player/MediaSessionManager.js +116 -0
- package/lib/module/web/player/MediaSessionManager.js.map +1 -0
- package/lib/module/web/player/NowPlayingManager.js +7 -5
- package/lib/module/web/player/NowPlayingManager.js.map +1 -1
- package/lib/module/web/player/OptionsManager.js +9 -17
- package/lib/module/web/player/OptionsManager.js.map +1 -1
- package/lib/module/web/player/RemoteCommandController.js +92 -0
- package/lib/module/web/player/RemoteCommandController.js.map +1 -0
- package/lib/typescript/src/features/browser-config.d.ts +12 -0
- package/lib/typescript/src/features/browser-config.d.ts.map +1 -0
- package/lib/typescript/src/features/browser.d.ts +40 -1
- package/lib/typescript/src/features/browser.d.ts.map +1 -1
- package/lib/typescript/src/features/carConnection.d.ts +20 -0
- package/lib/typescript/src/features/carConnection.d.ts.map +1 -0
- package/lib/typescript/src/features/errors.d.ts +58 -3
- package/lib/typescript/src/features/errors.d.ts.map +1 -1
- package/lib/typescript/src/features/gate.d.ts +77 -0
- package/lib/typescript/src/features/gate.d.ts.map +1 -0
- package/lib/typescript/src/features/index.d.ts +2 -0
- package/lib/typescript/src/features/index.d.ts.map +1 -1
- package/lib/typescript/src/features/metadata.d.ts +6 -4
- package/lib/typescript/src/features/metadata.d.ts.map +1 -1
- package/lib/typescript/src/features/nowPlaying.d.ts +27 -0
- package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -1
- package/lib/typescript/src/features/output.d.ts +28 -18
- package/lib/typescript/src/features/output.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/controls.d.ts +5 -0
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/index.d.ts +1 -0
- package/lib/typescript/src/features/playback/index.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts +3 -0
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +34 -0
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +1 -0
- package/lib/typescript/src/features/playback/volume.d.ts +1 -1
- package/lib/typescript/src/features/player/options.d.ts +92 -93
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts +206 -167
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +9 -2
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/features/remoteControls.d.ts +0 -13
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/features/sleepTimer.d.ts +18 -3
- package/lib/typescript/src/features/sleepTimer.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/native.d.ts +1 -2
- package/lib/typescript/src/native.d.ts.map +1 -1
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts +17 -225
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-native.d.ts +9 -3
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +145 -13
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +349 -85
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +0 -2
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +0 -2
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
- package/lib/typescript/src/utils/artwork.d.ts +19 -0
- package/lib/typescript/src/utils/artwork.d.ts.map +1 -0
- package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -1
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +3 -1
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +24 -10
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +6 -6
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +1 -11
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +33 -1
- package/nitrogen/generated/android/c++/JArtworkVariants.hpp +61 -0
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +5 -0
- package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +3 -3
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +58 -0
- package/nitrogen/generated/android/c++/JFavoritesMatchMode.hpp +58 -0
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +100 -0
- package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +3 -2
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.hpp +112 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +121 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +123 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +133 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +121 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.hpp +139 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.hpp +134 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +8 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +131 -0
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_GateEvent.hpp +79 -0
- package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +0 -10
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +9 -4
- package/nitrogen/generated/android/c++/JFunc_void_Output.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +2 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +10 -10
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +6 -0
- package/nitrogen/generated/android/c++/JGate.hpp +62 -0
- package/nitrogen/generated/android/c++/JGateDecision.hpp +64 -0
- package/nitrogen/generated/android/c++/{JThumbsRating.hpp → JGateEvent.hpp} +16 -15
- package/nitrogen/generated/android/c++/JGateReason.hpp +58 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +236 -212
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +25 -22
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +95 -0
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +33 -3
- package/nitrogen/generated/android/c++/JMediaReference.hpp +58 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +33 -1
- package/nitrogen/generated/android/c++/{JPartialAndroidSetupPlayerOptions.hpp → JNativeAndroidSetupOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +61 -28
- package/nitrogen/generated/android/c++/JNativeGateRequest.hpp +74 -0
- package/nitrogen/generated/android/c++/{JPartialIOSSetupPlayerOptions.hpp → JNativeIOSSetupOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +20 -9
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +182 -0
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +16 -19
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +6 -0
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +1 -11
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +96 -0
- package/nitrogen/generated/android/c++/JNotificationButton.hpp +3 -3
- package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +3 -17
- package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +7 -3
- package/nitrogen/generated/android/c++/JOptions.hpp +14 -9
- package/nitrogen/generated/android/c++/{JIosOutput.hpp → JOutput.hpp} +15 -15
- package/nitrogen/generated/android/c++/JOutputType.hpp +82 -0
- package/nitrogen/generated/android/c++/JPlayback.hpp +2 -0
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JPlaybackError.hpp +18 -3
- package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +2 -0
- package/nitrogen/generated/android/c++/JPlaybackErrorKind.hpp +76 -0
- package/nitrogen/generated/android/c++/JPlaybackState.hpp +3 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +11 -5
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +23 -5
- package/nitrogen/generated/android/c++/JRetryConfig.hpp +11 -7
- package/nitrogen/generated/android/c++/JSearchMode.hpp +27 -9
- package/nitrogen/generated/android/c++/JSearchParams.hpp +9 -3
- package/nitrogen/generated/android/c++/JStallReason.hpp +58 -0
- package/nitrogen/generated/android/c++/JTrack.hpp +23 -5
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +6 -0
- package/nitrogen/generated/android/c++/JTrackRequest.hpp +93 -0
- package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +14 -1
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +71 -0
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.cpp +41 -0
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +121 -0
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.hpp +70 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +2 -8
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +10 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkVariants.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{ThumbsRating.kt → FavoriteConfig.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{RatingType.kt → FavoritesMatchMode.kt} +5 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNowPlayingParams.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormattedNavigationError.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___Track.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_std__string____Track.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt → Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.kt} +12 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_RemoteSetRatingEvent.kt → Func_void_GateEvent.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_IosOutput.kt → Func_void_Output.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{HeartRating.kt → Gate.kt} +9 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{PercentageRating.kt → GateDecision.kt} +9 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{StarRating.kt → GateEvent.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/GateReason.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +103 -109
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +24 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaReference.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +10 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{PartialAndroidSetupPlayerOptions.kt → NativeAndroidSetupOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +18 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{RemoteSetRatingEvent.kt → NativeGateRequest.kt} +12 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{PartialIOSSetupPlayerOptions.kt → NativeIOSSetupOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeSetupPlayerOptions.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +2 -8
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +3 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{IosOutput.kt → Output.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/OutputType.kt +31 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorKind.kt +29 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +7 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +12 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StallReason.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +12 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackRequest.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +7 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.kt +65 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_String_ArtworkVariants.kt +53 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +139 -28
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +1098 -447
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +60 -39
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +170 -112
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +8 -8
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +2 -12
- package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +95 -1
- package/nitrogen/generated/ios/swift/ArtworkVariants.swift +34 -0
- package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +4 -4
- package/nitrogen/generated/ios/swift/FavoriteConfig.swift +29 -0
- package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +40 -0
- package/nitrogen/generated/ios/swift/FormatNowPlayingParams.swift +67 -0
- package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +17 -4
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.swift +54 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +69 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___Track.swift +54 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.swift +60 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_std__string____Track.swift +60 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.swift +77 -0
- package/nitrogen/generated/ios/swift/Func_void_GateDecision.swift +46 -0
- package/nitrogen/generated/ios/swift/{Func_void_RemoteSetRatingEvent.swift → Func_void_GateEvent.swift} +10 -10
- package/nitrogen/generated/ios/swift/{Func_void_IosOutput.swift → Func_void_Output.swift} +10 -10
- package/nitrogen/generated/ios/swift/Func_void_TransformableRequestConfig.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NowPlayingUpdate_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +53 -0
- package/nitrogen/generated/ios/swift/{Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift → Func_void_std__shared_ptr_Promise_GateDecision__.swift} +17 -17
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_TransformableRequestConfig__.swift +66 -0
- package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError____.swift +81 -0
- package/nitrogen/generated/ios/swift/Gate.swift +47 -0
- package/nitrogen/generated/ios/swift/GateDecision.swift +40 -0
- package/nitrogen/generated/ios/swift/GateEvent.swift +29 -0
- package/nitrogen/generated/ios/swift/GateReason.swift +40 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +20 -14
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +230 -197
- package/nitrogen/generated/ios/swift/IOSOptions.swift +51 -0
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +121 -2
- package/nitrogen/generated/ios/swift/MediaReference.swift +40 -0
- package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +107 -1
- package/nitrogen/generated/ios/swift/{PartialAndroidSetupPlayerOptions.swift → NativeAndroidSetupOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +161 -22
- package/nitrogen/generated/ios/swift/NativeGateRequest.swift +58 -0
- package/nitrogen/generated/ios/swift/{PartialIOSSetupPlayerOptions.swift → NativeIOSSetupOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +19 -19
- package/nitrogen/generated/ios/swift/NativeSetupPlayerOptions.swift +206 -0
- package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +12 -25
- package/nitrogen/generated/ios/swift/NavigationErrorType.swift +8 -0
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +1 -30
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +90 -0
- package/nitrogen/generated/ios/swift/NotificationButton.swift +4 -4
- package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +1 -48
- package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +19 -1
- package/nitrogen/generated/ios/swift/Options.swift +10 -4
- package/nitrogen/generated/ios/swift/{IosOutput.swift → Output.swift} +7 -7
- package/nitrogen/generated/ios/swift/OutputType.swift +72 -0
- package/nitrogen/generated/ios/swift/PlaybackError.swift +43 -2
- package/nitrogen/generated/ios/swift/PlaybackErrorKind.swift +64 -0
- package/nitrogen/generated/ios/swift/PlaybackState.swift +4 -4
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +27 -8
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +74 -8
- package/nitrogen/generated/ios/swift/RetryConfig.swift +35 -4
- package/nitrogen/generated/ios/swift/SearchMode.swift +36 -12
- package/nitrogen/generated/ios/swift/SearchParams.swift +7 -2
- package/nitrogen/generated/ios/swift/StallReason.swift +40 -0
- package/nitrogen/generated/ios/swift/Track.swift +74 -8
- package/nitrogen/generated/ios/swift/TrackRequest.swift +106 -0
- package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +60 -1
- package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.swift +19 -0
- package/nitrogen/generated/ios/swift/Variant_String_ArtworkVariants.swift +18 -0
- package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +10 -10
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +1 -12
- package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +10 -2
- package/nitrogen/generated/shared/c++/ArtworkVariants.hpp +87 -0
- package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +6 -6
- package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +0 -2
- package/nitrogen/generated/shared/c++/{StarRating.hpp → FavoriteConfig.hpp} +18 -17
- package/nitrogen/generated/shared/c++/FavoritesMatchMode.hpp +76 -0
- package/nitrogen/generated/shared/c++/FormatNowPlayingParams.hpp +110 -0
- package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +6 -5
- package/nitrogen/generated/shared/c++/{HeartRating.hpp → Gate.hpp} +21 -16
- package/nitrogen/generated/shared/c++/{ThumbsRating.hpp → GateDecision.hpp} +23 -17
- package/nitrogen/generated/shared/c++/{PercentageRating.hpp → GateEvent.hpp} +18 -17
- package/nitrogen/generated/shared/c++/GateReason.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +21 -18
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +44 -35
- package/nitrogen/generated/shared/c++/IOSOptions.hpp +91 -0
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +33 -2
- package/nitrogen/generated/shared/c++/MediaReference.hpp +76 -0
- package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +10 -2
- package/nitrogen/generated/shared/c++/{PartialAndroidSetupPlayerOptions.hpp → NativeAndroidSetupOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +31 -15
- package/nitrogen/generated/shared/c++/NativeGateRequest.hpp +97 -0
- package/nitrogen/generated/shared/c++/{PartialIOSSetupPlayerOptions.hpp → NativeIOSSetupOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +5 -5
- package/nitrogen/generated/shared/c++/NativeSetupPlayerOptions.hpp +138 -0
- package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +9 -7
- package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +8 -0
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +1 -12
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +92 -0
- package/nitrogen/generated/shared/c++/NotificationButton.hpp +8 -8
- package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +3 -19
- package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +6 -2
- package/nitrogen/generated/shared/c++/Options.hpp +8 -8
- package/nitrogen/generated/shared/c++/{IosOutput.hpp → Output.hpp} +18 -18
- package/nitrogen/generated/shared/c++/OutputType.hpp +108 -0
- package/nitrogen/generated/shared/c++/PlaybackError.hpp +18 -3
- package/nitrogen/generated/shared/c++/PlaybackErrorKind.hpp +100 -0
- package/nitrogen/generated/shared/c++/PlaybackState.hpp +9 -9
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +9 -6
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +24 -5
- package/nitrogen/generated/shared/c++/RetryConfig.hpp +10 -6
- package/nitrogen/generated/shared/c++/SearchMode.hpp +39 -15
- package/nitrogen/generated/shared/c++/SearchParams.hpp +9 -2
- package/nitrogen/generated/shared/c++/StallReason.hpp +76 -0
- package/nitrogen/generated/shared/c++/Track.hpp +24 -5
- package/nitrogen/generated/shared/c++/TrackRequest.hpp +93 -0
- package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +6 -2
- package/package.json +11 -6
- package/src/codegen-no-config-variant.test.ts +70 -0
- package/src/features/browser-config.test.ts +110 -0
- package/src/features/browser-config.ts +293 -0
- package/src/features/browser.test.ts +19 -0
- package/src/features/browser.ts +58 -201
- package/src/features/carConnection.ts +36 -0
- package/src/features/errors.ts +68 -2
- package/src/features/gate.test.ts +72 -0
- package/src/features/gate.ts +155 -0
- package/src/features/index.ts +2 -0
- package/src/features/metadata.ts +6 -12
- package/src/features/nowPlaying.ts +36 -0
- package/src/features/output.ts +35 -22
- package/src/features/playback/controls.ts +8 -0
- package/src/features/playback/index.ts +1 -0
- package/src/features/playback/progress.ts +31 -12
- package/src/features/playback/trackPlaybackTime.test.ts +66 -0
- package/src/features/playback/trackPlaybackTime.ts +106 -0
- package/src/features/playback/volume.ts +1 -1
- package/src/features/player/options.test.ts +38 -0
- package/src/features/player/options.ts +140 -75
- package/src/features/player/setup.test.ts +117 -0
- package/src/features/player/setup.ts +390 -175
- package/src/features/queue/queue.test.ts +36 -0
- package/src/features/queue/queue.ts +15 -4
- package/src/features/remoteControls.ts +0 -23
- package/src/features/sleepTimer.ts +23 -4
- package/src/native.ts +5 -0
- package/src/native.web.ts +4 -1
- package/src/specs/audio-browser.nitro.ts +131 -41
- package/src/types/browser-native.ts +19 -6
- package/src/types/browser-nodes.ts +160 -13
- package/src/types/browser.ts +377 -89
- package/src/utils/LazyNativeEmitter.ts +0 -2
- package/src/utils/NativeUpdatedValue.ts +0 -2
- package/src/utils/artwork.ts +30 -0
- package/src/web/NativeAudioBrowser.playWhenReady.test.ts +301 -0
- package/src/web/NativeAudioBrowser.ts +365 -158
- package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +139 -0
- package/src/web/TrackPlayer/PlaybackStateMachine.ts +82 -0
- package/src/web/TrackPlayer/PlaybackTimer.test.ts +67 -0
- package/src/web/TrackPlayer/PlaybackTimer.ts +33 -0
- package/src/web/TrackPlayer/Player.dispatch.test.ts +229 -0
- package/src/web/TrackPlayer/Player.load.test.ts +86 -0
- package/src/web/TrackPlayer/Player.ts +113 -39
- package/src/web/TrackPlayer/PlayingStateFactory.test.ts +51 -0
- package/src/web/TrackPlayer/PlayingStateFactory.ts +24 -0
- package/src/web/TrackPlayer/QueueManager.test.ts +289 -0
- package/src/web/TrackPlayer/QueueManager.ts +302 -0
- package/src/web/TrackPlayer/QueuePlayer.ts +188 -0
- package/src/web/TrackPlayer/RepeatMode.ts +1 -1
- package/src/web/TrackPlayer/SleepTimer.ts +38 -3
- package/src/web/TrackPlayer/VolumeFader.ts +74 -0
- package/src/web/TrackPlayer/index.ts +2 -1
- package/src/web/browser/BrowserManager.ts +231 -62
- package/src/web/browser/NavigationErrorManager.ts +3 -1
- package/src/web/browser/SearchManager.ts +11 -15
- package/src/web/browser/__tests__/layer-resolver.test.ts +69 -0
- package/src/web/browser/assertBrowsePageShape.test.ts +27 -0
- package/src/web/browser/assertBrowsePageShape.ts +27 -0
- package/src/web/browser/classifyTrackNavigation.test.ts +41 -0
- package/src/web/browser/classifyTrackNavigation.ts +35 -0
- package/src/web/browser/parseSearchResponse.test.ts +25 -0
- package/src/web/browser/parseSearchResponse.ts +15 -0
- package/src/web/http/HttpClient.ts +5 -35
- package/src/web/http/RequestConfigBuilder.test.ts +59 -0
- package/src/web/http/RequestConfigBuilder.ts +120 -63
- package/src/web/playbackErrorKind.test.ts +55 -0
- package/src/web/playbackErrorKind.ts +56 -0
- package/src/web/player/MediaSessionManager.test.ts +220 -0
- package/src/web/player/MediaSessionManager.ts +151 -0
- package/src/web/player/NowPlayingManager.test.ts +46 -0
- package/src/web/player/NowPlayingManager.ts +6 -5
- package/src/web/player/OptionsManager.ts +12 -18
- package/src/web/player/RemoteCommandController.test.ts +171 -0
- package/src/web/player/RemoteCommandController.ts +166 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +0 -59
- package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +0 -72
- package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +0 -36
- package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +0 -146
- package/ios/CarPlay/Track+CarPlay.swift +0 -63
- package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +0 -9
- package/ios/Player/PlaybackProgressUpdateManager.swift +0 -68
- package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +0 -166
- package/lib/commonjs/features/rating.js +0 -2
- package/lib/commonjs/features/rating.js.map +0 -1
- package/lib/commonjs/types/player.js +0 -2
- package/lib/commonjs/types/player.js.map +0 -1
- package/lib/commonjs/web/SimpleRouter.test.js +0 -174
- package/lib/commonjs/web/SimpleRouter.test.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +0 -293
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js.map +0 -1
- package/lib/module/features/rating.js +0 -2
- package/lib/module/features/rating.js.map +0 -1
- package/lib/module/types/player.js +0 -2
- package/lib/module/types/player.js.map +0 -1
- package/lib/module/web/SimpleRouter.test.js +0 -174
- package/lib/module/web/SimpleRouter.test.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js +0 -288
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js.map +0 -1
- package/lib/typescript/src/features/rating.d.ts +0 -14
- package/lib/typescript/src/features/rating.d.ts.map +0 -1
- package/lib/typescript/src/native.web.d.ts +0 -3
- package/lib/typescript/src/native.web.d.ts.map +0 -1
- package/lib/typescript/src/types/player.d.ts +0 -64
- package/lib/typescript/src/types/player.d.ts.map +0 -1
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +0 -188
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +0 -1
- package/lib/typescript/src/web/SimpleRouter.d.ts +0 -40
- package/lib/typescript/src/web/SimpleRouter.d.ts.map +0 -1
- package/lib/typescript/src/web/SimpleRouter.test.d.ts +0 -2
- package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts +0 -11
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts +0 -59
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +0 -39
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +0 -6
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +0 -4
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +0 -34
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/State.d.ts +0 -13
- package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +0 -1
- package/lib/typescript/src/web/TrackPlayer/index.d.ts +0 -5
- package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/BrowserManager.d.ts +0 -154
- package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts +0 -42
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +0 -40
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +0 -1
- package/lib/typescript/src/web/browser/SearchManager.d.ts +0 -22
- package/lib/typescript/src/web/browser/SearchManager.d.ts.map +0 -1
- package/lib/typescript/src/web/http/HttpClient.d.ts +0 -25
- package/lib/typescript/src/web/http/HttpClient.d.ts.map +0 -1
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +0 -98
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +0 -1
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts +0 -34
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +0 -1
- package/lib/typescript/src/web/player/OptionsManager.d.ts +0 -32
- package/lib/typescript/src/web/player/OptionsManager.d.ts.map +0 -1
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +0 -69
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +0 -1
- package/lib/typescript/src/web/util/shuffle.d.ts +0 -8
- package/lib/typescript/src/web/util/shuffle.d.ts.map +0 -1
- package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +0 -86
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +0 -147
- package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +0 -80
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +0 -87
- package/nitrogen/generated/android/c++/JHeartRating.hpp +0 -57
- package/nitrogen/generated/android/c++/JIosOutputType.hpp +0 -85
- package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +0 -96
- package/nitrogen/generated/android/c++/JPercentageRating.hpp +0 -57
- package/nitrogen/generated/android/c++/JRatingType.hpp +0 -73
- package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +0 -66
- package/nitrogen/generated/android/c++/JStarRating.hpp +0 -57
- package/nitrogen/generated/android/c++/JUpdateOptions.hpp +0 -105
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +0 -34
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +0 -105
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +0 -32
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +0 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +0 -53
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +0 -77
- package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +0 -119
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +0 -68
- package/nitrogen/generated/ios/swift/HeartRating.swift +0 -29
- package/nitrogen/generated/ios/swift/IosOutputType.swift +0 -76
- package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +0 -101
- package/nitrogen/generated/ios/swift/PercentageRating.swift +0 -29
- package/nitrogen/generated/ios/swift/RatingType.swift +0 -60
- package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +0 -58
- package/nitrogen/generated/ios/swift/StarRating.swift +0 -29
- package/nitrogen/generated/ios/swift/ThumbsRating.swift +0 -29
- package/nitrogen/generated/ios/swift/UpdateOptions.swift +0 -143
- package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +0 -20
- package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +0 -109
- package/nitrogen/generated/shared/c++/IosOutputType.hpp +0 -112
- package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +0 -104
- package/nitrogen/generated/shared/c++/RatingType.hpp +0 -96
- package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +0 -94
- package/nitrogen/generated/shared/c++/UpdateOptions.hpp +0 -111
- package/src/features/rating.ts +0 -17
- package/src/types/player.ts +0 -69
- package/src/web/TrackPlayer/PlaylistPlayer.ts +0 -346
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package com.audiobrowser.util
|
|
2
|
+
|
|
3
|
+
import android.net.Uri
|
|
4
|
+
import java.security.MessageDigest
|
|
5
|
+
|
|
6
|
+
/** Builds and parses the opaque `content://<pkg>.audiobrowser.artwork/art/<token>` URIs. */
|
|
7
|
+
object ArtworkUris {
|
|
8
|
+
const val AUTHORITY_SUFFIX = "audiobrowser.artwork"
|
|
9
|
+
private const val PATH = "art"
|
|
10
|
+
|
|
11
|
+
fun authorityFor(packageName: String): String = "$packageName.$AUTHORITY_SUFFIX"
|
|
12
|
+
|
|
13
|
+
/** Stable, opaque token for a resolved artwork URL (SHA-256 hex). */
|
|
14
|
+
fun tokenFor(url: String): String {
|
|
15
|
+
val digest = MessageDigest.getInstance("SHA-256").digest(url.toByteArray(Charsets.UTF_8))
|
|
16
|
+
return digest.joinToString("") { "%02x".format(it) }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
fun contentUri(authority: String, token: String): String = "content://$authority/$PATH/$token"
|
|
20
|
+
|
|
21
|
+
/** The `<token>` for a `…/art/<token>` content URI, or null if the shape is wrong. */
|
|
22
|
+
fun parseToken(uri: Uri): String? {
|
|
23
|
+
if (uri.scheme != "content") return null
|
|
24
|
+
val segments = uri.pathSegments
|
|
25
|
+
if (segments.size != 2 || segments[0] != PATH) return null
|
|
26
|
+
return segments[1].takeIf { it.isNotEmpty() }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
package com.audiobrowser.util
|
|
2
|
+
|
|
3
|
+
import com.margelo.nitro.audiobrowser.Variant_String_ArtworkVariants
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Reading `Track.artwork`, which is either one URL or a URL per appearance.
|
|
7
|
+
*
|
|
8
|
+
* Android Auto is dark-only, so there is nothing here to choose: a pair always
|
|
9
|
+
* resolves to its dark URL, which is also what a single-URL track would have
|
|
10
|
+
* shipped. The per-appearance half of the feature is iOS/CarPlay only — see
|
|
11
|
+
* `ios/Extension/Variant+Artwork.swift`, where both URLs are kept so a
|
|
12
|
+
* `UIImageAsset` can swap them without a re-fetch.
|
|
13
|
+
*/
|
|
14
|
+
val Variant_String_ArtworkVariants.url: String
|
|
15
|
+
get() = match(first = { it }, second = { it.dark })
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Wraps a plain URL as the single-URL side of the union.
|
|
19
|
+
*
|
|
20
|
+
* For the places that build a `Track` from something that only ever has one
|
|
21
|
+
* image — restored persistence, a `MediaMetadata` handed back by the platform.
|
|
22
|
+
* Restoring collapses a pair to its dark URL, which costs nothing here: Android
|
|
23
|
+
* Auto would have rendered that one anyway.
|
|
24
|
+
*/
|
|
25
|
+
fun artworkOf(url: String?): Variant_String_ArtworkVariants? =
|
|
26
|
+
url?.let { Variant_String_ArtworkVariants.First(it) }
|
|
@@ -32,6 +32,12 @@ object BrowserPathHelper {
|
|
|
32
32
|
/** Offline error placeholder media ID */
|
|
33
33
|
const val OFFLINE_PATH = "/__offline"
|
|
34
34
|
|
|
35
|
+
/** Generic browse error placeholder media ID */
|
|
36
|
+
const val ERROR_PATH = "/__error"
|
|
37
|
+
|
|
38
|
+
/** Browse Gate placeholder media ID (subscription/login/region block) */
|
|
39
|
+
const val GATE_PATH = "/__gate"
|
|
40
|
+
|
|
35
41
|
// Query parameter name for contextual track identifiers
|
|
36
42
|
private const val CONTEXTUAL_TRACK_PARAM = "__trackId"
|
|
37
43
|
|
|
@@ -152,4 +158,22 @@ object BrowserPathHelper {
|
|
|
152
158
|
val normalizedPath = path.trimStart('/')
|
|
153
159
|
return "$normalizedBase$normalizedPath"
|
|
154
160
|
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* True if [segment] appears in [path] as a complete path segment — bounded on the left by the
|
|
164
|
+
* string start or `/`, and on the right by the string end or one of `/`, `?`, `#`.
|
|
165
|
+
*/
|
|
166
|
+
fun containsSegment(path: String, segment: String): Boolean {
|
|
167
|
+
if (segment.isEmpty()) return false
|
|
168
|
+
var from = 0
|
|
169
|
+
while (true) {
|
|
170
|
+
val idx = path.indexOf(segment, from)
|
|
171
|
+
if (idx < 0) return false
|
|
172
|
+
val beforeOk = idx == 0 || path[idx - 1] == '/'
|
|
173
|
+
val end = idx + segment.length
|
|
174
|
+
val afterOk = end == path.length || path[end] == '/' || path[end] == '?' || path[end] == '#'
|
|
175
|
+
if (beforeOk && afterOk) return true
|
|
176
|
+
from = idx + 1
|
|
177
|
+
}
|
|
178
|
+
}
|
|
155
179
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
package com.audiobrowser.util
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Bitmap
|
|
5
|
+
import coil3.ImageLoader
|
|
6
|
+
import coil3.network.NetworkHeaders
|
|
7
|
+
import coil3.network.httpHeaders
|
|
8
|
+
import coil3.request.ImageRequest
|
|
9
|
+
import coil3.request.allowHardware
|
|
10
|
+
import coil3.svg.SvgDecoder
|
|
11
|
+
import coil3.toBitmap
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Shared "resolved source → Bitmap" core. Used by both [CoilBitmapLoader] (now-playing) and
|
|
15
|
+
* [ArtworkContentProvider] (browse). Adds `.size()` so raster decodes are downsampled to the hint
|
|
16
|
+
* (the prior loadBitmap path decoded at full resolution). SVG is forced via [isSvg], carried from
|
|
17
|
+
* build time rather than re-derived from a possibly-suffixless transformed URL.
|
|
18
|
+
*/
|
|
19
|
+
class CoilArtworkLoader(
|
|
20
|
+
private val context: Context,
|
|
21
|
+
private val imageLoader: ImageLoader,
|
|
22
|
+
private val defaultSizePixels: Int = 512,
|
|
23
|
+
) {
|
|
24
|
+
suspend fun load(
|
|
25
|
+
finalUrl: String,
|
|
26
|
+
headers: Map<String, String>?,
|
|
27
|
+
sizeHintPixels: Int?,
|
|
28
|
+
isSvg: Boolean,
|
|
29
|
+
): Bitmap {
|
|
30
|
+
val builder =
|
|
31
|
+
ImageRequest.Builder(context)
|
|
32
|
+
.data(finalUrl)
|
|
33
|
+
.size(sizeHintPixels ?: defaultSizePixels)
|
|
34
|
+
.allowHardware(false) // required for Media3 notification compatibility
|
|
35
|
+
|
|
36
|
+
if (!headers.isNullOrEmpty()) {
|
|
37
|
+
val net = NetworkHeaders.Builder()
|
|
38
|
+
headers.forEach { (k, v) -> net.add(k, v) }
|
|
39
|
+
builder.httpHeaders(net.build())
|
|
40
|
+
}
|
|
41
|
+
if (isSvg) {
|
|
42
|
+
builder.decoderFactory { result, options, _ -> SvgDecoder(result.source, options) }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
val result = imageLoader.execute(builder.build())
|
|
46
|
+
return result.image?.toBitmap()
|
|
47
|
+
?: throw IllegalStateException("Failed to decode artwork from $finalUrl")
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
package com.audiobrowser.util
|
|
2
|
+
|
|
3
|
+
import com.audiobrowser.browser.BrowseArtworkRegistry
|
|
4
|
+
import kotlinx.coroutines.CoroutineScope
|
|
5
|
+
|
|
6
|
+
/** Dependencies the exported [ArtworkContentProvider] needs, published by the media Service. */
|
|
7
|
+
data class ArtworkProviderDeps(
|
|
8
|
+
val loader: CoilArtworkLoader,
|
|
9
|
+
val registry: BrowseArtworkRegistry,
|
|
10
|
+
val scope: CoroutineScope,
|
|
11
|
+
val artworkSizeHint: () -> Int? = { null },
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Process-wide handoff between the media Service (which builds the deps) and the ContentProvider
|
|
16
|
+
* (which the OS may instantiate before the Service exists). `@Volatile` publishes the reference
|
|
17
|
+
* safely across the binder/main threads.
|
|
18
|
+
*/
|
|
19
|
+
object CoilArtworkLoaderHolder {
|
|
20
|
+
@Volatile private var deps: ArtworkProviderDeps? = null
|
|
21
|
+
|
|
22
|
+
fun set(deps: ArtworkProviderDeps) {
|
|
23
|
+
this.deps = deps
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
fun get(): ArtworkProviderDeps? = deps
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Clears only if [deps] is still the current one — prevents a stale Service from blanking a
|
|
30
|
+
* newer.
|
|
31
|
+
*/
|
|
32
|
+
@Synchronized
|
|
33
|
+
fun clearIf(deps: ArtworkProviderDeps) {
|
|
34
|
+
if (this.deps === deps) this.deps = null
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -7,25 +7,12 @@ import android.net.Uri
|
|
|
7
7
|
import androidx.media3.common.util.BitmapLoader
|
|
8
8
|
import androidx.media3.common.util.UnstableApi
|
|
9
9
|
import coil3.ImageLoader
|
|
10
|
-
import coil3.network.NetworkHeaders
|
|
11
|
-
import coil3.network.httpHeaders
|
|
12
|
-
import coil3.request.ImageRequest
|
|
13
|
-
import coil3.request.allowHardware
|
|
14
|
-
import coil3.svg.SvgDecoder
|
|
15
|
-
import coil3.toBitmap
|
|
16
|
-
import com.audiobrowser.http.RequestConfigBuilder
|
|
17
10
|
import com.google.common.util.concurrent.ListenableFuture
|
|
18
11
|
import com.google.common.util.concurrent.SettableFuture
|
|
19
|
-
import com.margelo.nitro.audiobrowser.ArtworkRequestConfig
|
|
20
|
-
import com.margelo.nitro.audiobrowser.ImageContext
|
|
21
12
|
import com.margelo.nitro.audiobrowser.ImageSource
|
|
22
|
-
import com.margelo.nitro.audiobrowser.MediaTransformParams
|
|
23
|
-
import com.margelo.nitro.audiobrowser.RequestConfig
|
|
24
|
-
import com.margelo.nitro.audiobrowser.Track
|
|
25
13
|
import kotlinx.coroutines.CoroutineScope
|
|
26
14
|
import kotlinx.coroutines.Dispatchers
|
|
27
15
|
import kotlinx.coroutines.launch
|
|
28
|
-
import kotlinx.coroutines.runBlocking
|
|
29
16
|
import timber.log.Timber
|
|
30
17
|
|
|
31
18
|
/**
|
|
@@ -40,7 +27,9 @@ import timber.log.Timber
|
|
|
40
27
|
*
|
|
41
28
|
* @param context Android context
|
|
42
29
|
* @param imageLoader Coil ImageLoader instance (should be shared app-wide)
|
|
43
|
-
* @param
|
|
30
|
+
* @param resolveDisplayArtwork Track-first display-time artwork resolution (see
|
|
31
|
+
* Player.resolveDisplayArtwork). Returns the fetchable ImageSource for a URI Media3 hands us, or
|
|
32
|
+
* null when the URI is not ours to transform (it is then fetched as-is).
|
|
44
33
|
* @param getArtworkSizeHint Callback to get the recommended artwork size in pixels from the media
|
|
45
34
|
* browser (e.g., Android Auto)
|
|
46
35
|
*/
|
|
@@ -48,20 +37,19 @@ import timber.log.Timber
|
|
|
48
37
|
class CoilBitmapLoader(
|
|
49
38
|
private val context: Context,
|
|
50
39
|
private val imageLoader: ImageLoader,
|
|
51
|
-
private val
|
|
40
|
+
private val resolveDisplayArtwork: suspend (uri: String, sizeHintPixels: Int?) -> ImageSource?,
|
|
52
41
|
private val getArtworkSizeHint: () -> Int? = { null },
|
|
53
42
|
) : BitmapLoader {
|
|
54
43
|
|
|
55
44
|
private val scope = CoroutineScope(Dispatchers.IO)
|
|
56
45
|
|
|
57
46
|
/**
|
|
58
|
-
* Default artwork size in pixels when no hint is provided by the media browser.
|
|
59
|
-
*
|
|
47
|
+
* Default artwork size in pixels when no hint is provided by the media browser. Lock screen media
|
|
48
|
+
* controls are ~128dp, at 4x density (xxxhdpi) = 512px.
|
|
60
49
|
*/
|
|
61
50
|
private val defaultArtworkSizePixels = 512
|
|
62
51
|
|
|
63
|
-
|
|
64
|
-
data class ArtworkConfig(val baseConfig: RequestConfig?, val artworkConfig: ArtworkRequestConfig?)
|
|
52
|
+
private val core = CoilArtworkLoader(context, imageLoader, defaultArtworkSizePixels)
|
|
65
53
|
|
|
66
54
|
override fun supportsMimeType(mimeType: String): Boolean {
|
|
67
55
|
return mimeType.startsWith("image/") ||
|
|
@@ -89,46 +77,31 @@ class CoilBitmapLoader(
|
|
|
89
77
|
|
|
90
78
|
scope.launch {
|
|
91
79
|
try {
|
|
92
|
-
val
|
|
80
|
+
val originalUrl = uri.toString()
|
|
93
81
|
// Use hint from media browser (Android Auto), or fall back to screen-based size
|
|
94
82
|
val sizeHint = getArtworkSizeHint() ?: defaultArtworkSizePixels
|
|
95
83
|
|
|
96
|
-
|
|
84
|
+
// Track-first resolution (registry / queue lookup). Null → the URI was not
|
|
85
|
+
// produced by us (or predates the registry): fetch it as-is, never
|
|
86
|
+
// re-transform a URL we cannot attribute.
|
|
87
|
+
val source =
|
|
88
|
+
try {
|
|
89
|
+
resolveDisplayArtwork(originalUrl, sizeHint)
|
|
90
|
+
} catch (e: Exception) {
|
|
91
|
+
Timber.e(e, "Display artwork resolution failed for $originalUrl")
|
|
92
|
+
null
|
|
93
|
+
}
|
|
94
|
+
val finalUrl = source?.uri ?: originalUrl
|
|
95
|
+
val headers = source?.headers?.toMap() ?: emptyMap()
|
|
97
96
|
|
|
98
97
|
// Check if this is an SVG that needs special decoding
|
|
99
98
|
val isSvg = SvgArtworkRenderer.isSvgUrl(finalUrl)
|
|
100
99
|
|
|
101
100
|
Timber.d("Loading artwork: $finalUrl (headers: ${headers.keys}, svg: $isSvg)")
|
|
102
101
|
|
|
103
|
-
val
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
.allowHardware(false) // Required for Media3 notification compatibility
|
|
107
|
-
|
|
108
|
-
// Add custom headers if present
|
|
109
|
-
if (headers.isNotEmpty()) {
|
|
110
|
-
val networkHeaders = NetworkHeaders.Builder()
|
|
111
|
-
headers.forEach { (key, value) -> networkHeaders.add(key, value) }
|
|
112
|
-
requestBuilder.httpHeaders(networkHeaders.build())
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Force SVG decoder for .svg URLs (Coil's auto-detection can fail with some CDNs)
|
|
116
|
-
if (isSvg) {
|
|
117
|
-
requestBuilder.decoderFactory { result, options, _ ->
|
|
118
|
-
SvgDecoder(result.source, options)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
val result = imageLoader.execute(requestBuilder.build())
|
|
123
|
-
val bitmap = result.image?.toBitmap()
|
|
124
|
-
|
|
125
|
-
if (bitmap != null) {
|
|
126
|
-
Timber.d("Loaded bitmap: ${bitmap.width}x${bitmap.height} from $finalUrl")
|
|
127
|
-
future.set(bitmap)
|
|
128
|
-
} else {
|
|
129
|
-
Timber.e("Failed to decode image from $finalUrl - result.image was null")
|
|
130
|
-
future.setException(IllegalStateException("Failed to load bitmap from $finalUrl"))
|
|
131
|
-
}
|
|
102
|
+
val bitmap = core.load(finalUrl, headers, sizeHint, isSvg)
|
|
103
|
+
Timber.d("Loaded bitmap: ${bitmap.width}x${bitmap.height} from $finalUrl")
|
|
104
|
+
future.set(bitmap)
|
|
132
105
|
} catch (e: Exception) {
|
|
133
106
|
Timber.e(e, "Exception loading artwork from $uri")
|
|
134
107
|
future.setException(e)
|
|
@@ -137,254 +110,4 @@ class CoilBitmapLoader(
|
|
|
137
110
|
|
|
138
111
|
return future
|
|
139
112
|
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Transforms an artwork URL using the configured artwork request config.
|
|
143
|
-
*
|
|
144
|
-
* Applies:
|
|
145
|
-
* - Base URL transformation
|
|
146
|
-
* - Custom headers (e.g., Authorization, API keys)
|
|
147
|
-
* - Query parameters (e.g., signed tokens)
|
|
148
|
-
* - Size query parameters from imageQueryParams config (if sizeHintPixels provided)
|
|
149
|
-
*
|
|
150
|
-
* @param originalUrl The original artwork URL from track metadata
|
|
151
|
-
* @param sizeHintPixels Optional size hint in pixels from Android Auto
|
|
152
|
-
* @return Pair of (transformedUrl, headers)
|
|
153
|
-
*/
|
|
154
|
-
private suspend fun transformArtworkUrl(
|
|
155
|
-
originalUrl: String,
|
|
156
|
-
sizeHintPixels: Int? = null,
|
|
157
|
-
): Pair<String, Map<String, String>> {
|
|
158
|
-
val config = getArtworkConfig()
|
|
159
|
-
|
|
160
|
-
// No config - return original URL with no headers
|
|
161
|
-
if (config == null || config.artworkConfig == null) {
|
|
162
|
-
return originalUrl to emptyMap()
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return try {
|
|
166
|
-
val artworkConfig = config.artworkConfig
|
|
167
|
-
|
|
168
|
-
// Create base config with original URL as path
|
|
169
|
-
val baseConfig =
|
|
170
|
-
config.baseConfig ?: RequestConfig(null, null, null, null, null, null, null, null)
|
|
171
|
-
|
|
172
|
-
val urlRequestConfig = RequestConfig(null, originalUrl, null, null, null, null, null, null)
|
|
173
|
-
var mergedBaseConfig = RequestConfigBuilder.mergeConfig(baseConfig, urlRequestConfig)
|
|
174
|
-
|
|
175
|
-
// Create ImageContext from size hint if available
|
|
176
|
-
val imageContext = sizeHintPixels?.takeIf { it > 0 }?.let {
|
|
177
|
-
ImageContext(it.toDouble(), it.toDouble())
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Apply image query params BEFORE transform (so transform can override)
|
|
181
|
-
val queryParams = artworkConfig.imageQueryParams
|
|
182
|
-
if (imageContext != null && queryParams != null) {
|
|
183
|
-
val contextQuery = mutableMapOf<String, String>()
|
|
184
|
-
queryParams.width?.let { key -> imageContext.width?.let { contextQuery[key] = it.toInt().toString() } }
|
|
185
|
-
queryParams.height?.let { key -> imageContext.height?.let { contextQuery[key] = it.toInt().toString() } }
|
|
186
|
-
|
|
187
|
-
if (contextQuery.isNotEmpty()) {
|
|
188
|
-
Timber.d("Adding image query params: $contextQuery")
|
|
189
|
-
val existingQuery = mergedBaseConfig.query?.toMutableMap() ?: mutableMapOf()
|
|
190
|
-
existingQuery.putAll(contextQuery)
|
|
191
|
-
mergedBaseConfig = mergedBaseConfig.copy(query = existingQuery)
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Apply artwork transformation (transform can override imageQueryParams)
|
|
196
|
-
val finalConfig = RequestConfigBuilder.mergeConfig(mergedBaseConfig, artworkConfig, imageContext)
|
|
197
|
-
|
|
198
|
-
// Build final URL
|
|
199
|
-
val finalUrl =
|
|
200
|
-
RequestConfigBuilder.buildUrl(RequestConfigBuilder.toRequestConfig(finalConfig))
|
|
201
|
-
|
|
202
|
-
// Extract headers
|
|
203
|
-
val headers = finalConfig.headers?.toMap() ?: emptyMap()
|
|
204
|
-
|
|
205
|
-
finalUrl to headers
|
|
206
|
-
} catch (e: Exception) {
|
|
207
|
-
Timber.e(e, "Failed to transform artwork URL: $originalUrl")
|
|
208
|
-
originalUrl to emptyMap()
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Transforms an artwork URL for a specific track, returning a complete ImageSource.
|
|
214
|
-
*
|
|
215
|
-
* Returns an ImageSource containing:
|
|
216
|
-
* - uri: Transformed URL with query parameters for authentication
|
|
217
|
-
* - method: HTTP method (if configured)
|
|
218
|
-
* - headers: Merged headers including User-Agent and Content-Type
|
|
219
|
-
* - body: Request body (if configured)
|
|
220
|
-
*
|
|
221
|
-
* @param track The track whose artwork URL should be transformed
|
|
222
|
-
* @param perRouteConfig Optional per-route artwork config that overrides global config
|
|
223
|
-
* @param imageContext Optional size context for CDN URL generation (null at browse-time)
|
|
224
|
-
* @return ImageSource ready for React Native's Image component, or null if no artwork
|
|
225
|
-
*/
|
|
226
|
-
suspend fun transformArtworkUrlForTrack(
|
|
227
|
-
track: Track,
|
|
228
|
-
perRouteConfig: ArtworkRequestConfig? = null,
|
|
229
|
-
imageContext: ImageContext? = null,
|
|
230
|
-
): ImageSource? {
|
|
231
|
-
val globalConfig = getArtworkConfig()
|
|
232
|
-
|
|
233
|
-
// Determine effective artwork config: per-route overrides global
|
|
234
|
-
val effectiveArtworkConfig = perRouteConfig ?: globalConfig?.artworkConfig
|
|
235
|
-
|
|
236
|
-
// Treat empty string as null for artwork
|
|
237
|
-
val trackArtwork = track.artwork?.takeIf { it.isNotEmpty() }
|
|
238
|
-
|
|
239
|
-
Timber.d("transformArtworkUrlForTrack: track='${track.title}', artwork='$trackArtwork', hasConfig=${effectiveArtworkConfig != null}")
|
|
240
|
-
|
|
241
|
-
// If no artwork config and no track.artwork, nothing to transform
|
|
242
|
-
if (effectiveArtworkConfig == null && trackArtwork == null) {
|
|
243
|
-
Timber.d("transformArtworkUrlForTrack: No config and no artwork, returning null")
|
|
244
|
-
return null
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// If no artwork config, just return the original artwork URL as a simple ImageSource
|
|
248
|
-
if (effectiveArtworkConfig == null) {
|
|
249
|
-
return trackArtwork?.let {
|
|
250
|
-
Timber.d("transformArtworkUrlForTrack: No config, returning original artwork: $it")
|
|
251
|
-
ImageSource(uri = it, method = null, headers = null, body = null)
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return try {
|
|
256
|
-
// Create base config
|
|
257
|
-
val baseConfig =
|
|
258
|
-
globalConfig?.baseConfig ?: RequestConfig(null, null, null, null, null, null, null, null)
|
|
259
|
-
|
|
260
|
-
// Start with base config, using track.artwork as the default path if present
|
|
261
|
-
var mergedConfig =
|
|
262
|
-
if (trackArtwork != null) {
|
|
263
|
-
val urlRequestConfig =
|
|
264
|
-
RequestConfig(null, trackArtwork, null, null, null, null, null, null)
|
|
265
|
-
RequestConfigBuilder.mergeConfig(baseConfig, urlRequestConfig)
|
|
266
|
-
} else {
|
|
267
|
-
baseConfig
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// If there's a resolve callback, call it to get per-track config
|
|
271
|
-
// The resolve callback receives the track directly and can return:
|
|
272
|
-
// - RequestConfig with path/query/etc for URL generation
|
|
273
|
-
// - undefined to indicate no artwork
|
|
274
|
-
val resolvedConfig = effectiveArtworkConfig.resolve?.invoke(track)?.await()?.await()
|
|
275
|
-
|
|
276
|
-
// If resolve callback exists and returned null, that means no artwork
|
|
277
|
-
if (effectiveArtworkConfig.resolve != null && resolvedConfig == null) {
|
|
278
|
-
return null
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Apply artwork base config (static fields only, not resolve)
|
|
282
|
-
val artworkStaticConfig =
|
|
283
|
-
RequestConfig(
|
|
284
|
-
effectiveArtworkConfig.method,
|
|
285
|
-
effectiveArtworkConfig.path,
|
|
286
|
-
effectiveArtworkConfig.baseUrl,
|
|
287
|
-
effectiveArtworkConfig.headers,
|
|
288
|
-
effectiveArtworkConfig.query,
|
|
289
|
-
effectiveArtworkConfig.body,
|
|
290
|
-
effectiveArtworkConfig.contentType,
|
|
291
|
-
effectiveArtworkConfig.userAgent,
|
|
292
|
-
)
|
|
293
|
-
mergedConfig = RequestConfigBuilder.mergeConfig(mergedConfig, artworkStaticConfig)
|
|
294
|
-
|
|
295
|
-
// Apply resolved per-track config if present
|
|
296
|
-
if (resolvedConfig != null) {
|
|
297
|
-
mergedConfig = RequestConfigBuilder.mergeConfig(mergedConfig, resolvedConfig)
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// Apply image query params BEFORE transform (so transform can override)
|
|
301
|
-
if (imageContext != null) {
|
|
302
|
-
val queryParams = effectiveArtworkConfig.imageQueryParams
|
|
303
|
-
if (queryParams != null) {
|
|
304
|
-
val contextQuery = mutableMapOf<String, String>()
|
|
305
|
-
queryParams.width?.let { key -> imageContext.width?.let { contextQuery[key] = it.toInt().toString() } }
|
|
306
|
-
queryParams.height?.let { key -> imageContext.height?.let { contextQuery[key] = it.toInt().toString() } }
|
|
307
|
-
|
|
308
|
-
if (contextQuery.isNotEmpty()) {
|
|
309
|
-
Timber.d("Adding image query params: $contextQuery")
|
|
310
|
-
val existingQuery = mergedConfig.query?.toMutableMap() ?: mutableMapOf()
|
|
311
|
-
existingQuery.putAll(contextQuery)
|
|
312
|
-
mergedConfig = mergedConfig.copy(query = existingQuery)
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Apply transform callback if present (can override imageQueryParams)
|
|
318
|
-
val transformedConfig =
|
|
319
|
-
if (effectiveArtworkConfig.transform != null) {
|
|
320
|
-
effectiveArtworkConfig.transform.invoke(MediaTransformParams(mergedConfig, imageContext))?.await()?.await()
|
|
321
|
-
?: mergedConfig
|
|
322
|
-
} else {
|
|
323
|
-
mergedConfig
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Build final URL
|
|
327
|
-
val uri = RequestConfigBuilder.buildUrl(transformedConfig)
|
|
328
|
-
|
|
329
|
-
// If URI is empty, there's no valid artwork path
|
|
330
|
-
if (uri.isEmpty()) {
|
|
331
|
-
Timber.d("transformArtworkUrlForTrack: Built URI is empty, returning null")
|
|
332
|
-
return null
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
Timber.d("transformArtworkUrlForTrack: Built URI: $uri")
|
|
336
|
-
|
|
337
|
-
// Build headers map, merging explicit headers with userAgent and contentType
|
|
338
|
-
val headers =
|
|
339
|
-
buildHeadersMap(
|
|
340
|
-
transformedConfig.headers?.toMap(),
|
|
341
|
-
transformedConfig.userAgent,
|
|
342
|
-
transformedConfig.contentType,
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
ImageSource(
|
|
346
|
-
uri = uri,
|
|
347
|
-
method = transformedConfig.method,
|
|
348
|
-
headers = headers,
|
|
349
|
-
body = transformedConfig.body,
|
|
350
|
-
)
|
|
351
|
-
} catch (e: Exception) {
|
|
352
|
-
Timber.e(e, "Failed to transform artwork URL for track: ${track.title}")
|
|
353
|
-
// On error, return null to clear artwork and avoid broken images
|
|
354
|
-
null
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
/** Builds a headers map, merging explicit headers with userAgent and contentType. */
|
|
359
|
-
private fun buildHeadersMap(
|
|
360
|
-
headers: Map<String, String>?,
|
|
361
|
-
userAgent: String?,
|
|
362
|
-
contentType: String?,
|
|
363
|
-
): Map<String, String>? {
|
|
364
|
-
val mergedHeaders = mutableMapOf<String, String>()
|
|
365
|
-
|
|
366
|
-
// Add explicit headers
|
|
367
|
-
headers?.let { mergedHeaders.putAll(it) }
|
|
368
|
-
|
|
369
|
-
// Add User-Agent if present and not already set
|
|
370
|
-
if (userAgent != null && !mergedHeaders.containsKey("User-Agent")) {
|
|
371
|
-
mergedHeaders["User-Agent"] = userAgent
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
// Add Content-Type if present and not already set
|
|
375
|
-
if (contentType != null && !mergedHeaders.containsKey("Content-Type")) {
|
|
376
|
-
mergedHeaders["Content-Type"] = contentType
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
return mergedHeaders.ifEmpty { null }
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
/** Blocking version of [transformArtworkUrlForTrack] for use in synchronous contexts. */
|
|
383
|
-
fun transformArtworkUrlForTrackBlocking(
|
|
384
|
-
track: Track,
|
|
385
|
-
perRouteConfig: ArtworkRequestConfig? = null,
|
|
386
|
-
imageContext: ImageContext? = null,
|
|
387
|
-
): ImageSource? {
|
|
388
|
-
return runBlocking { transformArtworkUrlForTrack(track, perRouteConfig, imageContext) }
|
|
389
|
-
}
|
|
390
113
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package com.audiobrowser.util
|
|
2
2
|
|
|
3
3
|
import android.media.audiofx.Equalizer
|
|
4
|
+
import com.audiobrowser.player.EqualizerEffect
|
|
4
5
|
import com.margelo.nitro.audiobrowser.EqualizerSettings
|
|
5
6
|
import timber.log.Timber
|
|
6
7
|
|
|
@@ -10,7 +11,7 @@ import timber.log.Timber
|
|
|
10
11
|
* Provides access to equalizer presets, band levels, and enables/disables the effect. The equalizer
|
|
11
12
|
* is attached to a specific audio session ID.
|
|
12
13
|
*/
|
|
13
|
-
class EqualizerManager(val audioSessionId: Int) {
|
|
14
|
+
internal class EqualizerManager(override val audioSessionId: Int) : EqualizerEffect {
|
|
14
15
|
private var equalizer: Equalizer? = null
|
|
15
16
|
private var onSettingsChanged: ((EqualizerSettings) -> Unit)? = null
|
|
16
17
|
|
|
@@ -37,7 +38,7 @@ class EqualizerManager(val audioSessionId: Int) {
|
|
|
37
38
|
*
|
|
38
39
|
* @return Current settings or null if equalizer is not available
|
|
39
40
|
*/
|
|
40
|
-
fun getSettings(): EqualizerSettings? {
|
|
41
|
+
override fun getSettings(): EqualizerSettings? {
|
|
41
42
|
val eq = equalizer ?: return null
|
|
42
43
|
|
|
43
44
|
return try {
|
|
@@ -90,7 +91,7 @@ class EqualizerManager(val audioSessionId: Int) {
|
|
|
90
91
|
*
|
|
91
92
|
* @param enabled true to enable, false to disable
|
|
92
93
|
*/
|
|
93
|
-
fun setEnabled(enabled: Boolean) {
|
|
94
|
+
override fun setEnabled(enabled: Boolean) {
|
|
94
95
|
val eq = equalizer ?: return
|
|
95
96
|
|
|
96
97
|
// Only notify if state actually changed
|
|
@@ -105,18 +106,10 @@ class EqualizerManager(val audioSessionId: Int) {
|
|
|
105
106
|
*
|
|
106
107
|
* @param presetName Name of the preset to apply
|
|
107
108
|
*/
|
|
108
|
-
fun setPreset(presetName: String) {
|
|
109
|
+
override fun setPreset(presetName: String) {
|
|
109
110
|
val eq = equalizer ?: return
|
|
110
111
|
|
|
111
112
|
try {
|
|
112
|
-
// Get current preset first
|
|
113
|
-
val currentPreset =
|
|
114
|
-
try {
|
|
115
|
-
eq.currentPreset.toInt()
|
|
116
|
-
} catch (e: Exception) {
|
|
117
|
-
-1
|
|
118
|
-
}
|
|
119
|
-
|
|
120
113
|
// Find preset by case-insensitive name match
|
|
121
114
|
val presetIndex =
|
|
122
115
|
(0 until eq.numberOfPresets).firstOrNull { index ->
|
|
@@ -124,14 +117,11 @@ class EqualizerManager(val audioSessionId: Int) {
|
|
|
124
117
|
}
|
|
125
118
|
|
|
126
119
|
if (presetIndex != null) {
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
} else {
|
|
133
|
-
Timber.d("Preset already active: $presetName")
|
|
134
|
-
}
|
|
120
|
+
// Applied even when it is already the current preset: usePreset costs nothing in that
|
|
121
|
+
// case, and the caller gets an event whatever the effect reports as current.
|
|
122
|
+
eq.usePreset(presetIndex.toShort())
|
|
123
|
+
Timber.d("Applied equalizer preset: $presetName")
|
|
124
|
+
notifySettingsChanged()
|
|
135
125
|
} else {
|
|
136
126
|
// Log available presets to help debug
|
|
137
127
|
val availablePresets =
|
|
@@ -150,7 +140,7 @@ class EqualizerManager(val audioSessionId: Int) {
|
|
|
150
140
|
*
|
|
151
141
|
* @param levels Array of levels in millibels for each band
|
|
152
142
|
*/
|
|
153
|
-
fun setLevels(levels: DoubleArray) {
|
|
143
|
+
override fun setLevels(levels: DoubleArray) {
|
|
154
144
|
val eq = equalizer ?: return
|
|
155
145
|
|
|
156
146
|
try {
|
|
@@ -176,7 +166,7 @@ class EqualizerManager(val audioSessionId: Int) {
|
|
|
176
166
|
*
|
|
177
167
|
* @param callback Function to call with new settings
|
|
178
168
|
*/
|
|
179
|
-
fun setOnSettingsChanged(callback: (EqualizerSettings) -> Unit) {
|
|
169
|
+
override fun setOnSettingsChanged(callback: (EqualizerSettings) -> Unit) {
|
|
180
170
|
onSettingsChanged = callback
|
|
181
171
|
}
|
|
182
172
|
|
|
@@ -185,7 +175,7 @@ class EqualizerManager(val audioSessionId: Int) {
|
|
|
185
175
|
}
|
|
186
176
|
|
|
187
177
|
/** Releases the equalizer resources. Call this when the equalizer is no longer needed. */
|
|
188
|
-
fun release() {
|
|
178
|
+
override fun release() {
|
|
189
179
|
try {
|
|
190
180
|
equalizer?.release()
|
|
191
181
|
equalizer = null
|
|
@@ -39,7 +39,7 @@ object MediaExtrasBuilder {
|
|
|
39
39
|
groupTitle = track.groupTitle,
|
|
40
40
|
style = track.style,
|
|
41
41
|
childrenStyle = track.childrenStyle,
|
|
42
|
-
artwork = track.artwork,
|
|
42
|
+
artwork = track.artwork?.url,
|
|
43
43
|
)
|
|
44
44
|
|
|
45
45
|
fun build(resolvedTrack: ResolvedTrack): Bundle =
|
|
@@ -47,7 +47,7 @@ object MediaExtrasBuilder {
|
|
|
47
47
|
groupTitle = resolvedTrack.groupTitle,
|
|
48
48
|
style = resolvedTrack.style,
|
|
49
49
|
childrenStyle = resolvedTrack.childrenStyle,
|
|
50
|
-
artwork = resolvedTrack.artwork,
|
|
50
|
+
artwork = resolvedTrack.artwork?.url,
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
private fun build(
|