aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorkaniini <nenolod@gmail.com>2019-01-14 07:28:04 +0000
committerkaniini <nenolod@gmail.com>2019-01-14 07:28:04 +0000
commitde1da7b3d1c855df87262b8d24d6cdb6a6a518bc (patch)
treedbad5ebca137823d9224e55f28cc55b3d584d53e /lib
parentfa0392e49cd46e4d2845840232a4b56e52729369 (diff)
parentb8a77c5d704a4a76f227854c1cab560eb98a7382 (diff)
downloadpleroma-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.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