feat(storage/telegram): enhance file upload handling with content length support and media type differentiation

This commit is contained in:
krau
2025-08-02 11:22:14 +08:00
parent 4c851cbbaf
commit ccf206d176

View File

@@ -14,10 +14,12 @@ import (
"github.com/gotd/td/telegram/message" "github.com/gotd/td/telegram/message"
"github.com/gotd/td/telegram/message/styling" "github.com/gotd/td/telegram/message/styling"
"github.com/gotd/td/telegram/uploader" "github.com/gotd/td/telegram/uploader"
"github.com/gotd/td/tg"
"github.com/krau/SaveAny-Bot/common/utils/tgutil" "github.com/krau/SaveAny-Bot/common/utils/tgutil"
"github.com/krau/SaveAny-Bot/config" "github.com/krau/SaveAny-Bot/config"
storconfig "github.com/krau/SaveAny-Bot/config/storage" storconfig "github.com/krau/SaveAny-Bot/config/storage"
"github.com/krau/SaveAny-Bot/pkg/consts/tglimit" "github.com/krau/SaveAny-Bot/pkg/consts/tglimit"
"github.com/krau/SaveAny-Bot/pkg/enums/ctxkey"
storenum "github.com/krau/SaveAny-Bot/pkg/enums/storage" storenum "github.com/krau/SaveAny-Bot/pkg/enums/storage"
"github.com/rs/xid" "github.com/rs/xid"
"golang.org/x/time/rate" "golang.org/x/time/rate"
@@ -100,19 +102,40 @@ func (t *Telegram) Save(ctx context.Context, r io.Reader, storagePath string) er
WithPartSize(tglimit.MaxUploadPartSize). WithPartSize(tglimit.MaxUploadPartSize).
WithThreads(config.Cfg.Threads) WithThreads(config.Cfg.Threads)
file, err := upler.FromReader(ctx, filename, rs) var file tg.InputFileClass
size := func() int64 {
if length := ctx.Value(ctxkey.ContentLength); length != nil {
if l, ok := length.(int64); ok {
return l
}
}
return -1 // unknown size
}()
if size < 0 {
file, err = upler.FromReader(ctx, filename, rs)
} else {
file, err = upler.Upload(ctx, uploader.NewUpload(filename, rs, size))
}
if err != nil { if err != nil {
return fmt.Errorf("failed to upload file to telegram: %w", err) return fmt.Errorf("failed to upload file to telegram: %w", err)
} }
caption := styling.Plain(filename) caption := styling.Plain(filename)
docb := message.UploadedDocument(file, caption). docb := message.UploadedDocument(file, caption).
Filename(filename). Filename(filename).
ForceFile(false). ForceFile(false).
MIME(mtype.String()) MIME(mtype.String())
var media message.MediaOption = docb
switch mtypeStr := mtype.String(); {
case strings.HasPrefix(mtypeStr, "video/"):
media = docb.Video().SupportsStreaming()
case strings.HasPrefix(mtypeStr, "audio/"):
media = docb.Audio().Title(filename)
}
sender := tctx.Sender sender := tctx.Sender
_, err = sender.WithUploader(upler).To(peer).Media(ctx, docb) _, err = sender.WithUploader(upler).To(peer).Media(ctx, media)
return err return err
} }