mirror of
https://github.com/nkanaev/yarr.git
synced 2026-06-27 18:45:17 +00:00
refactor feedstate + swap implementation
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/nkanaev/yarr/src/content/scraper"
|
||||
"github.com/nkanaev/yarr/src/parser"
|
||||
@@ -162,9 +163,9 @@ func ConvertItems(items []parser.Item, feed storage.Feed) []storage.Item {
|
||||
func listItems(f storage.Feed, db *storage.Storage) ([]storage.Item, error) {
|
||||
lmod := ""
|
||||
etag := ""
|
||||
if state := db.GetHTTPState(f.Id); state != nil {
|
||||
lmod = state.LastModified
|
||||
etag = state.Etag
|
||||
if state, _ := db.GetFeedState(f.Id); state != nil {
|
||||
lmod = state.HTTPLastModified
|
||||
etag = state.HTTPEtag
|
||||
}
|
||||
|
||||
res, err := client.getConditional(f.FeedLink, lmod, etag)
|
||||
@@ -190,8 +191,13 @@ func listItems(f storage.Feed, db *storage.Storage) ([]storage.Item, error) {
|
||||
|
||||
lmod = res.Header.Get("Last-Modified")
|
||||
etag = res.Header.Get("Etag")
|
||||
now := time.Now().UTC()
|
||||
if lmod != "" || etag != "" {
|
||||
db.SetHTTPState(f.Id, lmod, etag)
|
||||
db.UpdateFeedState(f.Id, storage.UpdateFeedStateParams{
|
||||
HTTPLastModified: &lmod,
|
||||
HTTPEtag: &etag,
|
||||
LastRefreshed: &now,
|
||||
})
|
||||
}
|
||||
return ConvertItems(feed.Items, f), nil
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ func (w *Worker) RefreshFeeds() {
|
||||
}
|
||||
|
||||
func (w *Worker) refresher(feeds []storage.Feed) {
|
||||
w.db.ResetFeedErrors()
|
||||
// w.db.ResetFeedErrors()
|
||||
|
||||
srcqueue := make(chan storage.Feed, len(feeds))
|
||||
dstqueue := make(chan []storage.Item)
|
||||
@@ -136,9 +136,13 @@ func (w *Worker) refresher(feeds []storage.Feed) {
|
||||
|
||||
func (w *Worker) worker(srcqueue <-chan storage.Feed, dstqueue chan<- []storage.Item) {
|
||||
for feed := range srcqueue {
|
||||
empty := ""
|
||||
w.db.UpdateFeedState(feed.Id, storage.UpdateFeedStateParams{LastError: &empty})
|
||||
|
||||
items, err := listItems(feed, w.db)
|
||||
if err != nil {
|
||||
w.db.SetFeedError(feed.Id, err)
|
||||
errMsg := err.Error()
|
||||
w.db.UpdateFeedState(feed.Id, storage.UpdateFeedStateParams{LastError: &errMsg})
|
||||
}
|
||||
dstqueue <- items
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user