From fabf7804502e93952855a91aa0bfdc93c0f019f7 Mon Sep 17 00:00:00 2001 From: nk Date: Thu, 4 Jun 2026 19:15:40 +0300 Subject: [PATCH] =?UTF-8?q?fix(now-playing):=20=D1=82=D1=80=D0=B5=D0=BA/?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D0=BE=D0=B6=D0=BA=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=8F=D0=BB=D0=B8=D1=81?= =?UTF-8?q?=D1=8C=20=E2=80=94=20=D0=B7=D0=B0=D0=BB=D0=B8=D0=BF=D1=88=D0=B5?= =?UTF-8?q?=D0=B5=20socket-=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Корень: NowPlayingSocketClient копит трек по станции и не чистит; combine предпочитал socket (socketMap[id] ?: restMap[id]). Если сокет один раз прислал трек и отвалился, залипшее значение НАВСЕГДА затеняло свежий REST — на открытом плеере трек/обложка не менялись (Radio Record и др.). Теперь приоритет REST (он регулярно поллится), socket — фолбэк. Поллинг плеера ускорен 10с→5с. Co-Authored-By: Claude Opus 4.8 --- .../radiola/data/repository/NowPlayingRepositoryImpl.kt | 8 ++++++-- .../main/java/com/radiola/ui/player/PlayerViewModel.kt | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt b/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt index 3f58398..133f021 100644 --- a/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt +++ b/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt @@ -25,15 +25,19 @@ class NowPlayingRepositoryImpl @Inject constructor( // Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда. // Оба источника ключуются по числовому id станции каталога (== station.id), // поэтому матчатся однозначно — без коллизий по одинаковым названиям станций. + // REST поллится регулярно и всегда свежий; socket-значения НАКАПЛИВАЮТСЯ и + // НЕ обновляются, если сокет отвалился — поэтому REST в приоритете, иначе + // залипшее socket-значение навсегда затеняет свежий трек (обложка/название + // переставали обновляться). override fun getNowPlaying(stationId: Int): Flow { return combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap -> - socketMap[stationId] ?: restMap[stationId] + restMap[stationId] ?: socketMap[stationId] } } override fun getAllNowPlaying(): Flow> = combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap -> - restMap + socketMap + socketMap + restMap } override suspend fun refreshNowPlaying(): Result { diff --git a/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt b/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt index 584f890..fa06577 100644 --- a/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt +++ b/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt @@ -123,7 +123,7 @@ class PlayerViewModel @Inject constructor( launch { while (true) { nowPlayingRepository.refreshNowPlaying() - delay(10_000) + delay(5_000) // чаще — трек/обложка на плеере обновляются быстрее } } // Collect now playing for this station (API has priority: covers + accurate metadata)