Add OEmbed parser
authorMaxim Filippov <colixer@gmail.com>
Sun, 13 Jan 2019 00:06:50 +0000 (02:06 +0200)
committerMaxim Filippov <colixer@gmail.com>
Sun, 13 Jan 2019 00:06:50 +0000 (02:06 +0200)
lib/pleroma/web/rich_media/parser.ex
lib/pleroma/web/rich_media/parsers/oembed_parser.ex [new file with mode: 0644]
test/fixtures/rich_media/oembed.html [new file with mode: 0644]
test/fixtures/rich_media/oembed.json [new file with mode: 0644]
test/web/rich_media/parser_test.exs

index fe092bf193b547184a15048bc34744b163fd8dd0..6da83c6e4ab34265be75c1a623980aedd0d022c4 100644 (file)
@@ -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 (file)
index 0000000..ca7226f
--- /dev/null
@@ -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
diff --git a/test/fixtures/rich_media/oembed.html b/test/fixtures/rich_media/oembed.html
new file mode 100644 (file)
index 0000000..55f1700
--- /dev/null
@@ -0,0 +1,3 @@
+<link rel="alternate" type="application/json+oembed"
+  href="http://example.com/oembed.json"
+  title="Bacon Lollys oEmbed Profile" />
diff --git a/test/fixtures/rich_media/oembed.json b/test/fixtures/rich_media/oembed.json
new file mode 100644 (file)
index 0000000..2a5f7a7
--- /dev/null
@@ -0,0 +1 @@
+{"type":"photo","flickr_type":"photo","title":"Bacon Lollys","author_name":"\u202e\u202d\u202cbees\u202c","author_url":"https:\/\/www.flickr.com\/photos\/bees\/","width":"1024","height":"768","url":"https:\/\/farm4.staticflickr.com\/3040\/2362225867_4a87ab8baf_b.jpg","web_page":"https:\/\/www.flickr.com\/photos\/bees\/2362225867\/","thumbnail_url":"https:\/\/farm4.staticflickr.com\/3040\/2362225867_4a87ab8baf_q.jpg","thumbnail_width":150,"thumbnail_height":150,"web_page_short_url":"https:\/\/flic.kr\/p\/4AK2sc","license":"All Rights Reserved","license_id":0,"html":"<a data-flickr-embed=\"true\" href=\"https:\/\/www.flickr.com\/photos\/bees\/2362225867\/\" title=\"Bacon Lollys by \u202e\u202d\u202cbees\u202c, on Flickr\"><img src=\"https:\/\/farm4.staticflickr.com\/3040\/2362225867_4a87ab8baf_b.jpg\" width=\"1024\" height=\"768\" alt=\"Bacon Lollys\"><\/a><script async src=\"https:\/\/embedr.flickr.com\/assets\/client-code.js\" charset=\"utf-8\"><\/script>","version":"1.0","cache_age":3600,"provider_name":"Flickr","provider_url":"https:\/\/www.flickr.com\/"}
index ff3486a6d5e5765114ec900d63130de7fcbd9303..e14b5061aeffe615ba2063c112170de515f444bf 100644 (file)
@@ -15,6 +15,18 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
       } ->
         %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/twitter_card.html")}
 
+      %{
+        method: :get,
+        url: "http://example.com/oembed"
+      } ->
+        %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/oembed.html")}
+
+      %{
+        method: :get,
+        url: "http://example.com/oembed.json"
+      } ->
+        %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/oembed.json")}
+
       %{method: :get, url: "http://example.com/empty"} ->
         %Tesla.Env{status: 200, body: "hello"}
     end)
@@ -48,4 +60,33 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
                 description: "View the album on Flickr."
               }}
   end
+
+  test "parses OEmbed" do
+    assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/oembed") ==
+             {:ok,
+              %{
+                "author_name" => "‮‭‬bees‬",
+                "author_url" => "https://www.flickr.com/photos/bees/",
+                "cache_age" => 3600,
+                "flickr_type" => "photo",
+                "height" => "768",
+                "html" =>
+                  "<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/bees/2362225867/\" title=\"Bacon Lollys by ‮‭‬bees‬, on Flickr\"><img src=\"https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg\" width=\"1024\" height=\"768\" alt=\"Bacon Lollys\"></a><script async src=\"https://embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>",
+                "license" => "All Rights Reserved",
+                "license_id" => 0,
+                "provider_name" => "Flickr",
+                "provider_url" => "https://www.flickr.com/",
+                "thumbnail_height" => 150,
+                "thumbnail_url" =>
+                  "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_q.jpg",
+                "thumbnail_width" => 150,
+                "title" => "Bacon Lollys",
+                "type" => "photo",
+                "url" => "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg",
+                "version" => "1.0",
+                "web_page" => "https://www.flickr.com/photos/bees/2362225867/",
+                "web_page_short_url" => "https://flic.kr/p/4AK2sc",
+                "width" => "1024"
+              }}
+  end
 end