Сохраняем прогресс просмотра и возобновляем с позиции

This commit is contained in:
2026-09-02 20:55:00 +03:00
parent 1b28760c6e
commit f656f43e10
9 changed files with 91 additions and 19 deletions
@@ -103,6 +103,7 @@ class HostConnection(
itemId = snapshot.itemId,
audioIndex = snapshot.audioIndex,
sentTs = System.currentTimeMillis(),
durationMs = snapshot.durationMs,
),
)
}
@@ -248,9 +249,9 @@ class HostConnection(
fun sendPlaybackPositionNow() {
if (transport == null) return
scope.launch {
val (positionMs, playing, itemId, audioIndex) =
val (positionMs, playing, itemId, audioIndex, durationMs) =
withContext(Dispatchers.Main) { movieController.playbackPosition() }
sendToHost(PlaybackPosition(positionMs, playing, itemId, audioIndex, sentTs = System.currentTimeMillis()))
sendToHost(PlaybackPosition(positionMs, playing, itemId, audioIndex, sentTs = System.currentTimeMillis(), durationMs = durationMs))
}
}
@@ -70,6 +70,8 @@ internal data class PlaybackSnapshot(
val playing: Boolean,
val itemId: String?,
val audioIndex: Int,
/** Длительность видео, мс; -1 = неизвестно (плеера нет / ещё не prepared). */
val durationMs: Long = -1L,
)
/**
@@ -239,10 +241,10 @@ class MovieController(private val context: Context) {
}
}
/** Снимок для PlaybackPosition (позиция, playing, itemId, audioIndex). Только с главного потока. */
/** Снимок для PlaybackPosition (позиция, playing, itemId, audioIndex, длительность). Только с главного потока. */
internal fun playbackPosition(): PlaybackSnapshot {
val player = _player ?: return PlaybackSnapshot(0L, false, contentId.itemId, contentId.audioIndex)
return PlaybackSnapshot(player.currentPosition, player.playWhenReady, contentId.itemId, contentId.audioIndex)
return PlaybackSnapshot(player.currentPosition, player.playWhenReady, contentId.itemId, contentId.audioIndex, player.duration)
}
/** Пауза при потере связи, если плеер играл. Только с главного потока. Возвращает, играл ли. */