diff --git a/server/torr/storage/torrstor/reader.go b/server/torr/storage/torrstor/reader.go index 6265ade..28ed4f8 100644 --- a/server/torr/storage/torrstor/reader.go +++ b/server/torr/storage/torrstor/reader.go @@ -6,6 +6,7 @@ import ( "github.com/anacrolix/torrent" "server/log" + "server/settings" ) type Reader struct { @@ -61,7 +62,6 @@ func (r *Reader) Read(p []byte) (n int, err error) { if r.file.Torrent() != nil && r.file.Torrent().Info() != nil { n, err = r.Reader.Read(p) r.offset += int64(n) - //go r.preload() } else { log.TLogln("Torrent closed and readed") } @@ -113,3 +113,37 @@ func (c *Cache) CloseReader(r *Reader) { delete(r.cache.readers, r) r.cache.muReaders.Unlock() } + +func (r *Reader) getPiecesRange() Range { + startOff, endOff := r.getOffsetRange() + return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)} +} + +func (r *Reader) getReaderPiece() int { + readerOff := r.offset + return r.getPieceNum(readerOff) +} + +func (r *Reader) getPieceNum(offset int64) int { + return int((offset + r.file.Offset()) / r.cache.pieceLength) +} + +func (r *Reader) getOffsetRange() (int64, int64) { + prc := int64(settings.BTsets.ReaderReadAHead) + readers := int64(len(r.cache.readers)) + if readers == 0 { + readers = 1 + } + + beginOffset := r.offset - (r.cache.capacity/readers)*(100-prc)/100 + endOffset := r.offset + (r.cache.capacity/readers)*prc/100 + + if beginOffset < 0 { + beginOffset = 0 + } + + if endOffset > r.file.Length() { + endOffset = r.file.Length() + } + return beginOffset, endOffset +} diff --git a/server/torr/storage/torrstor/readerloader.go b/server/torr/storage/torrstor/readerloader.go deleted file mode 100644 index 0d2dbf4..0000000 --- a/server/torr/storage/torrstor/readerloader.go +++ /dev/null @@ -1,59 +0,0 @@ -package torrstor - -import ( - "github.com/anacrolix/torrent" - "server/settings" -) - -func (r *Reader) getPiecesRange() Range { - startOff, endOff := r.getOffsetRange() - return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)} -} - -func (r *Reader) getReaderPiece() int { - readerOff := r.offset - return r.getPieceNum(readerOff) -} - -func (r *Reader) getPieceNum(offset int64) int { - return int((offset + r.file.Offset()) / r.cache.pieceLength) -} - -func (r *Reader) getOffsetRange() (int64, int64) { - prc := int64(settings.BTsets.ReaderReadAHead) - readers := int64(len(r.cache.readers)) - if readers == 0 { - readers = 1 - } - - beginOffset := r.offset - (r.cache.capacity/readers)*(100-prc)/100 - endOffset := r.offset + (r.cache.capacity/readers)*prc/100 - - if beginOffset < 0 { - beginOffset = 0 - } - - if endOffset > r.file.Length() { - endOffset = r.file.Length() - } - return beginOffset, endOffset -} - -func (r *Reader) preload() { - rrange := r.getPiecesRange() - if rrange.Start == r.ranges.Start && rrange.End == r.ranges.End { - return - } - - torr := r.file.Torrent() - r.ranges = rrange - rahPiece := int(r.readahead / torr.Info().PieceLength) - readerPiece := r.getReaderPiece() - - // from reader readahead to end of range - for i := readerPiece + rahPiece; i < rrange.End; i++ { - if torr.Piece(i).State().Priority == torrent.PiecePriorityNone { - torr.Piece(i).SetPriority(torrent.PiecePriorityNormal) - } - } -}