Add twitter card, filter nsfw
authorrinpatch <rinpatch@sdf.org>
Tue, 15 Jan 2019 20:00:22 +0000 (23:00 +0300)
committerrinpatch <rinpatch@sdf.org>
Tue, 15 Jan 2019 20:00:22 +0000 (23:00 +0300)
lib/pleroma/web/metadata/opengraph.ex
lib/pleroma/web/metadata/twitter_card.ex [new file with mode: 0644]

index 8046c13babf9a4f40c3f6cad92f94f21d43f8932..fcc9603119c8ada805ec14dc3a08ce89190d1cfc 100644 (file)
@@ -17,10 +17,9 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraph do
            content: user_name_string(user)
          ], []},
         {:meta, [property: "og:url", content: activity.data["id"]], []},
-        {:meta, [property: "og:description", content: truncated_content], []},
-        {:meta, [property: "twitter:card", content: "summary"], []}
+        {:meta, [property: "og:description", content: truncated_content], []}
       ] ++
-        if attachments == [] do
+        if attachments == [] or Enum.any?(activity.data["object"]["tag"], fn tag -> tag == "nsfw" end) do
           [
             {:meta, [property: "og:image", content: attachment_url(User.avatar_url(user))], []},
             {:meta, [property: "og:image:width", content: 120], []},
@@ -45,8 +44,7 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraph do
         {:meta, [property: "og:description", content: truncated_bio], []},
         {:meta, [property: "og:image", content: attachment_url(User.avatar_url(user))], []},
         {:meta, [property: "og:image:width", content: 120], []},
-        {:meta, [property: "og:image:height", content: 120], []},
-        {:meta, [property: "twitter:card", content: "summary"], []}
+        {:meta, [property: "og:image:height", content: 120], []}
       ]
     end
   end
diff --git a/lib/pleroma/web/metadata/twitter_card.ex b/lib/pleroma/web/metadata/twitter_card.ex
new file mode 100644 (file)
index 0000000..6424f84
--- /dev/null
@@ -0,0 +1,36 @@
+defmodule Pleroma.Web.Metadata.Providers.TwitterCard do
+  def build_tags(%{activity: activity}) do
+    if Enum.any?(activity.data["object"]["tag"], fn tag -> tag == "nsfw" end) or
+         activity.data["object"]["attachment"] == [] do
+      build_tags(nil)
+    else
+      case find_first_acceptable_media_type(activity) do
+        "image" ->
+          [{:meta, [property: "twitter:card", content: "summary_large_image"], []}]
+
+        "audio" ->
+          [{:meta, [property: "twitter:card", content: "player"], []}]
+
+        "video" ->
+          [{:meta, [property: "twitter:card", content: "player"], []}]
+
+        _ ->
+          build_tags(nil)
+      end
+    end
+  end
+
+  def build_tags(_) do
+    [{:meta, [property: "twitter:card", content: "summary"], []}]
+  end
+
+  def find_first_acceptable_media_type(%{data: %{"object" => %{"attachment" => attachment}}}) do
+    Enum.find_value(attachment, fn attachment ->
+      Enum.find_value(attachment["url"], fn url ->
+        Enum.find(["image", "audio", "video"], fn media_type ->
+          String.starts_with?(url["mediaType"], media_type)
+        end)
+      end)
+    end)
+  end
+end