2021-07-12 10:14:26 +02:00
|
|
|
package audio.funkwhale.ffa.utils
|
2019-08-19 16:50:33 +02:00
|
|
|
|
2020-06-13 16:09:48 +02:00
|
|
|
import com.google.android.exoplayer2.offline.Download
|
2019-08-19 16:50:33 +02:00
|
|
|
import com.preference.PowerPreference
|
|
|
|
|
2020-06-21 13:36:42 +02:00
|
|
|
data class User(
|
|
|
|
val full_username: String
|
|
|
|
)
|
|
|
|
|
2019-08-19 16:50:33 +02:00
|
|
|
sealed class CacheItem<D : Any>(val data: List<D>)
|
|
|
|
class ArtistsCache(data: List<Artist>) : CacheItem<Artist>(data)
|
|
|
|
class AlbumsCache(data: List<Album>) : CacheItem<Album>(data)
|
|
|
|
class TracksCache(data: List<Track>) : CacheItem<Track>(data)
|
|
|
|
class PlaylistsCache(data: List<Playlist>) : CacheItem<Playlist>(data)
|
|
|
|
class PlaylistTracksCache(data: List<PlaylistTrack>) : CacheItem<PlaylistTrack>(data)
|
2020-05-30 21:16:28 +02:00
|
|
|
class RadiosCache(data: List<Radio>) : CacheItem<Radio>(data)
|
2019-10-23 20:21:18 +02:00
|
|
|
class FavoritedCache(data: List<Int>) : CacheItem<Int>(data)
|
2019-08-19 16:50:33 +02:00
|
|
|
class QueueCache(data: List<Track>) : CacheItem<Track>(data)
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
abstract class OtterResponse<D : Any> {
|
2019-08-19 16:50:33 +02:00
|
|
|
abstract val count: Int
|
|
|
|
abstract val next: String?
|
|
|
|
|
|
|
|
abstract fun getData(): List<D>
|
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class UserResponse(override val count: Int, override val next: String?, val results: List<Artist>) : OtterResponse<Artist>() {
|
2019-10-23 20:21:18 +02:00
|
|
|
override fun getData() = results
|
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class ArtistsResponse(override val count: Int, override val next: String?, val results: List<Artist>) : OtterResponse<Artist>() {
|
2019-08-19 16:50:33 +02:00
|
|
|
override fun getData() = results
|
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class AlbumsResponse(override val count: Int, override val next: String?, val results: AlbumList) : OtterResponse<Album>() {
|
2019-08-19 16:50:33 +02:00
|
|
|
override fun getData() = results
|
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class TracksResponse(override val count: Int, override val next: String?, val results: List<Track>) : OtterResponse<Track>() {
|
2019-08-19 16:50:33 +02:00
|
|
|
override fun getData() = results
|
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class FavoritedResponse(override val count: Int, override val next: String?, val results: List<Favorited>) : OtterResponse<Int>() {
|
2019-10-23 20:21:18 +02:00
|
|
|
override fun getData() = results.map { it.track }
|
2019-08-19 16:50:33 +02:00
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class PlaylistsResponse(override val count: Int, override val next: String?, val results: List<Playlist>) : OtterResponse<Playlist>() {
|
2019-08-19 16:50:33 +02:00
|
|
|
override fun getData() = results
|
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class PlaylistTracksResponse(override val count: Int, override val next: String?, val results: List<PlaylistTrack>) : OtterResponse<PlaylistTrack>() {
|
2019-08-19 16:50:33 +02:00
|
|
|
override fun getData() = results
|
|
|
|
}
|
|
|
|
|
2020-07-10 20:40:18 +02:00
|
|
|
data class RadiosResponse(override val count: Int, override val next: String?, val results: List<Radio>) : OtterResponse<Radio>() {
|
2020-05-30 21:16:28 +02:00
|
|
|
override fun getData() = results
|
|
|
|
}
|
|
|
|
|
2020-08-08 14:51:39 +02:00
|
|
|
data class Covers(val urls: CoverUrls)
|
|
|
|
data class CoverUrls(val original: String)
|
2019-08-19 16:50:33 +02:00
|
|
|
|
|
|
|
typealias AlbumList = List<Album>
|
|
|
|
|
2020-05-29 13:19:28 +02:00
|
|
|
interface SearchResult {
|
|
|
|
fun cover(): String?
|
|
|
|
fun title(): String
|
|
|
|
fun subtitle(): String
|
|
|
|
}
|
|
|
|
|
2019-08-19 16:50:33 +02:00
|
|
|
data class Album(
|
|
|
|
val id: Int,
|
|
|
|
val artist: Artist,
|
|
|
|
val title: String,
|
2020-08-08 14:51:39 +02:00
|
|
|
val cover: Covers?,
|
2020-07-08 14:08:35 +02:00
|
|
|
val release_date: String?
|
2020-05-29 13:19:28 +02:00
|
|
|
) : SearchResult {
|
2019-08-19 16:50:33 +02:00
|
|
|
data class Artist(val name: String)
|
2020-05-29 13:19:28 +02:00
|
|
|
|
2020-08-08 14:51:39 +02:00
|
|
|
override fun cover() = cover?.urls?.original
|
2020-05-29 13:19:28 +02:00
|
|
|
override fun title() = title
|
|
|
|
override fun subtitle() = artist.name
|
2019-08-19 16:50:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
data class Artist(
|
|
|
|
val id: Int,
|
|
|
|
val name: String,
|
|
|
|
val albums: List<Album>?
|
2020-05-29 13:19:28 +02:00
|
|
|
) : SearchResult {
|
2019-08-19 16:50:33 +02:00
|
|
|
data class Album(
|
|
|
|
val title: String,
|
2020-08-08 14:51:39 +02:00
|
|
|
val cover: Covers?
|
2019-08-19 16:50:33 +02:00
|
|
|
)
|
2020-05-29 13:19:28 +02:00
|
|
|
|
2020-08-08 14:51:39 +02:00
|
|
|
override fun cover(): String? = albums?.getOrNull(0)?.cover?.urls?.original
|
2020-05-29 13:19:28 +02:00
|
|
|
override fun title() = name
|
|
|
|
override fun subtitle() = "Artist"
|
2019-08-19 16:50:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
data class Track(
|
2020-07-10 20:25:35 +02:00
|
|
|
val id: Int = 0,
|
2019-08-19 16:50:33 +02:00
|
|
|
val title: String,
|
|
|
|
val artist: Artist,
|
2020-07-11 21:01:09 +02:00
|
|
|
val album: Album?,
|
2020-09-01 18:25:10 +02:00
|
|
|
val disc_number: Int = 0,
|
2020-07-10 20:25:35 +02:00
|
|
|
val position: Int = 0,
|
|
|
|
val uploads: List<Upload> = listOf(),
|
|
|
|
val copyright: String? = null,
|
|
|
|
val license: String? = null
|
2020-05-29 13:19:28 +02:00
|
|
|
) : SearchResult {
|
2019-08-19 16:50:33 +02:00
|
|
|
var current: Boolean = false
|
|
|
|
var favorite: Boolean = false
|
2020-06-20 15:42:10 +02:00
|
|
|
var cached: Boolean = false
|
2020-06-13 17:44:50 +02:00
|
|
|
var downloaded: Boolean = false
|
2019-08-19 16:50:33 +02:00
|
|
|
|
2020-07-10 20:25:35 +02:00
|
|
|
companion object {
|
|
|
|
fun fromDownload(download: DownloadInfo): Track = Track(
|
|
|
|
id = download.id,
|
|
|
|
title = download.title,
|
|
|
|
artist = Artist(0, download.artist, listOf()),
|
2020-08-08 14:51:39 +02:00
|
|
|
album = Album(0, Album.Artist(""), "", Covers(CoverUrls("")), ""),
|
2020-07-10 20:25:35 +02:00
|
|
|
uploads = listOf(Upload(download.contentId, 0, 0))
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2019-08-19 16:50:33 +02:00
|
|
|
data class Upload(
|
|
|
|
val listen_url: String,
|
|
|
|
val duration: Int,
|
|
|
|
val bitrate: Int
|
|
|
|
)
|
|
|
|
|
|
|
|
override fun equals(other: Any?): Boolean {
|
|
|
|
return when (other) {
|
|
|
|
is Track -> other.id == id
|
|
|
|
else -> false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun bestUpload(): Upload? {
|
|
|
|
if (uploads.isEmpty()) return null
|
|
|
|
|
|
|
|
return when (PowerPreference.getDefaultFile().getString("media_cache_quality")) {
|
2021-06-29 09:37:36 +02:00
|
|
|
"quality" -> uploads.maxByOrNull { it.bitrate } ?: uploads[0]
|
|
|
|
"size" -> uploads.minByOrNull { it.bitrate } ?: uploads[0]
|
|
|
|
else -> uploads.maxByOrNull { it.bitrate } ?: uploads[0]
|
2019-08-19 16:50:33 +02:00
|
|
|
}
|
|
|
|
}
|
2020-05-29 13:19:28 +02:00
|
|
|
|
2020-08-08 14:51:39 +02:00
|
|
|
override fun cover() = album?.cover?.urls?.original
|
2020-05-29 13:19:28 +02:00
|
|
|
override fun title() = title
|
|
|
|
override fun subtitle() = artist.name
|
2019-08-19 16:50:33 +02:00
|
|
|
}
|
|
|
|
|
2019-10-23 20:21:18 +02:00
|
|
|
data class Favorited(val track: Int)
|
2019-08-19 16:50:33 +02:00
|
|
|
|
|
|
|
data class Playlist(
|
|
|
|
val id: Int,
|
|
|
|
val name: String,
|
|
|
|
val album_covers: List<String>,
|
|
|
|
val tracks_count: Int,
|
|
|
|
val duration: Int
|
|
|
|
)
|
|
|
|
|
2020-05-30 21:16:28 +02:00
|
|
|
data class PlaylistTrack(val track: Track)
|
|
|
|
|
|
|
|
data class Radio(
|
|
|
|
val id: Int,
|
2020-06-01 14:38:50 +02:00
|
|
|
var radio_type: String,
|
2020-05-30 21:16:28 +02:00
|
|
|
val name: String,
|
2020-06-21 13:36:42 +02:00
|
|
|
val description: String,
|
|
|
|
var related_object_id: String? = null
|
2020-06-13 16:09:48 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
data class DownloadInfo(
|
2020-06-13 17:44:50 +02:00
|
|
|
val id: Int,
|
|
|
|
val contentId: String,
|
2020-06-13 16:09:48 +02:00
|
|
|
val title: String,
|
|
|
|
val artist: String,
|
2020-06-24 14:54:13 +02:00
|
|
|
var download: Download?
|
2021-07-02 13:55:49 +02:00
|
|
|
)
|