Merge branch 'flake-from-int' into 'develop'
[akkoma] / lib / pleroma / web / mastodon_api / mastodon_api_controller.ex
index 86607e7af7fd27c83e60e7dbab7b0a645e9b1cf5..a60532b551b4264f75f46598dc71b937337b8f0c 100644 (file)
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   use Pleroma.Web, :controller
   alias Pleroma.{Repo, Object, Activity, User, Notification, Stats}
   alias Pleroma.Web
+  alias Pleroma.HTML
 
   alias Pleroma.Web.MastodonAPI.{
     StatusView,
@@ -1322,29 +1323,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
+  def get_status_card(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"]),
+         %Object{} = object <- Object.normalize(activity.data["object"]),
+         page_url <- HTML.extract_first_external_url(object, object.data["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)
+      page_url = rich_media[:url] || page_url
+      site_name = rich_media[:site_name] || URI.parse(page_url).host
+
+      rich_media
+      |> Map.take([:image, :title, :description])
+      |> Map.put(:type, "link")
+      |> Map.put(:provider_name, site_name)
+      |> Map.put(:url, page_url)
     else
-      _ -> json(conn, %{})
+      _ -> %{}
     end
   end
 
+  def status_card(conn, %{"id" => status_id}) do
+    json(conn, get_status_card(status_id))
+  end
+
   def try_render(conn, target, params)
       when is_binary(target) do
     res = render(conn, target, params)