MangaBot/manga_api.py

128 lines
3.5 KiB
Python

import os
from dotenv import load_dotenv
import requests
load_dotenv()
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
self.data = None
self.update_data()
def update_data(self):
r = requests.get(
f"{self.base_url}/chapter/{self.id}"
)
self.data = r.json()["data"]
def get_chapter_num(self) -> str:
return self.data["attributes"]["chapter"]
def get_chapter_url(self) -> str:
return self.data["attributes"]["readableAt"]
def __str__(self):
return str({
"chapter_num": self.get_chapter_num(),
})
class Manga:
def __init__(self, id: str, _base_url=base_url):
self.id = id
self.base_url = _base_url
self.data = None
self.update_data()
def update_data(self):
r = requests.get(
f"{self.base_url}/manga/{self.id}"
)
self.data = r.json()["data"]
def get_title(self) -> str:
try:
return self.data["attributes"]["title"]["en"]
except KeyError:
try:
return self.data["attributes"]["title"][0]
except KeyError:
return "No Title"
def get_latest_chap(self) -> Chapter:
return Chapter(self.data["attributes"]["latestUploadedChapter"])
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}")
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}"
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
def get_description(self) -> str:
if "en" in self.data["attributes"]["description"].keys():
return self.data["attributes"]["description"]["en"]
else:
if len(list(self.data["attributes"]["description"].keys())) > 0:
return self.data["attributes"]["description"][list(self.data["attributes"]["description"].keys())[0]]
return ""
def get_url(self) -> str:
return f"https://mangadex.org/title/{self.id}"
def __str__(self):
return str({
"title": self.get_title(),
"latest_chapter": str(self.get_latest_chap())
})
class MangaHandler:
def __init__(self):
self.base_url = base_url
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))
return manga_list
if __name__ == "__main__":
mh = MangaHandler()
print(mh.search("Umineko no Naku Koro ni Episode 4: Alliance of the Golden Witch")[0].data)