import os import re import aiofiles import aiohttp from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont from unidecode import unidecode from youtubesearchpython.__future__ import VideosSearch from Devine import app from config import 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 def clear(text): list = text.split(" ") title = "" for i in list: if len(title) + len(i) < 60: title += " " + i return title.strip() async def get_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(10)) enhancer = ImageEnhance.Brightness(background) background = enhancer.enhance(0.5) draw = ImageDraw.Draw(background) arial = ImageFont.truetype("Devine/assets/font2.ttf", 30) font = ImageFont.truetype("Devine/assets/font.ttf", 30) draw.text((1110, 8), unidecode(app.name), fill="white", font=arial) draw.text( (55, 560), f"{channel} | {views[:23]}", (255, 255, 255), font=arial, ) draw.text( (57, 600), clear(title), (255, 255, 255), font=font, ) draw.line( [(55, 660), (1220, 660)], fill="white", width=5, joint="curve", ) draw.ellipse( [(918, 648), (942, 672)], outline="white", fill="white", width=15, ) draw.text( (36, 685), "00:00", (255, 255, 255), font=arial, ) draw.text( (1185, 685), f"{duration[:23]}", (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 as e: print(e) return YOUTUBE_IMG_URL