~chrisppy/beagles

ref: 175af2c65fd91aa2084dde988f7dfe536eb760bc beagles/rss.go -rw-r--r-- 2.2 KiB
175af2c6Chris Palmer Re-add badge in README 1 year, 10 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// This file is part of beagles.
//
// Copyright © 2020 Chris Palmer <chris@red-oxide.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

package main

import (
	"fmt"

	"github.com/mmcdole/gofeed"
)

func parseFeed(url string) (f *gofeed.Feed, err error) {
	defer func() {
		if r := recover(); r != nil {
			err = fmt.Errorf("panic occurred in gofeed: %v", r)
		}
	}()
	fp := gofeed.NewParser()
	f, err = fp.ParseURL(url)
	return
}

func findNewItems(f *Feed) ([]*Item, error) {
	feed, err := parseFeed(f.UpdateURL)
	if err != nil {
		return nil, fmt.Errorf("unable to fetch url: %s", err.Error())
	}

	items := make([]*Item, 0)
it:
	for _, item := range feed.Items {
		for _, location := range f.Items {
			if item.Link == location {
				continue it
			}
		}
		items = append(items, convertFromItem(item))
	}

	return items, nil
}

func convertFromItem(item *gofeed.Item) *Item {
	if item == nil {
		return nil
	}

	i := &Item{
		Title:   item.Title,
		Content: item.Content,
		Link:    item.Link,
		Read:    false,
	}

	if item.UpdatedParsed != nil {
		i.Date = *item.UpdatedParsed
	} else {
		i.Date = *item.PublishedParsed
	}

	if i.Content == "" {
		i.Content = item.Description
	}

	if len(item.Enclosures) > 0 {
		e := item.Enclosures[0]
		i.Location = e.URL
		i.Type = e.Type
		i.Length = e.Length
	}

	return i
}

func convertFromFeed(feed *gofeed.Feed, url string) *Feed {
	if feed == nil {
		return nil
	}

	f := &Feed{
		Title:       feed.Title,
		Description: feed.Description,
		UpdateURL:   url,
		Link:        feed.FeedLink,
		Items:       make([]string, len(feed.Items)),
	}

	if f.Link == "" {
		f.Link = feed.Link
	}

	return f
}