Current section
Files
Jump to
Current section
Files
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, %{entries: entries}} <- Rss.Poller.poll(url) do
ListHelper.filter_map(entries, &valid?/1, &to_rss_item/1)
else
_ -> []
end
end
defp to_rss_item(%{id: id} = entry) do
%Item{
id: id,
original_url: Map.get(entry, :"rss2:link"),
date: Map.get(entry, :updated),
title: String.trim(Map.get(entry, :title, ""))
}
end
@required_fields [:id, :title, :"rss2:link", :updated]
defp valid?(item) do
Enum.all?(@required_fields, fn field ->
not (item
|> Map.get(field)
|> is_nil())
end)
end
end