Add support for funkwhale Audio activity
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Wed, 11 Mar 2020 11:21:44 +0000 (12:21 +0100)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Wed, 11 Mar 2020 12:46:42 +0000 (13:46 +0100)
reel2bits fixture not included as it lacks the Actor fixture for it.

Closes: https://git.pleroma.social/pleroma/pleroma/issues/1624
Closes: https://git.pleroma.social/pleroma/pleroma/issues/764
lib/pleroma/web/activity_pub/transmogrifier.ex
lib/pleroma/web/mastodon_api/views/status_view.ex
test/fixtures/tesla_mock/funkwhale_audio.json [new file with mode: 0644]
test/fixtures/tesla_mock/funkwhale_channel.json [new file with mode: 0644]
test/support/http_request_mock.ex
test/web/mastodon_api/views/status_view_test.exs
test/web/oauth/oauth_controller_test.exs

index 9cd3de7053ee9adc49459a8ee4ec073cd6c6f736..f52b065f6aa465cefb367628eff8b2f056de1deb 100644 (file)
@@ -229,7 +229,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
     Map.put(object, "url", url["href"])
   end
 
-  def fix_url(%{"type" => "Video", "url" => url} = object) when is_list(url) do
+  def fix_url(%{"type" => object_type, "url" => url} = object)
+      when object_type in ["Video", "Audio"] and is_list(url) do
     first_element = Enum.at(url, 0)
 
     link_element = Enum.find(url, fn x -> is_map(x) and x["mimeType"] == "text/html" end)
@@ -398,7 +399,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
         %{"type" => "Create", "object" => %{"type" => objtype} = object} = data,
         options
       )
-      when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer"] do
+      when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer", "Audio"] do
     actor = Containment.get_actor(data)
 
     data =
index f7469cdff69e6e7883cbf290395eebb52fe5bc3a..a042075f5f56b159cf65fddf82895712d917a961 100644 (file)
@@ -421,7 +421,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
   end
 
   def render_content(%{data: %{"type" => object_type}} = object)
-      when object_type in ["Video", "Event"] do
+      when object_type in ["Video", "Event", "Audio"] do
     with name when not is_nil(name) and name != "" <- object.data["name"] do
       "<p><a href=\"#{object.data["id"]}\">#{name}</a></p>#{object.data["content"]}"
     else
