Spaces:
Runtime error
Runtime error
File size: 7,542 Bytes
78b07ad |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
import io
import os
import time
from shutil import rmtree
import requests
from glitch_this import ImageGlitcher
from PIL import Image
from pyrogram.enums import MessageMediaType
from pyrogram.types import InputMediaDocument, InputMediaPhoto, Message
from Hellbot.core import ENV
from Hellbot.functions.images import deep_fry, download_images, get_wallpapers
from Hellbot.functions.tools import runcmd
from . import Config, HelpMenu, db, hellbot, on_message
def _chunk(images: list[str]) -> list[list]:
return [images[i : i + 10] for i in range(0, len(images), 10)]
@on_message(["image", "img"], allow_stan=True)
async def searchImage(_, message: Message):
if len(message.command) < 2:
return await hellbot.delete(message, "Provide a search query.")
limit = 5
query = await hellbot.input(message)
hell = await hellbot.edit(message, "Searching...")
if ";" in query:
try:
query, limit = query.split(";", 1)
except:
pass
to_send = []
images = await download_images(query, int(limit))
for image in images:
to_send.append(InputMediaPhoto(image))
if to_send:
if len(to_send) > 10:
for chunk in _chunk(to_send):
await hell.reply_media_group(chunk)
else:
await hell.reply_media_group(to_send)
await hellbot.delete(hell, "Uploaded!")
else:
await hellbot.delete(hell, "No images found.")
try:
rmtree("./images")
except:
pass
@on_message("wallpaper", allow_stan=True)
async def searchWallpaper(_, message: Message):
if len(message.command) < 2:
random = True
query = ""
else:
random = False
query = await hellbot.input(message)
to_send = []
limit = 10
hell = await hellbot.edit(message, "Processing...")
access = await db.get_env(ENV.unsplash_api)
if not access:
return await hellbot.delete(hell, "Unsplash API not found.")
if ";" in query:
try:
query, limit = query.split(";", 1)
limit = int(limit)
except:
pass
if limit > 30:
return await hellbot.delete(hell, "Limit should be less than 30.")
elif limit < 1:
return await hellbot.delete(hell, "Limit should be greater than 0.")
wallpapers = await get_wallpapers(access, limit, query, random)
if not wallpapers:
return await hellbot.delete(hell, "No wallpapers found.")
trash = []
for i, wallpaper in enumerate(wallpapers):
file_name = f"{i}_{int(time.time())}.jpg"
with open(file_name, "wb") as f:
f.write(requests.get(wallpaper).content)
to_send.append(InputMediaDocument(file_name))
trash.append(file_name)
await hell.reply_media_group(to_send)
await hellbot.delete(hell, "Uploaded!")
[os.remove(trash_file) for trash_file in trash]
@on_message("glitch", allow_stan=True)
async def glitcher(_, message: Message):
if not message.reply_to_message or not message.reply_to_message.media:
return await hellbot.delete(message, "Reply to a media message to glitch it.")
hell = await hellbot.edit(message, "Glitching...")
media = message.reply_to_message.media
intensity = 2
if len(message.command) > 1:
intensity = int(message.command[1]) if message.command[1].isdigit() else 2
if not 0 < intensity < 9:
await hell.edit("intensity should be between 1 and 8... now glitching at 8")
if media and media not in [
MessageMediaType.ANIMATION,
MessageMediaType.VIDEO,
MessageMediaType.PHOTO,
MessageMediaType.STICKER,
]:
return await hellbot.delete(hell, "Only media messages are supported.")
glitch_img = os.path.join(Config.TEMP_DIR, "glitch.png")
dwl_path = await message.reply_to_message.download(Config.DWL_DIR)
if dwl_path.endswith(".tgs"):
cmd = f"lottie_convert.py --frame 0 -if lottie -of png {dwl_path} {glitch_img}"
stdout, stderr, _, _ = await runcmd(cmd)
if not os.path.lexists(glitch_img):
return await hellbot.error(hell, f"`{stdout}`\n`{stderr}`")
elif dwl_path.endswith(".webp"):
os.rename(dwl_path, glitch_img)
if not os.path.lexists(glitch_img):
return await hellbot.error(hell, "File not found.")
elif media in [MessageMediaType.VIDEO, MessageMediaType.ANIMATION]:
cmd = f"ffmpeg -ss 0 -i {dwl_path} -vframes 1 {glitch_img}"
stdout, stderr, _, _ = await runcmd(cmd)
if not os.path.lexists(glitch_img):
return await hellbot.error(hell, f"`{stdout}`\n`{stderr}`")
else:
os.rename(dwl_path, glitch_img)
if not os.path.lexists(glitch_img):
return await hellbot.error(hell, "File not found.")
glitcher = ImageGlitcher()
img = Image.open(glitch_img)
glitch = glitcher.glitch_image(img, intensity, color_offset=True, gif=True)
output_path = os.path.join(Config.TEMP_DIR, "glitch.gif")
glitch[0].save(
fp=output_path,
format="GIF",
append_images=glitch[1:],
save_all=True,
duration=200,
loop=0,
)
await message.reply_animation(output_path)
await hellbot.delete(hell, f"Glitched at intensity {intensity}")
os.remove(output_path)
os.remove(glitch_img)
try:
os.remove(dwl_path)
except BaseException:
pass
@on_message("deepfry", allow_stan=True)
async def deepfry(_, message: Message):
if not message.reply_to_message or not message.reply_to_message.photo:
return await hellbot.delete(message, "Reply to a photo to deepfry it.")
if len(message.command) > 1:
try:
quality = int(message.command[1])
except ValueError:
quality = 2
else:
quality = 2
hell = await hellbot.edit(message, "Deepfrying...")
photo = await message.reply_to_message.download(Config.DWL_DIR)
if quality > 9:
quality = 9
elif quality < 1:
quality = 2
image = Image.open(photo)
for _ in range(quality):
image = await deep_fry(image)
fried = io.BytesIO()
fried.name = "deepfried.jpeg"
image.save(fried, "JPEG")
fried.seek(0)
await hell.reply_photo(fried)
await hellbot.delete(hell, "Deepfried!")
os.remove(photo)
HelpMenu("images").add(
"image",
"<query> ; <limit>",
"Search for x images on google and upload them to current chat,",
"image hellbot ; 5",
"An alias of 'img' can also be used.",
).add(
"wallpaper",
"<query> ; <limit>",
"Search for x wallpapers on unsplash and upload them to current chat. If no query is given, random wallpapers will be uploaded.",
"wallpaper supra ; 5",
"Need to setup Unsplash Api key from https://unsplash.com/join",
).add(
"glitch",
"<reply to media> <intensity>",
"Glitch a media message. It includes sticker, gif, photo, video. The intensity can be changed by passing an integer between 1 and 8. Default is 2.",
"glitch 4",
).add(
"deepfry",
"<reply to photo> <quality>",
"Deepfry a photo. The quality can be changed by passing an integer between 1 and 9. Default is 2.",
"deepfry 5",
).info(
"Image Tools"
).done()
|