88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
/*
|
||
* Copyright (c) 2025, Антон Аксенов
|
||
* This file is part of iptvc project
|
||
* MIT License: https://git.axenov.dev/IPTV/iptvc/src/branch/master/LICENSE
|
||
*/
|
||
|
||
package tagfile
|
||
|
||
import (
|
||
"axenov/iptv-checker/app/playlist"
|
||
"axenov/iptv-checker/app/utils"
|
||
"encoding/json"
|
||
"log"
|
||
"os"
|
||
"regexp"
|
||
"strings"
|
||
)
|
||
|
||
// TagBlock описывает объект с набором тегов, который подходит для каналов по регулярному выражению
|
||
type TagBlock struct {
|
||
TvgId string `json:"tvg-id"`
|
||
Title string `json:"title"`
|
||
Tags []string `json:"tags"`
|
||
}
|
||
|
||
// GetTags возвращает теги, соответствующие каналу
|
||
func (block *TagBlock) GetTags(ch playlist.Channel) []string {
|
||
var regex *regexp.Regexp
|
||
var checkString string
|
||
var err error
|
||
result := make([]string, 0)
|
||
|
||
if block.TvgId != "" {
|
||
regex, err = regexp.Compile(block.TvgId)
|
||
if err != nil {
|
||
return result
|
||
}
|
||
if _, ok := ch.Attributes["tvg-id"]; !ok {
|
||
return result
|
||
}
|
||
checkString = ch.Attributes["tvg-id"]
|
||
if checkString == "" {
|
||
return result
|
||
}
|
||
} else if block.Title != "" {
|
||
regex, err = regexp.Compile(block.Title)
|
||
if err != nil {
|
||
return result
|
||
}
|
||
checkString = ch.Title
|
||
} else {
|
||
return result
|
||
}
|
||
|
||
checkString = strings.ToLower(checkString)
|
||
check := regex.MatchString(checkString)
|
||
if !check {
|
||
return result
|
||
}
|
||
return block.Tags
|
||
}
|
||
|
||
// Init инициализирует объекты тегов из тегфайла
|
||
func Init(path string) []TagBlock {
|
||
pathNormalized, _ := utils.ExpandPath(path)
|
||
_, err := os.Stat(pathNormalized)
|
||
if err != nil {
|
||
log.Println("Warning: all channels will be untagged due to error:", err)
|
||
return nil
|
||
}
|
||
|
||
content, err := os.ReadFile(pathNormalized)
|
||
if err != nil {
|
||
log.Println("Warning: all channels will be untagged due to error:", err)
|
||
return nil
|
||
}
|
||
|
||
var blocks []TagBlock
|
||
err = json.Unmarshal(content, &blocks)
|
||
if err != nil {
|
||
log.Println("Warning: all channels will be untagged due to error:", err)
|
||
return nil
|
||
}
|
||
|
||
//TODO валидация полей: обязательны tvg-id или title, tags может быть пустым
|
||
return blocks
|
||
}
|