Merge remote-tracking branch 'origin/develop' into global-status-expiration
[akkoma] / lib / pleroma / web / metadata.ex
index 8591db6b584bb312b267b5808cfd6ba03366d379..c9aac27dca207aef7f2cbe3915d9991009798076 100644 (file)
@@ -1,65 +1,23 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Web.Metadata do
   alias Phoenix.HTML
-  alias Pleroma.{Formatter, User}
-  alias Pleroma.Web.MediaProxy
 
   def build_tags(params) do
-    if(meta_enabled?(:opengraph), do: opengraph_tags(params), else: [])
-    |> Enum.map(&to_tag/1)
-    |> Enum.map(&HTML.safe_to_string/1)
-    |> Enum.join("\n")
-  end
+    Enum.reduce(Pleroma.Config.get([__MODULE__, :providers], []), "", fn parser, acc ->
+      rendered_html =
+        params
+        |> parser.build_tags()
+        |> Enum.map(&to_tag/1)
+        |> Enum.map(&HTML.safe_to_string/1)
+        |> Enum.join()
 
-  def meta_enabled?(type) do
-    Pleroma.Config.get([:metadata, type], false)
-  end
-
-  # opengraph for single status
-  defp opengraph_tags(%{activity: activity, user: user}) do
-    with truncated_content = scrub_html_and_truncate(activity.data["object"]["content"]) do
-      [
-        {:meta,
-         [
-           property: "og:title",
-           content:
-             "#{user.name}" <>
-               if user.local do
-                 "(@#{user.nickname}@{pleroma_domain})"
-               else
-                 "(@#{user.nickname})"
-               end
-         ], []},
-        {:meta, [property: "og:url", content: activity.data["id"]], []},
-        {:meta, [property: "og:description", content: truncated_content], []},
-        {:meta, [property: "og:image", content: user_avatar_url(user)], []},
-        {:meta, [property: "og:image:width", content: 120], []},
-        {:meta, [property: "og:image:height", content: 120], []},
-        {:meta, [property: "twitter:card", content: "summary"], []}
-      ]
-    end
+      acc <> rendered_html
+    end)
   end
 
-  # opengraph for user card
-  defp opengraph_tags(%{user: user}) do
-    with truncated_bio = scrub_html_and_truncate(user.bio || "") do
-      [
-        {:meta,
-         [
-           property: "og:title",
-           content: "#{user.name} (@#{user.nickname}@#{pleroma_domain()}) profile"
-         ], []},
-        {:meta, [property: "og:url", content: User.profile_url(user)], []},
-        {:meta, [property: "og:description", content: truncated_bio], []},
-        {:meta, [property: "og:image", content: user_avatar_url(user)], []},
-        {:meta, [property: "og:image:width", content: 120], []},
-        {:meta, [property: "og:image:height", content: 120], []},
-        {:meta, [property: "twitter:card", content: "summary"], []}
-      ]
-    end
-  end
-  defp opengraph_tags(_) do
-    []
-  end
   def to_tag(data) do
     with {name, attrs, _content = []} <- data do
       HTML.Tag.tag(name, attrs)
@@ -72,19 +30,11 @@ defmodule Pleroma.Web.Metadata do
     end
   end
 
-  defp scrub_html_and_truncate(content) do
-    content
-    # html content comes from DB already encoded, decode first and scrub after
-    |> HtmlEntities.decode()
-    |> Pleroma.HTML.strip_tags()
-    |> Formatter.truncate()
-  end
-
-  defp user_avatar_url(user) do
-    User.avatar_url(user) |> MediaProxy.url()
+  def activity_nsfw?(%{data: %{"sensitive" => sensitive}}) do
+    Pleroma.Config.get([__MODULE__, :unfurl_nsfw], false) == false and sensitive
   end
 
-  def pleroma_domain do
-    Pleroma.Web.Endpoint.host()
+  def activity_nsfw?(_) do
+    false
   end
 end