mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-19 21:46:11 +05:00
update
This commit is contained in:
@@ -57,16 +57,20 @@ func (bt *BTServer) Reconnect() error {
|
||||
}
|
||||
|
||||
func (bt *BTServer) configure() {
|
||||
bt.storage = torrstor.NewStorage(settings.BTsets.CacheSize)
|
||||
|
||||
blocklist, _ := utils.ReadBlockedIP()
|
||||
bt.config = torrent.NewDefaultClientConfig()
|
||||
|
||||
if !settings.BTsets.SaveOnDisk {
|
||||
bt.storage = torrstor.NewStorage(settings.BTsets.CacheSize)
|
||||
bt.config.DefaultStorage = bt.storage
|
||||
} else {
|
||||
bt.config.DataDir = settings.BTsets.ContentPath
|
||||
}
|
||||
|
||||
userAgent := "uTorrent/3.5.5"
|
||||
peerID := "-UT3550-"
|
||||
cliVers := "µTorrent 3.5.5"
|
||||
|
||||
bt.config = torrent.NewDefaultClientConfig()
|
||||
|
||||
bt.config.Debug = settings.BTsets.EnableDebug
|
||||
bt.config.DisableIPv6 = settings.BTsets.EnableIPv6 == false
|
||||
bt.config.DisableTCP = settings.BTsets.DisableTCP
|
||||
@@ -75,7 +79,6 @@ func (bt *BTServer) configure() {
|
||||
bt.config.NoDHT = settings.BTsets.DisableDHT
|
||||
bt.config.NoUpload = settings.BTsets.DisableUpload
|
||||
bt.config.IPBlocklist = blocklist
|
||||
bt.config.DefaultStorage = bt.storage
|
||||
bt.config.Bep20 = peerID
|
||||
bt.config.PeerID = utils.PeerIDRandom(peerID)
|
||||
bt.config.HTTPUserAgent = userAgent
|
||||
|
||||
@@ -133,7 +133,7 @@ func (c *Cache) GetState() *state.CacheState {
|
||||
|
||||
c.muReaders.Lock()
|
||||
for r, _ := range c.readers {
|
||||
start, end := r.getUsedPieces()
|
||||
start, prereader, end := r.getUsedPieces()
|
||||
if p, ok := c.pieces[start]; ok {
|
||||
stats[start] = state.ItemState{
|
||||
Id: p.Id,
|
||||
@@ -152,6 +152,24 @@ func (c *Cache) GetState() *state.CacheState {
|
||||
}
|
||||
}
|
||||
|
||||
if p, ok := c.pieces[prereader]; ok {
|
||||
stats[prereader] = state.ItemState{
|
||||
Id: p.Id,
|
||||
Size: p.Size,
|
||||
Length: p.Length,
|
||||
Completed: p.complete,
|
||||
ReaderType: 3,
|
||||
}
|
||||
} else {
|
||||
stats[prereader] = state.ItemState{
|
||||
Id: prereader,
|
||||
Size: 0,
|
||||
Length: c.pieceLength,
|
||||
Completed: false,
|
||||
ReaderType: 3,
|
||||
}
|
||||
}
|
||||
|
||||
if p, ok := c.pieces[end]; ok {
|
||||
stats[end] = state.ItemState{
|
||||
Id: p.Id,
|
||||
@@ -213,7 +231,7 @@ func (c *Cache) getRemPieces() []*Piece {
|
||||
fill += p.Size
|
||||
c.muReaders.Lock()
|
||||
for r, _ := range c.readers {
|
||||
start, end := r.getUsedPieces()
|
||||
start, _, end := r.getUsedPieces()
|
||||
if id < start || id > end {
|
||||
piecesRemove = append(piecesRemove, p)
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ type Reader struct {
|
||||
isPreload bool
|
||||
endOffsetPreload int64
|
||||
currOffsetPreload int64
|
||||
muPreload sync.Mutex
|
||||
}
|
||||
|
||||
func NewReader(file *torrent.File, cache *Cache) *Reader {
|
||||
@@ -64,7 +65,9 @@ func (r *Reader) Read(p []byte) (n int, err error) {
|
||||
}
|
||||
n, err = r.Reader.Read(p)
|
||||
r.offset += int64(n)
|
||||
if !r.isPreload {
|
||||
go r.preload()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -79,7 +82,7 @@ func (r *Reader) Offset() int64 {
|
||||
return r.offset
|
||||
}
|
||||
|
||||
func (r *Reader) ReadAHead() int64 {
|
||||
func (r *Reader) Readahead() int64 {
|
||||
return r.readahead
|
||||
}
|
||||
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
package torrstor
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
"server/log"
|
||||
)
|
||||
|
||||
func (r *Reader) getUsedPieces() (int, int) {
|
||||
startOff, endOff := r.offset, r.endOffsetPreload
|
||||
if startOff < endOff {
|
||||
endOff = startOff + r.readahead
|
||||
}
|
||||
return r.getRangePieces(r.offset, r.endOffsetPreload)
|
||||
}
|
||||
|
||||
func (r *Reader) preload() {
|
||||
r.endOffsetPreload = r.offset + r.cache.capacity - 1024
|
||||
|
||||
if r.endOffsetPreload > r.file.Length() {
|
||||
r.endOffsetPreload = r.file.Length()
|
||||
}
|
||||
|
||||
if r.isPreload || r.endOffsetPreload < r.readahead {
|
||||
return
|
||||
}
|
||||
|
||||
r.isPreload = true
|
||||
log.TLogln("Start buffering from", humanize.IBytes(uint64(r.currOffsetPreload)))
|
||||
go func() {
|
||||
buffReader := r.file.NewReader()
|
||||
defer func() {
|
||||
r.isPreload = false
|
||||
buffReader.Close()
|
||||
}()
|
||||
buffReader.SetReadahead(0)
|
||||
r.currOffsetPreload = r.offset + r.readahead
|
||||
buffReader.Seek(r.currOffsetPreload, io.SeekStart)
|
||||
buff := make([]byte, 1024)
|
||||
for r.currOffsetPreload < r.endOffsetPreload && !r.isClosed {
|
||||
off, err := buffReader.Read(buff)
|
||||
if err != nil {
|
||||
log.TLogln("Error read e head buffer", err)
|
||||
return
|
||||
}
|
||||
r.currOffsetPreload += int64(off)
|
||||
r.endOffsetPreload = r.offset + r.cache.capacity - 1024
|
||||
if r.currOffsetPreload < r.offset {
|
||||
r.currOffsetPreload = r.offset + r.readahead
|
||||
buffReader.Seek(r.currOffsetPreload, io.SeekStart)
|
||||
}
|
||||
//log.TLogln(humanize.IBytes(uint64(r.offset)), humanize.IBytes(uint64(r.currOffsetPreload)), humanize.IBytes(uint64(r.endOffsetPreload)))
|
||||
}
|
||||
log.TLogln("End buffering")
|
||||
}()
|
||||
}
|
||||
|
||||
func (r *Reader) getRangePieces(offCurr, offEnd int64) (int, int) {
|
||||
currPiece := r.getPieceNum(offCurr)
|
||||
endPiece := r.getPieceNum(offEnd)
|
||||
return currPiece, endPiece
|
||||
}
|
||||
|
||||
func (r *Reader) getPieceNum(offset int64) int {
|
||||
return int((offset + r.file.Offset()) / r.cache.pieceLength)
|
||||
}
|
||||
118
src/server/torr/storage/torrstor/readerloader.go
Normal file
118
src/server/torr/storage/torrstor/readerloader.go
Normal file
@@ -0,0 +1,118 @@
|
||||
package torrstor
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
"server/log"
|
||||
)
|
||||
|
||||
func (r *Reader) getUsedPieces() (int, int, int) {
|
||||
startOff, endOff := r.offset, r.endOffsetPreload
|
||||
if startOff < endOff {
|
||||
endOff = startOff + r.readahead
|
||||
}
|
||||
return r.getRangePieces(r.offset, r.currOffsetPreload, r.endOffsetPreload)
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
/// Прелоадер начинает загрузку от старта плеера+RAH и имеет свой RAH
|
||||
/// Прелоадер грузит до конца-RAH
|
||||
func (r *Reader) preload() {
|
||||
// определяем конец загрузки
|
||||
r.endOffsetPreload = r.offset + r.cache.capacity - 1024
|
||||
|
||||
// конец за пределами конца файла, тримим
|
||||
if r.endOffsetPreload > r.file.Length() {
|
||||
r.endOffsetPreload = r.file.Length()
|
||||
}
|
||||
r.muPreload.Lock()
|
||||
// загрузка уже идет или конец меньше RAH, тогда старается основной ридер
|
||||
if r.isPreload || r.endOffsetPreload < r.readahead {
|
||||
r.muPreload.Unlock()
|
||||
return
|
||||
}
|
||||
r.isPreload = true
|
||||
r.muPreload.Unlock()
|
||||
|
||||
log.TLogln("Start buffering from", humanize.IBytes(uint64(r.currOffsetPreload)))
|
||||
go func() {
|
||||
// получаем ридер
|
||||
buffReader := r.file.NewReader()
|
||||
defer func() {
|
||||
r.isPreload = false
|
||||
buffReader.Close()
|
||||
}()
|
||||
// ищем не прочитанный кусок
|
||||
r.currOffsetPreload = r.findPreloadedStart()
|
||||
// выходим если ничего подгружать не нужно
|
||||
if r.currOffsetPreload >= r.endOffsetPreload {
|
||||
return
|
||||
}
|
||||
// двигаем лоадер
|
||||
buffReader.Seek(r.currOffsetPreload, io.SeekStart)
|
||||
buff := make([]byte, 1024)
|
||||
// isReadahead чтобы меньше переключать RAH
|
||||
isReadahead := false
|
||||
buffReader.SetReadahead(0)
|
||||
// читаем пока позиция лоадера меньше конца и не закрыт ридер
|
||||
for r.currOffsetPreload < r.endOffsetPreload-1024 && !r.isClosed {
|
||||
off, err := buffReader.Read(buff)
|
||||
if err != nil {
|
||||
log.TLogln("Error read e head buffer", err)
|
||||
return
|
||||
}
|
||||
r.currOffsetPreload += int64(off)
|
||||
// пересчитываем конец загрузки
|
||||
r.endOffsetPreload = r.offset + r.cache.capacity
|
||||
// если лоадер не успевает загрузить данные и вошел на границу загрузки основного ридера, двигаем его
|
||||
if r.currOffsetPreload < r.offset+r.readahead {
|
||||
// подвигаем за границу основного ридера+1 кусок
|
||||
r.currOffsetPreload = r.offset + r.readahead + r.cache.pieceLength
|
||||
buffReader.Seek(r.currOffsetPreload, io.SeekStart)
|
||||
}
|
||||
// если ридер подобрался к концу-RAH
|
||||
if r.currOffsetPreload > r.endOffsetPreload-r.readahead-1024 && isReadahead {
|
||||
// читаем конец без RAH
|
||||
log.TLogln("disable buffering RAH")
|
||||
buffReader.SetReadahead(0)
|
||||
isReadahead = false
|
||||
} else if r.currOffsetPreload < r.endOffsetPreload-r.readahead-1024 && !isReadahead {
|
||||
// Конец удалился и можно включить RAH
|
||||
log.TLogln("enable buffering RAH")
|
||||
buffReader.SetReadahead(r.readahead)
|
||||
isReadahead = true
|
||||
}
|
||||
//log.TLogln(humanize.IBytes(uint64(r.offset)), humanize.IBytes(uint64(r.currOffsetPreload)), humanize.IBytes(uint64(r.endOffsetPreload)))
|
||||
}
|
||||
log.TLogln("End buffering")
|
||||
}()
|
||||
}
|
||||
|
||||
func (r *Reader) findPreloadedStart() int64 {
|
||||
found := false
|
||||
pstart := r.getPieceNum(r.offset + r.readahead)
|
||||
pend := r.getPieceNum(r.endOffsetPreload)
|
||||
for i := pstart; i < pend; i++ {
|
||||
if r.cache.pieces[i].Size < r.cache.pieces[i].Length {
|
||||
pstart = i
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return r.endOffsetPreload
|
||||
}
|
||||
return int64(pstart) * r.cache.pieceLength
|
||||
}
|
||||
|
||||
func (r *Reader) getRangePieces(offCurr, offReader, offEnd int64) (int, int, int) {
|
||||
currPiece := r.getPieceNum(offCurr)
|
||||
readerPiece := r.getPieceNum(offReader)
|
||||
endPiece := r.getPieceNum(offEnd)
|
||||
return currPiece, readerPiece, endPiece
|
||||
}
|
||||
|
||||
func (r *Reader) getPieceNum(offset int64) int {
|
||||
return int((offset + r.file.Offset()) / r.cache.pieceLength)
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package version
|
||||
|
||||
const Version = "1.2.78_5"
|
||||
const Version = "1.2.78_6"
|
||||
const VerInt = 78
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user