summaryrefslogtreecommitdiff
path: root/internal/feeds/rss.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/feeds/rss.go')
-rw-r--r--internal/feeds/rss.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/internal/feeds/rss.go b/internal/feeds/rss.go
new file mode 100644
index 0000000..f3dd39c
--- /dev/null
+++ b/internal/feeds/rss.go
@@ -0,0 +1,56 @@
+package feeds
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "time"
+
+ "dim13.org/rss"
+)
+
+type Feed struct {
+ Name string
+ URL string
+ Every time.Duration
+}
+
+type news struct {
+ Feed
+ rss.Item
+}
+
+func (n news) String() string {
+ s := fmt.Sprintf("%v: %v", n.Name, n.Title)
+ if n.Author != "" {
+ s += fmt.Sprintf(" (%v) ", n.Author)
+ } else {
+ s += " - "
+ }
+ s += fmt.Sprintf("%v", n.Link)
+ return s
+}
+
+func (f Feed) Watch(w io.Writer) {
+ ticker := time.NewTicker(f.Every)
+ defer ticker.Stop()
+ for t := range ticker.C {
+ r, err := rss.Fetch(f.URL)
+ if err != nil {
+ log.Println(f.Name, err)
+ return
+ }
+ last := t.Add(-f.Every)
+ for _, i := range r.Channel.Items {
+ if i.PubDate.After(last) {
+ fmt.Fprint(w, news{f, i})
+ }
+ }
+ }
+}
+
+func Watch(w io.Writer, feeds []Feed) {
+ for _, feed := range feeds {
+ go feed.Watch(w)
+ }
+}