Merge branch 'bugfix/trans_fix_url_videos' into 'develop'
Fix "url" of Videos in transmogrifier Closes #367 See merge request pleroma/pleroma!459
This commit is contained in:
		
						commit
						005b4194ff
					
				
					 7 changed files with 97 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -69,8 +69,8 @@ def contain_origin_from_id(id, %{"id" => other_id} = _params) do
 | 
			
		|||
  def fix_object(object) do
 | 
			
		||||
    object
 | 
			
		||||
    |> fix_actor
 | 
			
		||||
    |> fix_attachments
 | 
			
		||||
    |> fix_url
 | 
			
		||||
    |> fix_attachments
 | 
			
		||||
    |> fix_context
 | 
			
		||||
    |> fix_in_reply_to
 | 
			
		||||
    |> fix_emoji
 | 
			
		||||
| 
						 | 
				
			
			@ -170,8 +170,14 @@ def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachm
 | 
			
		|||
    attachments =
 | 
			
		||||
      attachment
 | 
			
		||||
      |> Enum.map(fn data ->
 | 
			
		||||
        url = [%{"type" => "Link", "mediaType" => data["mediaType"], "href" => data["url"]}]
 | 
			
		||||
        Map.put(data, "url", url)
 | 
			
		||||
        media_type = data["mediaType"] || data["mimeType"]
 | 
			
		||||
        href = data["url"] || data["href"]
 | 
			
		||||
 | 
			
		||||
        url = [%{"type" => "Link", "mediaType" => media_type, "href" => href}]
 | 
			
		||||
 | 
			
		||||
        data
 | 
			
		||||
        |> Map.put("mediaType", media_type)
 | 
			
		||||
        |> Map.put("url", url)
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
    object
 | 
			
		||||
| 
						 | 
				
			
			@ -190,7 +196,22 @@ def fix_url(%{"url" => url} = object) when is_map(url) do
 | 
			
		|||
    |> Map.put("url", url["href"])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def fix_url(%{"url" => url} = object) when is_list(url) do
 | 
			
		||||
  def fix_url(%{"type" => "Video", "url" => url} = object) when is_list(url) do
 | 
			
		||||
    first_element = Enum.at(url, 0)
 | 
			
		||||
 | 
			
		||||
    link_element =
 | 
			
		||||
      url
 | 
			
		||||
      |> Enum.filter(fn x -> is_map(x) end)
 | 
			
		||||
      |> Enum.filter(fn x -> x["mimeType"] == "text/html" end)
 | 
			
		||||
      |> Enum.at(0)
 | 
			
		||||
 | 
			
		||||
    object
 | 
			
		||||
    |> Map.put("attachment", [first_element])
 | 
			
		||||
    |> Map.put("url", link_element["href"])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def fix_url(%{"type" => object_type, "url" => url} = object)
 | 
			
		||||
      when object_type != "Video" and is_list(url) do
 | 
			
		||||
    first_element = Enum.at(url, 0)
 | 
			
		||||
 | 
			
		||||
    url_string =
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,7 +106,6 @@ def render("status.json", %{activity: %{data: %{"object" => object}} = activity}
 | 
			
		|||
    favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || [])
 | 
			
		||||
 | 
			
		||||
    attachment_data = object["attachment"] || []
 | 
			
		||||
    attachment_data = attachment_data ++ if object["type"] == "Video", do: [object], else: []
 | 
			
		||||
    attachments = render_many(attachment_data, StatusView, "attachment.json", as: :attachment)
 | 
			
		||||
 | 
			
		||||
    created_at = Utils.to_masto_date(object["published"])
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -171,14 +171,7 @@ def to_map(
 | 
			
		|||
      HTML.filter_tags(content, User.html_filter_policy(opts[:for]))
 | 
			
		||||
      |> Formatter.emojify(object["emoji"])
 | 
			
		||||
 | 
			
		||||
    video =
 | 
			
		||||
      if object["type"] == "Video" do
 | 
			
		||||
        [object]
 | 
			
		||||
      else
 | 
			
		||||
        []
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
    attachments = (object["attachment"] || []) ++ video
 | 
			
		||||
    attachments = object["attachment"] || []
 | 
			
		||||
 | 
			
		||||
    reply_parent = Activity.get_in_reply_to_activity(activity)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -303,7 +303,8 @@ def render_content(%{"type" => "Note"} = object) do
 | 
			
		|||
    {summary, content}
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def render_content(%{"type" => object_type} = object) when object_type in ["Article", "Page"] do
 | 
			
		||||
  def render_content(%{"type" => object_type} = object)
 | 
			
		||||
      when object_type in ["Article", "Page", "Video"] do
 | 
			
		||||
    summary = object["name"] || object["summary"]
 | 
			
		||||
 | 
			
		||||
    content =
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -684,6 +684,36 @@ test "it rejects activities without a valid ID" do
 | 
			
		|||
 | 
			
		||||
      :error = Transmogrifier.handle_incoming(data)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    test "it remaps video URLs as attachments if necessary" do
 | 
			
		||||
      {:ok, object} =
 | 
			
		||||
        ActivityPub.fetch_object_from_id(
 | 
			
		||||
          "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
      attachment = %{
 | 
			
		||||
        "type" => "Link",
 | 
			
		||||
        "mediaType" => "video/mp4",
 | 
			
		||||
        "href" =>
 | 
			
		||||
          "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4",
 | 
			
		||||
        "mimeType" => "video/mp4",
 | 
			
		||||
        "size" => 5_015_880,
 | 
			
		||||
        "url" => [
 | 
			
		||||
          %{
 | 
			
		||||
            "href" =>
 | 
			
		||||
              "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4",
 | 
			
		||||
            "mediaType" => "video/mp4",
 | 
			
		||||
            "type" => "Link"
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        "width" => 480
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      assert object.data["url"] ==
 | 
			
		||||
               "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"
 | 
			
		||||
 | 
			
		||||
      assert object.data["attachment"] == [attachment]
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "prepare outgoing" do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
 | 
			
		|||
  alias Pleroma.User
 | 
			
		||||
  alias Pleroma.Web.OStatus
 | 
			
		||||
  alias Pleroma.Web.CommonAPI
 | 
			
		||||
  alias Pleroma.Web.ActivityPub.ActivityPub
 | 
			
		||||
  alias Pleroma.Activity
 | 
			
		||||
  import Pleroma.Factory
 | 
			
		||||
  import Tesla.Mock
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -157,6 +159,22 @@ test "a reblog" do
 | 
			
		|||
    assert represented[:emojis] == []
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  test "a peertube video" do
 | 
			
		||||
    user = insert(:user)
 | 
			
		||||
 | 
			
		||||
    {:ok, object} =
 | 
			
		||||
      ActivityPub.fetch_object_from_id(
 | 
			
		||||
        "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
    %Activity{} = activity = Activity.get_create_activity_by_object_ap_id(object.data["id"])
 | 
			
		||||
 | 
			
		||||
    represented = StatusView.render("status.json", %{for: user, activity: activity})
 | 
			
		||||
 | 
			
		||||
    assert represented[:id] == to_string(activity.id)
 | 
			
		||||
    assert length(represented[:media_attachments]) == 1
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "build_tags/1" do
 | 
			
		||||
    test "it returns a a dictionary tags" do
 | 
			
		||||
      object_tags = [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,13 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
 | 
			
		|||
  alias Pleroma.Web.ActivityPub.ActivityPub
 | 
			
		||||
 | 
			
		||||
  import Pleroma.Factory
 | 
			
		||||
  import Tesla.Mock
 | 
			
		||||
 | 
			
		||||
  setup do
 | 
			
		||||
    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
 | 
			
		||||
    :ok
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  import Mock
 | 
			
		||||
 | 
			
		||||
  test "a create activity with a html status" do
 | 
			
		||||
| 
						 | 
				
			
			@ -258,4 +265,18 @@ test "a delete activity" do
 | 
			
		|||
 | 
			
		||||
    assert result == expected
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  test "a peertube video" do
 | 
			
		||||
    {:ok, object} =
 | 
			
		||||
      ActivityPub.fetch_object_from_id(
 | 
			
		||||
        "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"
 | 
			
		||||
      )
 | 
			
		||||
 | 
			
		||||
    %Activity{} = activity = Activity.get_create_activity_by_object_ap_id(object.data["id"])
 | 
			
		||||
 | 
			
		||||
    result = ActivityView.render("activity.json", activity: activity)
 | 
			
		||||
 | 
			
		||||
    assert length(result["attachments"]) == 1
 | 
			
		||||
    assert result["summary"] == "Friday Night"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue