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:
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user