This commit is contained in:
YouROK
2025-03-22 00:14:29 +03:00
parent 635882ea57
commit 11d9714234
11 changed files with 785 additions and 142 deletions

View File

@@ -0,0 +1,89 @@
package upload
import (
"errors"
"fmt"
"github.com/anacrolix/torrent"
"log"
"path/filepath"
sets "server/settings"
"server/tgbot/config"
"server/torr"
"server/torr/state"
"server/torr/storage/torrstor"
)
var ERR_STOPPED = errors.New("stopped")
type TorrFile struct {
hash string
name string
wrk *Worker
offset int64
size int64
id int
reader *torrstor.Reader
}
func NewTorrFile(wrk *Worker, stFile *state.TorrentFileStat) (*TorrFile, error) {
if config.Cfg.HostTG != "" && stFile.Length > 2*1024*1024*1024 {
return nil, errors.New("Размер файла должен быть больше 2GB")
}
if config.Cfg.HostTG == "" && stFile.Length > 50*1024*1024 {
return nil, errors.New("Размер файла должен быть больше 50MB\nЧтобы закачивать файлы до 2GB нужно в tg.cfg указать host к <a href='https://github.com/tdlib/telegram-bot-api'>telegram bot api</a>")
}
tf := new(TorrFile)
tf.hash = wrk.torrentHash
tf.name = filepath.Base(stFile.Path)
tf.wrk = wrk
tf.size = stFile.Length
t := torr.GetTorrent(wrk.torrentHash)
t.WaitInfo()
files := t.Files()
var file *torrent.File
for _, tfile := range files {
if tfile.Path() == stFile.Path {
file = tfile
break
}
}
if file == nil {
return nil, fmt.Errorf("file with id %v not found", stFile.Id)
}
if int64(sets.MaxSize) > 0 && file.Length() > int64(sets.MaxSize) {
log.Println("file", file.DisplayPath(), "size exceeded max allowed", sets.MaxSize, "bytes")
return nil, fmt.Errorf("file size exceeded max allowed %d bytes", sets.MaxSize)
}
reader := t.NewReader(file)
if sets.BTsets.ResponsiveMode {
reader.SetResponsive()
}
tf.reader = reader
return tf, nil
}
func (t *TorrFile) Read(p []byte) (n int, err error) {
if t.wrk.isCancelled {
return 0, ERR_STOPPED
}
n, err = t.reader.Read(p)
t.offset += int64(n)
return
}
func (t *TorrFile) Loaded() int64 {
return t.size - t.offset
}
func (t *TorrFile) Close() {
if t.reader != nil {
t.reader.Close()
t.reader = nil
}
}