againmusic / Devine /utils /thumbnails.py
taslim19
Initial commit
80287e2
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