| @@ -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 | } |