diff --git a/test/fixtures/tesla_mock/funkwhale_audio.json b/test/fixtures/tesla_mock/funkwhale_audio.json
new file mode 100644 (file)
index 0000000..15736b1
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "id": "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871",
+  "type": "Audio",
+  "name": "Compositions - Test Audio for Pleroma",
+  "attributedTo": "https://channels.tests.funkwhale.audio/federation/actors/compositions",
+  "published": "2020-03-11T10:01:52.714918+00:00",
+  "to": "https://www.w3.org/ns/activitystreams#Public",
+  "url": [
+    {
+      "type": "Link",
+      "mimeType": "audio/ogg",
+      "href": "https://channels.tests.funkwhale.audio/api/v1/listen/3901e5d8-0445-49d5-9711-e096cf32e515/?upload=42342395-0208-4fee-a38d-259a6dae0871&download=false"
+    },
+    {
+      "type": "Link",
+      "mimeType": "text/html",
+      "href": "https://channels.tests.funkwhale.audio/library/tracks/74"
+    }
+  ],
+  "content": "<p>This is a test Audio for Pleroma.</p>",
+  "mediaType": "text/html",
+  "tag": [
+    {
+      "type": "Hashtag",
+      "name": "#funkwhale"
+    },
+    {
+      "type": "Hashtag",
+      "name": "#test"
+    },
+    {
+      "type": "Hashtag",
+      "name": "#tests"
+    }
+  ],
+  "summary": "#funkwhale #test #tests",
+  "@context": [
+    "https://www.w3.org/ns/activitystreams",
+    "https://w3id.org/security/v1",
+    {
+      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers"
+    }
+  ]
+}
diff --git a/test/fixtures/tesla_mock/funkwhale_channel.json b/test/fixtures/tesla_mock/funkwhale_channel.json
new file mode 100644 (file)
index 0000000..cf9ee81
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "id": "https://channels.tests.funkwhale.audio/federation/actors/compositions",
+  "outbox": "https://channels.tests.funkwhale.audio/federation/actors/compositions/outbox",
+  "inbox": "https://channels.tests.funkwhale.audio/federation/actors/compositions/inbox",
+  "preferredUsername": "compositions",
+  "type": "Person",
+  "name": "Compositions",
+  "followers": "https://channels.tests.funkwhale.audio/federation/actors/compositions/followers",
+  "following": "https://channels.tests.funkwhale.audio/federation/actors/compositions/following",
+  "manuallyApprovesFollowers": false,
+  "url": [
+    {
+      "type": "Link",
+      "href": "https://channels.tests.funkwhale.audio/channels/compositions",
+      "mediaType": "text/html"
+    },
+    {
+      "type": "Link",
+      "href": "https://channels.tests.funkwhale.audio/api/v1/channels/compositions/rss",
+      "mediaType": "application/rss+xml"
+    }
+  ],
+  "icon": {
+    "type": "Image",
+    "url": "https://channels.tests.funkwhale.audio/media/attachments/75/b4/f1/nosmile.jpeg",
+    "mediaType": "image/jpeg"
+  },
+  "summary": "<p>I'm testing federation with the fediverse :)</p>",
+  "@context": [
+    "https://www.w3.org/ns/activitystreams",
+    "https://w3id.org/security/v1",
+    {
+      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers"
+    }
+  ],
+  "publicKey": {
+    "owner": "https://channels.tests.funkwhale.audio/federation/actors/compositions",
+    "publicKeyPem": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAv25u57oZfVLV3KltS+HcsdSx9Op4MmzIes1J8Wu8s0KbdXf2zEwS\nsVqyHgs/XCbnzsR3FqyJTo46D2BVnvZcuU5srNcR2I2HMaqQ0oVdnATE4K6KdcgV\nN+98pMWo56B8LTgE1VpvqbsrXLi9jCTzjrkebVMOP+ZVu+64v1qdgddseblYMnBZ\nct0s7ONbHnqrWlTGf5wES1uIZTVdn5r4MduZG+Uenfi1opBS0lUUxfWdW9r0oF2b\nyneZUyaUCbEroeKbqsweXCWVgnMarUOsgqC42KM4cf95lySSwTSaUtZYIbTw7s9W\n2jveU/rVg8BYZu5JK5obgBoxtlUeUoSswwIDAQAB\n-----END RSA PUBLIC KEY-----\n",
+    "id": "https://channels.tests.funkwhale.audio/federation/actors/compositions#main-key"
+  },
+  "endpoints": {
+    "sharedInbox": "https://channels.tests.funkwhale.audio/federation/shared/inbox"
+  }
+}
index d4688786523f40aeeafbd06fa1ebb03af3d2262b..0079d8c4498018ca13986e2a1a1fa03f748b55cb 100644 (file)
@@ -1273,6 +1273,21 @@ defmodule HttpRequestMock do
     {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/rin.json")}}
   end
 
+  def get(
+        "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871",
+        _,
+        _,
+        _
+      ) do
+    {:ok,
+     %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/funkwhale_audio.json")}}
+  end
+
+  def get("https://channels.tests.funkwhale.audio/federation/actors/compositions", _, _, _) do
+    {:ok,
+     %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/funkwhale_channel.json")}}
+  end
+
   def get("http://example.com/rel_me/error", _, _, _) do
     {:ok, %Tesla.Env{status: 404, body: ""}}
   end
index 191895c6fe9b3f459d833d394d10cfae19fc1a2f..3e1812a1f0ff5e2189a752aa8c2f3d9fdc91cc32 100644 (file)
@@ -420,6 +420,22 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
     assert length(represented[:media_attachments]) == 1
   end
 
+  test "funkwhale audio" do
+    user = insert(:user)
+
+    {:ok, object} =
+      Pleroma.Object.Fetcher.fetch_object_from_id(
+        "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871"
+      )
+
+    %Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"])
+
+    represented = StatusView.render("show.json", %{for: user, activity: activity})
+
+    assert represented[:id] == to_string(activity.id)
+    assert length(represented[:media_attachments]) == 1
+  end
+
   test "a Mobilizon event" do
     user = insert(:user)
 
index cff469c2851e8b2d06a3f6f6cfca6bd2f768f55f..5f86d999c1a4987e8ab7e2c282d5a6cbca78aa7a 100644 (file)
@@ -581,7 +581,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do
       # In case scope param is missing, expecting _all_ app-supported scopes to be granted
       for user <- [non_admin, admin],
           {requested_scopes, expected_scopes} <-
-            %{scopes_subset => scopes_subset, nil => app_scopes} do
+            %{scopes_subset => scopes_subset, nil: app_scopes} do
         conn =
           post(
             build_conn(),