Skip to content
/ feeder Public

๐Ÿ“ฎ RSS, Atom, and JSON feed generator from multiple RSS, Atom, and any entries you want.

License

Notifications You must be signed in to change notification settings

p1ass/feeder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

74e3771 ยท Jul 10, 2021

History

85 Commits
Mar 30, 2021
Apr 29, 2021
Aug 4, 2020
Jul 16, 2019
Mar 21, 2019
Jul 30, 2019
Aug 4, 2020
Mar 24, 2020
Aug 17, 2019
Mar 22, 2019
Apr 2, 2019
Aug 17, 2019
Aug 17, 2019
Aug 4, 2020
Jul 30, 2019
Dec 14, 2020
Mar 30, 2021
Apr 1, 2019
Mar 30, 2021
Mar 30, 2021
Mar 30, 2021

Repository files navigation

feeder is the RSS, Atom and JSON feed generator from multiple RSS, Atom, and any entries you want.

Getting started

Install

go get -u github.com/p1ass/feeder

Examples

package main

import (
	"github.com/p1ass/feeder"
	"time"
)

func crawl(){
	rss1 := feeder.NewRSSCrawler("https://example.com/rss1")
	rss2 := feeder.NewRSSCrawler("https://example.com/rss2")

	items, err := feeder.Crawl(rss1, rss2)

	feed := &feeder.Feed{
		Title:       "My feeds",
		Link:        &feeder.Link{Href: "https://example.com/feed"},
		Description: "My feeds.",
		Author:      &feeder.Author{
			Name: "p1ass",
			Email: "[email protected]"},
		Created:     time.Now(),
		Items:       items,
	}

	json, err := feed.ToJSON() // json is  string
	rss, err := feed.ToRSS() // rss is string
	atom, err := feed.ToAtom() // atom is string

	jsonReader, err := feed.ToJSONReader() // jsonReader is a io.Reader
	rssReader, err := feed.ToRSSReader() // jsonReader is a io.Reader
	atomReader, err := feed.ToAtomReader() // jsonReader is a io.Reader

}

Advanced usages

Implement original Crawler

You can create a original crawler by implementing feeder.Crawler.

type Crawler interface {
	Crawl() ([]*Item, error)
}

This is an example of Qiita API(GET /api/v2/users/:user_id/items).

Qiita API v2 documentation - Qiita:Developer

type qiitaResponse struct {
	CreatedAt *time.Time `json:"created_at"`
	Title     string     `json:"title"`
	URL       string     `json:"url"`
	Body      string     `json:"body"`
	ID        string     `json:"id"`
	User      *qiitaUser `json:"user"`
}

type qiitaUser struct {
	ID string `json:"id"`
}

type qiitaCrawler struct {
	URL string
}

func (crawler *qiitaCrawler) Fetch() ([]*feeder.Item, error) {
	resp, err := http.Get(crawler.URL)
	if err != nil {
		return nil, errors.Wrap(err, "failed to get response from qiita.")
	}

	var qiita []*qiitaResponse
	err = json.NewDecoder(resp.Body).Decode(&qiita)
	if err != nil {
		return nil, errors.Wrap(err, "failed to decode response body.")
	}

	items := []*feeder.Item{}
	for _, i := range qiita {
		items = append(items, convertQiitaToItem(i))
	}
	return items, nil
}

func convertQiitaToItem(q *qiitaResponse) *feeder.Item {

	i := &feeder.Item{
		Title:       q.Title,
		Link:        &feeder.Link{Href: q.URL},
		Created:     q.CreatedAt,
		Id:          q.ID,
		Description: q.Body,
	}

	if q.User != nil {
		i.Author = &feeder.Author{
			Name: q.User.ID,
		}
	}
	return i
}

About

๐Ÿ“ฎ RSS, Atom, and JSON feed generator from multiple RSS, Atom, and any entries you want.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages