diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py index bbfa8a1..5f5a5ac 100644 --- a/fastanime/cli/config.py +++ b/fastanime/cli/config.py @@ -469,7 +469,7 @@ translation_type = {self.translation_type} # what server to use for a particular provider # allanime: [dropbox, sharepoint, wetransfer, gogoanime, wixmp] # animepahe: [kwik] -# hianime: [HD1, HD2, StreamSB, StreamTape] +# hianime: [HD1, HD2, StreamSB, StreamTape] : only HD2 for now # yugen: [gogoanime] # 'top' can also be used as a value for this option # 'top' will cause fastanime to auto select the first server it sees diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py index 5757310..5e69ef4 100644 --- a/fastanime/cli/interfaces/anilist_interfaces.py +++ b/fastanime/cli/interfaces/anilist_interfaces.py @@ -1343,6 +1343,59 @@ def media_actions_menu( set_prefered_progress_tracking(config, fastanime_runtime_state, update=True) media_actions_menu(config, fastanime_runtime_state) + def _relations(config: "Config", fastanime_runtime_state: "FastAnimeRuntimeState"): + """Helper function to get anime recommendations + Args: + config: [TODO:description] + fastanime_runtime_state: [TODO:description] + """ + relations = AniList.get_related_anime_for( + fastanime_runtime_state.selected_anime_id_anilist + ) + if not relations[0]: + print("No recommendations found", relations[1]) + input("Enter to continue...") + media_actions_menu(config, fastanime_runtime_state) + return + + fastanime_runtime_state.anilist_results_data = { + "data": { + "Page": {"media": relations[1]["data"]["Media"]["relations"]["nodes"]} # pyright:ignore + } + } + anilist_results_menu(config, fastanime_runtime_state) + + def _recommendations( + config: "Config", fastanime_runtime_state: "FastAnimeRuntimeState" + ): + """Helper function to get anime recommendations + Args: + config: [TODO:description] + fastanime_runtime_state: [TODO:description] + """ + recommendations = AniList.get_recommended_anime_for( + fastanime_runtime_state.selected_anime_id_anilist + ) + if not recommendations[0]: + print("No recommendations found", recommendations[1]) + input("Enter to continue...") + media_actions_menu(config, fastanime_runtime_state) + return + + fastanime_runtime_state.anilist_results_data = { + "data": { + "Page": { + "media": [ + media["media"] + for media in recommendations[1]["data"]["Page"][ + "recommendations" # pyright:ignore + ] + ] + } + } + } + anilist_results_menu(config, fastanime_runtime_state) + icons = config.icons options = { f"{'📽️ ' if icons else ''}Stream ({progress}/{episodes_total})": _stream_anime, @@ -1352,6 +1405,8 @@ def media_actions_menu( f"{'✨ ' if icons else ''}Progress Tracking": _set_progress_tracking, f"{'📥 ' if icons else ''}Add to List": _add_to_list, f"{'📤 ' if icons else ''}Remove from List": _remove_from_list, + f"{'📖 ' if icons else ''}Recommendations": _recommendations, + f"{'📖 ' if icons else ''}Relations": _relations, f"{'📖 ' if icons else ''}View Info": _view_info, f"{'🎧 ' if icons else ''}Change Translation Type": _change_translation_type, f"{'💽 ' if icons else ''}Change Provider": _change_provider, diff --git a/fastanime/libs/anilist/api.py b/fastanime/libs/anilist/api.py index 6aba74f..bfca47c 100644 --- a/fastanime/libs/anilist/api.py +++ b/fastanime/libs/anilist/api.py @@ -403,8 +403,8 @@ class AniListApi: return upcoming_anime # NOTE: THe following methods will probably be scraped soon - def get_recommended_anime_for(self, id: int, type="ANIME", page=1, *_, **kwargs): - variables = {"type": type, "page": page} + def get_recommended_anime_for(self, mediaRecommendationId, page=1, *_, **kwargs): + variables = {"mediaRecommendationId": mediaRecommendationId, "page": page} recommended_anime = self.get_data(recommended_query, variables) return recommended_anime @@ -413,7 +413,7 @@ class AniListApi: characters = self.get_data(anime_characters_query, variables) return characters - def get_related_anime_for(self, id: int, type="ANIME", *_, **kwargs): + def get_related_anime_for(self, id: int, *_, **kwargs): variables = {"id": id} related_anime = self.get_data(anime_relations_query, variables) return related_anime diff --git a/fastanime/libs/anilist/queries_graphql.py b/fastanime/libs/anilist/queries_graphql.py index 585e3da..9925877 100644 --- a/fastanime/libs/anilist/queries_graphql.py +++ b/fastanime/libs/anilist/queries_graphql.py @@ -738,63 +738,64 @@ query ($type: MediaType, $page: Int) { """ recommended_query = """ -query ($type: MediaType, $page: Int) { - Page(perPage: 15, page: $page) { - media(type: $type, genre_not_in: ["hentai"]) { - recommendations(sort: RATING_DESC) { - nodes { - media { - id - idMal - title { - english - romaji - native - } - coverImage { - medium - large - } - mediaListEntry { - status - id - progress - } - description - episodes - trailer { - site - id - } - genres - synonyms - averageScore - popularity - streamingEpisodes { - title - thumbnail - } - favourites - tags { - name - } - startDate { - year - month - day - } - endDate { - year - month - day - } - status - nextAiringEpisode { - timeUntilAiring - airingAt - episode - } - } +query ($mediaRecommendationId: Int, $page: Int) { + Page(perPage: 50, page: $page) { + recommendations(mediaRecommendationId: $mediaRecommendationId) { + media { + id + idMal + mediaListEntry { + status + id + progress + } + title { + english + romaji + native + } + coverImage { + medium + large + } + mediaListEntry { + status + id + progress + } + description + episodes + trailer { + site + id + } + genres + synonyms + averageScore + popularity + streamingEpisodes { + title + thumbnail + } + favourites + tags { + name + } + startDate { + year + month + day + } + endDate { + year + month + day + } + status + nextAiringEpisode { + timeUntilAiring + airingAt + episode } } } @@ -802,6 +803,7 @@ query ($type: MediaType, $page: Int) { } """ + anime_characters_query = """ query ($id: Int, $type: MediaType) { Page { @@ -838,66 +840,59 @@ query ($id: Int, $type: MediaType) { anime_relations_query = """ -query ($type: MediaType, $page: Int) { - Page(perPage: 15, page: $page) { - media( - id: $id - sort: POPULARITY_DESC - type: $type - genre_not_in: ["hentai"] - ) { - relations { - nodes { - id - idMal - title { - english - romaji - native - } - coverImage { - medium - large - } - mediaListEntry { - status - id - progress - } - description - episodes - trailer { - site - id - } - genres - synonyms - averageScore - popularity - streamingEpisodes { - title - thumbnail - } - favourites - tags { - name - } - startDate { - year - month - day - } - endDate { - year - month - day - } +query ($id: Int) { + Media(id: $id) { + relations { + nodes { + id + idMal + title { + english + romaji + native + } + coverImage { + medium + large + } + mediaListEntry { status - nextAiringEpisode { - timeUntilAiring - airingAt - episode - } + id + progress + } + description + episodes + trailer { + site + id + } + genres + synonyms + averageScore + popularity + streamingEpisodes { + title + thumbnail + } + favourites + tags { + name + } + startDate { + year + month + day + } + endDate { + year + month + day + } + status + nextAiringEpisode { + timeUntilAiring + airingAt + episode } } }