From ae9550abb48a0a51a75e86be22559fe9c1a839b8 Mon Sep 17 00:00:00 2001 From: LuftVerbot <97435834+LuftVerbot@users.noreply.github.com> Date: Tue, 17 Sep 2024 21:16:19 +0200 Subject: [PATCH] Update to newest Echo This update also includes the logic to add Albums/Playlists as favorite to your deezer library. But as of now it's currently broken in echo so I wouldn't use it --- .../echo/extension/DeezerApi.kt | 36 +++++++++ .../echo/extension/DeezerExtension.kt | 81 ++++++++++++++++--- gradle.properties | 2 +- 3 files changed, 105 insertions(+), 14 deletions(-) diff --git a/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt b/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt index c9a4385..99e19d2 100644 --- a/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt +++ b/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt @@ -546,6 +546,24 @@ class DeezerApi { return json.decodeFromString(jsonData) } + suspend fun addFavoriteAlbum(id: String) { + callApi( + method = "album.addFavorite", + params = buildJsonObject { + put("ALB_ID", id) + } + ) + } + + suspend fun removeFavoriteAlbum(id: String) { + callApi( + method = "album.deleteFavorite", + params = buildJsonObject { + put("ALB_ID", id) + } + ) + } + suspend fun show(album: Album): JsonObject { val jsonData = callApi( method = "deezer.pageShow", @@ -599,6 +617,24 @@ class DeezerApi { return json.decodeFromString(jsonData) } + suspend fun addFavoritePlaylist(id: String) { + callApi( + method = "playlist.addFavorite", + params = buildJsonObject { + put("PARENT_PLAYLIST_ID", id) + } + ) + } + + suspend fun removeFavoritePlaylist(id: String) { + callApi( + method = "playlist.deleteFavorite", + params = buildJsonObject { + put("PARENT_PLAYLIST_ID", id) + } + ) + } + suspend fun addToPlaylist(playlist: Playlist, tracks: List) = coroutineScope { tracks.map { track -> async(Dispatchers.IO) { diff --git a/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt b/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt index b1dc50b..a06c064 100644 --- a/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt +++ b/ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt @@ -9,7 +9,9 @@ import dev.brahmkshatriya.echo.common.clients.LibraryClient import dev.brahmkshatriya.echo.common.clients.LoginClient import dev.brahmkshatriya.echo.common.clients.LyricsClient import dev.brahmkshatriya.echo.common.clients.PlaylistClient +import dev.brahmkshatriya.echo.common.clients.PlaylistEditClient import dev.brahmkshatriya.echo.common.clients.RadioClient +import dev.brahmkshatriya.echo.common.clients.SaveToLibraryClient import dev.brahmkshatriya.echo.common.clients.SearchClient import dev.brahmkshatriya.echo.common.clients.ShareClient import dev.brahmkshatriya.echo.common.clients.TrackClient @@ -61,7 +63,8 @@ import java.util.Locale class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, RadioClient, SearchClient, AlbumClient, ArtistClient, ArtistFollowClient, PlaylistClient, LyricsClient, ShareClient, LoginClient.WebView.Cookie, - LoginClient.UsernamePassword, LoginClient.CustomTextInput, LibraryClient { + LoginClient.UsernamePassword, LoginClient.CustomTextInput, LibraryClient, PlaylistEditClient, + SaveToLibraryClient { private val json = Json { isLenient = true; ignoreUnknownKeys = true } private val client = OkHttpClient() @@ -322,6 +325,62 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, RadioClien api.removeFromPlaylist(playlist, tracks, indexes) } + override suspend fun isSavedToLibrary(mediaItem: EchoMediaItem): Boolean { + suspend fun isItemSaved( + getItems: suspend () -> JsonObject, + idKey: String, + itemId: String + ): Boolean { + val dataArray = getItems()["results"]?.jsonObject + ?.get("TAB")?.jsonObject + ?.values?.firstOrNull()?.jsonObject + ?.get("data")?.jsonArray ?: return false + + return dataArray.any { item -> + val id = item.jsonObject[idKey]?.jsonPrimitive?.content + id == itemId + } + } + + return when (mediaItem) { + is EchoMediaItem.Lists.AlbumItem -> { + isItemSaved(api::getAlbums, "ALB_ID", mediaItem.album.id) + } + is EchoMediaItem.Lists.PlaylistItem -> { + isItemSaved(api::getPlaylists, "PLAYLIST_ID", mediaItem.playlist.id) + } + else -> false + } + } + + override suspend fun removeFromLibrary(mediaItem: EchoMediaItem) { + when(mediaItem) { + is EchoMediaItem.Lists.AlbumItem -> { + api.removeFavoriteAlbum(mediaItem.album.id) + } + + is EchoMediaItem.Lists.PlaylistItem -> { + api.removeFavoritePlaylist(mediaItem.playlist.id) + } + + else -> {} + } + } + + override suspend fun saveToLibrary(mediaItem: EchoMediaItem) { + when(mediaItem) { + is EchoMediaItem.Lists.AlbumItem -> { + api.addFavoriteAlbum(mediaItem.album.id) + } + + is EchoMediaItem.Lists.PlaylistItem -> { + api.addFavoriteAlbum(mediaItem.playlist.id) + } + + else -> {} + } + } + //<============= Search =============> override suspend fun quickSearch(query: String?) = @@ -903,19 +962,15 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, RadioClien } private suspend fun isFollowingArtist(id: String): Boolean { - val artObject = api.getArtists() - val resultObject = artObject["results"]!!.jsonObject - val tabObject = resultObject["TAB"]!!.jsonObject - val artistsObject = tabObject["artists"]!!.jsonObject - val dataArray = artistsObject["data"]!!.jsonArray - var isFollowing = false - dataArray.map { item -> - val artistId = item.jsonObject["ART_ID"]?.jsonPrimitive?.content ?: "" - if(artistId.contains(id)) { - isFollowing = true - } + val dataArray = api.getArtists()["results"]?.jsonObject + ?.get("TAB")?.jsonObject + ?.get("artists")?.jsonObject + ?.get("data")?.jsonArray ?: return false + + return dataArray.any { item -> + val artistId = item.jsonObject["ART_ID"]?.jsonPrimitive?.content + artistId == id } - return isFollowing } override suspend fun followArtist(artist: Artist): Boolean { diff --git a/gradle.properties b/gradle.properties index da1bd2d..a7496ff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ android.useAndroidX=true kotlin.code.style=official android.nonTransitiveRClass=true -libVersion=f2a7f86fbc +libVersion=4072cecaef extType=music extId=deezer