From d2f118a86c435892a67475697ba56a1aebb43e83 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sat, 6 Apr 2024 01:20:29 +0530 Subject: [PATCH] feat: more media in recommendations --- .../connections/anilist/AnilistQueries.kt | 145 +++++++++++++----- .../connections/anilist/AnilistViewModel.kt | 47 ++---- .../dantotsu/connections/anilist/api/Data.kt | 9 ++ 3 files changed, 129 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt index fa4a3090..f539c355 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1045,56 +1045,127 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } private val onListAnime = (if(PrefManager.getVal(PrefName.IncludeAnimeList)) "" else "onList:false").replace("\"", "") private val isAdult = (if (PrefManager.getVal(PrefName.AdultOnly)) "isAdult:true" else "").replace("\"", "") - private fun recentAnimeUpdates(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}airingSchedules(airingAt_greater:0 airingAt_lesser:${System.currentTimeMillis() / 1000 - 10000} sort:TIME_DESC){episode airingAt media{id idMal status chapters episodes nextAiringEpisode{episode} isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large} title{english romaji userPreferred} mediaListEntry{progress private score(format:POINT_100) status}}}}""" + private fun recentAnimeUpdates(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}airingSchedules(airingAt_greater:0 airingAt_lesser:${System.currentTimeMillis() / 1000 - 10000} sort:TIME_DESC){episode airingAt media{id idMal status chapters episodes nextAiringEpisode{episode} isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large} title{english romaji userPreferred} mediaListEntry{progress private score(format:POINT_100) status}}}}""" } - private fun trendingMovies(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: ANIME, format: MOVIE, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun trendingMovies(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: ANIME, format: MOVIE, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun topRatedAnime(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun topRatedAnime(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun mostFavAnime(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun mostFavAnime(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - suspend fun loadAnimeList(): Query.AnimeList?{ - return executeQuery( - """{ - recentUpdates:${recentAnimeUpdates()} - trendingMovies:${trendingMovies()} - topRated:${topRatedAnime()} - mostFav:${mostFavAnime()} - }""".trimIndent(), force = true - ) + suspend fun loadAnimeList(): Map>{ + val list = mutableMapOf>() + fun query(): String { + return """{ + recentUpdates:${recentAnimeUpdates(1)} + recentUpdates2:${recentAnimeUpdates(2)} + trendingMovies:${trendingMovies(1)} + trendingMovies2:${trendingMovies(2)} + topRated:${topRatedAnime(1)} + topRated2:${topRatedAnime(2)} + mostFav:${mostFavAnime(1)} + mostFav2:${mostFavAnime(2)} + }""".trimIndent() + } + executeQuery(query(), force = true)?.data?.apply { + val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) + val adultOnly: Boolean = PrefManager.getVal(PrefName.AdultOnly) + val idArr = mutableListOf() + list["recentUpdates"] = recentUpdates?.airingSchedules?.mapNotNull { i -> + i.media?.let { + if (!idArr.contains(it.id)) + if (!listOnly && it.countryOfOrigin == "JP" && Anilist.adult && adultOnly && it.isAdult == true) { + idArr.add(it.id) + Media(it) + } else if (!listOnly && !adultOnly && (it.countryOfOrigin == "JP" && it.isAdult == false)) { + idArr.add(it.id) + Media(it) + } else if ((listOnly && it.mediaListEntry != null)) { + idArr.add(it.id) + Media(it) + } else null + else null + } + } as ArrayList + list["trendingMovies"] = trendingMovies?.media?.map { Media(it) } as ArrayList + list["topRated"] = topRated?.media?.map { Media(it) } as ArrayList + list["mostFav"] = mostFav?.media?.map { Media(it) } as ArrayList + + list["recentUpdates"]?.addAll(recentUpdates2?.airingSchedules?.mapNotNull { i -> + i.media?.let { + if (!idArr.contains(it.id)) + if (!listOnly && it.countryOfOrigin == "JP" && Anilist.adult && adultOnly && it.isAdult == true) { + idArr.add(it.id) + Media(it) + } else if (!listOnly && !adultOnly && (it.countryOfOrigin == "JP" && it.isAdult == false)) { + idArr.add(it.id) + Media(it) + } else if ((listOnly && it.mediaListEntry != null)) { + idArr.add(it.id) + Media(it) + } else null + else null + } + } as ArrayList) + list["trendingMovies"]?.addAll(trendingMovies2?.media?.map { Media(it) } as ArrayList) + list["topRated"]?.addAll(topRated2?.media?.map { Media(it) } as ArrayList) + list["mostFav"]?.addAll(mostFav2?.media?.map { Media(it) } as ArrayList) + } + return list } private val onListManga = (if(PrefManager.getVal(PrefName.IncludeMangaList)) "" else "onList:false").replace("\"", "") - private fun trendingManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA,countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun trendingManga(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA,countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun trendingManhwa(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, countryOfOrigin:KR, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun trendingManhwa(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, countryOfOrigin:KR, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun trendingNovel(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, format: NOVEL, countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun trendingNovel(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, format: NOVEL, countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun topRatedManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun topRatedManga(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun mostFavManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" + private fun mostFavManga(page: Int): String{ + return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - suspend fun loadMangaList(): Query.MangaList?{ - return executeQuery( - """{ - trendingManga:${trendingManga()} - trendingManhwa:${trendingManhwa()} - trendingNovel:${trendingNovel()} - topRated:${topRatedManga()} - mostFav:${mostFavManga()} - }""".trimIndent(), force = true - ) + suspend fun loadMangaList(): Map>{ + val list = mutableMapOf>() + fun query(): String{ + return """{ + trendingManga:${trendingManga(1)} + trendingManga2:${trendingManga(2)} + trendingManhwa:${trendingManhwa(1)} + trendingManhwa2:${trendingManhwa(2)} + trendingNovel:${trendingNovel(1)} + trendingNovel2:${trendingNovel(2)} + topRated:${topRatedManga(1)} + topRated2:${topRatedManga(2)} + mostFav:${mostFavManga(1)} + mostFav2:${mostFavManga(2)} + }""".trimIndent() + } + executeQuery(query() , force = true)?.data?.apply { + list["trendingManga"] = trendingManga?.media?.map { Media(it) } as ArrayList + list["trendingManhwa"] = trendingManhwa?.media?.map { Media(it) } as ArrayList + list["trendingNovel"] = trendingNovel?.media?.map { Media(it) } as ArrayList + list["topRated"] = topRated?.media?.map { Media(it) } as ArrayList + list["mostFav"] = mostFav?.media?.map { Media(it) } as ArrayList + list["trendingManga"]?.addAll(trendingManga2?.media?.map { Media(it) } as ArrayList) + list["trendingManhwa"]?.addAll(trendingManhwa2?.media?.map { Media(it) } as ArrayList) + list["trendingNovel"]?.addAll(trendingNovel2?.media?.map { Media(it) } as ArrayList) + list["topRated"]?.addAll(topRated2?.media?.map { Media(it) } as ArrayList) + list["mostFav"]?.addAll(mostFav2?.media?.map { Media(it) } as ArrayList) + + } + + return list } suspend fun recentlyUpdated( greater: Long = 0, diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index a802a164..7c05586f 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -5,6 +5,7 @@ import androidx.fragment.app.FragmentActivity import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.webkit.internal.ApiFeature.M import androidx.webkit.internal.ApiFeature.P import androidx.webkit.internal.StartupApiFeature import ani.dantotsu.BuildConfig @@ -203,32 +204,11 @@ class AnilistAnimeViewModel : ViewModel() { MutableLiveData>(null) fun getMostFav(): LiveData> = mostFavAnime suspend fun loadAll() { - val res = Anilist.query.loadAnimeList()?.data - - val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) - val adultOnly: Boolean = PrefManager.getVal(PrefName.AdultOnly) - res?.apply{ - val idArr = mutableListOf() - updated.postValue(recentUpdates?.airingSchedules?.mapNotNull {i -> - i.media?.let { - if (!idArr.contains(it.id)) - if (!listOnly && it.countryOfOrigin == "JP" && Anilist.adult && adultOnly && it.isAdult == true) { - idArr.add(it.id) - Media(it) - }else if (!listOnly && !adultOnly && (it.countryOfOrigin == "JP" && it.isAdult == false)){ - idArr.add(it.id) - Media(it) - }else if ((listOnly && it.mediaListEntry != null)) { - idArr.add(it.id) - Media(it) - }else null - else null - } - }?.toMutableList() ?: arrayListOf()) - popularMovies.postValue(trendingMovies?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - topRatedAnime.postValue(topRated?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - mostFavAnime.postValue(mostFav?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - } + val list= Anilist.query.loadAnimeList() + updated.postValue(list["recentUpdates"]) + popularMovies.postValue(list["trendingMovies"]) + topRatedAnime.postValue(list["topRated"]) + mostFavAnime.postValue(list["mostFav"]) } } @@ -321,15 +301,12 @@ class AnilistMangaViewModel : ViewModel() { MutableLiveData>(null) fun getMostFav(): LiveData> = mostFavManga suspend fun loadAll() { - val response = Anilist.query.loadMangaList()?.data - - response?.apply { - popularManga.postValue(trendingManga?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - popularManhwa.postValue(trendingManhwa?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - popularNovel.postValue(trendingNovel?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - topRatedManga.postValue(topRated?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - mostFavManga.postValue(mostFav?.media?.map { Media(it) }?.toMutableList() ?: arrayListOf()) - } + val list = Anilist.query.loadMangaList() + popularManga.postValue(list["trendingManga"]) + popularManhwa.postValue(list["trendingManhwa"]) + popularNovel.postValue(list["trendingNovel"]) + topRatedManga.postValue(list["topRated"]) + mostFavManga.postValue(list["mostFav"]) } } diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt index 20f35035..ffac7b1f 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt @@ -157,9 +157,13 @@ class Query { @Serializable data class Data( @SerialName("recentUpdates") val recentUpdates: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("recentUpdates2") val recentUpdates2: ani.dantotsu.connections.anilist.api.Page?, @SerialName("trendingMovies") val trendingMovies: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingMovies2") val trendingMovies2: ani.dantotsu.connections.anilist.api.Page?, @SerialName("topRated") val topRated: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("topRated2") val topRated2: ani.dantotsu.connections.anilist.api.Page?, @SerialName("mostFav") val mostFav: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("mostFav2") val mostFav2: ani.dantotsu.connections.anilist.api.Page?, ) } @Serializable @@ -170,10 +174,15 @@ class Query { @Serializable data class Data( @SerialName("trendingManga") val trendingManga: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingManga2") val trendingManga2: ani.dantotsu.connections.anilist.api.Page?, @SerialName("trendingManhwa") val trendingManhwa: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingManhwa2") val trendingManhwa2: ani.dantotsu.connections.anilist.api.Page?, @SerialName("trendingNovel") val trendingNovel: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingNovel2") val trendingNovel2: ani.dantotsu.connections.anilist.api.Page?, @SerialName("topRated") val topRated: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("topRated2") val topRated2: ani.dantotsu.connections.anilist.api.Page?, @SerialName("mostFav") val mostFav: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("mostFav2") val mostFav2: ani.dantotsu.connections.anilist.api.Page?, ) } @Serializable