131 lines
4.8 KiB
Elixir
131 lines
4.8 KiB
Elixir
|
defmodule PodcastFeed.Provider.Archive.Parser do
|
||
|
def feed(url) do
|
||
|
url
|
||
|
|> fetch_xml()
|
||
|
|> parse()
|
||
|
|> IO.inspect()
|
||
|
|> filter_mp3()
|
||
|
|> compose()
|
||
|
end
|
||
|
|
||
|
defp fetch_xml(url) do
|
||
|
{:ok, {_, _, xml}} = :httpc.request(:get, {url, []}, [], [body_format: :binary])
|
||
|
xml
|
||
|
end
|
||
|
|
||
|
defp parse(xml) do
|
||
|
xml |> XmlToMap.naive_map() |> Map.get("files") |> Map.get("file") |> Enum.map(fn f -> Map.get(f, "#content") |> Map.put("filename", Map.get(f, "-name")) end)
|
||
|
end
|
||
|
|
||
|
defp filter_mp3(files) do
|
||
|
files |> Enum.filter(fn f -> Map.get(f, "format") =~ ~r/MP3/i end)
|
||
|
end
|
||
|
|
||
|
defp compose(files) do
|
||
|
files
|
||
|
|> Enum.map(&to_feed_item/1)
|
||
|
end
|
||
|
|
||
|
# <item>
|
||
|
# <title>Episode Name 2</title>
|
||
|
# <link>
|
||
|
# http://podcast.example.com/episode2.mp4
|
||
|
# </link>
|
||
|
# <pubDate>Sat, 02 Jan 2016 16:00:00 PDT</pubDate>
|
||
|
# <description>
|
||
|
# The full length episode 2 description
|
||
|
# </description>
|
||
|
# <enclosure url="http://podcasts.example.com/episode.mp4" length="36715125" type="audio/mpeg"/>
|
||
|
# <guid>
|
||
|
# http://podcast.example.com/episode2.mp4
|
||
|
# </guid>
|
||
|
# <itunes:duration>19:07</itunes:duration>
|
||
|
# <itunes:summary>
|
||
|
# The full length episode 2 description
|
||
|
# </itunes:summary>
|
||
|
# <itunes:image href="http://www.example.com/image3000x3000.png"/>
|
||
|
# <itunes:keywords>
|
||
|
# comma,separated,key,words
|
||
|
# </itunes:keywords>
|
||
|
# <itunes:explicit>no</itunes:explicit>
|
||
|
# </item>
|
||
|
# %{
|
||
|
# "album" => "Incontri al Piano Terra",
|
||
|
# "artist" => "APE Milano",
|
||
|
# "crc32" => "f1820595",
|
||
|
# "creator" => "APE Milano",
|
||
|
# "format" => "VBR MP3",
|
||
|
# "genre" => "podcast",
|
||
|
# "height" => "0",
|
||
|
# "length" => "3943.31",
|
||
|
# "md5" => "9ca26043a3e82e6f86c3a9309b88f4f5",
|
||
|
# "mtime" => "1590154757",
|
||
|
# "sha1" => "dcacfa46fcad1d656312784ad06886b5614c6420",
|
||
|
# "size" => "47148690",
|
||
|
# "title" => "Presentazione di Montagna femminile plurale con N1DM",
|
||
|
# "track" => "03",
|
||
|
# "width" => "0"
|
||
|
# }
|
||
|
|
||
|
defp to_feed_item(file) do
|
||
|
%{
|
||
|
title: file |> Map.get("title"),
|
||
|
link: "http://archive.org/download/incontri-a-piano-terra/" <> (file |> Map.get("filename")) |> URI.encode(), #FIXME:! identifier should by dynamic
|
||
|
pubDate: file |> Map.get("mtime") |> Integer.parse() |> elem(0) |> DateTime.from_unix!(:second),
|
||
|
description: "",
|
||
|
length: (file |> Map.get("length") |> Float.parse() |> elem(0)) * 100,
|
||
|
guid: "",
|
||
|
duration: "",
|
||
|
summary: "",
|
||
|
image: "",
|
||
|
keywords: file |> Map.take(["album", "artist", "genre"]) |> Map.values(),
|
||
|
explicit: "no",
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# <?xml version="1.0" encoding="utf-8"?>
|
||
|
# <rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:itunesu="http://www.itunesu.com/feed" version="2.0">
|
||
|
# <channel>
|
||
|
# <link>http://www.YourSite.com</link>
|
||
|
# <language>en-us</language>
|
||
|
# <copyright>©2013</copyright>
|
||
|
# <webMaster>your@email.com (Your Name)</webMaster>
|
||
|
# <managingEditor>your@email.com (Your Name)</managingEditor>
|
||
|
# <image>
|
||
|
# <url>http://www.YourSite.com/ImageSize300X300.jpg</url>
|
||
|
# <title>Title or description of your logo</title>
|
||
|
# <link>http://www.YourSite.com</link>
|
||
|
# </image>
|
||
|
# <itunes:owner>
|
||
|
# <itunes:name>Your Name</itunes:name>
|
||
|
# <itunes:email>your@email.com</itunes:email>
|
||
|
# </itunes:owner>
|
||
|
# <itunes:category text="Education">
|
||
|
# <itunes:category text="Higher Education" />
|
||
|
# </itunes:category>
|
||
|
# <itunes:keywords>separate, by, comma, and, space</itunes:keywords>
|
||
|
# <itunes:explicit>no</itunes:explicit>
|
||
|
# <itunes:image href="http://www.YourSite.com/ImageSize300X300.jpg" />
|
||
|
# <atom:link href="http://www.YourSite.com/feed.xml" rel="self" type="application/rss+xml" />
|
||
|
# <pubDate>Sun, 01 Jan 2012 00:00:00 EST</pubDate>
|
||
|
# <title>Verbose title of the podcast</title>
|
||
|
# <itunes:author>College, school, or department owning the podcast</itunes:author>
|
||
|
# <description>Verbose description of the podcast.</description>
|
||
|
# <itunes:summary>Duplicate of above verbose description.</itunes:summary>
|
||
|
# <itunes:subtitle>Short description of the podcast - 255 character max.</itunes:subtitle>
|
||
|
# <lastBuildDate>Thu, 02 Feb 2012 00:00:00 EST</lastBuildDate>
|
||
|
# <item>
|
||
|
# <title>Verbose title of the episode</title>
|
||
|
# <description>Verbose description of the episode.</description>
|
||
|
# <itunes:summary>Duplicate of above verbose description.</itunes:summary>
|
||
|
# <itunes:subtitle>Short description of the episode - 255 character max.</itunes:subtitle>
|
||
|
# <itunesu:category itunesu:code="112" />
|
||
|
# <enclosure url="http://www.YourSite.com/FILE.EXT" type="audio/mpeg" length="1" />
|
||
|
# <guid>http://www.YourSite.com/FILE.EXT</guid>
|
||
|
# <itunes:duration>H:MM:SS</itunes:duration>
|
||
|
# <pubDate>Thu, 02 Feb 2012 00:00:00 EST</pubDate>
|
||
|
# </item>
|
||
|
# </channel>
|
||
|
# </rss>
|