mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-16 14:34:17 +02:00
Added and updated repositories 2026-03-23 01:30:41
This commit is contained in:
@@ -39,11 +39,11 @@ class Banners:
|
||||
def _prepare_cover(self, size, radius):
|
||||
cover = Image.open(io.BytesIO(self.track_cover)).convert("RGBA")
|
||||
cover = cover.resize((size, size), Image.Resampling.LANCZOS)
|
||||
|
||||
|
||||
mask = Image.new("L", (size, size), 0)
|
||||
draw = ImageDraw.Draw(mask)
|
||||
draw.rounded_rectangle((0, 0, size, size), radius=radius, fill=255)
|
||||
|
||||
|
||||
output = Image.new("RGBA", (size, size), (0, 0, 0, 0))
|
||||
output.paste(cover, (0, 0), mask=mask)
|
||||
return output
|
||||
@@ -59,15 +59,15 @@ class Banners:
|
||||
W, H = 1500, 600
|
||||
padding = 60
|
||||
cover_size = 480
|
||||
|
||||
|
||||
font_bytes = requests.get(self.font_url).content
|
||||
title_font = self._get_font(55, font_bytes)
|
||||
artist_font = self._get_font(45, font_bytes)
|
||||
lfm_font = self._get_font(35, font_bytes)
|
||||
lfm_font = self._get_font(55, font_bytes)
|
||||
|
||||
img = self._prepare_background(W, H)
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
|
||||
cover = self._prepare_cover(cover_size, 30)
|
||||
img.paste(cover, (padding, (H - cover_size) // 2), cover)
|
||||
|
||||
@@ -88,8 +88,8 @@ class Banners:
|
||||
draw.text((text_x, text_y_start), display_title, font=title_font, fill="white")
|
||||
draw.text((text_x, text_y_start + 70), display_artist, font=artist_font, fill="#B3B3B3")
|
||||
|
||||
bar_y = 480
|
||||
draw.text((text_x, bar_y), "last.fm", font=lfm_font, fill="white")
|
||||
text_y = 430
|
||||
draw.text((text_x, text_y), "last.fm", font=lfm_font, fill="white")
|
||||
|
||||
by = io.BytesIO()
|
||||
img.save(by, format="PNG")
|
||||
@@ -98,24 +98,24 @@ class Banners:
|
||||
return by
|
||||
|
||||
def vertical(self):
|
||||
W, H = 1000, 1500
|
||||
padding = 80
|
||||
W, H = 1000, 1300
|
||||
padding = 60
|
||||
cover_size = 800
|
||||
|
||||
|
||||
font_bytes = requests.get(self.font_url).content
|
||||
title_font = self._get_font(60, font_bytes)
|
||||
artist_font = self._get_font(45, font_bytes)
|
||||
lfm_font = self._get_font(35, font_bytes)
|
||||
lfm_font = self._get_font(60, font_bytes)
|
||||
|
||||
img = self._prepare_background(W, H)
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
cover = self._prepare_cover(cover_size, 40)
|
||||
cover_x = (W - cover_size) // 2
|
||||
cover_y = 120
|
||||
cover_y = 100
|
||||
img.paste(cover, (cover_x, cover_y), cover)
|
||||
|
||||
text_area_y = cover_y + cover_size + 120
|
||||
text_area_y = cover_y + cover_size + 60
|
||||
text_width_limit = W - (padding * 2)
|
||||
|
||||
display_title = self.title
|
||||
@@ -134,10 +134,10 @@ class Banners:
|
||||
artist_w = artist_font.getlength(display_artist)
|
||||
draw.text(((W - artist_w) / 2, text_area_y + 75), display_artist, font=artist_font, fill="#B3B3B3")
|
||||
|
||||
bar_y = text_area_y + 260
|
||||
|
||||
text_y = text_area_y + 180
|
||||
|
||||
lfm_w = lfm_font.getlength("last.fm")
|
||||
draw.text(((W - lfm_w) / 2, bar_y), "last.fm", font=lfm_font, fill="white")
|
||||
draw.text(((W - lfm_w) / 2, text_y), "last.fm", font=lfm_font, fill="white")
|
||||
|
||||
by = io.BytesIO()
|
||||
img.save(by, format="PNG")
|
||||
@@ -165,14 +165,6 @@ class lastfmmod(loader.Module):
|
||||
"nick_error": "<emoji document_id=5465665476971471368>❌</emoji> <b>Укажите ваш никнейм с last.fm</b>",
|
||||
"uploading": "<emoji document_id=5841359499146825803>🕔</emoji> <i>Загрузка баннера...</i>",
|
||||
}
|
||||
strings_jp = {
|
||||
"name": "LastFm",
|
||||
"no_track": "<emoji document_id=5465665476971471368>❌</emoji> <b>現在再生中のトラックはありません</b>",
|
||||
"_doc_text": "ファイルの横に表示されるテキスト",
|
||||
"_doc_username": "Last.fmのユーザー名",
|
||||
"nick_error": "<emoji document_id=5465665476971471368>❌</emoji> <b>Last.fmのニックネームを入力してください</b>",
|
||||
"uploading": "<emoji document_id=5841359499146825803>🕔</emoji> <i>バナーをアップロード中...</i>",
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
@@ -180,6 +172,7 @@ class lastfmmod(loader.Module):
|
||||
loader.ConfigValue("custom_text", "<emoji document_id=5413612466208799435>🤩</emoji> <b>{song_name}</b> — <b>{song_artist}</b>", lambda: self.strings["_doc_text"]),
|
||||
loader.ConfigValue("font", "https://raw.githubusercontent.com/kamekuro/assets/master/fonts/Onest-Bold.ttf", "Custom font URL (ttf)"),
|
||||
loader.ConfigValue("banner_version", "horizontal", lambda: "Banner version", validator=loader.validators.Choice(["horizontal", "vertical"])),
|
||||
loader.ConfigValue("fallback_cover", "https://lastfm.freetls.fastly.net/i/u/300x300/2a96cbd8b46e442fc41c2b86b821562f.png", "Fallback cover URL if track has no image"),
|
||||
)
|
||||
|
||||
@loader.command(alias="np")
|
||||
@@ -189,22 +182,27 @@ class lastfmmod(loader.Module):
|
||||
if not user:
|
||||
await self.invoke("config", "lastfm", message=message)
|
||||
return await utils.answer(message, self.strings["nick_error"])
|
||||
|
||||
|
||||
try:
|
||||
msg = await utils.answer(message, self.strings["uploading"])
|
||||
|
||||
url = f'http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&nowplaying=true&user={user}&api_key=460cda35be2fbf4f28e8ea7a38580730&format=json'
|
||||
data = requests.get(url).json()
|
||||
track = next((t for t in data.get('recenttracks', {}).get('track', []) if t.get('@attr', {}).get('nowplaying')), None)
|
||||
if not track:
|
||||
return await utils.answer(message, self.strings["no_track"])
|
||||
return await utils.answer(msg, self.strings["no_track"])
|
||||
name = track.get('name', 'Unknown')
|
||||
artist = track.get('artist', {}).get('#text', 'Unknown')
|
||||
caption = self.config["custom_text"].format(song_artist=artist, song_name=name)
|
||||
imgs = track.get('image', [])
|
||||
cov_url = next((i['#text'] for i in imgs if i['size'] == 'extralarge'), imgs[-1]['#text'] if imgs else None)
|
||||
|
||||
if not cov_url:
|
||||
return await utils.answer(message, caption)
|
||||
msg = await utils.answer(message, self.strings["uploading"])
|
||||
if not cov_url or not str(cov_url).strip():
|
||||
cov_url = self.config["fallback_cover"]
|
||||
|
||||
if not cov_url or not str(cov_url).strip():
|
||||
return await utils.answer(msg, caption)
|
||||
|
||||
cov_bytes = await utils.run_sync(requests.get, cov_url)
|
||||
banners = Banners(name, artist, cov_bytes.content, self.config["font"])
|
||||
file = await utils.run_sync(getattr(banners, self.config["banner_version"]))
|
||||
|
||||
Reference in New Issue
Block a user