ux changes, async requests

This commit is contained in:
franchioping 2024-07-24 23:07:10 +01:00
parent 2a0941643c
commit 3cd3e44430
6 changed files with 45 additions and 47 deletions

View File

@ -48,16 +48,7 @@ class ListManga(discord.ui.View):
self.add_button.disabled = self.manga_list[self.index] in self.user_manga_list 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 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): async def print_manga(self, interaction: discord.Interaction):
@ -65,7 +56,13 @@ class ListManga(discord.ui.View):
await self.update_buttons() 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) @discord.ui.button(label=prev_label, style=discord.ButtonStyle.grey)
async def previous(self, interaction: discord.Interaction, button: discord.ui.Button): 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) 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] manga = manga_list[index]
e = discord.Embed(title=f"({index + 1}\\{len(manga_list)}) {manga.get_title()}", e = discord.Embed(title=f"({index + 1}\\{len(manga_list)}) {manga.get_title()}",
description=manga.get_description(), url=manga.get_url()) 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}") e.set_thumbnail(url=f"attachment://{manga.id}.{extension}")
return e return e
@ -138,14 +135,14 @@ def get_chapter_filenames(manga: Manga):
return parallel_downloads.parallel_download([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 "" 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( 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." description=f"{volume_info} Chapter {chapter.get_number()} of {manga.get_title()} Released."
f"\nGo read it now!", f"\nGo read it now!",
url=chapter.get_url() 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 return e

11
main.py
View File

@ -8,6 +8,7 @@ from dotenv import load_dotenv
import embed_util import embed_util
import manager import manager
import manga_api import manga_api
from util import parallel_downloads
mh = manga_api.MangaHandler() 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]): async def render_manga_list_in_dm(interaction: discord.Interaction, manga_list: list[manga_api.Manga]):
chanel = await interaction.user.create_dm() chanel = await interaction.user.create_dm()
await interaction.followup.send("Check your DM's")
if len(manga_list) == 0: if len(manga_list) == 0:
await chanel.send("No Manga in Here") await chanel.send("No Manga in Here")
return 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)) 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)) msg = await chanel.send(view=view, embed=await embed_util.manga_embed(manga_list, 0),
view.set_msg(msg) files=[parallel_downloads.discord_file_from_filename(filename) for filename in
await view.force_reload() embed_util.get_chapter_filenames(manga_list[0])]
)
await view.wait() await view.wait()

View File

@ -76,7 +76,7 @@ class Manager:
chapter: manga_api.Chapter) -> None: chapter: manga_api.Chapter) -> None:
dm_channel = await user.create_dm() dm_channel = await user.create_dm()
await dm_channel.send( 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 files=[parallel_downloads.discord_file_from_filename(filename) for filename in
embed_util.get_chapter_filenames(manga)] embed_util.get_chapter_filenames(manga)]
) )

View File

