feat(lyrics): тексты песен внутри приложения через LRCLIB

- LrcLibApi (api/get + api/search, User-Agent), DI @Named(lrclib) Retrofit
- LyricsRepository.fetchLyrics -> LyricsResult (plain/synced/instrumental)
- LyricsViewModel + LyricsSheet (загрузка/инструментал/найдено/не найдено),
  прокрутка + атрибуция LRCLIB
- кнопка «Текст песни» открывает встроенный экран (плеер + деталь трека чартов),
  вместо ссылки в браузере
This commit is contained in:
nk
2026-06-03 11:47:00 +03:00
parent 5fd97d27fd
commit ba32973beb
9 changed files with 355 additions and 35 deletions

View File

@@ -1,15 +1,24 @@
package com.radiola.domain.repository
// Тексты песен — авторское право. Показываем ссылку на лицензированный сервис,
// полный текст не храним/не встраиваем.
// Для сниппета подключить официальный Musixmatch API (с атрибуцией).
/**
* Тексты песен предоставляются через публичный API LRCLIB (https://lrclib.net).
* LRCLIB — открытая база текстов без авторских ограничений (CC0 / community-maintained).
*/
interface LyricsRepository {
/** URL поиска на лицензированном сервисе Musixmatch. */
/** URL поиска-фолбэк (Яндекс). */
fun providerUrl(artist: String, song: String): String
/**
* Лицензированный сниппет текста.
* TODO: подключить официальный Musixmatch API (с атрибуцией) и вернуть реальный сниппет.
*/
suspend fun snippet(artist: String, song: String): String? = null
/** Загрузить текст трека через LRCLIB. null — трек не найден. */
suspend fun fetchLyrics(
artist: String,
song: String,
durationSec: Int? = null
): LyricsResult?
}
data class LyricsResult(
val plain: String?,
val synced: String?,
val instrumental: Boolean
)