forked from MALSync/MALSync
/
MyAnimeList.py
148 lines (118 loc) · 4.81 KB
/
MyAnimeList.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import re
import bs4 as bs
import itertools
import json
import requests
from WatchlistFlavorBase import WatchlistFlavorBase
class MyAnimeListWLF(WatchlistFlavorBase):
_URL = "https://myanimelist.net"
_TITLE = "MyAnimeList"
_NAME = "mal"
_IMAGE = "https://myanimelist.cdn-dena.com/images/mal-logo-xsmall@2x.png?v=160803001"
def login(self):
s = requests.session()
crsf_res = s.get(self._URL).text
crsf = (re.compile("<meta name='csrf_token' content='(.+?)'>").findall(crsf_res))[0]
payload = {
"user_name": self._username,
"password": self._password,
"cookie": 1,
"sublogin": "Login",
"submit": 1,
"csrf_token": crsf
}
url = self._to_url("login.php?from=%2F")
s.get(url)
result = s.post(url, data=payload)
soup = bs.BeautifulSoup(result.text, 'html.parser')
results = soup.find_all('div', attrs={"class":"badresult"})
if results:
return
return self._format_login_data(self._username, '', ('%s/%s' % (s.cookies['MALHLOGSESSID'], s.cookies['MALSESSIONID'])))
def watchlist(self):
url = self._to_url("animelist/%s" % (self._login_name))
return self._process_watchlist_view(url, '', "watchlist/%d", page=1)
def _base_watchlist_view(self, res):
base = {
"name": res[0],
"url": 'watchlist_status_type/' + str(res[1]),
"image": '',
"plot": '',
}
return self._parse_view(base)
def _process_watchlist_view(self, url, params, base_plugin_url, page):
all_results = map(self._base_watchlist_view, self._mal_statuses())
all_results = list(itertools.chain(*all_results))
return all_results
def _mal_statuses(self):
statuses = [
("All Anime", 7),
("Currently Watching", 1),
("Completed", 2),
("On Hold", 3),
("Dropped", 4),
("Plan to Watch", 6),
]
return statuses
def get_watchlist_status(self, status):
params = {
"status": status,
"order": self.__get_sort(),
}
url = self._to_url("animelist/%s/load.json" % (self._login_name))
return self._process_status_view(url, params, "watchlist/%d", page=1)
def _process_status_view(self, url, params, base_plugin_url, page):
results = json.loads(self._send_request(url, params=params))
all_results = map(self._base_watchlist_status_view, results)
all_results = list(itertools.chain(*all_results))
return all_results
def _base_watchlist_status_view(self, res):
IMAGE_ID_RE = re.search('anime/(.*).jpg', res["anime_image_path"])
image_id = IMAGE_ID_RE.group(1) if IMAGE_ID_RE else ""
base = {
"name": '%s - %d/%d' % (res["anime_title"], res["num_watched_episodes"], res["anime_num_episodes"]),
"url": "watchlist_query/%s/%s" % (res["anime_title"], res["anime_id"]),
"image": "https://myanimelist.cdn-dena.com/images/anime/%sl.jpg" %(image_id),
"plot": '',
}
return self._parse_view(base)
def __cookies(self):
logsess_id, sess_id = self._login_token.rsplit("/", 1)
cookies = {
'MALHLOGSESSID': logsess_id,
'MALSESSIONID': sess_id,
'is_logged_in': '1'
}
return cookies
def _kitsu_to_mal_id(self, kitsu_id):
arm_resp = requests.get("https://arm.now.sh/api/v1/search?type=kitsu&id=" + kitsu_id)
if arm_resp.status_code != 200:
raise Exception("AnimeID not found")
mal_id = json.loads(arm_resp.text)["services"]["mal"]
return mal_id
def watchlist_update(self, episode, kitsu_id):
mal_id = self._kitsu_to_mal_id(kitsu_id)
result = self._send_request(self._to_url("anime/%s" % (mal_id)), cookies=self.__cookies())
soup = bs.BeautifulSoup(result, 'html.parser')
csrf = soup.find("meta", {"name":"csrf_token"})["content"]
match = soup.find('h2', {'class' : 'mt8'})
if match:
url = self._to_url("ownlist/anime/edit.json")
else:
url = self._to_url("ownlist/anime/add.json")
return lambda: self.__update_library(url, episode, mal_id, csrf)
def __update_library(self, url, episode, mal_id, csrf):
payload = {
"anime_id": int(mal_id),
"status": 1,
"num_watched_episodes": int(episode),
"csrf_token": csrf
}
self._post_request(url, cookies=self.__cookies(), json=payload)
def __get_sort(self):
sort_types = {
"Anime Title": 1,
"Last Updated": 5,
"Progress": 12,
}
return sort_types[self._sort]