From c0bccc027f30d5d46f0834b15782cd449da0301a Mon Sep 17 00:00:00 2001 From: aayush262 Date: Sat, 30 Mar 2024 15:43:37 +0530 Subject: [PATCH] feat: combined queries --- .../connections/anilist/AnilistQueries.kt | 47 +++++------ .../connections/anilist/AnilistViewModel.kt | 84 +++++++++---------- .../dantotsu/connections/anilist/api/Data.kt | 4 +- 3 files changed, 62 insertions(+), 73 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 4492c414..510e5cd9 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1022,43 +1022,53 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } return null } - private fun trendingMovie(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: ANIME, format: MOVIE){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 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 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 topRatedAnime(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: ANIME){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}}}""" + 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 mostFavAnime(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: ANIME){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}}}""" + 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}}}""" } suspend fun loadAnimeList(): Query.AnimeList?{ return executeQuery( """{ - trendingMovie:${trendingMovie()} + recentUpdates:${recentAnimeUpdates()} + trendingMovies:${trendingMovies()} topRated:${topRatedAnime()} mostFav:${mostFavAnime()} }""".trimIndent(), force = true ) } - + 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){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}}}""" + 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 trendingManhwa(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, countryOfOrigin:KR){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}}}""" + 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 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 topRatedManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: MANGA){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}}}""" + 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 mostFavManga(): String{ - return """Page(page:1,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: MANGA){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}}}""" + 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}}}""" } suspend fun loadMangaList(): Query.MangaList?{ return executeQuery( """{ trendingManga:${trendingManga()} trendingManhwa:${trendingManhwa()} + trendingNovel:${trendingNovel()} topRated:${topRatedManga()} mostFav:${mostFavManga()} }""".trimIndent(), force = true @@ -1066,7 +1076,6 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } suspend fun recentlyUpdated( - smaller: Boolean = true, greater: Long = 0, lesser: Long = System.currentTimeMillis() / 1000 - 10000 ): MutableList? { @@ -1116,21 +1125,6 @@ Page(page:$page,perPage:50) { }""".replace("\n", " ").replace(""" """, "") return executeQuery(query, force = true)?.data?.page } - if (smaller) { - val response = execute()?.airingSchedules ?: return null - val idArr = mutableListOf() - val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) - return response.mapNotNull { i -> - i.media?.let { - if (!idArr.contains(it.id)) - if (!listOnly && (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) || (listOnly && it.mediaListEntry != null)) { - idArr.add(it.id) - Media(it) - } else null - else null - } - }.toMutableList() - } else { var i = 1 val list = mutableListOf() var res: Page? = null @@ -1150,7 +1144,6 @@ Page(page:$page,perPage:50) { i++ } return list.reversed().toMutableList() - } } suspend fun getCharacterDetails(character: Character): Character { 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 76689047..220f2f18 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -149,11 +149,6 @@ class AnilistAnimeViewModel : ViewModel() { ) } - private val updated: MutableLiveData> = - MutableLiveData>(null) - - fun getUpdated(): LiveData> = updated - suspend fun loadUpdated() = updated.postValue(Anilist.query.recentlyUpdated()) private val animePopular = MutableLiveData(null) @@ -193,29 +188,41 @@ class AnilistAnimeViewModel : ViewModel() { ) var loaded: Boolean = false + private val updated: MutableLiveData> = + MutableLiveData>(null) + fun getUpdated(): LiveData> = updated private val popularMovies: MutableLiveData> = MutableLiveData>(null) fun getMovies(): LiveData> = popularMovies - private val topRated: MutableLiveData> = + private val topRatedAnime: MutableLiveData> = MutableLiveData>(null) - fun getTopRated(): LiveData> = topRated + fun getTopRated(): LiveData> = topRatedAnime - private val mostFav: MutableLiveData> = + private val mostFavAnime: MutableLiveData> = MutableLiveData>(null) - fun getMostFav(): LiveData> = mostFav + fun getMostFav(): LiveData> = mostFavAnime suspend fun loadAll() { - val response = Anilist.query.loadAnimeList() + val res = Anilist.query.loadAnimeList()?.data - val trendingMovie = response?.data?.trendingMovie?.media?.map { Media(it) }?.toMutableList() - popularMovies.postValue(trendingMovie ?: arrayListOf()) + val listOnly: Boolean = PrefManager.getVal(PrefName.RecentlyListOnly) - val topRatedList = response?.data?.topRated?.media?.map { Media(it) }?.toMutableList() - topRated.postValue(topRatedList ?: arrayListOf()) + res?.apply{ + updated.postValue(recentUpdates?.airingSchedules?.mapNotNull {i -> + i.media?.let { + if (!listOnly && (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) || (listOnly && it.mediaListEntry != null)){ + Media(it) + }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 mostFavList = response?.data?.mostFav?.media?.map { Media(it) }?.toMutableList() - mostFav.postValue(mostFavList ?: arrayListOf()) } } @@ -238,19 +245,6 @@ class AnilistMangaViewModel : ViewModel() { )?.results ) - private val updated: MutableLiveData> = - MutableLiveData>(null) - - fun getTrendingNovel(): LiveData> = updated - suspend fun loadTrendingNovel() = - updated.postValue( - Anilist.query.search( - type, - perPage = 10, - sort = Anilist.sortBy[2], - format = "NOVEL" - )?.results - ) private val mangaPopular = MutableLiveData(null) fun getPopular(): LiveData = mangaPopular @@ -302,27 +296,27 @@ class AnilistMangaViewModel : ViewModel() { MutableLiveData>(null) fun getPopularManhwa(): LiveData> = popularManhwa - private val topRated: MutableLiveData> = + private val popularNovel: MutableLiveData> = MutableLiveData>(null) - fun getTopRated(): LiveData> = topRated + fun getPopularNovel(): LiveData> = popularNovel - private val mostFav: MutableLiveData> = + private val topRatedManga: MutableLiveData> = MutableLiveData>(null) - fun getMostFav(): LiveData> = mostFav + fun getTopRated(): LiveData> = topRatedManga + + private val mostFavManga: MutableLiveData> = + MutableLiveData>(null) + fun getMostFav(): LiveData> = mostFavManga suspend fun loadAll() { - val response = Anilist.query.loadMangaList() + val response = Anilist.query.loadMangaList()?.data - val trendingManga = response?.data?.trendingManga?.media?.map { Media(it) }?.toMutableList() - popularManga.postValue(trendingManga ?: arrayListOf()) - - val trendingManhwa = response?.data?.trendingManhwa?.media?.map { Media(it) }?.toMutableList() - popularManhwa.postValue(trendingManhwa ?: arrayListOf()) - - val topRatedList = response?.data?.topRated?.media?.map { Media(it) }?.toMutableList() - topRated.postValue(topRatedList ?: arrayListOf()) - - val mostFavList = response?.data?.mostFav?.media?.map { Media(it) }?.toMutableList() - mostFav.postValue(mostFavList ?: arrayListOf()) + 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()) + } } } 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 512974ce..7d71af32 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 @@ -159,7 +159,8 @@ class Query { ) { @Serializable data class Data( - @SerialName("trendingMovie") val trendingMovie: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("recentUpdates") val recentUpdates: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingMovies") val trendingMovies: ani.dantotsu.connections.anilist.api.Page?, @SerialName("topRated") val topRated: ani.dantotsu.connections.anilist.api.Page?, @SerialName("mostFav") val mostFav: ani.dantotsu.connections.anilist.api.Page?, ) @@ -173,6 +174,7 @@ class Query { data class Data( @SerialName("trendingManga") val trendingManga: ani.dantotsu.connections.anilist.api.Page?, @SerialName("trendingManhwa") val trendingManhwa: ani.dantotsu.connections.anilist.api.Page?, + @SerialName("trendingNovel") val trendingNovel: ani.dantotsu.connections.anilist.api.Page?, @SerialName("topRated") val topRated: ani.dantotsu.connections.anilist.api.Page?, @SerialName("mostFav") val mostFav: ani.dantotsu.connections.anilist.api.Page?, )