Web.MastodonAPI.MastodonAPIController: Add Rich-Media support
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Sun, 13 Jan 2019 23:06:55 +0000 (00:06 +0100)
committerWilliam Pitcock <nenolod@dereferenced.org>
Sat, 26 Jan 2019 14:18:23 +0000 (14:18 +0000)
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/router.ex
test/web/mastodon_api/mastodon_api_controller_test.exs

index f4736fcb58cf2c0a44aa194375564c5d084a5437..86607e7af7fd27c83e60e7dbab7b0a645e9b1cf5 100644 (file)
@@ -1322,6 +1322,29 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     end
   end
 
+  defp status_first_external_url(content) do
+    content
+    |> Floki.filter_out("a.mention")
+    |> Floki.attribute("a", "href")
+    |> Enum.at(0)
+  end
+
+  def status_card(conn, %{"id" => status_id}) do
+    with %Activity{} = activity <- Repo.get(Activity, status_id),
+         true <- ActivityPub.is_public?(activity),
+         page_url <- status_first_external_url(activity.data["object"]["content"]),
+         {:ok, rich_media} <- Pleroma.Web.RichMedia.Parser.parse(page_url) do
+      card =
+        rich_media
+        |> Map.take([:image, :title, :url, :description])
+        |> Map.put(:type, "link")
+
+      json(conn, card)
+    else
+      _ -> json(conn, %{})
+    end
+  end
+
   def try_render(conn, target, params)
       when is_binary(target) do
     res = render(conn, target, params)
index b83790858f4e9172877292d7690908faa5ca3172..e749aa834643f36b5d5be490af700e2c82fe9f77 100644 (file)
@@ -258,7 +258,7 @@ defmodule Pleroma.Web.Router do
 
     get("/statuses/:id", MastodonAPIController, :get_status)
     get("/statuses/:id/context", MastodonAPIController, :get_context)
-    get("/statuses/:id/card", MastodonAPIController, :empty_object)
+    get("/statuses/:id/card", MastodonAPIController, :status_card)
     get("/statuses/:id/favourited_by", MastodonAPIController, :favourited_by)
     get("/statuses/:id/reblogged_by", MastodonAPIController, :reblogged_by)
 
index 6004285d6b6f9aa7c3bbd0358ef82a59ae8de5f1..bc87383f7dbe53387ebef9748bbaf5dbf197b5a9 100644 (file)
@@ -1623,5 +1623,21 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
                |> post("/api/v1/statuses/#{activity_two.id}/pin")
                |> json_response(400)
     end
+
+    test "Status rich-media Card", %{conn: conn, user: user} do
+      {:ok, activity} = CommonAPI.post(user, %{"status" => "http://example.com/ogp"})
+
+      response =
+        conn
+        |> get("/api/v1/statuses/#{activity.id}/card")
+        |> json_response(200)
+
+      assert response == %{
+               "image" => "http://ia.media-imdb.com/images/rock.jpg",
+               "title" => "The Rock",
+               "type" => "link",
+               "url" => "http://www.imdb.com/title/tt0117500/"
+             }
+    end
   end
 end