fix(player): матч now-playing по имени станции (обложки DFM в плеере)
Плеер искал now-playing по числовому id станции, а у локальных станций (DFM) id не совпадает с каталожным → API-путь с обложкой не срабатывал, плеер падал на ICY из потока (без обложки). Теперь getNowPlaying матчит по id, затем по имени станции (как карточки). DFM-обложки появляются и в плеере. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -27,9 +27,16 @@ class NowPlayingRepositoryImpl @Inject constructor(
|
|||||||
// Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда.
|
// Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда.
|
||||||
// Оба источника ключуются по числовому id станции (как в каталоге),
|
// Оба источника ключуются по числовому id станции (как в каталоге),
|
||||||
// поэтому корректно сопоставляются с station.id плеера.
|
// поэтому корректно сопоставляются с station.id плеера.
|
||||||
override fun getNowPlaying(stationId: Int): Flow<Track?> {
|
override fun getNowPlaying(stationId: Int, stationName: String): Flow<Track?> {
|
||||||
return combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap ->
|
val nameKey = stationName.trim().lowercase()
|
||||||
socketMap[stationId] ?: restMap[stationId]
|
return combine(
|
||||||
|
socketClient.nowPlaying,
|
||||||
|
_nowPlaying,
|
||||||
|
_nowPlayingByName
|
||||||
|
) { socketMap, restMap, byName ->
|
||||||
|
// Числовой id (сокет/REST), затем фолбэк по имени — id локальных
|
||||||
|
// станций (DFM и др.) не совпадает с каталожным, имя совпадает.
|
||||||
|
socketMap[stationId] ?: restMap[stationId] ?: byName[nameKey]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import com.radiola.domain.model.Track
|
|||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
interface NowPlayingRepository {
|
interface NowPlayingRepository {
|
||||||
fun getNowPlaying(stationId: Int): Flow<Track?>
|
fun getNowPlaying(stationId: Int, stationName: String): Flow<Track?>
|
||||||
fun getAllNowPlaying(): Flow<Map<Int, Track>>
|
fun getAllNowPlaying(): Flow<Map<Int, Track>>
|
||||||
// Карта по lowercase-имени станции — для матчинга с карточками (id может не совпадать).
|
// Карта по lowercase-имени станции — для матчинга с карточками (id может не совпадать).
|
||||||
fun getAllNowPlayingByName(): Flow<Map<String, Track>>
|
fun getAllNowPlayingByName(): Flow<Map<String, Track>>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import javax.inject.Inject
|
|||||||
class GetNowPlayingUseCase @Inject constructor(
|
class GetNowPlayingUseCase @Inject constructor(
|
||||||
private val nowPlayingRepository: NowPlayingRepository
|
private val nowPlayingRepository: NowPlayingRepository
|
||||||
) {
|
) {
|
||||||
operator fun invoke(stationId: Int): Flow<Track?> {
|
operator fun invoke(stationId: Int, stationName: String): Flow<Track?> {
|
||||||
return nowPlayingRepository.getNowPlaying(stationId)
|
return nowPlayingRepository.getNowPlaying(stationId, stationName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class PlayerViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
// Collect now playing for this station (API has priority: covers + accurate metadata)
|
// Collect now playing for this station (API has priority: covers + accurate metadata)
|
||||||
launch {
|
launch {
|
||||||
getNowPlayingUseCase(station.id)
|
getNowPlayingUseCase(station.id, station.name)
|
||||||
.distinctUntilChanged()
|
.distinctUntilChanged()
|
||||||
.collect { track ->
|
.collect { track ->
|
||||||
if (track != null) {
|
if (track != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user