| 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 |
|
|