forked from mxpv/podsync
-
Notifications
You must be signed in to change notification settings - Fork 0
/
matcher.go
64 lines (53 loc) · 1.81 KB
/
matcher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package update
import (
"regexp"
"time"
"github.com/Jv0id/podsync/pkg/feed"
"github.com/Jv0id/podsync/pkg/model"
log "github.com/sirupsen/logrus"
)
func matchRegexpFilter(pattern, str string, negative bool, logger log.FieldLogger) bool {
if pattern != "" {
matched, err := regexp.MatchString(pattern, str)
if err != nil {
logger.Warnf("pattern %q is not a valid")
} else {
if matched == negative {
logger.Infof("skipping due to regexp mismatch")
return false
}
}
}
return true
}
func matchFilters(episode *model.Episode, filters *feed.Filters) bool {
logger := log.WithFields(log.Fields{"episode_id": episode.ID})
if !matchRegexpFilter(filters.Title, episode.Title, false, logger.WithField("filter", "title")) {
return false
}
if !matchRegexpFilter(filters.NotTitle, episode.Title, true, logger.WithField("filter", "not_title")) {
return false
}
if !matchRegexpFilter(filters.Description, episode.Description, false, logger.WithField("filter", "description")) {
return false
}
if !matchRegexpFilter(filters.NotDescription, episode.Description, true, logger.WithField("filter", "not_description")) {
return false
}
if filters.MaxDuration > 0 && episode.Duration > filters.MaxDuration {
logger.WithField("filter", "max_duration").Infof("skipping due to duration filter (%ds)", episode.Duration)
return false
}
if filters.MinDuration > 0 && episode.Duration < filters.MinDuration {
logger.WithField("filter", "min_duration").Infof("skipping due to duration filter (%ds)", episode.Duration)
return false
}
if filters.MaxAge > 0 {
dateDiff := int(time.Since(episode.PubDate).Hours()) / 24
if dateDiff > filters.MaxAge {
logger.WithField("filter", "max_age").Infof("skipping due to max_age filter (%dd > %dd)", dateDiff, filters.MaxAge)
return false
}
}
return true
}