From fa92ea16b012107d86c3142e87fa3d21770b5d69 Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Fri, 2 Apr 2021 21:10:17 +0100 Subject: [PATCH] search for icons only during startup and after adding feeds --- src/server/routes.go | 10 +++------- src/server/server.go | 1 + src/worker/crawler.go | 2 +- src/worker/worker.go | 31 ++++++++++++++++++++----------- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/server/routes.go b/src/server/routes.go index 245feee..0821c8b 100644 --- a/src/server/routes.go +++ b/src/server/routes.go @@ -186,14 +186,8 @@ func (s *Server) handleFeedList(c *router.Context) { form.FolderID, ) s.db.CreateItems(worker.ConvertItems(result.Feed.Items, *feed)) + s.worker.FindFeedFavicon(*feed) - icon, err := worker.FindFavicon(feed.Link, feed.FeedLink) - if icon != nil { - s.db.UpdateFeedIcon(feed.Id, icon) - } - if err != nil { - log.Printf("Failed to find favicon for %s (%d): %s", feed.FeedLink, feed.Id, err) - } c.JSON(http.StatusOK, map[string]string{"status": "success"}) default: c.JSON(http.StatusOK, map[string]string{"status": "notfound"}) @@ -364,7 +358,9 @@ func (s *Server) handleOPMLImport(c *router.Context) { } } + s.worker.FindFavicons() s.worker.RefreshFeeds() + c.Out.WriteHeader(http.StatusOK) } else { c.Out.WriteHeader(http.StatusMethodNotAllowed) diff --git a/src/server/server.go b/src/server/server.go index 11b2176..0946b01 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -41,6 +41,7 @@ func (h *Server) GetAddr() string { func (s *Server) Start() { refreshRate := s.db.GetSettingsValueInt64("refresh_rate") + s.worker.FindFavicons() s.worker.StartFeedCleaner() s.worker.SetRefreshRate(refreshRate) if refreshRate > 0 { diff --git a/src/worker/crawler.go b/src/worker/crawler.go index 508d3cd..6e1ec20 100644 --- a/src/worker/crawler.go +++ b/src/worker/crawler.go @@ -74,7 +74,7 @@ func DiscoverFeed(candidateUrl string) (*DiscoverResult, error) { return result, nil } -func FindFavicon(websiteUrl, feedUrl string) (*[]byte, error) { +func findFavicon(websiteUrl, feedUrl string) (*[]byte, error) { candidateUrls := make([]string, 0) favicon := func(link string) string { diff --git a/src/worker/worker.go b/src/worker/worker.go index 3bd2c04..8b07025 100644 --- a/src/worker/worker.go +++ b/src/worker/worker.go @@ -37,6 +37,26 @@ func (w *Worker) StartFeedCleaner() { }() } +func (w *Worker) FindFavicons() { + go func() { + for _, feed := range w.db.ListFeeds() { + if !feed.HasIcon { + w.FindFeedFavicon(feed) + } + } + }() +} + +func (w *Worker) FindFeedFavicon(feed storage.Feed) { + icon, err := findFavicon(feed.Link, feed.FeedLink) + if err != nil { + log.Printf("Failed to find favicon for %s (%s): %s", feed.FeedLink, feed.Link, err) + } + if icon != nil { + w.db.UpdateFeedIcon(feed.Id, icon) + } +} + func (w *Worker) SetRefreshRate(minute int64) { if w.stopper != nil { w.refresh.Stop() @@ -116,16 +136,5 @@ func (w *Worker) worker(srcqueue <-chan storage.Feed, dstqueue chan<- []storage. w.db.SetFeedError(feed.Id, err) } dstqueue <- items - - // TODO: move somewhere else - if !feed.HasIcon { - icon, err := FindFavicon(feed.Link, feed.FeedLink) - if icon != nil { - w.db.UpdateFeedIcon(feed.Id, icon) - } - if err != nil { - log.Printf("Failed to find favicon for %s (%s): %s", feed.FeedLink, feed.Link, err) - } - } } }