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 {
|
for _, customEmojiDocument := range customEmojiDocuments {
|
||||||
mxcURI, _, _, err := media.NewTransferer(t.client.API()).
|
mxcURI, _, _, err := media.NewTransferer(t.client.API()).
|
||||||
WithStickerConfig(t.main.Config.AnimatedSticker).
|
WithStickerConfig(t.main.Config.AnimatedSticker).
|
||||||
|
WithForceWebmStickerConvert(true).
|
||||||
WithDocument(customEmojiDocument, false).
|
WithDocument(customEmojiDocument, false).
|
||||||
Transfer(ctx, t.main.Store, t.main.Bridge.Bot)
|
Transfer(ctx, t.main.Store, t.main.Bridge.Bot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"image"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -143,6 +144,16 @@ func (t *Transferer) WithStickerConfig(cfg AnimatedStickerConfig) *Transferer {
|
|||||||
return t
|
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) {
|
func adjustStickerSize(info *event.FileInfo) {
|
||||||
if info.Width <= 256 && info.Height <= 256 {
|
if info.Width <= 256 && info.Height <= 256 {
|
||||||
return
|
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" ||
|
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"))
|
(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 thumbnailData []byte
|
||||||
var thumbnailMIMEType string
|
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)
|
_, err := io.Copy(file, reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to stream download: %w", err)
|
return nil, fmt.Errorf("failed to stream download: %w", err)
|
||||||
}
|
}
|
||||||
var replacementFile string
|
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 {
|
if needStickerConvert {
|
||||||
osFile := file.(*os.File)
|
osFile := file.(*os.File)
|
||||||
_, err = osFile.Seek(0, io.SeekStart)
|
_, err = osFile.Seek(0, io.SeekStart)
|
||||||
|
|||||||
Reference in New Issue
Block a user