2024-07-22 22:05:38 +01:00
|
|
|
import os
|
|
|
|
|
from dotenv import load_dotenv
|
2024-07-22 23:01:29 +01:00
|
|
|
import requests
|
2024-07-22 22:05:38 +01:00
|
|
|
|
|
|
|
|
load_dotenv()
|
|
|
|
|
|
2024-07-22 23:01:29 +01:00
|
|
|
base_url = "https://api.mangadex.org"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Chapter:
|
|
|
|
|
def __init__(self, id: str, _base_url=base_url):
|
|
|
|
|
self.id = id
|
|
|
|
|
self.base_url = _base_url
|
2024-07-23 00:32:44 +01:00
|
|
|
self.data = None
|
2024-07-22 23:01:29 +01:00
|
|
|
|
2024-07-23 00:32:44 +01:00
|
|
|
self.update_data()
|
|
|
|
|
|
|
|
|
|
def update_data(self):
|
2024-07-22 23:01:29 +01:00
|
|
|
r = requests.get(
|
|
|
|
|
f"{self.base_url}/chapter/{self.id}"
|
|
|
|
|
)
|
2024-07-23 00:32:44 +01:00
|
|
|
self.data = r.json()["data"]
|
2024-07-22 23:01:29 +01:00
|
|
|
|
2024-07-24 02:20:06 +01:00
|
|
|
def is_more_recent_than(self, chapter):
|
|
|
|
|
if chapter.get_volume() != self.get_volume():
|
|
|
|
|
return float(self.get_volume()) > float(chapter.get_volume())
|
|
|
|
|
return float(self.get_number()) > float(chapter.get_number())
|
|
|
|
|
|
|
|
|
|
def get_volume(self) -> str:
|
|
|
|
|
return self.data["attributes"]["volume"]
|
|
|
|
|
|
|
|
|
|
def get_number(self) -> str:
|
2024-07-23 00:32:44 +01:00
|
|
|
return self.data["attributes"]["chapter"]
|
2024-07-22 23:01:29 +01:00
|
|
|
|
2024-07-24 02:20:06 +01:00
|
|
|
def get_url(self) -> str:
|
|
|
|
|
return f"https://mangadex.org/chapter/{self.id}"
|
2024-07-22 23:01:29 +01:00
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return str({
|
2024-07-24 02:38:17 +01:00
|
|
|
"id": self.id,
|
2024-07-24 02:20:06 +01:00
|
|
|
"chapter_vol": self.get_volume(),
|
|
|
|
|
"chapter_num": self.get_number(),
|
|
|
|
|
"chapter_url": self.get_url()
|
2024-07-22 23:01:29 +01:00
|
|
|
})
|
2024-07-22 22:05:38 +01:00
|
|
|
|
|
|
|
|
|
2024-07-22 23:01:29 +01:00
|
|
|
class Manga:
|
|
|
|
|
def __init__(self, id: str, _base_url=base_url):
|
|
|
|
|
self.id = id
|
|
|
|
|
self.base_url = _base_url
|
2024-07-23 00:32:44 +01:00
|
|
|
self.data = None
|
|
|
|
|
|
|
|
|
|
self.update_data()
|
2024-07-22 23:01:29 +01:00
|
|
|
|
2024-07-23 00:32:44 +01:00
|
|
|
def update_data(self):
|
2024-07-22 23:01:29 +01:00
|
|
|
r = requests.get(
|
|
|
|
|
f"{self.base_url}/manga/{self.id}"
|
|
|
|
|
)
|
2024-07-23 00:32:44 +01:00
|
|
|
self.data = r.json()["data"]
|
2024-07-22 23:01:29 +01:00
|
|
|
|
|
|
|
|
def get_title(self) -> str:
|
2024-07-23 02:42:08 +01:00
|
|
|
try:
|
|
|
|
|
return self.data["attributes"]["title"]["en"]
|
|
|
|
|
except KeyError:
|
2024-07-23 14:19:45 +01:00
|
|
|
try:
|
|
|
|
|
return self.data["attributes"]["title"][0]
|
|
|
|
|
except KeyError:
|
|
|
|
|
return "No Title"
|
2024-07-22 23:01:29 +01:00
|
|
|
|
|
|
|
|
def get_latest_chap(self) -> Chapter:
|
2024-07-24 02:20:06 +01:00
|
|
|
params = {
|
|
|
|
|
"manga": self.id,
|
|
|
|
|
"translatedLanguage": ["en"],
|
|
|
|
|
"order": {
|
|
|
|
|
"chapter": "desc"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
r = requests.get(
|
|
|
|
|
f"{self.base_url}/chapter?manga={self.id}&originalLanguage%5B%5D=en&contentRating%5B%5D=safe"
|
|
|
|
|
f"&contentRating%5B%5D=suggestive&contentRating%5B%5D=erotica&includeFutureUpdates=1&order%5Bchapter%5D"
|
|
|
|
|
f"=desc",
|
|
|
|
|
|
|
|
|
|
)
|
|
|
|
|
print(r.request.__dict__)
|
|
|
|
|
print(r.json())
|
|
|
|
|
if r.json()["total"] == 0:
|
|
|
|
|
r = requests.get(
|
|
|
|
|
f"{self.base_url}/chapter?manga={self.id}&translatedLanguage%5B%5D=en&contentRating%5B%5D=safe"
|
|
|
|
|
f"&contentRating%5B%5D=suggestive&contentRating%5B%5D=erotica&includeFutureUpdates=1&order%5Bchapter"
|
|
|
|
|
f"%5D=desc",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
latest_chap = r.json()["data"][0]
|
|
|
|
|
|
|
|
|
|
return Chapter(latest_chap["id"])
|
2024-07-23 00:32:44 +01:00
|
|
|
|
|
|
|
|
def get_cover_art_url(self):
|
|
|
|
|
cover_art_id = ""
|
|
|
|
|
for relation in self.data["relationships"]:
|
|
|
|
|
if relation["type"] == "cover_art":
|
|
|
|
|
cover_art_id = relation["id"]
|
|
|
|
|
|
|
|
|
|
r = requests.get(f"{self.base_url}/cover/{cover_art_id}")
|
2024-07-23 02:42:08 +01:00
|
|
|
cover_fileName = r.json()["data"]["attributes"]["fileName"]
|
|
|
|
|
cover_extension = cover_fileName.split(".")[1]
|
|
|
|
|
return f"https://mangadex.org/covers/{self.id}/{cover_fileName}.256.{cover_extension}"
|
2024-07-23 00:32:44 +01:00
|
|
|
|
2024-07-23 14:19:45 +01:00
|
|
|
def get_cover_art_extension(self):
|
|
|
|
|
cover_art_id = ""
|
|
|
|
|
for relation in self.data["relationships"]:
|
|
|
|
|
if relation["type"] == "cover_art":
|
|
|
|
|
cover_art_id = relation["id"]
|
|
|
|
|
|
|
|
|
|
r = requests.get(f"{self.base_url}/cover/{cover_art_id}")
|
|
|
|
|
cover_fileName = r.json()["data"]["attributes"]["fileName"]
|
|
|
|
|
cover_extension = cover_fileName.split(".")[1]
|
|
|
|
|
return cover_extension
|
|
|
|
|
|
2024-07-23 00:32:44 +01:00
|
|
|
def get_description(self) -> str:
|
|
|
|
|
if "en" in self.data["attributes"]["description"].keys():
|
|
|
|
|
return self.data["attributes"]["description"]["en"]
|
|
|
|
|
else:
|
2024-07-23 14:19:45 +01:00
|
|
|
if len(list(self.data["attributes"]["description"].keys())) > 0:
|
2024-07-23 02:42:08 +01:00
|
|
|
return self.data["attributes"]["description"][list(self.data["attributes"]["description"].keys())[0]]
|
|
|
|
|
return ""
|
2024-07-23 00:32:44 +01:00
|
|
|
|
|
|
|
|
def get_url(self) -> str:
|
|
|
|
|
return f"https://mangadex.org/title/{self.id}"
|
2024-07-22 23:01:29 +01:00
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return str({
|
2024-07-24 02:38:17 +01:00
|
|
|
"id": self.id,
|
2024-07-22 23:01:29 +01:00
|
|
|
"title": self.get_title(),
|
2024-07-24 02:38:17 +01:00
|
|
|
"url": self.get_url(),
|
|
|
|
|
"art_url": self.get_cover_art_url(),
|
2024-07-22 23:01:29 +01:00
|
|
|
"latest_chapter": str(self.get_latest_chap())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MangaHandler:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.base_url = base_url
|
2024-07-22 22:05:38 +01:00
|
|
|
|
2024-07-22 23:01:29 +01:00
|
|
|
def search(self, title: str) -> list[Manga]:
|
|
|
|
|
r = requests.get(
|
|
|
|
|
f"{self.base_url}/manga",
|
|
|
|
|
params={"title": title}
|
|
|
|
|
)
|
|
|
|
|
data = r.json()["data"]
|
|
|
|
|
manga_list: list[Manga] = []
|
|
|
|
|
for manga in data:
|
|
|
|
|
manga_id = manga["id"]
|
|
|
|
|
manga_list.append(Manga(manga_id))
|
2024-07-22 22:29:18 +01:00
|
|
|
|
2024-07-22 23:01:29 +01:00
|
|
|
return manga_list
|
2024-07-22 22:29:18 +01:00
|
|
|
|
2024-07-22 22:05:38 +01:00
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2024-07-22 23:01:29 +01:00
|
|
|
mh = MangaHandler()
|
2024-07-24 02:38:17 +01:00
|
|
|
print(mh.search("Umineko no Naku Koro ni Episode 4: Alliance of the Golden Witch")[0])
|