feat(covers): клиентское обогащение обложек через iTunes (обход бана сервера)

Серверный IP забанен Apple (iTunes search 429), а Deezer из РФ пуст — обложки
перестали наливаться. Теперь iTunes-поиск делает КЛИЕНТ (его IP не забанен):
для now-playing-треков без обложки ищет арт в iTunes и шлёт ССЫЛКУ на наш
бэкенд (POST /covers/submit), сервер качает её (CDN из РФ доступен) и кладёт
WebP — дальше обложка приходит всем через /now-playing. Дедуп по треку +
троттлинг 1.5с (CoverEnrichmentManager). Сервер: host-whitelist (SSRF),
идемпотентность (first-write-wins).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nk
2026-06-04 16:59:32 +03:00
parent 4612a8f33c
commit 4a33aa6fb5
6 changed files with 145 additions and 1 deletions

View File

@@ -1,5 +1,6 @@
package com.radiola.data.repository
import com.radiola.data.remote.CoverEnrichmentManager
import com.radiola.data.remote.NowPlayingSocketClient
import com.radiola.data.remote.RadiolaApi
import com.radiola.domain.model.Track
@@ -11,7 +12,8 @@ import javax.inject.Inject
class NowPlayingRepositoryImpl @Inject constructor(
private val radiolaApi: RadiolaApi,
private val socketClient: NowPlayingSocketClient
private val socketClient: NowPlayingSocketClient,
private val coverEnrichment: CoverEnrichmentManager
) : NowPlayingRepository {
private val _nowPlaying = MutableStateFlow<Map<Int, Track>>(emptyMap())
@@ -45,6 +47,8 @@ class NowPlayingRepositoryImpl @Inject constructor(
stationName = dto.name
)
}
// Треки без обложки — обогащаем через iTunes с устройства (наш IP забанен).
coverEnrichment.enqueue(_nowPlaying.value.values)
Result.success(Unit)
} catch (e: Exception) {
Result.failure(e)