media: read dimensions from file if needed

This commit is contained in:
Tulir Asokan
2026-03-29 17:02:13 +03:00
parent 4f4680b19a
commit 190e65edfb
2 changed files with 30 additions and 1 deletions

View File

@@ -1282,6 +1282,7 @@ func (t *TelegramClient) transferEmojisToMatrix(ctx context.Context, customEmoji
for _, customEmojiDocument := range customEmojiDocuments {
mxcURI, _, _, err := media.NewTransferer(t.client.API()).
WithStickerConfig(t.main.Config.AnimatedSticker).
WithForceWebmStickerConvert(true).
WithDocument(customEmojiDocument, false).
Transfer(ctx, t.main.Store, t.main.Bridge.Bot)
if err != nil {

View File

@@ -20,6 +20,7 @@ import (
"bytes"
"context"
"fmt"
"image"
"io"
"os"
"strings"
@@ -143,6 +144,16 @@ func (t *Transferer) WithStickerConfig(cfg AnimatedStickerConfig) *Transferer {
return t
}
func (t *Transferer) WithForceWebmStickerConvert(force bool) *Transferer {
if force {
t.animatedStickerConfig.ConvertFromWebm = true
if t.animatedStickerConfig.Target == "webm" {
t.animatedStickerConfig.Target = "webp"
}
}
return t
}
func adjustStickerSize(info *event.FileInfo) {
if info.Width <= 256 && info.Height <= 256 {
return
@@ -306,15 +317,32 @@ func (t *ReadyTransferer) Transfer(ctx context.Context, store *store.Container,
needStickerConvert := t.inner.animatedStickerConfig != nil && (t.inner.fileInfo.MimeType == "application/x-tgsticker" ||
(t.inner.fileInfo.MimeType == "video/webm" && t.inner.animatedStickerConfig.ConvertFromWebm && t.inner.animatedStickerConfig.Target != "webm"))
needsDimensions := strings.HasPrefix(t.inner.fileInfo.MimeType, "image/") &&
t.inner.fileInfo.Width == 0 && t.inner.fileInfo.Height == 0
var thumbnailData []byte
var thumbnailMIMEType string
mxc, encryptedFileInfo, err = intent.UploadMediaStream(ctx, t.inner.roomID, int64(t.inner.fileInfo.Size), needStickerConvert, func(file io.Writer) (*bridgev2.FileStreamResult, error) {
mxc, encryptedFileInfo, err = intent.UploadMediaStream(ctx, t.inner.roomID, int64(t.inner.fileInfo.Size), needStickerConvert || needsDimensions, func(file io.Writer) (*bridgev2.FileStreamResult, error) {
_, err := io.Copy(file, reader)
if err != nil {
return nil, fmt.Errorf("failed to stream download: %w", err)
}
var replacementFile string
if needsDimensions {
osFile := file.(*os.File)
_, err = osFile.Seek(0, io.SeekStart)
if err != nil {
return nil, fmt.Errorf("failed to seek to start of file for sticker conversion: %w", err)
}
cfg, _, err := image.DecodeConfig(osFile)
if err != nil {
log.Debug().Err(err).Msg("Failed to decode image to detect dimensions")
} else {
t.inner.fileInfo.Width = cfg.Width
t.inner.fileInfo.Height = cfg.Height
t.inner.adjustStickerSize()
}
}
if needStickerConvert {
osFile := file.(*os.File)
_, err = osFile.Seek(0, io.SeekStart)