Add Feed last_updated
This commit is contained in:
parent
e0dd659436
commit
79fafb99c6
|
@ -3,11 +3,12 @@ defmodule FeedParser.Feed do
|
||||||
A feed. Contains some information about the site it originates from and a list of items it contains.
|
A feed. Contains some information about the site it originates from and a list of items it contains.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
defstruct [:site_url, :title, :image_url, :items]
|
defstruct [:site_url, :title, :image_url, :last_updated, :items]
|
||||||
|
|
||||||
@type t() :: %__MODULE__{
|
@type t() :: %__MODULE__{
|
||||||
site_url: String.t(),
|
site_url: String.t(),
|
||||||
title: String.t(),
|
title: String.t(),
|
||||||
|
last_updated: DateTime.t() | nil,
|
||||||
image_url: String.t() | nil,
|
image_url: String.t() | nil,
|
||||||
items: [FeedParser.Item.t()]
|
items: [FeedParser.Item.t()]
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,14 @@ defmodule FeedParser.Parser.Atom do
|
||||||
link = attr('/feed/link/@href', feed)
|
link = attr('/feed/link/@href', feed)
|
||||||
icon = text('/feed/icon/text()', feed)
|
icon = text('/feed/icon/text()', feed)
|
||||||
|
|
||||||
|
updated =
|
||||||
|
text('/feed/updated/text()', feed)
|
||||||
|
|> Timex.parse("{ISO:Extended}")
|
||||||
|
|> case do
|
||||||
|
{:ok, date} -> date
|
||||||
|
_ -> nil
|
||||||
|
end
|
||||||
|
|
||||||
items =
|
items =
|
||||||
:xmerl_xpath.string('/feed/entry', feed)
|
:xmerl_xpath.string('/feed/entry', feed)
|
||||||
|> Enum.map(fn entry ->
|
|> Enum.map(fn entry ->
|
||||||
|
@ -65,6 +73,7 @@ defmodule FeedParser.Parser.Atom do
|
||||||
site_url: link,
|
site_url: link,
|
||||||
title: title,
|
title: title,
|
||||||
image_url: icon,
|
image_url: icon,
|
||||||
|
last_updated: updated,
|
||||||
items: items
|
items: items
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
|
@ -59,6 +59,7 @@ defmodule FeedParser.Parser.JSONFeed do
|
||||||
site_url: home_page_url,
|
site_url: home_page_url,
|
||||||
title: title,
|
title: title,
|
||||||
image_url: icon,
|
image_url: icon,
|
||||||
|
last_updated: nil,
|
||||||
items: items
|
items: items
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
|
@ -35,6 +35,14 @@ defmodule FeedParser.Parser.RSS2 do
|
||||||
link = text('/channel/link/text()', channel)
|
link = text('/channel/link/text()', channel)
|
||||||
image = text('/channel/image/url/text()', channel)
|
image = text('/channel/image/url/text()', channel)
|
||||||
|
|
||||||
|
last_updated =
|
||||||
|
text('/channel/lastBuildDate/text()', channel)
|
||||||
|
|> Timex.parse("{RFC1123}")
|
||||||
|
|> case do
|
||||||
|
{:ok, date} -> date
|
||||||
|
_ -> nil
|
||||||
|
end
|
||||||
|
|
||||||
items =
|
items =
|
||||||
:xmerl_xpath.string('/channel/item', channel)
|
:xmerl_xpath.string('/channel/item', channel)
|
||||||
|> Enum.map(fn item ->
|
|> Enum.map(fn item ->
|
||||||
|
@ -65,6 +73,7 @@ defmodule FeedParser.Parser.RSS2 do
|
||||||
site_url: link,
|
site_url: link,
|
||||||
title: title,
|
title: title,
|
||||||
image_url: image,
|
image_url: image,
|
||||||
|
last_updated: last_updated,
|
||||||
items: items
|
items: items
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,6 +23,14 @@ defmodule FeedParser.Parser.RSSInJSON do
|
||||||
title = channel["title"]
|
title = channel["title"]
|
||||||
link = channel["link"]
|
link = channel["link"]
|
||||||
|
|
||||||
|
last_updated =
|
||||||
|
channel["lastBuildDate"]
|
||||||
|
|> Timex.parse("{RFC1123}")
|
||||||
|
|> case do
|
||||||
|
{:ok, date} -> date
|
||||||
|
_ -> nil
|
||||||
|
end
|
||||||
|
|
||||||
image =
|
image =
|
||||||
case channel do
|
case channel do
|
||||||
%{"image" => %{"url" => url}} -> url
|
%{"image" => %{"url" => url}} -> url
|
||||||
|
@ -59,6 +67,7 @@ defmodule FeedParser.Parser.RSSInJSON do
|
||||||
site_url: link,
|
site_url: link,
|
||||||
title: title,
|
title: title,
|
||||||
image_url: image,
|
image_url: image,
|
||||||
|
last_updated: last_updated,
|
||||||
items: items
|
items: items
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
<link>http://liftoff.msfc.nasa.gov/</link>
|
<link>http://liftoff.msfc.nasa.gov/</link>
|
||||||
<description>Liftoff to Space Exploration.</description>
|
<description>Liftoff to Space Exploration.</description>
|
||||||
<language>en-us</language>
|
<language>en-us</language>
|
||||||
<pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate>
|
<pubDate>Tue, 10 Jun 2003 04:00:00 UTC</pubDate>
|
||||||
<lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate>
|
<lastBuildDate>Tue, 10 Jun 2003 09:41:01 UTC</lastBuildDate>
|
||||||
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
|
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
|
||||||
<generator>Weblog Editor 2.0</generator>
|
<generator>Weblog Editor 2.0</generator>
|
||||||
<managingEditor>editor@example.com</managingEditor>
|
<managingEditor>editor@example.com</managingEditor>
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
"title": "Scripting News",
|
"title": "Scripting News",
|
||||||
"link": "http://scripting.com/",
|
"link": "http://scripting.com/",
|
||||||
"description": "Scripting News, the weblog started in 1994 that bootstrapped the blogging revolution. 🚀",
|
"description": "Scripting News, the weblog started in 1994 that bootstrapped the blogging revolution. 🚀",
|
||||||
"pubDate": "Sat, 31 Aug 2019 18:04:35 GMT",
|
"pubDate": "Sat, 31 Aug 2019 18:04:35 UTC",
|
||||||
"lastBuildDate": "Sat, 31 Aug 2019 22:49:49 GMT",
|
"lastBuildDate": "Sat, 31 Aug 2019 22:49:49 UTC",
|
||||||
"language": "en-us",
|
"language": "en-us",
|
||||||
"copyright": "© 1994-2019 <a href=\"http://davewiner.com/\">Dave Winer</a>.",
|
"copyright": "© 1994-2019 <a href=\"http://davewiner.com/\">Dave Winer</a>.",
|
||||||
"generator": "oldSchool v0.5.29",
|
"generator": "oldSchool v0.5.29",
|
||||||
|
@ -55,4 +55,4 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ defmodule FeedParser.Parser.AtomTest do
|
||||||
assert {:ok, %FeedParser.Feed{} = feed} = Atom.parse_feed(parsed_data)
|
assert {:ok, %FeedParser.Feed{} = feed} = Atom.parse_feed(parsed_data)
|
||||||
assert feed.site_url == "http://example.org/"
|
assert feed.site_url == "http://example.org/"
|
||||||
assert feed.title == "Example Feed"
|
assert feed.title == "Example Feed"
|
||||||
|
assert feed.last_updated == ~U[2003-12-13 18:30:02Z]
|
||||||
assert [%FeedParser.Item{} = item] = feed.items
|
assert [%FeedParser.Item{} = item] = feed.items
|
||||||
assert item.guid == "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a"
|
assert item.guid == "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a"
|
||||||
assert item.title == "Atom-Powered Robots Run Amok"
|
assert item.title == "Atom-Powered Robots Run Amok"
|
||||||
|
|
|
@ -14,7 +14,7 @@ defmodule FeedParser.Parser.JSONFeedTest do
|
||||||
assert {:ok, %FeedParser.Feed{} = feed} = JSONFeed.parse_feed(parsed_data)
|
assert {:ok, %FeedParser.Feed{} = feed} = JSONFeed.parse_feed(parsed_data)
|
||||||
assert feed.title == "My Example Feed"
|
assert feed.title == "My Example Feed"
|
||||||
assert feed.site_url == "https://example.org/"
|
assert feed.site_url == "https://example.org/"
|
||||||
IO.inspect(feed.items)
|
assert feed.last_updated == nil
|
||||||
assert [%FeedParser.Item{} = item2, %FeedParser.Item{} = item1] = feed.items
|
assert [%FeedParser.Item{} = item2, %FeedParser.Item{} = item1] = feed.items
|
||||||
assert item2.guid == "2"
|
assert item2.guid == "2"
|
||||||
assert item2.content == "This is a second item."
|
assert item2.content == "This is a second item."
|
||||||
|
|
|
@ -15,6 +15,7 @@ defmodule FeedParser.Parser.RSS2Test do
|
||||||
assert {:ok, %FeedParser.Feed{} = feed} = RSS2.parse_feed(parsed_data)
|
assert {:ok, %FeedParser.Feed{} = feed} = RSS2.parse_feed(parsed_data)
|
||||||
assert feed.title == "Liftoff News"
|
assert feed.title == "Liftoff News"
|
||||||
assert feed.site_url == "http://liftoff.msfc.nasa.gov/"
|
assert feed.site_url == "http://liftoff.msfc.nasa.gov/"
|
||||||
|
assert feed.last_updated == ~U[2003-06-10 09:41:01Z]
|
||||||
assert [%FeedParser.Item{} = item] = feed.items
|
assert [%FeedParser.Item{} = item] = feed.items
|
||||||
assert item.title == "Star City"
|
assert item.title == "Star City"
|
||||||
assert item.url == "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp"
|
assert item.url == "http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp"
|
||||||
|
|
|
@ -14,6 +14,7 @@ defmodule FeedParser.Parser.RSSInJSONTest do
|
||||||
assert {:ok, %FeedParser.Feed{} = feed} = RSSInJSON.parse_feed(parsed_data)
|
assert {:ok, %FeedParser.Feed{} = feed} = RSSInJSON.parse_feed(parsed_data)
|
||||||
assert feed.title == "Scripting News"
|
assert feed.title == "Scripting News"
|
||||||
assert feed.site_url == "http://scripting.com/"
|
assert feed.site_url == "http://scripting.com/"
|
||||||
|
assert feed.last_updated == ~U[2019-08-31 22:49:49Z]
|
||||||
assert [%FeedParser.Item{} = item] = feed.items
|
assert [%FeedParser.Item{} = item] = feed.items
|
||||||
assert item.url == "http://scripting.com/2019/08/31.html#a151142"
|
assert item.url == "http://scripting.com/2019/08/31.html#a151142"
|
||||||
assert item.guid == "http://scripting.com/2019/08/31.html#a151142"
|
assert item.guid == "http://scripting.com/2019/08/31.html#a151142"
|
||||||
|
|
Loading…
Reference in New Issue