mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 22:37:56 +01:00 
			
		
		
		
	Smart recommendations (#10)
* Pass manga through to RecommendsPager * Implement smart recommendations * Add null checks * Add more anilistSmart tags * Add fallback titles Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
This commit is contained in:
		| @@ -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, | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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<List<SMangaImpl>>? { | ||||
| @@ -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<MangasPage> { | ||||
|         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 } | ||||
|     } | ||||
|   | ||||
| @@ -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( | ||||
|   | ||||
| @@ -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( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user