add img tot gif command

This commit is contained in:
Nexus 2024-07-22 23:50:42 +01:00
parent 0ea4d4264e
commit dd485c1551
Signed by: nex
GPG key ID: 0FA334385D0B689F

View file

@ -12,11 +12,13 @@ import shutil
import sys import sys
import tempfile import tempfile
import typing import typing
from functools import partial
from pathlib import Path from pathlib import Path
import discord import discord
import httpx import httpx
import PIL.Image import PIL.Image
from PIL import Image
from discord.ext import commands from discord.ext import commands
from conf import VERSION from conf import VERSION
@ -324,6 +326,39 @@ class FFMeta(commands.Cog):
for page in paginator.pages: for page in paginator.pages:
await ctx.respond(page, ephemeral=True) await ctx.respond(page, ephemeral=True)
@commands.message_command(name="Convert Image to GIF")
async def convert_image_to_gif(self, ctx: discord.ApplicationContext, message: discord.Message):
await ctx.defer()
for attachment in message.attachments:
if attachment.content_type.startswith("image/"):
break
else:
return await ctx.respond("No image found.")
image = attachment
image: discord.Attachment
with tempfile.TemporaryFile("wb+") as f:
await image.save(f)
f.seek(0)
img = await self.bot.loop.run_in_executor(None, Image.open, f)
if img.format.upper() not in ("PNG", "JPEG", "WEBP", "HEIF", "BMP", "TIFF"):
return await ctx.respond("Image must be PNG, JPEG, WEBP, or HEIF.")
with tempfile.TemporaryFile("wb+") as f2:
caller = partial(img.save, f2, format="GIF")
await self.bot.loop.run_in_executor(None, caller)
f2.seek(0)
try:
await ctx.respond(file=discord.File(f2, filename="image.gif"))
except discord.HTTPException as e:
if e.code == 40005:
return await ctx.respond("Image is too large.")
return await ctx.respond(f"Failed to upload: `{e}`")
try:
f2.seek(0)
await ctx.user.send(file=discord.File(f2, filename="image.gif"))
except discord.Forbidden:
return await ctx.respond("Unable to mirror to your DM - am I blocked?", ephemeral=True)
def setup(bot: commands.Bot): def setup(bot: commands.Bot):
bot.add_cog(FFMeta(bot)) bot.add_cog(FFMeta(bot))