diff options
author | kaniini <nenolod@gmail.com> | 2019-01-14 07:28:04 +0000 |
---|---|---|
committer | kaniini <nenolod@gmail.com> | 2019-01-14 07:28:04 +0000 |
commit | de1da7b3d1c855df87262b8d24d6cdb6a6a518bc (patch) | |
tree | dbad5ebca137823d9224e55f28cc55b3d584d53e /lib | |
parent | fa0392e49cd46e4d2845840232a4b56e52729369 (diff) | |
parent | b8a77c5d704a4a76f227854c1cab560eb98a7382 (diff) | |
download | pleroma-de1da7b3d1c855df87262b8d24d6cdb6a6a518bc.tar.gz |
Merge branch 'feature/add-oembed-parser' into 'develop'
Add OEmbed parser
See merge request pleroma/pleroma!661
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/web/rich_media/parser.ex | 6 | ||||
-rw-r--r-- | lib/pleroma/web/rich_media/parsers/oembed_parser.ex | 27 |
2 files changed, 32 insertions, 1 deletions
diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index fe092bf19..6da83c6e4 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -1,5 +1,9 @@ defmodule Pleroma.Web.RichMedia.Parser do - @parsers [Pleroma.Web.RichMedia.Parsers.OGP, Pleroma.Web.RichMedia.Parsers.TwitterCard] + @parsers [ + Pleroma.Web.RichMedia.Parsers.OGP, + Pleroma.Web.RichMedia.Parsers.TwitterCard, + Pleroma.Web.RichMedia.Parsers.OEmbed + ] if Mix.env() == :test do def parse(url), do: parse_url(url) diff --git a/lib/pleroma/web/rich_media/parsers/oembed_parser.ex b/lib/pleroma/web/rich_media/parsers/oembed_parser.ex new file mode 100644 index 000000000..ca7226faf --- /dev/null +++ b/lib/pleroma/web/rich_media/parsers/oembed_parser.ex @@ -0,0 +1,27 @@ +defmodule Pleroma.Web.RichMedia.Parsers.OEmbed do + def parse(html, _data) do + with elements = [_ | _] <- get_discovery_data(html), + {:ok, oembed_url} <- get_oembed_url(elements), + {:ok, oembed_data} <- get_oembed_data(oembed_url) do + {:ok, oembed_data} + else + _e -> {:error, "No OEmbed data found"} + end + end + + defp get_discovery_data(html) do + html |> Floki.find("link[type='application/json+oembed']") + end + + defp get_oembed_url(nodes) do + {"link", attributes, _children} = nodes |> hd() + + {:ok, Enum.into(attributes, %{})["href"]} + end + + defp get_oembed_data(url) do + {:ok, %Tesla.Env{body: json}} = Pleroma.HTTP.get(url) + + {:ok, Poison.decode!(json)} + end +end |