ONesVC_bot / YukkiMusic /utils /thumbnails.py
BinaryONe
Refresh Update
2f67506
#
# 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