diff --git a/app/src/main/java/com/radiola/data/local/LocalStationDataSource.kt b/app/src/main/java/com/radiola/data/local/LocalStationDataSource.kt index 3e2c002..03a35c6 100644 --- a/app/src/main/java/com/radiola/data/local/LocalStationDataSource.kt +++ b/app/src/main/java/com/radiola/data/local/LocalStationDataSource.kt @@ -29,16 +29,19 @@ class LocalStationDataSource @Inject constructor( .map { dto -> val group = groupMap[dto.groupId] val prefix = generatePrefix(dto.name) + // Определяем сеть: только станции Radio Record можно обогащать + // обложками из Record API. Остальные сети — свой источник. + val isRecord = dto.site?.contains("radiorecord", ignoreCase = true) == true Station( id = dto.id, name = dto.name, prefix = prefix, streamUrl = dto.stream!!, - coverUrl = group?.let { generateCoverUrl(it.name, dto.name) } ?: "", + coverUrl = "", genre = group?.name ?: "", tags = listOfNotNull(group?.name?.takeIf { it.isNotBlank() }), sortOrder = dto.id, - source = "local" + source = if (isRecord) "record" else "local" ) } } diff --git a/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt b/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt index 0bf042c..e857edd 100644 --- a/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt +++ b/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt @@ -46,10 +46,14 @@ class StationRepositoryImpl @Inject constructor( // нет prefix — поэтому сопоставляем сначала по id, затем по названию // (стабильный общий ключ), иначе обложки/потоки не подтягиваются. val merged = localStations.map { local -> - val apiStation = apiStations.find { it.id == local.id } - ?: apiStations.find { - it.name.trim().equals(local.name.trim(), ignoreCase = true) - } + // Обложки/потоки из Record API — только для станций сети Radio Record. + // Иначе чужим сетям (DFM, HitFM и т.д.) цеплялись бы обложки Record. + val apiStation = if (local.source == "record") { + apiStations.find { it.id == local.id } + ?: apiStations.find { + it.name.trim().equals(local.name.trim(), ignoreCase = true) + } + } else null if (apiStation != null) { val domain = apiStation.toDomain() local.copy( diff --git a/app/src/main/java/com/radiola/ui/components/StationCard.kt b/app/src/main/java/com/radiola/ui/components/StationCard.kt index 784fb07..7103647 100644 --- a/app/src/main/java/com/radiola/ui/components/StationCard.kt +++ b/app/src/main/java/com/radiola/ui/components/StationCard.kt @@ -15,6 +15,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalHapticFeedback @@ -66,12 +68,21 @@ fun StationCard( contentScale = ContentScale.Crop ) } else { - Icon( - Lucide.Radio, - contentDescription = null, - tint = colors.textMuted, - modifier = Modifier.align(Alignment.Center).size(34.dp) - ) + // Своя фирменная плитка станции (цвет из названия + инициалы), + // а не общий значок и не чужая обложка. + Box( + modifier = Modifier + .fillMaxSize() + .background(stationTileBrush(station.name)), + contentAlignment = Alignment.Center + ) { + Text( + text = stationInitials(station.name), + color = androidx.compose.ui.graphics.Color.White, + fontWeight = FontWeight.Black, + style = androidx.compose.material3.MaterialTheme.typography.headlineMedium + ) + } } Box( modifier = Modifier @@ -114,3 +125,22 @@ fun StationCard( } } } + +/** Инициалы станции для плитки-плейсхолдера (1–2 символа). */ +private fun stationInitials(name: String): String { + val words = name.trim().split(Regex("\\s+")).filter { it.isNotBlank() } + return when { + words.isEmpty() -> "?" + words.size == 1 -> words[0].take(2).uppercase() + else -> (words[0].take(1) + words[1].take(1)).uppercase() + } +} + +/** Детерминированный фирменный градиент плитки по названию станции. */ +private fun stationTileBrush(name: String): Brush { + val h = (name.hashCode().toLong() and 0xFFFFFFFFL) + val hue = (h % 360L).toFloat() + val c1 = Color.hsv(hue, 0.55f, 0.45f) + val c2 = Color.hsv((hue + 28f) % 360f, 0.6f, 0.30f) + return Brush.linearGradient(listOf(c1, c2)) +}