diff options
Diffstat (limited to 'internal/feed/feed.go')
-rw-r--r-- | internal/feed/feed.go | 86 |
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() +} |