react-native-audio-browser 0.2.0-next.8 → 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 +141 -401
- 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 +173 -751
- 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/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/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 -116
- 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
package/ios/TrackPlayer.swift
CHANGED
|
@@ -17,12 +17,6 @@ class TrackPlayer {
|
|
|
17
17
|
let nowPlayingInfoController: NowPlayingInfoController
|
|
18
18
|
let remoteCommandController: RemoteCommandController
|
|
19
19
|
private let retryManager = RetryManager()
|
|
20
|
-
private let playbackStateStore = PlaybackStateStore()
|
|
21
|
-
|
|
22
|
-
// MARK: - Periodic Persist
|
|
23
|
-
|
|
24
|
-
/// Cancelled when playback stops; recreated when it starts.
|
|
25
|
-
private var periodicSaveTask: Task<Void, Never>?
|
|
26
20
|
|
|
27
21
|
/// Retry configuration for load errors (network failures, timeouts, etc.)
|
|
28
22
|
var retryConfig: Variant_Bool_RetryConfig? {
|
|
@@ -58,27 +52,23 @@ class TrackPlayer {
|
|
|
58
52
|
)
|
|
59
53
|
|
|
60
54
|
private lazy var playerTimeObserver: PlayerTimeObserver = .init(
|
|
55
|
+
periodicObserverTimeInterval: CMTime(seconds: 1, preferredTimescale: 1000),
|
|
61
56
|
onAudioDidStart: { [weak self] in
|
|
62
|
-
// Audio rendered: this load has proven itself — retries from here on get
|
|
63
|
-
// the full recovery budget, not the short first-connect one.
|
|
64
|
-
self?.retryManager.hasPlayed = true
|
|
65
57
|
self?.coordinator.audioDidStart()
|
|
66
58
|
},
|
|
59
|
+
onSecondElapsed: { [weak self] seconds in
|
|
60
|
+
self?.nowPlayingUpdater.setCurrentTime(seconds: seconds)
|
|
61
|
+
},
|
|
67
62
|
)
|
|
68
63
|
|
|
69
64
|
private lazy var playerItemNotificationObserver: PlayerItemNotificationObserver = .init(
|
|
70
|
-
onDidPlayToEndTime: { [weak self] in
|
|
65
|
+
onDidPlayToEndTime: { [weak self] in
|
|
66
|
+
self?.coordinator.handleTrackDidPlayToEndTime()
|
|
67
|
+
},
|
|
71
68
|
onFailedToPlayToEndTime: { [weak self] error in
|
|
72
69
|
let effectiveError = error ?? self?.avPlayer.currentItem?.error
|
|
73
|
-
self?.coordinator.errorHandler.handleError(
|
|
74
|
-
effectiveError,
|
|
75
|
-
context: .playback,
|
|
76
|
-
httpStatusCode: self?.currentItemHttpStatusCode,
|
|
77
|
-
)
|
|
70
|
+
self?.coordinator.errorHandler.handleError(effectiveError, context: .playback)
|
|
78
71
|
},
|
|
79
|
-
// Buffer emptied mid-playback: nudge the player, but don't reconnect — a
|
|
80
|
-
// genuine drop is recovered by the retry / network-restore paths.
|
|
81
|
-
onPlaybackStalled: { [weak self] in self?.recoverFromStall(reconnectIfLive: false) },
|
|
82
72
|
)
|
|
83
73
|
|
|
84
74
|
private lazy var playerItemObserver: PlayerItemPropertyObserver = .init(
|
|
@@ -96,12 +86,6 @@ class TrackPlayer {
|
|
|
96
86
|
},
|
|
97
87
|
)
|
|
98
88
|
|
|
99
|
-
// MARK: - Now-Playing Election
|
|
100
|
-
|
|
101
|
-
private let silentAudioPrimer = SilentAudioPrimer()
|
|
102
|
-
/// Latched on the first failure of each load; reset when a new track loads.
|
|
103
|
-
private var didPrimeNowPlayingElection = false
|
|
104
|
-
|
|
105
89
|
// MARK: - Callbacks
|
|
106
90
|
|
|
107
91
|
weak var callbacks: TrackPlayerCallbacks? {
|
|
@@ -117,17 +101,14 @@ class TrackPlayer {
|
|
|
117
101
|
get { coordinator.playbackError }
|
|
118
102
|
set { coordinator.playbackError = newValue }
|
|
119
103
|
}
|
|
120
|
-
|
|
121
104
|
var lastIndex: Int {
|
|
122
105
|
get { coordinator.lastIndex }
|
|
123
106
|
set { coordinator.lastIndex = newValue }
|
|
124
107
|
}
|
|
125
|
-
|
|
126
108
|
var lastTrack: Track? {
|
|
127
109
|
get { coordinator.lastTrack }
|
|
128
110
|
set { coordinator.lastTrack = newValue }
|
|
129
111
|
}
|
|
130
|
-
|
|
131
112
|
var tracks: [Track] { coordinator.tracks }
|
|
132
113
|
var currentIndex: Int { coordinator.currentIndex }
|
|
133
114
|
var currentTrack: Track? { coordinator.currentTrack }
|
|
@@ -157,19 +138,6 @@ class TrackPlayer {
|
|
|
157
138
|
set { coordinator.playWhenReady = newValue }
|
|
158
139
|
}
|
|
159
140
|
|
|
160
|
-
/// Time playback must have progressed before a buffer dip counts as a stall, so the initial
|
|
161
|
-
/// connect / a seek doesn't read as one. iOS has no native rebuffer-vs-initial signal.
|
|
162
|
-
private static let stallGraceSeconds: TimeInterval = 0.5
|
|
163
|
-
|
|
164
|
-
/// True while ongoing playback has stalled waiting for data. Approximated from
|
|
165
|
-
/// `isPlaybackLikelyToKeepUp`, gated on having actually started and the play intent (so an
|
|
166
|
-
/// initial connect / seek doesn't read as a stall). Mirrors the Android `stalled` signal, which
|
|
167
|
-
/// the load control distinguishes natively.
|
|
168
|
-
var isStalled: Bool {
|
|
169
|
-
guard let item = avPlayer.currentItem else { return false }
|
|
170
|
-
return currentTime > Self.stallGraceSeconds && playWhenReady && !item.isPlaybackLikelyToKeepUp
|
|
171
|
-
}
|
|
172
|
-
|
|
173
141
|
/**
|
|
174
142
|
Controls the time pitch algorithm applied to each track loaded into the player.
|
|
175
143
|
*/
|
|
@@ -254,6 +222,7 @@ class TrackPlayer {
|
|
|
254
222
|
set {
|
|
255
223
|
coordinator.rate = newValue
|
|
256
224
|
avPlayer.rate = newValue
|
|
225
|
+
nowPlayingUpdater.updatePlaybackValues(duration: duration, rate: newValue, currentTime: currentTime)
|
|
257
226
|
}
|
|
258
227
|
}
|
|
259
228
|
|
|
@@ -280,9 +249,7 @@ class TrackPlayer {
|
|
|
280
249
|
self?.playWhenReady ?? false
|
|
281
250
|
}
|
|
282
251
|
retryManager.onRetry = { [weak self] startFromCurrentTime in
|
|
283
|
-
|
|
284
|
-
// from an expired short-lived URL/token that only a fresh resolve fixes.
|
|
285
|
-
self?.reloadResolving(startFromCurrentTime: startFromCurrentTime)
|
|
252
|
+
self?.reload(startFromCurrentTime: startFromCurrentTime)
|
|
286
253
|
}
|
|
287
254
|
|
|
288
255
|
// Handle command center changes when MPNowPlayingSession is created/destroyed (iOS 16+)
|
|
@@ -303,7 +270,6 @@ class TrackPlayer {
|
|
|
303
270
|
func handlePlayWhenReady(_ playWhenReady: Bool?, action: () throws -> Void) rethrows {
|
|
304
271
|
try coordinator.handlePlayWhenReady(playWhenReady, action: action)
|
|
305
272
|
}
|
|
306
|
-
|
|
307
273
|
func transition(_ event: PlaybackEvent) { coordinator.transition(event) }
|
|
308
274
|
|
|
309
275
|
// MARK: - Player Actions
|
|
@@ -327,13 +293,6 @@ class TrackPlayer {
|
|
|
327
293
|
func pause() { coordinator.pause() }
|
|
328
294
|
func togglePlayback() { coordinator.togglePlayback() }
|
|
329
295
|
|
|
330
|
-
func handleInterruptionBegan() { coordinator.handleInterruptionBegan() }
|
|
331
|
-
func handleRouteDisconnected() { coordinator.handleRouteDisconnected() }
|
|
332
|
-
var willResumeAfterInterruption: Bool { coordinator.willResumeAfterInterruption }
|
|
333
|
-
func handleInterruptionEnded(shouldResume: Bool) {
|
|
334
|
-
coordinator.handleInterruptionEnded(shouldResume: shouldResume)
|
|
335
|
-
}
|
|
336
|
-
|
|
337
296
|
func stop() {
|
|
338
297
|
coordinator.stop()
|
|
339
298
|
if currentTrack?.live != true {
|
|
@@ -342,62 +301,20 @@ class TrackPlayer {
|
|
|
342
301
|
}
|
|
343
302
|
|
|
344
303
|
func reload(startFromCurrentTime: Bool) {
|
|
345
|
-
|
|
304
|
+
var time: Double? = nil
|
|
305
|
+
if startFromCurrentTime {
|
|
306
|
+
if let currentItem = avPlayer.currentItem {
|
|
307
|
+
if !currentItem.duration.isIndefinite {
|
|
308
|
+
time = currentItem.currentTime().seconds
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
346
312
|
loadAVPlayer()
|
|
347
313
|
if let time {
|
|
348
314
|
seekTo(time)
|
|
349
315
|
}
|
|
350
316
|
}
|
|
351
317
|
|
|
352
|
-
/// Playback position to resume from on reload, or nil when there is nothing
|
|
353
|
-
/// seekable to resume (no item, or an indefinite/live duration).
|
|
354
|
-
private func resumeTime() -> Double? {
|
|
355
|
-
guard let currentItem = avPlayer.currentItem, !currentItem.duration.isIndefinite else {
|
|
356
|
-
return nil
|
|
357
|
-
}
|
|
358
|
-
return currentItem.currentTime().seconds
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/// Re-establish a stalled stream when connectivity is restored.
|
|
362
|
-
///
|
|
363
|
-
/// AVPlayer doesn't reliably surface a mid-stream connectivity loss on a live stream as an item
|
|
364
|
-
/// failure — it sits in `.waitingToPlayAtSpecifiedRate` (a buffering stall) with no error, so the
|
|
365
|
-
/// error-driven `RetryManager` never engages. Without this, the stream stays "reconnecting"
|
|
366
|
-
/// indefinitely after the network returns. Mirrors Android, where ExoPlayer surfaces the drop as a
|
|
367
|
-
/// retryable load error and re-prepares on restore.
|
|
368
|
-
///
|
|
369
|
-
/// Guards: reload only while actually stalled (`.buffering`) with play intent — so a user-initiated
|
|
370
|
-
/// pause, or a retry that already gave up (`.error`, past the max retry duration) isn't surprisingly
|
|
371
|
-
/// resumed. Skipped when `RetryManager` is already parked waiting for the network: an error *did*
|
|
372
|
-
/// schedule a retry that owns its own reload, so we'd otherwise load twice.
|
|
373
|
-
func handleNetworkRestored() {
|
|
374
|
-
guard playWhenReady,
|
|
375
|
-
coordinator.state == .buffering,
|
|
376
|
-
!retryManager.isWaitingForNetwork
|
|
377
|
-
else { return }
|
|
378
|
-
logger.info("Connectivity restored while stalled — re-resolving to reconnect")
|
|
379
|
-
// Re-resolve rather than replay the cached URL: a resolver that mints a short-lived URL/token
|
|
380
|
-
// may have had it expire during the offline gap, so reconnecting with the stale URL would just
|
|
381
|
-
// fail (then recover only via the error path). Matches the error-retry path here, and Android,
|
|
382
|
-
// which re-resolves on its network-error reconnect. `reloadResolving` falls back to a plain
|
|
383
|
-
// reload when there's no track `src` to resolve.
|
|
384
|
-
reloadResolving(startFromCurrentTime: true)
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/// Jump to the live edge. No-op for non-live tracks. Live with a seekable
|
|
388
|
-
/// window (HLS) seeks to the window end; live without one (non-seekable, e.g.
|
|
389
|
-
/// ICY) has no window to seek within, so reconnect to rejoin live.
|
|
390
|
-
func seekToLiveEdge() {
|
|
391
|
-
guard currentTrack?.live == true, let item = avPlayer.currentItem else { return }
|
|
392
|
-
if let range = item.seekableTimeRanges.last?.timeRangeValue, range.duration.seconds > 0 {
|
|
393
|
-
avPlayer.seek(to: range.end, toleranceBefore: .zero, toleranceAfter: .zero)
|
|
394
|
-
} else {
|
|
395
|
-
// Re-resolve on reconnect: this is the stall-recovery path for non-seekable live
|
|
396
|
-
// streams, where a short-lived stream URL may have expired during the outage.
|
|
397
|
-
reloadResolving(startFromCurrentTime: false)
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
318
|
func seekTo(_ seconds: TimeInterval) {
|
|
402
319
|
seekTo(seconds, completion: { _ in })
|
|
403
320
|
}
|
|
@@ -409,22 +326,10 @@ class TrackPlayer {
|
|
|
409
326
|
} else if avPlayer.currentItem != nil {
|
|
410
327
|
let time = CMTime(seconds: seconds, preferredTimescale: 1000)
|
|
411
328
|
let seekSeconds = seconds
|
|
412
|
-
let generation = loadSeekCoordinator.generation
|
|
413
329
|
avPlayer
|
|
414
330
|
.seek(to: time, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero) { [weak self] finished in
|
|
415
331
|
Task { @MainActor in
|
|
416
|
-
|
|
417
|
-
completion(false)
|
|
418
|
-
return
|
|
419
|
-
}
|
|
420
|
-
// A completion from before a track change (reset() bumped the
|
|
421
|
-
// generation) belongs to the old item — delivering it would emit a
|
|
422
|
-
// bogus seek-completed and consume the new track's pending start seek.
|
|
423
|
-
guard self.loadSeekCoordinator.isCurrentGeneration(generation) else {
|
|
424
|
-
completion(false)
|
|
425
|
-
return
|
|
426
|
-
}
|
|
427
|
-
self.handleSeekCompleted(to: Double(seekSeconds), didFinish: finished)
|
|
332
|
+
self?.handleSeekCompleted(to: Double(seekSeconds), didFinish: finished)
|
|
428
333
|
completion(finished)
|
|
429
334
|
}
|
|
430
335
|
}
|
|
@@ -449,11 +354,6 @@ class TrackPlayer {
|
|
|
449
354
|
|
|
450
355
|
func enableRemoteCommands(_ commands: [RemoteCommand]) {
|
|
451
356
|
remoteCommandController.enable(commands: commands)
|
|
452
|
-
// Apply current next/previous availability so re-/late-configured commands
|
|
453
|
-
// start in the correct enabled state (not unconditionally enabled).
|
|
454
|
-
remoteCommandController.setSkipAvailability(
|
|
455
|
-
canNext: coordinator.canNext, canPrevious: coordinator.canPrevious,
|
|
456
|
-
)
|
|
457
357
|
}
|
|
458
358
|
|
|
459
359
|
func clear() {
|
|
@@ -472,10 +372,6 @@ class TrackPlayer {
|
|
|
472
372
|
coordinator.setProgressUpdateInterval(interval)
|
|
473
373
|
}
|
|
474
374
|
|
|
475
|
-
func setPlaybackIntervalEnabled(_ enabled: Bool) {
|
|
476
|
-
coordinator.setPlaybackIntervalEnabled(enabled)
|
|
477
|
-
}
|
|
478
|
-
|
|
479
375
|
// MARK: - AVPlayer Management
|
|
480
376
|
|
|
481
377
|
func setTimePitchingAlgorithmForCurrentItem() {
|
|
@@ -513,6 +409,7 @@ class TrackPlayer {
|
|
|
513
409
|
private func recreateAVPlayer() {
|
|
514
410
|
coordinator.playbackError = nil
|
|
515
411
|
playerTimeObserver.unregisterForBoundaryTimeEvents()
|
|
412
|
+
playerTimeObserver.unregisterForPeriodicEvents()
|
|
516
413
|
playerObserver.stopObserving()
|
|
517
414
|
stopObservingAVPlayerItem()
|
|
518
415
|
clearCurrentAVItem()
|
|
@@ -523,17 +420,6 @@ class TrackPlayer {
|
|
|
523
420
|
setupAVPlayer()
|
|
524
421
|
}
|
|
525
422
|
|
|
526
|
-
/// Recover from a media-services reset (`mediaserverd` crashed/reset): every
|
|
527
|
-
/// AVPlayer/session handle is invalid, so recreate the player and reload the
|
|
528
|
-
/// current track, preserving play intent, so a live stream reconnects instead
|
|
529
|
-
/// of going permanently silent. No-op when nothing is loaded.
|
|
530
|
-
func handleMediaServicesReset() {
|
|
531
|
-
guard currentTrack != nil else { return }
|
|
532
|
-
logger.info("Media services were reset — recreating player and reloading current track")
|
|
533
|
-
recreateAVPlayer()
|
|
534
|
-
reloadResolving(startFromCurrentTime: false)
|
|
535
|
-
}
|
|
536
|
-
|
|
537
423
|
private func setupAVPlayer() {
|
|
538
424
|
avPlayer.allowsExternalPlayback = false
|
|
539
425
|
|
|
@@ -542,31 +428,21 @@ class TrackPlayer {
|
|
|
542
428
|
|
|
543
429
|
playerTimeObserver.avPlayer = avPlayer
|
|
544
430
|
playerTimeObserver.registerForBoundaryTimeEvents()
|
|
431
|
+
playerTimeObserver.registerForPeriodicTimeEvents()
|
|
545
432
|
|
|
546
433
|
nowPlayingInfoController.linkPlayer(avPlayer)
|
|
547
434
|
|
|
548
435
|
if playWhenReady {
|
|
549
436
|
startPlayback()
|
|
550
437
|
} else {
|
|
551
|
-
|
|
438
|
+
if #available(iOS 16.0, *) {
|
|
439
|
+
avPlayer.defaultRate = rate
|
|
440
|
+
}
|
|
552
441
|
}
|
|
553
442
|
}
|
|
554
443
|
|
|
555
444
|
func loadAVPlayer() {
|
|
556
|
-
prepareForReload()
|
|
557
|
-
mediaLoader.loadAsset()
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
/// Teardown shared by the two reload paths: recreate the player after a
|
|
561
|
-
/// terminal error, otherwise cancel in-flight loading and drop the current
|
|
562
|
-
/// asset, then enter the loading state.
|
|
563
|
-
private func prepareForReload() {
|
|
564
445
|
if state == .error {
|
|
565
|
-
// A restart from terminal error begins a new load of the same track:
|
|
566
|
-
// fresh budgets, unproven playback (see resetForNewLoad). Automatic
|
|
567
|
-
// retries never enter this branch — the retry loop keeps the state
|
|
568
|
-
// non-terminal — so only retry() / play-from-error land here.
|
|
569
|
-
coordinator.errorHandler.resetForNewLoad()
|
|
570
446
|
recreateAVPlayer()
|
|
571
447
|
} else {
|
|
572
448
|
mediaLoader.cancelAll()
|
|
@@ -575,25 +451,7 @@ class TrackPlayer {
|
|
|
575
451
|
mediaLoader.clearAsset()
|
|
576
452
|
}
|
|
577
453
|
transition(.trackLoading)
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
/// Reload by re-running the resolver (fresh URL / headers / user-agent)
|
|
581
|
-
/// instead of recreating the asset from the already-resolved URL. Used by the
|
|
582
|
-
/// retry path so consumers whose resolver mints short-lived URLs or auth
|
|
583
|
-
/// tokens recover once those expire — a plain `reload()` would replay the
|
|
584
|
-
/// stale URL and keep failing. Falls back to `reload()` when there's no track
|
|
585
|
-
/// `src` to resolve.
|
|
586
|
-
func reloadResolving(startFromCurrentTime: Bool) {
|
|
587
|
-
guard let track = currentTrack, let src = track.src else {
|
|
588
|
-
reload(startFromCurrentTime: startFromCurrentTime)
|
|
589
|
-
return
|
|
590
|
-
}
|
|
591
|
-
let time = startFromCurrentTime ? resumeTime() : nil
|
|
592
|
-
prepareForReload()
|
|
593
|
-
mediaLoader.resolveAndLoad(src: src, track: track)
|
|
594
|
-
if let time {
|
|
595
|
-
seekTo(time)
|
|
596
|
-
}
|
|
454
|
+
mediaLoader.loadAsset()
|
|
597
455
|
}
|
|
598
456
|
|
|
599
457
|
func unloadAVPlayer() {
|
|
@@ -603,47 +461,6 @@ class TrackPlayer {
|
|
|
603
461
|
|
|
604
462
|
// MARK: - Observer Callbacks (map AVFoundation → coordinator)
|
|
605
463
|
|
|
606
|
-
/// Resolve an end-of-item notification: a genuine end advances the queue; a
|
|
607
|
-
/// dropped live stream or a mid-stream underrun reported as EOF is recovered
|
|
608
|
-
/// instead of advancing/stopping (see `EndOfTrackJudgement`).
|
|
609
|
-
private func handleDidPlayToEndTime() {
|
|
610
|
-
let judgement = EndOfTrackJudgement(
|
|
611
|
-
isLive: currentTrack?.live == true,
|
|
612
|
-
currentTime: currentTime,
|
|
613
|
-
duration: duration,
|
|
614
|
-
)
|
|
615
|
-
switch judgement.outcome {
|
|
616
|
-
case .ended:
|
|
617
|
-
coordinator.handleTrackDidPlayToEndTime()
|
|
618
|
-
case .stalled:
|
|
619
|
-
recoverFromStall(reconnectIfLive: true)
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
/// Recover from a stall while the play intent still holds. A live stream that
|
|
624
|
-
/// ran out of data (`reconnectIfLive`) rejoins the edge — reloading when there
|
|
625
|
-
/// is no seekable window; otherwise just re-issue play() to un-park AVPlayer
|
|
626
|
-
/// from `.waitingToPlayAtSpecifiedRate` (data may resume on the same
|
|
627
|
-
/// connection; a genuine drop is handled by the retry / network-restore paths).
|
|
628
|
-
private func recoverFromStall(reconnectIfLive: Bool) {
|
|
629
|
-
guard playWhenReady else { return }
|
|
630
|
-
if reconnectIfLive, currentTrack?.live == true {
|
|
631
|
-
seekToLiveEdge()
|
|
632
|
-
} else {
|
|
633
|
-
startPlayback()
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
/// Previous time-control transition + whether its wait reason was
|
|
638
|
-
/// `.noItemToPlay`, retained to detect the AirPlay waiting→paused stall.
|
|
639
|
-
private var previousTimeControlStatus: PlayerTimeControlStatus?
|
|
640
|
-
private var previousWaitingReasonWasNoItemToPlay = false
|
|
641
|
-
|
|
642
|
-
/// True when the active audio route is AirPlay.
|
|
643
|
-
private var isAirPlayRoute: Bool {
|
|
644
|
-
AVAudioSession.sharedInstance().currentRoute.outputs.contains { $0.portType == .airPlay }
|
|
645
|
-
}
|
|
646
|
-
|
|
647
464
|
private func avPlayerDidChangeTimeControlStatus(_ status: AVPlayer.TimeControlStatus) {
|
|
648
465
|
let mapped: PlayerTimeControlStatus
|
|
649
466
|
switch status {
|
|
@@ -652,36 +469,12 @@ class TrackPlayer {
|
|
|
652
469
|
case .playing: mapped = .playing
|
|
653
470
|
@unknown default: return
|
|
654
471
|
}
|
|
655
|
-
recoverIfAirPlayStalled(transitioningTo: mapped)
|
|
656
472
|
coordinator.avPlayerDidChangeTimeControlStatus(mapped)
|
|
657
473
|
}
|
|
658
474
|
|
|
659
|
-
/// AVPlayer can silently strand us in .paused after a `.noItemToPlay` wait
|
|
660
|
-
/// over AirPlay while we still intend to play — re-issue play() on exactly
|
|
661
|
-
/// that transition. Also records this transition for the next comparison.
|
|
662
|
-
private func recoverIfAirPlayStalled(transitioningTo current: PlayerTimeControlStatus) {
|
|
663
|
-
let stalled = AirPlayStallJudgement(
|
|
664
|
-
previous: previousTimeControlStatus,
|
|
665
|
-
current: current,
|
|
666
|
-
previousWaitingReasonWasNoItemToPlay: previousWaitingReasonWasNoItemToPlay,
|
|
667
|
-
isAirPlay: isAirPlayRoute,
|
|
668
|
-
playWhenReady: playWhenReady,
|
|
669
|
-
).shouldNudge
|
|
670
|
-
previousTimeControlStatus = current
|
|
671
|
-
previousWaitingReasonWasNoItemToPlay =
|
|
672
|
-
current == .waitingToPlayAtSpecifiedRate && avPlayer.reasonForWaitingToPlay == .noItemToPlay
|
|
673
|
-
if stalled {
|
|
674
|
-
logger.info("AirPlay waiting→paused stall detected — nudging play()")
|
|
675
|
-
startPlayback()
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
|
|
679
475
|
private func avPlayerStatusDidChange(_ status: AVPlayer.Status) {
|
|
680
476
|
if status == .failed {
|
|
681
|
-
coordinator.avPlayerStatusDidFail(
|
|
682
|
-
error: avPlayer.currentItem?.error,
|
|
683
|
-
httpStatusCode: currentItemHttpStatusCode,
|
|
684
|
-
)
|
|
477
|
+
coordinator.avPlayerStatusDidFail(error: avPlayer.currentItem?.error)
|
|
685
478
|
}
|
|
686
479
|
}
|
|
687
480
|
|
|
@@ -693,25 +486,7 @@ class TrackPlayer {
|
|
|
693
486
|
case .failed: mapped = .failed
|
|
694
487
|
@unknown default: return
|
|
695
488
|
}
|
|
696
|
-
coordinator.avItemStatusDidChange(
|
|
697
|
-
mapped,
|
|
698
|
-
error: error ?? avPlayer.currentItem?.error,
|
|
699
|
-
httpStatusCode: currentItemHttpStatusCode,
|
|
700
|
-
)
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
/// The HTTP status the server last answered the current item with, if any.
|
|
704
|
-
///
|
|
705
|
-
/// `AVPlayerItem.error` never carries it — a 404 arrives as an opaque
|
|
706
|
-
/// CoreMedia error — so the error log is the only place it surfaces. The log
|
|
707
|
-
/// is per-item, so its entries belong to the track that just failed; picking
|
|
708
|
-
/// among them is `PlaybackErrorHandler`'s job, where it is testable
|
|
709
|
-
/// (`AVPlayerItemErrorLogEvent` cannot be constructed).
|
|
710
|
-
private var currentItemHttpStatusCode: Int? {
|
|
711
|
-
guard let events = avPlayer.currentItem?.errorLog()?.events else { return nil }
|
|
712
|
-
return PlaybackErrorHandler.httpStatusCode(
|
|
713
|
-
fromErrorStatusCodes: events.map(\.errorStatusCode),
|
|
714
|
-
)
|
|
489
|
+
coordinator.avItemStatusDidChange(mapped, error: error ?? avPlayer.currentItem?.error)
|
|
715
490
|
}
|
|
716
491
|
|
|
717
492
|
private func avItemDidUpdatePlaybackLikelyToKeepUp(_ playbackLikelyToKeepUp: Bool) {
|
|
@@ -729,64 +504,14 @@ class TrackPlayer {
|
|
|
729
504
|
func handleSeekCompleted(to seconds: Double, didFinish: Bool) {
|
|
730
505
|
if loadSeekCoordinator.seekDidComplete(on: avPlayer, delegate: self), state == .loading {
|
|
731
506
|
coordinator.handleSeekCompleted(to: seconds, didFinish: didFinish)
|
|
507
|
+
} else {
|
|
508
|
+
// Not a load-seek, just update now playing
|
|
509
|
+
nowPlayingUpdater.setCurrentTime(seconds: seconds)
|
|
732
510
|
}
|
|
733
511
|
callbacks?.playerDidCompleteSeek(position: seconds, didFinish: didFinish)
|
|
734
512
|
}
|
|
735
513
|
}
|
|
736
514
|
|
|
737
|
-
// MARK: - Playback State Persistence
|
|
738
|
-
|
|
739
|
-
extension TrackPlayer {
|
|
740
|
-
/// Snapshot the current player state to UserDefaults so a cold-start resume
|
|
741
|
-
/// can restore it without the JS runtime. Live streams persist `positionMs = nil`.
|
|
742
|
-
private func persistPlaybackState() {
|
|
743
|
-
guard let track = currentTrack else { return }
|
|
744
|
-
// At .ended the position equals the duration — persisting it would make a
|
|
745
|
-
// cold-start resume seek to the end and instantly re-end (Android twin:
|
|
746
|
-
// savePositionZero).
|
|
747
|
-
let positionMs: Double? =
|
|
748
|
-
(track.live == true) ? nil : (state == .ended ? 0 : currentTime * 1000)
|
|
749
|
-
playbackStateStore.save(
|
|
750
|
-
PersistedPlaybackState(
|
|
751
|
-
track: JsonTrack(from: track),
|
|
752
|
-
positionMs: positionMs,
|
|
753
|
-
repeatMode: repeatMode.persistedString,
|
|
754
|
-
shuffleEnabled: shuffleEnabled,
|
|
755
|
-
playbackSpeed: rate,
|
|
756
|
-
),
|
|
757
|
-
)
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
/// Start a 5 s repeating save while playback is active. A previous task is
|
|
761
|
-
/// cancelled first so there is never more than one running at a time.
|
|
762
|
-
private func startPeriodicSave() {
|
|
763
|
-
periodicSaveTask?.cancel()
|
|
764
|
-
periodicSaveTask = Task { @MainActor [weak self] in
|
|
765
|
-
while !Task.isCancelled {
|
|
766
|
-
try? await Task.sleep(nanoseconds: 5_000_000_000)
|
|
767
|
-
guard !Task.isCancelled else { return }
|
|
768
|
-
self?.persistPlaybackState()
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
private func stopPeriodicSave() {
|
|
774
|
-
periodicSaveTask?.cancel()
|
|
775
|
-
periodicSaveTask = nil
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
private extension RepeatMode {
|
|
780
|
-
/// String representation stored in `PersistedPlaybackState.repeatMode`.
|
|
781
|
-
var persistedString: String {
|
|
782
|
-
switch self {
|
|
783
|
-
case .off: "off"
|
|
784
|
-
case .track: "track"
|
|
785
|
-
case .queue: "queue"
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
|
|
790
515
|
// MARK: - PlaybackEffectHandler
|
|
791
516
|
|
|
792
517
|
extension TrackPlayer: PlaybackEffectHandler {
|
|
@@ -802,20 +527,12 @@ extension TrackPlayer: PlaybackEffectHandler {
|
|
|
802
527
|
stopObservingAVPlayerItem()
|
|
803
528
|
}
|
|
804
529
|
|
|
805
|
-
func loadTrack(src: String
|
|
806
|
-
|
|
807
|
-
// A new track starts unproven: its failures get the short first-connect
|
|
808
|
-
// budget until it renders audio. Reloads of the current track (retry,
|
|
809
|
-
// play-from-error) deliberately keep the flag.
|
|
810
|
-
retryManager.hasPlayed = false
|
|
811
|
-
mediaLoader.resolveAndLoad(src: src, track: track)
|
|
530
|
+
func loadTrack(src: String) {
|
|
531
|
+
mediaLoader.resolveAndLoad(src: src)
|
|
812
532
|
}
|
|
813
533
|
|
|
814
534
|
func reloadTrack(startFromCurrentTime: Bool) {
|
|
815
|
-
|
|
816
|
-
// after the failure (an expired signed URL would just re-fail, often non-retryably),
|
|
817
|
-
// matching every other retry path (retry, network restore, media-services reset).
|
|
818
|
-
reloadResolving(startFromCurrentTime: startFromCurrentTime)
|
|
535
|
+
reload(startFromCurrentTime: startFromCurrentTime)
|
|
819
536
|
}
|
|
820
537
|
|
|
821
538
|
func unloadTrack() {
|
|
@@ -836,25 +553,37 @@ extension TrackPlayer: PlaybackEffectHandler {
|
|
|
836
553
|
}
|
|
837
554
|
}
|
|
838
555
|
|
|
556
|
+
func updateNowPlayingValues(duration: Double, rate: Float, currentTime: Double) {
|
|
557
|
+
nowPlayingUpdater.updatePlaybackValues(duration: duration, rate: rate, currentTime: currentTime)
|
|
558
|
+
}
|
|
559
|
+
|
|
839
560
|
func updateNowPlayingState(playWhenReady: Bool) {
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
561
|
+
nowPlayingUpdater.updatePlaybackState(playWhenReady: playWhenReady)
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
func loadNowPlayingMetadata(for track: Track, rate: Float) {
|
|
565
|
+
// Reset playback values without updating, because that will happen in
|
|
566
|
+
// the nowPlayingUpdater.loadMetaValues call straight after:
|
|
567
|
+
nowPlayingInfoController.setWithoutUpdate(keyValues: [
|
|
568
|
+
MediaItemProperty.duration(nil),
|
|
569
|
+
NowPlayingInfoProperty.playbackRate(nil),
|
|
570
|
+
NowPlayingInfoProperty.elapsedPlaybackTime(nil),
|
|
571
|
+
])
|
|
572
|
+
nowPlayingUpdater.loadMetaValues(for: track, rate: rate)
|
|
847
573
|
}
|
|
848
574
|
|
|
849
|
-
func
|
|
850
|
-
|
|
851
|
-
persistPlaybackState()
|
|
575
|
+
func resetNowPlayingValues() {
|
|
576
|
+
// Intentionally empty — loadNowPlayingMetadata handles the reset
|
|
852
577
|
}
|
|
853
578
|
|
|
854
579
|
func clearNowPlaying() {
|
|
855
580
|
nowPlayingInfoController.clear()
|
|
856
581
|
}
|
|
857
582
|
|
|
583
|
+
func setNowPlayingCurrentTime(seconds: Double) {
|
|
584
|
+
nowPlayingUpdater.setCurrentTime(seconds: seconds)
|
|
585
|
+
}
|
|
586
|
+
|
|
858
587
|
func updateRemoteRepeatMode(_ mode: RepeatMode) {
|
|
859
588
|
remoteCommandController.updateRepeatMode(mode)
|
|
860
589
|
}
|
|
@@ -862,10 +591,6 @@ extension TrackPlayer: PlaybackEffectHandler {
|
|
|
862
591
|
func updateRemoteShuffleMode(_ enabled: Bool) {
|
|
863
592
|
remoteCommandController.updateShuffleMode(enabled)
|
|
864
593
|
}
|
|
865
|
-
|
|
866
|
-
func updateSkipAvailability(canNext: Bool, canPrevious: Bool) {
|
|
867
|
-
remoteCommandController.setSkipAvailability(canNext: canNext, canPrevious: canPrevious)
|
|
868
|
-
}
|
|
869
594
|
}
|
|
870
595
|
|
|
871
596
|
// MARK: - SeekCompletionHandler
|
|
@@ -883,20 +608,8 @@ extension TrackPlayer {
|
|
|
883
608
|
coordinator.replace(index, track)
|
|
884
609
|
}
|
|
885
610
|
|
|
886
|
-
func setQueue(
|
|
887
|
-
|
|
888
|
-
initialIndex: Int = 0,
|
|
889
|
-
startPositionMs: Double? = nil,
|
|
890
|
-
playWhenReady: Bool? = nil,
|
|
891
|
-
sourcePath: String? = nil,
|
|
892
|
-
) {
|
|
893
|
-
coordinator.setQueue(
|
|
894
|
-
newTracks,
|
|
895
|
-
initialIndex: initialIndex,
|
|
896
|
-
startPositionMs: startPositionMs,
|
|
897
|
-
playWhenReady: playWhenReady,
|
|
898
|
-
sourcePath: sourcePath,
|
|
899
|
-
)
|
|
611
|
+
func setQueue(_ newTracks: [Track], initialIndex: Int = 0, playWhenReady: Bool? = nil, sourcePath: String? = nil) {
|
|
612
|
+
coordinator.setQueue(newTracks, initialIndex: initialIndex, playWhenReady: playWhenReady, sourcePath: sourcePath)
|
|
900
613
|
}
|
|
901
614
|
|
|
902
615
|
func add(_ tracks: [Track], initialIndex: Int? = nil, playWhenReady: Bool? = nil) {
|
|
@@ -953,50 +666,14 @@ extension TrackPlayer: MediaLoaderDelegate {
|
|
|
953
666
|
}
|
|
954
667
|
|
|
955
668
|
func mediaLoaderDidFailWithRetryableError(_ error: Error) {
|
|
956
|
-
attachPublishingCarrierItemIfNeeded()
|
|
957
|
-
primeNowPlayingElectionIfNeeded()
|
|
958
669
|
coordinator.errorHandler.handleError(error, context: .mediaLoad)
|
|
959
670
|
}
|
|
960
671
|
|
|
961
672
|
func mediaLoaderDidFailWithUnplayableTrack() {
|
|
962
|
-
attachPublishingCarrierItemIfNeeded()
|
|
963
|
-
primeNowPlayingElectionIfNeeded()
|
|
964
673
|
transition(.errorOccurred(.trackWasUnplayable))
|
|
965
674
|
}
|
|
966
675
|
|
|
967
|
-
/// `MPNowPlayingSession` publishes only through the linked player's current item, so
|
|
968
|
-
/// a load that fails before item creation (a dead host on a cold start) leaves the
|
|
969
|
-
/// player item-less: the system never surfaces the app on the lock screen / CarPlay
|
|
970
|
-
/// — no metadata, no transport buttons — and the failure line has nowhere to appear.
|
|
971
|
-
/// Attach the failed asset's item purely as a publishing carrier. Deliberately not
|
|
972
|
-
/// observed: its `.failed` status must not re-report the error the loader already
|
|
973
|
-
/// delivered. A successful load (retry, or the next track) replaces it with the
|
|
974
|
-
/// real, observed item via `mediaLoaderDidPrepareItem`; retry reloads leave it in
|
|
975
|
-
/// place (`prepareForReload` drops only the asset), so the surface doesn't flicker.
|
|
976
|
-
private func attachPublishingCarrierItemIfNeeded() {
|
|
977
|
-
guard avPlayer.currentItem == nil, let asset = mediaLoader.asset else { return }
|
|
978
|
-
logger.notice("Attaching publishing-carrier item for failed load")
|
|
979
|
-
let item = AVPlayerItem(asset: asset)
|
|
980
|
-
nowPlayingInfoController.prepareItem(item)
|
|
981
|
-
avPlayer.replaceCurrentItem(with: item)
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
/// A failed load renders no audio, and without rendered audio iOS never elects the
|
|
985
|
-
/// app onto the system now-playing surfaces — the published failure metadata and
|
|
986
|
-
/// transport controls stay invisible (see `SilentAudioPrimer`). On the first
|
|
987
|
-
/// failure of a play-intended load, render a silence burst to claim the surface.
|
|
988
|
-
/// Once per load: the retry loop re-fails every few seconds, and one burst either
|
|
989
|
-
/// elected us or never will. Does not touch the retry loop itself.
|
|
990
|
-
private func primeNowPlayingElectionIfNeeded() {
|
|
991
|
-
guard playWhenReady, !didPrimeNowPlayingElection else { return }
|
|
992
|
-
didPrimeNowPlayingElection = true
|
|
993
|
-
silentAudioPrimer.prime()
|
|
994
|
-
}
|
|
995
|
-
|
|
996
676
|
func mediaLoaderDidFailWithError(_ error: TrackPlayerError.PlaybackError) {
|
|
997
|
-
// No carrier here: an invalid/missing src never produced an asset. The
|
|
998
|
-
// direct-center publish still carries the metadata once elected.
|
|
999
|
-
primeNowPlayingElectionIfNeeded()
|
|
1000
677
|
transition(.errorOccurred(error))
|
|
1001
678
|
}
|
|
1002
679
|
|
|
@@ -1012,3 +689,4 @@ extension TrackPlayer: MediaLoaderDelegate {
|
|
|
1012
689
|
callbacks?.playerDidReceiveTimedMetadata(groups)
|
|
1013
690
|
}
|
|
1014
691
|
}
|
|
692
|
+
|