fix(app-phone): автоподхват восстанавливает контекст просмотра (слайдер/длительность)
После рестарта телефона автоподхват создавал звук, но state.currentItem оставался null — пульт не знал длительность: слайдер скрыт, «сколько всего» не показывалось. Теперь при успешном подхвате восстанавливаются currentItem (jellyfin.item по itemId), currentAudioIndex, mode=MOVIE, playing. Железо: «Акира · 05:21 / 2:04:28» + слайдер на месте.
This commit is contained in:
@@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.StateFlow
|
|||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
import kotlinx.coroutines.flow.collect
|
import kotlinx.coroutines.flow.collect
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import pw.binom.viewmate.core.GlassesMode
|
||||||
import pw.binom.viewmate.core.media.JellyfinClient
|
import pw.binom.viewmate.core.media.JellyfinClient
|
||||||
import pw.binom.viewmate.core.media.MirrorClient
|
import pw.binom.viewmate.core.media.MirrorClient
|
||||||
import pw.binom.viewmate.core.phone.PhoneActions
|
import pw.binom.viewmate.core.phone.PhoneActions
|
||||||
@@ -58,7 +59,7 @@ class PhoneApp : Application() {
|
|||||||
* PlaybackPosition с itemId+audioIndex, а audioSync не активен (телефон «не в курсе»).
|
* PlaybackPosition с itemId+audioIndex, а audioSync не активен (телефон «не в курсе»).
|
||||||
* Создаём аудио-плеер с позиции очков — как в DetailsScreen.onWatch.
|
* Создаём аудио-плеер с позиции очков — как в DetailsScreen.onWatch.
|
||||||
*/
|
*/
|
||||||
private suspend fun autostartAudio(itemId: String?, audioIndex: Int, positionMs: Long) {
|
private suspend fun autostartAudio(itemId: String?, audioIndex: Int, positionMs: Long, playing: Boolean) {
|
||||||
if (itemId == null || audioSync.isActive || itemId == lastFailedItemId) return
|
if (itemId == null || audioSync.isActive || itemId == lastFailedItemId) return
|
||||||
val mirrorFiles = runCatching { mirror.mirrorByItem(itemId) }.getOrNull()?.files
|
val mirrorFiles = runCatching { mirror.mirrorByItem(itemId) }.getOrNull()?.files
|
||||||
val source = resolveAudioSource(downloadManager, itemId, mirrorFiles, audioIndex)
|
val source = resolveAudioSource(downloadManager, itemId, mirrorFiles, audioIndex)
|
||||||
@@ -66,6 +67,13 @@ class PhoneApp : Application() {
|
|||||||
lastFailedItemId = null
|
lastFailedItemId = null
|
||||||
audioSync.play(source, positionMs)
|
audioSync.play(source, positionMs)
|
||||||
log("audio", "автоподхват звука: itemId=$itemId idx=$audioIndex pos=$positionMs")
|
log("audio", "автоподхват звука: itemId=$itemId idx=$audioIndex pos=$positionMs")
|
||||||
|
val item = runCatching { jellyfin.item(userId.value, itemId) }.getOrNull()
|
||||||
|
if (item != null) {
|
||||||
|
state.currentItem = item
|
||||||
|
state.currentAudioIndex = audioIndex
|
||||||
|
state.mode = GlassesMode.MOVIE
|
||||||
|
state.playing = playing
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
log("audio", "автоподхват звука не удался: itemId=$itemId idx=$audioIndex (нет источника)")
|
log("audio", "автоподхват звука не удался: itemId=$itemId idx=$audioIndex (нет источника)")
|
||||||
lastFailedItemId = itemId
|
lastFailedItemId = itemId
|
||||||
@@ -84,7 +92,7 @@ class PhoneApp : Application() {
|
|||||||
// + автоподхват звука (очки играют после рестарта телефона, audioSync не активен)
|
// + автоподхват звука (очки играют после рестарта телефона, audioSync не активен)
|
||||||
server.hub.onPlaybackPosition = { positionMs, playing, itemId, audioIndex ->
|
server.hub.onPlaybackPosition = { positionMs, playing, itemId, audioIndex ->
|
||||||
audioSync.sync(positionMs, playing)
|
audioSync.sync(positionMs, playing)
|
||||||
scope.launch { autostartAudio(itemId, audioIndex, positionMs) }
|
scope.launch { autostartAudio(itemId, audioIndex, positionMs, playing) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// автоматика обрыва связи: потеря → пауза, восстановление → продолжить с того же места
|
// автоматика обрыва связи: потеря → пауза, восстановление → продолжить с того же места
|
||||||
|
|||||||
Reference in New Issue
Block a user