diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt index 8fd33aaf5..abba7ea7b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt @@ -133,14 +133,15 @@ open class BrowseSourceController(bundle: Bundle) : override fun getTitle(): String? { return when (mode) { Mode.CATALOGUE -> presenter.source.name - Mode.RECOMMENDS -> recommendsConfig!!.origTitle + Mode.RECOMMENDS -> recommendsConfig!!.manga.title } } override fun createPresenter(): BrowseSourcePresenter { return BrowseSourcePresenter( args.getLong(SOURCE_ID_KEY), - if (mode == Mode.RECOMMENDS) recommendsConfig!!.origTitle else args.getString(SEARCH_QUERY_KEY), + args.getString(SEARCH_QUERY_KEY), + searchManga = if (mode == Mode.RECOMMENDS) recommendsConfig?.manga else null, recommends = (mode == Mode.RECOMMENDS) ) } @@ -776,8 +777,9 @@ open class BrowseSourceController(bundle: Bundle) : } activity?.toast(activity?.getString(R.string.manga_added_library)) } + @Parcelize - data class RecommendsConfig(val origTitle: String, val origSource: Long) : Parcelable + data class RecommendsConfig(val manga: Manga) : Parcelable enum class Mode { CATALOGUE, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt index 0972053ef..5a8f0fe90 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt @@ -53,6 +53,7 @@ import xyz.nulldev.ts.api.http.serializer.FilterSerializer open class BrowseSourcePresenter( private val sourceId: Long, private val searchQuery: String? = null, + private val searchManga: Manga? = null, private val sourceManager: SourceManager = Injekt.get(), private val db: DatabaseHelper = Injekt.get(), private val prefs: PreferencesHelper = Injekt.get(), @@ -154,8 +155,8 @@ open class BrowseSourcePresenter( subscribeToMangaInitializer() // Create a new pager. - pager = if (recommends) RecommendsPager( - searchQuery!! + pager = if (recommends && searchManga != null) RecommendsPager( + searchManga ) else createPager(query, filters) val sourceId = source.id 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 8fabe9743..ba31d8a77 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,12 +4,15 @@ 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.nullString import com.github.salomonbrys.kotson.obj import com.github.salomonbrys.kotson.string import com.google.gson.JsonParser +import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.SMangaImpl +import java.util.Locale import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient @@ -18,7 +21,11 @@ import okhttp3.RequestBody.Companion.toRequestBody import rx.Observable import rx.schedulers.Schedulers -open class RecommendsPager(val title: String, val preferredApi: API = API.MYANIMELIST) : Pager() { +open class RecommendsPager( + val manga: Manga, + val smart: Boolean = true, + var preferredApi: API = API.MYANIMELIST +) : Pager() { private val client = OkHttpClient.Builder().build() private fun myAnimeList(): Observable>? { @@ -29,7 +36,7 @@ open class RecommendsPager(val title: String, val preferredApi: API = API.MYANIM val urlBuilder = endpoint.newBuilder() urlBuilder.addPathSegment("search") urlBuilder.addPathSegment("manga") - urlBuilder.addQueryParameter("q", title) + urlBuilder.addQueryParameter("q", manga.title) val url = urlBuilder.build().toUrl() val request = Request.Builder() @@ -96,9 +103,11 @@ open class RecommendsPager(val title: String, val preferredApi: API = API.MYANIM val query = """ { - Media(search: "$title", type: MANGA) { + Media(search: "$manga.title", type: MANGA) { title{ romaji + english + native } recommendations { edges { @@ -145,7 +154,9 @@ open class RecommendsPager(val title: String, val preferredApi: API = API.MYANIM val rec = it["node"]["mediaRecommendation"].obj Log.d("ANILIST RECOMMEND", "${rec["title"].obj["romaji"].string}") SMangaImpl().apply { - this.title = rec["title"].obj["romaji"].string + this.title = rec["title"].obj["romaji"].nullString + ?: rec["title"].obj["english"].nullString + ?: rec["title"].obj["native"].string this.thumbnail_url = rec["coverImage"].obj["large"].string this.initialized = true this.url = rec["siteUrl"].string @@ -155,6 +166,23 @@ open class RecommendsPager(val title: String, val preferredApi: API = API.MYANIM } override fun requestNext(): Observable { + if (smart) { + val myAnimeListPoints = 0 + val anilistPoints = + anilistSmart.count { manga.genre!!.toLowerCase(Locale.ROOT).contains(it) } + val apiPoints = listOf( + API.MYANIMELIST to myAnimeListPoints, + API.ANILIST to anilistPoints + ).sortedWith( + compareBy( + { (_, value) -> value }, + { (key, _) -> key == preferredApi } + ) + ) + preferredApi = apiPoints.last().first + Log.d("SMART RECOMMEND", preferredApi.toString()) + } + val apiList = API.values().toMutableList() apiList.removeAt(apiList.indexOf(preferredApi)) apiList.add(0, preferredApi) @@ -183,6 +211,8 @@ open class RecommendsPager(val title: String, val preferredApi: API = API.MYANIM companion object { private const val myAnimeListEndpoint = "https://api.jikan.moe/v3/" private const val anilistEndpoint = "https://graphql.anilist.co/" + private val anilistSmart = + listOf("manhua", "manhwa", "webtoon", "long strip", "korean", "chinese") enum class API { MYANIMELIST, ANILIST } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt index c6d35b277..ead7cfcf6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt @@ -437,7 +437,7 @@ class MangaAllInOneController : // AZ --> private fun openRecommends() { - val recommendsConfig = BrowseSourceController.RecommendsConfig(presenter.manga.title, presenter.manga.source) + val recommendsConfig = BrowseSourceController.RecommendsConfig(presenter.manga) router?.pushController( BrowseSourceController( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt index b008ce0c6..8947a92a8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt @@ -276,7 +276,7 @@ class MangaInfoController(private val fromSource: Boolean = false) : // AZ --> private fun openRecommends() { - val recommendsConfig = BrowseSourceController.RecommendsConfig(presenter.manga.title, presenter.manga.source) + val recommendsConfig = BrowseSourceController.RecommendsConfig(presenter.manga) parentController?.router?.pushController( BrowseSourceController(