feat(plugin): overrideMediaSourceFactory (#4566)

This commit is contained in:
Kamil Moskała
2025-06-05 12:36:55 +02:00
committed by GitHub
parent 55449d9ec4
commit 9cf780276a
4 changed files with 45 additions and 1 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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.