diff --git a/core/core.go b/core/core.go index 1f92d76..a97b8e3 100644 --- a/core/core.go +++ b/core/core.go @@ -16,7 +16,6 @@ import ( "encoding/json" "fmt" "io/ioutil" - "net/url" "os" "path/filepath" "sync" @@ -55,10 +54,10 @@ func Init(dataPath string) error { } if Data.Feeds == nil { - Data.Feeds = make(map[url.URL]*Feed) + Data.Feeds = make(map[string]*Feed) } if Data.Pages == nil { - Data.Pages = make(map[url.URL]*Page) + Data.Pages = make(map[string]*Page) } return nil } diff --git a/core/structs.go b/core/structs.go index 7e4dc09..6270de8 100644 --- a/core/structs.go +++ b/core/structs.go @@ -22,8 +22,8 @@ import ( // FullData is used for both reading from json and for storing the global feeds // map. contains read mutexes so concurrency can be used. type FullData struct { - Feeds map[url.URL]*Feed `json:"feeds,omitempty"` - Pages map[url.URL]*Page `json:"pages,omitempty"` + Feeds map[string]*Feed `json:"feeds,omitempty"` + Pages map[string]*Page `json:"pages,omitempty"` FeedsMu *sync.RWMutex PagesMu *sync.RWMutex @@ -32,8 +32,8 @@ type FullData struct { // Feed holds all the necessary fields when storing a feed type Feed struct { Title string `json:"title,omitempty"` - Link *url.URL `json:"link,omitempty"` // link to the human-readable page for the feed. same as FeedLink for gemini feeds. - FeedLink *url.URL `json:"feedlink,omitempty"` // link to the feed itself. + Link string `json:"link,omitempty"` // link to the human-readable page for the feed. same as FeedLink for gemini feeds. + FeedLink string `json:"feedlink,omitempty"` // link to the feed itself. Updated time.Time `json:"updated,omitempty"` Items []*Item `json:"items,omitempty"` } @@ -42,7 +42,7 @@ type Feed struct { type Item struct { Title string `json:"title,omitempty"` // if empty, use Link as title Content string `json:"content,omitempty"` - Link *url.URL `json:"link,omitempty"` + Link string `json:"link,omitempty"` Published time.Time `json:"updated,omitempty"` } @@ -50,7 +50,7 @@ type Item struct { // changes. type Page struct { Title string `json:"title,omitempty"` - Link *url.URL `json:"link,omitempty"` + Link string `json:"link,omitempty"` Updated time.Time `json:"updated,omitempty"` Hash string `json:"hash,omitempty"` } @@ -74,6 +74,8 @@ func GofeedConvert(f *gofeed.Feed, title string) (*Feed, error) { if err != nil { return nil, err } + new.Link = f.Link + new.FeedLink = f.FeedLink for _, v := range f.Items { item := &Item{} @@ -84,6 +86,7 @@ func GofeedConvert(f *gofeed.Feed, title string) (*Feed, error) { if err != nil { return nil, err } + item.Link = f.FeedLink new.Items = append(new.Items, item) } @@ -94,10 +97,10 @@ func GofeedConvert(f *gofeed.Feed, title string) (*Feed, error) { // InsertFeed will insert or update a core.Feed in a core.FullData func (d *FullData) InsertFeed(new *Feed, remote *url.URL) { d.FeedsMu.Lock() - oldFeed, ok := d.Feeds[*remote] + oldFeed, ok := d.Feeds[remote.String()] if !ok || !reflect.DeepEqual(new, oldFeed) { // Feeds are different, or there was never an old one - d.Feeds[*remote] = new + d.Feeds[remote.String()] = new d.FeedsMu.Unlock() } else { d.FeedsMu.Unlock() @@ -107,10 +110,10 @@ func (d *FullData) InsertFeed(new *Feed, remote *url.URL) { // InsertPage will insert or update a core.Page in a core.FullData func (d *FullData) InsertPage(new *Page, remote *url.URL) { d.PagesMu.Lock() - _, ok := d.Pages[*remote] - if !ok || d.Pages[*remote].Hash != new.Hash { + _, ok := d.Pages[remote.String()] + if !ok || d.Pages[remote.String()].Hash != new.Hash { // pages are different, or there was never an old one - d.Pages[*remote] = new + d.Pages[remote.String()] = new d.PagesMu.Unlock() } else { d.PagesMu.Unlock() diff --git a/fetch/gemini.go b/fetch/gemini.go index 3c81eaa..ae8affa 100644 --- a/fetch/gemini.go +++ b/fetch/gemini.go @@ -60,8 +60,9 @@ func geminiFeed(data *core.FullData, remote *url.URL, title string) error { case "text/gemini": var feed core.Feed feed.Title = title // will be set later if given title is "" - feed.Link = remote - feed.FeedLink = remote + feed.Link = remote.String() + feed.FeedLink = remote.String() + feed.Updated = time.Now() text, err := gemini.ParseText(resp.Body) if err != nil { @@ -90,7 +91,7 @@ func geminiFeed(data *core.FullData, remote *url.URL, title string) error { item := &core.Item{} item.Title = strings.TrimLeft(line.Name[10:], ": ") item.Published = date - item.Link = link + item.Link = link.String() feed.Items = append(feed.Items, item) } } @@ -129,7 +130,7 @@ func geminiPage(data *core.FullData, remote *url.URL, title string) error { var page core.Page page.Title = title - page.Link = remote + page.Link = remote.String() h := sha256.New() if _, err := io.Copy(h, reader); err != nil { return err diff --git a/fetch/gopher.go b/fetch/gopher.go index 5db1208..79b5a5b 100644 --- a/fetch/gopher.go +++ b/fetch/gopher.go @@ -55,7 +55,7 @@ func gopherPage(data *core.FullData, remote *url.URL, title string) error { var page core.Page page.Title = title - page.Link = remote + page.Link = remote.String() h := sha256.New() if _, err := io.Copy(h, reader); err != nil { return err diff --git a/fetch/http.go b/fetch/http.go index 393630d..09d5216 100644 --- a/fetch/http.go +++ b/fetch/http.go @@ -89,7 +89,7 @@ func httpPage(data *core.FullData, remote *url.URL, title string) error { var page core.Page page.Title = title - page.Link = remote + page.Link = remote.String() h := sha256.New() if _, err := io.Copy(h, reader); err != nil { return err