Spaces:
Running
Running
import os | |
import time | |
from pyrogram.types import Message | |
from PIL import Image | |
from Hellbot.core import Config | |
from .tools import runcmd | |
async def convert_to_gif(file: str, is_video: bool = False) -> str: | |
resultFileName = f"gif_{round(time.time())}.mp4" | |
if is_video: | |
cmd = f"ffmpeg -i '{file}' -c copy '{resultFileName}'" | |
else: | |
cmd = f"lottie_convert.py '{file}' '{resultFileName}'" | |
await runcmd(cmd) | |
return resultFileName | |
async def tgs_to_png(file: str) -> str: | |
resultFileName = f"png_{round(time.time())}.png" | |
cmd = f"lottie_convert.py '{file}' '{resultFileName}'" | |
await runcmd(cmd) | |
return resultFileName | |
async def image_to_sticker(file: str, max_size: tuple = (512, 512)) -> tuple[bool, str]: | |
try: | |
with Image.open(file) as img: | |
original_width, original_height = img.size | |
new_width = min(original_width, max_size[0]) | |
new_height = min(original_height, max_size[1]) | |
if original_width > max_size[0] or original_height > max_size[1]: | |
img = img.resize((new_width, new_height), Image.LANCZOS) | |
file_name = f"sticker_{int(time.time())}.png" | |
img.save(file_name, "PNG") | |
return True, file_name | |
except Exception as e: | |
return False, str(e) | |
async def video_to_png( | |
file: str, duration: float, output: str = None | |
) -> tuple[str, bool]: | |
resultFileName = output or f"{os.path.basename(file)}.png" | |
cut_at = duration // 2 | |
cmd = f"ffmpeg -ss {cut_at} -i '{file}' -vframes 1 '{resultFileName}'" | |
_, err, _, _ = await runcmd(cmd) | |
if err: | |
return err, False | |
return resultFileName, True | |
async def video_to_sticker(file: Message) -> tuple[str, bool]: | |
try: | |
if file.animation: | |
width, height = file.animation.width, file.animation.height | |
elif file.video: | |
width, height = file.video.width, file.video.height | |
else: | |
return "Unsupported media type.", False | |
file_path = await file.download(Config.TEMP_DIR) | |
output_path = os.path.join(Config.TEMP_DIR, "videoSticker.webm") | |
if height > width: | |
scale_params = f"scale=-1:512" | |
else: | |
scale_params = f"scale=512:-1" | |
cmd = ( | |
f"ffmpeg -i {file_path} " | |
f"-vf fps=30,{scale_params} -t 3 -c:v libvpx-vp9 -b:v 256k -an -pix_fmt yuv420p -auto-alt-ref 0 -loop 0 " | |
f"-f webm {output_path}" | |
) | |
await runcmd(cmd) | |
os.remove(file_path) | |
return output_path, True | |
except Exception as e: | |
return f"Error during conversion: {e}", False | |