fix(player): следовать кросс-протокольным редиректам (http→https)

Многие станции отдают по http 301 на https; ExoPlayer по умолчанию не идёт
по кросс-протокольному редиректу и не играет их. Включён общий HTTP-источник
с setAllowCrossProtocolRedirects(true) — такие станции заиграют без правки URL.
ICY-метаданные сохраняются (обрабатываются на уровне ProgressiveMediaSource).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nk
2026-06-04 15:42:43 +03:00
parent bd62016026
commit 4612a8f33c

View File

@@ -13,7 +13,10 @@ import androidx.media3.common.MediaMetadata
import androidx.media3.common.Metadata import androidx.media3.common.Metadata
import androidx.media3.common.Player import androidx.media3.common.Player
import android.util.Log import android.util.Log
import androidx.media3.datasource.DefaultDataSource
import androidx.media3.datasource.DefaultHttpDataSource
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
import androidx.media3.extractor.metadata.icy.IcyInfo import androidx.media3.extractor.metadata.icy.IcyInfo
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -74,7 +77,18 @@ class PlayerController @Inject constructor(
) )
} }
// HTTP-источник с разрешёнными кросс-протокольными редиректами (http→https):
// многие станции отдают 301 c http на https, без этого ExoPlayer их не играет.
private val mediaSourceFactory = DefaultMediaSourceFactory(
DefaultDataSource.Factory(
context,
DefaultHttpDataSource.Factory()
.setAllowCrossProtocolRedirects(true)
)
)
private val exoPlayer: ExoPlayer = ExoPlayer.Builder(context) private val exoPlayer: ExoPlayer = ExoPlayer.Builder(context)
.setMediaSourceFactory(mediaSourceFactory)
.setAudioAttributes( .setAudioAttributes(
AudioAttributes.Builder() AudioAttributes.Builder()
.setUsage(C.USAGE_MEDIA) .setUsage(C.USAGE_MEDIA)