mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-28 07:50:31 +05:30
Theoritical support for playing downloaded subtitles
This commit is contained in:
parent
7ca39daedc
commit
dad4ecd27e
@ -20,17 +20,22 @@ import com.github.libretube.databinding.ExoStyledPlayerControlViewBinding
|
||||
import com.github.libretube.db.DatabaseHolder.Companion.Database
|
||||
import com.github.libretube.enums.FileType
|
||||
import com.github.libretube.extensions.awaitQuery
|
||||
import com.github.libretube.extensions.updateParameters
|
||||
import com.github.libretube.ui.base.BaseActivity
|
||||
import com.github.libretube.ui.extensions.setAspectRatio
|
||||
import com.github.libretube.ui.models.PlayerViewModel
|
||||
import com.github.libretube.util.PlayerHelper
|
||||
import com.google.android.exoplayer2.C
|
||||
import com.google.android.exoplayer2.ExoPlayer
|
||||
import com.google.android.exoplayer2.MediaItem
|
||||
import com.google.android.exoplayer2.MediaItem.SubtitleConfiguration
|
||||
import com.google.android.exoplayer2.Player
|
||||
import com.google.android.exoplayer2.source.MergingMediaSource
|
||||
import com.google.android.exoplayer2.source.ProgressiveMediaSource
|
||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
|
||||
import com.google.android.exoplayer2.ui.StyledPlayerView
|
||||
import com.google.android.exoplayer2.upstream.FileDataSource
|
||||
import com.google.android.exoplayer2.util.MimeTypes
|
||||
import java.io.File
|
||||
|
||||
class OfflinePlayerActivity : BaseActivity() {
|
||||
@ -38,6 +43,8 @@ class OfflinePlayerActivity : BaseActivity() {
|
||||
private lateinit var videoId: String
|
||||
private lateinit var player: ExoPlayer
|
||||
private lateinit var playerView: StyledPlayerView
|
||||
private lateinit var trackSelector: DefaultTrackSelector
|
||||
|
||||
private lateinit var playerBinding: ExoStyledPlayerControlViewBinding
|
||||
private val playerViewModel: PlayerViewModel by viewModels()
|
||||
|
||||
@ -60,8 +67,11 @@ class OfflinePlayerActivity : BaseActivity() {
|
||||
}
|
||||
|
||||
private fun initializePlayer() {
|
||||
trackSelector = DefaultTrackSelector(this)
|
||||
|
||||
player = ExoPlayer.Builder(this)
|
||||
.setHandleAudioBecomingNoisy(true)
|
||||
.setTrackSelector(trackSelector)
|
||||
.build().apply {
|
||||
addListener(object : Player.Listener {
|
||||
override fun onEvents(player: Player, events: Player.Events) {
|
||||
@ -75,9 +85,9 @@ class OfflinePlayerActivity : BaseActivity() {
|
||||
}
|
||||
|
||||
playerView = binding.player
|
||||
|
||||
playerView.setShowSubtitleButton(true)
|
||||
playerView.subtitleView?.visibility = View.VISIBLE
|
||||
playerView.player = player
|
||||
|
||||
playerBinding = binding.player.binding
|
||||
|
||||
playerBinding.fullscreen.visibility = View.GONE
|
||||
@ -85,11 +95,13 @@ class OfflinePlayerActivity : BaseActivity() {
|
||||
finish()
|
||||
}
|
||||
|
||||
PlayerHelper.applyCaptionsStyle(this, playerView.subtitleView)
|
||||
|
||||
binding.player.initialize(
|
||||
null,
|
||||
binding.doubleTapOverlay.binding,
|
||||
binding.playerGestureControlsView.binding,
|
||||
null
|
||||
trackSelector
|
||||
)
|
||||
}
|
||||
|
||||
@ -110,40 +122,59 @@ class OfflinePlayerActivity : BaseActivity() {
|
||||
val audioUri = audio?.path?.let { File(it).toUri() }
|
||||
val subtitleUri = subtitle?.path?.let { File(it).toUri() }
|
||||
|
||||
setMediaSource(
|
||||
videoUri,
|
||||
audioUri
|
||||
)
|
||||
setMediaSource(videoUri, audioUri, subtitleUri)
|
||||
|
||||
trackSelector.updateParameters {
|
||||
setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)
|
||||
setPreferredTextLanguage("en")
|
||||
}
|
||||
|
||||
player.prepare()
|
||||
player.play()
|
||||
}
|
||||
|
||||
private fun setMediaSource(videoUri: Uri?, audioUri: Uri?) {
|
||||
private fun setMediaSource(videoUri: Uri?, audioUri: Uri?, subtitleUri: Uri?) {
|
||||
val subtitle = subtitleUri?.let {
|
||||
SubtitleConfiguration.Builder(it)
|
||||
.setMimeType(MimeTypes.APPLICATION_SUBRIP)
|
||||
.build()
|
||||
}
|
||||
subtitle?.id
|
||||
|
||||
when {
|
||||
videoUri != null && audioUri != null -> {
|
||||
val videoItem = MediaItem.Builder()
|
||||
.setUri(videoUri)
|
||||
.apply {
|
||||
if (subtitle != null) setSubtitleConfigurations(listOf(subtitle))
|
||||
}
|
||||
.build()
|
||||
|
||||
val videoSource = ProgressiveMediaSource.Factory(FileDataSource.Factory())
|
||||
.createMediaSource(
|
||||
MediaItem.fromUri(videoUri)
|
||||
)
|
||||
.createMediaSource(videoItem)
|
||||
|
||||
val audioSource = ProgressiveMediaSource.Factory(FileDataSource.Factory())
|
||||
.createMediaSource(
|
||||
MediaItem.fromUri(audioUri)
|
||||
)
|
||||
.createMediaSource(MediaItem.fromUri(audioUri))
|
||||
|
||||
val mediaSource = MergingMediaSource(
|
||||
audioSource,
|
||||
videoSource
|
||||
)
|
||||
val mediaSource = MergingMediaSource(audioSource, videoSource)
|
||||
|
||||
player.setMediaSource(mediaSource)
|
||||
}
|
||||
videoUri != null -> player.setMediaItem(
|
||||
MediaItem.fromUri(videoUri)
|
||||
MediaItem.Builder()
|
||||
.setUri(videoUri)
|
||||
.apply {
|
||||
if (subtitle != null) setSubtitleConfigurations(listOf(subtitle))
|
||||
}
|
||||
.build()
|
||||
)
|
||||
audioUri != null -> player.setMediaItem(
|
||||
MediaItem.fromUri(audioUri)
|
||||
MediaItem.Builder()
|
||||
.setUri(audioUri)
|
||||
.apply {
|
||||
if (subtitle != null) setSubtitleConfigurations(listOf(subtitle))
|
||||
}
|
||||
.build()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -103,9 +103,7 @@ import com.google.android.exoplayer2.Player
|
||||
import com.google.android.exoplayer2.audio.AudioAttributes
|
||||
import com.google.android.exoplayer2.ext.cronet.CronetDataSource
|
||||
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory
|
||||
import com.google.android.exoplayer2.text.Cue.TEXT_SIZE_TYPE_ABSOLUTE
|
||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
|
||||
import com.google.android.exoplayer2.ui.CaptionStyleCompat
|
||||
import com.google.android.exoplayer2.ui.StyledPlayerView
|
||||
import com.google.android.exoplayer2.upstream.DefaultDataSource
|
||||
import com.google.android.exoplayer2.util.MimeTypes
|
||||
@ -816,7 +814,7 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions {
|
||||
|
||||
private fun prepareExoPlayerView() {
|
||||
exoPlayerView.apply {
|
||||
setShowSubtitleButton(true)
|
||||
setShowSubtitleButton(false)
|
||||
setShowNextButton(false)
|
||||
setShowPreviousButton(false)
|
||||
// controllerShowTimeoutMs = 1500
|
||||
@ -827,18 +825,7 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions {
|
||||
|
||||
playerBinding.exoProgress.setPlayer(exoPlayer)
|
||||
|
||||
applyCaptionStyle()
|
||||
}
|
||||
|
||||
private fun applyCaptionStyle() {
|
||||
val captionStyle = PlayerHelper.getCaptionStyle(requireContext())
|
||||
exoPlayerView.subtitleView?.apply {
|
||||
setApplyEmbeddedFontSizes(false)
|
||||
setFixedTextSize(TEXT_SIZE_TYPE_ABSOLUTE, PlayerHelper.captionsTextSize)
|
||||
if (!PlayerHelper.useSystemCaptionStyle) return
|
||||
setApplyEmbeddedStyles(captionStyle == CaptionStyleCompat.DEFAULT)
|
||||
setStyle(captionStyle)
|
||||
}
|
||||
PlayerHelper.applyCaptionsStyle(requireContext(), exoPlayerView.subtitleView)
|
||||
}
|
||||
|
||||
private fun localizedDate(date: String?): String? {
|
||||
|
@ -16,7 +16,9 @@ import com.github.libretube.api.obj.PipedStream
|
||||
import com.github.libretube.constants.PreferenceKeys
|
||||
import com.github.libretube.enums.AudioQuality
|
||||
import com.github.libretube.enums.PlayerEvent
|
||||
import com.google.android.exoplayer2.text.Cue
|
||||
import com.google.android.exoplayer2.ui.CaptionStyleCompat
|
||||
import com.google.android.exoplayer2.ui.SubtitleView
|
||||
import com.google.android.exoplayer2.video.VideoSize
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
@ -442,4 +444,18 @@ object PlayerHelper {
|
||||
)
|
||||
return actions
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the captions style according to the users preferences
|
||||
*/
|
||||
fun applyCaptionsStyle(context: Context, subtitleView: SubtitleView?) {
|
||||
val captionStyle = getCaptionStyle(context)
|
||||
subtitleView?.apply {
|
||||
setApplyEmbeddedFontSizes(false)
|
||||
setFixedTextSize(Cue.TEXT_SIZE_TYPE_ABSOLUTE, captionsTextSize)
|
||||
if (!useSystemCaptionStyle) return
|
||||
setApplyEmbeddedStyles(captionStyle == CaptionStyleCompat.DEFAULT)
|
||||
setStyle(captionStyle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user