format.go 972 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package parser // import "miniflux.app/v2/internal/reader/parser"
  4. import (
  5. "encoding/xml"
  6. "strings"
  7. rxml "miniflux.app/v2/internal/reader/xml"
  8. )
  9. // List of feed formats.
  10. const (
  11. FormatRDF = "rdf"
  12. FormatRSS = "rss"
  13. FormatAtom = "atom"
  14. FormatJSON = "json"
  15. FormatUnknown = "unknown"
  16. )
  17. // DetectFeedFormat tries to guess the feed format from input data.
  18. func DetectFeedFormat(data string) string {
  19. if strings.HasPrefix(strings.TrimSpace(data), "{") {
  20. return FormatJSON
  21. }
  22. decoder := rxml.NewDecoder(strings.NewReader(data))
  23. for {
  24. token, _ := decoder.Token()
  25. if token == nil {
  26. break
  27. }
  28. if element, ok := token.(xml.StartElement); ok {
  29. switch element.Name.Local {
  30. case "rss":
  31. return FormatRSS
  32. case "feed":
  33. return FormatAtom
  34. case "RDF":
  35. return FormatRDF
  36. }
  37. }
  38. }
  39. return FormatUnknown
  40. }