Spaces:
Runtime error
Runtime error
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 | |