Video: Handle peertube videos only stashing attachments in x-mpegURL
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Sun, 21 Feb 2021 22:41:13 +0000 (23:41 +0100)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Sun, 21 Feb 2021 22:41:28 +0000 (23:41 +0100)
Closes: https://git.pleroma.social/pleroma/pleroma/-/issues/2535
lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex
test/fixtures/peertube/actor-person.json [new file with mode: 0644]
test/fixtures/peertube/video-object-mpegURL-only.json [new file with mode: 0644]
test/pleroma/web/activity_pub/transmogrifier/video_handling_test.exs
test/support/http_request_mock.ex

index b3e738d8d84eafa461f1124e543085b393553814..4a96fef529899be4e80ac8c606df1b2dcbe15488 100644 (file)
@@ -70,19 +70,33 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator do
     |> changeset(data)
   end
 
-  defp fix_url(%{"url" => url} = data) when is_list(url) do
-    attachment =
-      Enum.find(url, fn x ->
-        mime_type = x["mimeType"] || x["mediaType"] || ""
-
-        is_map(x) and String.starts_with?(mime_type, ["video/", "audio/"])
+  defp find_attachment(url) do
+    mpeg_url =
+      Enum.find(url, fn
+        %{"mediaType" => mime_type, "tag" => tags} when is_list(tags) ->
+          mime_type == "application/x-mpegURL"
+
+        _ ->
+          false
       end)
 
-    link_element =
-      Enum.find(url, fn x ->
-        mime_type = x["mimeType"] || x["mediaType"] || ""
+    url
+    |> Enum.concat(mpeg_url["tag"] || [])
+    |> Enum.find(fn
+      %{"mediaType" => mime_type} -> String.starts_with?(mime_type, ["video/", "audio/"])
+      %{"mimeType" => mime_type} -> String.starts_with?(mime_type, ["video/", "audio/"])
+      _ -> false
+    end)
+  end
 
-        is_map(x) and mime_type == "text/html"
+  defp fix_url(%{"url" => url} = data) when is_list(url) do
+    attachment = find_attachment(url)
+
+    link_element =
+      Enum.find(url, fn
+        %{"mediaType" => "text/html"} -> true
+        %{"mimeType" => "text/html"} -> true
+        _ -> false
       end)
 
     data
diff --git a/test/fixtures/peertube/actor-person.json b/test/fixtures/peertube/actor-person.json
new file mode 100644 (file)
index 0000000..8c387d4
--- /dev/null
@@ -0,0 +1,121 @@
+{
+  "type": "Person",
+  "id": "https://peertube.stream/accounts/createurs",
+  "following": "https://peertube.stream/accounts/createurs/following",
+  "followers": "https://peertube.stream/accounts/createurs/followers",
+  "playlists": "https://peertube.stream/accounts/createurs/playlists",
+  "inbox": "https://peertube.stream/accounts/createurs/inbox",
+  "outbox": "https://peertube.stream/accounts/createurs/outbox",
+  "preferredUsername": "createurs",
+  "url": "https://peertube.stream/accounts/createurs",
+  "name": "Créateurs",
+  "endpoints": {
+    "sharedInbox": "https://peertube.stream/inbox"
+  },
+  "publicKey": {
+    "id": "https://peertube.stream/accounts/createurs#main-key",
+    "owner": "https://peertube.stream/accounts/createurs",
+    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxqkQhbRYbA81+WTYjorR\n2lEMad3kYCnzDjGTLr4I92eanzFHxyELGnjzP6TpEvjOiB9NrCRrqU/iFPLdgrq2\nwIFcXPWdCq6Gcg7QLlaeMM0JoJmr0KTEhzg0XKCo96UsyTzaF4DISxqi8RyoyWeU\nEkgiOzlkdYTlouq3MlQH+p1PBAsNUQfIEUsU+l6k1vzbm8JRwlT+D1bNde4I/Lqs\n4uB5ru3zzInwZ2hz9+heiriNoGEBv74rZHYn966tZVX8iMGx2+m6okozEdEQbqCl\n0ekqDcd8P6CoFqqeeu8coh82OUtuFI/XsbetdWA55YQmSHyMiTsIwVbeoogIETbI\n4QIDAQAB\n-----END PUBLIC KEY-----"
+  },
+  "icon": {
+    "type": "Image",
+    "mediaType": "image/png",
+    "url": "https://peertube.stream/lazy-static/avatars/c27b672d-ad8f-498a-adbe-553af8da56f9.png"
+  },
+  "@context": [
+    "https://www.w3.org/ns/activitystreams",
+    "https://w3id.org/security/v1",
+    {
+      "RsaSignature2017": "https://w3id.org/security#RsaSignature2017"
+    },
+    {
+      "pt": "https://joinpeertube.org/ns#",
+      "sc": "http://schema.org#",
+      "Hashtag": "as:Hashtag",
+      "uuid": "sc:identifier",
+      "category": "sc:category",
+      "licence": "sc:license",
+      "subtitleLanguage": "sc:subtitleLanguage",
+      "sensitive": "as:sensitive",
+      "language": "sc:inLanguage",
+      "isLiveBroadcast": "sc:isLiveBroadcast",
+      "liveSaveReplay": {
+        "@type": "sc:Boolean",
+        "@id": "pt:liveSaveReplay"
+      },
+      "permanentLive": {
+        "@type": "sc:Boolean",
+        "@id": "pt:permanentLive"
+      },
+      "Infohash": "pt:Infohash",
+      "Playlist": "pt:Playlist",
+      "PlaylistElement": "pt:PlaylistElement",
+      "originallyPublishedAt": "sc:datePublished",
+      "views": {
+        "@type": "sc:Number",
+        "@id": "pt:views"
+      },
+      "state": {
+        "@type": "sc:Number",
+        "@id": "pt:state"
+      },
+      "size": {
+        "@type": "sc:Number",
+        "@id": "pt:size"
+      },
+      "fps": {
+        "@type": "sc:Number",
+        "@id": "pt:fps"
+      },
+      "startTimestamp": {
+        "@type": "sc:Number",
+        "@id": "pt:startTimestamp"
+      },
+      "stopTimestamp": {
+        "@type": "sc:Number",
+        "@id": "pt:stopTimestamp"
+      },
+      "position": {
+        "@type": "sc:Number",
+        "@id": "pt:position"
+      },
+      "commentsEnabled": {
+        "@type": "sc:Boolean",
+        "@id": "pt:commentsEnabled"
+      },
+      "downloadEnabled": {
+        "@type": "sc:Boolean",
+        "@id": "pt:downloadEnabled"
+      },
+      "waitTranscoding": {
+        "@type": "sc:Boolean",
+        "@id": "pt:waitTranscoding"
+      },
+      "support": {
+        "@type": "sc:Text",
+        "@id": "pt:support"
+      },
+      "likes": {
+        "@id": "as:likes",
+        "@type": "@id"
+      },
+      "dislikes": {
+        "@id": "as:dislikes",
+        "@type": "@id"
+      },
+      "playlists": {
+        "@id": "pt:playlists",
+        "@type": "@id"
+      },
+      "shares": {
+        "@id": "as:shares",
+        "@type": "@id"
+      },
+      "comments": {
+        "@id": "as:comments",
+        "@type": "@id"
+      }
+    }
+  ],
+  "summary": null
+}
diff --git a/test/fixtures/peertube/video-object-mpegURL-only.json b/test/fixtures/peertube/video-object-mpegURL-only.json
new file mode 100644 (file)
index 0000000..7f26e89
--- /dev/null
@@ -0,0 +1,413 @@
+{
+  "type": "Create",
+  "id": "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6/activity",
+  "actor": "https://peertube.stream/accounts/createurs",
+  "object": {
+    "type": "Video",
+    "id": "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6",
+    "name": "Vu du 20/02/21 : \"Planète Mars 2050\"",
+    "duration": "PT385S",
+    "uuid": "abece3c3-b9c6-47f4-8040-f3eed8c602e6",
+    "tag": [
+      {
+        "type": "Hashtag",
+        "name": "France3"
+      },
+      {
+        "type": "Hashtag",
+        "name": "lezapping"
+      }
+    ],
+    "category": {
+      "identifier": "11",
+      "name": "News & Politics"
+    },
+    "language": {
+      "identifier": "fr",
+      "name": "French"
+    },
+    "views": 5,
+    "sensitive": false,
+    "waitTranscoding": false,
+    "isLiveBroadcast": false,
+    "liveSaveReplay": null,
+    "permanentLive": null,
+    "state": 1,
+    "commentsEnabled": true,
+    "downloadEnabled": false,
+    "published": "2021-02-20T17:04:54.278Z",
+    "originallyPublishedAt": "2021-02-19T23:00:00.000Z",
+    "updated": "2021-02-21T20:01:11.189Z",
+    "mediaType": "text/markdown",
+    "content": "Un regard impertinent et libre, orchestré par Patrick Menais et son équipe, sur le monde de l’image.\r\n\r\nEn avant-première du lundi au samedi à 17h00 sur Facebook, Twitter et YouTube.\r\n\r\nDu lundi au samedi à 20h00 sur France 3.\r\n\r\nhttps://www.facebook.com/vufrancetv\r\nhttps://twitter.com/VuFrancetv",
+    "support": "Suivre VU :\r\n- Twitter : https://twitter.com/vufrancetv\r\n- Facebook :https://www.facebook.com/vufrancetv/\r\n- Site : https://www.france.tv/france-3/vu/",
+    "subtitleLanguage": [],
+    "icon": [
+      {
+        "type": "Image",
+        "url": "https://peertube.stream/static/thumbnails/abece3c3-b9c6-47f4-8040-f3eed8c602e6.jpg",
+        "mediaType": "image/jpeg",
+        "width": 223,
+        "height": 122
+      },
+      {
+        "type": "Image",
+        "url": "https://peertube.stream/lazy-static/previews/abece3c3-b9c6-47f4-8040-f3eed8c602e6.jpg",
+        "mediaType": "image/jpeg",
+        "width": 850,
+        "height": 480
+      }
+    ],
+    "url": [
+      {
+        "type": "Link",
+        "mediaType": "text/html",
+        "href": "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6"
+      },
+      {
+        "type": "Link",
+        "mediaType": "application/x-mpegURL",
+        "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/master.m3u8",
+        "tag": [
+          {
+            "type": "Infohash",
+            "name": "00bfce9595e1655d8696b60e19ca25c34be5fa63"
+          },
+          {
+            "type": "Infohash",
+            "name": "256c21b65d5e0f944b4b79d8e0cbc55c9d906807"
+          },
+          {
+            "type": "Infohash",
+            "name": "fcd981098c484d0e328927c8fb21ecf986880b7e"
+          },
+          {
+            "type": "Infohash",
+            "name": "f7e01ac566e9fef91cd22514e6c3c256af7a9f5f"
+          },
+          {
+            "type": "Infohash",
+            "name": "42b421fc44d0dceb45ac3f6f6419b07fd570a232"
+          },
+          {
+            "type": "Infohash",
+            "name": "f876c6d6d49ce618a880ca223df54cb29f4b4bfd"
+          },
+          {
+            "type": "Link",
+            "name": "sha256",
+            "mediaType": "application/json",
+            "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/segments-sha256.json"
+          },
+          {
+            "type": "Link",
+            "mediaType": "video/mp4",
+            "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-1080-fragmented.mp4",
+            "height": 1080,
+            "size": 57888169,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "rel": [
+              "metadata",
+              "video/mp4"
+            ],
+            "mediaType": "application/json",
+            "href": "https://peertube.stream/api/v1/videos/abece3c3-b9c6-47f4-8040-f3eed8c602e6/metadata/570040",
+            "height": 1080,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent",
+            "href": "https://peertube.stream/static/torrents/abece3c3-b9c6-47f4-8040-f3eed8c602e6-1080-hls.torrent",
+            "height": 1080
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet",
+            "href": "magnet:?xs=https%3A%2F%2Fpeertube.stream%2Fstatic%2Ftorrents%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-1080-hls.torrent&xt=urn:btih:68af82ebcd9df8335e407b755f38f5fd39c8a6a4&dn=Vu+du+20%2F02%2F21+%3A+%22Plan%C3%A8te+Mars+2050%22&tr=wss%3A%2F%2Fpeertube.stream%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.stream%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.stream%2Fstatic%2Fstreaming-playlists%2Fhls%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-1080-fragmented.mp4",
+            "height": 1080
+          },
+          {
+            "type": "Link",
+            "mediaType": "video/mp4",
+            "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-720-fragmented.mp4",
+            "height": 720,
+            "size": 45165123,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "rel": [
+              "metadata",
+              "video/mp4"
+            ],
+            "mediaType": "application/json",
+            "href": "https://peertube.stream/api/v1/videos/abece3c3-b9c6-47f4-8040-f3eed8c602e6/metadata/570056",
+            "height": 720,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent",
+            "href": "https://peertube.stream/static/torrents/abece3c3-b9c6-47f4-8040-f3eed8c602e6-720-hls.torrent",
+            "height": 720
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet",
+            "href": "magnet:?xs=https%3A%2F%2Fpeertube.stream%2Fstatic%2Ftorrents%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-720-hls.torrent&xt=urn:btih:8450928a4ffb2a4c5f927a163487c48c05f6e700&dn=Vu+du+20%2F02%2F21+%3A+%22Plan%C3%A8te+Mars+2050%22&tr=wss%3A%2F%2Fpeertube.stream%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.stream%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.stream%2Fstatic%2Fstreaming-playlists%2Fhls%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-720-fragmented.mp4",
+            "height": 720
+          },
+          {
+            "type": "Link",
+            "mediaType": "video/mp4",
+            "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-480-fragmented.mp4",
+            "height": 480,
+            "size": 29618534,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "rel": [
+              "metadata",
+              "video/mp4"
+            ],
+            "mediaType": "application/json",
+            "href": "https://peertube.stream/api/v1/videos/abece3c3-b9c6-47f4-8040-f3eed8c602e6/metadata/570042",
+            "height": 480,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent",
+            "href": "https://peertube.stream/static/torrents/abece3c3-b9c6-47f4-8040-f3eed8c602e6-480-hls.torrent",
+            "height": 480
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet",
+            "href": "magnet:?xs=https%3A%2F%2Fpeertube.stream%2Fstatic%2Ftorrents%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-480-hls.torrent&xt=urn:btih:39e11181db5f376aa78c94bffcb9ccf2f4bca715&dn=Vu+du+20%2F02%2F21+%3A+%22Plan%C3%A8te+Mars+2050%22&tr=wss%3A%2F%2Fpeertube.stream%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.stream%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.stream%2Fstatic%2Fstreaming-playlists%2Fhls%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-480-fragmented.mp4",
+            "height": 480
+          },
+          {
+            "type": "Link",
+            "mediaType": "video/mp4",
+            "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-360-fragmented.mp4",
+            "height": 360,
+            "size": 21771466,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "rel": [
+              "metadata",
+              "video/mp4"
+            ],
+            "mediaType": "application/json",
+            "href": "https://peertube.stream/api/v1/videos/abece3c3-b9c6-47f4-8040-f3eed8c602e6/metadata/570043",
+            "height": 360,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent",
+            "href": "https://peertube.stream/static/torrents/abece3c3-b9c6-47f4-8040-f3eed8c602e6-360-hls.torrent",
+            "height": 360
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet",
+            "href": "magnet:?xs=https%3A%2F%2Fpeertube.stream%2Fstatic%2Ftorrents%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-360-hls.torrent&xt=urn:btih:c33aa52822528e29ffd1a615ebe40450e4c61452&dn=Vu+du+20%2F02%2F21+%3A+%22Plan%C3%A8te+Mars+2050%22&tr=wss%3A%2F%2Fpeertube.stream%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.stream%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.stream%2Fstatic%2Fstreaming-playlists%2Fhls%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-360-fragmented.mp4",
+            "height": 360
+          },
+          {
+            "type": "Link",
+            "mediaType": "video/mp4",
+            "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-240-fragmented.mp4",
+            "height": 240,
+            "size": 14856165,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "rel": [
+              "metadata",
+              "video/mp4"
+            ],
+            "mediaType": "application/json",
+            "href": "https://peertube.stream/api/v1/videos/abece3c3-b9c6-47f4-8040-f3eed8c602e6/metadata/570057",
+            "height": 240,
+            "fps": 25
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent",
+            "href": "https://peertube.stream/static/torrents/abece3c3-b9c6-47f4-8040-f3eed8c602e6-240-hls.torrent",
+            "height": 240
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet",
+            "href": "magnet:?xs=https%3A%2F%2Fpeertube.stream%2Fstatic%2Ftorrents%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-240-hls.torrent&xt=urn:btih:157e4cc3e9f15c06e995d6c3388539fdda312771&dn=Vu+du+20%2F02%2F21+%3A+%22Plan%C3%A8te+Mars+2050%22&tr=wss%3A%2F%2Fpeertube.stream%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.stream%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.stream%2Fstatic%2Fstreaming-playlists%2Fhls%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-240-fragmented.mp4",
+            "height": 240
+          },
+          {
+            "type": "Link",
+            "mediaType": "video/mp4",
+            "href": "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-0-fragmented.mp4",
+            "height": 0,
+            "size": 6248765,
+            "fps": 0
+          },
+          {
+            "type": "Link",
+            "rel": [
+              "metadata",
+              "video/mp4"
+            ],
+            "mediaType": "application/json",
+            "href": "https://peertube.stream/api/v1/videos/abece3c3-b9c6-47f4-8040-f3eed8c602e6/metadata/570041",
+            "height": 0,
+            "fps": 0
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent",
+            "href": "https://peertube.stream/static/torrents/abece3c3-b9c6-47f4-8040-f3eed8c602e6-0-hls.torrent",
+            "height": 0
+          },
+          {
+            "type": "Link",
+            "mediaType": "application/x-bittorrent;x-scheme-handler/magnet",
+            "href": "magnet:?xs=https%3A%2F%2Fpeertube.stream%2Fstatic%2Ftorrents%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-0-hls.torrent&xt=urn:btih:abc8dc58903d18cf7ec0c0cef92cc5ffe5cb0b5c&dn=Vu+du+20%2F02%2F21+%3A+%22Plan%C3%A8te+Mars+2050%22&tr=wss%3A%2F%2Fpeertube.stream%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.stream%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.stream%2Fstatic%2Fstreaming-playlists%2Fhls%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6%2Fabece3c3-b9c6-47f4-8040-f3eed8c602e6-0-fragmented.mp4",
+            "height": 0
+          }
+        ]
+      }
+    ],
+    "likes": "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6/likes",
+    "dislikes": "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6/dislikes",
+    "shares": "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6/announces",
+    "comments": "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6/comments",
+    "attributedTo": [
+      {
+        "type": "Person",
+        "id": "https://peertube.stream/accounts/createurs"
+      },
+      {
+        "type": "Group",
+        "id": "https://peertube.stream/video-channels/vu"
+      }
+    ],
+    "to": [
+      "https://www.w3.org/ns/activitystreams#Public"
+    ],
+    "cc": [
+      "https://peertube.stream/accounts/createurs/followers"
+    ]
+  },
+  "to": [
+    "https://www.w3.org/ns/activitystreams#Public"
+  ],
+  "cc": [
+    "https://peertube.stream/accounts/createurs/followers"
+  ],
+  "@context": [
+    "https://www.w3.org/ns/activitystreams",
+    "https://w3id.org/security/v1",
+    {
+      "RsaSignature2017": "https://w3id.org/security#RsaSignature2017"
+    },
+    {
+      "pt": "https://joinpeertube.org/ns#",
+      "sc": "http://schema.org#",
+      "Hashtag": "as:Hashtag",
+      "uuid": "sc:identifier",
+      "category": "sc:category",
+      "licence": "sc:license",
+      "subtitleLanguage": "sc:subtitleLanguage",
+      "sensitive": "as:sensitive",
+      "language": "sc:inLanguage",
+      "isLiveBroadcast": "sc:isLiveBroadcast",
+      "liveSaveReplay": {
+        "@type": "sc:Boolean",
+        "@id": "pt:liveSaveReplay"
+      },
+      "permanentLive": {
+        "@type": "sc:Boolean",
+        "@id": "pt:permanentLive"
+      },
+      "Infohash": "pt:Infohash",
+      "Playlist": "pt:Playlist",
+      "PlaylistElement": "pt:PlaylistElement",
+      "originallyPublishedAt": "sc:datePublished",
+      "views": {
+        "@type": "sc:Number",
+        "@id": "pt:views"
+      },
+      "state": {
+        "@type": "sc:Number",
+        "@id": "pt:state"
+      },
+      "size": {
+        "@type": "sc:Number",
+        "@id": "pt:size"
+      },
+      "fps": {
+        "@type": "sc:Number",
+        "@id": "pt:fps"
+      },
+      "startTimestamp": {
+        "@type": "sc:Number",
+        "@id": "pt:startTimestamp"
+      },
+      "stopTimestamp": {
+        "@type": "sc:Number",
+        "@id": "pt:stopTimestamp"
+      },
+      "position": {
+        "@type": "sc:Number",
+        "@id": "pt:position"
+      },
+      "commentsEnabled": {
+        "@type": "sc:Boolean",
+        "@id": "pt:commentsEnabled"
+      },
+      "downloadEnabled": {
+        "@type": "sc:Boolean",
+        "@id": "pt:downloadEnabled"
+      },
+      "waitTranscoding": {
+        "@type": "sc:Boolean",
+        "@id": "pt:waitTranscoding"
+      },
+      "support": {
+        "@type": "sc:Text",
+        "@id": "pt:support"
+      },
+      "likes": {
+        "@id": "as:likes",
+        "@type": "@id"
+      },
+      "dislikes": {
+        "@id": "as:dislikes",
+        "@type": "@id"
+      },
+      "playlists": {
+        "@id": "pt:playlists",
+        "@type": "@id"
+      },
+      "shares": {
+        "@id": "as:shares",
+        "@type": "@id"
+      },
+      "comments": {
+        "@id": "as:comments",
+        "@type": "@id"
+      }
+    }
+  ]
+}
index c00df6a04ff1fe2188e415165f3ef153555f5307..6ddf7c1720b6b512e06a143577c31d13508d29aa 100644 (file)
@@ -92,4 +92,34 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.VideoHandlingTest do
     assert object.data["url"] ==
              "https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206"
   end
+
+  test "it works for peertube videos with only their mpegURL map" do
+    data =
+      File.read!("test/fixtures/peertube/video-object-mpegURL-only.json")
+      |> Jason.decode!()
+
+    {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data)
+
+    assert object = Object.normalize(activity, fetch: false)
+
+    assert object.data["attachment"] == [
+             %{
+               "type" => "Link",
+               "mediaType" => "video/mp4",
+               "name" => nil,
+               "blurhash" => nil,
+               "url" => [
+                 %{
+                   "href" =>
+                     "https://peertube.stream/static/streaming-playlists/hls/abece3c3-b9c6-47f4-8040-f3eed8c602e6/abece3c3-b9c6-47f4-8040-f3eed8c602e6-1080-fragmented.mp4",
+                   "mediaType" => "video/mp4",
+                   "type" => "Link"
+                 }
+               ]
+             }
+           ]
+
+    assert object.data["url"] ==
+             "https://peertube.stream/videos/watch/abece3c3-b9c6-47f4-8040-f3eed8c602e6"
+  end
 end
index 7da0a83807747bf5c8114cb6661323536649b7f0..1328d6225eb2b78239e8ead2de770ce4d77b2222 100644 (file)
@@ -275,6 +275,15 @@ defmodule HttpRequestMock do
      }}
   end
 
+  def get("https://peertube.stream/accounts/createurs", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/peertube/actor-person.json"),
+       headers: activitypub_object_headers()
+     }}
+  end
+
   def get("https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3", _, _, _) do
     {:ok,
      %Tesla.Env{