Add media proxy to opengraph rich media cards

This commit is contained in:
Alexander Tumin 2023-12-12 15:08:20 +03:00
parent 4c5b45ed73
commit e7af2addd8
3 changed files with 48 additions and 10 deletions

View File

@ -0,0 +1 @@
Add media proxy to opengraph rich media cards

View File

@ -562,25 +562,24 @@ def render("card.json", %{rich_media: rich_media, page_url: page_url}) do
page_url = page_url_data |> to_string page_url = page_url_data |> to_string
image_url_data = image_url = proxied_url(rich_media["image"], page_url_data)
if is_binary(rich_media["image"]) do audio_url = proxied_url(rich_media["audio"], page_url_data)
URI.parse(rich_media["image"]) video_url = proxied_url(rich_media["video"], page_url_data)
else
nil
end
image_url = build_image_url(image_url_data, page_url_data)
%{ %{
type: "link", type: "link",
provider_name: page_url_data.host, provider_name: page_url_data.host,
provider_url: page_url_data.scheme <> "://" <> page_url_data.host, provider_url: page_url_data.scheme <> "://" <> page_url_data.host,
url: page_url, url: page_url,
image: image_url |> MediaProxy.url(), image: image_url,
title: rich_media["title"] || "", title: rich_media["title"] || "",
description: rich_media["description"] || "", description: rich_media["description"] || "",
pleroma: %{ pleroma: %{
opengraph: rich_media opengraph:
rich_media
|> Maps.put_if_present("image", image_url)
|> Maps.put_if_present("audio", audio_url)
|> Maps.put_if_present("video", video_url)
} }
} }
end end
@ -817,4 +816,12 @@ defp get_source_content_type(%{"mediaType" => type} = _source) do
defp get_source_content_type(_source) do defp get_source_content_type(_source) do
Utils.get_content_type(nil) Utils.get_content_type(nil)
end end
defp proxied_url(url, page_url_data) do
if is_binary(url) do
build_image_url(URI.parse(url), page_url_data) |> MediaProxy.url()
else
nil
end
end
end end

View File

@ -778,6 +778,36 @@ test "a rich media card with all relevant data renders correctly" do
%{provider_name: "example.com"} = %{provider_name: "example.com"} =
StatusView.render("card.json", %{page_url: page_url, rich_media: card}) StatusView.render("card.json", %{page_url: page_url, rich_media: card})
end end
test "a rich media card has all media proxied" do
clear_config([:media_proxy, :enabled], true)
clear_config([:media_preview_proxy, :enabled])
page_url = "http://example.com"
card = %{
url: page_url,
site_name: "Example site name",
title: "Example website",
image: page_url <> "/example.jpg",
audio: page_url <> "/example.ogg",
video: page_url <> "/example.mp4",
description: "Example description"
}
strcard = for {k, v} <- card, into: %{}, do: {to_string(k), v}
%{
provider_name: "example.com",
image: image,
pleroma: %{opengraph: og}
} = StatusView.render("card.json", %{page_url: page_url, rich_media: strcard})
assert String.match?(image, ~r/\/proxy\//)
assert String.match?(og["image"], ~r/\/proxy\//)
assert String.match?(og["audio"], ~r/\/proxy\//)
assert String.match?(og["video"], ~r/\/proxy\//)
end
end end
test "does not embed a relationship in the account" do test "does not embed a relationship in the account" do