From d40b5571b9e65f7e56c78e53319f637f99cbf683 Mon Sep 17 00:00:00 2001 From: Fdvkey Date: Wed, 15 Jul 2026 16:25:15 +0700 Subject: [PATCH] refactor: simplify exif injection by making processes return raw webp --- cmds/media/sticker.go | 25 ++++++++++++++----------- helper/media_convert.go | 32 +++++--------------------------- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/cmds/media/sticker.go b/cmds/media/sticker.go index d25e11a..d04e7c9 100644 --- a/cmds/media/sticker.go +++ b/cmds/media/sticker.go @@ -31,44 +31,47 @@ var Sticker = &core.Command{ quoted := hc.GetQuotedMessage(msg) var err error - var stickerData []byte + var rawWebp []byte var mediaData []byte if img := msg.GetImageMessage(); img != nil { mediaData, err = ctx.Client().Download(context.Background(), img) if err == nil { - stickerData, err = helper.ConvertImageToSticker(mediaData, exifPath) + rawWebp, err = helper.ConvertImageToWebp(mediaData) } } else if img := quoted.GetImageMessage(); img != nil && quoted != nil { mediaData, err = ctx.Client().Download(context.Background(), img) if err == nil { - stickerData, err = helper.ConvertImageToSticker(mediaData, exifPath) + rawWebp, err = helper.ConvertImageToWebp(mediaData) } } else if vid := msg.GetVideoMessage(); vid != nil { mediaData, err = ctx.Client().Download(context.Background(), vid) if err == nil { - stickerData, err = helper.ConvertVideoToSticker(mediaData, exifPath) + rawWebp, err = helper.ConvertVideoToWebp(mediaData) } } else if vid := quoted.GetVideoMessage(); vid != nil && quoted != nil { mediaData, err = ctx.Client().Download(context.Background(), vid) if err == nil { - stickerData, err = helper.ConvertVideoToSticker(mediaData, exifPath) + rawWebp, err = helper.ConvertVideoToWebp(mediaData) } } else if smsg := quoted.GetStickerMessage(); smsg != nil && quoted != nil { - mediaData, err = ctx.Client().Download(context.Background(), smsg) - if err == nil { - stickerData, err = helper.RewriteStickerExif(mediaData, exifPath) - } + rawWebp, err = ctx.Client().Download(context.Background(), smsg) } else { ctx.Reply("error: reply to image/video/sticker or send with caption") return } if err != nil { - ctx.Reply(fmt.Sprintf("error: %v", err)) + ctx.Reply(fmt.Sprintf("error processing media: %v", err)) return } - ctx.SendSticker(stickerData) + finalSticker, err := helper.InjectExif(rawWebp, exifPath) + if err != nil { + ctx.Reply(fmt.Sprintf("error injecting EXIF: %v", err)) + return + } + + ctx.SendSticker(finalSticker) }, } diff --git a/helper/media_convert.go b/helper/media_convert.go index 30942c3..9f4839e 100644 --- a/helper/media_convert.go +++ b/helper/media_convert.go @@ -10,10 +10,7 @@ import ( "github.com/google/uuid" ) -func ConvertImageToSticker(imgData []byte, exifPath string) ([]byte, error) { - webpPath := filepath.Join("temp", fmt.Sprintf("%s.webp", uuid.New().String())) - defer os.Remove(webpPath) - +func ConvertImageToWebp(imgData []byte) ([]byte, error) { convertCmd := exec.Command("convert", "-", "-resize", "512x512", "-background", "none", "-compose", "Copy", "-gravity", "center", "-extent", "512x512", "-quality", "100", "png:-") convertCmd.Stdin = bytes.NewReader(imgData) var convertBuf bytes.Buffer @@ -30,27 +27,13 @@ func ConvertImageToSticker(imgData []byte, exifPath string) ([]byte, error) { return nil, fmt.Errorf("cwebp failed: %w", err) } - tmpWebp := webpPath + ".tmp.webp" - if err := os.WriteFile(tmpWebp, cwebpBuf.Bytes(), 0644); err != nil { - return nil, err - } - defer os.Remove(tmpWebp) - - webpmuxCmd := exec.Command("webpmux", "-set", "exif", exifPath, tmpWebp, "-o", webpPath) - if err := webpmuxCmd.Run(); err != nil { - return nil, fmt.Errorf("webpmux failed: %w", err) - } - - return os.ReadFile(webpPath) + return cwebpBuf.Bytes(), nil } -func ConvertVideoToSticker(vidData []byte, exifPath string) ([]byte, error) { +func ConvertVideoToWebp(vidData []byte) ([]byte, error) { webpPath := filepath.Join("temp", fmt.Sprintf("%s.webp", uuid.New().String())) defer os.Remove(webpPath) - tmpWebp := webpPath + ".tmp.webp" - defer os.Remove(tmpWebp) - ffmpegCmd := exec.Command("ffmpeg", "-y", "-hide_banner", "-loglevel", "error", "-i", "pipe:0", "-f", "mp4", @@ -59,22 +42,17 @@ func ConvertVideoToSticker(vidData []byte, exifPath string) ([]byte, error) { "-compression_level", "6", "-q:v", "60", "-loop", "0", "-preset", "picture", "-an", "-fps_mode", "auto", - "-f", "webp", tmpWebp, + "-f", "webp", webpPath, ) ffmpegCmd.Stdin = bytes.NewReader(vidData) if err := ffmpegCmd.Run(); err != nil { return nil, fmt.Errorf("ffmpeg failed: %w", err) } - webpmuxCmd := exec.Command("webpmux", "-set", "exif", exifPath, tmpWebp, "-o", webpPath) - if err := webpmuxCmd.Run(); err != nil { - return nil, fmt.Errorf("webpmux failed: %w", err) - } - return os.ReadFile(webpPath) } -func RewriteStickerExif(webpData []byte, exifPath string) ([]byte, error) { +func InjectExif(webpData []byte, exifPath string) ([]byte, error) { webpPath := filepath.Join("temp", fmt.Sprintf("%s.webp", uuid.New().String())) defer os.Remove(webpPath)