Telethon-Music / Zaid /helpers /thumbnail.py
xteamki's picture
Upload 6 files
a58f1cc verified
import os
import re
import textwrap
import random
import aiofiles
import aiohttp
from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont, ImageOps, ImageChops
from youtubesearchpython.__future__ import VideosSearch
MUSIC_BOT_NAME = "Telethon Music"
YOUTUBE_IMG_URL = "https://telegra.ph/file/95d96663b73dbf278f28c.jpg"
files = []
for filename in os.listdir("./thumbnail"):
if filename.endswith("png"):
files.append(filename[:-4])
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 add_corners(im):
bigsize = (im.size[0] * 3, im.size[1] * 3)
mask = Image.new('L', bigsize, 0)
ImageDraw.Draw(mask).ellipse((0, 0) + bigsize, fill=255)
mask = mask.resize(im.size, Image.ANTIALIAS)
mask = ImageChops.darker(mask, im.split()[-1])
im.putalpha(mask)
async def gen_thumb(videoid):
anime = random.choice(files)
if os.path.isfile(f"cache/{videoid}_{anime}.png"):
return f"cache/{videoid}_{anime}.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"
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")
bg = Image.open(f"thumbnail/{anime}.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)
cir = Image.open(f"thumbnail/IMG_20221129_201846_195.png")
image3 = changeImageSize(1280, 720, bg)
circle = changeImageSize(1280, 720, cir)
image5 = image3.convert("RGBA")
Image.alpha_composite(background, image5).save(f"cache/temp{videoid}.png")
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.ANTIALIAS)
logo.save(f"cache/chop{videoid}.png")
if not os.path.isfile(f"cache/cropped{videoid}.png"):
im = Image.open(f"cache/chop{videoid}.png").convert('RGBA')
add_corners(im)
im.save(f"cache/cropped{videoid}.png")
crop_img = Image.open(f"cache/cropped{videoid}.png")
logo = crop_img.convert("RGBA")
logo.thumbnail((365, 365), Image.ANTIALIAS)
width = int((1280 - 365)/ 2)
background = Image.open(f"cache/temp{videoid}.png")
background.paste(logo, (width + 2, 134), mask=logo)
background.paste(circle, mask=circle)
draw = ImageDraw.Draw(background)
font = ImageFont.truetype("thumbnail/font2.ttf", 45)
font2 = ImageFont.truetype("thumbnail/font2.ttf", 70)
arial = ImageFont.truetype("thumbnail/font2.ttf", 30)
name_font = ImageFont.truetype("thumbnail/font.ttf", 30)
para = textwrap.wrap(title, width=32)
j = 0
try:
if para[0]:
text_w, text_h = draw.textsize(f"{para[0]}", font=font)
draw.text(((1280 - text_w)/2, 530), f"{para[0]}", fill="white", stroke_width=1, stroke_fill="white", font=font)
if para[1]:
text_w, text_h = draw.textsize(f"{para[1]}", font=font)
draw.text(((1280 - text_w)/2, 580), f"{para[1]}", fill="white", stroke_width=1, stroke_fill="white", font=font)
except:
pass
text_w, text_h = draw.textsize(f"Duration: {duration} Mins", font=arial)
draw.text(((1280 - text_w)/2, 660), f"Duration: {duration} Mins", fill="white", font=arial)
try:
os.remove(f"cache/thumb{videoid}.png")
except:
pass
background.save(f"cache/{videoid}_{anime}.png")
return f"cache/{videoid}_{anime}.png"
except Exception as e:
print(e)
return YOUTUBE_IMG_URL