react-native-audio-browser 0.2.0-next.9 → 0.2.0
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 +2 -180
- package/android/build.gradle +1 -17
- package/android/gradle.properties +1 -1
- package/android/src/main/AndroidManifest.xml +0 -15
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +148 -433
- package/android/src/main/java/com/audiobrowser/Callbacks.kt +6 -4
- package/android/src/main/java/com/audiobrowser/Service.kt +18 -67
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +178 -442
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +4 -41
- package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +4 -4
- package/android/src/main/java/com/audiobrowser/http/RequestConfigBuilder.kt +97 -109
- package/android/src/main/java/com/audiobrowser/model/PlaybackMetadata.kt +10 -6
- package/android/src/main/java/com/audiobrowser/model/PlayerSetupOptions.kt +8 -40
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +46 -40
- package/android/src/main/java/com/audiobrowser/player/AutomaticBufferManager.kt +1 -4
- package/android/src/main/java/com/audiobrowser/player/DynamicLoadControl.kt +1 -18
- package/android/src/main/java/com/audiobrowser/player/MediaFactory.kt +3 -15
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +134 -422
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCommandManager.kt +404 -248
- package/android/src/main/java/com/audiobrowser/player/PlaybackProgressUpdateManager.kt +59 -0
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +5 -25
- package/android/src/main/java/com/audiobrowser/player/Player.kt +582 -469
- package/android/src/main/java/com/audiobrowser/player/PlayerListener.kt +67 -190
- package/android/src/main/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicy.kt +53 -118
- package/android/src/main/java/com/audiobrowser/player/SleepTimer.kt +3 -37
- package/android/src/main/java/com/audiobrowser/player/TransformingDataSource.kt +40 -85
- package/android/src/main/java/com/audiobrowser/util/BrowserPathHelper.kt +0 -24
- package/android/src/main/java/com/audiobrowser/util/CoilBitmapLoader.kt +300 -23
- package/android/src/main/java/com/audiobrowser/util/EqualizerManager.kt +23 -13
- package/android/src/main/java/com/audiobrowser/util/MediaExtrasBuilder.kt +2 -2
- package/android/src/main/java/com/audiobrowser/util/MetadataAdapter.kt +3 -4
- package/android/src/main/java/com/audiobrowser/util/PlayingStateFactory.kt +1 -2
- package/android/src/main/java/com/audiobrowser/util/RatingFactory.kt +72 -0
- package/android/src/main/java/com/audiobrowser/util/ResolvedTrackFactory.kt +36 -0
- package/android/src/main/java/com/audiobrowser/util/SvgArtworkRenderer.kt +111 -6
- package/android/src/main/java/com/audiobrowser/util/SystemVolumeMonitor.kt +8 -22
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +80 -112
- package/android/src/main/res/values/strings.xml +0 -4
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +0 -4
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +2 -1
- package/android/src/test/java/com/audiobrowser/http/RequestConfigBuilderTest.kt +0 -72
- package/android/src/test/java/com/audiobrowser/player/PlaybackProgressUpdateManagerTest.kt +146 -0
- package/ios/Browser/BrowserConfig.swift +11 -41
- package/ios/Browser/BrowserManager+URLResolution.swift +93 -213
- package/ios/Browser/BrowserManager.swift +110 -303
- package/ios/Browser/BrowserPathHelper.swift +3 -32
- package/ios/Browser/JsonModels.swift +66 -287
- package/ios/CarPlay/CarPlayArtworkResolver.swift +6 -6
- package/ios/CarPlay/CarPlayController.swift +149 -739
- package/ios/CarPlay/CarPlayImageLoader.swift +8 -57
- package/ios/CarPlay/CarPlayListItemFactory.swift +35 -44
- package/ios/CarPlay/CarPlayNowPlayingManager.swift +36 -180
- package/ios/CarPlay/RNABAudioBrowser.h +10 -15
- package/ios/CarPlay/RNABAudioBrowser.m +14 -15
- package/ios/CarPlay/RNABCarPlaySceneDelegate.m +0 -2
- package/ios/CarPlay/RNABMediaIntentHandler.swift +43 -53
- package/ios/CarPlay/Track+CarPlay.swift +63 -0
- package/ios/Extension/Capability+RemoteCommand.swift +9 -7
- package/ios/Extension/ChapterMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/NavigationError+Conversion.swift +1 -8
- package/ios/Extension/ResolvedTrack+Copying.swift +4 -10
- package/ios/Extension/TimedMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/Track+AVPlayer.swift +4 -4
- package/ios/Extension/Track+Copying.swift +3 -9
- package/ios/Extension/TrackMetadata+AVFoundation.swift +1 -1
- package/ios/HybridAudioBrowser.swift +196 -804
- package/ios/Model/NitroTypeStubs.swift +224 -299
- package/ios/Model/PlayerUpdateOptions.swift +23 -23
- package/ios/Model/RemoteCommand.swift +6 -24
- package/ios/Model/TrackPlayerError.swift +18 -82
- package/ios/NowPlayingInfo/NowPlayingInfoCenter.swift +9 -0
- package/ios/NowPlayingInfo/NowPlayingInfoController.swift +121 -99
- package/ios/Observer/PlayerItemNotificationObserver.swift +5 -45
- package/ios/Observer/PlayerItemPropertyObserver.swift +4 -27
- package/ios/Observer/PlayerTimeObserver.swift +53 -3
- package/ios/Option/SessionCategories.swift +11 -34
- package/ios/Player/LoadSeekCoordinator.swift +1 -16
- package/ios/Player/MediaLoader.swift +11 -31
- package/ios/Player/NowPlayingUpdater.swift +26 -119
- package/ios/Player/PlaybackCoordinator.swift +51 -285
- package/ios/Player/PlaybackCoordinatorCallbacks.swift +1 -6
- package/ios/Player/PlaybackEffectHandler.swift +9 -19
- package/ios/Player/PlaybackErrorHandler.swift +13 -97
- package/ios/Player/PlaybackProgressUpdateManager.swift +68 -0
- package/ios/Player/PlaybackStateMachine.swift +13 -18
- package/ios/Player/PlayingStateManager.swift +2 -3
- package/ios/Player/QueueManager.swift +61 -67
- package/ios/Player/RetryManager.swift +21 -98
- package/ios/Player/SleepTimerHandling.swift +0 -8
- package/ios/Player/SleepTimerManager.swift +11 -72
- package/ios/RemoteCommand/RemoteCommandController.swift +21 -40
- package/ios/Tests/BrowserPathHelperTests.swift +0 -28
- package/ios/Tests/CarPlayArtworkResolverTests.swift +39 -39
- package/ios/Tests/ChapterMetadataAVFoundationTests.swift +2 -2
- package/ios/Tests/LoadSeekCoordinatorTests.swift +7 -40
- package/ios/Tests/MediaLoaderTests.swift +20 -32
- package/ios/Tests/PlaybackCoordinatorTests.swift +13 -787
- package/ios/Tests/PlaybackErrorHandlerTests.swift +46 -380
- package/ios/Tests/PlaybackProgressUpdateManagerTests.swift +166 -0
- package/ios/Tests/PlaybackStateMachineTests.swift +8 -33
- package/ios/Tests/QueueManagerTests.swift +18 -149
- package/ios/Tests/ResolvedTrackCopyingTests.swift +8 -15
- package/ios/Tests/Support/TestTypes.swift +20 -61
- package/ios/Tests/TrackSelectorTests.swift +15 -15
- package/ios/TrackPlayer.swift +58 -380
- package/ios/TrackPlayerCallbacks.swift +44 -5
- package/ios/TrackSelector.swift +5 -5
- package/ios/Util/ArtworkImageFetcher.swift +2 -4
- package/ios/Util/NetworkMonitor.swift +3 -7
- package/ios/Util/OnceValue.swift +0 -34
- package/lib/commonjs/AudioBrowser.js +11 -0
- package/lib/commonjs/AudioBrowser.js.map +1 -1
- package/lib/commonjs/features/browser.js +158 -59
- package/lib/commonjs/features/browser.js.map +1 -1
- package/lib/commonjs/features/equalizer.js +1 -1
- package/lib/commonjs/features/errors.js +5 -37
- package/lib/commonjs/features/errors.js.map +1 -1
- package/lib/commonjs/features/favorites.js +1 -1
- package/lib/commonjs/features/index.js +0 -22
- package/lib/commonjs/features/index.js.map +1 -1
- package/lib/commonjs/features/metadata.js +3 -3
- package/lib/commonjs/features/metadata.js.map +1 -1
- package/lib/commonjs/features/network.js +1 -1
- package/lib/commonjs/features/nowPlaying.js +1 -36
- package/lib/commonjs/features/nowPlaying.js.map +1 -1
- package/lib/commonjs/features/output.js +23 -37
- package/lib/commonjs/features/output.js.map +1 -1
- package/lib/commonjs/features/playback/controls.js +0 -9
- package/lib/commonjs/features/playback/controls.js.map +1 -1
- package/lib/commonjs/features/playback/index.js +0 -11
- package/lib/commonjs/features/playback/index.js.map +1 -1
- package/lib/commonjs/features/playback/playWhenReady.js +1 -1
- package/lib/commonjs/features/playback/playing.js +1 -1
- package/lib/commonjs/features/playback/progress.js +13 -29
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/state.js +1 -1
- package/lib/commonjs/features/playback/volume.js +2 -2
- package/lib/commonjs/features/player/options.js +29 -79
- package/lib/commonjs/features/player/options.js.map +1 -1
- package/lib/commonjs/features/player/setup.js +3 -256
- package/lib/commonjs/features/player/setup.js.map +1 -1
- package/lib/commonjs/features/queue/activeTrack.js +1 -1
- package/lib/commonjs/features/queue/queue.js +5 -12
- package/lib/commonjs/features/queue/queue.js.map +1 -1
- package/lib/commonjs/features/queue/repeatMode.js +1 -1
- package/lib/commonjs/features/queue/shuffle.js +1 -1
- package/lib/commonjs/features/rating.js +2 -0
- package/lib/commonjs/features/rating.js.map +1 -0
- package/lib/commonjs/features/remoteControls.js +104 -14
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/features/sleepTimer.js +5 -10
- package/lib/commonjs/features/sleepTimer.js.map +1 -1
- package/lib/commonjs/native.js +0 -5
- package/lib/commonjs/native.js.map +1 -1
- package/lib/commonjs/native.web.js +1 -4
- package/lib/commonjs/native.web.js.map +1 -1
- package/lib/commonjs/types/player.js +2 -0
- package/lib/commonjs/types/player.js.map +1 -0
- package/lib/commonjs/utils/LazyNativeEmitter.js +8 -8
- package/lib/commonjs/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/commonjs/utils/NativeUpdatedValue.js +3 -0
- package/lib/commonjs/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/commonjs/web/NativeAudioBrowser.js +124 -301
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/SimpleRouter.test.js +174 -0
- package/lib/commonjs/web/SimpleRouter.test.js.map +1 -0
- package/lib/commonjs/web/TrackPlayer/Player.js +26 -90
- package/lib/commonjs/web/TrackPlayer/Player.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.js +293 -0
- package/lib/commonjs/web/TrackPlayer/PlaylistPlayer.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 +3 -34
- package/lib/commonjs/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/index.js +5 -13
- package/lib/commonjs/web/TrackPlayer/index.js.map +1 -1
- package/lib/commonjs/web/browser/BrowserManager.js +50 -176
- package/lib/commonjs/web/browser/BrowserManager.js.map +1 -1
- package/lib/commonjs/web/browser/NavigationErrorManager.js +1 -3
- package/lib/commonjs/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/commonjs/web/browser/SearchManager.js +9 -11
- package/lib/commonjs/web/browser/SearchManager.js.map +1 -1
- package/lib/commonjs/web/http/HttpClient.js +23 -4
- package/lib/commonjs/web/http/HttpClient.js.map +1 -1
- package/lib/commonjs/web/http/RequestConfigBuilder.js +58 -107
- package/lib/commonjs/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/commonjs/web/player/NowPlayingManager.js +5 -6
- package/lib/commonjs/web/player/NowPlayingManager.js.map +1 -1
- package/lib/commonjs/web/player/OptionsManager.js +17 -9
- package/lib/commonjs/web/player/OptionsManager.js.map +1 -1
- package/lib/module/AudioBrowser.js +1 -4
- package/lib/module/AudioBrowser.js.map +1 -1
- package/lib/module/features/browser.js +156 -53
- package/lib/module/features/browser.js.map +1 -1
- package/lib/module/features/equalizer.js +1 -1
- package/lib/module/features/errors.js +5 -37
- package/lib/module/features/errors.js.map +1 -1
- package/lib/module/features/favorites.js +1 -1
- package/lib/module/features/index.js +0 -2
- package/lib/module/features/index.js.map +1 -1
- package/lib/module/features/metadata.js +3 -3
- package/lib/module/features/metadata.js.map +1 -1
- package/lib/module/features/network.js +1 -1
- package/lib/module/features/nowPlaying.js +1 -34
- package/lib/module/features/nowPlaying.js.map +1 -1
- package/lib/module/features/output.js +19 -32
- package/lib/module/features/output.js.map +1 -1
- package/lib/module/features/playback/controls.js +0 -8
- package/lib/module/features/playback/controls.js.map +1 -1
- package/lib/module/features/playback/index.js +0 -1
- package/lib/module/features/playback/index.js.map +1 -1
- package/lib/module/features/playback/playWhenReady.js +1 -1
- package/lib/module/features/playback/playing.js +1 -1
- package/lib/module/features/playback/progress.js +13 -29
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/state.js +1 -1
- package/lib/module/features/playback/volume.js +2 -2
- package/lib/module/features/player/options.js +29 -79
- package/lib/module/features/player/options.js.map +1 -1
- package/lib/module/features/player/setup.js +3 -256
- package/lib/module/features/player/setup.js.map +1 -1
- package/lib/module/features/queue/activeTrack.js +1 -1
- package/lib/module/features/queue/queue.js +5 -12
- package/lib/module/features/queue/queue.js.map +1 -1
- package/lib/module/features/queue/repeatMode.js +1 -1
- package/lib/module/features/queue/shuffle.js +1 -1
- package/lib/module/features/rating.js +2 -0
- package/lib/module/features/rating.js.map +1 -0
- package/lib/module/features/remoteControls.js +103 -13
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/features/sleepTimer.js +5 -10
- package/lib/module/features/sleepTimer.js.map +1 -1
- package/lib/module/native.js +0 -5
- package/lib/module/native.js.map +1 -1
- package/lib/module/native.web.js +1 -4
- package/lib/module/native.web.js.map +1 -1
- package/lib/module/types/player.js +2 -0
- package/lib/module/types/player.js.map +1 -0
- package/lib/module/utils/LazyNativeEmitter.js +8 -8
- package/lib/module/utils/LazyNativeEmitter.js.map +1 -1
- package/lib/module/utils/NativeUpdatedValue.js +3 -0
- package/lib/module/utils/NativeUpdatedValue.js.map +1 -1
- package/lib/module/web/NativeAudioBrowser.js +125 -302
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/SimpleRouter.test.js +174 -0
- package/lib/module/web/SimpleRouter.test.js.map +1 -0
- package/lib/module/web/TrackPlayer/Player.js +26 -90
- package/lib/module/web/TrackPlayer/Player.js.map +1 -1
- package/lib/module/web/TrackPlayer/PlaylistPlayer.js +288 -0
- package/lib/module/web/TrackPlayer/PlaylistPlayer.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 +3 -34
- package/lib/module/web/TrackPlayer/SleepTimer.js.map +1 -1
- package/lib/module/web/TrackPlayer/index.js +1 -2
- package/lib/module/web/TrackPlayer/index.js.map +1 -1
- package/lib/module/web/browser/BrowserManager.js +50 -176
- package/lib/module/web/browser/BrowserManager.js.map +1 -1
- package/lib/module/web/browser/NavigationErrorManager.js +1 -3
- package/lib/module/web/browser/NavigationErrorManager.js.map +1 -1
- package/lib/module/web/browser/SearchManager.js +9 -11
- package/lib/module/web/browser/SearchManager.js.map +1 -1
- package/lib/module/web/http/HttpClient.js +23 -4
- package/lib/module/web/http/HttpClient.js.map +1 -1
- package/lib/module/web/http/RequestConfigBuilder.js +58 -107
- package/lib/module/web/http/RequestConfigBuilder.js.map +1 -1
- package/lib/module/web/player/NowPlayingManager.js +5 -7
- package/lib/module/web/player/NowPlayingManager.js.map +1 -1
- package/lib/module/web/player/OptionsManager.js +17 -9
- package/lib/module/web/player/OptionsManager.js.map +1 -1
- package/lib/typescript/src/AudioBrowser.d.ts +1 -0
- package/lib/typescript/src/AudioBrowser.d.ts.map +1 -1
- package/lib/typescript/src/features/browser.d.ts +1 -40
- package/lib/typescript/src/features/browser.d.ts.map +1 -1
- package/lib/typescript/src/features/equalizer.d.ts +1 -1
- package/lib/typescript/src/features/errors.d.ts +6 -61
- package/lib/typescript/src/features/errors.d.ts.map +1 -1
- package/lib/typescript/src/features/favorites.d.ts +1 -1
- package/lib/typescript/src/features/index.d.ts +0 -2
- package/lib/typescript/src/features/index.d.ts.map +1 -1
- package/lib/typescript/src/features/metadata.d.ts +7 -9
- package/lib/typescript/src/features/metadata.d.ts.map +1 -1
- package/lib/typescript/src/features/network.d.ts +1 -1
- package/lib/typescript/src/features/nowPlaying.d.ts +1 -28
- package/lib/typescript/src/features/nowPlaying.d.ts.map +1 -1
- package/lib/typescript/src/features/output.d.ts +18 -28
- package/lib/typescript/src/features/output.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/controls.d.ts +0 -5
- package/lib/typescript/src/features/playback/controls.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/index.d.ts +0 -1
- package/lib/typescript/src/features/playback/index.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/playWhenReady.d.ts +1 -1
- package/lib/typescript/src/features/playback/playing.d.ts +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts +1 -4
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/state.d.ts +1 -1
- package/lib/typescript/src/features/playback/volume.d.ts +2 -2
- package/lib/typescript/src/features/player/options.d.ts +127 -176
- package/lib/typescript/src/features/player/options.d.ts.map +1 -1
- package/lib/typescript/src/features/player/setup.d.ts +167 -213
- package/lib/typescript/src/features/player/setup.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/activeTrack.d.ts +1 -1
- package/lib/typescript/src/features/queue/queue.d.ts +4 -11
- package/lib/typescript/src/features/queue/queue.d.ts.map +1 -1
- package/lib/typescript/src/features/queue/repeatMode.d.ts +1 -1
- package/lib/typescript/src/features/queue/shuffle.d.ts +1 -1
- package/lib/typescript/src/features/rating.d.ts +14 -0
- package/lib/typescript/src/features/rating.d.ts.map +1 -0
- package/lib/typescript/src/features/remoteControls.d.ts +35 -23
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/features/sleepTimer.d.ts +4 -19
- 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 +2 -1
- package/lib/typescript/src/native.d.ts.map +1 -1
- package/lib/typescript/src/native.web.d.ts +3 -0
- package/lib/typescript/src/native.web.d.ts.map +1 -0
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts +225 -17
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-native.d.ts +3 -9
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +13 -145
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +85 -349
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/types/player.d.ts +64 -0
- package/lib/typescript/src/types/player.d.ts.map +1 -0
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts +6 -8
- package/lib/typescript/src/utils/LazyNativeEmitter.d.ts.map +1 -1
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts +2 -0
- package/lib/typescript/src/utils/NativeUpdatedValue.d.ts.map +1 -1
- package/lib/typescript/src/utils/resolveAssetSource.d.ts.map +1 -1
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +188 -0
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -0
- package/lib/typescript/src/web/SimpleRouter.d.ts +40 -0
- package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -0
- package/lib/typescript/src/web/SimpleRouter.test.d.ts +2 -0
- package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts +11 -0
- package/lib/typescript/src/web/TrackPlayer/Event.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts +59 -0
- package/lib/typescript/src/web/TrackPlayer/Player.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts +39 -0
- package/lib/typescript/src/web/TrackPlayer/PlaylistPlayer.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts +6 -0
- package/lib/typescript/src/web/TrackPlayer/RepeatMode.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts +4 -0
- package/lib/typescript/src/web/TrackPlayer/SetupNotCalledError.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts +34 -0
- package/lib/typescript/src/web/TrackPlayer/SleepTimer.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/State.d.ts +13 -0
- package/lib/typescript/src/web/TrackPlayer/State.d.ts.map +1 -0
- package/lib/typescript/src/web/TrackPlayer/index.d.ts +5 -0
- package/lib/typescript/src/web/TrackPlayer/index.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/BrowserManager.d.ts +154 -0
- package/lib/typescript/src/web/browser/BrowserManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts +42 -0
- package/lib/typescript/src/web/browser/FavoriteManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts +40 -0
- package/lib/typescript/src/web/browser/NavigationErrorManager.d.ts.map +1 -0
- package/lib/typescript/src/web/browser/SearchManager.d.ts +22 -0
- package/lib/typescript/src/web/browser/SearchManager.d.ts.map +1 -0
- package/lib/typescript/src/web/http/HttpClient.d.ts +25 -0
- package/lib/typescript/src/web/http/HttpClient.d.ts.map +1 -0
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts +98 -0
- package/lib/typescript/src/web/http/RequestConfigBuilder.d.ts.map +1 -0
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts +34 -0
- package/lib/typescript/src/web/player/NowPlayingManager.d.ts.map +1 -0
- package/lib/typescript/src/web/player/OptionsManager.d.ts +32 -0
- package/lib/typescript/src/web/player/OptionsManager.d.ts.map +1 -0
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts +69 -0
- package/lib/typescript/src/web/util/BrowserPathHelper.d.ts.map +1 -0
- package/lib/typescript/src/web/util/shuffle.d.ts +8 -0
- package/lib/typescript/src/web/util/shuffle.d.ts.map +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +2 -4
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +10 -24
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +6 -6
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +20 -10
- package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +86 -0
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +1 -33
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +0 -5
- package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +3 -3
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +2 -3
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +147 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +0 -8
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +80 -0
- package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +10 -0
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +9 -14
- package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +0 -2
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +0 -2
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +87 -0
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +10 -10
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +0 -6
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +0 -6
- package/nitrogen/generated/android/c++/JHeartRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +221 -245
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +22 -25
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +3 -33
- package/nitrogen/generated/android/c++/{JOutput.hpp → JIosOutput.hpp} +15 -15
- package/nitrogen/generated/android/c++/JIosOutputType.hpp +85 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +1 -33
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +28 -61
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +9 -20
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +24 -21
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +0 -6
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +20 -10
- package/nitrogen/generated/android/c++/{JRemoteButton.hpp → JNotificationButton.hpp} +20 -20
- package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +94 -0
- package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +17 -3
- package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +3 -7
- package/nitrogen/generated/android/c++/JOptions.hpp +14 -19
- package/nitrogen/generated/android/c++/{JNativeAndroidSetupOptions.hpp → JPartialAndroidSetupPlayerOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/{JNativeIOSSetupOptions.hpp → JPartialIOSSetupPlayerOptions.hpp} +10 -10
- package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +96 -0
- package/nitrogen/generated/android/c++/JPercentageRating.hpp +57 -0
- package/nitrogen/generated/android/c++/JPlayback.hpp +0 -2
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JPlaybackError.hpp +3 -18
- package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +0 -2
- package/nitrogen/generated/android/c++/JPlaybackState.hpp +3 -3
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +5 -11
- package/nitrogen/generated/android/c++/JRatingType.hpp +73 -0
- package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +66 -0
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +5 -23
- package/nitrogen/generated/android/c++/JRetryConfig.hpp +7 -11
- package/nitrogen/generated/android/c++/JSearchMode.hpp +9 -27
- package/nitrogen/generated/android/c++/JSearchParams.hpp +3 -9
- package/nitrogen/generated/android/c++/JStarRating.hpp +57 -0
- package/nitrogen/generated/android/c++/{JGateEvent.hpp → JThumbsRating.hpp} +15 -16
- package/nitrogen/generated/android/c++/JTrack.hpp +5 -23
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +0 -6
- package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +1 -14
- package/nitrogen/generated/android/c++/JUpdateOptions.hpp +105 -0
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +34 -0
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +105 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +75 -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 +9 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +4 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +3 -3
- 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_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.kt → Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt} +12 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_Output.kt → Func_void_IosOutput.kt} +9 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_GateEvent.kt → Func_void_RemoteSetRatingEvent.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/{Gate.kt → HeartRating.kt} +6 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +109 -103
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +3 -24
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Output.kt → IosOutput.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +32 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +4 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +6 -18
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +4 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +1 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +9 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoritesMatchMode.kt → NotificationButton.kt} +8 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +50 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +3 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NativeAndroidSetupOptions.kt → PartialAndroidSetupPlayerOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{NativeIOSSetupOptions.kt → PartialIOSSetupPlayerOptions.kt} +5 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateDecision.kt → PercentageRating.kt} +6 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +3 -12
- 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/{GateReason.kt → RatingType.kt} +10 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{ArtworkVariants.kt → RemoteSetRatingEvent.kt} +6 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +3 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +4 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +6 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +3 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{GateEvent.kt → StarRating.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{FavoriteConfig.kt → ThumbsRating.kt} +6 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +3 -12
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +4 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +77 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Variant_NullType_RemoteButtonLayout.kt → Variant_NullType_NotificationButtonLayout.kt} +9 -9
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +28 -139
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +489 -1125
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +45 -66
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +118 -176
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +8 -8
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +22 -12
- package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +119 -0
- package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +1 -95
- package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +4 -4
- package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +4 -17
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +68 -0
- package/nitrogen/generated/ios/swift/{Func_void_Output.swift → Func_void_IosOutput.swift} +10 -10
- package/nitrogen/generated/ios/swift/{Func_void_GateEvent.swift → Func_void_RemoteSetRatingEvent.swift} +10 -10
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +5 -5
- package/nitrogen/generated/ios/swift/{Func_void_std__shared_ptr_Promise_GateDecision__.swift → Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift} +17 -17
- package/nitrogen/generated/ios/swift/HeartRating.swift +29 -0
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +14 -20
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +197 -230
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +2 -121
- package/nitrogen/generated/ios/swift/{Output.swift → IosOutput.swift} +7 -7
- package/nitrogen/generated/ios/swift/IosOutputType.swift +76 -0
- package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +1 -107
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +22 -161
- package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +19 -19
- package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +25 -12
- package/nitrogen/generated/ios/swift/NavigationErrorType.swift +0 -8
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +41 -12
- package/nitrogen/generated/ios/swift/{RemoteButton.swift → NotificationButton.swift} +10 -10
- package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +92 -0
- package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +48 -1
- package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +1 -19
- package/nitrogen/generated/ios/swift/Options.swift +4 -10
- package/nitrogen/generated/ios/swift/{NativeAndroidSetupOptions.swift → PartialAndroidSetupPlayerOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/{NativeIOSSetupOptions.swift → PartialIOSSetupPlayerOptions.swift} +5 -5
- package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +101 -0
- package/nitrogen/generated/ios/swift/PercentageRating.swift +29 -0
- package/nitrogen/generated/ios/swift/PlaybackError.swift +2 -43
- package/nitrogen/generated/ios/swift/PlaybackState.swift +4 -4
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +8 -27
- package/nitrogen/generated/ios/swift/RatingType.swift +60 -0
- package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +58 -0
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +8 -74
- package/nitrogen/generated/ios/swift/RetryConfig.swift +4 -35
- package/nitrogen/generated/ios/swift/SearchMode.swift +12 -36
- package/nitrogen/generated/ios/swift/SearchParams.swift +2 -7
- package/nitrogen/generated/ios/swift/StarRating.swift +29 -0
- package/nitrogen/generated/ios/swift/ThumbsRating.swift +29 -0
- package/nitrogen/generated/ios/swift/Track.swift +8 -74
- package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +1 -60
- package/nitrogen/generated/ios/swift/UpdateOptions.swift +143 -0
- package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +20 -0
- package/nitrogen/generated/ios/swift/{Variant_NullType_RemoteButtonLayout.swift → Variant_NullType_NotificationButtonLayout.swift} +3 -3
- package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +10 -10
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +19 -8
- package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +109 -0
- package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +2 -10
- package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +6 -6
- package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +2 -0
- package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +5 -6
- package/nitrogen/generated/shared/c++/{GateEvent.hpp → HeartRating.hpp} +17 -18
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +18 -21
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +35 -44
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +2 -33
- package/nitrogen/generated/shared/c++/{Output.hpp → IosOutput.hpp} +18 -18
- package/nitrogen/generated/shared/c++/IosOutputType.hpp +112 -0
- package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +2 -10
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +15 -31
- package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +5 -5
- package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +7 -9
- package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +0 -8
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +19 -8
- package/nitrogen/generated/shared/c++/{RemoteButton.hpp → NotificationButton.hpp} +25 -25
- package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +102 -0
- package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +19 -3
- package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +2 -6
- package/nitrogen/generated/shared/c++/Options.hpp +8 -8
- package/nitrogen/generated/shared/c++/{NativeAndroidSetupOptions.hpp → PartialAndroidSetupPlayerOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/{NativeIOSSetupOptions.hpp → PartialIOSSetupPlayerOptions.hpp} +11 -11
- package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +104 -0
- package/nitrogen/generated/shared/c++/{FavoriteConfig.hpp → PercentageRating.hpp} +17 -18
- package/nitrogen/generated/shared/c++/PlaybackError.hpp +3 -18
- package/nitrogen/generated/shared/c++/PlaybackState.hpp +9 -9
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +6 -9
- package/nitrogen/generated/shared/c++/RatingType.hpp +96 -0
- package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +94 -0
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +5 -24
- package/nitrogen/generated/shared/c++/RetryConfig.hpp +6 -10
- package/nitrogen/generated/shared/c++/SearchMode.hpp +15 -39
- package/nitrogen/generated/shared/c++/SearchParams.hpp +2 -9
- package/nitrogen/generated/shared/c++/{Gate.hpp → StarRating.hpp} +16 -21
- package/nitrogen/generated/shared/c++/{GateDecision.hpp → ThumbsRating.hpp} +17 -23
- package/nitrogen/generated/shared/c++/Track.hpp +5 -24
- package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +2 -6
- package/nitrogen/generated/shared/c++/UpdateOptions.hpp +111 -0
- package/package.json +5 -12
- package/src/AudioBrowser.ts +1 -4
- package/src/features/browser.ts +201 -58
- package/src/features/equalizer.ts +1 -1
- package/src/features/errors.ts +5 -71
- package/src/features/favorites.ts +1 -1
- package/src/features/index.ts +0 -2
- package/src/features/metadata.ts +15 -9
- package/src/features/network.ts +1 -1
- package/src/features/nowPlaying.ts +1 -37
- package/src/features/output.ts +22 -35
- package/src/features/playback/controls.ts +0 -8
- package/src/features/playback/index.ts +0 -1
- package/src/features/playback/playWhenReady.ts +1 -1
- package/src/features/playback/playing.ts +1 -1
- package/src/features/playback/progress.ts +13 -32
- package/src/features/playback/state.ts +1 -1
- package/src/features/playback/volume.ts +2 -2
- package/src/features/player/options.ts +110 -217
- package/src/features/player/setup.ts +175 -397
- package/src/features/queue/activeTrack.ts +1 -1
- package/src/features/queue/queue.ts +6 -17
- package/src/features/queue/repeatMode.ts +1 -1
- package/src/features/queue/shuffle.ts +1 -1
- package/src/features/rating.ts +17 -0
- package/src/features/remoteControls.ts +115 -13
- package/src/features/sleepTimer.ts +5 -24
- package/src/native.ts +0 -5
- package/src/native.web.ts +1 -4
- package/src/specs/audio-browser.nitro.ts +41 -131
- package/src/types/browser-native.ts +6 -19
- package/src/types/browser-nodes.ts +13 -160
- package/src/types/browser.ts +89 -377
- package/src/types/player.ts +69 -0
- package/src/utils/LazyNativeEmitter.ts +8 -9
- package/src/utils/NativeUpdatedValue.ts +2 -0
- package/src/web/NativeAudioBrowser.ts +158 -365
- package/src/web/TrackPlayer/Player.ts +39 -113
- package/src/web/TrackPlayer/PlaylistPlayer.ts +346 -0
- package/src/web/TrackPlayer/RepeatMode.ts +1 -1
- package/src/web/TrackPlayer/SleepTimer.ts +3 -38
- package/src/web/TrackPlayer/index.ts +1 -2
- package/src/web/browser/BrowserManager.ts +62 -231
- package/src/web/browser/NavigationErrorManager.ts +1 -3
- package/src/web/browser/SearchManager.ts +15 -11
- package/src/web/http/HttpClient.ts +35 -5
- package/src/web/http/RequestConfigBuilder.ts +63 -120
- package/src/web/player/NowPlayingManager.ts +5 -6
- package/src/web/player/OptionsManager.ts +18 -12
- package/android/src/main/java/com/audiobrowser/ServiceBinding.kt +0 -46
- package/android/src/main/java/com/audiobrowser/browser/ArtworkResolutionRegistry.kt +0 -37
- package/android/src/main/java/com/audiobrowser/browser/BrowseArtworkRegistry.kt +0 -34
- package/android/src/main/java/com/audiobrowser/browser/BrowserUrlResolution.kt +0 -299
- package/android/src/main/java/com/audiobrowser/browser/JsonArtwork.kt +0 -79
- package/android/src/main/java/com/audiobrowser/browser/SectionScope.kt +0 -42
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +0 -35
- package/android/src/main/java/com/audiobrowser/player/CapabilityControls.kt +0 -172
- package/android/src/main/java/com/audiobrowser/player/EqualizerController.kt +0 -153
- package/android/src/main/java/com/audiobrowser/player/InterceptingPlayer.kt +0 -141
- package/android/src/main/java/com/audiobrowser/player/NowPlayingUpdater.kt +0 -347
- package/android/src/main/java/com/audiobrowser/player/PlaybackErrorClassifier.kt +0 -129
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateMachine.kt +0 -85
- package/android/src/main/java/com/audiobrowser/player/PlaybackTimer.kt +0 -56
- package/android/src/main/java/com/audiobrowser/player/PlayerCapabilitiesExt.kt +0 -20
- package/android/src/main/java/com/audiobrowser/player/PlayerEngineFactory.kt +0 -130
- package/android/src/main/java/com/audiobrowser/player/SleepTimerManager.kt +0 -80
- package/android/src/main/java/com/audiobrowser/player/StuckRecoveryPolicy.kt +0 -50
- package/android/src/main/java/com/audiobrowser/player/VolumeFader.kt +0 -81
- package/android/src/main/java/com/audiobrowser/tls/AiaCertChaser.kt +0 -141
- package/android/src/main/java/com/audiobrowser/tls/AiaChasingTrustManager.kt +0 -37
- package/android/src/main/java/com/audiobrowser/tls/AiaTls.kt +0 -41
- package/android/src/main/java/com/audiobrowser/tls/CachingCertificateFetcher.kt +0 -209
- package/android/src/main/java/com/audiobrowser/util/ArtworkContentProvider.kt +0 -161
- package/android/src/main/java/com/audiobrowser/util/ArtworkUris.kt +0 -28
- package/android/src/main/java/com/audiobrowser/util/ArtworkVariant.kt +0 -24
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoader.kt +0 -49
- package/android/src/main/java/com/audiobrowser/util/CoilArtworkLoaderHolder.kt +0 -36
- package/android/src/main/java/com/audiobrowser/util/OutputMonitor.kt +0 -211
- package/android/src/main/java/com/audiobrowser/util/OutputSwitcher.kt +0 -58
- package/android/src/main/java/com/audiobrowser/util/RatingFavorites.kt +0 -14
- package/android/src/test/java/com/audiobrowser/ServiceBindingTest.kt +0 -68
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +0 -165
- package/android/src/test/java/com/audiobrowser/browser/ArtworkResolutionRegistryTest.kt +0 -46
- package/android/src/test/java/com/audiobrowser/browser/BrowseArtworkRegistryTest.kt +0 -39
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerBuildApiRequestTest.kt +0 -114
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerLayerResolutionTest.kt +0 -141
- package/android/src/test/java/com/audiobrowser/browser/BrowserUrlResolutionTest.kt +0 -177
- package/android/src/test/java/com/audiobrowser/browser/JsonArtworkTest.kt +0 -55
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +0 -94
- package/android/src/test/java/com/audiobrowser/player/CapabilityControlsTest.kt +0 -203
- package/android/src/test/java/com/audiobrowser/player/DynamicLoadControlTest.kt +0 -56
- package/android/src/test/java/com/audiobrowser/player/EqualizerControllerTest.kt +0 -216
- package/android/src/test/java/com/audiobrowser/player/MediaSessionSlotMappingTest.kt +0 -45
- package/android/src/test/java/com/audiobrowser/player/NowPlayingUpdaterTest.kt +0 -442
- package/android/src/test/java/com/audiobrowser/player/PlaybackErrorClassifierTest.kt +0 -190
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateMachineTest.kt +0 -198
- package/android/src/test/java/com/audiobrowser/player/PlaybackTimerTest.kt +0 -137
- package/android/src/test/java/com/audiobrowser/player/PlayerEngineFactoryTest.kt +0 -36
- package/android/src/test/java/com/audiobrowser/player/RetryLoadErrorHandlingPolicyTest.kt +0 -268
- package/android/src/test/java/com/audiobrowser/player/SessionErrorMaskTest.kt +0 -68
- package/android/src/test/java/com/audiobrowser/player/StuckRecoveryPolicyTest.kt +0 -40
- package/android/src/test/java/com/audiobrowser/player/TransformingDataSourceTest.kt +0 -193
- package/android/src/test/java/com/audiobrowser/tls/AiaCertChaserTest.kt +0 -107
- package/android/src/test/java/com/audiobrowser/tls/AiaChasingTrustManagerTest.kt +0 -73
- package/android/src/test/java/com/audiobrowser/tls/CachingCertificateFetcherTest.kt +0 -75
- package/android/src/test/java/com/audiobrowser/tls/CertFixtures.kt +0 -18
- package/android/src/test/java/com/audiobrowser/util/ArtworkContentProviderTest.kt +0 -163
- package/android/src/test/java/com/audiobrowser/util/ArtworkUrisTest.kt +0 -34
- package/android/src/test/java/com/audiobrowser/util/BrowserPathHelperTest.kt +0 -28
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderHolderTest.kt +0 -53
- package/android/src/test/java/com/audiobrowser/util/CoilArtworkLoaderTest.kt +0 -58
- package/android/src/test/java/com/audiobrowser/util/FakeImageLoader.kt +0 -57
- package/android/src/test/java/com/audiobrowser/util/PlayingStateFactoryTest.kt +0 -40
- package/android/src/test/java/com/audiobrowser/util/RatingFavoritesTest.kt +0 -34
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryBrowseTest.kt +0 -50
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryMediaIdTest.kt +0 -63
- package/android/src/test/java/com/audiobrowser/util/TrackFactoryRatingTest.kt +0 -35
- package/android/src/test/resources/certs/isrg-root-x1.pem +0 -31
- package/android/src/test/resources/certs/letsencrypt-r13.der +0 -0
- package/android/src/test/resources/certs/letsencrypt-r13.pem +0 -29
- package/android/src/test/resources/certs/stationplaylist-leaf.pem +0 -34
- package/ios/Browser/MediaResolveComposer.swift +0 -114
- package/ios/Browser/SearchDrillIn.swift +0 -44
- package/ios/Browser/SectionScope.swift +0 -35
- package/ios/Browser/TabBarEntries.swift +0 -15
- package/ios/CarPlay/CPInterfaceController+Safe.swift +0 -126
- package/ios/CarPlay/ImageRowItem+CarPlay.swift +0 -19
- package/ios/CarPlay/RNABMediaAddHandler.swift +0 -75
- package/ios/CarPlay/RNABMediaAffinityHandler.swift +0 -69
- package/ios/Extension/PlayerCapabilities+Favorite.swift +0 -20
- package/ios/Extension/RequestConfig+Copying.swift +0 -31
- package/ios/Extension/Variant+Artwork.swift +0 -49
- package/ios/NowPlayingInfo/SilentAudioPrimer.swift +0 -73
- package/ios/Player/AirPlayStallJudgement.swift +0 -25
- package/ios/Player/EndOfTrackJudgement.swift +0 -32
- package/ios/Player/MediaIntentCriteria.swift +0 -139
- package/ios/Player/PersistedPlaybackState.swift +0 -11
- package/ios/Player/PlaybackStateStore.swift +0 -27
- package/ios/Player/PlaybackTimer.swift +0 -61
- package/ios/Player/VolumeFader.swift +0 -77
- package/ios/RemoteCommand/RemoteCommandCallbacks.swift +0 -47
- package/ios/Tests/AirPlayStallJudgementTests.swift +0 -52
- package/ios/Tests/EndOfTrackJudgementTests.swift +0 -35
- package/ios/Tests/JsonModelsTests.swift +0 -58
- package/ios/Tests/MediaIntentCriteriaTests.swift +0 -170
- package/ios/Tests/MediaLoaderAssetOptionsTests.swift +0 -46
- package/ios/Tests/MediaResolveTests.swift +0 -126
- package/ios/Tests/OnceValueTests.swift +0 -79
- package/ios/Tests/PlaybackStateStoreTests.swift +0 -48
- package/ios/Tests/PlaybackTimerTests.swift +0 -55
- package/ios/Tests/PlayingStateManagerTests.swift +0 -57
- package/ios/Tests/RemoteCommandControllerTests.swift +0 -156
- package/ios/Tests/RemoteCommandTests.swift +0 -67
- package/ios/Tests/RetryManagerTests.swift +0 -89
- package/ios/Tests/SearchDrillInTests.swift +0 -63
- package/ios/Tests/SectionScopeTests.swift +0 -82
- package/ios/Tests/SleepTimerManagerTests.swift +0 -107
- package/ios/Tests/Support/ManualSleepTimerScheduler.swift +0 -47
- package/ios/Tests/TabBarEntriesTests.swift +0 -71
- package/lib/commonjs/features/browser-config.js +0 -227
- package/lib/commonjs/features/browser-config.js.map +0 -1
- package/lib/commonjs/features/carConnection.js +0 -42
- package/lib/commonjs/features/carConnection.js.map +0 -1
- package/lib/commonjs/features/gate.js +0 -149
- package/lib/commonjs/features/gate.js.map +0 -1
- package/lib/commonjs/features/playback/trackPlaybackTime.js +0 -86
- package/lib/commonjs/features/playback/trackPlaybackTime.js.map +0 -1
- package/lib/commonjs/features/player/validateOptions.js +0 -24
- package/lib/commonjs/features/player/validateOptions.js.map +0 -1
- package/lib/commonjs/utils/artwork.js +0 -31
- package/lib/commonjs/utils/artwork.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js +0 -71
- package/lib/commonjs/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js +0 -34
- package/lib/commonjs/web/TrackPlayer/PlaybackTimer.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js +0 -21
- package/lib/commonjs/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +0 -273
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js +0 -158
- package/lib/commonjs/web/TrackPlayer/QueuePlayer.js.map +0 -1
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js +0 -75
- package/lib/commonjs/web/TrackPlayer/VolumeFader.js.map +0 -1
- package/lib/commonjs/web/browser/assertBrowsePageShape.js +0 -22
- package/lib/commonjs/web/browser/assertBrowsePageShape.js.map +0 -1
- package/lib/commonjs/web/browser/classifyTrackNavigation.js +0 -41
- package/lib/commonjs/web/browser/classifyTrackNavigation.js.map +0 -1
- package/lib/commonjs/web/browser/parseSearchResponse.js +0 -20
- package/lib/commonjs/web/browser/parseSearchResponse.js.map +0 -1
- package/lib/commonjs/web/playbackErrorKind.js +0 -57
- package/lib/commonjs/web/playbackErrorKind.js.map +0 -1
- package/lib/commonjs/web/player/MediaSessionManager.js +0 -121
- package/lib/commonjs/web/player/MediaSessionManager.js.map +0 -1
- package/lib/commonjs/web/player/RemoteCommandController.js +0 -96
- package/lib/commonjs/web/player/RemoteCommandController.js.map +0 -1
- package/lib/module/features/browser-config.js +0 -221
- package/lib/module/features/browser-config.js.map +0 -1
- package/lib/module/features/carConnection.js +0 -37
- package/lib/module/features/carConnection.js.map +0 -1
- package/lib/module/features/gate.js +0 -144
- package/lib/module/features/gate.js.map +0 -1
- package/lib/module/features/playback/trackPlaybackTime.js +0 -83
- package/lib/module/features/playback/trackPlaybackTime.js.map +0 -1
- package/lib/module/features/player/validateOptions.js +0 -20
- package/lib/module/features/player/validateOptions.js.map +0 -1
- package/lib/module/utils/artwork.js +0 -26
- package/lib/module/utils/artwork.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js +0 -67
- package/lib/module/web/TrackPlayer/PlaybackStateMachine.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlaybackTimer.js +0 -29
- package/lib/module/web/TrackPlayer/PlaybackTimer.js.map +0 -1
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js +0 -17
- package/lib/module/web/TrackPlayer/PlayingStateFactory.js.map +0 -1
- package/lib/module/web/TrackPlayer/QueueManager.js +0 -269
- package/lib/module/web/TrackPlayer/QueueManager.js.map +0 -1
- package/lib/module/web/TrackPlayer/QueuePlayer.js +0 -154
- package/lib/module/web/TrackPlayer/QueuePlayer.js.map +0 -1
- package/lib/module/web/TrackPlayer/VolumeFader.js +0 -70
- package/lib/module/web/TrackPlayer/VolumeFader.js.map +0 -1
- package/lib/module/web/browser/assertBrowsePageShape.js +0 -18
- package/lib/module/web/browser/assertBrowsePageShape.js.map +0 -1
- package/lib/module/web/browser/classifyTrackNavigation.js +0 -38
- package/lib/module/web/browser/classifyTrackNavigation.js.map +0 -1
- package/lib/module/web/browser/parseSearchResponse.js +0 -16
- package/lib/module/web/browser/parseSearchResponse.js.map +0 -1
- package/lib/module/web/playbackErrorKind.js +0 -52
- package/lib/module/web/playbackErrorKind.js.map +0 -1
- package/lib/module/web/player/MediaSessionManager.js +0 -116
- package/lib/module/web/player/MediaSessionManager.js.map +0 -1
- package/lib/module/web/player/RemoteCommandController.js +0 -92
- package/lib/module/web/player/RemoteCommandController.js.map +0 -1
- package/lib/typescript/src/features/browser-config.d.ts +0 -12
- package/lib/typescript/src/features/browser-config.d.ts.map +0 -1
- package/lib/typescript/src/features/carConnection.d.ts +0 -20
- package/lib/typescript/src/features/carConnection.d.ts.map +0 -1
- package/lib/typescript/src/features/gate.d.ts +0 -78
- package/lib/typescript/src/features/gate.d.ts.map +0 -1
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts +0 -34
- package/lib/typescript/src/features/playback/trackPlaybackTime.d.ts.map +0 -1
- package/lib/typescript/src/features/player/validateOptions.d.ts +0 -2
- package/lib/typescript/src/features/player/validateOptions.d.ts.map +0 -1
- package/lib/typescript/src/utils/artwork.d.ts +0 -19
- package/lib/typescript/src/utils/artwork.d.ts.map +0 -1
- package/nitrogen/generated/android/c++/JArtworkVariants.hpp +0 -61
- package/nitrogen/generated/android/c++/JFavoriteConfig.hpp +0 -58
- package/nitrogen/generated/android/c++/JFavoritesMatchMode.hpp +0 -58
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +0 -100
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.hpp +0 -112
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +0 -121
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +0 -123
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +0 -133
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +0 -121
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.hpp +0 -139
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.hpp +0 -134
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +0 -131
- package/nitrogen/generated/android/c++/JFunc_void_GateEvent.hpp +0 -79
- package/nitrogen/generated/android/c++/JFunc_void_Output.hpp +0 -80
- package/nitrogen/generated/android/c++/JGate.hpp +0 -62
- package/nitrogen/generated/android/c++/JGateDecision.hpp +0 -64
- package/nitrogen/generated/android/c++/JGateReason.hpp +0 -58
- package/nitrogen/generated/android/c++/JIOSOptions.hpp +0 -95
- package/nitrogen/generated/android/c++/JMediaReference.hpp +0 -58
- package/nitrogen/generated/android/c++/JNativeGateRequest.hpp +0 -74
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +0 -182
- package/nitrogen/generated/android/c++/JNitroIOSUpdateOptions.hpp +0 -96
- package/nitrogen/generated/android/c++/JOutputType.hpp +0 -82
- package/nitrogen/generated/android/c++/JPlaybackErrorKind.hpp +0 -76
- package/nitrogen/generated/android/c++/JRemoteButtonLayout.hpp +0 -86
- package/nitrogen/generated/android/c++/JStallReason.hpp +0 -58
- package/nitrogen/generated/android/c++/JTrackRequest.hpp +0 -93
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_Boolean_FavoriteConfig.hpp +0 -71
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_NullType_RemoteButtonLayout.hpp +0 -75
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.cpp +0 -41
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +0 -121
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.cpp +0 -26
- package/nitrogen/generated/android/c++/JVariant_String_ArtworkVariants.hpp +0 -70
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNowPlayingParams.kt +0 -50
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.kt +0 -80
- 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 +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_RequestConfig___Track.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__optional_std__string____Track.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.kt +0 -80
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSOptions.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaReference.kt +0 -23
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeGateRequest.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeSetupPlayerOptions.kt +0 -66
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroIOSUpdateOptions.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/OutputType.kt +0 -31
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorKind.kt +0 -29
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButton.kt +0 -26
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteButtonLayout.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StallReason.kt +0 -23
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackRequest.kt +0 -44
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_FavoriteConfig.kt +0 -53
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.kt +0 -65
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_String_ArtworkVariants.kt +0 -53
- package/nitrogen/generated/ios/swift/ArtworkVariants.swift +0 -34
- package/nitrogen/generated/ios/swift/FavoriteConfig.swift +0 -29
- package/nitrogen/generated/ios/swift/FavoritesMatchMode.swift +0 -40
- package/nitrogen/generated/ios/swift/FormatNowPlayingParams.swift +0 -67
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___MediaTransformParams.swift +0 -54
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +0 -69
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_RequestConfig___Track.swift +0 -54
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.swift +0 -60
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_std__string____Track.swift +0 -60
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_GateDecision_____NativeGateRequest.swift +0 -61
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_TransformableRequestConfig____.swift +0 -61
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.swift +0 -77
- package/nitrogen/generated/ios/swift/Func_void_GateDecision.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_TransformableRequestConfig.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_std__optional_NowPlayingUpdate_.swift +0 -46
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +0 -53
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_TransformableRequestConfig__.swift +0 -66
- package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError____.swift +0 -81
- package/nitrogen/generated/ios/swift/Gate.swift +0 -47
- package/nitrogen/generated/ios/swift/GateDecision.swift +0 -40
- package/nitrogen/generated/ios/swift/GateEvent.swift +0 -29
- package/nitrogen/generated/ios/swift/GateReason.swift +0 -40
- package/nitrogen/generated/ios/swift/IOSOptions.swift +0 -51
- package/nitrogen/generated/ios/swift/MediaReference.swift +0 -40
- package/nitrogen/generated/ios/swift/NativeGateRequest.swift +0 -58
- package/nitrogen/generated/ios/swift/NativeSetupPlayerOptions.swift +0 -206
- package/nitrogen/generated/ios/swift/NitroIOSUpdateOptions.swift +0 -90
- package/nitrogen/generated/ios/swift/OutputType.swift +0 -72
- package/nitrogen/generated/ios/swift/PlaybackErrorKind.swift +0 -64
- package/nitrogen/generated/ios/swift/RemoteButtonLayout.swift +0 -57
- package/nitrogen/generated/ios/swift/StallReason.swift +0 -40
- package/nitrogen/generated/ios/swift/TrackRequest.swift +0 -106
- package/nitrogen/generated/ios/swift/Variant_Bool_FavoriteConfig.swift +0 -18
- package/nitrogen/generated/ios/swift/Variant_ResolvedTrack_BrowseError_Promise_BrowseResult_.swift +0 -19
- package/nitrogen/generated/ios/swift/Variant_String_ArtworkVariants.swift +0 -18
- package/nitrogen/generated/shared/c++/ArtworkVariants.hpp +0 -87
- package/nitrogen/generated/shared/c++/FavoritesMatchMode.hpp +0 -76
- package/nitrogen/generated/shared/c++/FormatNowPlayingParams.hpp +0 -110
- package/nitrogen/generated/shared/c++/GateReason.hpp +0 -76
- package/nitrogen/generated/shared/c++/IOSOptions.hpp +0 -91
- package/nitrogen/generated/shared/c++/MediaReference.hpp +0 -76
- package/nitrogen/generated/shared/c++/NativeGateRequest.hpp +0 -97
- package/nitrogen/generated/shared/c++/NativeSetupPlayerOptions.hpp +0 -138
- package/nitrogen/generated/shared/c++/NitroIOSUpdateOptions.hpp +0 -92
- package/nitrogen/generated/shared/c++/OutputType.hpp +0 -108
- package/nitrogen/generated/shared/c++/PlaybackErrorKind.hpp +0 -100
- package/nitrogen/generated/shared/c++/RemoteButtonLayout.hpp +0 -94
- package/nitrogen/generated/shared/c++/StallReason.hpp +0 -76
- package/nitrogen/generated/shared/c++/TrackRequest.hpp +0 -93
- package/src/codegen-no-config-variant.test.ts +0 -70
- package/src/features/browser-config.test.ts +0 -110
- package/src/features/browser-config.ts +0 -293
- package/src/features/browser.test.ts +0 -19
- package/src/features/carConnection.ts +0 -36
- package/src/features/gate.test.ts +0 -72
- package/src/features/gate.ts +0 -155
- package/src/features/playback/trackPlaybackTime.test.ts +0 -80
- package/src/features/playback/trackPlaybackTime.ts +0 -101
- package/src/features/player/options.test.ts +0 -38
- package/src/features/player/setup.test.ts +0 -125
- package/src/features/player/validateOptions.ts +0 -22
- package/src/features/queue/queue.test.ts +0 -36
- package/src/public-surface.test.ts +0 -123
- package/src/utils/artwork.ts +0 -30
- package/src/web/NativeAudioBrowser.playWhenReady.test.ts +0 -301
- package/src/web/TrackPlayer/PlaybackStateMachine.test.ts +0 -139
- package/src/web/TrackPlayer/PlaybackStateMachine.ts +0 -82
- package/src/web/TrackPlayer/PlaybackTimer.test.ts +0 -67
- package/src/web/TrackPlayer/PlaybackTimer.ts +0 -33
- package/src/web/TrackPlayer/Player.dispatch.test.ts +0 -229
- package/src/web/TrackPlayer/Player.load.test.ts +0 -86
- package/src/web/TrackPlayer/PlayingStateFactory.test.ts +0 -51
- package/src/web/TrackPlayer/PlayingStateFactory.ts +0 -24
- package/src/web/TrackPlayer/QueueManager.test.ts +0 -289
- package/src/web/TrackPlayer/QueueManager.ts +0 -302
- package/src/web/TrackPlayer/QueuePlayer.ts +0 -188
- package/src/web/TrackPlayer/VolumeFader.ts +0 -74
- package/src/web/browser/__tests__/layer-resolver.test.ts +0 -69
- package/src/web/browser/assertBrowsePageShape.test.ts +0 -27
- package/src/web/browser/assertBrowsePageShape.ts +0 -27
- package/src/web/browser/classifyTrackNavigation.test.ts +0 -41
- package/src/web/browser/classifyTrackNavigation.ts +0 -35
- package/src/web/browser/parseSearchResponse.test.ts +0 -25
- package/src/web/browser/parseSearchResponse.ts +0 -15
- package/src/web/http/RequestConfigBuilder.test.ts +0 -59
- package/src/web/playbackErrorKind.test.ts +0 -55
- package/src/web/playbackErrorKind.ts +0 -56
- package/src/web/player/MediaSessionManager.test.ts +0 -220
- package/src/web/player/MediaSessionManager.ts +0 -151
- package/src/web/player/NowPlayingManager.test.ts +0 -46
- package/src/web/player/RemoteCommandController.test.ts +0 -171
- package/src/web/player/RemoteCommandController.ts +0 -166
|
@@ -8,7 +8,6 @@ import android.os.Handler
|
|
|
8
8
|
import android.os.IBinder
|
|
9
9
|
import android.os.Looper
|
|
10
10
|
import androidx.annotation.Keep
|
|
11
|
-
import androidx.car.app.connection.CarConnection
|
|
12
11
|
import androidx.lifecycle.DefaultLifecycleObserver
|
|
13
12
|
import androidx.lifecycle.LifecycleOwner
|
|
14
13
|
import androidx.lifecycle.ProcessLifecycleOwner
|
|
@@ -16,41 +15,38 @@ import androidx.media3.session.MediaBrowser
|
|
|
16
15
|
import androidx.media3.session.SessionToken
|
|
17
16
|
import com.audiobrowser.browser.BrowserConfig
|
|
18
17
|
import com.audiobrowser.browser.BrowserManager
|
|
18
|
+
import com.audiobrowser.browser.handleTrackLoad
|
|
19
19
|
import com.audiobrowser.browser.CallbackException
|
|
20
20
|
import com.audiobrowser.browser.ContentNotFoundException
|
|
21
21
|
import com.audiobrowser.browser.HttpStatusException
|
|
22
22
|
import com.audiobrowser.browser.NetworkException
|
|
23
|
-
import com.audiobrowser.browser.handleTrackLoad
|
|
24
|
-
import com.audiobrowser.browser.resolveMediaUrl
|
|
25
23
|
import com.audiobrowser.extension.NumberExt.Companion.toSeconds
|
|
24
|
+
import com.audiobrowser.http.RequestConfigBuilder
|
|
25
|
+
import com.audiobrowser.model.PlaybackMetadata
|
|
26
26
|
import com.audiobrowser.model.PlayerSetupOptions
|
|
27
27
|
import com.audiobrowser.model.PlayerUpdateOptions
|
|
28
|
-
import com.audiobrowser.player.Player
|
|
29
28
|
import com.audiobrowser.util.BatteryOptimizationHelper
|
|
30
29
|
import com.audiobrowser.util.BatteryWarningStore
|
|
31
30
|
import com.audiobrowser.util.BrowserPathHelper
|
|
32
|
-
import com.audiobrowser.util.
|
|
33
|
-
import com.audiobrowser.util.OutputSwitcher
|
|
31
|
+
import com.audiobrowser.util.CoilBitmapLoader
|
|
34
32
|
import com.audiobrowser.util.SystemVolumeMonitor
|
|
35
33
|
import com.facebook.proguard.annotations.DoNotStrip
|
|
36
34
|
import com.google.common.util.concurrent.ListenableFuture
|
|
37
35
|
import com.margelo.nitro.NitroModules
|
|
36
|
+
import com.margelo.nitro.audiobrowser.ChapterMetadata
|
|
37
|
+
import com.margelo.nitro.audiobrowser.TimedMetadata
|
|
38
|
+
import com.margelo.nitro.audiobrowser.TrackMetadata
|
|
38
39
|
import com.margelo.nitro.audiobrowser.BatteryOptimizationStatus
|
|
39
40
|
import com.margelo.nitro.audiobrowser.BatteryOptimizationStatusChangedEvent
|
|
40
41
|
import com.margelo.nitro.audiobrowser.BatteryWarningPendingChangedEvent
|
|
41
|
-
import com.margelo.nitro.audiobrowser.ChapterMetadata
|
|
42
42
|
import com.margelo.nitro.audiobrowser.EqualizerSettings
|
|
43
43
|
import com.margelo.nitro.audiobrowser.FavoriteChangedEvent
|
|
44
44
|
import com.margelo.nitro.audiobrowser.FormatNavigationErrorParams
|
|
45
45
|
import com.margelo.nitro.audiobrowser.FormattedNavigationError
|
|
46
|
-
import com.margelo.nitro.audiobrowser.Gate
|
|
47
|
-
import com.margelo.nitro.audiobrowser.GateDecision
|
|
48
|
-
import com.margelo.nitro.audiobrowser.GateEvent
|
|
49
46
|
import com.margelo.nitro.audiobrowser.HybridAudioBrowserSpec
|
|
47
|
+
import com.margelo.nitro.audiobrowser.IosOutput
|
|
50
48
|
import com.margelo.nitro.audiobrowser.MediaRequestConfig
|
|
51
49
|
import com.margelo.nitro.audiobrowser.NativeBrowserConfiguration
|
|
52
|
-
import com.margelo.nitro.audiobrowser.NativeGateRequest
|
|
53
|
-
import com.margelo.nitro.audiobrowser.NativeSetupPlayerOptions
|
|
54
50
|
import com.margelo.nitro.audiobrowser.NativeUpdateOptions
|
|
55
51
|
import com.margelo.nitro.audiobrowser.NavigationError
|
|
56
52
|
import com.margelo.nitro.audiobrowser.NavigationErrorEvent
|
|
@@ -58,7 +54,7 @@ import com.margelo.nitro.audiobrowser.NavigationErrorType
|
|
|
58
54
|
import com.margelo.nitro.audiobrowser.NowPlayingMetadata
|
|
59
55
|
import com.margelo.nitro.audiobrowser.NowPlayingUpdate
|
|
60
56
|
import com.margelo.nitro.audiobrowser.Options
|
|
61
|
-
import com.margelo.nitro.audiobrowser.
|
|
57
|
+
import com.margelo.nitro.audiobrowser.PartialSetupPlayerOptions
|
|
62
58
|
import com.margelo.nitro.audiobrowser.Playback
|
|
63
59
|
import com.margelo.nitro.audiobrowser.PlaybackActiveTrackChangedEvent
|
|
64
60
|
import com.margelo.nitro.audiobrowser.PlaybackError
|
|
@@ -66,7 +62,6 @@ import com.margelo.nitro.audiobrowser.PlaybackErrorEvent
|
|
|
66
62
|
import com.margelo.nitro.audiobrowser.PlaybackPlayWhenReadyChangedEvent
|
|
67
63
|
import com.margelo.nitro.audiobrowser.PlaybackProgressUpdatedEvent
|
|
68
64
|
import com.margelo.nitro.audiobrowser.PlaybackQueueEndedEvent
|
|
69
|
-
import com.margelo.nitro.audiobrowser.PlaybackState
|
|
70
65
|
import com.margelo.nitro.audiobrowser.PlayingState
|
|
71
66
|
import com.margelo.nitro.audiobrowser.Progress
|
|
72
67
|
import com.margelo.nitro.audiobrowser.RemoteJumpBackwardEvent
|
|
@@ -74,14 +69,15 @@ import com.margelo.nitro.audiobrowser.RemoteJumpForwardEvent
|
|
|
74
69
|
import com.margelo.nitro.audiobrowser.RemotePlayIdEvent
|
|
75
70
|
import com.margelo.nitro.audiobrowser.RemotePlaySearchEvent
|
|
76
71
|
import com.margelo.nitro.audiobrowser.RemoteSeekEvent
|
|
72
|
+
import com.margelo.nitro.audiobrowser.RemoteSetRatingEvent
|
|
77
73
|
import com.margelo.nitro.audiobrowser.RemoteSkipEvent
|
|
78
74
|
import com.margelo.nitro.audiobrowser.RepeatMode
|
|
79
75
|
import com.margelo.nitro.audiobrowser.RepeatModeChangedEvent
|
|
76
|
+
import com.margelo.nitro.audiobrowser.RequestConfig
|
|
80
77
|
import com.margelo.nitro.audiobrowser.ResolvedTrack
|
|
81
78
|
import com.margelo.nitro.audiobrowser.SleepTimer
|
|
82
|
-
import com.margelo.nitro.audiobrowser.TimedMetadata
|
|
83
79
|
import com.margelo.nitro.audiobrowser.Track
|
|
84
|
-
import com.margelo.nitro.audiobrowser.
|
|
80
|
+
import com.margelo.nitro.audiobrowser.UpdateOptions
|
|
85
81
|
import com.margelo.nitro.core.Promise
|
|
86
82
|
import java.util.concurrent.TimeUnit
|
|
87
83
|
import kotlin.coroutines.resume
|
|
@@ -90,7 +86,6 @@ import kotlin.coroutines.suspendCoroutine
|
|
|
90
86
|
import kotlinx.coroutines.CancellationException
|
|
91
87
|
import kotlinx.coroutines.Job
|
|
92
88
|
import kotlinx.coroutines.MainScope
|
|
93
|
-
import kotlinx.coroutines.cancel
|
|
94
89
|
import kotlinx.coroutines.cancelChildren
|
|
95
90
|
import kotlinx.coroutines.delay
|
|
96
91
|
import kotlinx.coroutines.launch
|
|
@@ -100,41 +95,6 @@ import timber.log.Timber
|
|
|
100
95
|
@Keep
|
|
101
96
|
@DoNotStrip
|
|
102
97
|
class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Called by Nitro when the JS object is destroyed (incl. JS runtime reloads).
|
|
106
|
-
*
|
|
107
|
-
* The Service outlives this object, so everything registered in `init` or on connect has to be
|
|
108
|
-
* undone here. Left alone, the running [Player] goes on invoking callbacks into a dead JSI
|
|
109
|
-
* runtime, and every reload strands another ServiceConnection and lifecycle observer, each
|
|
110
|
-
* retaining a BrowserManager.
|
|
111
|
-
*/
|
|
112
|
-
override fun dispose() {
|
|
113
|
-
systemVolumeMonitor.destroy()
|
|
114
|
-
outputMonitor.destroy()
|
|
115
|
-
|
|
116
|
-
connectedService?.let { service ->
|
|
117
|
-
service.player.setCallbacks(null)
|
|
118
|
-
service.player.browser = null
|
|
119
|
-
service.onBatteryWarningPendingChanged = null
|
|
120
|
-
}
|
|
121
|
-
connectedService = null
|
|
122
|
-
mediaBrowserFuture = null
|
|
123
|
-
|
|
124
|
-
serviceBinding.unbind(this)
|
|
125
|
-
|
|
126
|
-
// Only when still ours: on a reload the replacement instance may already own the slot.
|
|
127
|
-
if (carConnectionTarget === onCarConnectedChanged) carConnectionTarget = null
|
|
128
|
-
|
|
129
|
-
// Drop queued work first, then post the removal — LifecycleRegistry is main-thread only,
|
|
130
|
-
// which is why the observer is added the same way.
|
|
131
|
-
handler.removeCallbacksAndMessages(null)
|
|
132
|
-
handler.post { ProcessLifecycleOwner.get().lifecycle.removeObserver(lifecycleObserver) }
|
|
133
|
-
|
|
134
|
-
mainScope.cancel()
|
|
135
|
-
super.dispose()
|
|
136
|
-
}
|
|
137
|
-
|
|
138
98
|
private val mainScope = MainScope()
|
|
139
99
|
private var navigationJob: Job? = null
|
|
140
100
|
private val handler = Handler(Looper.getMainLooper())
|
|
@@ -147,18 +107,14 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
147
107
|
NativeBrowserConfiguration(
|
|
148
108
|
path = null,
|
|
149
109
|
request = null,
|
|
150
|
-
requestResolver = null,
|
|
151
|
-
browse = null,
|
|
152
|
-
browseResolver = null,
|
|
153
110
|
media = null,
|
|
154
111
|
artwork = null,
|
|
155
|
-
nowPlayingArtwork = null,
|
|
156
112
|
routes = null,
|
|
157
113
|
singleTrack = null,
|
|
158
114
|
handleTrackLoad = null,
|
|
159
115
|
androidControllerOfflineError = null,
|
|
160
|
-
|
|
161
|
-
|
|
116
|
+
carPlayUpNextButton = null,
|
|
117
|
+
carPlayNowPlayingButtons = null,
|
|
162
118
|
formatNavigationError = null,
|
|
163
119
|
)
|
|
164
120
|
|
|
@@ -167,26 +123,17 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
167
123
|
setOnPathChanged { path -> onPathChanged(path) }
|
|
168
124
|
setOnContentChanged { content -> onContentChanged(content) }
|
|
169
125
|
setOnTabsChanged { tabs -> onTabsChanged(tabs) }
|
|
170
|
-
setOnArtworkRegistriesCleared { connectedService?.player?.browseArtworkRegistry?.clear() }
|
|
171
126
|
}
|
|
172
127
|
|
|
173
128
|
private val systemVolumeMonitor = SystemVolumeMonitor(context)
|
|
174
|
-
private val outputMonitor = OutputMonitor(context)
|
|
175
129
|
|
|
176
130
|
// MARK: Player state
|
|
177
131
|
private var updateOptions: PlayerUpdateOptions = PlayerUpdateOptions()
|
|
178
132
|
private var mediaBrowserFuture: ListenableFuture<MediaBrowser>? = null
|
|
179
133
|
private var setupOptions = PlayerSetupOptions()
|
|
180
134
|
private var connectedService: Service? = null
|
|
181
|
-
|
|
182
|
-
private val serviceBinding = ServiceBinding(context)
|
|
183
135
|
private var setupPromise: ((Unit) -> Unit)? = null
|
|
184
136
|
|
|
185
|
-
// Initial player state staged before the player exists — from setup options or the imperative
|
|
186
|
-
// setters called pre-bind. Strict last-write-wins; consumed when the player comes up.
|
|
187
|
-
private var pendingPlayWhenReady: Boolean? = null
|
|
188
|
-
private var pendingRepeatMode: RepeatMode? = null
|
|
189
|
-
|
|
190
137
|
/** Post callback to main handler for consistent async delivery to JS - avoids deadlocks */
|
|
191
138
|
private fun post(block: () -> Unit) = handler.post(block)
|
|
192
139
|
|
|
@@ -197,21 +144,13 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
197
144
|
override var onNavigationError: (NavigationErrorEvent) -> Unit = {}
|
|
198
145
|
override var onFormattedNavigationError: (FormattedNavigationError?) -> Unit = {}
|
|
199
146
|
|
|
200
|
-
// MARK: Gate callbacks (native→JS; set from JS, native CALLS them)
|
|
201
|
-
// Default resolver: only reachable in the init window where the native side has recorded
|
|
202
|
-
// hasResolver=true but JS hasn't yet assigned the real `resolveGate` slot. It DENIES by default
|
|
203
|
-
// (gated=true) so an active gate never serves content during that window — same fail-closed
|
|
204
|
-
// direction as the resolver-error path in [gateDecision]. The static-gate fast path skips it
|
|
205
|
-
// entirely once a resolver-less gate is set.
|
|
206
|
-
override var resolveGate: (request: NativeGateRequest) -> Promise<Promise<GateDecision>> = {
|
|
207
|
-
Promise.resolved(Promise.resolved(GateDecision(gated = true, gate = null)))
|
|
208
|
-
}
|
|
209
|
-
override var onGate: (event: GateEvent) -> Unit = {}
|
|
210
|
-
|
|
211
147
|
// MARK: Player callbacks
|
|
212
148
|
override var onPlaybackChanged: (data: Playback) -> Unit = {}
|
|
149
|
+
override var onRemoteBookmark: () -> Unit = {}
|
|
150
|
+
override var onRemoteDislike: () -> Unit = {}
|
|
213
151
|
override var onRemoteJumpBackward: (RemoteJumpBackwardEvent) -> Unit = {}
|
|
214
152
|
override var onRemoteJumpForward: (RemoteJumpForwardEvent) -> Unit = {}
|
|
153
|
+
override var onRemoteLike: () -> Unit = {}
|
|
215
154
|
override var onRemoteNext: () -> Unit = {}
|
|
216
155
|
override var onRemotePause: () -> Unit = {}
|
|
217
156
|
override var onChapterMetadata: (chapters: Array<ChapterMetadata>) -> Unit = {}
|
|
@@ -223,7 +162,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
223
162
|
{}
|
|
224
163
|
override var onPlaybackPlayingState: (data: PlayingState) -> Unit = {}
|
|
225
164
|
override var onPlaybackProgressUpdated: (data: PlaybackProgressUpdatedEvent) -> Unit = {}
|
|
226
|
-
override var onPlaybackInterval: () -> Unit = {}
|
|
227
165
|
override var onPlaybackQueueEnded: (data: PlaybackQueueEndedEvent) -> Unit = {}
|
|
228
166
|
override var onPlaybackQueueChanged: (queue: Array<Track>) -> Unit = {}
|
|
229
167
|
override var onPlaybackRepeatModeChanged: (data: RepeatModeChangedEvent) -> Unit = {}
|
|
@@ -233,6 +171,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
233
171
|
override var onRemotePlaySearch: (RemotePlaySearchEvent) -> Unit = {}
|
|
234
172
|
override var onRemotePrevious: () -> Unit = {}
|
|
235
173
|
override var onRemoteSeek: (RemoteSeekEvent) -> Unit = {}
|
|
174
|
+
override var onRemoteSetRating: (RemoteSetRatingEvent) -> Unit = {}
|
|
236
175
|
override var onRemoteSkip: (RemoteSkipEvent) -> Unit = {}
|
|
237
176
|
override var onRemoteStop: () -> Unit = {}
|
|
238
177
|
override var onOptionsChanged: (Options) -> Unit = {}
|
|
@@ -245,11 +184,14 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
245
184
|
override var onBatteryOptimizationStatusChanged: (BatteryOptimizationStatusChangedEvent) -> Unit =
|
|
246
185
|
{}
|
|
247
186
|
override var onSystemVolumeChanged: (Double) -> Unit = {}
|
|
248
|
-
override var
|
|
187
|
+
override var onIosOutputChanged: (IosOutput) -> Unit = {}
|
|
249
188
|
|
|
250
189
|
// MARK: Remote handlers
|
|
190
|
+
override var handleRemoteBookmark: (() -> Unit)? = null
|
|
191
|
+
override var handleRemoteDislike: (() -> Unit)? = null
|
|
251
192
|
override var handleRemoteJumpBackward: ((RemoteJumpBackwardEvent) -> Unit)? = null
|
|
252
193
|
override var handleRemoteJumpForward: ((RemoteJumpForwardEvent) -> Unit)? = null
|
|
194
|
+
override var handleRemoteLike: (() -> Unit)? = null
|
|
253
195
|
override var handleRemoteNext: (() -> Unit)? = null
|
|
254
196
|
override var handleRemotePause: (() -> Unit)? = null
|
|
255
197
|
override var handleRemotePlay: (() -> Unit)? = null
|
|
@@ -274,7 +216,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
274
216
|
try {
|
|
275
217
|
Timber.d("Attempting to auto-bind to existing AudioBrowserService from AudioBrowser")
|
|
276
218
|
val intent = Intent(context, Service::class.java)
|
|
277
|
-
val bound =
|
|
219
|
+
val bound = context.bindService(intent, this@AudioBrowser, Context.BIND_AUTO_CREATE)
|
|
278
220
|
Timber.d("Auto-bind result: $bound")
|
|
279
221
|
|
|
280
222
|
if (!bound) {
|
|
@@ -290,14 +232,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
290
232
|
handler.post { ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleObserver) }
|
|
291
233
|
|
|
292
234
|
// Observe system volume changes
|
|
293
|
-
systemVolumeMonitor.setOnVolumeChanged { volume ->
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
outputMonitor.setOnOutputChanged { output -> post { onOutputChanged(output) } }
|
|
297
|
-
outputMonitor.start()
|
|
298
|
-
|
|
299
|
-
// Observe the car connection (Android Auto / Android Automotive)
|
|
300
|
-
startCarConnectionObserver(context, handler)
|
|
235
|
+
systemVolumeMonitor.setOnVolumeChanged { volume ->
|
|
236
|
+
post { onSystemVolumeChanged(volume) }
|
|
237
|
+
}
|
|
301
238
|
}
|
|
302
239
|
|
|
303
240
|
// ============================================================================
|
|
@@ -307,12 +244,8 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
307
244
|
internal fun buildConfig(): BrowserConfig {
|
|
308
245
|
return BrowserConfig(
|
|
309
246
|
request = _configuration.request,
|
|
310
|
-
requestResolver = _configuration.requestResolver,
|
|
311
|
-
browse = _configuration.browse,
|
|
312
|
-
browseResolver = _configuration.browseResolver,
|
|
313
247
|
media = _configuration.media,
|
|
314
248
|
artwork = _configuration.artwork,
|
|
315
|
-
nowPlayingArtwork = _configuration.nowPlayingArtwork,
|
|
316
249
|
routes = _configuration.routes,
|
|
317
250
|
singleTrack = _configuration.singleTrack ?: false,
|
|
318
251
|
androidControllerOfflineError = _configuration.androidControllerOfflineError ?: true,
|
|
@@ -320,14 +253,34 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
320
253
|
}
|
|
321
254
|
|
|
322
255
|
/**
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
|
|
326
|
-
|
|
256
|
+
* Returns the artwork configuration for use by CoilBitmapLoader. This provides access to the base
|
|
257
|
+
* request config and artwork-specific config.
|
|
258
|
+
*/
|
|
259
|
+
fun getArtworkConfig(): CoilBitmapLoader.ArtworkConfig? {
|
|
260
|
+
val artworkConfig = _configuration.artwork ?: return null
|
|
261
|
+
val baseConfig =
|
|
262
|
+
_configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
|
|
263
|
+
?: RequestConfig(null, null, null, null, null, null, null, null)
|
|
264
|
+
return CoilBitmapLoader.ArtworkConfig(baseConfig, artworkConfig)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Creates a request config for media URL transformation by merging base and media configs.
|
|
269
|
+
* Returns null if no media configuration is set.
|
|
327
270
|
*/
|
|
328
271
|
fun getMediaRequestConfig(originalUrl: String): MediaRequestConfig? {
|
|
272
|
+
val mediaConfig = _configuration.media ?: return null
|
|
273
|
+
|
|
329
274
|
return try {
|
|
330
|
-
|
|
275
|
+
// Create base request config with the original URL as path
|
|
276
|
+
val baseConfig =
|
|
277
|
+
_configuration.request?.let { RequestConfigBuilder.toRequestConfig(it) }
|
|
278
|
+
?: RequestConfig(null, null, null, null, null, null, null, null)
|
|
279
|
+
val urlRequestConfig = RequestConfig(null, originalUrl, null, null, null, null, null, null)
|
|
280
|
+
val mergedBaseConfig = RequestConfigBuilder.mergeConfig(baseConfig, urlRequestConfig)
|
|
281
|
+
|
|
282
|
+
// Apply media transformation
|
|
283
|
+
runBlocking { RequestConfigBuilder.mergeConfig(mergedBaseConfig, mediaConfig) }
|
|
331
284
|
} catch (e: Exception) {
|
|
332
285
|
Timber.e(e, "Failed to transform media URL: $originalUrl")
|
|
333
286
|
null
|
|
@@ -339,15 +292,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
339
292
|
return _configuration.routes?.any { it.path != BrowserManager.SEARCH_ROUTE_PATH } == true
|
|
340
293
|
}
|
|
341
294
|
|
|
342
|
-
|
|
343
|
-
// which can only run on the JS thread. Callers MUST invoke this from a
|
|
344
|
-
// coroutine (off the JS thread) — never via runBlocking on a synchronous Nitro
|
|
345
|
-
// setter, which runs on the JS thread and would deadlock (the JS thread blocks
|
|
346
|
-
// waiting for callbacks that need that same thread to run).
|
|
347
|
-
private suspend fun getDefaultPath(): String? {
|
|
295
|
+
private fun getDefaultPath(): String? {
|
|
348
296
|
return try {
|
|
349
297
|
browserManager.config = buildConfig()
|
|
350
|
-
val tabs = browserManager.queryTabs()
|
|
298
|
+
val tabs = runBlocking { browserManager.queryTabs() }
|
|
351
299
|
if (tabs.isNotEmpty()) {
|
|
352
300
|
Timber.d("Using first tab as default path: ${tabs[0].url}")
|
|
353
301
|
tabs[0].url
|
|
@@ -355,8 +303,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
355
303
|
Timber.d("Using root path as default: /")
|
|
356
304
|
"/"
|
|
357
305
|
}
|
|
358
|
-
} catch (e: CancellationException) {
|
|
359
|
-
throw e // Rethrow so cooperative cancellation isn't swallowed
|
|
360
306
|
} catch (e: Exception) {
|
|
361
307
|
Timber.e(e, "Failed to get default path, falling back to /")
|
|
362
308
|
"/"
|
|
@@ -372,25 +318,23 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
372
318
|
set(value) {
|
|
373
319
|
if (hasValidConfiguration()) {
|
|
374
320
|
browserManager.config = buildConfig()
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
} catch (e: Exception) {
|
|
391
|
-
handleBrowserException(e, path, "setting path: $path")
|
|
321
|
+
(value ?: getDefaultPath())?.let { path ->
|
|
322
|
+
clearNavigationError()
|
|
323
|
+
|
|
324
|
+
// Cancel previous navigation to avoid race conditions
|
|
325
|
+
navigationJob?.cancel()
|
|
326
|
+
|
|
327
|
+
navigationJob =
|
|
328
|
+
mainScope.launch {
|
|
329
|
+
try {
|
|
330
|
+
browserManager.navigate(path)
|
|
331
|
+
} catch (e: CancellationException) {
|
|
332
|
+
throw e // Rethrow to properly cancel
|
|
333
|
+
} catch (e: Exception) {
|
|
334
|
+
handleBrowserException(e, path, "setting path: $path")
|
|
335
|
+
}
|
|
392
336
|
}
|
|
393
|
-
|
|
337
|
+
}
|
|
394
338
|
}
|
|
395
339
|
}
|
|
396
340
|
|
|
@@ -408,54 +352,45 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
408
352
|
// This allows Android Auto to start browsing content
|
|
409
353
|
connectedService?.player?.notifyBrowserConfigurationReady()
|
|
410
354
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
throw e // Rethrow to properly cancel
|
|
428
|
-
} catch (e: Exception) {
|
|
429
|
-
handleBrowserException(e, path, "setting configuration path: $path")
|
|
355
|
+
// Navigate to initial path or default to first tab
|
|
356
|
+
(value.path ?: getDefaultPath())?.let { path ->
|
|
357
|
+
clearNavigationError()
|
|
358
|
+
|
|
359
|
+
// Cancel previous navigation to avoid race conditions
|
|
360
|
+
navigationJob?.cancel()
|
|
361
|
+
|
|
362
|
+
navigationJob =
|
|
363
|
+
mainScope.launch {
|
|
364
|
+
try {
|
|
365
|
+
browserManager.navigate(path)
|
|
366
|
+
} catch (e: CancellationException) {
|
|
367
|
+
throw e // Rethrow to properly cancel
|
|
368
|
+
} catch (e: Exception) {
|
|
369
|
+
handleBrowserException(e, path, "setting configuration path: $path")
|
|
370
|
+
}
|
|
430
371
|
}
|
|
431
|
-
|
|
372
|
+
}
|
|
432
373
|
}
|
|
433
374
|
|
|
434
375
|
private var navigationError: NavigationError? = null
|
|
435
376
|
private var formattedNavigationError: FormattedNavigationError? = null
|
|
436
377
|
|
|
437
378
|
override fun getNavigationError(): NavigationError? = navigationError
|
|
438
|
-
|
|
439
379
|
override fun getFormattedNavigationError(): FormattedNavigationError? = formattedNavigationError
|
|
440
380
|
|
|
441
381
|
/** Creates a default formatted error from a NavigationError */
|
|
442
382
|
private fun defaultFormattedError(error: NavigationError): FormattedNavigationError {
|
|
443
|
-
val title =
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
error.statusCode?.let { httpStatusText(it.toInt()) } ?: "Server Error"
|
|
450
|
-
}
|
|
451
|
-
NavigationErrorType.CALLBACK_ERROR -> "Error"
|
|
452
|
-
NavigationErrorType.UNKNOWN_ERROR -> "Error"
|
|
453
|
-
// Not a failure — a container that resolved with no children. Neutral copy. See ADR 0001.
|
|
454
|
-
NavigationErrorType.EMPTY_CONTENT -> "Nothing here"
|
|
455
|
-
NavigationErrorType.TIMEOUT -> "Couldn't load"
|
|
383
|
+
val title = when (error.code) {
|
|
384
|
+
NavigationErrorType.CONTENT_NOT_FOUND -> "Content Not Found"
|
|
385
|
+
NavigationErrorType.NETWORK_ERROR -> "Network Error"
|
|
386
|
+
NavigationErrorType.HTTP_ERROR -> {
|
|
387
|
+
// Use system-localized HTTP status text (e.g., "Not Found", "Service Unavailable")
|
|
388
|
+
error.statusCode?.let { httpStatusText(it.toInt()) } ?: "Server Error"
|
|
456
389
|
}
|
|
457
|
-
|
|
458
|
-
|
|
390
|
+
NavigationErrorType.CALLBACK_ERROR -> "Error"
|
|
391
|
+
NavigationErrorType.UNKNOWN_ERROR -> "Error"
|
|
392
|
+
}
|
|
393
|
+
return FormattedNavigationError(title, error.message)
|
|
459
394
|
}
|
|
460
395
|
|
|
461
396
|
/** Returns localized HTTP status text for the given status code */
|
|
@@ -522,35 +457,19 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
522
457
|
}
|
|
523
458
|
is NetworkException -> {
|
|
524
459
|
Timber.e(e, "Network error $logContext")
|
|
525
|
-
setNavigationError(
|
|
526
|
-
NavigationErrorType.NETWORK_ERROR,
|
|
527
|
-
e.message ?: "Network request failed",
|
|
528
|
-
path,
|
|
529
|
-
)
|
|
460
|
+
setNavigationError(NavigationErrorType.NETWORK_ERROR, e.message ?: "Network request failed", path)
|
|
530
461
|
}
|
|
531
462
|
is ContentNotFoundException -> {
|
|
532
463
|
Timber.e(e, "Content not found $logContext")
|
|
533
|
-
setNavigationError(
|
|
534
|
-
NavigationErrorType.CONTENT_NOT_FOUND,
|
|
535
|
-
e.message ?: "Content not found",
|
|
536
|
-
path,
|
|
537
|
-
)
|
|
464
|
+
setNavigationError(NavigationErrorType.CONTENT_NOT_FOUND, e.message ?: "Content not found", path)
|
|
538
465
|
}
|
|
539
466
|
is CallbackException -> {
|
|
540
467
|
Timber.e(e, "Callback error $logContext")
|
|
541
|
-
setNavigationError(
|
|
542
|
-
NavigationErrorType.CALLBACK_ERROR,
|
|
543
|
-
e.message ?: "An error occurred",
|
|
544
|
-
path,
|
|
545
|
-
)
|
|
468
|
+
setNavigationError(NavigationErrorType.CALLBACK_ERROR, e.message ?: "An error occurred", path)
|
|
546
469
|
}
|
|
547
470
|
else -> {
|
|
548
471
|
Timber.e(e, "Unexpected error $logContext")
|
|
549
|
-
setNavigationError(
|
|
550
|
-
NavigationErrorType.UNKNOWN_ERROR,
|
|
551
|
-
e.message ?: "An unexpected error occurred",
|
|
552
|
-
path,
|
|
553
|
-
)
|
|
472
|
+
setNavigationError(NavigationErrorType.UNKNOWN_ERROR, e.message ?: "An unexpected error occurred", path)
|
|
554
473
|
}
|
|
555
474
|
}
|
|
556
475
|
}
|
|
@@ -610,17 +529,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
610
529
|
val index = player.tracks.indexOfFirst { it.src == trackId }
|
|
611
530
|
if (index >= 0) {
|
|
612
531
|
Timber.d("Queue already from $parentPath, skipping to index $index")
|
|
613
|
-
handleTrackLoad(
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
index.toDouble(),
|
|
618
|
-
intercepted = {},
|
|
619
|
-
defaultBehavior = {
|
|
620
|
-
player.skipTo(index)
|
|
621
|
-
player.play()
|
|
622
|
-
},
|
|
623
|
-
)
|
|
532
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, player.tracks, index.toDouble(), intercepted = {}, defaultBehavior = {
|
|
533
|
+
player.skipTo(index)
|
|
534
|
+
player.play()
|
|
535
|
+
})
|
|
624
536
|
return@launch
|
|
625
537
|
}
|
|
626
538
|
}
|
|
@@ -633,31 +545,17 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
633
545
|
Timber.d(
|
|
634
546
|
"Loading expanded queue: ${tracks.size} tracks, starting at index $startIndex"
|
|
635
547
|
)
|
|
636
|
-
handleTrackLoad(
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
tracks,
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
defaultBehavior = {
|
|
643
|
-
// Replace queue and seek to selected track
|
|
644
|
-
// Use internal player methods directly to avoid blocking on main thread
|
|
645
|
-
player.setQueue(tracks, startIndex, sourcePath = parentPath)
|
|
646
|
-
player.play()
|
|
647
|
-
},
|
|
648
|
-
)
|
|
548
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, tracks, startIndex.toDouble(), intercepted = {}, defaultBehavior = {
|
|
549
|
+
// Replace queue and seek to selected track
|
|
550
|
+
// Use internal player methods directly to avoid blocking on main thread
|
|
551
|
+
player.setQueue(tracks, startIndex, sourcePath = parentPath)
|
|
552
|
+
player.play()
|
|
553
|
+
})
|
|
649
554
|
return@launch
|
|
650
555
|
} else {
|
|
651
556
|
// Fallback: just load the single track
|
|
652
557
|
Timber.w("Queue expansion failed, loading single track")
|
|
653
|
-
handleTrackLoad(
|
|
654
|
-
_configuration.handleTrackLoad,
|
|
655
|
-
track,
|
|
656
|
-
arrayOf(track),
|
|
657
|
-
0.0,
|
|
658
|
-
intercepted = {},
|
|
659
|
-
defaultBehavior = { player.load(track) },
|
|
660
|
-
)
|
|
558
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
|
|
661
559
|
}
|
|
662
560
|
}
|
|
663
561
|
// Navigate to browsable track to show browsing UI
|
|
@@ -668,14 +566,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
668
566
|
// If track is playable (has src), load it into player
|
|
669
567
|
track.src != null -> {
|
|
670
568
|
Timber.d("Loading playable track into player: ${track.title}")
|
|
671
|
-
handleTrackLoad(
|
|
672
|
-
_configuration.handleTrackLoad,
|
|
673
|
-
track,
|
|
674
|
-
arrayOf(track),
|
|
675
|
-
0.0,
|
|
676
|
-
intercepted = {},
|
|
677
|
-
defaultBehavior = { player.load(track) },
|
|
678
|
-
)
|
|
569
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
|
|
679
570
|
}
|
|
680
571
|
else -> {
|
|
681
572
|
throw IllegalArgumentException("Track must have either an 'url' or an 'src' property")
|
|
@@ -716,132 +607,32 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
716
607
|
}
|
|
717
608
|
}
|
|
718
609
|
|
|
719
|
-
override fun invalidateAllContent() {
|
|
720
|
-
Timber.d("Invalidating all content")
|
|
721
|
-
|
|
722
|
-
// Clear all cached content so every path re-fetches fresh data
|
|
723
|
-
browserManager.clearContentCache()
|
|
724
|
-
|
|
725
|
-
// Notify external media controllers (Android Auto) to refresh subscribed paths
|
|
726
|
-
connectedService?.player?.invalidateAllContent()
|
|
727
|
-
|
|
728
|
-
// Refresh whatever the browser is currently viewing
|
|
729
|
-
mainScope.launch { browserManager.refresh() }
|
|
730
|
-
}
|
|
731
|
-
|
|
732
610
|
override fun setFavorites(favorites: Array<String>) {
|
|
733
611
|
browserManager.setFavorites(favorites.toList())
|
|
734
612
|
}
|
|
735
613
|
|
|
736
|
-
// MARK: Gate
|
|
737
|
-
|
|
738
|
-
/** A gate decision for one request: whether to gate, and which chrome to render. */
|
|
739
|
-
data class GateOutcome(val gated: Boolean, val chrome: Gate?)
|
|
740
|
-
|
|
741
|
-
// The minimal chrome rendered when a gate is active but no override or stored
|
|
742
|
-
// default chrome exists (the resolver-only setGate overload).
|
|
743
|
-
private val builtInGate = Gate("Unavailable", null)
|
|
744
|
-
|
|
745
|
-
/**
|
|
746
|
-
* The three gate fields as one immutable triple so [gateDecision] reads them as a unit. Written
|
|
747
|
-
* from the JS thread, read from the Media3 application thread (the enforcement sites in
|
|
748
|
-
* MediaSessionCallback consult it) — hence the single field is @Volatile.
|
|
749
|
-
*
|
|
750
|
-
* Folding the three former @Volatile fields into one reference is what makes the read atomic:
|
|
751
|
-
*
|
|
752
|
-
* @Volatile gives per-field visibility but NO atomicity across a compound read, so reading three
|
|
753
|
-
* separate volatiles in [gateDecision] could interleave with a concurrent [clearGate] and yield
|
|
754
|
-
* a torn `(active=true, chrome=null)` state that crashed the force-unwrap at the serve sites.
|
|
755
|
-
* One volatile reference read once cannot tear.
|
|
756
|
-
*/
|
|
757
|
-
private data class GateState(val active: Boolean, val chrome: Gate?, val hasResolver: Boolean)
|
|
758
|
-
|
|
759
|
-
@Volatile private var gateState = GateState(active = false, chrome = null, hasResolver = false)
|
|
760
|
-
|
|
761
|
-
override fun setGate(gate: Gate?, hasResolver: Boolean) {
|
|
762
|
-
// Single atomic assignment — readers never see a half-updated triple.
|
|
763
|
-
gateState = GateState(active = true, chrome = gate, hasResolver = hasResolver)
|
|
764
|
-
// Re-query every subscribed parent so a connected controller (Android
|
|
765
|
-
// Auto) swaps its lists for the gate tile without reconnecting. Notify
|
|
766
|
-
// only — the content cache stays warm for when the gate clears.
|
|
767
|
-
connectedService?.player?.invalidateAllContent()
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
override fun clearGate() {
|
|
771
|
-
if (!gateState.active) return
|
|
772
|
-
// Single atomic assignment — readers never see a half-cleared triple.
|
|
773
|
-
gateState = GateState(active = false, chrome = null, hasResolver = false)
|
|
774
|
-
connectedService?.player?.invalidateAllContent()
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
/**
|
|
778
|
-
* The single gate choke point. Each enforcement site (browse / search) calls this for the current
|
|
779
|
-
* request and serves the gate chrome when [GateOutcome.gated] is true. Structurally similar to
|
|
780
|
-
* the iOS `gateDecision(for:)` helper, but note the concurrency model differs: iOS confines gate
|
|
781
|
-
* state to `@MainActor`; here the consistent read comes from snapshotting the single [gateState]
|
|
782
|
-
* reference once (see [GateState]).
|
|
783
|
-
* - No active gate → allow.
|
|
784
|
-
* - Active gate, no resolver → static fast path: gate with the stored default chrome (or built-in
|
|
785
|
-
* if none), no JS hop.
|
|
786
|
-
* - Active gate with a resolver → ask JS per request. A resolver that throws / rejects / times
|
|
787
|
-
* out FAILS CLOSED by design: while a gate is active the consumer has declared content blocked,
|
|
788
|
-
* so the only safe fallback when we cannot compute the per-request decision is the gate's own
|
|
789
|
-
* chrome — never the content. A *successful* `gated:false` still allows. Chrome order on a
|
|
790
|
-
* gated decision: override → stored default → built-in.
|
|
791
|
-
*
|
|
792
|
-
* Every gated return guards chrome against null (`?: builtInGate`) so a gated outcome always
|
|
793
|
-
* carries a renderable chrome — the serve sites force-unwrap it.
|
|
794
|
-
*/
|
|
795
|
-
suspend fun gateDecision(request: NativeGateRequest): GateOutcome {
|
|
796
|
-
// Read the whole gate triple once; a single volatile reference can't tear (see [GateState]).
|
|
797
|
-
val s = gateState
|
|
798
|
-
if (!s.active) return GateOutcome(false, null)
|
|
799
|
-
if (!s.hasResolver) return GateOutcome(true, s.chrome ?: builtInGate) // static fast path
|
|
800
|
-
val decision =
|
|
801
|
-
runCatching { resolveGate(request).await().await() }.getOrNull()
|
|
802
|
-
?: return GateOutcome(true, s.chrome ?: builtInGate) // fail CLOSED on resolver error
|
|
803
|
-
if (!decision.gated) return GateOutcome(false, null) // explicit allow
|
|
804
|
-
return GateOutcome(true, decision.gate ?: s.chrome ?: builtInGate)
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
// MARK: Car connection (Android Auto / Android Automotive)
|
|
808
|
-
|
|
809
|
-
override fun isCarConnected(): Boolean = carConnected
|
|
810
|
-
|
|
811
|
-
override var onCarConnectedChanged: (Boolean) -> Unit = {}
|
|
812
|
-
set(value) {
|
|
813
|
-
field = value
|
|
814
|
-
carConnectionTarget = value
|
|
815
|
-
// Immediately notify current state (the car may have connected before
|
|
816
|
-
// this JS runtime subscribed) — mirrors the iOS behavior.
|
|
817
|
-
value(carConnected)
|
|
818
|
-
}
|
|
819
|
-
|
|
820
614
|
// ============================================================================
|
|
821
615
|
// MARK: Player Setup and Options
|
|
822
616
|
// ============================================================================
|
|
823
617
|
|
|
824
|
-
override fun setupPlayer(options:
|
|
618
|
+
override fun setupPlayer(options: PartialSetupPlayerOptions): Promise<Unit> {
|
|
825
619
|
return Promise.async(mainScope) {
|
|
826
620
|
setupOptions.update(options)
|
|
827
|
-
// The bundled runtime options and initial state are part of the atomic launch
|
|
828
|
-
// description: stage them here, apply them together with the engine below (or at
|
|
829
|
-
// service connect). Last-write-wins with their imperative counterparts.
|
|
830
|
-
options.options?.let { updateOptions.updateFromBridge(it) }
|
|
831
|
-
options.repeatMode?.let { pendingRepeatMode = it }
|
|
832
|
-
options.playWhenReady?.let { pendingPlayWhenReady = it }
|
|
833
621
|
|
|
834
622
|
connectedService?.let {
|
|
835
|
-
it.player.applyOptions(updateOptions)
|
|
836
623
|
it.player.setup(setupOptions)
|
|
837
|
-
applyPendingPlayerState(it.player)
|
|
838
624
|
return@async
|
|
839
625
|
}
|
|
840
626
|
|
|
841
627
|
// Service not connected yet, bind to service
|
|
842
628
|
suspendCoroutine<Unit> { continuation ->
|
|
843
629
|
Timber.d("Binding to AudioBrowserService")
|
|
844
|
-
val bound =
|
|
630
|
+
val bound =
|
|
631
|
+
context.bindService(
|
|
632
|
+
Intent(context, Service::class.java),
|
|
633
|
+
this@AudioBrowser,
|
|
634
|
+
Context.BIND_AUTO_CREATE,
|
|
635
|
+
)
|
|
845
636
|
|
|
846
637
|
if (!bound) {
|
|
847
638
|
continuation.resumeWithException(
|
|
@@ -861,10 +652,8 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
861
652
|
connectedService?.let { player.applyOptions(updateOptions) }
|
|
862
653
|
}
|
|
863
654
|
|
|
864
|
-
override fun getOptions():
|
|
865
|
-
|
|
866
|
-
// merges into it and setup/connect applies it to the player.
|
|
867
|
-
return updateOptions.toNitro()
|
|
655
|
+
override fun getOptions(): UpdateOptions {
|
|
656
|
+
return player.getOptions().toNitro()
|
|
868
657
|
}
|
|
869
658
|
|
|
870
659
|
// ============================================================================
|
|
@@ -879,9 +668,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
879
668
|
player.stop()
|
|
880
669
|
delay(300) // Allow playback to stop
|
|
881
670
|
player.clear()
|
|
882
|
-
// clear() while IDLE emits no engine event, so the state machine never
|
|
883
|
-
// leaves STOPPED — a reset queue is "nothing loaded".
|
|
884
|
-
player.setPlaybackState(PlaybackState.NONE)
|
|
885
671
|
}
|
|
886
672
|
|
|
887
673
|
override fun play() = runBlockingOnMain { player.play() }
|
|
@@ -893,14 +679,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
893
679
|
override fun stop() = runBlockingOnMain { player.stop() }
|
|
894
680
|
|
|
895
681
|
override fun setPlayWhenReady(playWhenReady: Boolean) = runBlockingOnMain {
|
|
896
|
-
|
|
897
|
-
connectedService?.player?.let { it.playWhenReady = playWhenReady }
|
|
898
|
-
?: run { pendingPlayWhenReady = playWhenReady }
|
|
682
|
+
player.playWhenReady = playWhenReady
|
|
899
683
|
}
|
|
900
684
|
|
|
901
|
-
override fun getPlayWhenReady(): Boolean = runBlockingOnMain {
|
|
902
|
-
connectedService?.player?.playWhenReady ?: pendingPlayWhenReady ?: false
|
|
903
|
-
}
|
|
685
|
+
override fun getPlayWhenReady(): Boolean = runBlockingOnMain { player.playWhenReady }
|
|
904
686
|
|
|
905
687
|
override fun seekTo(position: Double) = runBlockingOnMain {
|
|
906
688
|
player.seekTo((position * 1000).toLong(), TimeUnit.MILLISECONDS)
|
|
@@ -910,8 +692,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
910
692
|
player.seekBy((offset * 1000).toLong(), TimeUnit.MILLISECONDS)
|
|
911
693
|
}
|
|
912
694
|
|
|
913
|
-
override fun seekToLiveEdge() = runBlockingOnMain { player.seekToLiveEdge() }
|
|
914
|
-
|
|
915
695
|
override fun setVolume(level: Double) = runBlockingOnMain { player.volume = level.toFloat() }
|
|
916
696
|
|
|
917
697
|
override fun getVolume(): Double = runBlockingOnMain { player.volume.toDouble() }
|
|
@@ -932,14 +712,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
932
712
|
|
|
933
713
|
override fun getPlayingState(): PlayingState = runBlockingOnMain { player.getPlayingState() }
|
|
934
714
|
|
|
935
|
-
override fun getRepeatMode(): RepeatMode = runBlockingOnMain {
|
|
936
|
-
connectedService?.player?.repeatMode ?: pendingRepeatMode ?: RepeatMode.OFF
|
|
937
|
-
}
|
|
715
|
+
override fun getRepeatMode(): RepeatMode = runBlockingOnMain { player.repeatMode }
|
|
938
716
|
|
|
939
|
-
override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain {
|
|
940
|
-
// Pre-setup this stages the mode for the player to come up with — never throws.
|
|
941
|
-
connectedService?.player?.let { it.repeatMode = mode } ?: run { pendingRepeatMode = mode }
|
|
942
|
-
}
|
|
717
|
+
override fun setRepeatMode(mode: RepeatMode) = runBlockingOnMain { player.repeatMode = mode }
|
|
943
718
|
|
|
944
719
|
override fun getShuffleEnabled(): Boolean = runBlockingOnMain { player.shuffleMode }
|
|
945
720
|
|
|
@@ -947,10 +722,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
947
722
|
player.shuffleMode = enabled
|
|
948
723
|
}
|
|
949
724
|
|
|
950
|
-
override fun setPlaybackIntervalEnabled(enabled: Boolean) = runBlockingOnMain {
|
|
951
|
-
player.setPlaybackIntervalEnabled(enabled)
|
|
952
|
-
}
|
|
953
|
-
|
|
954
725
|
override fun getPlaybackError(): PlaybackError? = runBlockingOnMain { player.playbackError }
|
|
955
726
|
|
|
956
727
|
override fun retry() = runBlockingOnMain { player.prepare() }
|
|
@@ -999,9 +770,9 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
999
770
|
}
|
|
1000
771
|
}
|
|
1001
772
|
|
|
1002
|
-
override fun setQueue(tracks: Array<Track>, startIndex: Double?,
|
|
773
|
+
override fun setQueue(tracks: Array<Track>, startIndex: Double?, startPositionMs: Double?) =
|
|
1003
774
|
runBlockingOnMain {
|
|
1004
|
-
player.setQueue(tracks, startIndex?.toInt() ?: 0, (
|
|
775
|
+
player.setQueue(tracks, startIndex?.toInt() ?: 0, startPositionMs?.toLong() ?: 0)
|
|
1005
776
|
}
|
|
1006
777
|
|
|
1007
778
|
override fun setActiveTrackFavorited(favorited: Boolean) = runBlockingOnMain {
|
|
@@ -1033,20 +804,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1033
804
|
// ============================================================================
|
|
1034
805
|
|
|
1035
806
|
override fun updateNowPlaying(update: NowPlayingUpdate?) = runBlockingOnMain {
|
|
1036
|
-
player.
|
|
1037
|
-
}
|
|
1038
|
-
|
|
1039
|
-
override fun flashNowPlaying(update: NowPlayingUpdate, durationMs: Double) = runBlockingOnMain {
|
|
1040
|
-
player.nowPlaying.flashNowPlaying(update, durationMs)
|
|
807
|
+
player.updateNowPlaying(update)
|
|
1041
808
|
}
|
|
1042
809
|
|
|
1043
|
-
override fun
|
|
1044
|
-
player.nowPlaying.clearNowPlayingFlash()
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain {
|
|
1048
|
-
player.nowPlaying.getNowPlaying()
|
|
1049
|
-
}
|
|
810
|
+
override fun getNowPlaying(): NowPlayingMetadata? = runBlockingOnMain { player.getNowPlaying() }
|
|
1050
811
|
|
|
1051
812
|
// ============================================================================
|
|
1052
813
|
// MARK: Network Connectivity
|
|
@@ -1063,15 +824,13 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1063
824
|
override fun setSystemVolume(volume: Double) = systemVolumeMonitor.setVolume(volume)
|
|
1064
825
|
|
|
1065
826
|
// ============================================================================
|
|
1066
|
-
// MARK: External Audio Output
|
|
827
|
+
// MARK: External Audio Output (iOS only, stub on Android)
|
|
1067
828
|
// ============================================================================
|
|
1068
829
|
|
|
1069
|
-
override fun
|
|
1070
|
-
|
|
1071
|
-
override fun supportsOutputSwitcher(): Boolean = OutputSwitcher.isSupported()
|
|
830
|
+
override fun getIosOutput(): IosOutput? = null
|
|
1072
831
|
|
|
1073
|
-
override fun
|
|
1074
|
-
|
|
832
|
+
override fun openIosOutputPicker() {
|
|
833
|
+
// No-op on Android
|
|
1075
834
|
}
|
|
1076
835
|
|
|
1077
836
|
// ============================================================================
|
|
@@ -1079,34 +838,34 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1079
838
|
// ============================================================================
|
|
1080
839
|
|
|
1081
840
|
override fun getEqualizerSettings(): EqualizerSettings? = runBlockingOnMain {
|
|
1082
|
-
player.
|
|
841
|
+
player.getEqualizerSettings()
|
|
1083
842
|
}
|
|
1084
843
|
|
|
1085
844
|
override fun setEqualizerEnabled(enabled: Boolean) = runBlockingOnMain {
|
|
1086
|
-
player.
|
|
845
|
+
player.setEqualizerEnabled(enabled)
|
|
1087
846
|
}
|
|
1088
847
|
|
|
1089
848
|
override fun setEqualizerPreset(preset: String) = runBlockingOnMain {
|
|
1090
|
-
player.
|
|
849
|
+
player.setEqualizerPreset(preset)
|
|
1091
850
|
}
|
|
1092
851
|
|
|
1093
852
|
override fun setEqualizerLevels(levels: DoubleArray) = runBlockingOnMain {
|
|
1094
|
-
player.
|
|
853
|
+
player.setEqualizerLevels(levels)
|
|
1095
854
|
}
|
|
1096
855
|
|
|
1097
856
|
// ============================================================================
|
|
1098
857
|
// MARK: Sleep Timer
|
|
1099
858
|
// ============================================================================
|
|
1100
859
|
|
|
1101
|
-
override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.
|
|
860
|
+
override fun getSleepTimer(): SleepTimer = runBlockingOnMain { player.getSleepTimer() }
|
|
1102
861
|
|
|
1103
|
-
override fun setSleepTimer(seconds: Double
|
|
1104
|
-
player.sleepTimer.setAfter(seconds, fadeDuration)
|
|
1105
|
-
}
|
|
862
|
+
override fun setSleepTimer(seconds: Double) = runBlockingOnMain { player.setSleepTimer(seconds) }
|
|
1106
863
|
|
|
1107
|
-
override fun setSleepTimerToEndOfTrack() = runBlockingOnMain {
|
|
864
|
+
override fun setSleepTimerToEndOfTrack() = runBlockingOnMain {
|
|
865
|
+
player.setSleepTimerToEndOfTrack()
|
|
866
|
+
}
|
|
1108
867
|
|
|
1109
|
-
override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.
|
|
868
|
+
override fun clearSleepTimer(): Boolean = runBlockingOnMain { player.clearSleepTimer() }
|
|
1110
869
|
|
|
1111
870
|
// ============================================================================
|
|
1112
871
|
// MARK: Battery Optimization (Android only)
|
|
@@ -1186,7 +945,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1186
945
|
player.setCallbacks(callbacks)
|
|
1187
946
|
player.applyOptions(updateOptions)
|
|
1188
947
|
player.setup(setupOptions)
|
|
1189
|
-
applyPendingPlayerState(player)
|
|
1190
948
|
// Start observing network connectivity changes
|
|
1191
949
|
player.observeNetworkConnectivity(mainScope)
|
|
1192
950
|
// Set browser reference for media URL transformation
|
|
@@ -1216,21 +974,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1216
974
|
}
|
|
1217
975
|
}
|
|
1218
976
|
|
|
1219
|
-
/**
|
|
1220
|
-
* Applies initial player state staged before the player existed. Consumed on apply so a later
|
|
1221
|
-
* re-setup doesn't replay stale state.
|
|
1222
|
-
*/
|
|
1223
|
-
private fun applyPendingPlayerState(player: Player) {
|
|
1224
|
-
pendingRepeatMode?.let {
|
|
1225
|
-
player.repeatMode = it
|
|
1226
|
-
pendingRepeatMode = null
|
|
1227
|
-
}
|
|
1228
|
-
pendingPlayWhenReady?.let {
|
|
1229
|
-
player.playWhenReady = it
|
|
1230
|
-
pendingPlayWhenReady = null
|
|
1231
|
-
}
|
|
1232
|
-
}
|
|
1233
|
-
|
|
1234
977
|
override fun onServiceDisconnected(name: ComponentName) {
|
|
1235
978
|
mainScope.coroutineContext.cancelChildren()
|
|
1236
979
|
mediaBrowserFuture = null
|
|
@@ -1274,10 +1017,6 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1274
1017
|
post { this@AudioBrowser.onPlaybackProgressUpdated(event) }
|
|
1275
1018
|
}
|
|
1276
1019
|
|
|
1277
|
-
override fun onPlaybackInterval() {
|
|
1278
|
-
post { this@AudioBrowser.onPlaybackInterval() }
|
|
1279
|
-
}
|
|
1280
|
-
|
|
1281
1020
|
override fun onPlaybackPlayWhenReadyChanged(event: PlaybackPlayWhenReadyChangedEvent) {
|
|
1282
1021
|
post { this@AudioBrowser.onPlaybackPlayWhenReadyChanged(event) }
|
|
1283
1022
|
}
|
|
@@ -1427,8 +1166,12 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1427
1166
|
return handled
|
|
1428
1167
|
}
|
|
1429
1168
|
|
|
1169
|
+
override fun onRemoteSetRating(event: RemoteSetRatingEvent) {
|
|
1170
|
+
post { this@AudioBrowser.onRemoteSetRating(event) }
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1430
1173
|
override fun onOptionsChanged(options: PlayerUpdateOptions) {
|
|
1431
|
-
|
|
1174
|
+
// Not currently emitted to JS
|
|
1432
1175
|
}
|
|
1433
1176
|
|
|
1434
1177
|
override fun onFavoriteChanged(event: FavoriteChangedEvent) {
|
|
@@ -1451,32 +1194,4 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
1451
1194
|
post { this@AudioBrowser.onSleepTimerChanged(timer) }
|
|
1452
1195
|
}
|
|
1453
1196
|
}
|
|
1454
|
-
|
|
1455
|
-
companion object {
|
|
1456
|
-
// Process-wide car-connection state, from the androidx.car.app
|
|
1457
|
-
// CarConnection provider — the documented Android Auto / Automotive
|
|
1458
|
-
// connection signal, served by the car system app. Observed ONCE per
|
|
1459
|
-
// process: AudioBrowser instances are re-created on a JS reload, and a
|
|
1460
|
-
// per-instance observeForever would leak each one. The latest instance's
|
|
1461
|
-
// callback registers as the single notification target (mirrors the iOS
|
|
1462
|
-
// static + shared-instance pattern).
|
|
1463
|
-
@Volatile private var carConnected = false
|
|
1464
|
-
@Volatile private var carConnectionTarget: ((Boolean) -> Unit)? = null
|
|
1465
|
-
private var carConnectionObserverStarted = false
|
|
1466
|
-
|
|
1467
|
-
private fun startCarConnectionObserver(context: Context, handler: Handler) {
|
|
1468
|
-
// Posted to main: LiveData observation is main-thread only, and the
|
|
1469
|
-
// single-start guard is then only ever touched from one thread.
|
|
1470
|
-
handler.post {
|
|
1471
|
-
if (carConnectionObserverStarted) return@post
|
|
1472
|
-
carConnectionObserverStarted = true
|
|
1473
|
-
CarConnection(context.applicationContext).type.observeForever { type ->
|
|
1474
|
-
val connected = type != CarConnection.CONNECTION_TYPE_NOT_CONNECTED
|
|
1475
|
-
if (connected == carConnected) return@observeForever
|
|
1476
|
-
carConnected = connected
|
|
1477
|
-
carConnectionTarget?.invoke(connected)
|
|
1478
|
-
}
|
|
1479
|
-
}
|
|
1480
|
-
}
|
|
1481
|
-
}
|
|
1482
1197
|
}
|