61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"math/big"
|
|
|
|
"github.com/dustin/go-humanize"
|
|
"github.com/gotd/td/telegram/message"
|
|
"github.com/gotd/td/telegram/uploader"
|
|
"github.com/gotd/td/tg"
|
|
)
|
|
|
|
type Uploader struct{}
|
|
|
|
var dlUploader Uploader
|
|
|
|
func (p Uploader) Chunk(ctx context.Context, state uploader.ProgressState) error {
|
|
dlQueue.HandleProgressPercentUpdate(uploadStr, int(state.Uploaded*100/state.Total))
|
|
return nil
|
|
}
|
|
|
|
func (p *Uploader) UploadFile(ctx context.Context, entities tg.Entities, u *tg.UpdateNewMessage, f io.ReadCloser) error {
|
|
// Reading to a buffer first, because we don't know the file size.
|
|
var buf bytes.Buffer
|
|
for {
|
|
b := make([]byte, 1024)
|
|
n, err := f.Read(b)
|
|
if err != nil && err != io.EOF {
|
|
return fmt.Errorf("reading to buffer error: %w", err)
|
|
}
|
|
if n == 0 {
|
|
break
|
|
}
|
|
if params.MaxSize > 0 && buf.Len() > int(params.MaxSize) {
|
|
return fmt.Errorf("file is too big, max. allowed size is %s", humanize.BigBytes(big.NewInt(int64(params.MaxSize))))
|
|
}
|
|
buf.Write(b[:n])
|
|
}
|
|
|
|
fmt.Println(" got", buf.Len(), "bytes, uploading...")
|
|
dlQueue.currentlyDownloadedEntry.progressInfo = fmt.Sprint(" (", humanize.BigBytes(big.NewInt(int64(buf.Len()))), ")")
|
|
|
|
upload, err := telegramUploader.FromBytes(ctx, "yt-dlp", buf.Bytes())
|
|
if err != nil {
|
|
return fmt.Errorf("uploading %w", err)
|
|
}
|
|
|
|
// Now we have uploaded file handle, sending it as styled message. First, preparing message.
|
|
document := message.UploadedDocument(upload).Video()
|
|
|
|
// Sending message with media.
|
|
if _, err := telegramSender.Answer(entities, u).Media(ctx, document); err != nil {
|
|
return fmt.Errorf("send: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|