stream

stream

Как объединить несколько источников в один RSS-канал

Я активно использую Feedly в своей повседневной работе как центральную точку доступа к новостным лентам, на которые подписан.

Feedly

Этот же инструмент я захотел использовать для того, чтобы быть в курсе последних релизов таких проектов, как Hugo, Ansible, Kubernetes и других.

Проблема возникла при достижении лимита в сотню источников на бесплатном тарифном плане. Да, Feedly безусловно очень удобный сервис, но переходить на платный тариф только из-за достижения этого лимита мне не очень хотелось. К тому же, остальные преимущества, которые давал этот переход, не представляли для меня особой ценности.

Почему бы не объединить подобные источники в один канал?

Поиск готового решения

Google: create unified RSS feeds from multiple sources

Первые результаты:

RSSUnify

С некоторыми оговорками, данные сервисы решали мою задачу, но аппетит приходит во время еды, поэтому мне этого было уже мало. При дальнейшем поиске наиболее интересным мне показался Zapier. В нём я нашёл практически всё, что мне было нужно, тем более сам сервис я когда-то уже использовал.

Вот их замечательная статья на эту тему. 💪

Но изменившаяся модель ценообразования поставила меня перед фактом, что я поменяю шило на мыло. 😠

Собираем велосипед

Объединить разные ленты в одну - не сложная задача для программиста.

Первый набросок

// Aggregator is a one entry point for many different sources.
type Aggregator interface {
	Source
	// Add puts a source into an internal source collection.
	Add(Source)
	// Remove removes a source from an internal source collection.
	Remove(Source)
	// Get returns a source with a specified identifier or nil if nothing found.
	Get(id string) Source
	// All returns all sources from an internal source collection.
	All() []Source
}

// Source describes an entry can be presented in Atom 1.0 and RSS 2.0.
type Source interface {
	// ID returns a source identifier.
	ID() string
	// Atom returns the Atom 1.0 representation of a source.
	Atom() Atom
	// RSS returns the RSS 2.0 representation of a source.
	RSS() RSS
}

// Middleware defines the method for source transformation (filtering, enriching, etc.).
type Middleware interface {
	// Transform applies some logic to provided source and returns modified.
	Transform(Source) Source
}

Что это даст

Плюсы:

  • Полный контроль над функционалом.
  • Закроет мои потребности.
  • Self-hosted.

Минусы:

  • Потрачу время 😫

Что дальше

  • Сделать входящим источником:
    • email-рассылки;
    • уведомления в социальных сетях;
    • активность на GitHub;
    • результаты парсинга сайтов, где нет каналов.
  • Проработать механизмы трансформации каналов (в частности фильтрации).
  • Добавить проверку статусов доступности источников.

Теги

go rss atom feed stream

Автор

Камиль Самигуллин
Камиль Самигуллин

Разработчик

Столкнувшись с ограничениями бесплатного аккаунта Feedly и не найдя подходящего решения, которое бы меня полностью устроило, я приступил к созданию своего прототипа.

Спонсоры

Опубликовано

1.10.2017