mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-19 13:36:09 +05:00
fix speed
This commit is contained in:
@@ -24,7 +24,7 @@ type Reader struct {
|
|||||||
///Preload
|
///Preload
|
||||||
lastAccess int64
|
lastAccess int64
|
||||||
isUse bool
|
isUse bool
|
||||||
muPreload sync.Mutex
|
mu sync.Mutex
|
||||||
ranges Range
|
ranges Range
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,6 +35,7 @@ func newReader(file *torrent.File, cache *Cache) *Reader {
|
|||||||
|
|
||||||
r.SetReadahead(0)
|
r.SetReadahead(0)
|
||||||
r.cache = cache
|
r.cache = cache
|
||||||
|
r.isUse = true
|
||||||
|
|
||||||
cache.muReaders.Lock()
|
cache.muReaders.Lock()
|
||||||
cache.readers[r] = struct{}{}
|
cache.readers[r] = struct{}{}
|
||||||
@@ -54,6 +55,7 @@ func (r *Reader) Seek(offset int64, whence int) (n int64, err error) {
|
|||||||
case io.SeekEnd:
|
case io.SeekEnd:
|
||||||
r.offset = r.file.Length() + offset
|
r.offset = r.file.Length() + offset
|
||||||
}
|
}
|
||||||
|
r.readerOn()
|
||||||
n, err = r.Reader.Seek(offset, whence)
|
n, err = r.Reader.Seek(offset, whence)
|
||||||
r.offset = n
|
r.offset = n
|
||||||
r.lastAccess = time.Now().Unix()
|
r.lastAccess = time.Now().Unix()
|
||||||
@@ -66,6 +68,7 @@ func (r *Reader) Read(p []byte) (n int, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if r.file.Torrent() != nil && r.file.Torrent().Info() != nil {
|
if r.file.Torrent() != nil && r.file.Torrent().Info() != nil {
|
||||||
|
r.readerOn()
|
||||||
n, err = r.Reader.Read(p)
|
n, err = r.Reader.Read(p)
|
||||||
|
|
||||||
//samsung tv fix xvid/divx
|
//samsung tv fix xvid/divx
|
||||||
@@ -95,16 +98,12 @@ func (r *Reader) Read(p []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *Reader) SetReadahead(length int64) {
|
func (r *Reader) SetReadahead(length int64) {
|
||||||
if !r.isUse && r.cache != nil {
|
|
||||||
//fix read a head on not readed reader
|
|
||||||
r.Reader.SetReadahead(0)
|
|
||||||
r.readahead = 0
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if r.cache != nil && length > r.cache.capacity {
|
if r.cache != nil && length > r.cache.capacity {
|
||||||
length = r.cache.capacity
|
length = r.cache.capacity
|
||||||
}
|
}
|
||||||
r.Reader.SetReadahead(length)
|
if r.isUse {
|
||||||
|
r.Reader.SetReadahead(length)
|
||||||
|
}
|
||||||
r.readahead = length
|
r.readahead = length
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,13 +164,33 @@ func (r *Reader) getOffsetRange() (int64, int64) {
|
|||||||
|
|
||||||
func (r *Reader) checkReader() {
|
func (r *Reader) checkReader() {
|
||||||
if time.Now().Unix() > r.lastAccess+60 && len(r.cache.readers) > 1 {
|
if time.Now().Unix() > r.lastAccess+60 && len(r.cache.readers) > 1 {
|
||||||
|
r.readerOff()
|
||||||
|
} else {
|
||||||
|
r.readerOn()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Reader) readerOn() {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
if !r.isUse {
|
||||||
|
if pos, err := r.Reader.Seek(0, io.SeekCurrent); err == nil && pos == 0 {
|
||||||
|
r.Reader.Seek(r.offset, io.SeekStart)
|
||||||
|
}
|
||||||
|
r.SetReadahead(r.readahead)
|
||||||
|
r.isUse = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Reader) readerOff() {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
if r.isUse {
|
||||||
r.SetReadahead(0)
|
r.SetReadahead(0)
|
||||||
r.isUse = false
|
r.isUse = false
|
||||||
if r.offset > 0 {
|
if r.offset > 0 {
|
||||||
r.Reader.Seek(0, io.SeekStart)
|
r.Reader.Seek(0, io.SeekStart)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
r.isUse = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user