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

View File

@@ -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)