Extract favicon resolution logic into helper functionUnverified
11b97b9 parent: 5c037cb modified
internal/feed/discover.go +15 -0 | @@ -45,6 +45,21 @@ func Discover(ctx context.Context, siteURL string) (*DiscoveryResult, error) { | ||
| 45 | 45 | }, nil |
| 46 | 46 | } |
| 47 | 47 | |
| 48 | +func ResolveFavicon(ctx context.Context, feedURL, siteURL, parsedFavicon string) string { | |
| 49 | + if parsedFavicon != "" { | |
| 50 | + return parsedFavicon | |
| 51 | + } | |
| 52 | + target := siteURL | |
| 53 | + if target == "" { | |
| 54 | + target = feedURL | |
| 55 | + } | |
| 56 | + result, err := Discover(ctx, target) | |
| 57 | + if err != nil { | |
| 58 | + return "" | |
| 59 | + } | |
| 60 | + return result.Favicon | |
| 61 | +} | |
| 62 | + | |
| 48 | 63 | func findFeedURLs(base *url.URL, links []string) []string { |
| 49 | 64 | var feeds []string |
| 50 | 65 | for _, link := range links { |
| @@ -45,6 +45,21 @@ func Discover(ctx context.Context, siteURL string) (*DiscoveryResult, error) { | |||
| 45 | }, nil | 45 | }, nil |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | +func ResolveFavicon(ctx context.Context, feedURL, siteURL, parsedFavicon string) string { | ||
| 49 | + if parsedFavicon != "" { | ||
| 50 | + return parsedFavicon | ||
| 51 | + } | ||
| 52 | + target := siteURL | ||
| 53 | + if target == "" { | ||
| 54 | + target = feedURL | ||
| 55 | + } | ||
| 56 | + result, err := Discover(ctx, target) | ||
| 57 | + if err != nil { | ||
| 58 | + return "" | ||
| 59 | + } | ||
| 60 | + return result.Favicon | ||
| 61 | +} | ||
| 62 | + | ||
| 48 | func findFeedURLs(base *url.URL, links []string) []string { | 63 | func findFeedURLs(base *url.URL, links []string) []string { |
| 49 | var feeds []string | 64 | var feeds []string |
| 50 | for _, link := range links { | 65 | for _, link := range links { |
modified
internal/feed/fetcher.go +2 -7 | @@ -185,14 +185,9 @@ func (s *Scheduler) FetchFeed(ctx context.Context, feed *Feed) { | ||
| 185 | 185 | if result != nil && result.Feed.FaviconURL != "" { |
| 186 | 186 | _ = s.store.UpdateFeedFavicon(ctx, feed.URL, result.Feed.FaviconURL) |
| 187 | 187 | } else if feed.FaviconURL == "" { |
| 188 | - siteURL := feed.SiteURL | |
| 189 | - if siteURL == "" { | |
| 190 | - siteURL = feed.URL | |
| 191 | - } | |
| 192 | 188 | go func() { |
| 193 | - discResult, err := Discover(context.Background(), siteURL) | |
| 194 | - if err == nil && discResult.Favicon != "" { | |
| 195 | - _ = s.store.UpdateFeedFavicon(context.Background(), feed.URL, discResult.Favicon) | |
| 189 | + if f := ResolveFavicon(context.Background(), feed.URL, feed.SiteURL, ""); f != "" { | |
| 190 | + _ = s.store.UpdateFeedFavicon(context.Background(), feed.URL, f) | |
| 196 | 191 | } |
| 197 | 192 | }() |
| 198 | 193 | } |
| @@ -185,14 +185,9 @@ func (s *Scheduler) FetchFeed(ctx context.Context, feed *Feed) { | |||
| 185 | if result != nil && result.Feed.FaviconURL != "" { | 185 | if result != nil && result.Feed.FaviconURL != "" { |
| 186 | _ = s.store.UpdateFeedFavicon(ctx, feed.URL, result.Feed.FaviconURL) | 186 | _ = s.store.UpdateFeedFavicon(ctx, feed.URL, result.Feed.FaviconURL) |
| 187 | } else if feed.FaviconURL == "" { | 187 | } else if feed.FaviconURL == "" { |
| 188 | - siteURL := feed.SiteURL | ||
| 189 | - if siteURL == "" { | ||
| 190 | - siteURL = feed.URL | ||
| 191 | - } | ||
| 192 | go func() { | 188 | go func() { |
| 193 | - discResult, err := Discover(context.Background(), siteURL) | 189 | + if f := ResolveFavicon(context.Background(), feed.URL, feed.SiteURL, ""); f != "" { |
| 194 | - if err == nil && discResult.Favicon != "" { | 190 | + _ = s.store.UpdateFeedFavicon(context.Background(), feed.URL, f) |
| 195 | - _ = s.store.UpdateFeedFavicon(context.Background(), feed.URL, discResult.Favicon) | ||
| 196 | } | 191 | } |
| 197 | }() | 192 | }() |
| 198 | } | 193 | } |
modified
internal/server/feeds_handler.go +10 -18 | @@ -87,16 +87,11 @@ func (s *Server) handleAddFeed(w http.ResponseWriter, r *http.Request) { | ||
| 87 | 87 | return |
| 88 | 88 | } |
| 89 | 89 | |
| 90 | - if result.Feed.FaviconURL != "" { | |
| 91 | - _ = s.db.UpdateFeedFavicon(r.Context(), feedURL, result.Feed.FaviconURL) | |
| 92 | - } else if result.Feed.SiteURL != "" { | |
| 93 | - go func() { | |
| 94 | - discResult, err := feed.Discover(context.Background(), result.Feed.SiteURL) | |
| 95 | - if err == nil && discResult.Favicon != "" { | |
| 96 | - _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, discResult.Favicon) | |
| 97 | - } | |
| 98 | - }() | |
| 99 | - } | |
| 90 | + go func() { | |
| 91 | + if f := feed.ResolveFavicon(context.Background(), feedURL, result.Feed.SiteURL, result.Feed.FaviconURL); f != "" { | |
| 92 | + _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, f) | |
| 93 | + } | |
| 94 | + }() | |
| 100 | 95 | } |
| 101 | 96 | |
| 102 | 97 | var feedTitle string |
| @@ -240,14 +235,11 @@ func (s *Server) handleOPMLUpload(w http.ResponseWriter, r *http.Request) { | ||
| 240 | 235 | continue |
| 241 | 236 | } |
| 242 | 237 | |
| 243 | - if fu.SiteURL != "" { | |
| 244 | - go func(feedURL, siteURL string) { | |
| 245 | - discResult, err := feed.Discover(context.Background(), siteURL) | |
| 246 | - if err == nil && discResult.Favicon != "" { | |
| 247 | - _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, discResult.Favicon) | |
| 248 | - } | |
| 249 | - }(fu.URL, fu.SiteURL) | |
| 250 | - } | |
| 238 | + go func(feedURL, siteURL string) { | |
| 239 | + if f := feed.ResolveFavicon(context.Background(), feedURL, siteURL, ""); f != "" { | |
| 240 | + _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, f) | |
| 241 | + } | |
| 242 | + }(fu.URL, fu.SiteURL) | |
| 251 | 243 | |
| 252 | 244 | var subURI, subCID string |
| 253 | 245 | if client != nil { |
| @@ -87,16 +87,11 @@ func (s *Server) handleAddFeed(w http.ResponseWriter, r *http.Request) { | |||
| 87 | return | 87 | return |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | - if result.Feed.FaviconURL != "" { | 90 | + go func() { |
| 91 | - _ = s.db.UpdateFeedFavicon(r.Context(), feedURL, result.Feed.FaviconURL) | 91 | + if f := feed.ResolveFavicon(context.Background(), feedURL, result.Feed.SiteURL, result.Feed.FaviconURL); f != "" { |
| 92 | - } else if result.Feed.SiteURL != "" { | 92 | + _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, f) |
| 93 | - go func() { | 93 | + } |
| 94 | - discResult, err := feed.Discover(context.Background(), result.Feed.SiteURL) | 94 | + }() |
| 95 | - if err == nil && discResult.Favicon != "" { | ||
| 96 | - _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, discResult.Favicon) | ||
| 97 | - } | ||
| 98 | - }() | ||
| 99 | - } | ||
| 100 | } | 95 | } |
| 101 | 96 | ||
| 102 | var feedTitle string | 97 | var feedTitle string |
| @@ -240,14 +235,11 @@ func (s *Server) handleOPMLUpload(w http.ResponseWriter, r *http.Request) { | |||
| 240 | continue | 235 | continue |
| 241 | } | 236 | } |
| 242 | 237 | ||
| 243 | - if fu.SiteURL != "" { | 238 | + go func(feedURL, siteURL string) { |
| 244 | - go func(feedURL, siteURL string) { | 239 | + if f := feed.ResolveFavicon(context.Background(), feedURL, siteURL, ""); f != "" { |
| 245 | - discResult, err := feed.Discover(context.Background(), siteURL) | 240 | + _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, f) |
| 246 | - if err == nil && discResult.Favicon != "" { | 241 | + } |
| 247 | - _ = s.db.UpdateFeedFavicon(context.Background(), feedURL, discResult.Favicon) | 242 | + }(fu.URL, fu.SiteURL) |
| 248 | - } | ||
| 249 | - }(fu.URL, fu.SiteURL) | ||
| 250 | - } | ||
| 251 | 243 | ||
| 252 | var subURI, subCID string | 244 | var subURI, subCID string |
| 253 | if client != nil { | 245 | if client != nil { |