diff --git a/embed_util.py b/embed_util.py index e54be66..8a6f3fb 100644 --- a/embed_util.py +++ b/embed_util.py @@ -3,6 +3,7 @@ import discord import os.path import requests +from util import parallel_downloads class ListManga(discord.ui.View): @@ -12,11 +13,16 @@ class ListManga(discord.ui.View): self.index = 0 self.manga_list = manga_list self.manga_files = gen_manga_files(self.manga_list) - self.msg = None + + async def force_reload(self, msg: discord.Message): + await msg.edit( + embed=manga_embed(self.manga_list[self.index]), + attachments=[self.manga_files[self.index]] + ) async def print_manga(self, interaction: discord.Interaction): await interaction.response.defer() - await self.msg.edit( + await interaction.message.edit( embed=manga_embed(self.manga_list[self.index]), attachments=[self.manga_files[self.index]] ) @@ -55,19 +61,13 @@ class ListManga(discord.ui.View): def gen_manga_files(manga_list: list[Manga]): - ret = [] - for manga in manga_list: - if not os.path.isfile(f'tmp/{manga.id}.jpg'): - img_data = requests.get(manga.get_cover_art_url()).content - with open(f'tmp/{manga.id}.jpg', 'wb') as handler: - handler.write(img_data) - ret.append(discord.File(f"tmp/{manga.id}.jpg", f"{manga.id}.jpg")) - return ret + + return parallel_downloads.parallel_download(manga_list) def manga_embed(manga: Manga): e = discord.Embed(title=manga.get_title(), description=manga.get_description(), url=manga.get_url()) - - e.set_thumbnail(url=f"attachment://{manga.id}.jpg") + extension = manga.get_cover_art_extension() + e.set_thumbnail(url=f"attachment://{manga.id}.{extension}") return e diff --git a/main.py b/main.py index 4286ccf..7f13a83 100644 --- a/main.py +++ b/main.py @@ -43,8 +43,9 @@ async def search_command( view = embed_util.ListManga(manga_list) await chanel.send(f"Hey, you searched for {title}") msg = await chanel.send(view=view, embed=embed_util.manga_embed(manga_list[0])) - view.msg = msg - await view.wait() + await view.force_reload(msg) + ret = await view.wait() + print(ret) await chanel.send("Done") diff --git a/manga.py b/manga.py index d65e620..113711e 100644 --- a/manga.py +++ b/manga.py @@ -51,7 +51,10 @@ class Manga: try: return self.data["attributes"]["title"]["en"] except KeyError: - return self.data["attributes"]["title"][0] + try: + return self.data["attributes"]["title"][0] + except KeyError: + return "No Title" def get_latest_chap(self) -> Chapter: return Chapter(self.data["attributes"]["latestUploadedChapter"]) @@ -65,16 +68,28 @@ class Manga: r = requests.get(f"{self.base_url}/cover/{cover_art_id}") - print( r.json()["data"]) 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 list(self.data["attributes"]["description"].keys()) > 0: + if len(list(self.data["attributes"]["description"].keys())) > 0: return self.data["attributes"]["description"][list(self.data["attributes"]["description"].keys())[0]] return "" diff --git a/util/parallel_downloads.py b/util/parallel_downloads.py new file mode 100644 index 0000000..af576d4 --- /dev/null +++ b/util/parallel_downloads.py @@ -0,0 +1,23 @@ +import concurrent.futures +import requests +import os.path + + +import discord +from manga import Manga + + +def download_file(manga: Manga): + extension = manga.get_cover_art_extension() + if not os.path.isfile(f'tmp/{manga.id}.{extension}'): + img_data = requests.get(manga.get_cover_art_url()).content + with open(f'tmp/{manga.id}.{extension}', 'wb') as handler: + handler.write(img_data) + return discord.File(f"tmp/{manga.id}.{extension}", f"{manga.id}.{extension}") + +def parallel_download(manga_list: list[Manga]) -> list[discord.File]: + with concurrent.futures.ThreadPoolExecutor() as exector: + result = exector.map(download_file, manga_list) + + return list(result) +