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 6e10c34a3..5c8b226d7 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 @@ -4,10 +4,12 @@ import android.util.Log import com.github.salomonbrys.kotson.array import com.github.salomonbrys.kotson.get import com.github.salomonbrys.kotson.jsonObject +import com.github.salomonbrys.kotson.nullObj 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.JsonObject import com.google.gson.JsonParser import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.network.asObservableSuccess @@ -30,13 +32,6 @@ open class RecommendsPager( ) : Pager() { private val client = OkHttpClient.Builder().build() - private fun countOccurrence(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 = @@ -61,19 +56,14 @@ open class RecommendsPager( throw Exception("Null Response") } val response = JsonParser.parseString(responseBody).obj - val result = response["results"].array - .find { - val title = it["title"].string - title.contains(manga.title, true) - } - ?: return@map null + val result = response["results"].array.first().nullObj ?: return@map null result["mal_id"].string } } return getId().map { id -> if (id == null) { - return@map listOf() + return@map null } val endpoint = myAnimeListEndpoint.toHttpUrlOrNull() @@ -149,12 +139,24 @@ open class RecommendsPager( "query" to query, "variables" to variables ) - val body = payload.toString().toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()) + val body = + payload.toString().toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()) val request = Request.Builder() .url(anilistEndpoint) .post(body) .build() + fun countOccurrence(array: JsonArray, search: String): Int { + return array.count { + val synonym = it.string + synonym.contains(search, true) + } + } + + fun languageContains(it: JsonObject, language: String, search: String): Boolean { + return it["title"].obj[language].nullString?.contains(search, true) == true + } + return client.newCall(request) .asObservableSuccess().subscribeOn(Schedulers.io()) .map { netResponse -> @@ -166,23 +168,14 @@ open class RecommendsPager( val data = response["data"]!!.obj val page = data["Page"].obj val media = page["media"].array - val result = media.find { - val title = it["title"].obj - if (title["romaji"].nullString?.contains(manga.title, true) == true) { - return@find true - } - if (title["english"].nullString?.contains(manga.title, true) == true) { - return@find true - } - if (title["native"].nullString?.contains(manga.title, true) == true) { - return@find true - } - if (countOccurrence(it["synonyms"].array, manga.title) <= 0) { - return@find true - } - false - } - ?: return@map listOf() + val result = media.sortedWith( + compareBy( + { languageContains(it.obj, "romaji", manga.title) }, + { languageContains(it.obj, "english", manga.title) }, + { languageContains(it.obj, "native", manga.title) }, + { countOccurrence(it.obj["synonyms"].array, manga.title) > 0 } + ) + ).last().nullObj ?: return@map null val recommendations = result["recommendations"].obj val edges = recommendations["edges"].array edges.map { @@ -191,7 +184,7 @@ open class RecommendsPager( SMangaImpl().apply { this.title = rec["title"].obj["romaji"].nullString ?: rec["title"].obj["english"].nullString - ?: rec["title"].obj["native"].string + ?: rec["title"].obj["native"].string this.thumbnail_url = rec["coverImage"].obj["large"].string this.initialized = true this.url = rec["siteUrl"].string @@ -202,7 +195,8 @@ open class RecommendsPager( override fun requestNext(): Observable { if (smart) { - preferredApi = if (manga.mangaType() != MangaType.TYPE_MANGA) API.ANILIST else preferredApi + preferredApi = + if (manga.mangaType() != MangaType.TYPE_MANGA) API.ANILIST else preferredApi Log.d("SMART RECOMMEND", preferredApi.toString()) }