5 Commits

4 changed files with 29 additions and 19 deletions

View File

@@ -1,6 +1,6 @@
# IPTV Checker (iptvc) # IPTV Checker (iptvc)
![Последний релиз](https://img.shields.io/gitea/v/release/IPTV/iptvc?gitea_url=https%3A%2F%2Fgit.axenov.dev&display_name=release&color=green&cacheSeconds=600) [![Последний релиз](https://img.shields.io/gitea/v/release/IPTV/iptvc?gitea_url=https%3A%2F%2Fgit.axenov.dev&display_name=release&color=green&cacheSeconds=600)](https://git.axenov.dev/IPTV/iptvc/releases/latest)
Консольная программа для проверки IPTV-плейлистов в формате m3u или m3u8. Консольная программа для проверки IPTV-плейлистов в формате m3u или m3u8.

View File

@@ -13,7 +13,7 @@ import (
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
) )
const VERSION = "1.0.1" const VERSION = "1.0.2"
// Arguments описывает аргументы командной строки // Arguments описывает аргументы командной строки
type Arguments struct { type Arguments struct {

View File

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

View File

@@ -12,6 +12,7 @@ import (
"os" "os"
"regexp" "regexp"
"strings" "strings"
"time"
) )
// Group - структура для хранения информации о группе каналов // Group - структура для хранения информации о группе каналов
@@ -124,6 +125,7 @@ func (pls *Playlist) Download() error {
content, err := utils.Fetch(pls.Url) content, err := utils.Fetch(pls.Url)
if err != nil { if err != nil {
pls.Content = err.Error() pls.Content = err.Error()
pls.CheckedAt = time.Now().Unix()
return err return err
} }
@@ -136,6 +138,7 @@ func (pls *Playlist) ReadFromFs() error {
content, err := os.ReadFile(pls.Url) content, err := os.ReadFile(pls.Url)
if err != nil { if err != nil {
pls.Content = err.Error() pls.Content = err.Error()
pls.CheckedAt = time.Now().Unix()
return err return err
} }