feat(charts): раздел «Чарты» (клиент) + детальная страница трека с графиком
- вкладка «Чарты» в навигации; экран: периоды (День/Неделя/Месяц/Всё), ранжированный список треков (ранг, обложка, проигрывания, тренд) - детальная карточка трека: метрики, график популярности (Canvas), лайк, кнопки музыкальных сервисов, кнопка «Текст песни» (ссылка на лицензированный Musixmatch — полный текст не встраиваем, авторское право) - ChartsRepository/LyricsRepository + эндпоинты charts/* в RadiolaApi (DTO) - превью-данные пока бэкенд не отдаёт charts (помечено TODO)
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
package com.radiola.domain.repository
|
||||
|
||||
import com.radiola.domain.model.ChartEntry
|
||||
import com.radiola.domain.model.ChartPeriod
|
||||
import com.radiola.domain.model.TrackStats
|
||||
|
||||
interface ChartsRepository {
|
||||
suspend fun getCharts(period: ChartPeriod): List<ChartEntry>
|
||||
suspend fun getTrackStats(trackId: String): TrackStats
|
||||
suspend fun setLiked(trackId: String, liked: Boolean)
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.radiola.domain.repository
|
||||
|
||||
// Тексты песен — авторское право. Показываем ссылку на лицензированный сервис,
|
||||
// полный текст не храним/не встраиваем.
|
||||
// Для сниппета подключить официальный Musixmatch API (с атрибуцией).
|
||||
interface LyricsRepository {
|
||||
/** URL поиска на лицензированном сервисе Musixmatch. */
|
||||
fun providerUrl(artist: String, song: String): String
|
||||
|
||||
/**
|
||||
* Лицензированный сниппет текста.
|
||||
* TODO: подключить официальный Musixmatch API (с атрибуцией) и вернуть реальный сниппет.
|
||||
*/
|
||||
suspend fun snippet(artist: String, song: String): String? = null
|
||||
}
|
||||
Reference in New Issue
Block a user