Skip to content

Commit 8f3cc2e

Browse files
committed
media: fix lottie stickers not being decompressed
1 parent 6700403 commit 8f3cc2e

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

pkg/connector/directdownload.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (tc *TelegramConnector) Download(ctx context.Context, mediaID networkid.Med
161161
log.Debug().
162162
Int64("document_id", msgMedia.Document.GetID()).
163163
Bool("is_sticker", isSticker).
164-
Msg("downloading photo")
164+
Msg("downloading document")
165165
readyTransferer = transferer.WithDocument(msgMedia.Document, info.Thumbnail)
166166
case *tg.MessageMediaWebPage:
167167
webpage, ok := msgMedia.Webpage.(*tg.WebPage)
@@ -172,7 +172,7 @@ func (tc *TelegramConnector) Download(ctx context.Context, mediaID networkid.Med
172172
if pc, ok := webpage.GetPhoto(); ok && pc.TypeID() == tg.PhotoTypeID {
173173
log.Debug().
174174
Int64("photo_id", pc.GetID()).
175-
Msg("downloading photo")
175+
Msg("downloading webpage photo")
176176
readyTransferer = transferer.WithPhoto(pc)
177177
} else {
178178
return nil, fmt.Errorf("not a photo: %T", pc.TypeName())

pkg/connector/media/sticker.go

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ package media
1818

1919
import (
2020
"context"
21+
"fmt"
22+
"io"
2123
"os"
2224
"strconv"
2325

26+
"github.com/klauspost/compress/gzip"
2427
"github.com/rs/zerolog"
2528
"go.mau.fi/util/ffmpeg"
2629
"go.mau.fi/util/lottie"
@@ -107,13 +110,44 @@ func (c *AnimatedStickerConfig) convertWebm(ctx context.Context, src *os.File) *
107110
}
108111
}
109112

110-
func (c *AnimatedStickerConfig) convert(ctx context.Context, src *os.File) *ConvertedSticker {
111-
if c.Target == "disable" {
112-
return nil
113+
func extractGZip(src *os.File) (*ConvertedSticker, error) {
114+
reader, err := gzip.NewReader(src)
115+
if err != nil {
116+
return nil, fmt.Errorf("failed to create gzip reader: %w", err)
113117
}
118+
defer func() {
119+
_ = reader.Close()
120+
}()
121+
replFile, err := os.OpenFile(src.Name()+".json", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
122+
if err != nil {
123+
return nil, fmt.Errorf("failed to create temp file: %w", err)
124+
}
125+
defer func() {
126+
_ = replFile.Close()
127+
}()
128+
n, err := io.Copy(replFile, reader)
129+
if err != nil {
130+
return nil, fmt.Errorf("failed to extract lottie gzip: %w", err)
131+
}
132+
return &ConvertedSticker{
133+
Success: true,
134+
NewPath: replFile.Name(),
135+
MIMEType: "video/lottie+json",
136+
Size: int(n),
137+
}, nil
138+
}
114139

140+
func (c *AnimatedStickerConfig) convert(ctx context.Context, src *os.File) *ConvertedSticker {
115141
log := zerolog.Ctx(ctx).With().Str("animated_sticker_target", c.Target).Logger()
116142

143+
if c.Target == "disable" {
144+
converted, err := extractGZip(src)
145+
if err != nil {
146+
log.Err(err).Msg("Failed to extract lottie sticker")
147+
}
148+
return converted
149+
}
150+
117151
if !lottie.Supported() {
118152
log.Warn().Msg("Not converting lottie sticker as lottieconverter is not installed")
119153
return nil

pkg/connector/media/transfer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ func (t *ReadyTransferer) Transfer(ctx context.Context, store *store.Container,
293293
if t.inner.fileInfo.MimeType == "video/webm" {
294294
converted = t.inner.animatedStickerConfig.convertWebm(ctx, osFile)
295295
} else {
296-
t.inner.fileInfo.MimeType = "video/lottie+json"
296+
t.inner.fileInfo.MimeType = "application/x-tgsticker" // This is expected to get overridden by convert
297297
converted = t.inner.animatedStickerConfig.convert(ctx, osFile)
298298
}
299299
if converted != nil {
@@ -407,7 +407,7 @@ func (t *ReadyTransferer) ToDirectMediaResponse(ctx context.Context) (mediaproxy
407407
if t.inner.fileInfo.MimeType == "video/webm" {
408408
converted = t.inner.animatedStickerConfig.convertWebm(ctx, w)
409409
} else {
410-
t.inner.fileInfo.MimeType = "video/lottie+json"
410+
t.inner.fileInfo.MimeType = "application/x-tgsticker" // This is expected to get overridden by convert
411411
converted = t.inner.animatedStickerConfig.convert(ctx, w)
412412
}
413413
if converted == nil {

0 commit comments

Comments
 (0)