feat(native): handle headers

This commit is contained in:
2026-07-26 13:26:56 +02:00
parent f5ba273b1b
commit 7f733d8ef2
2 changed files with 27 additions and 9 deletions
@@ -7,6 +7,7 @@ import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.SurfaceHolder
import androidx.core.app.NotificationCompat
import androidx.media3.common.AudioAttributes
@@ -37,7 +38,13 @@ import dev.zoriya.omni.utils.ThreadHelper.runOnMainThreadSync
class OmniPlayer : HybridOmniPlayerSpec() {
private val ctx = NitroModules.applicationContext ?: throw Error("No Context available!")
val player: Player = runOnMainThreadSync {
// ExoPlayer.Builder(ctx).build()
// 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)
}
override val eventMap = EventMap(player)
@@ -77,13 +84,10 @@ class OmniPlayer : HybridOmniPlayerSpec() {
metadata: com.margelo.nitro.omni.Metadata?,
subtitles: Array<com.margelo.nitro.omni.Subtitle>
): MediaItem {
// val headers = Bundle().apply {
// putStringArrayList(
// VlcPlayer.REQUEST_HEADER_NAMES_KEY,
// VlcPlayer.REQUEST_HEADER_VALUES_KEY,
// putLong(VlcPlayer.REQUEST_START_MS_KEY, (it.coerceAtLeast(0.0) * 1000.0).toLong())
// }
// }
// vlc only path (and it only supports a few headers :c)
val extras = if (src.headers.isEmpty()) null else Bundle(src.headers.size).apply {
for ((name, value) in src.headers) putString(name, value)
}
return MediaItem.Builder()
.setUri(src.uri)
.setMimeType(src.mimeType)
@@ -108,7 +112,7 @@ class OmniPlayer : HybridOmniPlayerSpec() {
.setRequestMetadata(
RequestMetadata.Builder()
.setMediaUri(src.uri.toUri())
// .setExtras(headers)
.apply { extras?.let { setExtras(it) } }
.build()
)
.build()
@@ -5,6 +5,7 @@ import android.content.Context
import android.media.AudioFocusRequest
import android.media.AudioManager
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.Surface
@@ -350,6 +351,7 @@ class VlcPlayer(ctx: Context) :
if (!uri.isNullOrEmpty()) {
val media = Media(libVLC, uri.toUri())
media.setHWDecoderEnabled(true, false)
applyRequestHeaders(media, item.requestMetadata.extras)
item.localConfiguration?.subtitleConfigurations?.forEach { subtitle ->
media.addSlave(
@@ -382,6 +384,18 @@ class VlcPlayer(ctx: Context) :
}
}
// vlc doesn't allow arbitrary headers :c
private fun applyRequestHeaders(media: Media, extras: Bundle?) {
if (extras == null) return
for (name in extras.keySet()) {
val value = extras.getString(name) ?: continue
when (name.lowercase()) {
"user-agent" -> media.addOption(":http-user-agent=$value")
"referer", "referrer" -> media.addOption(":http-referrer=$value")
}
}
}
override fun addMediaItems(
p0: Int,
p1: List<MediaItem>