diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/player/Lyrics.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/player/Lyrics.kt index 6f6d1df..de21491 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/player/Lyrics.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/player/Lyrics.kt @@ -133,7 +133,7 @@ fun Lyrics( } } - KuGou.lyrics(mediaMetadata.artist?.toString() ?: "", mediaMetadata.title?.toString() ?: "", duration)?.map { + KuGou.lyrics(mediaMetadata.artist?.toString() ?: "", mediaMetadata.title?.toString() ?: "", duration / 1000)?.map { it?.value } } else { diff --git a/kugou/src/main/kotlin/it/vfsfitvnm/kugou/KuGou.kt b/kugou/src/main/kotlin/it/vfsfitvnm/kugou/KuGou.kt index 7be5e85..8daae42 100644 --- a/kugou/src/main/kotlin/it/vfsfitvnm/kugou/KuGou.kt +++ b/kugou/src/main/kotlin/it/vfsfitvnm/kugou/KuGou.kt @@ -52,14 +52,20 @@ object KuGou { suspend fun lyrics(artist: String, title: String, duration: Long): Result? { return runCatching { - for (info in searchSong(keyword(artist, title))) { - if (info.duration >= duration / 1000 - 2 && info.duration <= duration / 1000 + 2) { - searchLyrics(info.hash).firstOrNull()?.let { candidate -> + val keyword = keyword(artist, title) + + for (info in searchSong(keyword)) { + if (info.duration >= duration - 2 && info.duration <= duration + 2) { + searchLyricsByHash(info.hash).firstOrNull()?.let { candidate -> return@runCatching downloadLyrics(candidate.id, candidate.accessKey).normalize() } } } + searchLyricsByKeyword(keyword).firstOrNull()?.let { candidate -> + return@runCatching downloadLyrics(candidate.id, candidate.accessKey).normalize() + } + null }.recoverIfCancelled() } @@ -75,7 +81,7 @@ object KuGou { }.body().content.decodeBase64String().let(::Lyrics) } - private suspend fun searchLyrics(hash: String): List { + private suspend fun searchLyricsByHash(hash: String): List { return client.get("/search") { parameter("ver", 1) parameter("man", "yes") @@ -84,6 +90,15 @@ object KuGou { }.body().candidates } + private suspend fun searchLyricsByKeyword(keyword: String): List { + return client.get("/search") { + parameter("ver", 1) + parameter("man", "yes") + parameter("client", "mobi") + url.encodedParameters.append("keyword", keyword.encodeURLParameter(spaceToPlus = false)) + }.body().candidates + } + private suspend fun searchSong(keyword: String): List { return client.get("https://mobileservice.kugou.com/api/v3/search/song") { parameter("version", 9108)