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:
@@ -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> {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user