From 7f733d8ef29411e725158f5a6778de4fa547680f Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 26 Jul 2026 12:12:07 +0200 Subject: [PATCH] feat(native): handle headers --- .../main/java/dev/zoriya/omni/OmniPlayer.kt | 22 +++++++++++-------- .../main/java/dev/zoriya/omni/VlcPlayer.kt | 14 ++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt index 91a3218..871463b 100644 --- a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt +++ b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt @@ -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 ): 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() diff --git a/android/src/main/java/dev/zoriya/omni/VlcPlayer.kt b/android/src/main/java/dev/zoriya/omni/VlcPlayer.kt index 679758b..ff627ae 100644 --- a/android/src/main/java/dev/zoriya/omni/VlcPlayer.kt +++ b/android/src/main/java/dev/zoriya/omni/VlcPlayer.kt @@ -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