From ede4f40133ebceb2f1e551946c41088a8ac5657c Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Sun, 29 Nov 2020 17:10:42 -0500 Subject: [PATCH] Cleanup rec changes --- app/src/main/java/exh/recs/RecommendsPager.kt | 91 ++++++++----------- 1 file changed, 38 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/exh/recs/RecommendsPager.kt b/app/src/main/java/exh/recs/RecommendsPager.kt index 37901c522..27f1c8929 100644 --- a/app/src/main/java/exh/recs/RecommendsPager.kt +++ b/app/src/main/java/exh/recs/RecommendsPager.kt @@ -10,12 +10,11 @@ import eu.kanade.tachiyomi.util.lang.asObservable import exh.log.maybeInjectEHLogger import exh.util.MangaType import exh.util.mangaType -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.async import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.supervisorScope +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray @@ -31,7 +30,6 @@ import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import rx.Observable -import rx.android.schedulers.AndroidSchedulers import timber.log.Timber abstract class API(_endpoint: String) { @@ -39,17 +37,13 @@ abstract class API(_endpoint: String) { val client = OkHttpClient.Builder() .maybeInjectEHLogger() .build() - val scope = CoroutineScope(Job() + Dispatchers.Default) abstract suspend fun getRecsBySearch(search: String): List } class MyAnimeList : API("https://api.jikan.moe/v3/") { private suspend fun getRecsById(id: String): List { - val httpUrl = endpoint.toHttpUrlOrNull() - if (httpUrl == null) { - throw Exception("Could not convert endpoint url") - } + val httpUrl = endpoint.toHttpUrlOrNull() ?: throw Exception("Could not convert endpoint url") val urlBuilder = httpUrl.newBuilder() urlBuilder.addPathSegment("manga") urlBuilder.addPathSegment(id) @@ -62,32 +56,28 @@ class MyAnimeList : API("https://api.jikan.moe/v3/") { .build() val response = client.newCall(request).await() - val body = response.body?.string().orEmpty() + val body = withContext(Dispatchers.IO) { response.body?.string().orEmpty() } if (body.isEmpty()) { throw Exception("Null Response") } val data = Json.decodeFromString(body) val recommendations = data["recommendations"] as? JsonArray ?: throw Exception("Unexpected response") - val recs = recommendations.map { rec -> + return recommendations.map { rec -> rec as? JsonObject ?: throw Exception("Invalid json") Timber.tag("RECOMMENDATIONS").d("MYANIMELIST > RECOMMENDATION: %s", rec["title"]!!.jsonPrimitive.content) SMangaImpl().apply { - this.title = rec["title"]!!.jsonPrimitive.content - this.thumbnail_url = rec["image_url"]!!.jsonPrimitive.content - this.initialized = true + title = rec["title"]!!.jsonPrimitive.content + thumbnail_url = rec["image_url"]!!.jsonPrimitive.content + initialized = true this.url = rec["url"]!!.jsonPrimitive.content } } - return recs } override suspend fun getRecsBySearch(search: String): List { val httpUrl = - endpoint.toHttpUrlOrNull() - if (httpUrl == null) { - throw Exception("Could not convert endpoint url") - } + endpoint.toHttpUrlOrNull() ?: throw Exception("Could not convert endpoint url") val urlBuilder = httpUrl.newBuilder() urlBuilder.addPathSegment("search") urlBuilder.addPathSegment("manga") @@ -100,7 +90,7 @@ class MyAnimeList : API("https://api.jikan.moe/v3/") { .build() val response = client.newCall(request).await() - val body = response.body?.string().orEmpty() + val body = withContext(Dispatchers.IO) { response.body?.string().orEmpty() } if (body.isEmpty()) { throw Exception("Null Response") } @@ -183,7 +173,7 @@ class Anilist : API("https://graphql.anilist.co/") { .build() val response = client.newCall(request).await() - val body = response.body?.string().orEmpty() + val body = withContext(Dispatchers.IO) { response.body?.string().orEmpty() } if (body.isEmpty()) { throw Exception("Null Response") } @@ -203,17 +193,16 @@ class Anilist : API("https://graphql.anilist.co/") { ) ).last().jsonObject val recommendations = result["recommendations"]!!.jsonObject["edges"]!!.jsonArray - val recs = recommendations.map { + return recommendations.map { val rec = it.jsonObject["node"]!!.jsonObject["mediaRecommendation"]!!.jsonObject Timber.tag("RECOMMENDATIONS").d("ANILIST > RECOMMENDATION: %s", getTitle(rec)) SMangaImpl().apply { - this.title = getTitle(rec) - this.thumbnail_url = rec["coverImage"]!!.jsonObject["large"]!!.jsonPrimitive.content - this.initialized = true - this.url = rec["siteUrl"]!!.jsonPrimitive.content + title = getTitle(rec) + thumbnail_url = rec["coverImage"]!!.jsonObject["large"]!!.jsonPrimitive.content + initialized = true + url = rec["siteUrl"]!!.jsonPrimitive.content } } - return recs } } @@ -228,37 +217,33 @@ open class RecommendsPager( val apiList = mapOf(preferredApi to API_MAP[preferredApi]!!) + API_MAP.filter { it.key != preferredApi }.toList() - val recs = supervisorScope { - apiList - .asSequence() - .map { (key, api) -> - async(Dispatchers.Default) { - try { - val recs = api.getRecsBySearch(manga.originalTitle).orEmpty() - Timber.tag("RECOMMENDATIONS").d("%s > Results: %s", key, recs.count()) - recs - } catch (e: Exception) { - Timber.tag("RECOMMENDATIONS").e("%s > Error: %s", key, e.message) - listOf() - } - } + val recs = apiList + .asSequence() + .map { (key, api) -> + try { + val recs = runBlocking { api.getRecsBySearch(manga.originalTitle) } + Timber.tag("RECOMMENDATIONS").d("%s > Results: %s", key, recs.count()) + recs + } catch (e: Exception) { + Timber.tag("RECOMMENDATIONS").e("%s > Error: %s", key, e.message) + listOf() } - .firstOrNull { it.await().isNotEmpty() } - ?.await().orEmpty() - } + } + .firstOrNull { it.isNotEmpty() } + .orEmpty() val page = MangasPage(recs, false) emit(page) } - .asObservable() - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext { - if (it.mangas.isNotEmpty()) { - onPageReceived(it) - } else { - throw NoResultsException() + .onEach { + withContext(Dispatchers.Main) { + if (it.mangas.isNotEmpty()) { + onPageReceived(it) + } else { + throw NoResultsException() + } } - } + }.asObservable() } companion object {