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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user