From c78035a36ae1ae8a46f727759b692156bbdc8c25 Mon Sep 17 00:00:00 2001 From: LuftVerbot <97435834+LuftVerbot@users.noreply.github.com> Date: Mon, 5 Aug 2024 10:16:00 +0200 Subject: [PATCH] Update to latest echo & rework audio quality setting --- .github/workflows/build.yml | 5 +- app/build.gradle.kts | 2 +- .../echo/extension/DeezerApi.kt | 6 +- .../echo/extension/DeezerExtension.kt | 74 ++++++++++--------- 4 files changed, 47 insertions(+), 40 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d07e31..b3e2002 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,10 +45,9 @@ jobs: - name: Upload APK to Discord shell: bash env: - ROLE: ${{ secrets.DISCORD_PING_ROLE_ID }} WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} run: | - message=$(echo "<@&${{ env.ROLE }}> **Deezer Extension : ${{ env.VERSION }}**\n${{ env.COMMIT }}") + message=$(echo "@everyone **${{ env.VERSION }}**\n${{ env.COMMIT }}") curl -F "payload_json={\"content\":\"${message}\"}" \ - -F "echo_beta=@app/build/de-${{ env.VERSION }}.apk" \ + -F "file=@app/build/de-${{ env.VERSION }}.apk" \ ${{ env.WEBHOOK }} diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 817b78e..dac093d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -61,7 +61,7 @@ android { } dependencies { - val libVersion = "38e1df03f6" + val libVersion = "main-SNAPSHOT" compileOnly("com.github.brahmkshatriya:echo:$libVersion") implementation("com.squareup.okhttp3:okhttp:5.0.0-alpha.14") diff --git a/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt b/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt index 4fc089c..53dac0f 100644 --- a/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt +++ b/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerApi.kt @@ -326,17 +326,17 @@ class DeezerApi { json.decodeFromString(responseBody) } - suspend fun getMediaUrl(track: Track, useFlac: Boolean, use128: Boolean): JsonObject = withContext(Dispatchers.IO) { + suspend fun getMediaUrl(track: Track, quality: String): JsonObject = withContext(Dispatchers.IO) { val url = HttpUrl.Builder() .scheme("https") .host("dzmedia.fly.dev") .addPathSegment("get_url") .build() - val formats = if (use128) { + val formats = if (quality == "128") { arrayOf("MP3_128", "MP3_64", "MP3_MISC") } else { - if (useFlac) { + if (quality == "flac") { arrayOf("FLAC", "MP3_320", "MP3_128", "MP3_64", "MP3_MISC") } else { arrayOf("MP3_320", "MP3_128", "MP3_64", "MP3_MISC") diff --git a/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt b/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt index a120966..f79ae36 100644 --- a/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt +++ b/app/src/main/java/dev/brahmkshatriya/echo/extension/DeezerExtension.kt @@ -10,12 +10,11 @@ import dev.brahmkshatriya.echo.common.clients.PlaylistClient import dev.brahmkshatriya.echo.common.clients.SearchClient import dev.brahmkshatriya.echo.common.clients.ShareClient import dev.brahmkshatriya.echo.common.clients.TrackClient -import dev.brahmkshatriya.echo.common.exceptions.LoginRequiredException import dev.brahmkshatriya.echo.common.helpers.Page import dev.brahmkshatriya.echo.common.helpers.PagedData import dev.brahmkshatriya.echo.common.models.Album import dev.brahmkshatriya.echo.common.models.Artist -import dev.brahmkshatriya.echo.common.models.ExtensionType +import dev.brahmkshatriya.echo.common.models.ClientException import dev.brahmkshatriya.echo.common.models.MediaItemsContainer import dev.brahmkshatriya.echo.common.models.Playlist import dev.brahmkshatriya.echo.common.models.QuickSearchItem @@ -26,6 +25,7 @@ import dev.brahmkshatriya.echo.common.models.Tab import dev.brahmkshatriya.echo.common.models.Track import dev.brahmkshatriya.echo.common.models.User import dev.brahmkshatriya.echo.common.settings.Setting +import dev.brahmkshatriya.echo.common.settings.SettingList import dev.brahmkshatriya.echo.common.settings.SettingSwitch import dev.brahmkshatriya.echo.common.settings.Settings import kotlinx.coroutines.CoroutineScope @@ -52,18 +52,23 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie } override val settingItems: List = listOf( - SettingSwitch( - "Use FLAC", - "flac", - "Use FLAC if available (loading takes longer)", - false - ), - SettingSwitch( - "Use 128kbps", - "128", - "Use 128kbps(overrides FLAC option)", - false - ), + SettingList( + "Audio Quality", + "quality", + "Choose your prefered audio quality", + mutableListOf( + "FLAC", + "320kbps", + "128kbps" + + ), + mutableListOf( + "flac", + "320", + "128" + ), + 1 + ) ) private lateinit var settings: Settings @@ -90,12 +95,8 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie this.settings = settings } - private val useFlac - get() = settings.getBoolean("flac") ?: false - - private val use128 - get() = settings.getBoolean("128") ?: false - + private val quality + get() = settings.getString("quality") ?: "320" private val credentials: DeezerCredentials get() = DeezerCredentialsHolder.credentials ?: throw IllegalStateException("DeezerCredentials not initialized") @@ -117,7 +118,7 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie override suspend fun getHomeTabs() = listOf() override fun getHomeFeed(tab: Tab?): PagedData = PagedData.Continuous { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() val dataList = mutableListOf() val jObject = api.homePage() val resultObject = jObject["results"]!!.jsonObject @@ -184,7 +185,7 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie } override fun getLibraryFeed(tab: Tab?) = PagedData.Single { - if (arl.isEmpty() || arlExpired) throw loginRequiredException + if (arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() val tabId = tab?.id ?: "all" val list = when (tabId) { @@ -214,12 +215,12 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie } override suspend fun addTracksToPlaylist(playlist: Playlist, tracks: List, index: Int, new: List) { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() api.addToPlaylist(playlist, new) } override suspend fun createPlaylist(title: String, description: String?): Playlist { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() val jsonObject = api.createPlaylist(title, description) val id = jsonObject["results"]?.jsonPrimitive?.content ?: "" val playlist = Playlist( @@ -232,17 +233,17 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie } override suspend fun deletePlaylist(playlist: Playlist) { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() api.deletePlaylist(playlist.id) } override suspend fun editPlaylistMetadata(playlist: Playlist, title: String, description: String?) { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() api.updatePlaylist(playlist.id, title, description) } override suspend fun likeTrack(track: Track, liked: Boolean): Boolean { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() if(liked) { api.addFavoriteTrack(track.id) return true @@ -253,7 +254,7 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie } override suspend fun listEditablePlaylists(): List { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() val playlistList = mutableListOf() val jsonObject = api.getPlaylists() val resultObject = jsonObject["results"]!!.jsonObject @@ -271,14 +272,14 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie } override suspend fun moveTrackInPlaylist(playlist: Playlist, tracks: List, fromIndex: Int, toIndex: Int) { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() val idArray = tracks.map { it.id }.toTypedArray() val newIdArray = moveElement(idArray, fromIndex, toIndex) api.updatePlaylistOrder(playlist.id, newIdArray) } override suspend fun removeTracksFromPlaylist(playlist: Playlist, tracks: List, indexes: List) { - if(arl.isEmpty() || arlExpired) throw loginRequiredException + if(arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() api.removeFromPlaylist(playlist, tracks, indexes) } @@ -301,7 +302,7 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie private var oldSearch: Pair>? = null override fun searchFeed(query: String?, tab: Tab?) = PagedData.Single { - if (arl.isEmpty() || arlExpired) throw loginRequiredException + if (arl.isEmpty() || arlExpired) throw ClientException.LoginRequired() query ?: return@Single browseFeed() oldSearch?.takeIf { it.first == query && (tab == null || tab.id == "All") }?.second?.let { @@ -366,6 +367,10 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie return listOf(Tab("All", "All")) + tabs } + override suspend fun deleteSearchHistory(query: QuickSearchItem.SearchQueryItem) { + TODO("Not yet implemented") + } + //<============= Play =============> private val client = OkHttpClient() @@ -389,7 +394,7 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie val jsonObject = if (track.extras["FILESIZE_MP3_MISC"] != "0" && track.extras["FILESIZE_MP3_MISC"] != null) { api.getMP3MediaUrl(track) } else { - api.getMediaUrl(track, useFlac, use128) + api.getMediaUrl(track, quality) } val key = Utils.createBlowfishKey(track.id) @@ -580,7 +585,10 @@ class DeezerExtension : ExtensionClient, HomeFeedClient, TrackClient, SearchClie //<============= Login =============> - private val loginRequiredException = LoginRequiredException("deezer", "Deezer", ExtensionType.MUSIC) + override suspend fun getCurrentUser(): User { + val userList = api.makeUser() + return userList.first() + } override val loginWebViewInitialUrl = "https://www.deezer.com/login?redirect_type=page&redirect_link=%2Faccount%2F" .toRequest(mapOf(Pair("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")))