151 lines
5.0 KiB
Go
151 lines
5.0 KiB
Go
package ext
|
|
|
|
// ITunesFeedExtension is a set of extension
|
|
// fields for RSS feeds.
|
|
type ITunesFeedExtension struct {
|
|
Author string `json:"author,omitempty"`
|
|
Block string `json:"block,omitempty"`
|
|
Categories []*ITunesCategory `json:"categories,omitempty"`
|
|
Explicit string `json:"explicit,omitempty"`
|
|
Keywords string `json:"keywords,omitempty"`
|
|
Owner *ITunesOwner `json:"owner,omitempty"`
|
|
Subtitle string `json:"subtitle,omitempty"`
|
|
Summary string `json:"summary,omitempty"`
|
|
Image string `json:"image,omitempty"`
|
|
Complete string `json:"complete,omitempty"`
|
|
NewFeedURL string `json:"newFeedUrl,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
}
|
|
|
|
// ITunesItemExtension is a set of extension
|
|
// fields for RSS items.
|
|
type ITunesItemExtension struct {
|
|
Author string `json:"author,omitempty"`
|
|
Block string `json:"block,omitempty"`
|
|
Duration string `json:"duration,omitempty"`
|
|
Explicit string `json:"explicit,omitempty"`
|
|
Keywords string `json:"keywords,omitempty"`
|
|
Subtitle string `json:"subtitle,omitempty"`
|
|
Summary string `json:"summary,omitempty"`
|
|
Image string `json:"image,omitempty"`
|
|
IsClosedCaptioned string `json:"isClosedCaptioned,omitempty"`
|
|
Episode string `json:"episode,omitempty"`
|
|
Season string `json:"season,omitempty"`
|
|
Order string `json:"order,omitempty"`
|
|
EpisodeType string `json:"episodeType,omitempty"`
|
|
}
|
|
|
|
// ITunesCategory is a category element for itunes feeds.
|
|
type ITunesCategory struct {
|
|
Text string `json:"text,omitempty"`
|
|
Subcategory *ITunesCategory `json:"subcategory,omitempty"`
|
|
}
|
|
|
|
// ITunesOwner is the owner of a particular itunes feed.
|
|
type ITunesOwner struct {
|
|
Email string `json:"email,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
}
|
|
|
|
// NewITunesFeedExtension creates an ITunesFeedExtension given an
|
|
// extension map for the "itunes" key.
|
|
func NewITunesFeedExtension(extensions map[string][]Extension) *ITunesFeedExtension {
|
|
feed := &ITunesFeedExtension{}
|
|
feed.Author = parseTextExtension("author", extensions)
|
|
feed.Block = parseTextExtension("block", extensions)
|
|
feed.Explicit = parseTextExtension("explicit", extensions)
|
|
feed.Keywords = parseTextExtension("keywords", extensions)
|
|
feed.Subtitle = parseTextExtension("subtitle", extensions)
|
|
feed.Summary = parseTextExtension("summary", extensions)
|
|
feed.Image = parseImage(extensions)
|
|
feed.Complete = parseTextExtension("complete", extensions)
|
|
feed.NewFeedURL = parseTextExtension("new-feed-url", extensions)
|
|
feed.Categories = parseCategories(extensions)
|
|
feed.Owner = parseOwner(extensions)
|
|
feed.Type = parseTextExtension("type", extensions)
|
|
return feed
|
|
}
|
|
|
|
// NewITunesItemExtension creates an ITunesItemExtension given an
|
|
// extension map for the "itunes" key.
|
|
func NewITunesItemExtension(extensions map[string][]Extension) *ITunesItemExtension {
|
|
entry := &ITunesItemExtension{}
|
|
entry.Author = parseTextExtension("author", extensions)
|
|
entry.Block = parseTextExtension("block", extensions)
|
|
entry.Duration = parseTextExtension("duration", extensions)
|
|
entry.Explicit = parseTextExtension("explicit", extensions)
|
|
entry.Subtitle = parseTextExtension("subtitle", extensions)
|
|
entry.Summary = parseTextExtension("summary", extensions)
|
|
entry.Keywords = parseTextExtension("keywords", extensions)
|
|
entry.Image = parseImage(extensions)
|
|
entry.IsClosedCaptioned = parseTextExtension("isClosedCaptioned", extensions)
|
|
entry.Episode = parseTextExtension("episode", extensions)
|
|
entry.Season = parseTextExtension("season", extensions)
|
|
entry.Order = parseTextExtension("order", extensions)
|
|
entry.EpisodeType = parseTextExtension("episodeType", extensions)
|
|
return entry
|
|
}
|
|
|
|
func parseImage(extensions map[string][]Extension) (image string) {
|
|
if extensions == nil {
|
|
return
|
|
}
|
|
|
|
matches, ok := extensions["image"]
|
|
if !ok || len(matches) == 0 {
|
|
return
|
|
}
|
|
|
|
image = matches[0].Attrs["href"]
|
|
return
|
|
}
|
|
|
|
func parseOwner(extensions map[string][]Extension) (owner *ITunesOwner) {
|
|
if extensions == nil {
|
|
return
|
|
}
|
|
|
|
matches, ok := extensions["owner"]
|
|
if !ok || len(matches) == 0 {
|
|
return
|
|
}
|
|
|
|
owner = &ITunesOwner{}
|
|
if name, ok := matches[0].Children["name"]; ok {
|
|
owner.Name = name[0].Value
|
|
}
|
|
if email, ok := matches[0].Children["email"]; ok {
|
|
owner.Email = email[0].Value
|
|
}
|
|
return
|
|
}
|
|
|
|
func parseCategories(extensions map[string][]Extension) (categories []*ITunesCategory) {
|
|
if extensions == nil {
|
|
return
|
|
}
|
|
|
|
matches, ok := extensions["category"]
|
|
if !ok || len(matches) == 0 {
|
|
return
|
|
}
|
|
|
|
categories = []*ITunesCategory{}
|
|
for _, cat := range matches {
|
|
c := &ITunesCategory{}
|
|
if text, ok := cat.Attrs["text"]; ok {
|
|
c.Text = text
|
|
}
|
|
|
|
if subs, ok := cat.Children["category"]; ok {
|
|
s := &ITunesCategory{}
|
|
if text, ok := subs[0].Attrs["text"]; ok {
|
|
s.Text = text
|
|
}
|
|
c.Subcategory = s
|
|
}
|
|
categories = append(categories, c)
|
|
}
|
|
return
|
|
}
|