Embed player suitable for Twitter Cards
authorhref <href@random.sh>
Tue, 19 Feb 2019 16:39:42 +0000 (17:39 +0100)
committerhref <href@random.sh>
Tue, 19 Feb 2019 16:47:48 +0000 (17:47 +0100)
lib/pleroma/web/metadata/player_view.ex [new file with mode: 0644]
lib/pleroma/web/metadata/twitter_card.ex
lib/pleroma/web/ostatus/ostatus_controller.ex
lib/pleroma/web/router.ex
lib/pleroma/web/templates/layout/metadata_player.html.eex [new file with mode: 0644]

diff --git a/lib/pleroma/web/metadata/player_view.ex b/lib/pleroma/web/metadata/player_view.ex
new file mode 100644 (file)
index 0000000..68b0a35
--- /dev/null
@@ -0,0 +1,21 @@
+defmodule Pleroma.Web.Metadata.PlayerView do
+  use Pleroma.Web, :view
+  import Phoenix.HTML.Tag, only: [content_tag: 3, tag: 2]
+
+  def render("player.html", %{"mediaType" => type, "href" => href}) do
+    tag_type =
+      case type do
+        "audio" <> _ -> :audio
+        "video" <> _ -> :video
+      end
+
+    content_tag(
+      tag_type,
+      [
+        tag(:source, src: href, type: type),
+        "Your browser does not support #{type} playback."
+      ],
+      controls: true
+    )
+  end
+end
index 13fa22240649832e4baa015a0e3dba79f8257733..e7f5760a9465d731af54b16a4cfe74000f23eaf4 100644 (file)
@@ -12,10 +12,11 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do
 
   @impl Provider
   def build_tags(%{
+        activity_id: id,
         object: object,
         user: user
       }) do
-    attachments = build_attachments(object)
+    attachments = build_attachments(id, object)
     scrubbed_content = Utils.scrub_html_and_truncate(object)
     # Zero width space
     content =
@@ -65,7 +66,9 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do
     end
   end
 
-  defp build_attachments(%{data: %{"attachment" => attachments}}) do
+  defp build_attachments(id, z = %{data: %{"attachment" => attachments}}) do
+    IO.puts(inspect(z))
+
     Enum.reduce(attachments, [], fn attachment, acc ->
       rendered_tags =
         Enum.reduce(attachment["url"], [], fn url, acc ->
@@ -79,8 +82,9 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do
             "audio" ->
               [
                 {:meta, [property: "twitter:card", content: "player"], []},
-                {:meta, [property: "twitter:player", content: Utils.attachment_url(url["href"])],
-                 []}
+                {:meta, [property: "twitter:player:width", content: "480"], []},
+                {:meta, [property: "twitter:player:height", content: "80"], []},
+                {:meta, [property: "twitter:player", content: player_url(id)], []}
                 | acc
               ]
 
@@ -99,8 +103,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do
             "video" ->
               [
                 {:meta, [property: "twitter:card", content: "player"], []},
-                {:meta, [property: "twitter:player", content: Utils.attachment_url(url["href"])],
-                 []},
+                {:meta, [property: "twitter:player", content: player_url(id)], []},
                 {:meta, [property: "twitter:player:width", content: "1280"], []},
                 {:meta, [property: "twitter:player:height", content: "720"], []}
                 | acc
@@ -114,4 +117,8 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCard do
       acc ++ rendered_tags
     end)
   end
+
+  defp player_url(id) do
+    Pleroma.Web.Router.Helpers.o_status_url(Pleroma.Web.Endpoint, :notice_player, id)
+  end
 end
index db4c8f4daf7d45c55656614379ffa196e7958778..e7bde28a6b34d23783d54221caa91810df5bec26 100644 (file)
@@ -153,6 +153,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do
             %Object{} = object = Object.normalize(activity.data["object"])
 
             Fallback.RedirectController.redirector_with_meta(conn, %{
+              activity_id: activity.id,
               object: object,
               url:
                 Pleroma.Web.Router.Helpers.o_status_url(
@@ -184,6 +185,25 @@ defmodule Pleroma.Web.OStatus.OStatusController do
     end
   end
 
+  # Returns an HTML embedded <audio> or <video> player suitable for embed iframes.
+  def notice_player(conn, %{"id" => id}) do
+    with %Activity{data: %{"type" => "Create"}} = activity <- Activity.get_by_id(id),
+         true <- ActivityPub.is_public?(activity),
+         %Object{} = object <- Object.normalize(activity.data["object"]),
+         %{data: %{"attachment" => [%{"url" => [url | _]} | _]}} <- object,
+         true <- String.starts_with?(url["mediaType"], ["audio", "video"]) do
+      conn
+      |> put_layout(:metadata_player)
+      |> put_view(Pleroma.Web.Metadata.PlayerView)
+      |> render("player.html", url)
+    else
+      _error ->
+        conn
+        |> put_status(404)
+        |> Fallback.RedirectController.redirector(nil, 404)
+    end
+  end
+
   defp represent_activity(
          conn,
          "activity+json",
index 5b5627ce84cb20a8a1796de752439e7dd0eb677d..d37ccd82cff910a0c0941d47a6f691f6fdecfecb 100644 (file)
@@ -409,6 +409,7 @@ defmodule Pleroma.Web.Router do
     get("/objects/:uuid", OStatus.OStatusController, :object)
     get("/activities/:uuid", OStatus.OStatusController, :activity)
     get("/notice/:id", OStatus.OStatusController, :notice)
+    get("/notice/:id/embed_player", OStatus.OStatusController, :notice_player)
     get("/users/:nickname/feed", OStatus.OStatusController, :feed)
     get("/users/:nickname", OStatus.OStatusController, :feed_redirect)
 
diff --git a/lib/pleroma/web/templates/layout/metadata_player.html.eex b/lib/pleroma/web/templates/layout/metadata_player.html.eex
new file mode 100644 (file)
index 0000000..7a17055
--- /dev/null
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<body>
+
+<style type="text/css">
+video {
+   width:100%;
+   max-width:600px;
+   height:auto;
+}
+</style>
+
+<%= render @view_module, @view_template, assigns %>
+
+</body>
+</html>