diff --git a/android/src/main/java/com/brentvatne/exoplayer/RNVExoplayerPlugin.kt b/android/src/main/java/com/brentvatne/exoplayer/RNVExoplayerPlugin.kt index f338fc6c..0e4250b2 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/RNVExoplayerPlugin.kt +++ b/android/src/main/java/com/brentvatne/exoplayer/RNVExoplayerPlugin.kt @@ -4,6 +4,7 @@ import androidx.media3.common.MediaItem import androidx.media3.datasource.DataSource import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.drm.DrmSessionManager +import androidx.media3.exoplayer.source.MediaSource import com.brentvatne.common.api.Source import com.brentvatne.react.RNVPlugin @@ -37,6 +38,17 @@ interface RNVExoplayerPlugin : RNVPlugin { */ fun overrideMediaDataSourceFactory(source: Source, mediaDataSourceFactory: DataSource.Factory): DataSource.Factory? = null + /** + * Optional function that allows the plugin to override the media source factory, + * which is responsible for loading media data. + * @param source The media source being initialized. + * @param mediaSourceFactory The current media source factory. + * @param mediaDataSourceFactory The current default data source factory. + * @return A custom [MediaSource.Factory] if override is needed, or null to use default. + */ + fun overrideMediaSourceFactory(source: Source, mediaSourceFactory: MediaSource.Factory, mediaDataSourceFactory: DataSource.Factory): MediaSource.Factory? = + null + /** * Optional function that allows the plugin to modify the [MediaItem.Builder] * before the final [MediaItem] is created. diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index f9e1a0a9..3c8d4b11 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -1248,6 +1248,12 @@ public class ReactExoplayerView extends FrameLayout implements ); } + mediaSourceFactory = Objects.requireNonNullElse( + ReactNativeVideoManager.Companion.getInstance() + .overrideMediaSourceFactory(source, mediaSourceFactory, mediaDataSourceFactory), + mediaSourceFactory + ); + mediaItemBuilder.setStreamKeys(streamKeys); @Nullable diff --git a/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt b/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt index b2c64868..e4240efb 100644 --- a/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt +++ b/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt @@ -3,6 +3,7 @@ package com.brentvatne.react import androidx.media3.common.MediaItem import androidx.media3.datasource.DataSource import androidx.media3.exoplayer.drm.DrmSessionManager +import androidx.media3.exoplayer.source.MediaSource import com.brentvatne.common.api.Source import com.brentvatne.common.toolbox.DebugLog import com.brentvatne.exoplayer.DRMManagerSpec @@ -99,6 +100,16 @@ class ReactNativeVideoManager : RNVPlugin { return null } + fun overrideMediaSourceFactory(source: Source, mediaSourceFactory: MediaSource.Factory, mediaDataSourceFactory: DataSource.Factory): MediaSource.Factory? { + for (plugin in pluginList) { + if (plugin !is RNVExoplayerPlugin) continue + + val factory = plugin.overrideMediaSourceFactory(source, mediaSourceFactory, mediaDataSourceFactory) + if (factory != null) return factory + } + return null + } + fun overrideMediaItemBuilder(source: Source, mediaItemBuilder: MediaItem.Builder): MediaItem.Builder? { for (plugin in pluginList) { if (plugin !is RNVExoplayerPlugin) continue diff --git a/docs/pages/other/plugin.md b/docs/pages/other/plugin.md index 1ae8ddc8..1ef713a7 100644 --- a/docs/pages/other/plugin.md +++ b/docs/pages/other/plugin.md @@ -156,7 +156,22 @@ override fun overrideMediaDataSourceFactory( } ``` -##### 3. `shouldDisableCache` +##### 3. `overrideMediaSourceFactory` + +Allows you to override the default MediaSource.Factory used by ExoPlayer for creating media sources. +Use this if you need to inject a custom media source implementation. If you return null, the default media source factory will be used. + +```kotlin +override fun overrideMediaSourceFactory( + source: Source, + mediaSourceFactory: MediaSource.Factory, + mediaDataSourceFactory: DataSource.Factory + ): MediaSource.Factory? { + // Return your custom factory or null to use default + } +``` + +##### 4. `shouldDisableCache` Enables dynamic disabling of the caching system per source.