Documentation ¶
Overview ¶
Syndication (feed) generator library for golang.
Installing
go get github.com/jlelse/feeds
Feeds provides a simple, generic Feed interface with a generic Item object as well as RSS, Atom and JSON Feed specific RssFeed, AtomFeed and JSONFeed objects which allow access to all of each spec's defined elements.
Examples ¶
Create a Feed and some Items in that feed using the generic interfaces:
import ( "time" . "github.com/jlelse/feeds" ) now = time.Now() feed := &Feed{ Title: "jmoiron.net blog", Link: &Link{Href: "http://jmoiron.net/blog"}, Description: "discussion about tech, footie, photos", Author: &Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, Created: now, Copyright: "This work is copyright © Benjamin Button", } feed.Items = []*Item{ &Item{ Title: "Limiting Concurrency in Go", Link: &Link{Href: "http://jmoiron.net/blog/limiting-concurrency-in-go/"}, Description: "A discussion on controlled parallelism in golang", Author: &Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, Created: now, }, &Item{ Title: "Logic-less Template Redux", Link: &Link{Href: "http://jmoiron.net/blog/logicless-template-redux/"}, Description: "More thoughts on logicless templates", Created: now, }, &Item{ Title: "Idiomatic Code Reuse in Go", Link: &Link{Href: "http://jmoiron.net/blog/idiomatic-code-reuse-in-go/"}, Description: "How to use interfaces <em>effectively</em>", Created: now, }, }
From here, you can output Atom, RSS, or JSON Feed versions of this feed easily
atom, err := feed.ToAtom() rss, err := feed.ToRss() json, err := feed.ToJSON()
You can also get access to the underlying objects that feeds uses to export its XML
atomFeed := (&Atom{Feed: feed}).AtomFeed() rssFeed := (&Rss{Feed: feed}).RssFeed() jsonFeed := (&JSON{Feed: feed}).JSONFeed()
From here, you can modify or add each syndication's specific fields before outputting
atomFeed.Subtitle = "plays the blues" atom, err := ToXML(atomFeed) rssFeed.Generator = "gorilla/feeds v1.0 (github.com/jlelse/feeds)" rss, err := ToXML(rssFeed) jsonFeed.NextUrl = "https://www.example.com/feed.json?page=2" json, err := jsonFeed.ToJSON()
Index ¶
- func ToXML(feed XmlFeed) (string, error)
- func WriteXML(feed XmlFeed, w io.Writer) error
- type Atom
- type AtomAuthor
- type AtomContent
- type AtomContributor
- type AtomEntry
- type AtomFeed
- type AtomLink
- type AtomPerson
- type AtomSummary
- type Author
- type Enclosure
- type Feed
- func (f *Feed) Add(item *Item)
- func (f *Feed) Sort(less func(a, b *Item) bool)
- func (f *Feed) ToAtom() (string, error)
- func (f *Feed) ToJSON() (string, error)
- func (f *Feed) ToRss() (string, error)
- func (f *Feed) WriteAtom(w io.Writer) error
- func (f *Feed) WriteJSON(w io.Writer) error
- func (f *Feed) WriteRss(w io.Writer) error
- type Image
- type Item
- type JSON
- type JSONAttachment
- type JSONAuthor
- type JSONFeed
- type JSONHub
- type JSONItem
- type Link
- type Rss
- type RssContent
- type RssEnclosure
- type RssFeed
- type RssFeedXml
- type RssImage
- type RssItem
- type RssTextInput
- type XmlFeed
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Atom ¶
type Atom struct {
*Feed
}
type AtomAuthor ¶
type AtomAuthor struct { XMLName xml.Name `xml:"author"` AtomPerson }
type AtomContent ¶
type AtomContributor ¶
type AtomContributor struct { XMLName xml.Name `xml:"contributor"` AtomPerson }
type AtomEntry ¶
type AtomEntry struct { XMLName xml.Name `xml:"entry"` Xmlns string `xml:"xmlns,attr,omitempty"` Title string `xml:"title"` // required Updated string `xml:"updated"` // required Id string `xml:"id"` // required Category string `xml:"category,omitempty"` Content *AtomContent Rights string `xml:"rights,omitempty"` Source string `xml:"source,omitempty"` Published string `xml:"published,omitempty"` Contributor *AtomContributor Links []AtomLink // required if no child 'content' elements Summary *AtomSummary // required if content has src or content is base64 Author *AtomAuthor // required if feed lacks an author }
type AtomFeed ¶
type AtomFeed struct { XMLName xml.Name `xml:"feed"` Xmlns string `xml:"xmlns,attr"` Title string `xml:"title"` // required Id string `xml:"id"` // required Updated string `xml:"updated"` // required Category string `xml:"category,omitempty"` Icon string `xml:"icon,omitempty"` Logo string `xml:"logo,omitempty"` Rights string `xml:"rights,omitempty"` // copyright used Subtitle string `xml:"subtitle,omitempty"` Link *AtomLink Author *AtomAuthor `xml:"author,omitempty"` Contributor *AtomContributor Entries []*AtomEntry `xml:"entry"` }
type AtomLink ¶
type AtomLink struct { //Atom 1.0 <link rel="enclosure" type="audio/mpeg" title="MP3" href="http://www.example.org/myaudiofile.mp3" length="1234" /> XMLName xml.Name `xml:"link"` Href string `xml:"href,attr"` Rel string `xml:"rel,attr,omitempty"` Type string `xml:"type,attr,omitempty"` Length string `xml:"length,attr,omitempty"` }
Multiple links with different rel can coexist
type AtomPerson ¶
type AtomSummary ¶
type Feed ¶
type Feed struct { Title string Link *Link Description string Author *Author Updated time.Time Created time.Time Id string Subtitle string Items []*Item Copyright string Image *Image Language string }
type JSON ¶
type JSON struct {
*Feed
}
JSON is used to convert a generic Feed to a JSONFeed.
type JSONAttachment ¶
type JSONAttachment struct { Url string `json:"url,omitempty"` MIMEType string `json:"mime_type,omitempty"` Title string `json:"title,omitempty"` Size int `json:"size_in_bytes,omitempty"` Duration time.Duration `json:"duration_in_seconds,omitempty"` }
JSONAttachment represents a related resource. Podcasts, for instance, would include an attachment that’s an audio or video file.
func (*JSONAttachment) MarshalJSON ¶
func (a *JSONAttachment) MarshalJSON() ([]byte, error)
MarshalJSON implements the json.Marshaler interface. The Duration field is marshaled in seconds, all other fields are marshaled based upon the definitions in struct tags.
func (*JSONAttachment) UnmarshalJSON ¶
func (a *JSONAttachment) UnmarshalJSON(data []byte) error
UnmarshalJSON implements the json.Unmarshaler interface. The Duration field is expected to be in seconds, all other field types match the struct definition.
type JSONAuthor ¶
type JSONAuthor struct { Name string `json:"name,omitempty"` Url string `json:"url,omitempty"` Avatar string `json:"avatar,omitempty"` }
JSONAuthor represents the author of the feed or of an individual item in the feed
type JSONFeed ¶
type JSONFeed struct { Version string `json:"version"` Title string `json:"title"` HomePageUrl string `json:"home_page_url,omitempty"` FeedUrl string `json:"feed_url,omitempty"` Description string `json:"description,omitempty"` UserComment string `json:"user_comment,omitempty"` NextUrl string `json:"next_url,omitempty"` Icon string `json:"icon,omitempty"` Favicon string `json:"favicon,omitempty"` Author *JSONAuthor `json:"author,omitempty"` // Deprecated, keep for compatibility Authors []*JSONAuthor `json:"authors,omitempty"` Language string `json:"language,omitempty"` Expired bool `json:"expired,omitempty"` Hubs []*JSONHub `json:"hubs,omitempty"` Items []*JSONItem `json:"items,omitempty"` }
JSONFeed represents a syndication feed in the JSON Feed Version 1 format. Matching the specification found here: https://jsonfeed.org/version/1.
type JSONHub ¶
JSONHub describes an endpoint that can be used to subscribe to real-time notifications from the publisher of this feed.
type JSONItem ¶
type JSONItem struct { Id string `json:"id"` Url string `json:"url,omitempty"` ExternalUrl string `json:"external_url,omitempty"` Title string `json:"title,omitempty"` ContentHTML string `json:"content_html,omitempty"` ContentText string `json:"content_text,omitempty"` Summary string `json:"summary,omitempty"` Image string `json:"image,omitempty"` BannerImage string `json:"banner_,omitempty"` PublishedDate *time.Time `json:"date_published,omitempty"` ModifiedDate *time.Time `json:"date_modified,omitempty"` Author *JSONAuthor `json:"author,omitempty"` // Deprecated, keep for compatibility Authors []*JSONAuthor `json:"authors,omitempty"` Tags []string `json:"tags,omitempty"` Language string `json:"language,omitempty"` Attachments []*JSONAttachment `json:"attachments,omitempty"` }
JSONItem represents a single entry/post for the feed.
type Rss ¶
type Rss struct {
*Feed
}
type RssContent ¶
type RssEnclosure ¶
type RssFeed ¶
type RssFeed struct { XMLName xml.Name `xml:"channel"` Title string `xml:"title"` // required Link string `xml:"link"` // required Description string `xml:"description"` // required Language string `xml:"language,omitempty"` Copyright string `xml:"copyright,omitempty"` ManagingEditor string `xml:"managingEditor,omitempty"` // Author used WebMaster string `xml:"webMaster,omitempty"` PubDate string `xml:"pubDate,omitempty"` // created or updated LastBuildDate string `xml:"lastBuildDate,omitempty"` // updated used Category string `xml:"category,omitempty"` Generator string `xml:"generator,omitempty"` Docs string `xml:"docs,omitempty"` Cloud string `xml:"cloud,omitempty"` Ttl int `xml:"ttl,omitempty"` Rating string `xml:"rating,omitempty"` SkipHours string `xml:"skipHours,omitempty"` SkipDays string `xml:"skipDays,omitempty"` Image *RssImage TextInput *RssTextInput Items []*RssItem `xml:"item"` }
type RssFeedXml ¶
type RssFeedXml struct { XMLName xml.Name `xml:"rss"` Version string `xml:"version,attr"` ContentNamespace string `xml:"xmlns:content,attr"` Channel *RssFeed }
private wrapper around the RssFeed which gives us the <rss>..</rss> xml
type RssItem ¶
type RssItem struct { XMLName xml.Name `xml:"item"` Title string `xml:"title"` // required Link string `xml:"link"` // required Description string `xml:"description"` // required Content *RssContent Author string `xml:"author,omitempty"` Category string `xml:"category,omitempty"` Comments string `xml:"comments,omitempty"` Enclosure *RssEnclosure Guid string `xml:"guid,omitempty"` // Id used PubDate string `xml:"pubDate,omitempty"` // created or updated Source string `xml:"source,omitempty"` }