From 7ce15cadedc129258ec7a91cb53836006e1a5894 Mon Sep 17 00:00:00 2001 From: she11sh0cked Date: Tue, 19 May 2020 19:29:42 +0200 Subject: [PATCH] Improve recommendations (#14) * Improve anilist recommendations by matching synonyms; Some bug fixes related to anilist * Fix formatting * Sort myanimelist results by result.title matching search.title * Throw an exception if the result is not the manga we searched Co-authored-by: she11sh0cked --- .../browse/source/browse/RecommendsPager.kt | 77 ++++++++++++++----- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/RecommendsPager.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/RecommendsPager.kt index a51933d26..e5e1f7d18 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/RecommendsPager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/RecommendsPager.kt @@ -7,6 +7,7 @@ import com.github.salomonbrys.kotson.jsonObject import com.github.salomonbrys.kotson.nullString import com.github.salomonbrys.kotson.obj import com.github.salomonbrys.kotson.string +import com.google.gson.JsonArray import com.google.gson.JsonParser import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.network.asObservableSuccess @@ -29,6 +30,13 @@ open class RecommendsPager( ) : Pager() { private val client = OkHttpClient.Builder().build() + private fun countOccurance(array: JsonArray, search: String): Int { + return array.count { + val synonym = it.string + synonym.contains(search, true) + } + } + private fun myAnimeList(): Observable>? { fun getId(): Observable { val endpoint = @@ -54,8 +62,16 @@ open class RecommendsPager( } val response = JsonParser.parseString(responseBody).obj val results = response["results"].array - val firstResult = results[0].obj - val id = firstResult["mal_id"].string + .sortedBy { + val title = it["title"].string + title.contains(manga.title, true) + } + val result = results.last() + val title = result["title"].string + if (!title.contains(manga.title, true)) { + throw Exception("Not found") + } + val id = result["mal_id"].string if (id.isEmpty()) { throw Exception("Not found") } @@ -104,22 +120,27 @@ open class RecommendsPager( val query = """ { - Media(search: "$manga.title", type: MANGA) { - title{ - romaji - english - native - } - recommendations { - edges { - node { - mediaRecommendation { - siteUrl - title { - romaji - } - coverImage { - large + Page { + media(search: "${manga.title}", type: MANGA) { + title { + romaji + english + native + } + synonyms + recommendations { + edges { + node { + mediaRecommendation { + siteUrl + title { + romaji + english + native + } + coverImage { + large + } } } } @@ -148,8 +169,24 @@ open class RecommendsPager( } val response = JsonParser.parseString(responseBody).obj val data = response["data"]!!.obj - val media = data["Media"].obj - val recommendations = media["recommendations"].obj + val page = data["Page"].obj + val media = page["media"].array + val results = media.sortedBy { + val synonyms = it["synonyms"].array + countOccurance(synonyms, manga.title) + } + val result = results.last() + val title = result["title"].obj + val synonyms = result["synonyms"].array + if ( + title["romaji"].nullString?.contains("", true) != true && + title["english"].nullString?.contains("", true) != true && + title["native"].nullString?.contains("", true) != true && + countOccurance(synonyms, manga.title) <= 0 + ) { + throw Exception("Not found") + } + val recommendations = result["recommendations"].obj val edges = recommendations["edges"].array edges.map { val rec = it["node"]["mediaRecommendation"].obj