fix(now-playing): матч текущего трека по id станции, а не по имени
Станции с одинаковым именем в разных сетях (напр. «Deep» у Record и DFM) показывали один и тот же трек — матч был по lowercase-имени. Каталожный id (== station.id) уникален и совпадает со stationId в /now-playing, поэтому матчим по id. Убран весь by-name путь (репозиторий, плеер, карточки). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -16,27 +16,16 @@ class NowPlayingRepositoryImpl @Inject constructor(
|
||||
|
||||
private val _nowPlaying = MutableStateFlow<Map<Int, Track>>(emptyMap())
|
||||
|
||||
// Карта по lowercase-имени станции: заполняется при REST-поллинге,
|
||||
// используется для матчинга карточек (id локальных станций может отличаться).
|
||||
private val _nowPlayingByName = MutableStateFlow<Map<String, Track>>(emptyMap())
|
||||
|
||||
init {
|
||||
socketClient.connect()
|
||||
}
|
||||
|
||||
// Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда.
|
||||
// Оба источника ключуются по числовому id станции (как в каталоге),
|
||||
// поэтому корректно сопоставляются с station.id плеера.
|
||||
override fun getNowPlaying(stationId: Int, stationName: String): Flow<Track?> {
|
||||
val nameKey = stationName.trim().lowercase()
|
||||
return combine(
|
||||
socketClient.nowPlaying,
|
||||
_nowPlaying,
|
||||
_nowPlayingByName
|
||||
) { socketMap, restMap, byName ->
|
||||
// Числовой id (сокет/REST), затем фолбэк по имени — id локальных
|
||||
// станций (DFM и др.) не совпадает с каталожным, имя совпадает.
|
||||
socketMap[stationId] ?: restMap[stationId] ?: byName[nameKey]
|
||||
// Оба источника ключуются по числовому id станции каталога (== station.id),
|
||||
// поэтому матчатся однозначно — без коллизий по одинаковым названиям станций.
|
||||
override fun getNowPlaying(stationId: Int): Flow<Track?> {
|
||||
return combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap ->
|
||||
socketMap[stationId] ?: restMap[stationId]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,13 +34,8 @@ class NowPlayingRepositoryImpl @Inject constructor(
|
||||
restMap + socketMap
|
||||
}
|
||||
|
||||
override fun getAllNowPlayingByName(): Flow<Map<String, Track>> = _nowPlayingByName
|
||||
|
||||
override suspend fun refreshNowPlaying(): Result<Unit> {
|
||||
return try {
|
||||
// Берём now-playing с нашего бэкенда: там корректный маппинг
|
||||
// now-слотов Record -> id станций (recordSync). Сырой Record-эндпоинт
|
||||
// использует id now-слотов, которые не совпадают с id каталога.
|
||||
val list = radiolaApi.getNowPlaying()
|
||||
_nowPlaying.value = list.associate { dto ->
|
||||
dto.stationId to Track(
|
||||
@@ -61,17 +45,6 @@ class NowPlayingRepositoryImpl @Inject constructor(
|
||||
stationName = dto.name
|
||||
)
|
||||
}
|
||||
// Параллельный индекс по имени — для матчинга карточек станций.
|
||||
_nowPlayingByName.value = list
|
||||
.filter { it.name.isNotBlank() }
|
||||
.associate { dto ->
|
||||
dto.name.trim().lowercase() to Track(
|
||||
artist = dto.artist,
|
||||
song = dto.song,
|
||||
coverUrl = dto.coverUrl,
|
||||
stationName = dto.name
|
||||
)
|
||||
}
|
||||
Result.success(Unit)
|
||||
} catch (e: Exception) {
|
||||
Result.failure(e)
|
||||
|
||||
Reference in New Issue
Block a user