Release v1.1.0
This commit is contained in:
@@ -10,16 +10,18 @@ import androidx.media3.common.PlaybackException
|
||||
import androidx.media3.common.Player
|
||||
import androidx.media3.common.Tracks
|
||||
import androidx.media3.datasource.DefaultDataSource
|
||||
import androidx.media3.datasource.DefaultHttpDataSource
|
||||
import androidx.media3.exoplayer.dash.DashMediaSource
|
||||
import androidx.media3.exoplayer.ExoPlayer
|
||||
import androidx.media3.exoplayer.drm.DefaultDrmSessionManager
|
||||
import androidx.media3.exoplayer.drm.FrameworkMediaDrm
|
||||
import androidx.media3.exoplayer.drm.LocalMediaDrmCallback
|
||||
import androidx.media3.exoplayer.source.DefaultMediaSourceFactory
|
||||
import androidx.media3.exoplayer.hls.HlsMediaSource
|
||||
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
|
||||
import androidx.media3.exoplayer.trackselection.TrackSelector
|
||||
import com.futbollibre.tv.model.StreamType
|
||||
import com.futbollibre.tv.model.StreamUrl
|
||||
import com.futbollibre.tv.util.NetworkStack
|
||||
|
||||
/**
|
||||
* Manager class for ExoPlayer instance.
|
||||
@@ -49,11 +51,9 @@ class ExoPlayerManager private constructor() {
|
||||
): ExoPlayer {
|
||||
Log.d(TAG, "Creating ExoPlayer instance")
|
||||
|
||||
val httpDataSourceFactory = DefaultHttpDataSource.Factory()
|
||||
.setUserAgent(USER_AGENT)
|
||||
.setConnectTimeoutMs(CONNECT_TIMEOUT_MS)
|
||||
.setReadTimeoutMs(READ_TIMEOUT_MS)
|
||||
.setAllowCrossProtocolRedirects(true)
|
||||
val httpDataSourceFactory = NetworkStack.mediaHttpDataSourceFactory(
|
||||
userAgent = USER_AGENT
|
||||
)
|
||||
|
||||
val dataSourceFactory = DefaultDataSource.Factory(context, httpDataSourceFactory)
|
||||
val mediaSourceFactory = DefaultMediaSourceFactory(dataSourceFactory)
|
||||
@@ -76,22 +76,18 @@ class ExoPlayerManager private constructor() {
|
||||
fun prepareStream(player: ExoPlayer, streamUrl: StreamUrl, context: Context) {
|
||||
Log.d(TAG, "Preparing ${streamUrl.streamType} stream: ${streamUrl.url}")
|
||||
|
||||
val httpDataSourceFactory = DefaultHttpDataSource.Factory()
|
||||
.setUserAgent(USER_AGENT)
|
||||
.setConnectTimeoutMs(CONNECT_TIMEOUT_MS)
|
||||
.setReadTimeoutMs(READ_TIMEOUT_MS)
|
||||
.setAllowCrossProtocolRedirects(true)
|
||||
|
||||
val requestProperties = mutableMapOf<String, String>()
|
||||
streamUrl.referer?.let { referer ->
|
||||
Log.d(TAG, "Setting Referer header: $referer")
|
||||
httpDataSourceFactory.setDefaultRequestProperties(
|
||||
mapOf(
|
||||
"Referer" to referer,
|
||||
"Origin" to extractOrigin(referer)
|
||||
)
|
||||
)
|
||||
requestProperties["Referer"] = referer
|
||||
requestProperties["Origin"] = extractOrigin(referer)
|
||||
}
|
||||
|
||||
val httpDataSourceFactory = NetworkStack.mediaHttpDataSourceFactory(
|
||||
userAgent = USER_AGENT,
|
||||
requestProperties = requestProperties
|
||||
)
|
||||
|
||||
val dataSourceFactory = DefaultDataSource.Factory(context, httpDataSourceFactory)
|
||||
val mediaSourceFactory = DefaultMediaSourceFactory(dataSourceFactory)
|
||||
val mediaItemBuilder = MediaItem.Builder()
|
||||
@@ -103,14 +99,34 @@ class ExoPlayerManager private constructor() {
|
||||
}
|
||||
)
|
||||
|
||||
if (streamUrl.streamType == StreamType.DASH && streamUrl.clearKeys.isNotEmpty()) {
|
||||
if (streamUrl.clearKeys.isNotEmpty()) {
|
||||
val drmSessionManager = buildClearKeyDrmSessionManager(streamUrl.clearKeys)
|
||||
mediaSourceFactory.setDrmSessionManagerProvider { drmSessionManager }
|
||||
mediaItemBuilder.setDrmConfiguration(
|
||||
MediaItem.DrmConfiguration.Builder(C.CLEARKEY_UUID)
|
||||
.setPlayClearContentWithoutKey(true)
|
||||
.build()
|
||||
)
|
||||
|
||||
val mediaSource = when (streamUrl.streamType) {
|
||||
StreamType.HLS -> HlsMediaSource.Factory(dataSourceFactory)
|
||||
.setPlaylistParserFactory(
|
||||
ClearKeyHlsPlaylistParserFactory(streamUrl.clearKeys.keys)
|
||||
)
|
||||
.setDrmSessionManagerProvider { drmSessionManager }
|
||||
.createMediaSource(mediaItemBuilder.build())
|
||||
|
||||
StreamType.DASH -> {
|
||||
mediaSourceFactory.setDrmSessionManagerProvider { drmSessionManager }
|
||||
DashMediaSource.Factory(dataSourceFactory)
|
||||
.setDrmSessionManagerProvider { drmSessionManager }
|
||||
.createMediaSource(mediaItemBuilder.build())
|
||||
}
|
||||
}
|
||||
|
||||
player.setMediaSource(mediaSource)
|
||||
player.prepare()
|
||||
Log.d(TAG, "Stream preparation started")
|
||||
return
|
||||
}
|
||||
|
||||
val mediaSource = mediaSourceFactory.createMediaSource(mediaItemBuilder.build())
|
||||
|
||||
Reference in New Issue
Block a user