@5stones/react-native-audio-browser 0.1.6 → 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 +15 -9
- 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 +39 -17
- 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/main/java/com/audiobrowser/player/TransformingDataSource.kt +33 -11
- package/android/src/test/java/com/audiobrowser/browser/SimpleRouterTest.kt +104 -95
- package/ios/Browser/BrowserConfig.swift +31 -5
- package/ios/Browser/BrowserManager.swift +98 -23
- package/ios/Browser/JsonModels.swift +37 -0
- package/ios/CarPlay/CarPlayController.swift +256 -88
- 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 +126 -35
- 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 +71 -53
- 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/web/NativeAudioBrowser.js +32 -7
- 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/web/NativeAudioBrowser.js +32 -7
- 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/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 +7 -0
- 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 -55
- 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 -206
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.hpp +20 -22
- 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++/JTrackLoadEvent.hpp +96 -0
- 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_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.kt +80 -0
- 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 -19
- 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/TrackLoadEvent.kt +44 -0
- 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 -6
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +239 -102
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +10 -1
- 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 -1
- 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 -4
- package/nitrogen/generated/ios/swift/HybridAudioBrowserSpec_cxx.swift +56 -7
- 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 -1
- package/nitrogen/generated/shared/c++/HybridAudioBrowserSpec.hpp +1 -1
- 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++/TrackLoadEvent.hpp +93 -0
- 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/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 +33 -9
- package/src/web/SimpleRouter.test.ts +160 -0
- package/src/web/SimpleRouter.ts +10 -8
|
@@ -7,150 +7,159 @@ class SimpleRouterTest {
|
|
|
7
7
|
|
|
8
8
|
private val router = SimpleRouter()
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
fun `exact match works`() {
|
|
12
|
-
val routes = mapOf("/artists" to "config1")
|
|
13
|
-
val result = router.findBestMatch("/artists", routes)
|
|
10
|
+
// -- exact matches --
|
|
14
11
|
|
|
12
|
+
@Test
|
|
13
|
+
fun `matches a simple path`() {
|
|
14
|
+
val result = router.findBestMatch("/artists", mapOf("/artists" to true))
|
|
15
15
|
assertNotNull(result)
|
|
16
16
|
assertEquals("/artists", result!!.first)
|
|
17
17
|
assertTrue(result.second.params.isEmpty())
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
@Test
|
|
21
|
-
fun `
|
|
22
|
-
val
|
|
23
|
-
val result = router.findBestMatch("/artists/123", routes)
|
|
24
|
-
|
|
21
|
+
fun `matches multi-segment paths`() {
|
|
22
|
+
val result = router.findBestMatch("/artists/top/rated", mapOf("/artists/top/rated" to true))
|
|
25
23
|
assertNotNull(result)
|
|
26
|
-
assertEquals("/artists/
|
|
27
|
-
assertEquals("123", result.second.params["id"])
|
|
24
|
+
assertEquals("/artists/top/rated", result!!.first)
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
@Test
|
|
31
|
-
fun `
|
|
32
|
-
|
|
33
|
-
val result = router.findBestMatch("/artists/123/albums/456", routes)
|
|
34
|
-
|
|
35
|
-
assertNotNull(result)
|
|
36
|
-
assertEquals("123", result!!.second.params["artistId"])
|
|
37
|
-
assertEquals("456", result.second.params["albumId"])
|
|
28
|
+
fun `returns null when no route matches`() {
|
|
29
|
+
assertNull(router.findBestMatch("/unknown", mapOf("/artists" to true)))
|
|
38
30
|
}
|
|
39
31
|
|
|
40
32
|
@Test
|
|
41
|
-
fun `
|
|
42
|
-
|
|
43
|
-
val result = router.findBestMatch("/artists/popular", routes)
|
|
44
|
-
|
|
45
|
-
assertEquals("/artists/popular", result!!.first)
|
|
33
|
+
fun `returns null when segment count differs`() {
|
|
34
|
+
assertNull(router.findBestMatch("/artists/123", mapOf("/artists" to true)))
|
|
46
35
|
}
|
|
47
36
|
|
|
48
37
|
@Test
|
|
49
|
-
fun `
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
val result1 = router.findBestMatch("/artists", routes)
|
|
53
|
-
assertEquals("/artists", result1!!.first)
|
|
54
|
-
|
|
55
|
-
val result2 = router.findBestMatch("/artists/premium", routes)
|
|
56
|
-
assertEquals("/artists/premium", result2!!.first)
|
|
38
|
+
fun `returns null when routes are empty`() {
|
|
39
|
+
assertNull(router.findBestMatch("/artists", emptyMap<String, Boolean>()))
|
|
57
40
|
}
|
|
58
41
|
|
|
59
42
|
@Test
|
|
60
|
-
fun `
|
|
61
|
-
val
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
assertNull(result)
|
|
43
|
+
fun `treats trailing slashes the same as without`() {
|
|
44
|
+
val result = router.findBestMatch("/artists/", mapOf("/artists" to true))
|
|
45
|
+
assertNotNull(result)
|
|
46
|
+
assertEquals("/artists", result!!.first)
|
|
65
47
|
}
|
|
66
48
|
|
|
67
|
-
|
|
68
|
-
fun `different segment count returns null`() {
|
|
69
|
-
val routes = mapOf("/artists/{id}" to "config1")
|
|
70
|
-
val result = router.findBestMatch("/artists/123/extra", routes)
|
|
49
|
+
// -- parameter extraction --
|
|
71
50
|
|
|
72
|
-
|
|
51
|
+
@Test
|
|
52
|
+
fun `extracts a single parameter`() {
|
|
53
|
+
val result = router.findBestMatch("/artists/123", mapOf("/artists/{id}" to true))
|
|
54
|
+
assertNotNull(result)
|
|
55
|
+
assertEquals(mapOf("id" to "123"), result!!.second.params)
|
|
73
56
|
}
|
|
74
57
|
|
|
75
58
|
@Test
|
|
76
|
-
fun `
|
|
77
|
-
val
|
|
78
|
-
|
|
79
|
-
|
|
59
|
+
fun `extracts multiple parameters`() {
|
|
60
|
+
val result =
|
|
61
|
+
router.findBestMatch(
|
|
62
|
+
"/artists/123/albums/456",
|
|
63
|
+
mapOf("/artists/{artistId}/albums/{albumId}" to true),
|
|
64
|
+
)
|
|
80
65
|
assertNotNull(result)
|
|
81
|
-
assertEquals("
|
|
82
|
-
assertTrue(result.second.params.isEmpty()) // Wildcards don't capture
|
|
66
|
+
assertEquals(mapOf("artistId" to "123", "albumId" to "456"), result!!.second.params)
|
|
83
67
|
}
|
|
84
68
|
|
|
69
|
+
// -- single wildcard --
|
|
70
|
+
|
|
85
71
|
@Test
|
|
86
|
-
fun `
|
|
87
|
-
|
|
72
|
+
fun `matches any single segment`() {
|
|
73
|
+
assertNotNull(router.findBestMatch("/artists/anything", mapOf("/artists/*" to true)))
|
|
74
|
+
}
|
|
88
75
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
76
|
+
@Test
|
|
77
|
+
fun `does not extract wildcard value into params`() {
|
|
78
|
+
val result = router.findBestMatch("/artists/anything", mapOf("/artists/*" to true))
|
|
79
|
+
assertTrue(result!!.second.params.isEmpty())
|
|
80
|
+
}
|
|
92
81
|
|
|
93
|
-
|
|
94
|
-
assertNotNull(result2)
|
|
95
|
-
assertEquals("images/2023/vacation.jpg", result2!!.second.params["tail"])
|
|
82
|
+
// -- tail wildcard --
|
|
96
83
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
84
|
+
@Test
|
|
85
|
+
fun `matches with no remaining segments and has no tail param`() {
|
|
86
|
+
val result = router.findBestMatch("/files", mapOf("/files/**" to true))
|
|
87
|
+
assertNotNull(result)
|
|
88
|
+
assertTrue(result!!.second.params.isEmpty())
|
|
101
89
|
}
|
|
102
90
|
|
|
103
91
|
@Test
|
|
104
|
-
fun `
|
|
105
|
-
val
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
"/artists/popular" to "constant",
|
|
110
|
-
)
|
|
92
|
+
fun `matches with remaining segments and captures tail`() {
|
|
93
|
+
val result = router.findBestMatch("/files/a/b/c", mapOf("/files/**" to true))
|
|
94
|
+
assertNotNull(result)
|
|
95
|
+
assertEquals(mapOf("tail" to "a/b/c"), result!!.second.params)
|
|
96
|
+
}
|
|
111
97
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
98
|
+
@Test
|
|
99
|
+
fun `matches with a single remaining segment`() {
|
|
100
|
+
val result = router.findBestMatch("/files/readme.txt", mapOf("/files/**" to true))
|
|
101
|
+
assertNotNull(result)
|
|
102
|
+
assertEquals(mapOf("tail" to "readme.txt"), result!!.second.params)
|
|
103
|
+
}
|
|
115
104
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
assertEquals("123", result2.second.params["id"])
|
|
105
|
+
@Test
|
|
106
|
+
fun `returns null when prefix segments do not match`() {
|
|
107
|
+
assertNull(router.findBestMatch("/other/a/b", mapOf("/files/**" to true)))
|
|
120
108
|
}
|
|
121
109
|
|
|
122
110
|
@Test
|
|
123
|
-
fun `tail wildcard
|
|
124
|
-
val
|
|
125
|
-
|
|
111
|
+
fun `works with parameters before tail wildcard`() {
|
|
112
|
+
val result =
|
|
113
|
+
router.findBestMatch("/api/v1/users/list", mapOf("/api/{version}/**" to true))
|
|
114
|
+
assertNotNull(result)
|
|
115
|
+
assertEquals(mapOf("version" to "v1", "tail" to "users/list"), result!!.second.params)
|
|
116
|
+
}
|
|
126
117
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
118
|
+
@Test
|
|
119
|
+
fun `matches any path with bare tail wildcard pattern`() {
|
|
120
|
+
val result = router.findBestMatch("/any/path/here", mapOf("/**" to true))
|
|
121
|
+
assertNotNull(result)
|
|
122
|
+
assertEquals(mapOf("tail" to "any/path/here"), result!!.second.params)
|
|
123
|
+
}
|
|
130
124
|
|
|
131
|
-
|
|
132
|
-
assertEquals("/api/users/{id}", result2!!.first)
|
|
125
|
+
// -- specificity --
|
|
133
126
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
127
|
+
@Test
|
|
128
|
+
fun `prefers constant segments over parameters`() {
|
|
129
|
+
val routes = mapOf("/artists/{id}" to true, "/artists/top" to true)
|
|
130
|
+
val result = router.findBestMatch("/artists/top", routes)
|
|
131
|
+
assertEquals("/artists/top", result!!.first)
|
|
138
132
|
}
|
|
139
133
|
|
|
140
134
|
@Test
|
|
141
|
-
fun `
|
|
142
|
-
val routes =
|
|
143
|
-
|
|
135
|
+
fun `prefers parameters over wildcards`() {
|
|
136
|
+
val routes = mapOf("/artists/*" to true, "/artists/{id}" to true)
|
|
137
|
+
val result = router.findBestMatch("/artists/123", routes)
|
|
138
|
+
assertEquals("/artists/{id}", result!!.first)
|
|
139
|
+
}
|
|
144
140
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
141
|
+
@Test
|
|
142
|
+
fun `prefers exact match over tail wildcard`() {
|
|
143
|
+
val routes = mapOf("/api/**" to true, "/api/{version}" to true)
|
|
144
|
+
val result = router.findBestMatch("/api/v1", routes)
|
|
145
|
+
assertEquals("/api/{version}", result!!.first)
|
|
146
|
+
}
|
|
148
147
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
148
|
+
@Test
|
|
149
|
+
fun `computes correct specificity for tail wildcard patterns`() {
|
|
150
|
+
// Regression test for issue #27: specificity must account for
|
|
151
|
+
// segment types before the ** wildcard.
|
|
152
|
+
val result = router.findBestMatch("/api/v1/users", mapOf("/api/v1/**" to true))
|
|
153
|
+
// constant "api" (1000) + constant "v1" (1000) + tail(1) + 3 segments = 2004
|
|
154
|
+
assertEquals(2004, result!!.second.specificity)
|
|
155
|
+
}
|
|
152
156
|
|
|
153
|
-
|
|
154
|
-
|
|
157
|
+
@Test
|
|
158
|
+
fun `prefers constant prefix over parameter prefix in tail wildcards`() {
|
|
159
|
+
// Second part of issue #27: with correct specificity, the constant
|
|
160
|
+
// prefix should beat the parameter prefix.
|
|
161
|
+
val routes = mapOf("/api/{version}/**" to true, "/api/v1/**" to true)
|
|
162
|
+
val result = router.findBestMatch("/api/v1/users", routes)
|
|
163
|
+
assertEquals("/api/v1/**", result!!.first)
|
|
155
164
|
}
|
|
156
165
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import NitroModules
|
|
3
|
+
import os.log
|
|
3
4
|
|
|
4
5
|
/// Flattened browser configuration (matches Kotlin BrowserConfig).
|
|
5
6
|
///
|
|
@@ -33,6 +34,9 @@ struct BrowserConfig {
|
|
|
33
34
|
/// Custom buttons for CarPlay Now Playing screen (e.g., .repeat, .favorite)
|
|
34
35
|
let carPlayNowPlayingButtons: [CarPlayNowPlayingButton]
|
|
35
36
|
|
|
37
|
+
/// Custom handler for track load events (overrides default load behavior)
|
|
38
|
+
let handleTrackLoad: ((_ event: TrackLoadEvent) -> Promise<Promise<Void>>)?
|
|
39
|
+
|
|
36
40
|
/// Callback to customize navigation error display (for i18n)
|
|
37
41
|
/// Used by CarPlay and available via `useFormattedNavigationError()` for app UI.
|
|
38
42
|
let formatNavigationError: ((_ params: FormatNavigationErrorParams) -> Promise<FormattedNavigationError?>)?
|
|
@@ -43,6 +47,7 @@ struct BrowserConfig {
|
|
|
43
47
|
artwork: ArtworkRequestConfig? = nil,
|
|
44
48
|
routes: [NativeRouteEntry]? = nil,
|
|
45
49
|
singleTrack: Bool = false,
|
|
50
|
+
handleTrackLoad: ((_ event: TrackLoadEvent) -> Promise<Promise<Void>>)? = nil,
|
|
46
51
|
androidControllerOfflineError: Bool = true,
|
|
47
52
|
carPlayUpNextButton: Bool = true,
|
|
48
53
|
carPlayNowPlayingButtons: [CarPlayNowPlayingButton] = [],
|
|
@@ -53,6 +58,7 @@ struct BrowserConfig {
|
|
|
53
58
|
self.artwork = artwork
|
|
54
59
|
self.routes = routes
|
|
55
60
|
self.singleTrack = singleTrack
|
|
61
|
+
self.handleTrackLoad = handleTrackLoad
|
|
56
62
|
self.androidControllerOfflineError = androidControllerOfflineError
|
|
57
63
|
self.carPlayUpNextButton = carPlayUpNextButton
|
|
58
64
|
self.carPlayNowPlayingButtons = carPlayNowPlayingButtons
|
|
@@ -66,17 +72,37 @@ struct BrowserConfig {
|
|
|
66
72
|
artwork = config.artwork
|
|
67
73
|
routes = config.routes
|
|
68
74
|
singleTrack = config.singleTrack ?? false
|
|
75
|
+
handleTrackLoad = config.handleTrackLoad
|
|
69
76
|
androidControllerOfflineError = config.androidControllerOfflineError ?? true
|
|
70
77
|
carPlayUpNextButton = config.carPlayUpNextButton ?? true
|
|
71
78
|
carPlayNowPlayingButtons = config.carPlayNowPlayingButtons ?? []
|
|
72
79
|
formatNavigationError = config.formatNavigationError
|
|
73
80
|
}
|
|
74
81
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
// MARK: - Track Load Handler
|
|
83
|
+
|
|
84
|
+
private static let logger = Logger(subsystem: "com.audiobrowser", category: "BrowserConfig")
|
|
85
|
+
|
|
86
|
+
/// Awaits the handleTrackLoad callback using the double-Promise pattern required by Nitro.
|
|
87
|
+
///
|
|
88
|
+
/// Nitro wraps value-returning JS callbacks in Promise<T> for thread safety, so a JS callback
|
|
89
|
+
/// returning Promise<void> becomes Promise<Promise<Void>> on the native side. Both layers
|
|
90
|
+
/// must be awaited to properly wait for the JS work to complete.
|
|
91
|
+
///
|
|
92
|
+
/// - Returns: true if the handler was present and invoked, false if not configured
|
|
93
|
+
func awaitTrackLoadHandler(event: TrackLoadEvent) async -> Bool {
|
|
94
|
+
guard let handler = handleTrackLoad else { return false }
|
|
95
|
+
do {
|
|
96
|
+
// MainActor: Nitro bridge call must be on main thread (C++ noexcept)
|
|
97
|
+
nonisolated(unsafe) let _handler = handler
|
|
98
|
+
nonisolated(unsafe) let _event = event
|
|
99
|
+
let outerPromise = await MainActor.run { _handler(_event) }
|
|
100
|
+
let innerPromise = try await outerPromise.await()
|
|
101
|
+
try await innerPromise.await()
|
|
102
|
+
} catch {
|
|
103
|
+
Self.logger.error("handleTrackLoad failed: \(error.localizedDescription)")
|
|
104
|
+
}
|
|
105
|
+
return true
|
|
80
106
|
}
|
|
81
107
|
}
|
|
82
108
|
|
|
@@ -183,6 +183,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
183
183
|
favorited: isFavorited,
|
|
184
184
|
groupTitle: track.groupTitle,
|
|
185
185
|
live: track.live,
|
|
186
|
+
imageRow: track.imageRow,
|
|
186
187
|
)
|
|
187
188
|
}
|
|
188
189
|
|
|
@@ -193,6 +194,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
193
194
|
return ResolvedTrack(
|
|
194
195
|
url: resolvedTrack.url,
|
|
195
196
|
children: hydratedChildren,
|
|
197
|
+
carPlaySiriListButton: resolvedTrack.carPlaySiriListButton,
|
|
196
198
|
src: resolvedTrack.src,
|
|
197
199
|
artwork: resolvedTrack.artwork,
|
|
198
200
|
artworkSource: resolvedTrack.artworkSource,
|
|
@@ -209,6 +211,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
209
211
|
favorited: resolvedTrack.favorited,
|
|
210
212
|
groupTitle: resolvedTrack.groupTitle,
|
|
211
213
|
live: resolvedTrack.live,
|
|
214
|
+
imageRow: resolvedTrack.imageRow,
|
|
212
215
|
)
|
|
213
216
|
}
|
|
214
217
|
|
|
@@ -336,6 +339,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
336
339
|
return ResolvedTrack(
|
|
337
340
|
url: resolvedTrack.url,
|
|
338
341
|
children: transformedChildren,
|
|
342
|
+
carPlaySiriListButton: resolvedTrack.carPlaySiriListButton,
|
|
339
343
|
src: resolvedTrack.src,
|
|
340
344
|
artwork: resolvedTrack.artwork,
|
|
341
345
|
artworkSource: resolvedTrack.artworkSource,
|
|
@@ -352,6 +356,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
352
356
|
favorited: resolvedTrack.favorited,
|
|
353
357
|
groupTitle: resolvedTrack.groupTitle,
|
|
354
358
|
live: resolvedTrack.live,
|
|
359
|
+
imageRow: resolvedTrack.imageRow,
|
|
355
360
|
)
|
|
356
361
|
}
|
|
357
362
|
|
|
@@ -393,7 +398,8 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
393
398
|
if let callback = entry.browseCallback {
|
|
394
399
|
let callbackParam = BrowserSourceCallbackParam(path: path, routeParams: params)
|
|
395
400
|
// Callback returns Promise<Promise<BrowseResult>> - await both layers
|
|
396
|
-
|
|
401
|
+
// MainActor: Nitro bridge call must be on main thread (C++ noexcept)
|
|
402
|
+
let outerPromise = await MainActor.run { callback(callbackParam) }
|
|
397
403
|
let innerPromise = try await outerPromise.await()
|
|
398
404
|
let result = try await innerPromise.await()
|
|
399
405
|
|
|
@@ -526,6 +532,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
526
532
|
favorited: track.favorited,
|
|
527
533
|
groupTitle: track.groupTitle,
|
|
528
534
|
live: track.live,
|
|
535
|
+
imageRow: track.imageRow,
|
|
529
536
|
)
|
|
530
537
|
}
|
|
531
538
|
|
|
@@ -553,6 +560,63 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
553
560
|
favorited: transformedTrack.favorited,
|
|
554
561
|
groupTitle: transformedTrack.groupTitle,
|
|
555
562
|
live: transformedTrack.live,
|
|
563
|
+
imageRow: transformedTrack.imageRow,
|
|
564
|
+
)
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Also resolve artwork for image row items
|
|
568
|
+
if let imageRowItems = transformedTrack.imageRow {
|
|
569
|
+
let artworkConfig = routeEntry.artwork ?? config.artwork
|
|
570
|
+
var resolvedItems: [ImageRowItem] = []
|
|
571
|
+
for item in imageRowItems {
|
|
572
|
+
// Create a minimal Track to pass to the artwork resolver
|
|
573
|
+
let itemTrack = Track(
|
|
574
|
+
url: item.url,
|
|
575
|
+
src: nil,
|
|
576
|
+
artwork: item.artwork,
|
|
577
|
+
artworkSource: nil,
|
|
578
|
+
artworkCarPlayTinted: nil,
|
|
579
|
+
title: item.title,
|
|
580
|
+
subtitle: nil,
|
|
581
|
+
artist: nil,
|
|
582
|
+
album: nil,
|
|
583
|
+
description: nil,
|
|
584
|
+
genre: nil,
|
|
585
|
+
duration: nil,
|
|
586
|
+
style: nil,
|
|
587
|
+
childrenStyle: nil,
|
|
588
|
+
favorited: nil,
|
|
589
|
+
groupTitle: nil,
|
|
590
|
+
live: nil,
|
|
591
|
+
imageRow: nil,
|
|
592
|
+
)
|
|
593
|
+
let itemImageSource = await resolver(itemTrack, artworkConfig, browseContext)
|
|
594
|
+
resolvedItems.append(ImageRowItem(
|
|
595
|
+
url: item.url,
|
|
596
|
+
artwork: item.artwork,
|
|
597
|
+
artworkSource: itemImageSource,
|
|
598
|
+
title: item.title,
|
|
599
|
+
))
|
|
600
|
+
}
|
|
601
|
+
transformedTrack = Track(
|
|
602
|
+
url: transformedTrack.url,
|
|
603
|
+
src: transformedTrack.src,
|
|
604
|
+
artwork: transformedTrack.artwork,
|
|
605
|
+
artworkSource: transformedTrack.artworkSource,
|
|
606
|
+
artworkCarPlayTinted: transformedTrack.artworkCarPlayTinted,
|
|
607
|
+
title: transformedTrack.title,
|
|
608
|
+
subtitle: transformedTrack.subtitle,
|
|
609
|
+
artist: transformedTrack.artist,
|
|
610
|
+
album: transformedTrack.album,
|
|
611
|
+
description: transformedTrack.description,
|
|
612
|
+
genre: transformedTrack.genre,
|
|
613
|
+
duration: transformedTrack.duration,
|
|
614
|
+
style: transformedTrack.style,
|
|
615
|
+
childrenStyle: transformedTrack.childrenStyle,
|
|
616
|
+
favorited: transformedTrack.favorited,
|
|
617
|
+
groupTitle: transformedTrack.groupTitle,
|
|
618
|
+
live: transformedTrack.live,
|
|
619
|
+
imageRow: resolvedItems,
|
|
556
620
|
)
|
|
557
621
|
}
|
|
558
622
|
}
|
|
@@ -573,6 +637,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
573
637
|
return ResolvedTrack(
|
|
574
638
|
url: BrowserPathHelper.createSearchPath(query),
|
|
575
639
|
children: hydratedResults,
|
|
640
|
+
carPlaySiriListButton: nil,
|
|
576
641
|
src: nil,
|
|
577
642
|
artwork: nil,
|
|
578
643
|
artworkSource: nil,
|
|
@@ -589,6 +654,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
589
654
|
favorited: nil,
|
|
590
655
|
groupTitle: nil,
|
|
591
656
|
live: nil,
|
|
657
|
+
imageRow: nil,
|
|
592
658
|
)
|
|
593
659
|
}
|
|
594
660
|
|
|
@@ -614,7 +680,8 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
614
680
|
|
|
615
681
|
if let callback = searchEntry.searchCallback {
|
|
616
682
|
// Callback returns Promise<Promise<[Track]>> - await both layers
|
|
617
|
-
|
|
683
|
+
// MainActor: Nitro bridge call must be on main thread (C++ noexcept)
|
|
684
|
+
let outerPromise = await MainActor.run { callback(searchParams) }
|
|
618
685
|
let innerPromise = try await outerPromise.await()
|
|
619
686
|
results = try await innerPromise.await()
|
|
620
687
|
} else if let searchConfig = searchEntry.searchConfig {
|
|
@@ -637,6 +704,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
637
704
|
return ResolvedTrack(
|
|
638
705
|
url: BrowserPathHelper.createSearchPath(query),
|
|
639
706
|
children: hydratedResults,
|
|
707
|
+
carPlaySiriListButton: nil,
|
|
640
708
|
src: nil,
|
|
641
709
|
artwork: nil,
|
|
642
710
|
artworkSource: nil,
|
|
@@ -653,6 +721,7 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
653
721
|
favorited: nil,
|
|
654
722
|
groupTitle: nil,
|
|
655
723
|
live: nil,
|
|
724
|
+
imageRow: nil,
|
|
656
725
|
)
|
|
657
726
|
}
|
|
658
727
|
|
|
@@ -743,27 +812,17 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
743
812
|
)
|
|
744
813
|
|
|
745
814
|
logger.debug("resolveMediaUrl: calling transform callback...")
|
|
746
|
-
//
|
|
747
|
-
//
|
|
748
|
-
//
|
|
749
|
-
|
|
815
|
+
// Dispatch the Nitro bridge call to MainActor to avoid C++ noexcept crashes.
|
|
816
|
+
// The generated C++ call() wrapper is noexcept, so any exception from JSI
|
|
817
|
+
// causes std::terminate. Calling from the main thread is safer for JS callbacks.
|
|
818
|
+
// Only the initial call is dispatched; awaiting happens on the background thread.
|
|
819
|
+
let outerPromise = await MainActor.run {
|
|
820
|
+
transform(baseRequest, nil)
|
|
821
|
+
}
|
|
822
|
+
logger.debug("resolveMediaUrl: awaiting outer promise...")
|
|
750
823
|
let innerPromise = try await outerPromise.await()
|
|
751
824
|
logger.debug("resolveMediaUrl: awaiting inner promise...")
|
|
752
|
-
let transformedConfig = try await
|
|
753
|
-
group.addTask { [innerPromise] in
|
|
754
|
-
return try await innerPromise.await()
|
|
755
|
-
}
|
|
756
|
-
group.addTask {
|
|
757
|
-
// Safety-net timeout: if the JS transform Promise doesn't resolve
|
|
758
|
-
// within 10s, bail out. This guards against Nitro bridge hangs when
|
|
759
|
-
// concurrent callbacks race.
|
|
760
|
-
try await Task.sleep(nanoseconds: 10_000_000_000)
|
|
761
|
-
throw CancellationError()
|
|
762
|
-
}
|
|
763
|
-
let result = try await group.next()!
|
|
764
|
-
group.cancelAll()
|
|
765
|
-
return result
|
|
766
|
-
}
|
|
825
|
+
let transformedConfig = try await innerPromise.await()
|
|
767
826
|
logger.debug("resolveMediaUrl: transform complete")
|
|
768
827
|
|
|
769
828
|
// Extract values immediately to Swift native types to avoid
|
|
@@ -834,6 +893,18 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
834
893
|
/// - imageContext: Optional size context for CDN URL generation (nil at browse-time)
|
|
835
894
|
/// - Returns: ImageSource ready for image loading, or nil if no artwork
|
|
836
895
|
func resolveArtworkUrl(track: Track, perRouteConfig: ArtworkRequestConfig?, imageContext: ImageContext? = nil) async -> ImageSource? {
|
|
896
|
+
if let artwork = track.artwork, SFSymbolRenderer.isSFSymbol(artwork) {
|
|
897
|
+
let canvasSize: CGSize = if let w = imageContext?.width, let h = imageContext?.height {
|
|
898
|
+
CGSize(width: w, height: h)
|
|
899
|
+
} else {
|
|
900
|
+
SFSymbolRenderer.defaultCanvasSize
|
|
901
|
+
}
|
|
902
|
+
if let uri = await SFSymbolRenderer.shared.render(artwork, canvasSize: canvasSize) {
|
|
903
|
+
return ImageSource(uri: uri, method: nil, headers: nil, body: nil)
|
|
904
|
+
}
|
|
905
|
+
return nil
|
|
906
|
+
}
|
|
907
|
+
|
|
837
908
|
// Determine effective artwork config: per-route overrides global
|
|
838
909
|
let effectiveArtworkConfig = perRouteConfig ?? config.artwork
|
|
839
910
|
|
|
@@ -863,7 +934,8 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
863
934
|
|
|
864
935
|
// If there's a resolve callback, call it for per-track config
|
|
865
936
|
if let resolve = artworkConfig.resolve {
|
|
866
|
-
|
|
937
|
+
// MainActor: Nitro bridge call must be on main thread (C++ noexcept)
|
|
938
|
+
let outerPromise = await MainActor.run { resolve(track) }
|
|
867
939
|
let innerPromise = try await outerPromise.await()
|
|
868
940
|
let resolvedConfig = try await innerPromise.await()
|
|
869
941
|
|
|
@@ -919,7 +991,10 @@ final class BrowserManager: @unchecked Sendable {
|
|
|
919
991
|
// Transform will be called at load-time when actual display size is known
|
|
920
992
|
let hasSize = imageContext?.width != nil || imageContext?.height != nil
|
|
921
993
|
if let transform = artworkConfig.transform, hasSize {
|
|
922
|
-
|
|
994
|
+
// MainActor: Nitro bridge call must be on main thread (C++ noexcept)
|
|
995
|
+
let outerPromise = await MainActor.run {
|
|
996
|
+
transform(MediaTransformParams(request: mergedConfig, context: imageContext))
|
|
997
|
+
}
|
|
923
998
|
let innerPromise = try await outerPromise.await()
|
|
924
999
|
let transformedConfig = try await innerPromise.await()
|
|
925
1000
|
|