feat(plugin): overrideMediaSourceFactory (#4566)
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user