url_rewrite.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package rewrite // import "miniflux.app/v2/internal/reader/rewrite"
  4. import (
  5. "log/slog"
  6. "regexp"
  7. "miniflux.app/v2/internal/model"
  8. )
  9. var customReplaceRuleRegex = regexp.MustCompile(`^rewrite\("([^"]+)"\|"([^"]+)"\)$`)
  10. func RewriteEntryURL(feed *model.Feed, entry *model.Entry) string {
  11. if feed.UrlRewriteRules == "" {
  12. return entry.URL
  13. }
  14. var rewrittenURL = entry.URL
  15. parts := customReplaceRuleRegex.FindStringSubmatch(feed.UrlRewriteRules)
  16. if len(parts) == 3 {
  17. re, err := regexp.Compile(parts[1])
  18. if err != nil {
  19. slog.Error("Failed on regexp compilation",
  20. slog.String("url_rewrite_rules", feed.UrlRewriteRules),
  21. slog.Any("error", err),
  22. )
  23. return rewrittenURL
  24. }
  25. rewrittenURL = re.ReplaceAllString(entry.URL, parts[2])
  26. slog.Debug("Rewriting entry URL",
  27. slog.String("original_entry_url", entry.URL),
  28. slog.String("rewritten_entry_url", rewrittenURL),
  29. slog.Int64("feed_id", feed.ID),
  30. slog.String("feed_url", feed.FeedURL),
  31. )
  32. } else {
  33. slog.Debug("Cannot find search and replace terms for replace rule",
  34. slog.String("original_entry_url", entry.URL),
  35. slog.String("rewritten_entry_url", rewrittenURL),
  36. slog.Int64("feed_id", feed.ID),
  37. slog.String("feed_url", feed.FeedURL),
  38. slog.String("url_rewrite_rules", feed.UrlRewriteRules),
  39. )
  40. }
  41. return rewrittenURL
  42. }