67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
|
|
package m3u8d
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strconv"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
func (this *downloadEnv) speedSetBegin() {
|
||
|
|
this.speedBytesLocker.Lock()
|
||
|
|
defer this.speedBytesLocker.Unlock()
|
||
|
|
|
||
|
|
this.speedBeginTime = time.Now()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *downloadEnv) speedAddBytes(a int) {
|
||
|
|
this.speedBytesLocker.Lock()
|
||
|
|
defer this.speedBytesLocker.Unlock()
|
||
|
|
|
||
|
|
now := time.Now()
|
||
|
|
this.speedBytesMap[now] += int64(a)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *downloadEnv) speedClearBytes() {
|
||
|
|
this.speedBytesLocker.Lock()
|
||
|
|
defer this.speedBytesLocker.Unlock()
|
||
|
|
|
||
|
|
this.speedBytesMap = map[time.Time]int64{}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *downloadEnv) speedRecent5sGetAndUpdate() string {
|
||
|
|
this.speedBytesLocker.Lock()
|
||
|
|
defer this.speedBytesLocker.Unlock()
|
||
|
|
|
||
|
|
now := time.Now()
|
||
|
|
if this.GetIsCancel() || this.speedBeginTime.IsZero() || now.Sub(this.speedBeginTime) < time.Second { // 1s以内, 暂时不计算速度
|
||
|
|
return ""
|
||
|
|
}
|
||
|
|
|
||
|
|
const secondCount = 5
|
||
|
|
|
||
|
|
expireTime := now.Add(-secondCount * time.Second)
|
||
|
|
var total int64
|
||
|
|
for ct, v := range this.speedBytesMap {
|
||
|
|
if ct.Before(expireTime) {
|
||
|
|
delete(this.speedBytesMap, ct)
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
total += v
|
||
|
|
}
|
||
|
|
realSecond := now.Sub(this.speedBeginTime).Seconds()
|
||
|
|
if realSecond > secondCount {
|
||
|
|
realSecond = secondCount
|
||
|
|
}
|
||
|
|
v := float64(total) / realSecond
|
||
|
|
|
||
|
|
if v < 1024 {
|
||
|
|
return strconv.Itoa(int(v)) + " B/s"
|
||
|
|
}
|
||
|
|
v = v / 1024
|
||
|
|
if v < 1024 {
|
||
|
|
return strconv.Itoa(int(v)) + " KB/s"
|
||
|
|
}
|
||
|
|
|
||
|
|
v = v / 1024
|
||
|
|
return strconv.FormatFloat(v, 'f', 2, 64) + " MB/s"
|
||
|
|
}
|