ux changes, async requests
This commit is contained in:
parent
2a0941643c
commit
3cd3e44430
|
|
@ -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
11
main.py
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)]
|
||||||
)
|
)
|
||||||
|
|
|
||||||
37
manga_api.py
37
manga_api.py
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
async def get(*args, **kwargs):
|
||||||
|
return await asyncio.to_thread(requests.get, *args, **kwargs)
|
||||||
|
|
@ -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}"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue