62d6145c14
Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
86 lines
2.4 KiB
Go
86 lines
2.4 KiB
Go
package media
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/rs/zerolog"
|
|
"go.mau.fi/util/ffmpeg"
|
|
"go.mau.fi/util/lottie"
|
|
)
|
|
|
|
type AnimatedStickerConfig struct {
|
|
Target string `yaml:"target"`
|
|
ConvertFromWebm bool `yaml:"convert_from_webm"`
|
|
Args struct {
|
|
Width int `yaml:"width"`
|
|
Height int `yaml:"height"`
|
|
FPS int `yaml:"fps"`
|
|
} `yaml:"args"`
|
|
}
|
|
|
|
type ConvertedSticker struct {
|
|
Data []byte
|
|
MIMEType string
|
|
ThumbnailData []byte
|
|
ThumbnailMIMEType string
|
|
Width int
|
|
Height int
|
|
}
|
|
|
|
func (c AnimatedStickerConfig) convert(ctx context.Context, data []byte) ConvertedSticker {
|
|
if c.Target == "disable" {
|
|
return ConvertedSticker{Data: data, MIMEType: "application/x-tgsticker"}
|
|
}
|
|
|
|
log := zerolog.Ctx(ctx).With().Str("animated_sticker_target", c.Target).Logger()
|
|
|
|
if !lottie.Supported() {
|
|
log.Warn().Msg("lottie not supported, cannot convert animated stickers")
|
|
return ConvertedSticker{Data: data, MIMEType: "application/x-tgsticker"}
|
|
} else if (c.Target == "webp" || c.Target == "webm") && !ffmpeg.Supported() {
|
|
log.Warn().Msg("ffmpeg not supported, cannot convert animated stickers")
|
|
return ConvertedSticker{Data: data, MIMEType: "application/x-tgsticker"}
|
|
}
|
|
|
|
input := bytes.NewBuffer(data)
|
|
outputWriter := new(bytes.Buffer)
|
|
var thumbnailData []byte
|
|
var mimeType, thumbnailMIMEType string
|
|
|
|
var err error
|
|
switch c.Target {
|
|
case "png":
|
|
mimeType = "image/png"
|
|
err = lottie.Convert(ctx, input, "", outputWriter, c.Target, c.Args.Width, c.Args.Height, "1")
|
|
case "gif":
|
|
mimeType = "image/gif"
|
|
err = lottie.Convert(ctx, input, "", outputWriter, c.Target, c.Args.Width, c.Args.Height, strconv.Itoa(c.Args.FPS))
|
|
case "webm", "webp":
|
|
thumbnailMIMEType = "image/png"
|
|
outputWriter, mimeType, thumbnailData, err = lottie.FfmpegConvert(ctx, input, c.Target, c.Args.Width, c.Args.Height, c.Args.FPS)
|
|
default:
|
|
err = fmt.Errorf("unsupported target format %s", c.Target)
|
|
}
|
|
if err != nil {
|
|
log.Err(err).
|
|
Str("target", c.Target).
|
|
Msg("failed to convert animated sticker to target format")
|
|
|
|
// Fallback to original data
|
|
return ConvertedSticker{Data: data, MIMEType: "application/x-tgsticker"}
|
|
}
|
|
|
|
return ConvertedSticker{
|
|
Data: outputWriter.Bytes(),
|
|
MIMEType: mimeType,
|
|
ThumbnailData: thumbnailData,
|
|
ThumbnailMIMEType: thumbnailMIMEType,
|
|
Width: c.Args.Width,
|
|
Height: c.Args.Height,
|
|
}
|
|
|
|
}
|