aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/web/rich_media/parser.ex6
-rw-r--r--lib/pleroma/web/rich_media/parsers/oembed_parser.ex27
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