From 105c7ac98dc8e4b27c6f9d04fca425adafb4b6f1 Mon Sep 17 00:00:00 2001 From: kernexshadow Date: Sun, 15 Mar 2026 21:52:40 +0000 Subject: [PATCH] Align player datasource DNS with IPv4 fallback policy --- .../player/PlayerMediaSourceFactory.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nuvio/tv/ui/screens/player/PlayerMediaSourceFactory.kt b/app/src/main/java/com/nuvio/tv/ui/screens/player/PlayerMediaSourceFactory.kt index 64baf5c1..e5853181 100644 --- a/app/src/main/java/com/nuvio/tv/ui/screens/player/PlayerMediaSourceFactory.kt +++ b/app/src/main/java/com/nuvio/tv/ui/screens/player/PlayerMediaSourceFactory.kt @@ -2,7 +2,7 @@ package com.nuvio.tv.ui.screens.player import androidx.media3.common.MediaItem import androidx.media3.common.MimeTypes -import androidx.media3.datasource.DefaultHttpDataSource +import androidx.media3.datasource.okhttp.OkHttpDataSource import androidx.media3.exoplayer.source.DefaultMediaSourceFactory import androidx.media3.exoplayer.source.MediaSource import androidx.media3.exoplayer.dash.DashMediaSource @@ -10,17 +10,29 @@ import androidx.media3.exoplayer.hls.HlsMediaSource import androidx.media3.extractor.DefaultExtractorsFactory import androidx.media3.extractor.ExtractorsFactory import androidx.media3.extractor.text.SubtitleParser +import com.nuvio.tv.core.network.IPv4FirstDns import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import okhttp3.OkHttpClient import java.io.InputStream import java.net.HttpURLConnection import java.net.URL import java.net.URLDecoder import java.util.Locale +import java.util.concurrent.TimeUnit internal class PlayerMediaSourceFactory { private var customExtractorsFactory: ExtractorsFactory? = null private var customSubtitleParserFactory: SubtitleParser.Factory? = null + private val playbackHttpClient by lazy { + OkHttpClient.Builder() + .dns(IPv4FirstDns()) + .connectTimeout(8, TimeUnit.SECONDS) + .readTimeout(8, TimeUnit.SECONDS) + .followRedirects(true) + .followSslRedirects(true) + .build() + } fun configureSubtitleParsing( extractorsFactory: ExtractorsFactory?, @@ -37,10 +49,7 @@ internal class PlayerMediaSourceFactory { mimeTypeOverride: String? = null ): MediaSource { val sanitizedHeaders = sanitizeHeaders(headers) - val httpDataSourceFactory = DefaultHttpDataSource.Factory().apply { - setConnectTimeoutMs(8000) - setReadTimeoutMs(8000) - setAllowCrossProtocolRedirects(true) + val httpDataSourceFactory = OkHttpDataSource.Factory(playbackHttpClient).apply { setDefaultRequestProperties(sanitizedHeaders) setUserAgent(DEFAULT_USER_AGENT) }