utils/convids/methods.go

93 lines
1.8 KiB
Go
Raw Normal View History

2024-10-23 15:56:56 -05:00
package convids
import (
2024-10-23 21:24:10 -05:00
"errors"
2024-10-23 15:56:56 -05:00
"iter"
2024-10-23 21:24:10 -05:00
"regexp"
2024-10-23 15:56:56 -05:00
"slices"
2024-10-23 21:24:10 -05:00
"strings"
2024-10-23 15:56:56 -05:00
)
2024-10-23 21:24:10 -05:00
var ErrNoName = errors.New("missing name")
2024-10-23 22:22:41 -05:00
var ErrNilPointer = errors.New("nil pointer")
2024-10-23 21:24:10 -05:00
2024-10-23 22:10:31 -05:00
var animePattern = `^\[.+\] `
var animeRegexp = regexp.MustCompile(animePattern)
2024-10-23 21:24:10 -05:00
func (s *Show) Match(path string) (bool, error) {
2024-10-23 22:22:41 -05:00
if s == nil {
return false, ErrNilPointer
}
2025-07-14 14:14:04 -05:00
if !s.Anime && s.Name != "" && s.Pattern == "" {
s.Pattern = strings.ReplaceAll(s.Name, " ", ".")
}
2024-10-23 21:24:10 -05:00
if s.Pattern != "" {
return s.matchRegexp(path)
}
if s.Name == "" {
return false, ErrNoName
}
2024-10-23 22:10:31 -05:00
if s.Anime {
if !animeRegexp.MatchString(path) {
return false, nil
}
path = animeRegexp.ReplaceAllString(path, "")
}
2024-10-23 21:24:10 -05:00
return strings.HasPrefix(path, s.Name), nil
2024-10-23 15:56:56 -05:00
}
2024-10-23 21:24:10 -05:00
func (s *Show) matchRegexp(path string) (f bool, err error) {
if s.re == nil {
p := s.Pattern
2024-10-23 22:10:31 -05:00
if s.Anime {
2024-10-28 20:01:03 -05:00
p = animePattern + strings.TrimPrefix(p, "^")
2024-10-23 22:10:31 -05:00
} else if !strings.HasPrefix(p, "^") {
2024-10-23 21:24:10 -05:00
p = "^" + p
}
s.re, err = regexp.Compile(p)
if err != nil {
return
}
}
return s.re.MatchString(path), nil
}
func (ss *Shows) All() iter.Seq[*Show] {
2024-10-23 22:22:41 -05:00
if ss == nil {
return func(func(*Show) bool) {}
}
2024-10-23 21:24:10 -05:00
return slices.Values(*ss)
}
func (d *Data) AllShows(outputGroup GroupPrinter) iter.Seq[*Show] {
2024-10-23 21:24:10 -05:00
return func(yield func(*Show) bool) {
2024-10-23 22:22:41 -05:00
if d == nil || d.Config == nil {
2024-10-23 21:24:10 -05:00
return
}
for _, groupName := range d.Config.Groups {
2025-04-24 14:27:19 -05:00
if !d.yieldGroup(yield, outputGroup, groupName) {
return
2024-10-23 15:56:56 -05:00
}
}
}
}
2025-04-24 14:27:19 -05:00
func (d *Data) yieldGroup(yield func(*Show) bool, outputGroup GroupPrinter, groupName string) bool {
group := (*d.Shows)[groupName]
if group == nil || len(*group) < 1 {
return true
}
if outputGroup != nil {
outputGroup(groupName, *group)
}
for sh := range group.All() {
if sh == nil {
continue
}
if !yield(sh) {
return false
}
}
return true
}