-
Notifications
You must be signed in to change notification settings - Fork 0
/
refresh.go
111 lines (102 loc) · 2.61 KB
/
refresh.go
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
108
109
110
111
package utils
import (
"errors"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
)
type Store struct {
RootFolder string
FeedName string
}
func (s Store) Add(link string) error {
r, err := http.Get(link)
if err != nil {
return fmt.Errorf("could not reach %s", link)
}
xml, err := ioutil.ReadAll(r.Body)
if err != nil {
return fmt.Errorf("could not get XML feed for this channel from %s", link)
}
err = r.Body.Close()
if err != nil {
return fmt.Errorf("could not read feed from %s")
}
channel, err := ParseFeed(string(xml))
if err != nil {
return err
}
path := filepath.Join(s.RootFolder, channel.Title)
_, err = os.Stat(path)
if !errors.Is(err, os.ErrNotExist) {
return fmt.Errorf("channel by the same title (%s) already exists", channel.Title)
}
err = os.Mkdir(path, 0750)
if err != nil {
return fmt.Errorf("could not create folder %s", path)
}
feed := filepath.Join(path, s.FeedName)
err = os.WriteFile(feed, xml, 0666)
if err != nil {
return fmt.Errorf("could not write to feed file %s", feed)
}
return nil
}
func (s Store) Refresh(title string) ([]Item, error) {
channel, err := ParseFile(filepath.Join(s.RootFolder, title, s.FeedName))
if err != nil {
return nil, err
}
oldTop := ""
if channel.Items != nil && len(channel.Items) != 0 {
oldTop = channel.Items[0].Guid
}
newFeed, err := http.Get(channel.FeedURL.Href)
if err != nil {
return nil, fmt.Errorf("could not retrieve new feed at %s", channel.FeedURL.Href)
}
feedContents, err := ioutil.ReadAll(newFeed.Body)
if err != nil {
return nil, fmt.Errorf("could not read response from %s", channel.FeedURL.Href)
}
err = newFeed.Body.Close()
if err != nil {
return nil, fmt.Errorf("could not read response from %s", channel.FeedURL.Href)
}
fp := filepath.Join(s.RootFolder, title, s.FeedName)
err = os.WriteFile(fp, feedContents, 0666)
if err != nil {
return nil, fmt.Errorf("could not write to file %s", fp)
}
channel, err = ParseFeed(string(feedContents))
if err != nil { return nil, err }
var newItems []Item
for i:=0; channel.Items[i].Guid!=oldTop; i++ {
newItems = append(newItems, channel.Items[i])
}
return newItems, nil
}
type Collection struct {
Channel string
Episodes []Item
}
func (s Store) RefreshAll() ([]Collection, error) {
list, err := os.ReadDir(s.RootFolder)
if err != nil {
return nil, fmt.Errorf("could not access %s", s.RootFolder)
}
newCollections := make([]Collection, len(list))
for i, l := range list {
ni, err := s.Refresh(l.Name())
if err != nil {
return nil, err
}
newCollections[i] = Collection{
Channel: l.Name(),
Episodes: ni,
}
}
return newCollections, nil
}