rss.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package rss // import "miniflux.app/v2/internal/reader/rss"
  4. import (
  5. "encoding/xml"
  6. "strconv"
  7. "strings"
  8. "miniflux.app/v2/internal/reader/dublincore"
  9. "miniflux.app/v2/internal/reader/googleplay"
  10. "miniflux.app/v2/internal/reader/itunes"
  11. "miniflux.app/v2/internal/reader/media"
  12. )
  13. // Specs: https://www.rssboard.org/rss-specification
  14. type RSS struct {
  15. Version string `xml:"rss version,attr"`
  16. Channel RSSChannel `xml:"rss channel"`
  17. }
  18. type RSSChannel struct {
  19. Title string `xml:"rss title"`
  20. Link string `xml:"rss link"`
  21. Description string `xml:"rss description"`
  22. Language string `xml:"rss language"`
  23. Copyright string `xml:"rss copyRight"`
  24. ManagingEditor string `xml:"rss managingEditor"`
  25. Webmaster string `xml:"rss webMaster"`
  26. PubDate string `xml:"rss pubDate"`
  27. LastBuildDate string `xml:"rss lastBuildDate"`
  28. Categories []string `xml:"rss category"`
  29. Generator string `xml:"rss generator"`
  30. Docs string `xml:"rss docs"`
  31. Cloud *RSSCloud `xml:"rss cloud"`
  32. Image *RSSImage `xml:"rss image"`
  33. TTL string `xml:"rss ttl"`
  34. SkipHours []string `xml:"rss skipHours>hour"`
  35. SkipDays []string `xml:"rss skipDays>day"`
  36. Items []RSSItem `xml:"rss item"`
  37. AtomLinks
  38. itunes.ItunesChannelElement
  39. googleplay.GooglePlayChannelElement
  40. }
  41. type RSSCloud struct {
  42. Domain string `xml:"domain,attr"`
  43. Port string `xml:"port,attr"`
  44. Path string `xml:"path,attr"`
  45. RegisterProcedure string `xml:"registerProcedure,attr"`
  46. Protocol string `xml:"protocol,attr"`
  47. }
  48. type RSSImage struct {
  49. // URL is the URL of a GIF, JPEG or PNG image that represents the channel.
  50. URL string `xml:"url"`
  51. // Title describes the image, it's used in the ALT attribute of the HTML <img> tag when the channel is rendered in HTML.
  52. Title string `xml:"title"`
  53. // Link is the URL of the site, when the channel is rendered, the image is a link to the site.
  54. Link string `xml:"link"`
  55. }
  56. type RSSItem struct {
  57. Title string `xml:"rss title"`
  58. Link string `xml:"rss link"`
  59. Description string `xml:"rss description"`
  60. Author RSSAuthor `xml:"rss author"`
  61. Categories []string `xml:"rss category"`
  62. CommentsURL string `xml:"rss comments"`
  63. Enclosures []RSSEnclosure `xml:"rss enclosure"`
  64. GUID RSSGUID `xml:"rss guid"`
  65. PubDate string `xml:"rss pubDate"`
  66. Source RSSSource `xml:"rss source"`
  67. dublincore.DublinCoreItemElement
  68. FeedBurnerItemElement
  69. media.MediaItemElement
  70. AtomAuthor
  71. AtomLinks
  72. itunes.ItunesItemElement
  73. googleplay.GooglePlayItemElement
  74. }
  75. type RSSAuthor struct {
  76. XMLName xml.Name
  77. Data string `xml:",chardata"`
  78. Inner string `xml:",innerxml"`
  79. }
  80. type RSSEnclosure struct {
  81. URL string `xml:"url,attr"`
  82. Type string `xml:"type,attr"`
  83. Length string `xml:"length,attr"`
  84. }
  85. func (enclosure *RSSEnclosure) Size() int64 {
  86. if strings.TrimSpace(enclosure.Length) == "" {
  87. return 0
  88. }
  89. size, _ := strconv.ParseInt(enclosure.Length, 10, 0)
  90. return size
  91. }
  92. type RSSGUID struct {
  93. Data string `xml:",chardata"`
  94. IsPermaLink string `xml:"isPermaLink,attr"`
  95. }
  96. type RSSSource struct {
  97. URL string `xml:"url,attr"`
  98. Name string `xml:",chardata"`
  99. }