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.datasource.DataSource
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager
|
import androidx.media3.exoplayer.drm.DrmSessionManager
|
||||||
|
import androidx.media3.exoplayer.source.MediaSource
|
||||||
import com.brentvatne.common.api.Source
|
import com.brentvatne.common.api.Source
|
||||||
import com.brentvatne.react.RNVPlugin
|
import com.brentvatne.react.RNVPlugin
|
||||||
|
|
||||||
@@ -37,6 +38,17 @@ interface RNVExoplayerPlugin : RNVPlugin {
|
|||||||
*/
|
*/
|
||||||
fun overrideMediaDataSourceFactory(source: Source, mediaDataSourceFactory: DataSource.Factory): DataSource.Factory? = null
|
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]
|
* Optional function that allows the plugin to modify the [MediaItem.Builder]
|
||||||
* before the final [MediaItem] is created.
|
* 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);
|
mediaItemBuilder.setStreamKeys(streamKeys);
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.brentvatne.react
|
|||||||
import androidx.media3.common.MediaItem
|
import androidx.media3.common.MediaItem
|
||||||
import androidx.media3.datasource.DataSource
|
import androidx.media3.datasource.DataSource
|
||||||
import androidx.media3.exoplayer.drm.DrmSessionManager
|
import androidx.media3.exoplayer.drm.DrmSessionManager
|
||||||
|
import androidx.media3.exoplayer.source.MediaSource
|
||||||
import com.brentvatne.common.api.Source
|
import com.brentvatne.common.api.Source
|
||||||
import com.brentvatne.common.toolbox.DebugLog
|
import com.brentvatne.common.toolbox.DebugLog
|
||||||
import com.brentvatne.exoplayer.DRMManagerSpec
|
import com.brentvatne.exoplayer.DRMManagerSpec
|
||||||
@@ -99,6 +100,16 @@ class ReactNativeVideoManager : RNVPlugin {
|
|||||||
return null
|
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? {
|
fun overrideMediaItemBuilder(source: Source, mediaItemBuilder: MediaItem.Builder): MediaItem.Builder? {
|
||||||
for (plugin in pluginList) {
|
for (plugin in pluginList) {
|
||||||
if (plugin !is RNVExoplayerPlugin) continue
|
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.
|
Enables dynamic disabling of the caching system per source.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user