Plex-Meta-Manager/modules/anidb.py

100 lines
4.5 KiB
Python
Raw Normal View History

2021-07-13 20:53:49 +00:00
import logging, requests, time
2021-01-20 21:37:59 +00:00
from lxml import html
from modules import util
from modules.util import Failed
from retrying import retry
logger = logging.getLogger("Plex Meta Manager")
2021-07-13 20:53:49 +00:00
builders = ["anidb_id", "anidb_relation", "anidb_popular", "anidb_tag"]
2021-03-30 05:50:53 +00:00
2021-06-14 15:24:11 +00:00
class AniDB:
2021-07-11 08:12:52 +00:00
def __init__(self, params, config):
2021-03-05 20:33:24 +00:00
self.config = config
2021-07-11 08:12:52 +00:00
2021-01-20 21:37:59 +00:00
self.urls = {
"anime": "https://anidb.net/anime",
"popular": "https://anidb.net/latest/anime/popular/?h=1",
2021-07-11 08:12:52 +00:00
"relation": "/relation/graph",
"anidb_tag": "https://anidb.net/tag",
"login": "https://anidb.net/perl-bin/animedb.pl"
2021-01-20 21:37:59 +00:00
}
2021-07-13 20:53:49 +00:00
if params:
if not self._login(params["username"], params["password"]).xpath("//li[@class='sub-menu my']/@title"):
2021-07-11 08:12:52 +00:00
raise Failed("AniDB Error: Login failed")
2021-01-20 21:37:59 +00:00
@retry(stop_max_attempt_number=6, wait_fixed=10000)
2021-05-07 19:53:54 +00:00
def _request(self, url, language):
2021-07-13 20:53:49 +00:00
return html.fromstring(self.config.session.get(url, headers={"Accept-Language": language, "User-Agent": "Mozilla/5.0 x64"}).content)
2021-07-11 08:12:52 +00:00
2021-07-13 20:53:49 +00:00
@retry(stop_max_attempt_number=6, wait_fixed=10000)
2021-07-11 08:12:52 +00:00
def _login(self, username, password):
data = {
"show": "main",
"xuser": username,
"xpass": password,
"xdoautologin": "on"
}
2021-07-13 20:53:49 +00:00
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)
2021-01-20 21:37:59 +00:00
2021-05-07 19:53:54 +00:00
def _popular(self, language):
response = self._request(self.urls["popular"], language)
2021-01-20 21:37:59 +00:00
return util.get_int_list(response.xpath("//td[@class='name anime']/a/@href"), "AniDB ID")
2021-05-07 19:53:54 +00:00
def _relations(self, anidb_id, language):
response = self._request(f"{self.urls['anime']}/{anidb_id}{self.urls['relation']}", language)
return util.get_int_list(response.xpath("//area/@href"), "AniDB ID")
def _validate(self, anidb_id, language):
response = self._request(f"{self.urls['anime']}/{anidb_id}", language)
2021-02-24 06:44:06 +00:00
ids = response.xpath(f"//*[text()='a{anidb_id}']/text()")
2021-01-20 21:37:59 +00:00
if len(ids) > 0:
return util.regex_first_int(ids[0], "AniDB ID")
2021-02-24 06:44:06 +00:00
raise Failed(f"AniDB Error: AniDB ID: {anidb_id} not found")
2021-01-20 21:37:59 +00:00
def validate_anidb_list(self, anidb_list, language):
anidb_values = []
for anidb_id in anidb_list:
try:
2021-05-07 19:53:54 +00:00
anidb_values.append(self._validate(anidb_id, language))
2021-01-20 21:37:59 +00:00
except Failed as e:
logger.error(e)
if len(anidb_values) > 0:
return anidb_values
2021-02-24 06:44:06 +00:00
raise Failed(f"AniDB Error: No valid AniDB IDs in {anidb_list}")
2021-01-20 21:37:59 +00:00
2021-07-11 08:12:52 +00:00
def _tag(self, tag, limit, language):
anidb_ids = []
2021-07-13 20:53:49 +00:00
current_url = f"{self.urls['anidb_tag']}/{tag}"
while True:
2021-07-11 08:12:52 +00:00
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")
2021-07-13 20:53:49 +00:00
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]
2021-07-11 08:12:52 +00:00
2021-05-09 05:37:45 +00:00
def get_items(self, method, data, language):
2021-01-20 21:37:59 +00:00
pretty = util.pretty_names[method] if method in util.pretty_names else method
2021-04-16 05:45:43 +00:00
anidb_ids = []
2021-01-20 21:37:59 +00:00
if method == "anidb_popular":
2021-05-09 05:37:45 +00:00
logger.info(f"Processing {pretty}: {data} Anime")
2021-05-07 19:53:54 +00:00
anidb_ids.extend(self._popular(language)[:data])
2021-07-11 08:12:52 +00:00
elif method == "anidb_tag":
anidb_ids = self._tag(data["tag"], data["limit"], language)
logger.info(f"Processing {pretty}: {data['limit'] if data['limit'] > 0 else 'All'} Anime from the Tag ID: {data['tag']}")
2021-01-20 21:37:59 +00:00
else:
2021-05-09 05:37:45 +00:00
logger.info(f"Processing {pretty}: {data}")
2021-04-16 05:45:43 +00:00
if method == "anidb_id": anidb_ids.append(data)
2021-05-07 19:53:54 +00:00
elif method == "anidb_relation": anidb_ids.extend(self._relations(data, language))
2021-02-24 06:44:06 +00:00
else: raise Failed(f"AniDB Error: Method {method} not supported")
2021-05-08 23:49:55 +00:00
movie_ids, show_ids = self.config.Convert.anidb_to_ids(anidb_ids)
2021-05-24 03:38:46 +00:00
logger.debug("")
2021-07-03 01:47:09 +00:00
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}")
2021-07-13 20:53:49 +00:00
return movie_ids, show_ids