diff --git a/embed_util.py b/embed_util.py index d5d1edb..a1931f3 100644 --- a/embed_util.py +++ b/embed_util.py @@ -48,16 +48,7 @@ class ListManga(discord.ui.View): self.add_button.disabled = self.manga_list[self.index] in self.user_manga_list self.remove.disabled = self.manga_list[self.index] not in self.user_manga_list - async def force_reload(self): - await self.update_buttons() - self.msg = await self.msg.edit( - embed=manga_embed(self.manga_list, self.index), - attachments=[ - parallel_downloads.discord_file_from_filename(self.thumbnail_files[self.index]) - ], - view=self - ) async def print_manga(self, interaction: discord.Interaction): @@ -65,7 +56,13 @@ class ListManga(discord.ui.View): await self.update_buttons() - await self.force_reload() + await interaction.message.edit( + embed=await manga_embed(self.manga_list, self.index), + attachments=[ + parallel_downloads.discord_file_from_filename(self.thumbnail_files[self.index]) + ], + view=self + ) @discord.ui.button(label=prev_label, style=discord.ButtonStyle.grey) async def previous(self, interaction: discord.Interaction, button: discord.ui.Button): @@ -113,11 +110,11 @@ def gen_manga_files(manga_list: list[Manga]): return parallel_downloads.parallel_download(manga_list) -def manga_embed(manga_list: list[Manga], index: int): +async def manga_embed(manga_list: list[Manga], index: int): manga = manga_list[index] e = discord.Embed(title=f"({index + 1}\\{len(manga_list)}) {manga.get_title()}", description=manga.get_description(), url=manga.get_url()) - extension = manga.get_cover_art_extension() + extension = await manga.get_cover_art_extension() e.set_thumbnail(url=f"attachment://{manga.id}.{extension}") return e @@ -138,14 +135,14 @@ def get_chapter_filenames(manga: Manga): return parallel_downloads.parallel_download([manga]) -def chapter_embed(manga: Manga, chapter: Chapter): +async def chapter_embed(manga: Manga, chapter: Chapter): volume_info = f"Volume {chapter.get_volume()}" if chapter.get_volume() else "" - chapter_title = f"{chapter.get_title()}" if chapter.get_title() else "" + chapter_title = f"\"{chapter.get_title()}\" " if chapter.get_title() else "" e = discord.Embed( - title=f'"{manga.get_title()}" Chapter {chapter_title} Released!', + title=f'"{manga.get_title()}" Chapter {chapter_title}Released!', description=f"{volume_info} Chapter {chapter.get_number()} of {manga.get_title()} Released." f"\nGo read it now!", url=chapter.get_url() ) - e.set_thumbnail(url=f"attachment://{manga.id}.{manga.get_cover_art_extension()}") + e.set_thumbnail(url=f"attachment://{manga.id}.{await manga.get_cover_art_extension()}") return e diff --git a/main.py b/main.py index 264b7aa..725e95b 100644 --- a/main.py +++ b/main.py @@ -8,6 +8,7 @@ from dotenv import load_dotenv import embed_util import manager import manga_api +from util import parallel_downloads mh = manga_api.MangaHandler() @@ -32,16 +33,18 @@ async def first_command(interaction: discord.Interaction): async def render_manga_list_in_dm(interaction: discord.Interaction, manga_list: list[manga_api.Manga]): chanel = await interaction.user.create_dm() + await interaction.followup.send("Check your DM's") if len(manga_list) == 0: await chanel.send("No Manga in Here") return - list_msg = await interaction.followup.send(embed=embed_util.manga_list_embed(manga_list)) + list_msg = await chanel.send(embed=embed_util.manga_list_embed(manga_list)) view = embed_util.ListManga(manga_list, await man.get_user_mangas(interaction.user)) - msg = await interaction.followup.send(view=view, embed=embed_util.manga_embed(manga_list, 0)) - view.set_msg(msg) - await view.force_reload() + msg = await chanel.send(view=view, embed=await embed_util.manga_embed(manga_list, 0), + files=[parallel_downloads.discord_file_from_filename(filename) for filename in + embed_util.get_chapter_filenames(manga_list[0])] + ) await view.wait() diff --git a/manager.py b/manager.py index 416114d..4cf00be 100644 --- a/manager.py +++ b/manager.py @@ -76,7 +76,7 @@ class Manager: chapter: manga_api.Chapter) -> None: dm_channel = await user.create_dm() await dm_channel.send( - embed=embed_util.chapter_embed(manga, chapter), + embed=await embed_util.chapter_embed(manga, chapter), files=[parallel_downloads.discord_file_from_filename(filename) for filename in embed_util.get_chapter_filenames(manga)] ) diff --git a/manga_api.py b/manga_api.py index eb51ac0..462ba49 100644 --- a/manga_api.py +++ b/manga_api.py @@ -1,6 +1,6 @@ import os from dotenv import load_dotenv -import requests +import util.async_requests as requests import asyncio @@ -15,8 +15,6 @@ class Chapter: self.base_url = _base_url self.data = None - self.update_data() - @classmethod async def init(cls, id: str , _base_url=base_url): self = cls(id, _base_url) @@ -24,7 +22,7 @@ class Chapter: return self async def update_data(self): - r = requests.get( + r = await requests.get( f"{self.base_url}/chapter/{self.id}" ) self.data = r.json()["data"] @@ -72,7 +70,7 @@ class Manga: async def update_data(self): - r = requests.get( + r = await requests.get( f"{self.base_url}/manga/{self.id}" ) self.data = r.json()["data"] @@ -87,21 +85,14 @@ class Manga: return "No Title" async def get_latest_chap(self) -> Chapter: - params = { - "manga": self.id, - "translatedLanguage": ["en"], - "order": { - "chapter": "desc" - } - } - r = requests.get( + r = await 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", ) if r.json()["total"] == 0: - r = requests.get( + r = await 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", @@ -109,26 +100,26 @@ class Manga: latest_chap = r.json()["data"][0] - return Chapter(latest_chap["id"]) + return await Chapter.init(latest_chap["id"]) - def get_cover_art_url(self): + async 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}") + r = await 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): + async 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}") + r = await 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 @@ -149,8 +140,8 @@ class Manga: "id": self.id, "title": self.get_title(), "url": self.get_url(), - "art_url": self.get_cover_art_url(), - "latest_chapter": str(asyncio.ensure_future(self.get_latest_chap())) + "art_url": asyncio.gather(self.get_cover_art_url()), + "latest_chapter": str(asyncio.gather(self.get_latest_chap())) }) def __eq__(self, other): @@ -162,7 +153,7 @@ class MangaHandler: self.base_url = base_url async def search(self, title: str) -> list[Manga]: - r = requests.get( + r = await requests.get( f"{self.base_url}/manga", params={"title": title} ) @@ -170,7 +161,7 @@ class MangaHandler: manga_list: list[Manga] = [] for manga in data: manga_id = manga["id"] - manga_list.append(Manga(manga_id)) + manga_list.append(await Manga.init(manga_id)) return manga_list diff --git a/util/async_requests.py b/util/async_requests.py new file mode 100644 index 0000000..9e4440b --- /dev/null +++ b/util/async_requests.py @@ -0,0 +1,7 @@ +import asyncio + +import requests + + +async def get(*args, **kwargs): + return await asyncio.to_thread(requests.get, *args, **kwargs) \ No newline at end of file diff --git a/util/parallel_downloads.py b/util/parallel_downloads.py index 5cc6723..ac6b955 100644 --- a/util/parallel_downloads.py +++ b/util/parallel_downloads.py @@ -1,7 +1,7 @@ import concurrent.futures import requests import os.path - +import asyncio import discord from manga_api import Manga @@ -12,9 +12,9 @@ DOWNLOAD_DIRECTORY = 'tmp/' def discord_file_from_filename(filename: str) -> discord.File: return discord.File(f"{DOWNLOAD_DIRECTORY}{filename}",filename) def download_file(manga: Manga) -> str: - extension = manga.get_cover_art_extension() + extension = asyncio.run(manga.get_cover_art_extension()) if not os.path.isfile(f'{DOWNLOAD_DIRECTORY}/{manga.id}.{extension}'): - img_data = requests.get(manga.get_cover_art_url()).content + img_data = requests.get(asyncio.run(manga.get_cover_art_url())).content with open(f'{DOWNLOAD_DIRECTORY}/{manga.id}.{extension}', 'wb') as handler: handler.write(img_data) return f"{manga.id}.{extension}"