# # Copyright (C) 2021-2022 by TeamYukki@Github, < https://github.com/TeamYukki >. # # This file is part of < https://github.com/TeamYukki/YukkiMusicBot > project, # and is released under the "GNU v3.0 License Agreement". # Please see < https://github.com/TeamYukki/YukkiMusicBot/blob/master/LICENSE > # # All rights reserved. import os import re import textwrap import traceback import aiofiles import aiohttp from PIL import (Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont, ImageOps) from youtubesearchpython.__future__ import VideosSearch from config import MUSIC_BOT_NAME, YOUTUBE_IMG_URL def changeImageSize(maxWidth, maxHeight, image): widthRatio = maxWidth / image.size[0] heightRatio = maxHeight / image.size[1] newWidth = int(widthRatio * image.size[0]) newHeight = int(heightRatio * image.size[1]) newImage = image.resize((newWidth, newHeight)) return newImage async def gen_thumb(videoid): if os.path.isfile(f"cache/{videoid}.png"): return f"cache/{videoid}.png" url = f"https://www.youtube.com/watch?v={videoid}" try: results = VideosSearch(url, limit=1) for result in (await results.next())["result"]: try: title = result["title"] title = re.sub("\W+", " ", title) title = title.title() except: title = "Unsupported Title" try: duration = result["duration"] except: duration = "Unknown Mins" thumbnail = result["thumbnails"][0]["url"].split("?")[0] try: views = result["viewCount"]["short"] except: views = "Unknown Views" try: channel = result["channel"]["name"] except: channel = "Unknown Channel" async with aiohttp.ClientSession() as session: async with session.get(thumbnail) as resp: if resp.status == 200: f = await aiofiles.open( f"cache/thumb{videoid}.png", mode="wb" ) await f.write(await resp.read()) await f.close() youtube = Image.open(f"cache/thumb{videoid}.png") image1 = changeImageSize(1280, 720, youtube) image2 = image1.convert("RGBA") background = image2.filter(filter=ImageFilter.BoxBlur(30)) enhancer = ImageEnhance.Brightness(background) background = enhancer.enhance(0.6) Xcenter = youtube.width / 2 Ycenter = youtube.height / 2 x1 = Xcenter - 250 y1 = Ycenter - 250 x2 = Xcenter + 250 y2 = Ycenter + 250 logo = youtube.crop((x1, y1, x2, y2)) logo.thumbnail((520, 520), Image.Resampling.LANCZOS) logo = ImageOps.expand(logo, border=15, fill="white") background.paste(logo, (50, 100)) draw = ImageDraw.Draw(background) font = ImageFont.truetype("assets/font2.ttf", 40) font2 = ImageFont.truetype("assets/font2.ttf", 70) arial = ImageFont.truetype("assets/font2.ttf", 30) name_font = ImageFont.truetype("assets/font.ttf", 30) para = textwrap.wrap(title, width=32) j = 0 draw.text( (5, 5), f"{MUSIC_BOT_NAME}", fill="white", font=name_font ) draw.text( (600, 150), "NOW PLAYING", fill="white", stroke_width=2, stroke_fill="white", font=font2, ) for line in para: if j == 1: j += 1 draw.text( (600, 340), f"{line}", fill="white", stroke_width=1, stroke_fill="white", font=font, ) if j == 0: j += 1 draw.text( (600, 280), f"{line}", fill="white", stroke_width=1, stroke_fill="white", font=font, ) draw.text( (600, 450), f"Views : {views[:23]}", (255, 255, 255), font=arial, ) draw.text( (600, 500), f"Duration : {duration[:23]} Mins", (255, 255, 255), font=arial, ) draw.text( (600, 550), f"Channel : {channel}", (255, 255, 255), font=arial, ) try: os.remove(f"cache/thumb{videoid}.png") except: pass background.save(f"cache/{videoid}.png") return f"cache/{videoid}.png" except Exception: print(traceback.format_exc()) return YOUTUBE_IMG_URL