From fc9b23f62c4a8a85d0217babae299976bff456cb Mon Sep 17 00:00:00 2001 From: nk Date: Wed, 3 Jun 2026 10:59:59 +0300 Subject: [PATCH] =?UTF-8?q?fix(player):=20now-playing=20=D1=81=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=88=D0=B5=D0=B3=D0=BE=20=D0=B1=D1=8D=D0=BA=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D0=B0=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D1=81?= =?UTF-8?q?=D1=8B=D1=80=D0=BE=D0=B3=D0=BE=20Record-=D1=8D=D0=BD=D0=B4?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Record /stations/now использует id now-слотов, не совпадающие с id каталога, поэтому клиент не находил трек по station.id (трек/обложка не показывались). Теперь берём GET /now-playing с нашего бэка (корректный маппинг recordSync, ключ = id станции) -> плеер показывает название трека и обложку. --- .../com/radiola/data/remote/RadiolaApi.kt | 4 +++ .../data/remote/dto/BackendNowPlayingDto.kt | 13 ++++++++++ .../repository/NowPlayingRepositoryImpl.kt | 26 ++++++++++++------- 3 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/radiola/data/remote/dto/BackendNowPlayingDto.kt diff --git a/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt b/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt index 51fd50f..7a40e49 100644 --- a/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt +++ b/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt @@ -1,6 +1,7 @@ package com.radiola.data.remote import com.radiola.data.remote.dto.AuthResponseDto +import com.radiola.data.remote.dto.BackendNowPlayingDto import com.radiola.data.remote.dto.BackendStationDto import com.radiola.data.remote.dto.ChartsResponseDto import com.radiola.data.remote.dto.HistoryResponseDto @@ -25,6 +26,9 @@ interface RadiolaApi { @POST("auth/verify") suspend fun verifyMagicLink(@Body dto: MagicLinkVerifyDto): AuthResponseDto + @GET("now-playing") + suspend fun getNowPlaying(): List + @GET("users/me") suspend fun getMe(): JsonObject diff --git a/app/src/main/java/com/radiola/data/remote/dto/BackendNowPlayingDto.kt b/app/src/main/java/com/radiola/data/remote/dto/BackendNowPlayingDto.kt new file mode 100644 index 0000000..7d64178 --- /dev/null +++ b/app/src/main/java/com/radiola/data/remote/dto/BackendNowPlayingDto.kt @@ -0,0 +1,13 @@ +package com.radiola.data.remote.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +// Текущий трек станции с нашего бэкенда (ключ — числовой id станции каталога). +@Serializable +data class BackendNowPlayingDto( + @SerialName("stationId") val stationId: Int, + @SerialName("song") val song: String, + @SerialName("artist") val artist: String, + @SerialName("coverUrl") val coverUrl: String? = null +) 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 06db09c..a380a76 100644 --- a/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt +++ b/app/src/main/java/com/radiola/data/repository/NowPlayingRepositoryImpl.kt @@ -1,8 +1,7 @@ package com.radiola.data.repository import com.radiola.data.remote.NowPlayingSocketClient -import com.radiola.data.remote.RecordApi -import com.radiola.data.remote.ApiMapper.toDomain +import com.radiola.data.remote.RadiolaApi import com.radiola.domain.model.Track import com.radiola.domain.repository.NowPlayingRepository import kotlinx.coroutines.flow.Flow @@ -11,7 +10,7 @@ import kotlinx.coroutines.flow.combine import javax.inject.Inject class NowPlayingRepositoryImpl @Inject constructor( - private val api: RecordApi, + private val radiolaApi: RadiolaApi, private val socketClient: NowPlayingSocketClient ) : NowPlayingRepository { @@ -21,9 +20,9 @@ class NowPlayingRepositoryImpl @Inject constructor( socketClient.connect() } - // Объединяем два источника: сокет (реалтайм, приоритет) и REST-поллинг - // (refreshNowPlaying). Раньше REST-данные писались в _nowPlaying, но никем - // не читались — из-за этого трек и обложка не отображались. + // Сокет (реалтайм, приоритет) + REST-поллинг с нашего бэкенда. + // Оба источника ключуются по числовому id станции (как в каталоге), + // поэтому корректно сопоставляются с station.id плеера. override fun getNowPlaying(stationId: Int): Flow { return combine(socketClient.nowPlaying, _nowPlaying) { socketMap, restMap -> socketMap[stationId] ?: restMap[stationId] @@ -37,9 +36,18 @@ class NowPlayingRepositoryImpl @Inject constructor( override suspend fun refreshNowPlaying(): Result { return try { - val response = api.getNowPlaying() - val map = response.result.associate { it.id to it.toDomain() } - _nowPlaying.value = map + // Берём now-playing с нашего бэкенда: там корректный маппинг + // now-слотов Record -> id станций (recordSync). Сырой Record-эндпоинт + // использует id now-слотов, которые не совпадают с id каталога. + val list = radiolaApi.getNowPlaying() + _nowPlaying.value = list.associate { dto -> + dto.stationId to Track( + artist = dto.artist, + song = dto.song, + coverUrl = dto.coverUrl, + stationName = "" + ) + } Result.success(Unit) } catch (e: Exception) { Result.failure(e)