5 Commits

4 changed files with 29 additions and 19 deletions

View File

@@ -1,6 +1,6 @@
# 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.

View File

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

View File

@@ -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
}

View File

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