From c0dd20eb9a69583a2dd06fbb9c8a43244c805fe2 Mon Sep 17 00:00:00 2001 From: Frazzer951 Date: Sun, 13 Mar 2022 14:06:31 -0700 Subject: [PATCH] Feature: Add Builder for Userlists from AniList --- modules/anilist.py | 33 +++++++++++++++++++++++++++++++-- modules/builder.py | 10 +++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/modules/anilist.py b/modules/anilist.py index ac571ced..965dbfa5 100644 --- a/modules/anilist.py +++ b/modules/anilist.py @@ -4,8 +4,12 @@ from modules.util import Failed logger = util.logger -builders = ["anilist_id", "anilist_popular", "anilist_trending", "anilist_relations", "anilist_studio", "anilist_top_rated", "anilist_search"] -pretty_names = {"score": "Average Score", "popular": "Popularity", "trending": "Trending"} +builders = ["anilist_id", "anilist_popular", "anilist_trending", "anilist_relations", "anilist_studio", "anilist_top_rated", "anilist_search", "anilist_userlist"] +pretty_names = { + "score": "Average Score", "popular": "Popularity", "trending": "Trending", "CURRENT": "Currently Watching", + "COMPLETED": "Completed", "PAUSED": "Paused", "DROPPED": "Dropped", "PLANNING": "Planning", "SCORE": "Score", + "UPDATED_TIME": "Updated Time", "STARTED_ON": "Start Date", "MEDIA_TITLE_NATIVE": "Title" + } attr_translation = { "year": "seasonYear", "adult": "isAdult", "start": "startDate", "end": "endDate", "tag_category": "tagCategory", "score": "averageScore", "min_tag_percent": "minimumTagRank", "country": "countryOfOrigin", @@ -20,6 +24,17 @@ mod_searches = [ no_mod_searches = ["search", "season", "year", "adult", "min_tag_percent", "limit", "sort_by", "source", "country"] searches = mod_searches + no_mod_searches sort_options = {"score": "SCORE_DESC", "popular": "POPULARITY_DESC", "trending": "TRENDING_DESC"} +userlist_sort_options = ["score", "last_updated", "title", "start_date"] +userlist_sort_translation = { + "score": "SCORE", "last_updated": "UPDATED_TIME", + "title": "MEDIA_TITLE_NATIVE", "start_date": "STARTED_ON" +} +userlist_status = ["watching", "completed", "paused", "dropped", "planning"] +userlist_status_translation = { + "watching": "CURRENT", "completed": "COMPLETED", + "paused": "PAUSED", "dropped" :"DROPPED", + "planning": "PLANNING" +} media_season = {"winter": "WINTER", "spring": "SPRING", "summer": "SUMMER", "fall": "FALL"} media_format = {"tv": "TV", "short": "TV_SHORT", "movie": "MOVIE", "special": "SPECIAL", "ova": "OVA", "ona": "ONA", "music": "MUSIC"} media_status = {"finished": "FINISHED", "airing": "RELEASING", "not_yet_aired": "NOT_YET_RELEASED", "cancelled": "CANCELLED", "hiatus": "HIATUS"} @@ -210,6 +225,17 @@ class AniList: return anilist_ids, ignore_ids, name + def _userlist(self, username, status, sort_by): + query = "query ($userName: String, $status: MediaListStatus) {MediaListCollection (userName: $userName, status: $status, type: ANIME) {lists {status entries {media{id title{romaji english}}}}}}" + variables = {"userName": username, "status": status, "sort": sort_by} + json_obj = self._request(query, variables) + lists = json_obj['data']['MediaListCollection']['lists'] + anilist_ids = [] + for list in lists: + for media in list['entries']: + anilist_ids.append(media['media']['id']) + return anilist_ids + def validate(self, name, data): valid = [] for d in util.get_list(data): @@ -243,6 +269,9 @@ class AniList: elif method == "anilist_relations": anilist_ids, _, name = self._relations(data) logger.info(f"Processing AniList Relations: ({data}) {name} ({len(anilist_ids)} Anime)") + elif method == "anilist_userlist": + anilist_ids = self._userlist(data["username"], data["status"], data['sort_by']) + logger.info(f"Processing AniList Userlist: Anime from {data['username']}'s {pretty_names[data['status']]} list sorted by {pretty_names[data['sort_by']]}") else: if method == "anilist_popular": data = {"limit": data, "popularity.gt": 3, "sort_by": "popular"} diff --git a/modules/builder.py b/modules/builder.py index 45302488..8c19c79f 100644 --- a/modules/builder.py +++ b/modules/builder.py @@ -178,7 +178,7 @@ custom_sort_builders = [ "trakt_recommended_personal", "trakt_recommended_daily", "trakt_recommended_weekly", "trakt_recommended_monthly", "trakt_recommended_yearly", "trakt_recommended_all", "trakt_watched_daily", "trakt_watched_weekly", "trakt_watched_monthly", "trakt_watched_yearly", "trakt_watched_all", "tautulli_popular", "tautulli_watched", "mdblist_list", "letterboxd_list", "icheckmovies_list", - "anilist_top_rated", "anilist_popular", "anilist_trending", "anilist_search", + "anilist_top_rated", "anilist_popular", "anilist_trending", "anilist_search", "anilist_userlist", "mal_all", "mal_airing", "mal_upcoming", "mal_tv", "mal_movie", "mal_ova", "mal_special", "mal_popular", "mal_favorite", "mal_suggested", "mal_userlist", "mal_season", "mal_genre", "mal_studio" ] @@ -955,6 +955,14 @@ class CollectionBuilder: self.builders.append((method_name, anilist_id)) elif method_name in ["anilist_popular", "anilist_trending", "anilist_top_rated"]: self.builders.append((method_name, util.parse(self.Type, method_name, method_data, datatype="int", default=10))) + elif method_name == "anilist_userlist": + for dict_data in util.parse(self.Type, method_name, method_data, datatype="listdict"): + dict_methods = {dm.lower(): dm for dm in dict_data} + self.builders.append((method_name, { + "username": util.parse(self.Type, "username", dict_data, methods=dict_methods, parent=method_name), + "status": util.parse(self.Type, "status", dict_data, methods=dict_methods, parent=method_name, default="watching", options=anilist.userlist_status, translation=anilist.userlist_status_translation), + "sort_by": util.parse(self.Type, "sort_by", dict_data, methods=dict_methods, parent=method_name, default="score", options=anilist.userlist_sort_options, translation=anilist.userlist_sort_translation), + })) elif method_name == "anilist_search": if self.current_time.month in [12, 1, 2]: current_season = "winter" elif self.current_time.month in [3, 4, 5]: current_season = "spring"