fix: Small change to native player prev/next

This commit is contained in:
PartyDonut 2025-10-14 22:57:03 +02:00
parent a99e869c08
commit 311b647286

View file

@ -5,6 +5,7 @@ import VideoPlayerApi
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.os.postDelayed
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.MimeTypes import androidx.media3.common.MimeTypes
import androidx.media3.common.Player import androidx.media3.common.Player
@ -18,6 +19,7 @@ import nl.jknaapen.fladder.utility.getAudioTracks
import nl.jknaapen.fladder.utility.getSubtitleTracks import nl.jknaapen.fladder.utility.getSubtitleTracks
import nl.jknaapen.fladder.utility.setInternalAudioTrack import nl.jknaapen.fladder.utility.setInternalAudioTrack
import nl.jknaapen.fladder.utility.setInternalSubtitleTrack import nl.jknaapen.fladder.utility.setInternalSubtitleTrack
import kotlin.time.Duration.Companion.seconds
class VideoPlayerImplementation( class VideoPlayerImplementation(
) : VideoPlayerApi { ) : VideoPlayerApi {
@ -36,53 +38,44 @@ class VideoPlayerImplementation(
} }
override fun open(url: String, play: Boolean) { override fun open(url: String, play: Boolean) {
try { Handler(Looper.getMainLooper()).postDelayed(delayInMillis = 1.seconds.inWholeMilliseconds) {
playbackData.value?.let { try {
VideoPlayerObject.setAudioTrackIndex(it.defaultAudioTrack.toInt(), true) playbackData.value?.let {
VideoPlayerObject.setSubtitleTrackIndex(it.defaultSubtrack.toInt(), true) VideoPlayerObject.setAudioTrackIndex(it.defaultAudioTrack.toInt(), true)
} VideoPlayerObject.setSubtitleTrackIndex(it.defaultSubtrack.toInt(), true)
}
val subTitles = playbackData.value?.subtitleTracks ?: listOf()
val mediaItem = MediaItem.Builder()
.setUri(url)
.setTag(playbackData.value?.title)
.setMediaId(playbackData.value?.id ?: "")
.setSubtitleConfigurations(
subTitles.filter { it.external && !it.url.isNullOrEmpty() }.map { sub ->
MediaItem.SubtitleConfiguration.Builder(sub.url!!.toUri())
.setMimeType(guessSubtitleMimeType(sub.url))
.setLanguage(sub.languageCode)
.setLabel(sub.name)
.build()
}
)
.build()
val subTitles = playbackData.value?.subtitleTracks ?: listOf()
val mediaItem = MediaItem.Builder().apply {
setUri(url)
setTag(playbackData.value?.title)
setMediaId(playbackData.value?.id ?: "")
setSubtitleConfigurations(
subTitles.filter { it.external && !it.url.isNullOrEmpty() }.map { sub ->
MediaItem.SubtitleConfiguration.Builder(sub.url!!.toUri())
.setMimeType(guessSubtitleMimeType(sub.url))
.setLanguage(sub.languageCode)
.setLabel(sub.name)
.build()
}
)
}.build()
//Ensure correct thread when calling from the main activity
Handler(Looper.getMainLooper()).post {
player?.stop() player?.stop()
player?.clearMediaItems() player?.clearMediaItems()
player?.setMediaItem(mediaItem) player?.setMediaItem(mediaItem)
player?.prepare() player?.prepare()
}
//Wait for player to be ready before "starting" playback val startPosition = playbackData.value?.startPosition ?: 0L
val listener = object : Player.Listener { if (startPosition > 0) {
override fun onPlaybackStateChanged(state: Int) { player?.seekTo(startPosition)
if (state == Player.STATE_READY) {
player?.removeListener(this) // remove listener immediately player?.playWhenReady = play
val startPosition = playbackData.value?.startPosition ?: 0L
if (startPosition > 0) {
player?.seekTo(startPosition)
}
player?.playWhenReady = play
}
} }
} catch (e: Exception) {
println("Error playing video $e")
} }
player?.addListener(listener)
} catch (e: Exception) {
println("Error playing video $e")
} }
} }
@ -163,4 +156,4 @@ fun ExoPlayer.properlySetSubAndAudioTracks(playableData: PlayableData) {
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
} }