@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
package/AudioBrowser.podspec
CHANGED
|
@@ -26,6 +26,8 @@ Pod::Spec.new do |s|
|
|
|
26
26
|
"cpp/**/*.{hpp,cpp}",
|
|
27
27
|
]
|
|
28
28
|
|
|
29
|
+
s.exclude_files = ["ios/Tests/**/*"]
|
|
30
|
+
|
|
29
31
|
# Public headers for CarPlay scene delegate
|
|
30
32
|
s.public_header_files = ["ios/CarPlay/*.h"]
|
|
31
33
|
|
|
@@ -39,5 +41,5 @@ Pod::Spec.new do |s|
|
|
|
39
41
|
install_modules_dependencies(s)
|
|
40
42
|
|
|
41
43
|
# CarPlay framework for CarPlay support
|
|
42
|
-
s.frameworks = 'CarPlay'
|
|
44
|
+
s.frameworks = 'CarPlay', 'Intents'
|
|
43
45
|
end
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#include <jni.h>
|
|
2
|
+
#include <fbjni/fbjni.h>
|
|
2
3
|
#include "AudioBrowserOnLoad.hpp"
|
|
3
4
|
|
|
4
5
|
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
|
5
|
-
return
|
|
6
|
+
return facebook::jni::initialize(vm, []() {
|
|
7
|
+
margelo::nitro::audiobrowser::registerAllNatives();
|
|
8
|
+
});
|
|
6
9
|
}
|
|
@@ -15,6 +15,7 @@ import androidx.media3.session.MediaBrowser
|
|
|
15
15
|
import androidx.media3.session.SessionToken
|
|
16
16
|
import com.audiobrowser.browser.BrowserConfig
|
|
17
17
|
import com.audiobrowser.browser.BrowserManager
|
|
18
|
+
import com.audiobrowser.browser.handleTrackLoad
|
|
18
19
|
import com.audiobrowser.browser.CallbackException
|
|
19
20
|
import com.audiobrowser.browser.ContentNotFoundException
|
|
20
21
|
import com.audiobrowser.browser.HttpStatusException
|
|
@@ -110,6 +111,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
110
111
|
artwork = null,
|
|
111
112
|
routes = null,
|
|
112
113
|
singleTrack = null,
|
|
114
|
+
handleTrackLoad = null,
|
|
113
115
|
androidControllerOfflineError = null,
|
|
114
116
|
carPlayUpNextButton = null,
|
|
115
117
|
carPlayNowPlayingButtons = null,
|
|
@@ -527,8 +529,10 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
527
529
|
val index = player.tracks.indexOfFirst { it.src == trackId }
|
|
528
530
|
if (index >= 0) {
|
|
529
531
|
Timber.d("Queue already from $parentPath, skipping to index $index")
|
|
530
|
-
player.
|
|
531
|
-
|
|
532
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, player.tracks, index.toDouble(), intercepted = {}, defaultBehavior = {
|
|
533
|
+
player.skipTo(index)
|
|
534
|
+
player.play()
|
|
535
|
+
})
|
|
532
536
|
return@launch
|
|
533
537
|
}
|
|
534
538
|
}
|
|
@@ -541,15 +545,17 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
541
545
|
Timber.d(
|
|
542
546
|
"Loading expanded queue: ${tracks.size} tracks, starting at index $startIndex"
|
|
543
547
|
)
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
548
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, tracks, startIndex.toDouble(), intercepted = {}, defaultBehavior = {
|
|
549
|
+
// Replace queue and seek to selected track
|
|
550
|
+
// Use internal player methods directly to avoid blocking on main thread
|
|
551
|
+
player.setQueue(tracks, startIndex, sourcePath = parentPath)
|
|
552
|
+
player.play()
|
|
553
|
+
})
|
|
554
|
+
return@launch
|
|
549
555
|
} else {
|
|
550
556
|
// Fallback: just load the single track
|
|
551
557
|
Timber.w("Queue expansion failed, loading single track")
|
|
552
|
-
player.load(track)
|
|
558
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
|
|
553
559
|
}
|
|
554
560
|
}
|
|
555
561
|
// Navigate to browsable track to show browsing UI
|
|
@@ -560,7 +566,7 @@ class AudioBrowser : HybridAudioBrowserSpec(), ServiceConnection {
|
|
|
560
566
|
// If track is playable (has src), load it into player
|
|
561
567
|
track.src != null -> {
|
|
562
568
|
Timber.d("Loading playable track into player: ${track.title}")
|
|
563
|
-
player.load(track)
|
|
569
|
+
handleTrackLoad(_configuration.handleTrackLoad, track, arrayOf(track), 0.0, intercepted = {}, defaultBehavior = { player.load(track) })
|
|
564
570
|
}
|
|
565
571
|
else -> {
|
|
566
572
|
throw IllegalArgumentException("Track must have either an 'url' or an 'src' property")
|
|
@@ -28,7 +28,6 @@ import com.audiobrowser.util.CoilBitmapLoader
|
|
|
28
28
|
import com.margelo.nitro.audiobrowser.AppKilledPlaybackBehavior
|
|
29
29
|
import com.margelo.nitro.audiobrowser.SearchMode
|
|
30
30
|
import com.margelo.nitro.audiobrowser.SearchParams
|
|
31
|
-
import kotlin.system.exitProcess
|
|
32
31
|
import kotlinx.coroutines.MainScope
|
|
33
32
|
import kotlinx.coroutines.cancel
|
|
34
33
|
import kotlinx.coroutines.launch
|
|
@@ -268,7 +267,6 @@ class Service : MediaLibraryService(), MediaSessionService.Listener {
|
|
|
268
267
|
scope.cancel()
|
|
269
268
|
stopForeground(STOP_FOREGROUND_REMOVE)
|
|
270
269
|
stopSelf()
|
|
271
|
-
exitProcess(0)
|
|
272
270
|
} catch (e: Exception) {
|
|
273
271
|
Timber.e(e, "Error during aggressive cleanup in onTaskRemoved")
|
|
274
272
|
// Still try to stop the service
|
|
@@ -163,6 +163,7 @@ class BrowserManager {
|
|
|
163
163
|
favorited = true,
|
|
164
164
|
groupTitle = track.groupTitle,
|
|
165
165
|
live = track.live,
|
|
166
|
+
imageRow = track.imageRow,
|
|
166
167
|
)
|
|
167
168
|
}
|
|
168
169
|
|
|
@@ -743,6 +744,7 @@ class BrowserManager {
|
|
|
743
744
|
url = searchPath,
|
|
744
745
|
title = "Search: ${params.query}",
|
|
745
746
|
children = searchResults,
|
|
747
|
+
carPlaySiriListButton = null,
|
|
746
748
|
artwork = null,
|
|
747
749
|
artworkSource = null,
|
|
748
750
|
artworkCarPlayTinted = null,
|
|
@@ -758,6 +760,7 @@ class BrowserManager {
|
|
|
758
760
|
favorited = null,
|
|
759
761
|
groupTitle = null,
|
|
760
762
|
live = null,
|
|
763
|
+
imageRow = null,
|
|
761
764
|
)
|
|
762
765
|
|
|
763
766
|
// Cache search results for getCachedSearchResults()
|
|
@@ -780,6 +783,7 @@ class BrowserManager {
|
|
|
780
783
|
url = searchPath,
|
|
781
784
|
title = "Search: ${params.query}",
|
|
782
785
|
children = emptyArray(),
|
|
786
|
+
carPlaySiriListButton = null,
|
|
783
787
|
artwork = null,
|
|
784
788
|
artworkSource = null,
|
|
785
789
|
artworkCarPlayTinted = null,
|
|
@@ -795,6 +799,7 @@ class BrowserManager {
|
|
|
795
799
|
favorited = null,
|
|
796
800
|
groupTitle = null,
|
|
797
801
|
live = null,
|
|
802
|
+
imageRow = null,
|
|
798
803
|
)
|
|
799
804
|
|
|
800
805
|
return emptySearchResult
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
package com.audiobrowser.browser
|
|
2
2
|
|
|
3
|
+
import com.margelo.nitro.audiobrowser.CarPlaySiriListButtonPosition
|
|
4
|
+
import com.margelo.nitro.audiobrowser.ImageRowItem
|
|
3
5
|
import com.margelo.nitro.audiobrowser.ResolvedTrack
|
|
4
6
|
import com.margelo.nitro.audiobrowser.Track
|
|
5
7
|
import com.margelo.nitro.audiobrowser.TrackStyle
|
|
@@ -9,6 +11,13 @@ import kotlinx.serialization.Serializable
|
|
|
9
11
|
* JSON serializable models for parsing API responses. These will be converted to Nitro types after
|
|
10
12
|
* parsing.
|
|
11
13
|
*/
|
|
14
|
+
@Serializable
|
|
15
|
+
data class JsonImageRowItem(
|
|
16
|
+
val url: String? = null,
|
|
17
|
+
val artwork: String? = null,
|
|
18
|
+
val title: String,
|
|
19
|
+
)
|
|
20
|
+
|
|
12
21
|
@Serializable
|
|
13
22
|
data class JsonResolvedTrack(
|
|
14
23
|
val url: String,
|
|
@@ -27,6 +36,7 @@ data class JsonResolvedTrack(
|
|
|
27
36
|
val childrenStyle: String? = null,
|
|
28
37
|
val groupTitle: String? = null,
|
|
29
38
|
val live: Boolean? = null,
|
|
39
|
+
val carPlaySiriListButton: String? = null,
|
|
30
40
|
)
|
|
31
41
|
|
|
32
42
|
@Serializable
|
|
@@ -46,6 +56,7 @@ data class JsonTrack(
|
|
|
46
56
|
val childrenStyle: String? = null,
|
|
47
57
|
val groupTitle: String? = null,
|
|
48
58
|
val live: Boolean? = null,
|
|
59
|
+
val imageRow: List<JsonImageRowItem>? = null,
|
|
49
60
|
)
|
|
50
61
|
|
|
51
62
|
/** Convert JSON models to Nitro types */
|
|
@@ -57,10 +68,28 @@ private fun String?.toTrackStyle(): TrackStyle? {
|
|
|
57
68
|
}
|
|
58
69
|
}
|
|
59
70
|
|
|
71
|
+
private fun String?.toCarPlaySiriListButtonPosition(): CarPlaySiriListButtonPosition? {
|
|
72
|
+
return when (this?.lowercase()) {
|
|
73
|
+
"top" -> CarPlaySiriListButtonPosition.TOP
|
|
74
|
+
"bottom" -> CarPlaySiriListButtonPosition.BOTTOM
|
|
75
|
+
else -> null
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private fun JsonImageRowItem.toNitro(): ImageRowItem {
|
|
80
|
+
return ImageRowItem(
|
|
81
|
+
url = url,
|
|
82
|
+
artwork = artwork,
|
|
83
|
+
artworkSource = null,
|
|
84
|
+
title = title,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
60
88
|
fun JsonResolvedTrack.toNitro(): ResolvedTrack {
|
|
61
89
|
return ResolvedTrack(
|
|
62
90
|
url = url,
|
|
63
91
|
children = children?.map { it.toNitro() }?.toTypedArray(),
|
|
92
|
+
carPlaySiriListButton = carPlaySiriListButton.toCarPlaySiriListButtonPosition(),
|
|
64
93
|
title = title,
|
|
65
94
|
subtitle = subtitle,
|
|
66
95
|
artwork = artwork,
|
|
@@ -77,6 +106,7 @@ fun JsonResolvedTrack.toNitro(): ResolvedTrack {
|
|
|
77
106
|
favorited = null,
|
|
78
107
|
groupTitle = groupTitle,
|
|
79
108
|
live = live,
|
|
109
|
+
imageRow = null,
|
|
80
110
|
)
|
|
81
111
|
}
|
|
82
112
|
|
|
@@ -99,5 +129,6 @@ fun JsonTrack.toNitro(): Track {
|
|
|
99
129
|
favorited = null,
|
|
100
130
|
groupTitle = groupTitle,
|
|
101
131
|
live = live,
|
|
132
|
+
imageRow = imageRow?.map { it.toNitro() }?.toTypedArray(),
|
|
102
133
|
)
|
|
103
134
|
}
|
|
@@ -61,12 +61,16 @@ class SimpleRouter {
|
|
|
61
61
|
if (!matchSingleSegment(patternSegments[i], pathSegments[i], params)) {
|
|
62
62
|
return null
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
val (constCount, paramCount, wildcardCount) =
|
|
65
|
+
updateSegmentCounts(
|
|
66
|
+
patternSegments[i],
|
|
67
|
+
constantSegments,
|
|
68
|
+
parameterSegments,
|
|
69
|
+
wildcardSegments,
|
|
70
|
+
)
|
|
71
|
+
constantSegments = constCount
|
|
72
|
+
parameterSegments = paramCount
|
|
73
|
+
wildcardSegments = wildcardCount
|
|
70
74
|
}
|
|
71
75
|
|
|
72
76
|
// Capture remaining path segments as "tail" parameter
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
package com.audiobrowser.browser
|
|
2
|
+
|
|
3
|
+
import com.margelo.nitro.audiobrowser.TrackLoadEvent
|
|
4
|
+
import com.margelo.nitro.audiobrowser.Track
|
|
5
|
+
import com.margelo.nitro.core.Promise
|
|
6
|
+
import timber.log.Timber
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Handles track load interception using the double-Promise pattern required by Nitro.
|
|
10
|
+
*
|
|
11
|
+
* If the handler is present, awaits it and returns [intercepted]. Otherwise runs [default].
|
|
12
|
+
*
|
|
13
|
+
* Nitro wraps value-returning JS callbacks in Promise<T> for thread safety, so a JS callback
|
|
14
|
+
* returning Promise<void> becomes Promise<Promise<Unit>> on the native side. Both layers
|
|
15
|
+
* must be awaited to properly wait for the JS work to complete.
|
|
16
|
+
*
|
|
17
|
+
* @param handler The handleTrackLoad callback from NativeBrowserConfiguration, or null
|
|
18
|
+
* @param track The track being loaded
|
|
19
|
+
* @param queue The resolved queue of tracks
|
|
20
|
+
* @param startIndex The index of the track in the queue
|
|
21
|
+
* @param intercepted Value to return when the handler is present and invoked
|
|
22
|
+
* @param defaultBehavior Value to return when no handler is configured
|
|
23
|
+
* @return Result of [intercepted] if handler was invoked, result of [defaultBehavior] otherwise
|
|
24
|
+
*/
|
|
25
|
+
suspend fun <T> handleTrackLoad(
|
|
26
|
+
handler: ((event: TrackLoadEvent) -> Promise<Promise<Unit>>)?,
|
|
27
|
+
track: Track,
|
|
28
|
+
queue: Array<Track>,
|
|
29
|
+
startIndex: Double,
|
|
30
|
+
intercepted: () -> T,
|
|
31
|
+
defaultBehavior: suspend () -> T,
|
|
32
|
+
): T {
|
|
33
|
+
if (handler != null) {
|
|
34
|
+
val event = TrackLoadEvent(track, queue, startIndex)
|
|
35
|
+
try {
|
|
36
|
+
val outerPromise = handler(event)
|
|
37
|
+
val innerPromise = outerPromise.await()
|
|
38
|
+
innerPromise.await()
|
|
39
|
+
} catch (e: Exception) {
|
|
40
|
+
Timber.e(e, "handleTrackLoad failed")
|
|
41
|
+
}
|
|
42
|
+
return intercepted()
|
|
43
|
+
}
|
|
44
|
+
return defaultBehavior()
|
|
45
|
+
}
|
|
@@ -12,10 +12,13 @@ import androidx.media3.session.MediaConstants
|
|
|
12
12
|
import androidx.media3.session.SessionCommand
|
|
13
13
|
import androidx.media3.session.SessionError
|
|
14
14
|
import androidx.media3.session.SessionResult
|
|
15
|
+
import com.audiobrowser.AudioBrowser
|
|
16
|
+
import com.audiobrowser.browser.handleTrackLoad
|
|
15
17
|
import com.audiobrowser.util.BrowserPathHelper
|
|
16
18
|
import com.audiobrowser.util.RatingFactory
|
|
17
19
|
import com.audiobrowser.util.ResolvedTrackFactory
|
|
18
20
|
import com.audiobrowser.util.TrackFactory
|
|
21
|
+
import com.margelo.nitro.audiobrowser.Track
|
|
19
22
|
import com.google.common.collect.ImmutableList
|
|
20
23
|
import com.google.common.util.concurrent.Futures
|
|
21
24
|
import com.google.common.util.concurrent.ListenableFuture
|
|
@@ -463,6 +466,19 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
463
466
|
)
|
|
464
467
|
|
|
465
468
|
return scope.future {
|
|
469
|
+
val audioBrowser = player.awaitBrowser()
|
|
470
|
+
|
|
471
|
+
// Helper: returns the current player state unchanged so Media3 doesn't modify playback
|
|
472
|
+
fun currentPlayerState(): MediaSession.MediaItemsWithStartPosition {
|
|
473
|
+
val currentItems = player.tracks.map { TrackFactory.toMedia3(it) }
|
|
474
|
+
val currentIndex = player.currentIndex ?: 0
|
|
475
|
+
return MediaSession.MediaItemsWithStartPosition(
|
|
476
|
+
currentItems,
|
|
477
|
+
currentIndex,
|
|
478
|
+
startPositionMs,
|
|
479
|
+
)
|
|
480
|
+
}
|
|
481
|
+
|
|
466
482
|
// Check if this is a single contextual URL that matches the current queue source
|
|
467
483
|
if (mediaItems.size == 1) {
|
|
468
484
|
val mediaId = mediaItems[0].mediaId
|
|
@@ -475,33 +491,39 @@ class MediaSessionCallback(private val player: Player) :
|
|
|
475
491
|
val index = player.tracks.indexOfFirst { it.src == trackId }
|
|
476
492
|
if (index >= 0) {
|
|
477
493
|
Timber.d("Queue already from $parentPath, skipping to index $index")
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
existingItems
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
494
|
+
val track = player.tracks[index]
|
|
495
|
+
return@future handleTrackLoad(audioBrowser.configuration.handleTrackLoad, track, player.tracks, index.toDouble(), ::currentPlayerState) {
|
|
496
|
+
// Return the existing queue items with the new start index
|
|
497
|
+
val existingItems = player.tracks.map { TrackFactory.toMedia3(it) }
|
|
498
|
+
MediaSession.MediaItemsWithStartPosition(
|
|
499
|
+
existingItems,
|
|
500
|
+
index,
|
|
501
|
+
startPositionMs,
|
|
502
|
+
)
|
|
503
|
+
}
|
|
485
504
|
}
|
|
486
505
|
}
|
|
487
506
|
}
|
|
488
507
|
}
|
|
489
508
|
|
|
490
|
-
|
|
491
|
-
val browserManager = player.awaitBrowser().browserManager
|
|
509
|
+
val browserManager = audioBrowser.browserManager
|
|
492
510
|
val result =
|
|
493
511
|
browserManager.resolveMediaItemsForPlayback(mediaItems, startIndex, startPositionMs)
|
|
494
512
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
513
|
+
val tracks = result.mediaItems.map { TrackFactory.fromMedia3(it) }.toTypedArray()
|
|
514
|
+
val selectedTrack = tracks.getOrElse(result.startIndex) { tracks.first() }
|
|
515
|
+
|
|
516
|
+
handleTrackLoad(audioBrowser.configuration.handleTrackLoad, selectedTrack, tracks, result.startIndex.toDouble(), ::currentPlayerState) {
|
|
517
|
+
// If this was a contextual URL expansion, track the source path (only for default behavior)
|
|
518
|
+
if (mediaItems.size == 1) {
|
|
519
|
+
val mediaId = mediaItems[0].mediaId
|
|
520
|
+
if (BrowserPathHelper.isContextual(mediaId)) {
|
|
521
|
+
val parentPath = BrowserPathHelper.stripTrackId(mediaId)
|
|
522
|
+
withContext(Dispatchers.Main) { player.queueSourcePath = parentPath }
|
|
523
|
+
}
|
|
501
524
|
}
|
|
525
|
+
result
|
|
502
526
|
}
|
|
503
|
-
|
|
504
|
-
result
|
|
505
527
|
}
|
|
506
528
|
}
|
|
507
529
|
|
|
@@ -189,6 +189,7 @@ class PlaybackStateStore(private val player: Player) {
|
|
|
189
189
|
else null,
|
|
190
190
|
groupTitle = obj.optString("groupTitle").takeIf { it.isNotEmpty() },
|
|
191
191
|
live = if (obj.has("live") && !obj.isNull("live")) obj.getBoolean("live") else null,
|
|
192
|
+
imageRow = null, // Not persisted
|
|
192
193
|
)
|
|
193
194
|
}
|
|
194
195
|
.onFailure { e -> Timber.w(e, "Failed to parse persisted track JSON") }
|
|
@@ -832,6 +832,7 @@ class Player(internal val context: Context) {
|
|
|
832
832
|
favorited = favorited,
|
|
833
833
|
groupTitle = currentTrack.groupTitle,
|
|
834
834
|
live = currentTrack.live,
|
|
835
|
+
imageRow = currentTrack.imageRow,
|
|
835
836
|
)
|
|
836
837
|
|
|
837
838
|
// Use buildUpon() on the existing MediaItem to update only the metadata
|
|
@@ -17,10 +17,14 @@ import timber.log.Timber
|
|
|
17
17
|
* needs to fetch data. By deferring URL transformation (which may invoke a JS callback
|
|
18
18
|
* via `runBlocking`) to [open], we avoid blocking the main thread and prevent deadlocks
|
|
19
19
|
* when the JS thread is occupied by synchronous Nitro calls (e.g., `seekTo`).
|
|
20
|
+
*
|
|
21
|
+
* The transform is resolved once per track on the first [open] call (the manifest/media
|
|
22
|
+
* URL). The resulting headers and user-agent are cached on the [Factory] and reused for
|
|
23
|
+
* subsequent requests (segments, encryption keys) without calling the JS transform again.
|
|
20
24
|
*/
|
|
21
25
|
class TransformingDataSource(
|
|
22
26
|
private val upstream: DataSource,
|
|
23
|
-
private val
|
|
27
|
+
private val factory: Factory,
|
|
24
28
|
) : DataSource {
|
|
25
29
|
|
|
26
30
|
companion object {
|
|
@@ -32,11 +36,19 @@ class TransformingDataSource(
|
|
|
32
36
|
override fun open(dataSpec: DataSpec): Long {
|
|
33
37
|
val originalUrl = dataSpec.uri.toString()
|
|
34
38
|
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
// Check if the Factory already has a cached transform result.
|
|
40
|
+
// The first DataSource to open() resolves the transform and caches it.
|
|
41
|
+
// All subsequent opens (segments, keys, replays) reuse the cached
|
|
42
|
+
// headers/user-agent but keep their original URLs.
|
|
43
|
+
val cached = factory.cachedTransform
|
|
44
|
+
val (finalUrl, headers, userAgent) = if (cached == null) {
|
|
45
|
+
val resolved = resolveRequestConfig(originalUrl)
|
|
46
|
+
factory.cachedTransform = resolved
|
|
47
|
+
Timber.d("TransformingDataSource: resolved $originalUrl -> ${resolved.first}")
|
|
48
|
+
resolved
|
|
49
|
+
} else {
|
|
50
|
+
Triple(originalUrl, cached.second, cached.third)
|
|
51
|
+
}
|
|
40
52
|
|
|
41
53
|
// Build merged headers including user-agent override
|
|
42
54
|
val mergedHeaders = buildMap {
|
|
@@ -47,7 +59,7 @@ class TransformingDataSource(
|
|
|
47
59
|
}
|
|
48
60
|
}
|
|
49
61
|
|
|
50
|
-
// Build a new DataSpec with the transformed URL and merged headers
|
|
62
|
+
// Build a new DataSpec with the (possibly transformed) URL and merged headers
|
|
51
63
|
val transformedSpec =
|
|
52
64
|
dataSpec.buildUpon().setUri(finalUrl.toUri()).setHttpRequestHeaders(mergedHeaders).build()
|
|
53
65
|
|
|
@@ -82,7 +94,7 @@ class TransformingDataSource(
|
|
|
82
94
|
originalUrl: String
|
|
83
95
|
): Triple<String, Map<String, String>, String> {
|
|
84
96
|
return try {
|
|
85
|
-
val requestConfig = getRequestConfig(originalUrl)
|
|
97
|
+
val requestConfig = factory.getRequestConfig(originalUrl)
|
|
86
98
|
if (requestConfig != null) {
|
|
87
99
|
val path = requestConfig.path ?: ""
|
|
88
100
|
val baseUrl = requestConfig.baseUrl
|
|
@@ -91,7 +103,7 @@ class TransformingDataSource(
|
|
|
91
103
|
val finalUrl =
|
|
92
104
|
if (requestConfig.query?.isNotEmpty() == true) {
|
|
93
105
|
val uri = Uri.parse(url).buildUpon()
|
|
94
|
-
requestConfig.query
|
|
106
|
+
requestConfig.query?.forEach { (key, value) -> uri.appendQueryParameter(key, value) }
|
|
95
107
|
uri.build().toString()
|
|
96
108
|
} else {
|
|
97
109
|
url
|
|
@@ -113,12 +125,22 @@ class TransformingDataSource(
|
|
|
113
125
|
/** Factory that creates [TransformingDataSource] instances wrapping an upstream factory. */
|
|
114
126
|
class Factory(
|
|
115
127
|
private val upstreamFactory: DataSource.Factory,
|
|
116
|
-
|
|
128
|
+
internal val getRequestConfig: (originalUrl: String) -> MediaRequestConfig?,
|
|
117
129
|
) : DataSource.Factory {
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Cached transform result (url, headers, userAgent) from the first open() call.
|
|
133
|
+
* Shared across all DataSource instances created by this factory.
|
|
134
|
+
* A new Factory is created per [MediaFactory.createMediaSource] call (per track),
|
|
135
|
+
* so the cache naturally resets on track transitions.
|
|
136
|
+
*/
|
|
137
|
+
@Volatile
|
|
138
|
+
internal var cachedTransform: Triple<String, Map<String, String>, String>? = null
|
|
139
|
+
|
|
118
140
|
override fun createDataSource(): DataSource {
|
|
119
141
|
return TransformingDataSource(
|
|
120
142
|
upstream = upstreamFactory.createDataSource(),
|
|
121
|
-
|
|
143
|
+
factory = this,
|
|
122
144
|
)
|
|
123
145
|
}
|
|
124
146
|
}
|