feat(android): allow plugins to override drm session manager (#4558)
This commit is contained in:
@@ -3,6 +3,7 @@ package com.brentvatne.exoplayer
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.datasource.DataSource
|
||||
import androidx.media3.exoplayer.ExoPlayer
|
||||
import androidx.media3.exoplayer.drm.DrmSessionManager
|
||||
import com.brentvatne.common.api.Source
|
||||
import com.brentvatne.react.RNVPlugin
|
||||
|
||||
@@ -18,6 +19,15 @@ interface RNVExoplayerPlugin : RNVPlugin {
|
||||
*/
|
||||
fun getDRMManager(): DRMManagerSpec? = null
|
||||
|
||||
/**
|
||||
* Optional function that allows the plugin to override the DrmSessionManager after it has been created.
|
||||
* This is called after buildDrmSessionManager and allows for final modifications to the DrmSessionManager.
|
||||
* @param source The media source being initialized.
|
||||
* @param drmSessionManager The current DrmSessionManager instance.
|
||||
* @return A modified DrmSessionManager if override is needed, or null to use original.
|
||||
*/
|
||||
fun overrideDrmSessionManager(source: Source, drmSessionManager: DrmSessionManager): DrmSessionManager? = null
|
||||
|
||||
/**
|
||||
* Optional function that allows the plugin to override the media data source factory,
|
||||
* which is responsible for loading media data.
|
||||
|
||||
@@ -953,7 +953,10 @@ public class ReactExoplayerView extends FrameLayout implements
|
||||
if (drmSessionManager == null) {
|
||||
eventEmitter.onVideoError.invoke("Failed to build DRM session manager", new Exception("DRM session manager is null"), "3007");
|
||||
}
|
||||
return drmSessionManager;
|
||||
|
||||
// Allow plugins to override the DrmSessionManager
|
||||
DrmSessionManager overriddenManager = ReactNativeVideoManager.Companion.getInstance().overrideDrmSessionManager(source, drmSessionManager);
|
||||
return overriddenManager != null ? overriddenManager : drmSessionManager;
|
||||
} catch (UnsupportedDrmException ex) {
|
||||
// Unsupported DRM exceptions are handled by the calling method
|
||||
throw ex;
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.brentvatne.react
|
||||
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.datasource.DataSource
|
||||
import androidx.media3.exoplayer.drm.DrmSessionManager
|
||||
import com.brentvatne.common.api.Source
|
||||
import com.brentvatne.common.toolbox.DebugLog
|
||||
import com.brentvatne.exoplayer.DRMManagerSpec
|
||||
@@ -78,6 +79,16 @@ class ReactNativeVideoManager : RNVPlugin {
|
||||
// ----------------------- RNV Exoplayer plugin specific methods -----------------------
|
||||
fun getDRMManager(): DRMManagerSpec? = customDRMManager
|
||||
|
||||
fun overrideDrmSessionManager(source: Source, drmSessionManager: DrmSessionManager): DrmSessionManager? {
|
||||
for (plugin in pluginList) {
|
||||
if (plugin !is RNVExoplayerPlugin) continue
|
||||
|
||||
val overriddenManager = plugin.overrideDrmSessionManager(source, drmSessionManager)
|
||||
if (overriddenManager != null) return overriddenManager
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
fun overrideMediaDataSourceFactory(source: Source, mediaDataSourceFactory: DataSource.Factory): DataSource.Factory? {
|
||||
for (plugin in pluginList) {
|
||||
if (plugin !is RNVExoplayerPlugin) continue
|
||||
|
||||
Reference in New Issue
Block a user