Current section

Files

Jump to
snowhite lib modules news adapters rss.ex
Raw

lib/modules/news/adapters/rss.ex

defmodule Snowhite.Modules.News.Adapters.Rss do
@moduledoc """
Implements RSS feed lookup. The Feeds must have the following properties
- `id` a unique identifier of the feed
- `title` the title, most likely the headline of the article
- `rss2:link` the url to read the news. This will be used to generate the QR code.
- `date` date at which the article has been published.
The RSS adapter doesn't support any options by now.
"""
@behaviour Snowhite.Modules.News.Adapter
alias Snowhite.Helpers.List, as: ListHelper
alias Snowhite.Modules.News.Item
def fetch(url, _) do
with {:ok, result} <- Rss.Poller.poll(url) do
ListHelper.filter_map(result, &valid?/1, &to_rss_item/1)
else
_ -> []
end
end
defp to_rss_item(entry) do
%Item{
id: Map.get(entry, "link"),
original_url: Map.get(entry, "link"),
date: parse_date(Map.get(entry, "pub_date")),
title: String.trim(Map.get(entry, "title", ""))
}
end
defp parse_date(date) do
Timex.parse!(date, "{RFC1123}")
end
@required_fields ["link", "pub_date", "title"]
defp valid?(item) do
Enum.all?(@required_fields, fn field ->
not (item
|> Map.get(field)
|> is_nil())
end)
end
end