From 97a01a64968288ed2bc431d0d8dea4402503155e Mon Sep 17 00:00:00 2001 From: meisnate12 Date: Tue, 13 Jul 2021 16:53:49 -0400 Subject: [PATCH] change up anidb login --- modules/anidb.py | 43 +++++++++++++++---------------------------- modules/builder.py | 12 ++++++++++++ modules/config.py | 16 +++++++--------- 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/modules/anidb.py b/modules/anidb.py index 6f05424b..3a62700b 100644 --- a/modules/anidb.py +++ b/modules/anidb.py @@ -1,4 +1,4 @@ -import logging, requests,time +import logging, requests, time from lxml import html from modules import util from modules.util import Failed @@ -6,15 +6,12 @@ from retrying import retry logger = logging.getLogger("Plex Meta Manager") -builders = ["anidb_id", "anidb_relation", "anidb_popular", 'anidb_tag'] +builders = ["anidb_id", "anidb_relation", "anidb_popular", "anidb_tag"] class AniDB: def __init__(self, params, config): self.config = config - # Create a session so if we login we can continue to use the same session - self.anidb_session = requests.Session() - self.urls = { "anime": "https://anidb.net/anime", "popular": "https://anidb.net/latest/anime/popular/?h=1", @@ -22,18 +19,15 @@ class AniDB: "anidb_tag": "https://anidb.net/tag", "login": "https://anidb.net/perl-bin/animedb.pl" } - - if params and "username" in params and "password" in params: - result = str(self._login(params["username"], params["password"]).content) - - # Login response does not use proper status codes so we have to check the content of the document - if "Wrong username/password" in result: + if params: + if not self._login(params["username"], params["password"]).xpath("//li[@class='sub-menu my']/@title"): raise Failed("AniDB Error: Login failed") @retry(stop_max_attempt_number=6, wait_fixed=10000) def _request(self, url, language): - return html.fromstring(self.anidb_session.get(url, headers={"Accept-Language": language, "User-Agent": "Mozilla/5.0 x64"}).content) + return html.fromstring(self.config.session.get(url, headers={"Accept-Language": language, "User-Agent": "Mozilla/5.0 x64"}).content) + @retry(stop_max_attempt_number=6, wait_fixed=10000) def _login(self, username, password): data = { "show": "main", @@ -41,7 +35,7 @@ class AniDB: "xpass": password, "xdoautologin": "on" } - return self.anidb_session.post(self.urls["login"], data, headers={"Accept-Language": "en-US,en;q=0.5", "User-Agent": "Mozilla/5.0 x64"}) + return html.fromstring(self.config.session.post(self.urls["login"], data, headers={"Accept-Language": "en-US,en;q=0.5", "User-Agent": "Mozilla/5.0 x64"}).content) def _popular(self, language): response = self._request(self.urls["popular"], language) @@ -71,24 +65,17 @@ class AniDB: def _tag(self, tag, limit, language): anidb_ids = [] - next_page = True - current_url = self.urls["anidb_tag"] + "/" + str(tag) - while next_page: - logger.debug(f"Sending request to {current_url}") + current_url = f"{self.urls['anidb_tag']}/{tag}" + while True: response = self._request(current_url, language) int_list = util.get_int_list(response.xpath("//td[@class='name main anime']/a/@href"), "AniDB ID") anidb_ids.extend(int_list) next_page_list = response.xpath("//li[@class='next']/a/@href") - logger.debug(f"next page list {next_page_list}") - if len(next_page_list) != 0 and len(anidb_ids) <= limit: - logger.debug(f"Loading next anidb page") - time.sleep(2)# Sleep as we are paging through anidb and don't want the ban hammer - current_url = "https://anidb.net" + next_page_list[0] - else: - logger.debug(f"Got to last page") - next_page = False - anidb_ids = anidb_ids[:limit] - return anidb_ids + if len(anidb_ids) >= limit or len(next_page_list) == 0: + break + time.sleep(2) + current_url = f"https://anidb.net{next_page_list[0]}" + return anidb_ids[:limit] def get_items(self, method, data, language): pretty = util.pretty_names[method] if method in util.pretty_names else method @@ -109,4 +96,4 @@ class AniDB: logger.debug(f"{len(anidb_ids)} AniDB IDs Found: {anidb_ids}") logger.debug(f"{len(movie_ids)} TMDb IDs Found: {movie_ids}") logger.debug(f"{len(show_ids)} TVDb IDs Found: {show_ids}") - return movie_ids, show_ids \ No newline at end of file + return movie_ids, show_ids diff --git a/modules/builder.py b/modules/builder.py index 375bd39a..f530e91b 100644 --- a/modules/builder.py +++ b/modules/builder.py @@ -61,6 +61,7 @@ modifier_alias = {".greater": ".gt", ".less": ".lt"} all_builders = anidb.builders + anilist.builders + icheckmovies.builders + imdb.builders + letterboxd.builders + mal.builders + plex.builders + tautulli.builders + tmdb.builders + trakttv.builders + tvdb.builders dictionary_builders = [ "filters", + "anidb_tag", "anilist_genre", "anilist_season", "anilist_tag", @@ -950,6 +951,17 @@ class CollectionBuilder: new_dictionary["limit"] = get_int(method_name, "limit", dict_data, dict_methods, 100, maximum=1000) self.methods.append((method_name, [new_dictionary])) + elif method_name == "anidb_tag": + new_dictionary = {} + dict_methods = {dm.lower(): dm for dm in dict_data} + if "tag" not in dict_methods: + raise Failed("Collection Error: anidb_tag tag attribute is required") + elif not dict_data[dict_methods["tag"]]: + raise Failed("Collection Error: anidb_tag tag attribute is blank") + else: + new_dictionary["tag"] = util.regex_first_int(dict_data[dict_methods["username"]], "AniDB Tag ID") + new_dictionary["limit"] = get_int(method_name, "limit", dict_data, dict_methods, 0, minimum=0) + self.methods.append((method_name, [new_dictionary])) elif "anilist" in method_name: new_dictionary = {"sort_by": "score"} dict_methods = {dm.lower(): dm for dm in dict_data} diff --git a/modules/config.py b/modules/config.py index 392bfaa2..fcfd0997 100644 --- a/modules/config.py +++ b/modules/config.py @@ -1,4 +1,4 @@ -import logging, os +import logging, os, requests from datetime import datetime from modules import util from modules.anidb import AniDB @@ -188,6 +188,8 @@ class Config: util.print_multiline(options) return default + self.session = requests.Session() + self.general = {} self.general["cache"] = check_for_attribute(self.data, "cache", parent="settings", var_type="bool", default=True) self.general["cache_expiration"] = check_for_attribute(self.data, "cache_expiration", parent="settings", var_type="int", default=60) @@ -274,9 +276,8 @@ class Config: util.separator() self.AniDB = None - anidb_username = check_for_attribute(self.data, "username", parent="anidb", throw=False, default=False) - anidb_password = check_for_attribute(self.data, "username", parent="anidb", throw=False, default=False) - if "anidb" in self.data and anidb_username and anidb_password: + if "anidb" in self.data: + util.separator() logger.info("Connecting to AniDB...") self.anidb = {} try: @@ -285,13 +286,10 @@ class Config: self.AniDB = AniDB(self.anidb, self) except Failed as e: logger.error(e) - logger.info(f"My Anime List Connection {'Failed' if self.MyAnimeList is None else 'Successful'}") - else: - logger.info("Using guest authentication for AniDB") + logger.info(f"My Anime List Connection {'Failed Continuing as Guest ' if self.MyAnimeList is None else 'Successful'}") + if self.AniDB is None: self.AniDB = AniDB(None, self) - util.separator() - self.TVDb = TVDb(self) self.IMDb = IMDb(self) self.Convert = Convert(self)