rdf.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package rdf // import "miniflux.app/reader/rdf"
  5. import (
  6. "encoding/xml"
  7. "strings"
  8. "time"
  9. "miniflux.app/crypto"
  10. "miniflux.app/logger"
  11. "miniflux.app/model"
  12. "miniflux.app/reader/date"
  13. "miniflux.app/reader/sanitizer"
  14. "miniflux.app/url"
  15. )
  16. type rdfFeed struct {
  17. XMLName xml.Name `xml:"RDF"`
  18. Title string `xml:"channel>title"`
  19. Link string `xml:"channel>link"`
  20. Creator string `xml:"channel>creator"`
  21. Items []rdfItem `xml:"item"`
  22. }
  23. func (r *rdfFeed) Transform() *model.Feed {
  24. feed := new(model.Feed)
  25. feed.Title = sanitizer.StripTags(r.Title)
  26. feed.SiteURL = r.Link
  27. for _, item := range r.Items {
  28. entry := item.Transform()
  29. if entry.Author == "" && r.Creator != "" {
  30. entry.Author = sanitizer.StripTags(r.Creator)
  31. }
  32. if entry.URL == "" {
  33. entry.URL = feed.SiteURL
  34. } else {
  35. entryURL, err := url.AbsoluteURL(feed.SiteURL, entry.URL)
  36. if err == nil {
  37. entry.URL = entryURL
  38. }
  39. }
  40. feed.Entries = append(feed.Entries, entry)
  41. }
  42. return feed
  43. }
  44. type rdfItem struct {
  45. Title string `xml:"title"`
  46. Link string `xml:"link"`
  47. Description string `xml:"description"`
  48. Creator string `xml:"creator"`
  49. Date string `xml:"date"`
  50. }
  51. func (r *rdfItem) Transform() *model.Entry {
  52. entry := new(model.Entry)
  53. entry.Title = strings.TrimSpace(r.Title)
  54. entry.Author = strings.TrimSpace(r.Creator)
  55. entry.URL = r.Link
  56. entry.Content = r.Description
  57. entry.Hash = getHash(r)
  58. entry.Date = getDate(r)
  59. return entry
  60. }
  61. func getDate(r *rdfItem) time.Time {
  62. if r.Date != "" {
  63. result, err := date.Parse(r.Date)
  64. if err != nil {
  65. logger.Error("rdf: %v", err)
  66. return time.Now()
  67. }
  68. return result
  69. }
  70. return time.Now()
  71. }
  72. func getHash(r *rdfItem) string {
  73. value := r.Link
  74. if value == "" {
  75. value = r.Title + r.Description
  76. }
  77. return crypto.Hash(value)
  78. }