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.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 com.brentvatne.common.api.Source
|
import com.brentvatne.common.api.Source
|
||||||
import com.brentvatne.react.RNVPlugin
|
import com.brentvatne.react.RNVPlugin
|
||||||
|
|
||||||
@@ -18,6 +19,15 @@ interface RNVExoplayerPlugin : RNVPlugin {
|
|||||||
*/
|
*/
|
||||||
fun getDRMManager(): DRMManagerSpec? = null
|
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,
|
* Optional function that allows the plugin to override the media data source factory,
|
||||||
* which is responsible for loading media data.
|
* which is responsible for loading media data.
|
||||||
|
|||||||
@@ -953,7 +953,10 @@ public class ReactExoplayerView extends FrameLayout implements
|
|||||||
if (drmSessionManager == null) {
|
if (drmSessionManager == null) {
|
||||||
eventEmitter.onVideoError.invoke("Failed to build DRM session manager", new Exception("DRM session manager is null"), "3007");
|
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) {
|
} catch (UnsupportedDrmException ex) {
|
||||||
// Unsupported DRM exceptions are handled by the calling method
|
// Unsupported DRM exceptions are handled by the calling method
|
||||||
throw ex;
|
throw ex;
|
||||||
|
|||||||
@@ -2,6 +2,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 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
|
||||||
@@ -78,6 +79,16 @@ class ReactNativeVideoManager : RNVPlugin {
|
|||||||
// ----------------------- RNV Exoplayer plugin specific methods -----------------------
|
// ----------------------- RNV Exoplayer plugin specific methods -----------------------
|
||||||
fun getDRMManager(): DRMManagerSpec? = customDRMManager
|
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? {
|
fun overrideMediaDataSourceFactory(source: Source, mediaDataSourceFactory: DataSource.Factory): DataSource.Factory? {
|
||||||
for (plugin in pluginList) {
|
for (plugin in pluginList) {
|
||||||
if (plugin !is RNVExoplayerPlugin) continue
|
if (plugin !is RNVExoplayerPlugin) continue
|
||||||
|
|||||||
Reference in New Issue
Block a user