From 190e65edfbb649d8fae7452a8ae8116d6ad15bc9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 29 Mar 2026 17:02:13 +0300 Subject: [PATCH] media: read dimensions from file if needed --- pkg/connector/handletelegram.go | 1 + pkg/connector/media/transfer.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/pkg/connector/handletelegram.go b/pkg/connector/handletelegram.go index 221058bc..528f5129 100644 --- a/pkg/connector/handletelegram.go +++ b/pkg/connector/handletelegram.go @@ -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 { diff --git a/pkg/connector/media/transfer.go b/pkg/connector/media/transfer.go index be7c08de..12d3572c 100644 --- a/pkg/connector/media/transfer.go +++ b/pkg/connector/media/transfer.go @@ -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)