@ -1,6 +1,6 @@
import os import os
from dotenv import load_dotenv from dotenv import load_dotenv
import requests import util.async_requests as requests
import asyncio import asyncio
@ -15,8 +15,6 @@ class Chapter:
self.base_url = _base_url self.base_url = _base_url
self.data = None self.data = None
self.update_data()
@classmethod @classmethod
async def init(cls, id: str , _base_url=base_url): async def init(cls, id: str , _base_url=base_url):
self = cls(id, _base_url) self = cls(id, _base_url)
@ -24,7 +22,7 @@ class Chapter:
return self return self
async def update_data(self): async def update_data(self):
r = requests.get( r = await requests.get(
f"{self.base_url}/chapter/{self.id}" f"{self.base_url}/chapter/{self.id}"
) )
self.data = r.json()["data"] self.data = r.json()["data"]
@ -72,7 +70,7 @@ class Manga:
async def update_data(self): async def update_data(self):
r = requests.get( r = await requests.get(
f"{self.base_url}/manga/{self.id}" f"{self.base_url}/manga/{self.id}"
) )
self.data = r.json()["data"] self.data = r.json()["data"]
@ -87,21 +85,14 @@ class Manga:
return "No Title" return "No Title"
async def get_latest_chap(self) -> Chapter: async def get_latest_chap(self) -> Chapter:
params = { r = await requests.get(
"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"{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"&contentRating%5B%5D=suggestive&contentRating%5B%5D=erotica&includeFutureUpdates=1&order%5Bchapter%5D"
f"=desc", f"=desc",
) )
if r.json()["total"] == 0: 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"{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"&contentRating%5B%5D=suggestive&contentRating%5B%5D=erotica&includeFutureUpdates=1&order%5Bchapter"
f"%5D=desc", f"%5D=desc",
@ -109,26 +100,26 @@ class Manga:
latest_chap = r.json()["data"][0] 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 = "" cover_art_id = ""
for relation in self.data["relationships"]: for relation in self.data["relationships"]:
if relation["type"] == "cover_art": if relation["type"] == "cover_art":
cover_art_id = relation["id"] 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_fileName = r.json()["data"]["attributes"]["fileName"]
cover_extension = cover_fileName.split(".")[1] cover_extension = cover_fileName.split(".")[1]
return f"https://mangadex.org/covers/{self.id}/{cover_fileName}.256.{cover_extension}" 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 = "" cover_art_id = ""
for relation in self.data["relationships"]: for relation in self.data["relationships"]:
if relation["type"] == "cover_art": if relation["type"] == "cover_art":
cover_art_id = relation["id"] 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_fileName = r.json()["data"]["attributes"]["fileName"]
cover_extension = cover_fileName.split(".")[1] cover_extension = cover_fileName.split(".")[1]
return cover_extension return cover_extension
@ -149,8 +140,8 @@ class Manga:
"id": self.id, "id": self.id,
"title": self.get_title(), "title": self.get_title(),
"url": self.get_url(), "url": self.get_url(),
"art_url": self.get_cover_art_url(), "art_url": asyncio.gather(self.get_cover_art_url()),
"latest_chapter": str(asyncio.ensure_future(self.get_latest_chap())) "latest_chapter": str(asyncio.gather(self.get_latest_chap()))
}) })
def __eq__(self, other): def __eq__(self, other):
@ -162,7 +153,7 @@ class MangaHandler:
self.base_url = base_url self.base_url = base_url
async def search(self, title: str) -> list[Manga]: async def search(self, title: str) -> list[Manga]:
r = requests.get( r = await requests.get(
f"{self.base_url}/manga", f"{self.base_url}/manga",
params={"title": title} params={"title": title}
) )
@ -170,7 +161,7 @@ class MangaHandler:
manga_list: list[Manga] = [] manga_list: list[Manga] = []
for manga in data: for manga in data:
manga_id = manga["id"] manga_id = manga["id"]
manga_list.append(Manga(manga_id)) manga_list.append(await Manga.init(manga_id))
return manga_list return manga_list

7
util/async_requests.py Normal file
View File

@ -0,0 +1,7 @@
import asyncio
import requests
async def get(*args, **kwargs):
return await asyncio.to_thread(requests.get, *args, **kwargs)

View File

@ -1,7 +1,7 @@
import concurrent.futures import concurrent.futures
import requests import requests
import os.path import os.path
import asyncio
import discord import discord
from manga_api import Manga from manga_api import Manga
@ -12,9 +12,9 @@ DOWNLOAD_DIRECTORY = 'tmp/'
def discord_file_from_filename(filename: str) -> discord.File: def discord_file_from_filename(filename: str) -> discord.File:
return discord.File(f"{DOWNLOAD_DIRECTORY}{filename}",filename) return discord.File(f"{DOWNLOAD_DIRECTORY}{filename}",filename)
def download_file(manga: Manga) -> str: 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}'): 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: with open(f'{DOWNLOAD_DIRECTORY}/{manga.id}.{extension}', 'wb') as handler:
handler.write(img_data) handler.write(img_data)
return f"{manga.id}.{extension}" return f"{manga.id}.{extension}"