nandi/gleanpublic Fork 0
681840f
Commits
Clone
git clone https://git.rickub.com/nandi/glean.git
git clone ssh://git@rickub.com/nandi/glean.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Improve feed discoveryUnverified

Julien Robert committed 2026-04-23T21:13:27+02:00 Browse files
681840f parent: 45ae5dc
modified internal/server/feeds_handler.go +20 -0
@@ -4,6 +4,7 @@ import (
44 "context"
55 "database/sql"
66 "errors"
7+ "fmt"
78 "net/http"
89 "time"
910
@@ -91,6 +92,9 @@ func (s *Server) handleAddFeed(w http.ResponseWriter, r *http.Request) {
9192 }
9293
9394 result, _, _, err := s.fetcher.Fetch(r.Context(), feedURL, "", "")
95+ if err != nil {
96+ result, feedURL, err = s.discoverFeed(r.Context(), feedURL)
97+ }
9498 if err != nil {
9599 s.logger.Error("failed to fetch feed", "error", err, "url", feedURL)
96100 http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -447,6 +451,22 @@ func (s *Server) handleDismissFeedRecommendation(w http.ResponseWriter, r *http.
447451 w.WriteHeader(http.StatusOK)
448452 }
449453
454+func (s *Server) discoverFeed(ctx context.Context, feedURL string) (*feed.ParseResult, string, error) {
455+ discovered, err := feed.Discover(ctx, feedURL)
456+ if err != nil || len(discovered.FeedURLs) == 0 {
457+ return nil, feedURL, fmt.Errorf("no feeds found at %s", feedURL)
458+ }
459+
460+ for _, candidate := range discovered.FeedURLs {
461+ result, _, _, fetchErr := s.fetcher.Fetch(ctx, candidate, "", "")
462+ if fetchErr == nil && result != nil {
463+ return result, candidate, nil
464+ }
465+ }
466+
467+ return nil, feedURL, fmt.Errorf("no feeds found at %s", feedURL)
468+}
469+
450470 func nullString(s string) sql.NullString {
451471 return sql.NullString{String: s, Valid: s != ""}
452472 }
@@ -4,6 +4,7 @@ import (
4 "context"4 "context"
5 "database/sql"5 "database/sql"
6 "errors"6 "errors"
7+ "fmt"
7 "net/http"8 "net/http"
8 "time"9 "time"
9 10
@@ -91,6 +92,9 @@ func (s *Server) handleAddFeed(w http.ResponseWriter, r *http.Request) {
91 }92 }
92 93
93 result, _, _, err := s.fetcher.Fetch(r.Context(), feedURL, "", "")94 result, _, _, err := s.fetcher.Fetch(r.Context(), feedURL, "", "")
95+ if err != nil {
96+ result, feedURL, err = s.discoverFeed(r.Context(), feedURL)
97+ }
94 if err != nil {98 if err != nil {
95 s.logger.Error("failed to fetch feed", "error", err, "url", feedURL)99 s.logger.Error("failed to fetch feed", "error", err, "url", feedURL)
96 http.Error(w, err.Error(), http.StatusInternalServerError)100 http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -447,6 +451,22 @@ func (s *Server) handleDismissFeedRecommendation(w http.ResponseWriter, r *http.
447 w.WriteHeader(http.StatusOK)451 w.WriteHeader(http.StatusOK)
448 }452 }
449 453
454+func (s *Server) discoverFeed(ctx context.Context, feedURL string) (*feed.ParseResult, string, error) {
455+ discovered, err := feed.Discover(ctx, feedURL)
456+ if err != nil || len(discovered.FeedURLs) == 0 {
457+ return nil, feedURL, fmt.Errorf("no feeds found at %s", feedURL)
458+ }
459+
460+ for _, candidate := range discovered.FeedURLs {
461+ result, _, _, fetchErr := s.fetcher.Fetch(ctx, candidate, "", "")
462+ if fetchErr == nil && result != nil {
463+ return result, candidate, nil
464+ }
465+ }
466+
467+ return nil, feedURL, fmt.Errorf("no feeds found at %s", feedURL)
468+}
469+
450 func nullString(s string) sql.NullString {470 func nullString(s string) sql.NullString {
451 return sql.NullString{String: s, Valid: s != ""}471 return sql.NullString{String: s, Valid: s != ""}
452 }472 }