use Pleroma.Web, :controller
alias Pleroma.{Repo, Object, Activity, User, Notification, Stats}
alias Pleroma.Web
+ alias Pleroma.HTML
alias Pleroma.Web.MastodonAPI.{
StatusView,
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)