mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-20 05:56:10 +05:00
fix and refactor reader
This commit is contained in:
@@ -238,21 +238,23 @@ func (c *Cache) getRemPieces() []*Piece {
|
||||
ranges = mergeRange(ranges)
|
||||
|
||||
for id, p := range c.pieces {
|
||||
if p.Size > 0 {
|
||||
fill += p.Size
|
||||
}
|
||||
if len(ranges) > 0 {
|
||||
for _, rr := range ranges {
|
||||
if id < rr.Start || id > rr.End {
|
||||
if c.torrent.Piece(id).State().Priority != torrent.PiecePriorityNone {
|
||||
c.torrent.Piece(id).SetPriority(torrent.PiecePriorityNone)
|
||||
}
|
||||
if p.Size > 0 {
|
||||
fill += p.Size
|
||||
piecesRemove = append(piecesRemove, p)
|
||||
}
|
||||
if !inRanges(ranges, id) {
|
||||
piece := c.torrent.Piece(id)
|
||||
if piece.State().Priority != torrent.PiecePriorityNone {
|
||||
piece.SetPriority(torrent.PiecePriorityNone)
|
||||
}
|
||||
if p.Size > 0 {
|
||||
piecesRemove = append(piecesRemove, p)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if c.torrent.Piece(id).State().Priority != torrent.PiecePriorityNone {
|
||||
c.torrent.Piece(id).SetPriority(torrent.PiecePriorityNone)
|
||||
piece := c.torrent.Piece(id)
|
||||
if piece.State().Priority != torrent.PiecePriorityNone {
|
||||
piece.SetPriority(torrent.PiecePriorityNone)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -264,34 +266,3 @@ func (c *Cache) getRemPieces() []*Piece {
|
||||
c.filled = fill
|
||||
return piecesRemove
|
||||
}
|
||||
|
||||
func mergeRange(ranges []Range) []Range {
|
||||
if len(ranges) <= 1 {
|
||||
return ranges
|
||||
}
|
||||
// copy ranges
|
||||
merged := append([]Range(nil), ranges...)
|
||||
|
||||
sort.Slice(merged, func(i, j int) bool {
|
||||
if merged[i].Start < merged[j].Start {
|
||||
return true
|
||||
}
|
||||
if merged[i].Start == merged[j].Start && merged[i].End < merged[j].End {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
j := 0
|
||||
for i := 1; i < len(merged); i++ {
|
||||
if merged[j].End >= merged[i].Start {
|
||||
if merged[j].End < merged[i].End {
|
||||
merged[j].End = merged[i].End
|
||||
}
|
||||
} else {
|
||||
j++
|
||||
merged[j] = merged[i]
|
||||
}
|
||||
}
|
||||
return merged[:j+1]
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ func (r *Reader) Seek(offset int64, whence int) (n int64, err error) {
|
||||
case io.SeekCurrent:
|
||||
r.offset += offset
|
||||
case io.SeekEnd:
|
||||
r.offset = r.file.Length() - offset
|
||||
r.offset = r.file.Length() + offset
|
||||
}
|
||||
n, err = r.Reader.Seek(offset, whence)
|
||||
r.offset = n
|
||||
@@ -93,6 +93,9 @@ func (r *Reader) Close() {
|
||||
// TODO провверить как будут закрываться ридеры
|
||||
r.mu.Lock()
|
||||
r.isClosed = true
|
||||
if len(r.file.Torrent().Files()) > 0 {
|
||||
r.Reader.Close()
|
||||
}
|
||||
r.mu.Unlock()
|
||||
go r.cache.getRemPieces()
|
||||
}
|
||||
|
||||
@@ -5,10 +5,6 @@ import (
|
||||
"server/settings"
|
||||
)
|
||||
|
||||
type Range struct {
|
||||
Start, End int
|
||||
}
|
||||
|
||||
func (r *Reader) getPiecesRange() Range {
|
||||
startOff, endOff := r.getOffsetRange()
|
||||
return Range{r.getPieceNum(startOff), r.getPieceNum(endOff)}
|
||||
|
||||
Reference in New Issue
Block a user