aboutsummaryrefslogtreecommitdiff
path: root/internal/feed/feed.go
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.eu>2021-02-22 22:54:43 +0100
committerRené 'Necoro' Neumann <necoro@necoro.eu>2021-02-22 22:54:43 +0100
commit7106d5a6e7585dce5fdd552cca30063dd352dc23 (patch)
tree88a9cb7150f86fcadb8f87e3a6d0892bf68c2251 /internal/feed/feed.go
parentfb2aa9b1f04d509c8215c1fa6505a144482c343d (diff)
downloadfeed2imap-go-7106d5a6e7585dce5fdd552cca30063dd352dc23.tar.gz
feed2imap-go-7106d5a6e7585dce5fdd552cca30063dd352dc23.tar.bz2
feed2imap-go-7106d5a6e7585dce5fdd552cca30063dd352dc23.zip
Split cache and feed packages
Diffstat (limited to 'internal/feed/feed.go')
-rw-r--r--internal/feed/feed.go86
1 files changed, 75 insertions, 11 deletions
diff --git a/internal/feed/feed.go b/internal/feed/feed.go
index de28ef8..431eae3 100644
--- a/internal/feed/feed.go
+++ b/internal/feed/feed.go
@@ -16,24 +16,30 @@ type Feed struct {
*config.Feed
feed *gofeed.Feed
filter *filter.Filter
- items []item
- cached CachedFeed
+ items []Item
Global config.GlobalOptions
+ extID FeedID
}
-type feedDescriptor struct {
+type FeedID interface {
+ String() string
+}
+
+type FilterFunc func(items []Item, ignHash, alwaysNew bool) []Item
+
+type Descriptor struct {
Name string
Url string
}
-func (feed *Feed) descriptor() feedDescriptor {
+func (feed *Feed) Descriptor() Descriptor {
var url string
if feed.Url != "" {
url = feed.Url
} else {
url = "exec://" + strings.Join(feed.Exec, "/")
}
- return feedDescriptor{
+ return Descriptor{
Name: feed.Name,
Url: url,
}
@@ -54,12 +60,6 @@ func (feed *Feed) FetchSuccessful() bool {
return feed.feed != nil
}
-func (feed *Feed) MarkSuccess() {
- if feed.cached != nil {
- feed.cached.Commit()
- }
-}
-
func Create(parsedFeed *config.Feed, global config.GlobalOptions) (*Feed, error) {
var itemFilter *filter.Filter
var err error
@@ -70,3 +70,67 @@ func Create(parsedFeed *config.Feed, global config.GlobalOptions) (*Feed, error)
}
return &Feed{Feed: parsedFeed, Global: global, filter: itemFilter}, nil
}
+
+func (feed *Feed) filterItems() []Item {
+ if feed.filter == nil {
+ return feed.items
+ }
+
+ items := make([]Item, 0, len(feed.items))
+
+ for _, item := range feed.items {
+ res, err := feed.filter.Run(item.Item)
+ if err != nil {
+ log.Errorf("Feed %s: Item %s: Error applying item filter: %s", feed.Name, printItem(item.Item), err)
+ res = true // include
+ }
+
+ if res {
+ if log.IsDebug() {
+ log.Debugf("Filter '%s' matches for item %s", feed.ItemFilter, printItem(item.Item))
+ }
+ items = append(items, item)
+ } else if log.IsDebug() { // printItem is not for free
+ log.Debugf("Filter '%s' does not match for item %s", feed.ItemFilter, printItem(item.Item))
+ }
+ }
+ return items
+}
+
+func (feed *Feed) Filter(filter FilterFunc) {
+ if len(feed.items) > 0 {
+ origLen := len(feed.items)
+
+ log.Debugf("Filtering %s. Starting with %d items", feed.Name, origLen)
+
+ items := feed.filterItems()
+ newLen := len(items)
+ if newLen < origLen {
+ log.Printf("Item filter on %s: Reduced from %d to %d items.", feed.Name, origLen, newLen)
+ origLen = newLen
+ }
+
+ feed.items = filter(items, feed.IgnHash, feed.AlwaysNew)
+
+ newLen = len(feed.items)
+ if newLen < origLen {
+ log.Printf("Filtered %s. Reduced from %d to %d items.", feed.Name, origLen, newLen)
+ } else {
+ log.Printf("Filtered %s, no reduction.", feed.Name)
+ }
+
+ } else {
+ log.Debugf("No items for %s. No filtering.", feed.Name)
+ }
+}
+
+func (feed *Feed) SetExtID(extID FeedID) {
+ feed.extID = extID
+}
+
+func (feed *Feed) id() string {
+ if feed.extID == nil {
+ return feed.Name
+ }
+ return feed.extID.String()
+}