fix: Native player next/previous video on slow devices. (#532)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-10-14 18:37:05 +02:00 committed by GitHub
parent 660298c083
commit a99e869c08
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2,6 +2,8 @@ package nl.jknaapen.fladder.messengers
import PlayableData import PlayableData
import VideoPlayerApi import VideoPlayerApi
import android.os.Handler
import android.os.Looper
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.MimeTypes import androidx.media3.common.MimeTypes
@ -35,23 +37,18 @@ class VideoPlayerImplementation(
override fun open(url: String, play: Boolean) { override fun open(url: String, play: Boolean) {
try { try {
player?.stop()
player?.clearMediaItems()
playbackData.value?.let { playbackData.value?.let {
VideoPlayerObject.setAudioTrackIndex(it.defaultAudioTrack.toInt(), true) VideoPlayerObject.setAudioTrackIndex(it.defaultAudioTrack.toInt(), true)
VideoPlayerObject.setSubtitleTrackIndex(it.defaultSubtrack.toInt(), true) VideoPlayerObject.setSubtitleTrackIndex(it.defaultSubtrack.toInt(), true)
} }
val startPosition = playbackData.value?.startPosition ?: 0L
println("Loading video in native $url")
val subTitles = playbackData.value?.subtitleTracks ?: listOf() val subTitles = playbackData.value?.subtitleTracks ?: listOf()
val mediaItem = MediaItem.Builder().apply { val mediaItem = MediaItem.Builder().apply {
setUri(url) setUri(url)
setTag(playbackData.value?.title) setTag(playbackData.value?.title)
setMediaId(playbackData.value?.id ?: "") setMediaId(playbackData.value?.id ?: "")
setSubtitleConfigurations( setSubtitleConfigurations(
subTitles.filter { it.external && it.url?.isNotEmpty() == true }.map { sub -> subTitles.filter { it.external && !it.url.isNullOrEmpty() }.map { sub ->
MediaItem.SubtitleConfiguration.Builder(sub.url!!.toUri()) MediaItem.SubtitleConfiguration.Builder(sub.url!!.toUri())
.setMimeType(guessSubtitleMimeType(sub.url)) .setMimeType(guessSubtitleMimeType(sub.url))
.setLanguage(sub.languageCode) .setLanguage(sub.languageCode)
@ -61,9 +58,29 @@ class VideoPlayerImplementation(
) )
}.build() }.build()
player?.setMediaItem(mediaItem, startPosition) //Ensure correct thread when calling from the main activity
Handler(Looper.getMainLooper()).post {
player?.stop()
player?.clearMediaItems()
player?.setMediaItem(mediaItem)
player?.prepare() player?.prepare()
}
//Wait for player to be ready before "starting" playback
val listener = object : Player.Listener {
override fun onPlaybackStateChanged(state: Int) {
if (state == Player.STATE_READY) {
player?.removeListener(this) // remove listener immediately
val startPosition = playbackData.value?.startPosition ?: 0L
if (startPosition > 0) {
player?.seekTo(startPosition)
}
player?.playWhenReady = play player?.playWhenReady = play
}
}
}
player?.addListener(listener)
} catch (e: Exception) { } catch (e: Exception) {
println("Error playing video $e") println("Error playing video $e")
} }