open-pod/lib/podcast_feed/provider/archive/parser.ex

131 lines
4.8 KiB
Elixir
Raw Normal View History

2020-05-22 22:04:15 +02:00
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>&#xA9;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>