fix(now-playing): трек/обложка не обновлялись — залипшее socket-значение

Корень: NowPlayingSocketClient копит трек по станции и не чистит; combine
предпочитал socket (socketMap[id] ?: restMap[id]). Если сокет один раз
прислал трек и отвалился, залипшее значение НАВСЕГДА затеняло свежий REST —
на открытом плеере трек/обложка не менялись (Radio Record и др.). Теперь
приоритет REST (он регулярно поллится), socket — фолбэк. Поллинг плеера
ускорен 10с→5с.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nk
2026-06-04 19:15:40 +03:00
parent 53cd1601dc
commit fabf780450
2 changed files with 7 additions and 3 deletions

View File

@@ -25,15 +25,19 @@ class NowPlayingRepositoryImpl @Inject constructor(
// Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда. // Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда.
// Оба источника ключуются по числовому id станции каталога (== station.id), // Оба источника ключуются по числовому id станции каталога (== station.id),
// поэтому матчатся однозначно — без коллизий по одинаковым названиям станций. // поэтому матчатся однозначно — без коллизий по одинаковым названиям станций.
// REST поллится регулярно и всегда свежий; socket-значения НАКАПЛИВАЮТСЯ и
// НЕ обновляются, если сокет отвалился — поэтому REST в приоритете, иначе
// залипшее socket-значение навсегда затеняет свежий трек (обложка/название
// переставали обновляться).
override fun getNowPlaying(stationId: Int): Flow<Track?> { override fun getNowPlaying(stationId: Int): Flow<Track?> {
return combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap -> return combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap ->
socketMap[stationId] ?: restMap[stationId] restMap[stationId] ?: socketMap[stationId]
} }
} }
override fun getAllNowPlaying(): Flow<Map<Int, Track>> = override fun getAllNowPlaying(): Flow<Map<Int, Track>> =
combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap -> combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap ->
restMap + socketMap socketMap + restMap
} }
override suspend fun refreshNowPlaying(): Result<Unit> { override suspend fun refreshNowPlaying(): Result<Unit> {

View File

@@ -123,7 +123,7 @@ class PlayerViewModel @Inject constructor(
launch { launch {
while (true) { while (true) {
nowPlayingRepository.refreshNowPlaying() nowPlayingRepository.refreshNowPlaying()
delay(10_000) delay(5_000) // чаще — трек/обложка на плеере обновляются быстрее
} }
} }
// Collect now playing for this station (API has priority: covers + accurate metadata) // Collect now playing for this station (API has priority: covers + accurate metadata)