reprogl

Форк
0
/
rss.go 
92 строки · 2.3 Кб
1
package models
2

3
import (
4
	"encoding/xml"
5
	"fmt"
6
	"time"
7
)
8

9
type Rss struct {
10
	XMLName xml.Name   `xml:"rss"`
11
	Channel RssChannel `xml:"channel"`
12
	Version string     `xml:"version,attr"`
13
}
14

15
type RssChannel struct {
16
	XMLName     xml.Name   `xml:"channel"`
17
	Title       string     `xml:"title"`
18
	Description string     `xml:"description"`
19
	Link        string     `xml:"link"`
20
	Updated     RssTime    `xml:"pubDate"`
21
	Language    string     `xml:"language"`
22
	Author      string     `xml:"managingEditor"`
23
	Generator   string     `xml:"generator"`
24
	Docs        string     `xml:"docs"`
25
	Entry       []RssEntry `xml:"item"`
26
}
27

28
type RssEntry struct {
29
	ID          RssID          `xml:"guid"`
30
	Title       string         `xml:"title"`
31
	URL         string         `xml:"link"`
32
	Updated     RssTime        `xml:"pubDate"`
33
	Description RssDescription `xml:"description"`
34
	Enclosure   *RssEnclosure  `xml:"enclosure,omitempty"`
35
}
36

37
type RssID struct {
38
	XMLName   xml.Name `xml:"guid"`
39
	PermaLink string   `xml:"isPermaLink,attr"`
40
	ID        string   `xml:",innerxml"`
41
}
42

43
type RssDescription struct {
44
	XMLName xml.Name `xml:"description"`
45
	Text    string   `xml:",cdata"`
46
}
47

48
type RssEnclosure struct {
49
	XMLName  xml.Name `xml:"enclosure"`
50
	Url      string   `xml:"url,attr"`
51
	Length   int      `xml:"length,attr"`
52
	MimeType string   `xml:"type,attr"`
53
}
54

55
func (a *Rss) setChannelData(data FeedChannelData) {
56
	a.Version = "2.0"
57
	a.Channel = RssChannel{
58
		Title:       data.Title,
59
		Description: data.Description,
60
		Link:        data.Link,
61
		Language:    data.Language,
62
		Author:      fmt.Sprintf("%s (%s)", data.Email, data.Author),
63
		Generator:   data.Generator,
64
		Docs:        "http://www.rssboard.org/rss-specification",
65
	}
66

67
	for _, entry := range data.FeedItems {
68
		a.addFeedItem(entry)
69
	}
70
}
71

72
func (a *Rss) ContentType() string {
73
	return "application/rss+xml; charset=utf-8"
74
}
75

76
func (a *Rss) addFeedItem(entry *FeedItem) {
77
	a.Channel.Entry = append(a.Channel.Entry, RssEntry{
78
		ID: RssID{
79
			ID:        entry.GIUD(),
80
			PermaLink: "false",
81
		},
82
		Title:       entry.Title,
83
		URL:         entry.URL,
84
		Updated:     RssTime(entry.CreatedAt),
85
		Description: RssDescription{Text: entry.Text},
86
		Enclosure:   entry.GetRssEnclosure(),
87
	})
88

89
	if entry.CreatedAt.After(time.Time(a.Channel.Updated)) {
90
		a.Channel.Updated = RssTime(entry.CreatedAt)
91
	}
92
}
93

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.