@5stones/react-native-audio-browser 0.2.0 → 0.3.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 +3 -1
- package/android/src/main/cpp/cpp-adapter.cpp +4 -1
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +8 -27
- package/android/src/main/java/com/audiobrowser/Service.kt +0 -2
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +5 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +31 -0
- package/android/src/main/java/com/audiobrowser/browser/SimpleRouter.kt +10 -6
- package/android/src/main/java/com/audiobrowser/browser/TrackLoadHandler.kt +45 -0
- package/android/src/main/java/com/audiobrowser/player/MediaSessionCallback.kt +3 -21
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +1 -0
- package/android/src/main/java/com/audiobrowser/player/Player.kt +1 -0
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +104 -95
- package/ios/Browser/BrowserConfig.swift +31 -5
- package/ios/Browser/BrowserManager.swift +96 -6
- package/ios/Browser/JsonModels.swift +37 -0
- package/ios/CarPlay/CarPlayController.swift +219 -99
- package/ios/CarPlay/RNABAudioBrowser.h +23 -0
- package/ios/CarPlay/RNABAudioBrowser.m +22 -0
- package/ios/CarPlay/RNABMediaIntentHandler.swift +60 -0
- package/ios/Extension/ChapterMetadata+AVFoundation.swift +1 -1
- package/ios/Extension/CxxVectorConformances.swift +20 -0
- package/ios/Extension/TimedMetadata+AVFoundation.swift +5 -5
- package/ios/Extension/Track+AVPlayer.swift +5 -6
- package/ios/Extension/TrackMetadata+AVFoundation.swift +1 -1
- package/ios/HybridAudioBrowser.swift +107 -46
- package/ios/Model/MediaURL.swift +2 -1
- package/ios/Player/PlayingStateManager.swift +1 -0
- package/ios/Player/RetryManager.swift +26 -65
- package/ios/Player/SleepTimerManager.swift +6 -8
- package/ios/RemoteCommand/RemoteCommandController.swift +6 -0
- package/ios/Tests/SimpleRouterTests.swift +139 -0
- package/ios/TrackPlayer.swift +35 -24
- package/ios/Util/NetworkMonitor.swift +3 -6
- package/ios/Util/SFSymbolRenderer.swift +142 -0
- package/lib/commonjs/features/browser.js +1 -0
- package/lib/commonjs/features/browser.js.map +1 -1
- package/lib/commonjs/features/remoteControls.js +1 -24
- package/lib/commonjs/features/remoteControls.js.map +1 -1
- package/lib/commonjs/web/NativeAudioBrowser.js +20 -24
- package/lib/commonjs/web/NativeAudioBrowser.js.map +1 -1
- package/lib/commonjs/web/SimpleRouter.js +4 -3
- package/lib/commonjs/web/SimpleRouter.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/module/features/browser.js +1 -0
- package/lib/module/features/browser.js.map +1 -1
- package/lib/module/features/remoteControls.js +0 -22
- package/lib/module/features/remoteControls.js.map +1 -1
- package/lib/module/web/NativeAudioBrowser.js +20 -24
- package/lib/module/web/NativeAudioBrowser.js.map +1 -1
- package/lib/module/web/SimpleRouter.js +4 -3
- package/lib/module/web/SimpleRouter.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/typescript/src/features/browser.d.ts.map +1 -1
- package/lib/typescript/src/features/remoteControls.d.ts +0 -26
- package/lib/typescript/src/features/remoteControls.d.ts.map +1 -1
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts +1 -3
- package/lib/typescript/src/specs/audio-browser.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-native.d.ts +2 -1
- package/lib/typescript/src/types/browser-native.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +46 -1
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/lib/typescript/src/types/browser.d.ts +32 -0
- package/lib/typescript/src/types/browser.d.ts.map +1 -1
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts +3 -6
- package/lib/typescript/src/web/NativeAudioBrowser.d.ts.map +1 -1
- package/lib/typescript/src/web/SimpleRouter.d.ts.map +1 -1
- package/lib/typescript/src/web/SimpleRouter.test.d.ts +2 -0
- package/lib/typescript/src/web/SimpleRouter.test.d.ts.map +1 -0
- package/nitrogen/generated/android/AudioBrowser+autolinking.cmake +1 -1
- package/nitrogen/generated/android/AudioBrowser+autolinking.gradle +1 -1
- package/nitrogen/generated/android/AudioBrowserOnLoad.cpp +67 -57
- package/nitrogen/generated/android/AudioBrowserOnLoad.hpp +14 -5
- package/nitrogen/generated/android/c++/JAndroidAudioContentType.hpp +6 -7
- package/nitrogen/generated/android/c++/JAndroidAudioOffloadSettings.hpp +1 -1
- package/nitrogen/generated/android/c++/JAndroidOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JAndroidPlayerWakeMode.hpp +4 -5
- package/nitrogen/generated/android/c++/JAndroidUpdateOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JAppKilledPlaybackBehavior.hpp +4 -5
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +4 -1
- package/nitrogen/generated/android/c++/JBatteryOptimizationStatus.hpp +4 -5
- package/nitrogen/generated/android/c++/JBatteryOptimizationStatusChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JBatteryWarningPendingChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JBrowseError.hpp +1 -1
- package/nitrogen/generated/android/c++/JBrowseResult.cpp +1 -1
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +7 -3
- package/nitrogen/generated/android/c++/JBrowserSourceCallbackParam.hpp +1 -1
- package/nitrogen/generated/android/c++/JCarPlayNowPlayingButton.hpp +5 -6
- package/nitrogen/generated/android/c++/JCarPlaySiriListButtonPosition.hpp +58 -0
- package/nitrogen/generated/android/c++/JChapterMetadata.hpp +1 -1
- package/nitrogen/generated/android/c++/JEqualizerSettings.hpp +1 -1
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +4 -1
- package/nitrogen/generated/android/c++/JFormatNavigationErrorParams.hpp +1 -1
- package/nitrogen/generated/android/c++/JFormattedNavigationError.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +4 -1
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.hpp +5 -1
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +3 -1
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +139 -0
- package/nitrogen/generated/android/c++/JFunc_void.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_BatteryOptimizationStatusChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_BatteryWarningPendingChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_EqualizerSettings.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +4 -1
- package/nitrogen/generated/android/c++/JFunc_void_IosOutput.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_NavigationErrorEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_NowPlayingMetadata.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_Options.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_Playback.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +4 -1
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackErrorEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackPlayWhenReadyChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackProgressUpdatedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackQueueEndedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_PlayingState.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpBackwardEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RemoteJumpForwardEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RemotePlayIdEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RemotePlaySearchEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSeekEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSetRatingEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RemoteSkipEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_RepeatModeChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_TimedMetadata.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_TrackMetadata.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_bool.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_double.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_FormattedNavigationError_.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +5 -1
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_ChapterMetadata_.hpp +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +3 -1
- package/nitrogen/generated/android/c++/JHeartRating.hpp +1 -1
- package/nitrogen/generated/android/c++/JHttpMethod.hpp +8 -9
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +230 -245
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +20 -26
- package/nitrogen/generated/android/c++/JIOSCategory.hpp +7 -8
- package/nitrogen/generated/android/c++/JIOSCategoryMode.hpp +10 -11
- package/nitrogen/generated/android/c++/JIOSCategoryOptions.hpp +8 -9
- package/nitrogen/generated/android/c++/JIOSCategoryPolicy.hpp +4 -5
- package/nitrogen/generated/android/c++/JImageContext.hpp +1 -1
- package/nitrogen/generated/android/c++/JImageQueryParams.hpp +1 -1
- package/nitrogen/generated/android/c++/JImageRowItem.hpp +75 -0
- package/nitrogen/generated/android/c++/JImageSource.hpp +1 -1
- package/nitrogen/generated/android/c++/JIosOutput.hpp +1 -1
- package/nitrogen/generated/android/c++/JIosOutputType.hpp +12 -13
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +4 -1
- package/nitrogen/generated/android/c++/JMediaTransformParams.hpp +1 -1
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +22 -2
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +5 -1
- package/nitrogen/generated/android/c++/JNativeUpdateOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JNavigationError.hpp +1 -1
- package/nitrogen/generated/android/c++/JNavigationErrorEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JNavigationErrorType.hpp +6 -7
- package/nitrogen/generated/android/c++/JNitroAndroidUpdateOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JNotificationButton.hpp +6 -7
- package/nitrogen/generated/android/c++/JNotificationButtonLayout.hpp +1 -1
- package/nitrogen/generated/android/c++/JNowPlayingMetadata.hpp +1 -1
- package/nitrogen/generated/android/c++/JNowPlayingUpdate.hpp +1 -1
- package/nitrogen/generated/android/c++/JOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JPartialAndroidSetupPlayerOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JPartialIOSSetupPlayerOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JPartialSetupPlayerOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JPercentageRating.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlayback.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +4 -1
- package/nitrogen/generated/android/c++/JPlaybackError.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlaybackErrorEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlaybackPlayWhenReadyChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlaybackProgressUpdatedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlaybackQueueEndedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlaybackState.hpp +10 -11
- package/nitrogen/generated/android/c++/JPlayerCapabilities.hpp +1 -1
- package/nitrogen/generated/android/c++/JPlayingState.hpp +1 -1
- package/nitrogen/generated/android/c++/JProgress.hpp +1 -1
- package/nitrogen/generated/android/c++/JRatingType.hpp +8 -9
- package/nitrogen/generated/android/c++/JRemoteJumpBackwardEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRemoteJumpForwardEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRemotePlayIdEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRemotePlaySearchEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRemoteSeekEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRemoteSetRatingEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRemoteSkipEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRepeatMode.hpp +4 -5
- package/nitrogen/generated/android/c++/JRepeatModeChangedEvent.hpp +1 -1
- package/nitrogen/generated/android/c++/JRequestConfig.hpp +1 -1
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +34 -4
- package/nitrogen/generated/android/c++/JRetryConfig.hpp +1 -1
- package/nitrogen/generated/android/c++/JSearchMode.hpp +7 -8
- package/nitrogen/generated/android/c++/JSearchParams.hpp +1 -1
- package/nitrogen/generated/android/c++/JSleepTimer.cpp +1 -1
- package/nitrogen/generated/android/c++/JSleepTimer.hpp +4 -4
- package/nitrogen/generated/android/c++/JSleepTimerEndOfTrack.hpp +1 -1
- package/nitrogen/generated/android/c++/JSleepTimerTime.hpp +1 -1
- package/nitrogen/generated/android/c++/JStarRating.hpp +1 -1
- package/nitrogen/generated/android/c++/JThumbsRating.hpp +1 -1
- package/nitrogen/generated/android/c++/JTimedMetadata.hpp +1 -1
- package/nitrogen/generated/android/c++/JTrack.hpp +29 -4
- package/nitrogen/generated/android/c++/{JRemoteLoadEvent.hpp → JTrackLoadEvent.hpp} +13 -11
- package/nitrogen/generated/android/c++/JTrackMetadata.hpp +1 -1
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +3 -4
- package/nitrogen/generated/android/c++/JTransformableRequestConfig.hpp +1 -1
- package/nitrogen/generated/android/c++/JUpdateOptions.hpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.cpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_Boolean_AndroidAudioOffloadSettings.hpp +3 -3
- package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.cpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_Boolean_RetryConfig.hpp +3 -3
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.cpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_HeartRating_ThumbsRating_StarRating_PercentageRating.hpp +5 -5
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.cpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_NullType_Double.hpp +3 -3
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.cpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_NullType_NotificationButtonLayout.hpp +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioContentType.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidAudioOffloadSettings.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidPlayerWakeMode.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AndroidUpdateOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AppKilledPlaybackBehavior.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ArtworkRequestConfig.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/AudioBrowserOnLoad.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatus.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryOptimizationStatusChangedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BatteryWarningPendingChangedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseError.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowseResult.kt +1 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/BrowserSourceCallbackParam.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlayNowPlayingButton.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CarPlaySiriListButtonPosition.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ChapterMetadata.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/EqualizerSettings.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FavoriteChangedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/FormatNavigationErrorParams.kt +2 -2
- 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__optional_FormattedNavigationError____FormatNavigationErrorParams.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{Func_void_RemoteLoadEvent.kt → Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.kt} +14 -14
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryOptimizationStatusChangedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_BatteryWarningPendingChangedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_EqualizerSettings.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_FavoriteChangedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_IosOutput.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NavigationErrorEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_NowPlayingMetadata.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Options.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_Playback.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackActiveTrackChangedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackErrorEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackPlayWhenReadyChangedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackProgressUpdatedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlaybackQueueEndedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_PlayingState.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpBackwardEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteJumpForwardEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlayIdEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemotePlaySearchEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSeekEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSetRatingEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RemoteSkipEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_RepeatModeChangedEvent.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TimedMetadata.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_TrackMetadata.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_bool.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_double.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_FormattedNavigationError_.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_ResolvedTrack_.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__string.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_ChapterMetadata_.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Func_void_std__vector_Track_.kt +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HeartRating.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HttpMethod.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/HybridAudioBrowserSpec.kt +16 -47
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategory.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryMode.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryOptions.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IOSCategoryPolicy.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageContext.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageQueryParams.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageRowItem.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageSource.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutput.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/IosOutputType.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaRequestConfig.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/MediaTransformParams.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeBrowserConfiguration.kt +9 -6
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeRouteEntry.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NativeUpdateOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationError.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NavigationErrorType.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NitroAndroidUpdateOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButton.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NotificationButtonLayout.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingMetadata.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/NowPlayingUpdate.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Options.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialAndroidSetupPlayerOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialIOSSetupPlayerOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PartialSetupPlayerOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PercentageRating.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Playback.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackActiveTrackChangedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackError.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackErrorEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackPlayWhenReadyChangedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackProgressUpdatedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackQueueEndedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlaybackState.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayerCapabilities.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/PlayingState.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Progress.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RatingType.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpBackwardEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteJumpForwardEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlayIdEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemotePlaySearchEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSeekEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSetRatingEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RemoteSkipEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatMode.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RepeatModeChangedEvent.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RequestConfig.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ResolvedTrack.kt +11 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/RetryConfig.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchMode.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SearchParams.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimer.kt +1 -8
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerEndOfTrack.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SleepTimerTime.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/StarRating.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ThumbsRating.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TimedMetadata.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Track.kt +8 -5
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/{RemoteLoadEvent.kt → TrackLoadEvent.kt} +7 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackMetadata.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +3 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TransformableRequestConfig.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/UpdateOptions.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_AndroidAudioOffloadSettings.kt +1 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_Boolean_RetryConfig.kt +1 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.kt +1 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_Double.kt +1 -7
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/Variant_NullType_NotificationButtonLayout.kt +1 -7
- package/nitrogen/generated/ios/AudioBrowser+autolinking.rb +2 -2
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.cpp +23 -14
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +239 -142
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +10 -4
- package/nitrogen/generated/ios/AudioBrowserAutolinking.mm +1 -1
- package/nitrogen/generated/ios/AudioBrowserAutolinking.swift +9 -8
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.cpp +1 -1
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +25 -18
- package/nitrogen/generated/ios/swift/AndroidAudioContentType.swift +1 -1
- package/nitrogen/generated/ios/swift/AndroidAudioOffloadSettings.swift +19 -44
- package/nitrogen/generated/ios/swift/AndroidOptions.swift +30 -74
- package/nitrogen/generated/ios/swift/AndroidPlayerWakeMode.swift +1 -1
- package/nitrogen/generated/ios/swift/AndroidUpdateOptions.swift +44 -112
- package/nitrogen/generated/ios/swift/AppKilledPlaybackBehavior.swift +1 -1
- package/nitrogen/generated/ios/swift/ArtworkRequestConfig.swift +152 -303
- package/nitrogen/generated/ios/swift/BatteryOptimizationStatus.swift +1 -1
- package/nitrogen/generated/ios/swift/BatteryOptimizationStatusChangedEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/BatteryWarningPendingChangedEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/BrowseError.swift +3 -10
- package/nitrogen/generated/ios/swift/BrowseResult.swift +1 -1
- package/nitrogen/generated/ios/swift/BrowserSourceCallbackParam.swift +20 -45
- package/nitrogen/generated/ios/swift/CarPlayNowPlayingButton.swift +1 -1
- package/nitrogen/generated/ios/swift/CarPlaySiriListButtonPosition.swift +40 -0
- package/nitrogen/generated/ios/swift/ChapterMetadata.swift +23 -60
- package/nitrogen/generated/ios/swift/EqualizerSettings.swift +24 -97
- package/nitrogen/generated/ios/swift/FavoriteChangedEvent.swift +5 -18
- package/nitrogen/generated/ios/swift/FormatNavigationErrorParams.swift +7 -26
- package/nitrogen/generated/ios/swift/FormattedNavigationError.swift +5 -18
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__optional_FormattedNavigationError____FormatNavigationErrorParams.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____MediaTransformParams.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____RequestConfig_std__optional_std__unordered_map_std__string__std__string__.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError______BrowserSourceCallbackParam.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.swift +61 -0
- package/nitrogen/generated/ios/swift/Func_void.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_BatteryOptimizationStatusChangedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_BatteryWarningPendingChangedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_EqualizerSettings.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_FavoriteChangedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_IosOutput.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_NavigationErrorEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_NowPlayingMetadata.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_Options.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_Playback.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_PlaybackActiveTrackChangedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_PlaybackErrorEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_PlaybackPlayWhenReadyChangedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_PlaybackProgressUpdatedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_PlaybackQueueEndedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_PlayingState.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RemoteJumpBackwardEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RemoteJumpForwardEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RemotePlayIdEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RemotePlaySearchEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RemoteSeekEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RemoteSetRatingEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RemoteSkipEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RepeatModeChangedEvent.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_RequestConfig.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_TimedMetadata.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_TrackMetadata.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_bool.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_double.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__optional_FormattedNavigationError_.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__optional_ResolvedTrack_.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__optional_std__variant_nitro__NullType__SleepTimerTime__SleepTimerEndOfTrack__.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_RequestConfig__.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError___.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__vector_Track___.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_void__.swift +64 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__variant_ResolvedTrack__BrowseError_.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__vector_ChapterMetadata_.swift +1 -2
- package/nitrogen/generated/ios/swift/Func_void_std__vector_Track_.swift +1 -2
- package/nitrogen/generated/ios/swift/HeartRating.swift +3 -10
- package/nitrogen/generated/ios/swift/HttpMethod.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec.swift +3 -6
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +56 -58
- package/nitrogen/generated/ios/swift/IOSCategory.swift +1 -1
- package/nitrogen/generated/ios/swift/IOSCategoryMode.swift +1 -1
- package/nitrogen/generated/ios/swift/IOSCategoryOptions.swift +1 -1
- package/nitrogen/generated/ios/swift/IOSCategoryPolicy.swift +1 -1
- package/nitrogen/generated/ios/swift/ImageContext.swift +19 -30
- package/nitrogen/generated/ios/swift/ImageQueryParams.swift +19 -44
- package/nitrogen/generated/ios/swift/ImageRowItem.swift +76 -0
- package/nitrogen/generated/ios/swift/ImageSource.swift +31 -80
- package/nitrogen/generated/ios/swift/IosOutput.swift +7 -26
- package/nitrogen/generated/ios/swift/IosOutputType.swift +1 -1
- package/nitrogen/generated/ios/swift/MediaRequestConfig.swift +162 -301
- package/nitrogen/generated/ios/swift/MediaTransformParams.swift +5 -24
- package/nitrogen/generated/ios/swift/NativeBrowserConfiguration.swift +143 -232
- package/nitrogen/generated/ios/swift/NativeRouteEntry.swift +81 -178
- package/nitrogen/generated/ios/swift/NativeUpdateOptions.swift +53 -125
- package/nitrogen/generated/ios/swift/NavigationError.swift +23 -53
- package/nitrogen/generated/ios/swift/NavigationErrorEvent.swift +3 -16
- package/nitrogen/generated/ios/swift/NavigationErrorType.swift +1 -1
- package/nitrogen/generated/ios/swift/NitroAndroidUpdateOptions.swift +44 -112
- package/nitrogen/generated/ios/swift/NotificationButton.swift +1 -1
- package/nitrogen/generated/ios/swift/NotificationButtonLayout.swift +18 -85
- package/nitrogen/generated/ios/swift/NowPlayingMetadata.swift +109 -227
- package/nitrogen/generated/ios/swift/NowPlayingUpdate.swift +19 -44
- package/nitrogen/generated/ios/swift/Options.swift +32 -88
- package/nitrogen/generated/ios/swift/PartialAndroidSetupPlayerOptions.swift +101 -201
- package/nitrogen/generated/ios/swift/PartialIOSSetupPlayerOptions.swift +25 -85
- package/nitrogen/generated/ios/swift/PartialSetupPlayerOptions.swift +35 -91
- package/nitrogen/generated/ios/swift/PercentageRating.swift +3 -10
- package/nitrogen/generated/ios/swift/Playback.swift +5 -24
- package/nitrogen/generated/ios/swift/PlaybackActiveTrackChangedEvent.swift +25 -66
- package/nitrogen/generated/ios/swift/PlaybackError.swift +5 -18
- package/nitrogen/generated/ios/swift/PlaybackErrorEvent.swift +3 -16
- package/nitrogen/generated/ios/swift/PlaybackPlayWhenReadyChangedEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/PlaybackProgressUpdatedEvent.swift +9 -34
- package/nitrogen/generated/ios/swift/PlaybackQueueEndedEvent.swift +5 -18
- package/nitrogen/generated/ios/swift/PlaybackState.swift +1 -1
- package/nitrogen/generated/ios/swift/PlayerCapabilities.swift +109 -254
- package/nitrogen/generated/ios/swift/PlayingState.swift +5 -18
- package/nitrogen/generated/ios/swift/Progress.swift +7 -26
- package/nitrogen/generated/ios/swift/RatingType.swift +1 -1
- package/nitrogen/generated/ios/swift/RemoteJumpBackwardEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/RemoteJumpForwardEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/RemotePlayIdEvent.swift +12 -24
- package/nitrogen/generated/ios/swift/RemotePlaySearchEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/RemoteSeekEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/RemoteSetRatingEvent.swift +21 -39
- package/nitrogen/generated/ios/swift/RemoteSkipEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/RepeatMode.swift +1 -1
- package/nitrogen/generated/ios/swift/RepeatModeChangedEvent.swift +3 -10
- package/nitrogen/generated/ios/swift/RequestConfig.swift +82 -191
- package/nitrogen/generated/ios/swift/ResolvedTrack.swift +164 -333
- package/nitrogen/generated/ios/swift/RetryConfig.swift +12 -24
- package/nitrogen/generated/ios/swift/SearchMode.swift +1 -1
- package/nitrogen/generated/ios/swift/SearchParams.swift +50 -129
- package/nitrogen/generated/ios/swift/SleepTimer.swift +1 -1
- package/nitrogen/generated/ios/swift/SleepTimerEndOfTrack.swift +3 -10
- package/nitrogen/generated/ios/swift/SleepTimerTime.swift +3 -10
- package/nitrogen/generated/ios/swift/StarRating.swift +3 -10
- package/nitrogen/generated/ios/swift/ThumbsRating.swift +3 -10
- package/nitrogen/generated/ios/swift/TimedMetadata.swift +46 -107
- package/nitrogen/generated/ios/swift/Track.swift +151 -319
- package/nitrogen/generated/ios/swift/TrackLoadEvent.swift +45 -0
- package/nitrogen/generated/ios/swift/TrackMetadata.swift +145 -338
- package/nitrogen/generated/ios/swift/TrackStyle.swift +1 -1
- package/nitrogen/generated/ios/swift/TransformableRequestConfig.swift +128 -252
- package/nitrogen/generated/ios/swift/UpdateOptions.swift +53 -125
- package/nitrogen/generated/ios/swift/Variant_Bool_AndroidAudioOffloadSettings.swift +1 -1
- package/nitrogen/generated/ios/swift/Variant_Bool_RetryConfig.swift +1 -1
- package/nitrogen/generated/ios/swift/Variant_HeartRating_ThumbsRating_StarRating_PercentageRating.swift +1 -1
- package/nitrogen/generated/ios/swift/Variant_NullType_Double.swift +1 -1
- package/nitrogen/generated/ios/swift/Variant_NullType_NotificationButtonLayout.swift +1 -1
- package/nitrogen/generated/shared/c++/AndroidAudioContentType.hpp +1 -1
- package/nitrogen/generated/shared/c++/AndroidAudioOffloadSettings.hpp +16 -8
- package/nitrogen/generated/shared/c++/AndroidOptions.hpp +25 -17
- package/nitrogen/generated/shared/c++/AndroidPlayerWakeMode.hpp +1 -1
- package/nitrogen/generated/shared/c++/AndroidUpdateOptions.hpp +25 -17
- package/nitrogen/generated/shared/c++/AppKilledPlaybackBehavior.hpp +1 -1
- package/nitrogen/generated/shared/c++/ArtworkRequestConfig.hpp +43 -35
- package/nitrogen/generated/shared/c++/BatteryOptimizationStatus.hpp +1 -1
- package/nitrogen/generated/shared/c++/BatteryOptimizationStatusChangedEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/BatteryWarningPendingChangedEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/BrowseError.hpp +13 -5
- package/nitrogen/generated/shared/c++/BrowserSourceCallbackParam.hpp +16 -8
- package/nitrogen/generated/shared/c++/CarPlayNowPlayingButton.hpp +1 -1
- package/nitrogen/generated/shared/c++/CarPlaySiriListButtonPosition.hpp +76 -0
- package/nitrogen/generated/shared/c++/ChapterMetadata.hpp +22 -14
- package/nitrogen/generated/shared/c++/EqualizerSettings.hpp +34 -26
- package/nitrogen/generated/shared/c++/FavoriteChangedEvent.hpp +16 -8
- package/nitrogen/generated/shared/c++/FormatNavigationErrorParams.hpp +19 -11
- package/nitrogen/generated/shared/c++/FormattedNavigationError.hpp +16 -8
- package/nitrogen/generated/shared/c++/HeartRating.hpp +13 -5
- package/nitrogen/generated/shared/c++/HttpMethod.hpp +1 -1
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.cpp +1 -5
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +1 -8
- package/nitrogen/generated/shared/c++/IOSCategory.hpp +1 -1
- package/nitrogen/generated/shared/c++/IOSCategoryMode.hpp +1 -1
- package/nitrogen/generated/shared/c++/IOSCategoryOptions.hpp +1 -1
- package/nitrogen/generated/shared/c++/IOSCategoryPolicy.hpp +1 -1
- package/nitrogen/generated/shared/c++/ImageContext.hpp +16 -8
- package/nitrogen/generated/shared/c++/ImageQueryParams.hpp +16 -8
- package/nitrogen/generated/shared/c++/ImageRowItem.hpp +98 -0
- package/nitrogen/generated/shared/c++/ImageSource.hpp +22 -14
- package/nitrogen/generated/shared/c++/IosOutput.hpp +19 -11
- package/nitrogen/generated/shared/c++/IosOutputType.hpp +1 -1
- package/nitrogen/generated/shared/c++/MediaRequestConfig.hpp +40 -32
- package/nitrogen/generated/shared/c++/MediaTransformParams.hpp +16 -8
- package/nitrogen/generated/shared/c++/NativeBrowserConfiguration.hpp +50 -35
- package/nitrogen/generated/shared/c++/NativeRouteEntry.hpp +34 -26
- package/nitrogen/generated/shared/c++/NativeUpdateOptions.hpp +28 -20
- package/nitrogen/generated/shared/c++/NavigationError.hpp +22 -14
- package/nitrogen/generated/shared/c++/NavigationErrorEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/NavigationErrorType.hpp +1 -1
- package/nitrogen/generated/shared/c++/NitroAndroidUpdateOptions.hpp +25 -17
- package/nitrogen/generated/shared/c++/NotificationButton.hpp +1 -1
- package/nitrogen/generated/shared/c++/NotificationButtonLayout.hpp +25 -17
- package/nitrogen/generated/shared/c++/NowPlayingMetadata.hpp +40 -32
- package/nitrogen/generated/shared/c++/NowPlayingUpdate.hpp +16 -8
- package/nitrogen/generated/shared/c++/Options.hpp +28 -20
- package/nitrogen/generated/shared/c++/PartialAndroidSetupPlayerOptions.hpp +40 -32
- package/nitrogen/generated/shared/c++/PartialIOSSetupPlayerOptions.hpp +25 -17
- package/nitrogen/generated/shared/c++/PartialSetupPlayerOptions.hpp +22 -14
- package/nitrogen/generated/shared/c++/PercentageRating.hpp +13 -5
- package/nitrogen/generated/shared/c++/Playback.hpp +16 -8
- package/nitrogen/generated/shared/c++/PlaybackActiveTrackChangedEvent.hpp +25 -17
- package/nitrogen/generated/shared/c++/PlaybackError.hpp +16 -8
- package/nitrogen/generated/shared/c++/PlaybackErrorEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/PlaybackPlayWhenReadyChangedEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/PlaybackProgressUpdatedEvent.hpp +22 -14
- package/nitrogen/generated/shared/c++/PlaybackQueueEndedEvent.hpp +16 -8
- package/nitrogen/generated/shared/c++/PlaybackState.hpp +1 -1
- package/nitrogen/generated/shared/c++/PlayerCapabilities.hpp +46 -38
- package/nitrogen/generated/shared/c++/PlayingState.hpp +16 -8
- package/nitrogen/generated/shared/c++/Progress.hpp +19 -11
- package/nitrogen/generated/shared/c++/RatingType.hpp +1 -1
- package/nitrogen/generated/shared/c++/RemoteJumpBackwardEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/RemoteJumpForwardEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/RemotePlayIdEvent.hpp +16 -8
- package/nitrogen/generated/shared/c++/RemotePlaySearchEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/RemoteSeekEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/RemoteSetRatingEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/RemoteSkipEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/RepeatMode.hpp +1 -1
- package/nitrogen/generated/shared/c++/RepeatModeChangedEvent.hpp +13 -5
- package/nitrogen/generated/shared/c++/RequestConfig.hpp +34 -26
- package/nitrogen/generated/shared/c++/ResolvedTrack.hpp +79 -57
- package/nitrogen/generated/shared/c++/RetryConfig.hpp +16 -8
- package/nitrogen/generated/shared/c++/SearchMode.hpp +1 -1
- package/nitrogen/generated/shared/c++/SearchParams.hpp +31 -23
- package/nitrogen/generated/shared/c++/SleepTimerEndOfTrack.hpp +13 -5
- package/nitrogen/generated/shared/c++/SleepTimerTime.hpp +13 -5
- package/nitrogen/generated/shared/c++/StarRating.hpp +13 -5
- package/nitrogen/generated/shared/c++/ThumbsRating.hpp +13 -5
- package/nitrogen/generated/shared/c++/TimedMetadata.hpp +25 -17
- package/nitrogen/generated/shared/c++/Track.hpp +70 -54
- package/nitrogen/generated/shared/c++/{RemoteLoadEvent.hpp → TrackLoadEvent.hpp} +28 -20
- package/nitrogen/generated/shared/c++/TrackMetadata.hpp +58 -50
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +1 -1
- package/nitrogen/generated/shared/c++/TransformableRequestConfig.hpp +37 -29
- package/nitrogen/generated/shared/c++/UpdateOptions.hpp +28 -20
- package/package.json +6 -7
- package/src/features/browser.ts +1 -0
- package/src/features/remoteControls.ts +0 -35
- package/src/specs/audio-browser.nitro.ts +0 -3
- package/src/types/browser-native.ts +2 -0
- package/src/types/browser-nodes.ts +49 -1
- package/src/types/browser.ts +36 -0
- package/src/web/NativeAudioBrowser.ts +19 -24
- package/src/web/SimpleRouter.test.ts +160 -0
- package/src/web/SimpleRouter.ts +10 -8
- package/nitrogen/generated/android/c++/JFunc_void_RemoteLoadEvent.hpp +0 -89
- package/nitrogen/generated/ios/swift/Func_void_RemoteLoadEvent.swift +0 -47
- package/nitrogen/generated/ios/swift/RemoteLoadEvent.swift +0 -70
|
@@ -26,26 +26,25 @@ extension Track {
|
|
|
26
26
|
/// Uses Kingfisher for caching and efficient image loading
|
|
27
27
|
func loadArtwork() async -> UIImage? {
|
|
28
28
|
// Try artworkSource first (has more detailed config), then fall back to artwork string
|
|
29
|
+
// Skip SF Symbol strings - those require SFSymbolRenderer and can't be loaded as URLs
|
|
29
30
|
let artworkUrlString: String?
|
|
30
31
|
let artworkHeaders: [String: String]?
|
|
31
32
|
|
|
32
33
|
if let source = artworkSource {
|
|
33
34
|
artworkUrlString = source.uri
|
|
34
35
|
artworkHeaders = source.headers
|
|
35
|
-
} else {
|
|
36
|
+
} else if let artwork, !SFSymbolRenderer.isSFSymbol(artwork) {
|
|
36
37
|
artworkUrlString = artwork
|
|
37
38
|
artworkHeaders = nil
|
|
39
|
+
} else {
|
|
40
|
+
artworkUrlString = nil
|
|
41
|
+
artworkHeaders = nil
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
guard let urlString = artworkUrlString, let url = URL(string: urlString) else {
|
|
41
45
|
return nil
|
|
42
46
|
}
|
|
43
47
|
|
|
44
|
-
if url.isFileURL {
|
|
45
|
-
return UIImage(contentsOfFile: url.path)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Build Kingfisher options with headers if provided
|
|
49
48
|
var options: KingfisherOptionsInfo = []
|
|
50
49
|
if let headers = artworkHeaders, !headers.isEmpty {
|
|
51
50
|
let modifier = AnyModifier { request in
|
|
@@ -48,12 +48,6 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
// MARK: - Internal Callbacks (for CarPlay/external controllers)
|
|
52
|
-
|
|
53
|
-
/// Called when notifyContentChanged is invoked, allowing CarPlay to refresh its templates.
|
|
54
|
-
/// Set by CarPlayController during setup.
|
|
55
|
-
var onExternalContentChanged: ((String) -> Void)?
|
|
56
|
-
|
|
57
51
|
// MARK: - Multi-Listener Emitters
|
|
58
52
|
|
|
59
53
|
/// Emitters allow multiple listeners for each event type, avoiding callback hijacking
|
|
@@ -114,8 +108,8 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
114
108
|
|
|
115
109
|
public var configuration: NativeBrowserConfiguration = .init(
|
|
116
110
|
path: nil, request: nil, media: nil, artwork: nil, routes: nil,
|
|
117
|
-
singleTrack: nil,
|
|
118
|
-
carPlayNowPlayingButtons: nil, formatNavigationError: nil,
|
|
111
|
+
singleTrack: nil, handleTrackLoad: nil, androidControllerOfflineError: nil,
|
|
112
|
+
carPlayUpNextButton: nil, carPlayNowPlayingButtons: nil, formatNavigationError: nil,
|
|
119
113
|
) {
|
|
120
114
|
didSet {
|
|
121
115
|
browserManager.config = BrowserConfig(from: configuration)
|
|
@@ -175,7 +169,6 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
175
169
|
public var onRemoteJumpBackward: (RemoteJumpBackwardEvent) -> Void = { _ in }
|
|
176
170
|
public var onRemoteJumpForward: (RemoteJumpForwardEvent) -> Void = { _ in }
|
|
177
171
|
public var onRemoteLike: () -> Void = {}
|
|
178
|
-
public var onRemoteLoad: (RemoteLoadEvent) -> Void = { _ in }
|
|
179
172
|
public var onRemoteNext: () -> Void = {}
|
|
180
173
|
public var onRemotePause: () -> Void = {}
|
|
181
174
|
public var onRemotePlay: () -> Void = {}
|
|
@@ -194,7 +187,6 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
194
187
|
public var handleRemoteJumpBackward: ((RemoteJumpBackwardEvent) -> Void)?
|
|
195
188
|
public var handleRemoteJumpForward: ((RemoteJumpForwardEvent) -> Void)?
|
|
196
189
|
public var handleRemoteLike: (() -> Void)?
|
|
197
|
-
public var handleRemoteLoad: ((RemoteLoadEvent) -> Void)?
|
|
198
190
|
public var handleRemoteNext: (() -> Void)?
|
|
199
191
|
public var handleRemotePause: (() -> Void)?
|
|
200
192
|
public var handleRemotePlay: (() -> Void)?
|
|
@@ -228,6 +220,7 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
228
220
|
setupVolumeObserver()
|
|
229
221
|
}
|
|
230
222
|
}
|
|
223
|
+
|
|
231
224
|
public var onIosOutputChanged: (IosOutput) -> Void = { _ in } {
|
|
232
225
|
didSet {
|
|
233
226
|
setupRouteChangeObserver()
|
|
@@ -238,11 +231,30 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
238
231
|
|
|
239
232
|
override public init() {
|
|
240
233
|
super.init()
|
|
241
|
-
|
|
234
|
+
|
|
235
|
+
// Clean up the previous instance (e.g., on JS runtime reload).
|
|
236
|
+
// The old HybridAudioBrowser may still be retained by the global
|
|
237
|
+
// playerAndConfiguredBrowser OnceValue, so we must explicitly stop
|
|
238
|
+
// its player to prevent two audio streams running simultaneously.
|
|
239
|
+
onMainActor {
|
|
240
|
+
HybridAudioBrowser.shared?.player?.destroy()
|
|
241
|
+
playerAndConfiguredBrowser.reset()
|
|
242
|
+
HybridAudioBrowser.shared = self
|
|
243
|
+
}
|
|
242
244
|
setupEmitterToNitroForwarding()
|
|
243
245
|
setupBrowserCallbacks()
|
|
244
246
|
}
|
|
245
247
|
|
|
248
|
+
deinit {
|
|
249
|
+
// Safety net: ensure the AVPlayer is stopped if this instance is deallocated.
|
|
250
|
+
let player = self.player
|
|
251
|
+
if Thread.isMainThread {
|
|
252
|
+
MainActor.assumeIsolated { player?.destroy() }
|
|
253
|
+
} else {
|
|
254
|
+
DispatchQueue.main.async { MainActor.assumeIsolated { player?.destroy() } }
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
246
258
|
/// Returns the TrackPlayer instance, if setup has been called.
|
|
247
259
|
func getPlayer() -> TrackPlayer? {
|
|
248
260
|
player
|
|
@@ -327,13 +339,16 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
327
339
|
let defaultFormatted = defaultFormattedError(navError)
|
|
328
340
|
if let formatter = browserManager.config.formatNavigationError {
|
|
329
341
|
let params = FormatNavigationErrorParams(error: navError, defaultFormatted: defaultFormatted, path: path)
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
342
|
+
// Dispatch to main thread for the Nitro bridge call to avoid C++ noexcept crashes
|
|
343
|
+
DispatchQueue.main.async { [weak self] in
|
|
344
|
+
formatter(params)
|
|
345
|
+
.then { customDisplay in
|
|
346
|
+
self?.lastFormattedNavigationError = customDisplay ?? defaultFormatted
|
|
347
|
+
}
|
|
348
|
+
.catch { _ in
|
|
349
|
+
self?.lastFormattedNavigationError = defaultFormatted
|
|
350
|
+
}
|
|
351
|
+
}
|
|
337
352
|
} else {
|
|
338
353
|
lastFormattedNavigationError = defaultFormatted
|
|
339
354
|
}
|
|
@@ -375,21 +390,15 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
375
390
|
}
|
|
376
391
|
}
|
|
377
392
|
|
|
378
|
-
/// Centralizes
|
|
379
|
-
/// If
|
|
380
|
-
/// Always fires onRemoteLoad afterward.
|
|
393
|
+
/// Centralizes handleTrackLoad interception logic.
|
|
394
|
+
/// If handleTrackLoad is set on config, awaits it (intercepted). Otherwise runs defaultBehavior.
|
|
381
395
|
///
|
|
382
396
|
/// - Returns: true if the handler intercepted, false if defaultBehavior ran
|
|
383
397
|
@discardableResult
|
|
384
|
-
private func
|
|
385
|
-
let event =
|
|
386
|
-
if
|
|
387
|
-
|
|
388
|
-
onRemoteLoad(event)
|
|
389
|
-
return true
|
|
390
|
-
}
|
|
391
|
-
defaultBehavior()
|
|
392
|
-
onRemoteLoad(event)
|
|
398
|
+
private func handleLoadAsync(track: Track, queue: [Track], startIndex: Double, defaultBehavior: () async -> Void) async -> Bool {
|
|
399
|
+
let event = TrackLoadEvent(track: track, queue: queue, startIndex: startIndex)
|
|
400
|
+
if await browserManager.config.awaitTrackLoadHandler(event: event) { return true }
|
|
401
|
+
await defaultBehavior()
|
|
393
402
|
return false
|
|
394
403
|
}
|
|
395
404
|
|
|
@@ -412,9 +421,17 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
412
421
|
if let index = existingIndex {
|
|
413
422
|
logger.debug("Queue already from \(parentPath), skipping to index \(index)")
|
|
414
423
|
let queue: [Track] = onMainActor { player?.tracks ?? [] }
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
424
|
+
Task {
|
|
425
|
+
await handleLoadAsync(track: track, queue: queue, startIndex: Double(index)) {
|
|
426
|
+
do {
|
|
427
|
+
try onMainActor {
|
|
428
|
+
try player?.skipTo(index, playWhenReady: true)
|
|
429
|
+
}
|
|
430
|
+
} catch {
|
|
431
|
+
// NOTE: because we have a throwing closure here, the thrown error
|
|
432
|
+
// can't be propogated up. Log it out instead.
|
|
433
|
+
logger.error("Failed to skip to track at index \(index): \(error)")
|
|
434
|
+
}
|
|
418
435
|
}
|
|
419
436
|
}
|
|
420
437
|
return
|
|
@@ -425,7 +442,7 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
425
442
|
// Expand the queue from the contextual URL
|
|
426
443
|
if let expanded = try await browserManager.expandQueueFromContextualUrl(url) {
|
|
427
444
|
let (tracks, startIndex) = expanded
|
|
428
|
-
|
|
445
|
+
await handleLoadAsync(track: track, queue: tracks, startIndex: Double(startIndex)) {
|
|
429
446
|
// Replace queue and start at the selected track (auto-play)
|
|
430
447
|
onMainActor {
|
|
431
448
|
player?.setQueue(tracks, initialIndex: startIndex, playWhenReady: true, sourcePath: parentPath)
|
|
@@ -433,7 +450,7 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
433
450
|
}
|
|
434
451
|
} else {
|
|
435
452
|
// Fallback: just load the single track (auto-play)
|
|
436
|
-
|
|
453
|
+
await handleLoadAsync(track: track, queue: [track], startIndex: 0) {
|
|
437
454
|
onMainActor {
|
|
438
455
|
player?.load(track, playWhenReady: true)
|
|
439
456
|
}
|
|
@@ -442,7 +459,7 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
442
459
|
} catch {
|
|
443
460
|
logger.error("Error expanding queue: \(error.localizedDescription)")
|
|
444
461
|
// Fallback to single track (auto-play) - playback errors reported via TrackPlayer callbacks
|
|
445
|
-
|
|
462
|
+
await handleLoadAsync(track: track, queue: [track], startIndex: 0) {
|
|
446
463
|
onMainActor {
|
|
447
464
|
player?.load(track, playWhenReady: true)
|
|
448
465
|
}
|
|
@@ -452,9 +469,11 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
452
469
|
}
|
|
453
470
|
// If track has src, it's playable - load and auto-play
|
|
454
471
|
else if track.src != nil {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
472
|
+
Task {
|
|
473
|
+
await handleLoadAsync(track: track, queue: [track], startIndex: 0) {
|
|
474
|
+
onMainActor {
|
|
475
|
+
player?.load(track, playWhenReady: true)
|
|
476
|
+
}
|
|
458
477
|
}
|
|
459
478
|
}
|
|
460
479
|
}
|
|
@@ -497,7 +516,6 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
497
516
|
browserManager.invalidateContentCache(path)
|
|
498
517
|
|
|
499
518
|
// Notify external controllers (CarPlay) that content changed
|
|
500
|
-
onExternalContentChanged?(path)
|
|
501
519
|
externalContentChangedEmitter.emit(path)
|
|
502
520
|
|
|
503
521
|
// Re-resolve the path if it's the current browser path
|
|
@@ -828,9 +846,10 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
828
846
|
favorited: favorited,
|
|
829
847
|
groupTitle: track.groupTitle,
|
|
830
848
|
live: track.live,
|
|
849
|
+
imageRow: track.imageRow,
|
|
831
850
|
)
|
|
832
851
|
// Update the track in the player's queue so getActiveTrack() returns correct state
|
|
833
|
-
player?.
|
|
852
|
+
player?.replace(index, updatedTrack)
|
|
834
853
|
favoriteChangedEmitter.emit(FavoriteChangedEvent(track: updatedTrack, favorited: favorited))
|
|
835
854
|
// Fire active track changed so useActiveTrack() hook updates UI
|
|
836
855
|
let position = player?.currentTime ?? 0
|
|
@@ -911,7 +930,7 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
911
930
|
album: track.album,
|
|
912
931
|
artist: override?.artist ?? track.artist,
|
|
913
932
|
duration: track.duration,
|
|
914
|
-
artwork: track
|
|
933
|
+
artwork: nowPlayingArtwork(for: track),
|
|
915
934
|
description: track.description,
|
|
916
935
|
mediaId: track.src ?? track.url,
|
|
917
936
|
genre: track.genre,
|
|
@@ -920,6 +939,15 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
920
939
|
}
|
|
921
940
|
}
|
|
922
941
|
|
|
942
|
+
/// Returns the artwork URI suitable for JS consumption.
|
|
943
|
+
/// Prefers the resolved artworkSource URI (e.g. file:// for rendered SF Symbols).
|
|
944
|
+
/// Falls back to the raw artwork string only if it's not an SF Symbol (which JS can't load).
|
|
945
|
+
private func nowPlayingArtwork(for track: Track) -> String? {
|
|
946
|
+
if let uri = track.artworkSource?.uri { return uri }
|
|
947
|
+
guard let artwork = track.artwork else { return nil }
|
|
948
|
+
return SFSymbolRenderer.isSFSymbol(artwork) ? nil : artwork
|
|
949
|
+
}
|
|
950
|
+
|
|
923
951
|
/// Applies the current now playing metadata (with override if set) to NowPlayingInfoCenter and notifies JS.
|
|
924
952
|
@MainActor
|
|
925
953
|
private func applyNowPlayingMetadata() {
|
|
@@ -932,7 +960,7 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
932
960
|
album: track.album,
|
|
933
961
|
artist: override?.artist ?? track.artist,
|
|
934
962
|
duration: track.duration,
|
|
935
|
-
artwork: track
|
|
963
|
+
artwork: nowPlayingArtwork(for: track),
|
|
936
964
|
description: track.description,
|
|
937
965
|
mediaId: track.src ?? track.url,
|
|
938
966
|
genre: track.genre,
|
|
@@ -989,7 +1017,7 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
989
1017
|
routeChangeObserver = NotificationCenter.default.addObserver(
|
|
990
1018
|
forName: AVAudioSession.routeChangeNotification,
|
|
991
1019
|
object: nil,
|
|
992
|
-
queue: .main
|
|
1020
|
+
queue: .main,
|
|
993
1021
|
) { [weak self] _ in
|
|
994
1022
|
guard let self, let output = self.getCurrentOutput() else { return }
|
|
995
1023
|
self.onIosOutputChanged(output)
|
|
@@ -1038,15 +1066,21 @@ public class HybridAudioBrowser: HybridAudioBrowserSpec, @unchecked Sendable {
|
|
|
1038
1066
|
guard let windowScene = UIApplication.shared.connectedScenes
|
|
1039
1067
|
.compactMap({ $0 as? UIWindowScene })
|
|
1040
1068
|
.first(where: { $0.activationState == .foregroundActive }),
|
|
1041
|
-
let window = windowScene.windows.first(where: { $0.isKeyWindow })
|
|
1069
|
+
let window = windowScene.windows.first(where: { $0.isKeyWindow }),
|
|
1070
|
+
var topController = window.rootViewController
|
|
1042
1071
|
else {
|
|
1043
1072
|
self?.logger.debug("openIosOutputPicker: Could not find active window scene")
|
|
1044
1073
|
return
|
|
1045
1074
|
}
|
|
1046
1075
|
|
|
1076
|
+
// Walk up to the topmost presented view controller
|
|
1077
|
+
while let presented = topController.presentedViewController {
|
|
1078
|
+
topController = presented
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1047
1081
|
let routePicker = AVRoutePickerView(frame: .zero)
|
|
1048
1082
|
routePicker.isHidden = true
|
|
1049
|
-
|
|
1083
|
+
topController.view.addSubview(routePicker)
|
|
1050
1084
|
|
|
1051
1085
|
// Find the button inside AVRoutePickerView and trigger it
|
|
1052
1086
|
for subview in routePicker.subviews {
|
|
@@ -1296,6 +1330,33 @@ extension HybridAudioBrowser: TrackPlayerCallbacks {
|
|
|
1296
1330
|
}
|
|
1297
1331
|
}
|
|
1298
1332
|
|
|
1333
|
+
/// Handles an INPlayMediaIntent by searching for the given term and starting playback.
|
|
1334
|
+
///
|
|
1335
|
+
/// Host apps should call this from their `INPlayMediaIntentHandling` implementation.
|
|
1336
|
+
/// Uses the browser's search route to find tracks, then queues and plays them.
|
|
1337
|
+
///
|
|
1338
|
+
/// - Parameters:
|
|
1339
|
+
/// - searchTerm: The search query from Siri.
|
|
1340
|
+
/// - completion: Called with `true` if tracks were found and queued, `false` otherwise.
|
|
1341
|
+
public func handlePlayMediaIntent(searchTerm: String, completion: @escaping @Sendable (Bool) -> Void) {
|
|
1342
|
+
Task {
|
|
1343
|
+
do {
|
|
1344
|
+
let resolved = try await self.browserManager.search(searchTerm)
|
|
1345
|
+
guard let tracks = resolved.children, !tracks.isEmpty else {
|
|
1346
|
+
completion(false)
|
|
1347
|
+
return
|
|
1348
|
+
}
|
|
1349
|
+
await MainActor.run {
|
|
1350
|
+
self.getPlayer()?.setQueue(tracks, initialIndex: 0, playWhenReady: true)
|
|
1351
|
+
}
|
|
1352
|
+
completion(true)
|
|
1353
|
+
} catch {
|
|
1354
|
+
self.logger.error("handlePlayMediaIntent failed: \(error.localizedDescription)")
|
|
1355
|
+
completion(false)
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1299
1360
|
public func remoteLike() {
|
|
1300
1361
|
if let handler = handleRemoteLike {
|
|
1301
1362
|
handler()
|
package/ios/Model/MediaURL.swift
CHANGED
|
@@ -45,7 +45,8 @@ struct MediaURL {
|
|
|
45
45
|
allowed.formUnion(.urlQueryAllowed)
|
|
46
46
|
allowed.formUnion(.urlFragmentAllowed)
|
|
47
47
|
if let encoded = string.addingPercentEncoding(withAllowedCharacters: allowed),
|
|
48
|
-
let url = URL(string: encoded)
|
|
48
|
+
let url = URL(string: encoded)
|
|
49
|
+
{
|
|
49
50
|
return url
|
|
50
51
|
}
|
|
51
52
|
}
|
|
@@ -12,39 +12,31 @@ import os.log
|
|
|
12
12
|
class RetryManager {
|
|
13
13
|
private let logger = Logger(subsystem: "com.audiobrowser", category: "RetryManager")
|
|
14
14
|
|
|
15
|
-
/// Retry policy configuration
|
|
16
15
|
enum Policy {
|
|
17
16
|
case disabled
|
|
18
17
|
case infinite
|
|
19
18
|
case limited(maxRetries: Int)
|
|
20
19
|
}
|
|
21
20
|
|
|
22
|
-
/// Default maximum duration to keep retrying before giving up (in milliseconds).
|
|
23
21
|
private static let defaultMaxRetryDurationMs: Double = 120_000 // 2 minutes
|
|
24
22
|
|
|
25
|
-
///
|
|
26
|
-
/// This prevents surprising playback resumption after long periods offline.
|
|
23
|
+
/// Prevents surprising playback resumption after long periods offline.
|
|
27
24
|
private var maxRetryDuration: TimeInterval = defaultMaxRetryDurationMs / 1000
|
|
28
25
|
|
|
29
26
|
private var policy: Policy = .disabled
|
|
30
27
|
private var attemptCount = 0
|
|
31
28
|
private var firstRetryTime: Date?
|
|
32
29
|
|
|
33
|
-
/// Network monitor for accelerating retries when connectivity is restored
|
|
34
30
|
weak var networkMonitor: NetworkMonitor?
|
|
35
|
-
|
|
36
|
-
/// Flag to track if we're waiting for network (for cleanup on reset)
|
|
37
31
|
private var isWaitingForNetwork = false
|
|
32
|
+
/// Invalidates in-flight retries when reset() is called (e.g. track change)
|
|
33
|
+
private var generation: Int = 0
|
|
38
34
|
|
|
39
|
-
/// Callback to check if we should retry (typically checks playWhenReady)
|
|
40
35
|
var shouldRetry: () -> Bool = { true }
|
|
41
|
-
|
|
42
|
-
/// Callback to trigger reload
|
|
43
36
|
var onRetry: ((Bool) -> Void)?
|
|
44
37
|
|
|
45
38
|
// MARK: - Configuration
|
|
46
39
|
|
|
47
|
-
/// Updates the retry policy from the Nitro config type
|
|
48
40
|
func updatePolicy(from config: Variant_Bool_RetryConfig?) {
|
|
49
41
|
guard let config else {
|
|
50
42
|
policy = .disabled
|
|
@@ -61,7 +53,6 @@ class RetryManager {
|
|
|
61
53
|
case let .second(retryConfig):
|
|
62
54
|
let maxRetries = Int(retryConfig.maxRetries)
|
|
63
55
|
policy = .limited(maxRetries: maxRetries)
|
|
64
|
-
// Use configured duration or default
|
|
65
56
|
let durationMs = retryConfig.maxRetryDurationMs ?? Self.defaultMaxRetryDurationMs
|
|
66
57
|
maxRetryDuration = durationMs / 1000
|
|
67
58
|
logger.debug("Retry policy: limited to \(maxRetries) retries, max duration \(self.maxRetryDuration)s")
|
|
@@ -70,9 +61,7 @@ class RetryManager {
|
|
|
70
61
|
|
|
71
62
|
// MARK: - Exponential Backoff
|
|
72
63
|
|
|
73
|
-
/// Calculates delay for current attempt using exponential backoff.
|
|
74
64
|
/// Delays: 1s -> 1.5s -> 2.3s -> 3.4s -> 5s (capped)
|
|
75
|
-
/// Returns delay in seconds.
|
|
76
65
|
private func calculateDelaySeconds() -> Double {
|
|
77
66
|
let baseDelay = 1.0
|
|
78
67
|
let multiplier = 1.5
|
|
@@ -83,8 +72,6 @@ class RetryManager {
|
|
|
83
72
|
|
|
84
73
|
// MARK: - Error Classification
|
|
85
74
|
|
|
86
|
-
/// Classifies whether an error is retryable or permanent.
|
|
87
|
-
/// Only clearly transient network errors are retried.
|
|
88
75
|
func isRetryable(_ error: Error?) -> Bool {
|
|
89
76
|
guard let error else { return false }
|
|
90
77
|
|
|
@@ -113,34 +100,25 @@ class RetryManager {
|
|
|
113
100
|
|
|
114
101
|
// MARK: - Retry Management
|
|
115
102
|
|
|
116
|
-
/// Resets retry count. Call when track changes.
|
|
117
103
|
func reset() {
|
|
118
104
|
attemptCount = 0
|
|
119
105
|
firstRetryTime = nil
|
|
120
106
|
isWaitingForNetwork = false
|
|
121
|
-
|
|
107
|
+
generation += 1
|
|
108
|
+
logger.debug("Retry count reset (generation \(self.generation))")
|
|
122
109
|
}
|
|
123
110
|
|
|
124
|
-
/// Attempts a retry if policy allows.
|
|
125
|
-
/// Returns true if retry was scheduled, false if max retries exceeded or disabled.
|
|
126
|
-
///
|
|
127
|
-
/// If a network monitor is configured and the device is offline, the retry will
|
|
128
|
-
/// trigger immediately when connectivity is restored instead of waiting for the
|
|
129
|
-
/// full backoff delay.
|
|
130
111
|
func attemptRetry(startFromCurrentTime: Bool) async -> Bool {
|
|
131
|
-
// Check if retry is disabled
|
|
132
112
|
if case .disabled = policy {
|
|
133
113
|
logger.debug("Retry disabled, not retrying")
|
|
134
114
|
return false
|
|
135
115
|
}
|
|
136
116
|
|
|
137
|
-
// Check if we should retry (e.g., playWhenReady is true)
|
|
138
117
|
guard shouldRetry() else {
|
|
139
118
|
logger.debug("shouldRetry returned false, not retrying")
|
|
140
119
|
return false
|
|
141
120
|
}
|
|
142
121
|
|
|
143
|
-
// Check max retries for limited policy
|
|
144
122
|
if case let .limited(maxRetries) = policy {
|
|
145
123
|
if attemptCount >= maxRetries {
|
|
146
124
|
logger.info("Max retries (\(maxRetries)) exceeded, giving up")
|
|
@@ -148,7 +126,6 @@ class RetryManager {
|
|
|
148
126
|
}
|
|
149
127
|
}
|
|
150
128
|
|
|
151
|
-
// Track when we started retrying
|
|
152
129
|
if firstRetryTime == nil {
|
|
153
130
|
firstRetryTime = Date()
|
|
154
131
|
}
|
|
@@ -162,10 +139,9 @@ class RetryManager {
|
|
|
162
139
|
}
|
|
163
140
|
}
|
|
164
141
|
|
|
165
|
-
// Schedule retry with exponential backoff
|
|
166
142
|
let delaySeconds = calculateDelaySeconds()
|
|
167
|
-
|
|
168
|
-
logger.info("Scheduling retry
|
|
143
|
+
let currentGeneration = generation
|
|
144
|
+
logger.info("Scheduling retry after \(delaySeconds)s")
|
|
169
145
|
|
|
170
146
|
// Race between: backoff delay OR network restored (if offline)
|
|
171
147
|
let waitCancelled = await waitForDelayOrNetworkRestored(delaySeconds: delaySeconds)
|
|
@@ -175,13 +151,18 @@ class RetryManager {
|
|
|
175
151
|
return false
|
|
176
152
|
}
|
|
177
153
|
|
|
178
|
-
//
|
|
154
|
+
// Check if reset() was called while we were waiting
|
|
155
|
+
guard generation == currentGeneration else {
|
|
156
|
+
logger.debug("Retry invalidated by reset (generation changed)")
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
|
|
179
160
|
guard shouldRetry() else {
|
|
180
161
|
logger.debug("shouldRetry returned false after delay, cancelling retry")
|
|
181
162
|
return false
|
|
182
163
|
}
|
|
183
164
|
|
|
184
|
-
//
|
|
165
|
+
// Re-check duration — we may have waited a long time for network restoration
|
|
185
166
|
if let startTime = firstRetryTime {
|
|
186
167
|
let elapsed = Date().timeIntervalSince(startTime)
|
|
187
168
|
if elapsed >= maxRetryDuration {
|
|
@@ -190,7 +171,7 @@ class RetryManager {
|
|
|
190
171
|
}
|
|
191
172
|
}
|
|
192
173
|
|
|
193
|
-
|
|
174
|
+
attemptCount += 1
|
|
194
175
|
logger.info("Executing retry #\(self.attemptCount)")
|
|
195
176
|
onRetry?(startFromCurrentTime)
|
|
196
177
|
return true
|
|
@@ -198,12 +179,10 @@ class RetryManager {
|
|
|
198
179
|
|
|
199
180
|
// MARK: - Network-Aware Waiting
|
|
200
181
|
|
|
201
|
-
/// Waits for either the backoff delay to elapse OR network to be restored (if offline).
|
|
202
182
|
/// Returns true if cancelled, false if ready to retry.
|
|
203
183
|
private func waitForDelayOrNetworkRestored(delaySeconds: Double) async -> Bool {
|
|
204
184
|
let isOffline = !(networkMonitor?.isOnline ?? true)
|
|
205
185
|
|
|
206
|
-
// If online or no monitor, just do a simple sleep
|
|
207
186
|
guard isOffline, let monitor = networkMonitor else {
|
|
208
187
|
do {
|
|
209
188
|
let nanoseconds = UInt64(delaySeconds * 1_000_000_000)
|
|
@@ -216,66 +195,48 @@ class RetryManager {
|
|
|
216
195
|
|
|
217
196
|
logger.debug("Device is offline, will retry immediately when connectivity is restored")
|
|
218
197
|
|
|
219
|
-
// Race between sleep and network restoration
|
|
220
198
|
return await withTaskGroup(of: Bool.self, returning: Bool.self) { group in
|
|
221
|
-
// Task 1: Sleep for backoff delay
|
|
222
199
|
group.addTask {
|
|
223
200
|
do {
|
|
224
201
|
let nanoseconds = UInt64(delaySeconds * 1_000_000_000)
|
|
225
202
|
try await Task.sleep(nanoseconds: nanoseconds)
|
|
226
|
-
return false
|
|
203
|
+
return false
|
|
227
204
|
} catch {
|
|
228
|
-
return true
|
|
205
|
+
return true
|
|
229
206
|
}
|
|
230
207
|
}
|
|
231
208
|
|
|
232
|
-
// Task 2: Wait for network restoration
|
|
233
209
|
group.addTask { [weak self] in
|
|
234
210
|
await self?.waitForNetworkRestored(monitor: monitor) ?? true
|
|
235
211
|
}
|
|
236
212
|
|
|
237
|
-
// Return when either completes
|
|
238
213
|
let result = await group.next() ?? true
|
|
239
214
|
group.cancelAll()
|
|
240
215
|
return result
|
|
241
216
|
}
|
|
242
217
|
}
|
|
243
218
|
|
|
244
|
-
/// Waits until network connectivity is restored.
|
|
245
219
|
/// Returns false when network is restored, true if cancelled.
|
|
246
220
|
@MainActor
|
|
247
221
|
private func waitForNetworkRestored(monitor: NetworkMonitor) async -> Bool {
|
|
248
|
-
// If already online, return immediately
|
|
249
222
|
if monitor.isOnline {
|
|
250
223
|
return false
|
|
251
224
|
}
|
|
252
225
|
|
|
253
226
|
isWaitingForNetwork = true
|
|
227
|
+
defer { isWaitingForNetwork = false }
|
|
254
228
|
|
|
255
|
-
|
|
256
|
-
let previousHandler = monitor.onChanged
|
|
257
|
-
|
|
258
|
-
// Use withCheckedContinuation to wait for network
|
|
259
|
-
let result: Bool = await withCheckedContinuation { continuation in
|
|
260
|
-
var hasResumed = false
|
|
229
|
+
logger.debug("Device is offline, polling for network restoration")
|
|
261
230
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
if isOnline {
|
|
269
|
-
hasResumed = true
|
|
270
|
-
self?.logger.info("Network restored, accelerating retry")
|
|
271
|
-
// Restore original handler
|
|
272
|
-
monitor.onChanged = previousHandler
|
|
273
|
-
continuation.resume(returning: false) // Network restored, ready to retry
|
|
274
|
-
}
|
|
231
|
+
while !monitor.isOnline {
|
|
232
|
+
do {
|
|
233
|
+
try await Task.sleep(nanoseconds: 500_000_000) // 0.5s poll
|
|
234
|
+
} catch {
|
|
235
|
+
return true // Task cancelled
|
|
275
236
|
}
|
|
276
237
|
}
|
|
277
238
|
|
|
278
|
-
|
|
279
|
-
return
|
|
239
|
+
logger.info("Network restored, accelerating retry")
|
|
240
|
+
return false
|
|
280
241
|
}
|
|
281
242
|
}
|
|
@@ -39,7 +39,7 @@ class SleepTimerManager {
|
|
|
39
39
|
var onComplete: (() -> Void)?
|
|
40
40
|
|
|
41
41
|
/// Callback invoked when the sleep timer state changes
|
|
42
|
-
var onChanged: ((SleepTimerState
|
|
42
|
+
var onChanged: ((SleepTimerState) -> Void)?
|
|
43
43
|
|
|
44
44
|
// MARK: - Public Methods
|
|
45
45
|
|
|
@@ -52,7 +52,7 @@ class SleepTimerManager {
|
|
|
52
52
|
if !hasSleepTimer { return false }
|
|
53
53
|
sleepTimerTime = -1
|
|
54
54
|
willSleepWhenCurrentItemReachesEnd = false
|
|
55
|
-
onChanged?(
|
|
55
|
+
onChanged?(.first(NullType.null))
|
|
56
56
|
return true
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -88,7 +88,7 @@ class SleepTimerManager {
|
|
|
88
88
|
sleepTimerJob = job
|
|
89
89
|
sleepTimerTime = Date().timeIntervalSince1970 + seconds
|
|
90
90
|
DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: job)
|
|
91
|
-
onChanged?(
|
|
91
|
+
if let state = get() { onChanged?(state) }
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
/// Sets the timer to stop playback when the current track ends.
|
|
@@ -96,16 +96,14 @@ class SleepTimerManager {
|
|
|
96
96
|
assertMainThread()
|
|
97
97
|
let changed = !willSleepWhenCurrentItemReachesEnd
|
|
98
98
|
willSleepWhenCurrentItemReachesEnd = true
|
|
99
|
-
if changed {
|
|
100
|
-
onChanged?(get())
|
|
101
|
-
}
|
|
99
|
+
if changed, let state = get() { onChanged?(state) }
|
|
102
100
|
}
|
|
103
101
|
|
|
104
102
|
/// Called when the current track changes. Resets end-of-track timer.
|
|
105
103
|
func onTrackChanged() {
|
|
106
104
|
if willSleepWhenCurrentItemReachesEnd {
|
|
107
105
|
willSleepWhenCurrentItemReachesEnd = false
|
|
108
|
-
onChanged?(
|
|
106
|
+
onChanged?(.first(NullType.null))
|
|
109
107
|
}
|
|
110
108
|
}
|
|
111
109
|
|
|
@@ -127,7 +125,7 @@ class SleepTimerManager {
|
|
|
127
125
|
private func complete() {
|
|
128
126
|
sleepTimerTime = -1
|
|
129
127
|
willSleepWhenCurrentItemReachesEnd = false
|
|
130
|
-
onChanged?(
|
|
128
|
+
onChanged?(.first(NullType.null))
|
|
131
129
|
onComplete?()
|
|
132
130
|
}
|
|
133
131
|
|