itunes.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package ext
  2. // ITunesFeedExtension is a set of extension
  3. // fields for RSS feeds.
  4. type ITunesFeedExtension struct {
  5. Author string `json:"author,omitempty"`
  6. Block string `json:"block,omitempty"`
  7. Categories []*ITunesCategory `json:"categories,omitempty"`
  8. Explicit string `json:"explicit,omitempty"`
  9. Keywords string `json:"keywords,omitempty"`
  10. Owner *ITunesOwner `json:"owner,omitempty"`
  11. Subtitle string `json:"subtitle,omitempty"`
  12. Summary string `json:"summary,omitempty"`
  13. Image string `json:"image,omitempty"`
  14. Complete string `json:"complete,omitempty"`
  15. NewFeedURL string `json:"newFeedUrl,omitempty"`
  16. }
  17. // ITunesItemExtension is a set of extension
  18. // fields for RSS items.
  19. type ITunesItemExtension struct {
  20. Author string `json:"author,omitempty"`
  21. Block string `json:"block,omitempty"`
  22. Duration string `json:"duration,omitempty"`
  23. Explicit string `json:"explicit,omitempty"`
  24. Keywords string `json:"keywords,omitempty"`
  25. Subtitle string `json:"subtitle,omitempty"`
  26. Summary string `json:"summary,omitempty"`
  27. Image string `json:"image,omitempty"`
  28. IsClosedCaptioned string `json:"isClosedCaptioned,omitempty"`
  29. Order string `json:"order,omitempty"`
  30. }
  31. // ITunesCategory is a category element for itunes feeds.
  32. type ITunesCategory struct {
  33. Text string `json:"text,omitempty"`
  34. Subcategory *ITunesCategory `json:"subcategory,omitempty"`
  35. }
  36. // ITunesOwner is the owner of a particular itunes feed.
  37. type ITunesOwner struct {
  38. Email string `json:"email,omitempty"`
  39. Name string `json:"name,omitempty"`
  40. }
  41. // NewITunesFeedExtension creates an ITunesFeedExtension given an
  42. // extension map for the "itunes" key.
  43. func NewITunesFeedExtension(extensions map[string][]Extension) *ITunesFeedExtension {
  44. feed := &ITunesFeedExtension{}
  45. feed.Author = parseTextExtension("author", extensions)
  46. feed.Block = parseTextExtension("block", extensions)
  47. feed.Explicit = parseTextExtension("explicit", extensions)
  48. feed.Keywords = parseTextExtension("keywords", extensions)
  49. feed.Subtitle = parseTextExtension("subtitle", extensions)
  50. feed.Summary = parseTextExtension("summary", extensions)
  51. feed.Image = parseImage(extensions)
  52. feed.Complete = parseTextExtension("complete", extensions)
  53. feed.NewFeedURL = parseTextExtension("new-feed-url", extensions)
  54. feed.Categories = parseCategories(extensions)
  55. feed.Owner = parseOwner(extensions)
  56. return feed
  57. }
  58. // NewITunesItemExtension creates an ITunesItemExtension given an
  59. // extension map for the "itunes" key.
  60. func NewITunesItemExtension(extensions map[string][]Extension) *ITunesItemExtension {
  61. entry := &ITunesItemExtension{}
  62. entry.Author = parseTextExtension("author", extensions)
  63. entry.Block = parseTextExtension("block", extensions)
  64. entry.Duration = parseTextExtension("duration", extensions)
  65. entry.Explicit = parseTextExtension("explicit", extensions)
  66. entry.Subtitle = parseTextExtension("subtitle", extensions)
  67. entry.Summary = parseTextExtension("summary", extensions)
  68. entry.Image = parseImage(extensions)
  69. entry.IsClosedCaptioned = parseTextExtension("isClosedCaptioned", extensions)
  70. entry.Order = parseTextExtension("order", extensions)
  71. return entry
  72. }
  73. func parseImage(extensions map[string][]Extension) (image string) {
  74. if extensions == nil {
  75. return
  76. }
  77. matches, ok := extensions["image"]
  78. if !ok || len(matches) == 0 {
  79. return
  80. }
  81. image = matches[0].Attrs["href"]
  82. return
  83. }
  84. func parseOwner(extensions map[string][]Extension) (owner *ITunesOwner) {
  85. if extensions == nil {
  86. return
  87. }
  88. matches, ok := extensions["owner"]
  89. if !ok || len(matches) == 0 {
  90. return
  91. }
  92. owner = &ITunesOwner{}
  93. if name, ok := matches[0].Children["name"]; ok {
  94. owner.Name = name[0].Value
  95. }
  96. if email, ok := matches[0].Children["email"]; ok {
  97. owner.Email = email[0].Value
  98. }
  99. return
  100. }
  101. func parseCategories(extensions map[string][]Extension) (categories []*ITunesCategory) {
  102. if extensions == nil {
  103. return
  104. }
  105. matches, ok := extensions["category"]
  106. if !ok || len(matches) == 0 {
  107. return
  108. }
  109. categories = []*ITunesCategory{}
  110. for _, cat := range matches {
  111. c := &ITunesCategory{}
  112. if text, ok := cat.Attrs["text"]; ok {
  113. c.Text = text
  114. }
  115. if subs, ok := cat.Children["category"]; ok {
  116. s := &ITunesCategory{}
  117. if text, ok := subs[0].Attrs["text"]; ok {
  118. s.Text = text
  119. }
  120. c.Subcategory = s
  121. }
  122. categories = append(categories, c)
  123. }
  124. return
  125. }