mirror of
https://github.com/mautrix/telegram.git
synced 2026-05-17 07:25:46 +03:00
media: read dimensions from file if needed
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user