|
|
|
|
@@ -18,6 +18,7 @@ import (
|
|
|
|
|
"io"
|
|
|
|
|
"log"
|
|
|
|
|
"maps"
|
|
|
|
|
"math"
|
|
|
|
|
"math/rand"
|
|
|
|
|
"net/http"
|
|
|
|
|
"os"
|
|
|
|
|
@@ -268,7 +269,6 @@ func CheckChannels(pls playlist.Playlist) playlist.Playlist {
|
|
|
|
|
select {
|
|
|
|
|
case tvChannel := <-chOnline:
|
|
|
|
|
tvChannel.IsOnline = true
|
|
|
|
|
pls.OnlineCount++
|
|
|
|
|
pls.Channels[tvChannel.Id] = tvChannel
|
|
|
|
|
if app.Args.Verbose {
|
|
|
|
|
log.Printf("[%.3d/%.3d] ONLINE '%s'\n", idx, count, tvChannel.Title)
|
|
|
|
|
@@ -277,7 +277,6 @@ func CheckChannels(pls playlist.Playlist) playlist.Playlist {
|
|
|
|
|
log.Printf("> MimeType: %s\n", tvChannel.ContentType)
|
|
|
|
|
}
|
|
|
|
|
case tvChannel := <-chOffline:
|
|
|
|
|
pls.OfflineCount++
|
|
|
|
|
pls.Channels[tvChannel.Id] = tvChannel
|
|
|
|
|
if app.Args.Verbose {
|
|
|
|
|
log.Printf("[%.3d/%.3d] OFFLINE '%s'\n", idx, count, tvChannel.Title)
|
|
|
|
|
@@ -286,7 +285,6 @@ func CheckChannels(pls playlist.Playlist) playlist.Playlist {
|
|
|
|
|
log.Printf("> Status: %d\n", tvChannel.Status)
|
|
|
|
|
}
|
|
|
|
|
case data := <-chError:
|
|
|
|
|
pls.OfflineCount++
|
|
|
|
|
pls.Channels[data.tvChannel.Id] = data.tvChannel
|
|
|
|
|
if app.Args.Verbose {
|
|
|
|
|
log.Printf("[%.3d/%.3d] ERROR '%s'\n", idx, count, data.tvChannel.Title)
|
|
|
|
|
@@ -303,6 +301,14 @@ func CheckChannels(pls playlist.Playlist) playlist.Playlist {
|
|
|
|
|
close(chError)
|
|
|
|
|
pls.CheckedAt = time.Now().Unix()
|
|
|
|
|
|
|
|
|
|
for _, tvChannel := range pls.Channels {
|
|
|
|
|
if tvChannel.IsOnline {
|
|
|
|
|
pls.OnlineCount++
|
|
|
|
|
} else {
|
|
|
|
|
pls.OfflineCount++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Printf(
|
|
|
|
|
"Checked successfully! online=%d onlinePercent=%.2f%% offline=%d offlinePercent=%.2f%% elapsedTime=%.2fs",
|
|
|
|
|
pls.OnlineCount,
|
|
|
|
|
@@ -317,26 +323,27 @@ func CheckChannels(pls playlist.Playlist) playlist.Playlist {
|
|
|
|
|
|
|
|
|
|
// calcParameters вычисляет оптимальное количество горутин и таймаут запроса
|
|
|
|
|
func calcParameters(count int) (time.Duration, int) {
|
|
|
|
|
var routines int
|
|
|
|
|
var percentage float32
|
|
|
|
|
|
|
|
|
|
if count <= 100 {
|
|
|
|
|
routines = count
|
|
|
|
|
} else {
|
|
|
|
|
percentage = float32(runtime.NumCPU()) * 0.075
|
|
|
|
|
for percentage >= 1 {
|
|
|
|
|
percentage *= 0.5
|
|
|
|
|
}
|
|
|
|
|
routines = int(float32(count) * percentage)
|
|
|
|
|
percentage := float32(runtime.NumCPU()) / 10
|
|
|
|
|
for percentage >= 1 {
|
|
|
|
|
percentage *= 0.5
|
|
|
|
|
}
|
|
|
|
|
if routines > 500 {
|
|
|
|
|
routines = 500
|
|
|
|
|
|
|
|
|
|
routines := int(float32(count) * percentage)
|
|
|
|
|
if routines > 1500 {
|
|
|
|
|
routines = 1500
|
|
|
|
|
}
|
|
|
|
|
if routines < 1 {
|
|
|
|
|
routines = 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
timeout := 10 / float32(count) * 150
|
|
|
|
|
var digits int
|
|
|
|
|
x := count
|
|
|
|
|
for x >= 10 {
|
|
|
|
|
digits++
|
|
|
|
|
x /= 10
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
timeout := int(math.Ceil(math.Pow(10, float64(digits)) / float64(count) * 15))
|
|
|
|
|
if timeout > 10 {
|
|
|
|
|
timeout = 10
|
|
|
|
|
}
|
|
|
|
|
|