From 72ecbae8666ab1f680cc14bc90063b4df18c5aac Mon Sep 17 00:00:00 2001 From: nk Date: Wed, 3 Jun 2026 14:36:39 +0300 Subject: [PATCH] =?UTF-8?q?fix(player):=20=D0=BC=D0=B0=D1=82=D1=87=20now-p?= =?UTF-8?q?laying=20=D0=BF=D0=BE=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D1=86=D0=B8=D0=B8=20(=D0=BE=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=BA=D0=B8=20DFM=20=D0=B2=20=D0=BF=D0=BB=D0=B5?= =?UTF-8?q?=D0=B5=D1=80=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Плеер искал now-playing по числовому id станции, а у локальных станций (DFM) id не совпадает с каталожным → API-путь с обложкой не срабатывал, плеер падал на ICY из потока (без обложки). Теперь getNowPlaying матчит по id, затем по имени станции (как карточки). DFM-обложки появляются и в плеере. Co-Authored-By: Claude Opus 4.8 --- .../data/repository/NowPlayingRepositoryImpl.kt | 13 ++++++++++--- .../domain/repository/NowPlayingRepository.kt | 2 +- .../radiola/domain/usecase/GetNowPlayingUseCase.kt | 4 ++-- .../java/com/radiola/ui/player/PlayerViewModel.kt | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt b/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt index 0256b21..554957c 100644 --- a/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt +++ b/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt @@ -27,9 +27,16 @@ class NowPlayingRepositoryImpl @Inject constructor( // Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда. // Оба источника ключуются по числовому id станции (как в каталоге), // поэтому корректно сопоставляются с station.id плеера. - override fun getNowPlaying(stationId: Int): Flow { - return combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap -> - socketMap[stationId] ?: restMap[stationId] + override fun getNowPlaying(stationId: Int, stationName: String): Flow { + val nameKey = stationName.trim().lowercase() + return combine( + socketClient.nowPlaying, + _nowPlaying, + _nowPlayingByName + ) { socketMap, restMap, byName -> + // Числовой id (сокет/REST), затем фолбэк по имени — id локальных + // станций (DFM и др.) не совпадает с каталожным, имя совпадает. + socketMap[stationId] ?: restMap[stationId] ?: byName[nameKey] } } diff --git a/app/src/main/java/com/radiola/domain/repository/NowPlayingRepository.kt b/app/src/main/java/com/radiola/domain/repository/NowPlayingRepository.kt index e3467c8..33de8d9 100644 --- a/app/src/main/java/com/radiola/domain/repository/NowPlayingRepository.kt +++ b/app/src/main/java/com/radiola/domain/repository/NowPlayingRepository.kt @@ -4,7 +4,7 @@ import com.radiola.domain.model.Track import kotlinx.coroutines.flow.Flow interface NowPlayingRepository { - fun getNowPlaying(stationId: Int): Flow + fun getNowPlaying(stationId: Int, stationName: String): Flow fun getAllNowPlaying(): Flow> // Карта по lowercase-имени станции — для матчинга с карточками (id может не совпадать). fun getAllNowPlayingByName(): Flow> diff --git a/app/src/main/java/com/radiola/domain/usecase/GetNowPlayingUseCase.kt b/app/src/main/java/com/radiola/domain/usecase/GetNowPlayingUseCase.kt index f0ac386..5846fa8 100644 --- a/app/src/main/java/com/radiola/domain/usecase/GetNowPlayingUseCase.kt +++ b/app/src/main/java/com/radiola/domain/usecase/GetNowPlayingUseCase.kt @@ -8,7 +8,7 @@ import javax.inject.Inject class GetNowPlayingUseCase @Inject constructor( private val nowPlayingRepository: NowPlayingRepository ) { - operator fun invoke(stationId: Int): Flow { - return nowPlayingRepository.getNowPlaying(stationId) + operator fun invoke(stationId: Int, stationName: String): Flow { + return nowPlayingRepository.getNowPlaying(stationId, stationName) } } diff --git a/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt b/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt index 16bf993..9198da3 100644 --- a/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt +++ b/app/src/main/java/com/radiola/ui/player/PlayerViewModel.kt @@ -98,7 +98,7 @@ class PlayerViewModel @Inject constructor( } // Collect now playing for this station (API has priority: covers + accurate metadata) launch { - getNowPlayingUseCase(station.id) + getNowPlayingUseCase(station.id, station.name) .distinctUntilChanged() .collect { track -> if (track != null) {