diff --git a/internal/reader/processor/processor.go b/internal/reader/processor/processor.go index f2e3eca5fac..a127773a95c 100644 --- a/internal/reader/processor/processor.go +++ b/internal/reader/processor/processor.go @@ -140,7 +140,15 @@ func isBlockedEntry(feed *model.Feed, entry *model.Entry) bool { func isAllowedEntry(feed *model.Feed, entry *model.Entry) bool { if feed.KeeplistRules != "" { - if matchField(feed.KeeplistRules, entry.URL) || matchField(feed.KeeplistRules, entry.Title) { + var containsAllowedTag bool = false + for _, tag := range entry.Tags { + if matchField(feed.KeeplistRules, tag) { + containsAllowedTag = true + break + } + } + + if matchField(feed.KeeplistRules, entry.URL) || matchField(feed.KeeplistRules, entry.Title) || containsAllowedTag { slog.Debug("Allow entry based on rule", slog.Int64("entry_id", entry.ID), slog.String("entry_url", entry.URL), diff --git a/internal/reader/processor/processor_test.go b/internal/reader/processor/processor_test.go index 21964164c76..7246942960c 100644 --- a/internal/reader/processor/processor_test.go +++ b/internal/reader/processor/processor_test.go @@ -46,6 +46,10 @@ func TestAllowEntries(t *testing.T) { {&model.Feed{ID: 1, KeeplistRules: "(?i)example"}, &model.Entry{Title: "Some Example"}, true}, {&model.Feed{ID: 1, KeeplistRules: "(?i)example"}, &model.Entry{Title: "Something different"}, false}, {&model.Feed{ID: 1}, &model.Entry{Title: "No rule defined"}, true}, + {&model.Feed{ID: 1, KeeplistRules: "(?i)example"}, &model.Entry{Title: "Something different", Tags: []string{"example", "something else"}}, true}, + {&model.Feed{ID: 1, KeeplistRules: "(?i)example"}, &model.Entry{Title: "Example", Tags: []string{"example", "something else"}}, true}, + {&model.Feed{ID: 1, KeeplistRules: "(?i)example"}, &model.Entry{Title: "Example", Tags: []string{"something different", "something else"}}, true}, + {&model.Feed{ID: 1, KeeplistRules: "(?i)example"}, &model.Entry{Title: "Something more", Tags: []string{"something different", "something else"}}, false}, } for _, tc := range scenarios {