feat(android): allow plugins to override drm session manager (#4558)

This commit is contained in:
Kamil Moskała
2025-05-28 16:11:57 +02:00
committed by GitHub
parent e165cdefa1
commit 9449eb34f3
3 changed files with 25 additions and 1 deletions

View File

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

View File

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

View File

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