diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/web/rich_media/parser.ex | 7 | ||||
-rw-r--r-- | lib/pleroma/web/rich_media/parser/card.ex | 20 |
2 files changed, 18 insertions, 9 deletions
diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 66c90682c..0532e51ad 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -4,7 +4,6 @@ defmodule Pleroma.Web.RichMedia.Parser do require Logger - alias Pleroma.Web.RichMedia.Parser.Card alias Pleroma.Web.RichMedia.Parser.Embed @cachex Pleroma.Config.get([:cachex, :provider], Cachex) @@ -145,8 +144,7 @@ defmodule Pleroma.Web.RichMedia.Parser do {:ok, %Tesla.Env{body: json}} <- Pleroma.Web.RichMedia.Helpers.oembed_get(oembed_url), {:ok, data} <- Jason.decode(json), - embed <- %Embed{url: url, oembed: data}, - {:ok, %Card{}} <- Card.validate(embed) do + embed <- %Embed{url: url, oembed: data} do {:ok, embed} else {:error, error} -> {:error, error} @@ -157,8 +155,7 @@ defmodule Pleroma.Web.RichMedia.Parser do defp fetch_document(url) do with {:ok, %Tesla.Env{body: html}} <- Pleroma.Web.RichMedia.Helpers.rich_media_get(url), {:ok, html} <- Floki.parse_document(html), - %Embed{} = embed <- parse_embed(html, url), - {:ok, %Card{}} <- Card.validate(embed) do + %Embed{} = embed <- parse_embed(html, url) do {:ok, embed} else {:error, error} -> {:error, error} diff --git a/lib/pleroma/web/rich_media/parser/card.ex b/lib/pleroma/web/rich_media/parser/card.ex index b29db730b..528837614 100644 --- a/lib/pleroma/web/rich_media/parser/card.ex +++ b/lib/pleroma/web/rich_media/parser/card.ex @@ -40,8 +40,8 @@ defmodule Pleroma.Web.RichMedia.Parser.Card do html: sanitize_html(oembed["html"]), width: oembed["width"], height: oembed["height"], - image: get_image(oembed) |> proxy(), - embed_url: oembed["url"] |> proxy() + image: get_image(oembed) |> fix_uri(url) |> proxy(), + embed_url: oembed["url"] |> fix_uri(url) |> proxy() } |> validate() end @@ -56,7 +56,7 @@ defmodule Pleroma.Web.RichMedia.Parser.Card do type: "link", provider_name: uri.host, provider_url: "#{uri.scheme}://#{uri.host}", - image: get_image(embed) |> proxy() + image: get_image(embed) |> fix_uri(url) |> proxy() } |> validate() end @@ -112,12 +112,24 @@ defmodule Pleroma.Web.RichMedia.Parser.Card do defp stringify_keys(%{} = map), do: Map.new(map, fn {k, v} -> {Atom.to_string(k), v} end) + def fix_uri("http://" <> _ = uri, _base_uri), do: uri + def fix_uri("https://" <> _ = uri, _base_uri), do: uri + def fix_uri("/" <> _ = uri, base_uri), do: URI.merge(base_uri, uri) |> URI.to_string() + def fix_uri("", _base_uri), do: nil + + def fix_uri(uri, base_uri) when is_binary(uri), + do: URI.merge(base_uri, "/#{uri}") |> URI.to_string() + + def fix_uri(_uri, _base_uri), do: nil + defp proxy(url) when is_binary(url), do: Pleroma.Web.MediaProxy.url(url) defp proxy(_), do: nil def validate(%Card{type: type, html: html} = card) when type in ["video", "rich"] and (is_binary(html) == false or html == "") do - {:error, {:invalid_metadata, card}} + card + |> Map.put(:type, "link") + |> validate() end def validate(%Card{type: type, title: title} = card) |