all repos

rss-tools @ master

get rss feed from sources that(i need and) dont provide one

rss-tools/app/atom/feed.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
twitch: add channel link as feed site url, 4 days ago
1
package atom
2
3
import (
4
	"bytes"
5
	"encoding/xml"
6
	"io"
7
	"net/http"
8
	"strings"
9
	"time"
10
)
11
12
func NewFeed(title, id string) *Feed {
13
	return &Feed{
14
		Title:   title,
15
		ID:      id,
16
		Updated: Time(time.Now()),
17
		Author:  []*Person{{Name: "rss-tools"}},
18
	}
19
}
20
21
func (f *Feed) WithAuthor(name string) *Feed {
22
	name = strings.TrimSpace(name)
23
	if name == "" {
24
		return f
25
	}
26
	f.Author = []*Person{{Name: name}}
27
	return f
28
}
29
30
func (f *Feed) WithUpdated(updated time.Time) *Feed {
31
	if !updated.IsZero() {
32
		f.Updated = Time(updated)
33
	}
34
	return f
35
}
36
37
func (f *Feed) WithLink(rel, href string) *Feed {
38
	if href != "" {
39
		f.Link = append(f.Link, Link{Rel: rel, Href: href})
40
	}
41
	return f
42
}
43
44
func (f *Feed) Add(entry *Entry) *Feed {
45
	if entry != nil {
46
		f.Entry = append(f.Entry, entry)
47
	}
48
	return f
49
}
50
51
func (f *Feed) WriteTo(w io.Writer) error {
52
	enc := xml.NewEncoder(w)
53
	enc.Indent("", "  ")
54
	return enc.Encode(f)
55
}
56
57
func (f *Feed) Bytes() ([]byte, error) {
58
	var buf bytes.Buffer
59
	if err := f.WriteTo(&buf); err != nil {
60
		return nil, err
61
	}
62
	return buf.Bytes(), nil
63
}
64
65
func (f *Feed) Render(w http.ResponseWriter) error {
66
	w.Header().Set("Content-Type", "application/atom+xml; charset=utf-8")
67
	return f.WriteTo(w)
68
}
69
70
func NewText(body, typ string) *Text {
71
	if body == "" && strings.TrimSpace(typ) == "" {
72
		return nil
73
	}
74
	if strings.TrimSpace(typ) == "" {
75
		typ = "text"
76
	}
77
	return &Text{Type: typ, Body: body}
78
}