Converted RSS package to git.streifling.com/jason/rss

This commit is contained in:
2024-03-05 17:13:59 +01:00
parent 21170c9cc2
commit 6136f83dfc
6 changed files with 67 additions and 57 deletions

View File

@ -6,96 +6,96 @@ import (
"os"
"sync"
"github.com/gorilla/feeds"
"git.streifling.com/jason/rss"
)
type Feed struct {
addCh chan *feeds.Item
setCh chan feeds.Feed
getCh chan feeds.Feed
feed feeds.Feed
wg sync.WaitGroup
type Channel struct {
addCh chan *rss.Item
setCh chan rss.Channel
getCh chan rss.Channel
channel rss.Channel
wg sync.WaitGroup
}
func initFeed() *Feed {
return &Feed{
addCh: make(chan *feeds.Item),
setCh: make(chan feeds.Feed),
getCh: make(chan feeds.Feed),
func initChannel() *Channel {
return &Channel{
addCh: make(chan *rss.Item),
setCh: make(chan rss.Channel),
getCh: make(chan rss.Channel),
}
}
func (f *Feed) start() {
f.wg.Done()
func (c *Channel) start() {
c.wg.Done()
for {
select {
case item := <-f.addCh:
f.feed.Items = append(f.feed.Items, item)
case f.getCh <- f.feed:
case f.feed = <-f.setCh:
case item := <-c.addCh:
c.channel.Items = append(c.channel.Items, item)
case c.getCh <- c.channel:
case c.channel = <-c.setCh:
}
}
}
func NewFeed(title, link, desc string) *Feed {
feed := initFeed()
feed.feed = feeds.Feed{
func NewChannel(title, link, desc string) *Channel {
channel := initChannel()
channel.channel = rss.Channel{
Title: title,
Link: &feeds.Link{Href: link},
Link: link,
Description: desc,
}
feed.wg.Add(1)
go feed.start()
feed.wg.Wait()
channel.wg.Add(1)
go channel.start()
channel.wg.Wait()
return feed
return channel
}
func (f *Feed) Get() feeds.Feed {
return <-f.getCh
func (c *Channel) Get() rss.Channel {
return <-c.getCh
}
func (f *Feed) Set(feed feeds.Feed) {
f.setCh <- feed
func (f *Channel) Set(channel rss.Channel) {
f.setCh <- channel
}
func OpenFeed(filename string) (*Feed, error) {
func LoadChannel(filename string) (*Channel, error) {
file, err := os.Open(filename)
if err != nil {
return nil, fmt.Errorf("error opening file %v: %v", filename, err)
}
defer file.Close()
feed := initFeed()
feed.wg.Add(1)
go feed.start()
feed.wg.Wait()
channel := initChannel()
channel.wg.Add(1)
go channel.start()
channel.wg.Wait()
tmpFeed := new(feeds.Feed)
if err = gob.NewDecoder(file).Decode(tmpFeed); err != nil {
return nil, fmt.Errorf("error decoding file %v: %v", filename, err)
tmpChannel := new(rss.Channel)
if err = gob.NewDecoder(file).Decode(tmpChannel); err != nil {
return nil, fmt.Errorf("error decoding channel from file %v: %v", filename, err)
}
feed.Set(*tmpFeed)
return feed, nil
channel.Set(*tmpChannel)
return channel, nil
}
func (f *Feed) Save(filename string) error {
func (c *Channel) Save(filename string) error {
file, err := os.Create(filename)
if err != nil {
return fmt.Errorf("error creating file %v: %v", filename, err)
}
defer file.Close()
feed := f.Get()
if err = gob.NewEncoder(file).Encode(feed); err != nil {
channel := c.Get()
if err = gob.NewEncoder(file).Encode(channel); err != nil {
return fmt.Errorf("error encoding file %v: %v", filename, err)
}
return nil
}
func (f *Feed) Add(i *feeds.Item) {
f.addCh <- i
func (c *Channel) Add(i *rss.Item) {
c.addCh <- i
}