Files
radiola-android/app/src/main/java/com/radiola/domain/model/Station.kt
nk 84c2b33473 perf(android): ленивый плеер записей, O(n) merge каталога, @Immutable, лог только в debug
- RecordingPlaybackController: ExoPlayer создаётся лениво (на первый play) и
  освобождается в stop() — раньше второй плеер висел в памяти всю сессию у каждого.
  Поллер позиции 500мс крутится только во время игры (был вечный 2 Гц main-loop).
- StationRepositoryImpl.refreshStations: merge каталога O(n) через apiById/apiByName
  индексы вместо .find на каждую станцию (было O(n²) ~700×700 на холодном старте).
  Убраны verbose Log.d-трейсы (оставлен Log.e/.w на ошибки).
- Track/Station/StreamQuality помечены @Immutable — read-only модели, иначе
  списки tags/qualities делали класс нестабильным → лишние рекомпозиции списков.
- HttpLoggingInterceptor только при BuildConfig.DEBUG (включён buildConfig feature):
  в релизе нет оверхеда на каждый запрос и утечки URL в logcat.
2026-06-06 17:13:48 +03:00

40 lines
1.5 KiB
Kotlin

package com.radiola.domain.model
import androidx.compose.runtime.Immutable
// @Immutable: модели read-only (заполняются один раз из БД/маппера и не мутируются).
// Список tags/qualities иначе делает класс «нестабильным» для Compose → лишние
// рекомпозиции списков станций. Помечаем явно — компилятор сможет пропускать.
@Immutable
data class Station(
val id: Int,
val name: String,
val prefix: String,
val streamUrl: String,
val coverUrl: String,
val genre: String,
val tags: List<String>,
val sortOrder: Int,
val source: String = "record",
// Доступные качества потока (битрейты). Пусто или один элемент — переключателя нет.
val qualities: List<StreamQuality> = emptyList()
)
/** Один вариант качества потока станции. */
@Immutable
data class StreamQuality(
val bitrate: Int, // kbps
val url: String,
val type: String // "aac" | "mp3"
) {
/** Человекочитаемая ступень качества по битрейту. */
val tierLabel: String
get() = when {
bitrate >= 256 -> "Максимальное"
bitrate >= 128 -> "Высокое"
bitrate >= 96 -> "Среднее"
bitrate >= 64 -> "Экономно"
else -> "Минимальное"
}
}