feat(android): allow both exoplayer and vlc

This commit is contained in:
2026-07-26 13:26:56 +02:00
parent 7f733d8ef2
commit 6423ed0bc5
17 changed files with 418 additions and 21 deletions
@@ -15,7 +15,12 @@ import androidx.media3.common.C
import androidx.media3.common.MediaItem
import androidx.media3.common.MediaMetadata
import androidx.media3.common.Player
import androidx.media3.datasource.DefaultDataSource
import androidx.media3.datasource.DefaultHttpDataSource
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import com.margelo.nitro.NitroModules
import com.margelo.nitro.omni.AndroidBackend
import com.margelo.nitro.omni.CastStatus
import com.margelo.nitro.omni.HybridOmniPlayerSpec
import com.margelo.nitro.omni.MixAudioMode
@@ -35,17 +40,26 @@ import dev.zoriya.omni.utils.ThreadHelper.runOnMainThread
import dev.zoriya.omni.utils.ThreadHelper.runOnMainThreadSync
@SuppressLint("UnsafeOptInUsageError")
class OmniPlayer : HybridOmniPlayerSpec() {
class OmniPlayer(private val backend: AndroidBackend = AndroidBackend.VLC) : HybridOmniPlayerSpec() {
private val ctx = NitroModules.applicationContext ?: throw Error("No Context available!")
// exoplayer only, used to specify request headers.
private var httpDataSourceFactory: DefaultHttpDataSource.Factory? = null
val player: Player = runOnMainThreadSync {
// To use ExoPlayer, build it with an http data source and refresh its
// request headers from the source on each change:
// val http = DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true)
// ExoPlayer.Builder(ctx)
// .setMediaSourceFactory(DefaultMediaSourceFactory(DefaultDataSource.Factory(ctx, http)))
// .build()
// // in the source setter: http.setDefaultRequestProperties(firstSrc.headers)
VlcPlayer(ctx)
when (backend) {
AndroidBackend.EXOPLAYER -> {
val http = DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true)
httpDataSourceFactory = http
ExoPlayer.Builder(ctx)
.setMediaSourceFactory(
DefaultMediaSourceFactory(DefaultDataSource.Factory(ctx, http))
)
.build()
}
AndroidBackend.VLC -> VlcPlayer(ctx)
}
}
override val eventMap = EventMap(player)
@@ -207,6 +221,8 @@ class OmniPlayer : HybridOmniPlayerSpec() {
return
}
httpDataSourceFactory?.setDefaultRequestProperties(firstSrc.headers)
val currentItem = buildMediaItem(firstSrc, value.metadata, value.subtitles)
val mediaItems = mutableListOf<MediaItem>()
@@ -2,13 +2,15 @@ package dev.zoriya.omni
import android.util.Log
import com.facebook.react.uimanager.ThemedReactContext
import com.margelo.nitro.omni.AndroidBackend
import com.margelo.nitro.omni.HybridOmniPlayerFactorySpec
import com.margelo.nitro.omni.HybridOmniPlayerSpec
import com.margelo.nitro.omni.PlayerBackend
import com.margelo.nitro.omni.Source
class OmniPlayerFactory(val context: ThemedReactContext) : HybridOmniPlayerFactorySpec() {
override fun createPlayer(props: Source?): HybridOmniPlayerSpec {
return OmniPlayer().apply {
override fun createPlayer(props: Source?, backend: PlayerBackend?): HybridOmniPlayerSpec {
return OmniPlayer(backend?.android ?: AndroidBackend.VLC).apply {
source = props
}
}