Skip to content

Commit

Permalink
Update to newest Echo
Browse files Browse the repository at this point in the history
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
  • Loading branch information
LuftVerbot committed Sep 17, 2024
1 parent d718dcb commit ae9550a
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 14 deletions.
36 changes: 36 additions & 0 deletions ext/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,24 @@ class DeezerApi {
return json.decodeFromString<JsonObject>(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",
Expand Down Expand Up @@ -599,6 +617,24 @@ class DeezerApi {
return json.decodeFromString<JsonObject>(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<Track>) = coroutineScope {
tracks.map { track ->
async(Dispatchers.IO) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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?) =
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ android.useAndroidX=true
kotlin.code.style=official
android.nonTransitiveRClass=true

libVersion=f2a7f86fbc
libVersion=4072cecaef

extType=music
extId=deezer
Expand Down

0 comments on commit ae9550a

Please sign in to comment.