forked from jason/cpolis
Try out different rss package
This commit is contained in:
@ -11,12 +11,12 @@ import (
|
||||
)
|
||||
|
||||
type Article struct {
|
||||
Tags *TagList
|
||||
Title string
|
||||
Author string
|
||||
Created time.Time
|
||||
Desc string
|
||||
Content string
|
||||
Tags []string
|
||||
UUID uuid.UUID
|
||||
AuthorID int64
|
||||
}
|
||||
|
106
cmd/data/rss.go
106
cmd/data/rss.go
@ -1,106 +0,0 @@
|
||||
package data
|
||||
|
||||
import (
|
||||
"encoding/gob"
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/gorilla/feeds"
|
||||
)
|
||||
|
||||
type Feed struct {
|
||||
addCh chan *feeds.Item
|
||||
setCh chan feeds.Feed
|
||||
getCh chan feeds.Feed
|
||||
feed feeds.Feed
|
||||
wg sync.WaitGroup
|
||||
}
|
||||
|
||||
func minFeed() *Feed {
|
||||
return &Feed{
|
||||
addCh: make(chan *feeds.Item),
|
||||
setCh: make(chan feeds.Feed),
|
||||
getCh: make(chan feeds.Feed),
|
||||
}
|
||||
}
|
||||
|
||||
func (f *Feed) start() {
|
||||
f.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:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func NewFeed(title, link, desc string) *Feed {
|
||||
feed := minFeed()
|
||||
feed.feed = feeds.Feed{
|
||||
Title: title,
|
||||
Link: &feeds.Link{Href: link},
|
||||
Description: desc,
|
||||
}
|
||||
|
||||
feed.wg.Add(1)
|
||||
go feed.start()
|
||||
feed.wg.Wait()
|
||||
|
||||
return feed
|
||||
}
|
||||
|
||||
func (f *Feed) Get() feeds.Feed {
|
||||
return <-f.getCh
|
||||
}
|
||||
|
||||
func (f *Feed) Set(feed feeds.Feed) {
|
||||
f.setCh <- feed
|
||||
}
|
||||
|
||||
func OpenFeed(filename string) (*Feed, error) {
|
||||
file, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error opening file %v: %v", filename, err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
feed := minFeed()
|
||||
feed.wg.Add(1)
|
||||
go feed.start()
|
||||
feed.wg.Wait()
|
||||
|
||||
decoder := gob.NewDecoder(file)
|
||||
tmpFeed := new(feeds.Feed)
|
||||
err = decoder.Decode(tmpFeed)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error decoding file %v: %v", filename, err)
|
||||
}
|
||||
|
||||
feed.Set(*tmpFeed)
|
||||
|
||||
return feed, nil
|
||||
}
|
||||
|
||||
func (f *Feed) 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()
|
||||
|
||||
encoder := gob.NewEncoder(file)
|
||||
feed := f.Get()
|
||||
err = encoder.Encode(feed)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error encoding file %v: %v", filename, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *Feed) Add(i *feeds.Item) {
|
||||
f.addCh <- i
|
||||
}
|
@ -6,8 +6,8 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"git.streifling.com/jason/rss"
|
||||
"github.com/google/uuid"
|
||||
"github.com/gorilla/feeds"
|
||||
"streifling.com/jason/cpolis/cmd/data"
|
||||
)
|
||||
|
||||
@ -116,7 +116,7 @@ func ReviewArticle(al *data.ArticleList, s *data.CookieStore) http.HandlerFunc {
|
||||
}
|
||||
}
|
||||
|
||||
func PublishArticle(f *data.Feed, al *data.ArticleList, s *data.CookieStore) http.HandlerFunc {
|
||||
func PublishArticle(f *rss.Feed, al *data.ArticleList, s *data.CookieStore) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
uuid, err := uuid.Parse(r.PostFormValue("uuid"))
|
||||
if err != nil {
|
||||
@ -141,13 +141,12 @@ func PublishArticle(f *data.Feed, al *data.ArticleList, s *data.CookieStore) htt
|
||||
template.Must(tmpl, err).ExecuteTemplate(w, "page-content", msg)
|
||||
}
|
||||
|
||||
f.Add(&feeds.Item{
|
||||
Title: article.Title,
|
||||
Author: &feeds.Author{Name: session.Values["name"].(string)},
|
||||
Created: article.Created,
|
||||
Description: article.Desc,
|
||||
Content: article.Content,
|
||||
})
|
||||
item := rss.NewItem()
|
||||
item.Title = article.Title
|
||||
item.Author = article.Author
|
||||
item.Description = article.Desc
|
||||
item.Content = &rss.Content{Value: article.Content}
|
||||
f.Channels[0].AddItem(item)
|
||||
f.Save("tmp/rss.gob")
|
||||
|
||||
tmpl, err := template.ParseFiles("web/templates/hub.html")
|
||||
|
@ -5,13 +5,12 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"streifling.com/jason/cpolis/cmd/data"
|
||||
"git.streifling.com/jason/rss"
|
||||
)
|
||||
|
||||
func ShowRSS(f *data.Feed) http.HandlerFunc {
|
||||
func ShowRSS(f *rss.Feed) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
feed := f.Get()
|
||||
rss, err := feed.ToRss()
|
||||
rss, err := f.ToXML()
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
|
Reference in New Issue
Block a user