Skip to content

Commit

Permalink
fix(Player): save watching position on episode skip
Browse files Browse the repository at this point in the history
  • Loading branch information
urFate committed May 12, 2024
1 parent 16c92f2 commit 826027d
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -202,12 +202,18 @@ fun ControlsScaffold(exoPlayer: ExoPlayer, model: PlayerViewModel) {
isLoaded = playbackState == Player.STATE_READY,
hasNextMediaItem = hasNextMediaItem,
hasPreviousMediaItem = hasPreviousMediaItem,
onSkipPrevious = { exoPlayer.seekToPrevious() },
onSkipPrevious = {
model.saveEpisodePosition(currentEpisode, exoPlayer.currentPosition)
exoPlayer.seekToPrevious()
},
onPlayToggle = {
exoPlayer.playWhenReady = !exoPlayer.isPlaying
coroutineScope.launch { hideControls(exoPlayer, model) }
},
onSkipNext = { exoPlayer.seekToNext() }
onSkipNext = {
model.saveEpisodePosition(currentEpisode, exoPlayer.currentPosition)
exoPlayer.seekToNext()
}
)
},
containerColor = Color(0x80000000)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class PlayerViewModel(
var orientationState by mutableIntStateOf(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
var currentQuality by mutableStateOf(live.shirabox.core.model.Quality.HD)
var playbackSpeed by mutableFloatStateOf(1F)
var coldStartSeekApplied by mutableStateOf(false)
val animeSkipTimestamps = mutableStateMapOf<Int, Pair<Long, Long>>()

fun saveEpisodePosition(episode: Int, time: Long) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
Expand All @@ -34,14 +32,6 @@ fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {

val coroutineScope = rememberCoroutineScope()

val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply { prepare() }
}

val startPosition by remember {
derivedStateOf { model.episodesPositions[model.episode] }
}

val defaultQualityState = model.defaultQualityPreferenceFlow(context)
.collectAsState(initial = DataStoreScheme.FIELD_DEFAULT_QUALITY.defaultValue)
val defaultQuality = remember(defaultQualityState) {
Expand All @@ -53,8 +43,11 @@ fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {
model.fetchEpisodePositions()
}

LaunchedEffect(startPosition) {
startPosition?.let {
LaunchedEffect(model.episodesPositions[model.episode]) {
val startPosition = model.episodesPositions[model.episode]

if(!model.coldStartSeekApplied) startPosition?.let {

exoPlayer.apply {
setMediaItems(model.playlist.map { video ->
// Choose stream quality using default value, otherwise use highest available
Expand All @@ -66,9 +59,11 @@ fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {

return@map MediaItem.fromUri(stream.value)
})
seekTo(model.startIndex, it)
exoPlayer.seekTo(model.startIndex, it)
playWhenReady = true
}

model.coldStartSeekApplied = true
}
}

Expand Down Expand Up @@ -109,16 +104,12 @@ fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {
}
) {
DisposableEffect(key1 = Unit) {
exoPlayer.addListener(
PlayerLoadingStateListener(coroutineScope, model)
)
onDispose {
exoPlayer.addListener(PlayerLoadingStateListener(coroutineScope, model))

onDispose {
// Save watching progress
model.saveEpisodePosition(
exoPlayer.currentMediaItemIndex.inc(),
exoPlayer.currentPosition
)
val currentEpisode = model.playlist[exoPlayer.currentMediaItemIndex].episode
model.saveEpisodePosition(currentEpisode, exoPlayer.currentPosition)

exoPlayer.release()
}
Expand All @@ -133,6 +124,7 @@ fun ShiraPlayer(exoPlayer: ExoPlayer, model: PlayerViewModel) {
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
keepScreenOn = true
useController = false
}
}
Expand Down

0 comments on commit 826027d

Please sign in to comment.