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:
lambda 2018-12-23 14:46:58 +00:00
commit 005b4194ff
7 changed files with 97 additions and 14 deletions

View File

@ -69,8 +69,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def fix_object(object) do def fix_object(object) do
object object
|> fix_actor |> fix_actor
|> fix_attachments
|> fix_url |> fix_url
|> fix_attachments
|> fix_context |> fix_context
|> fix_in_reply_to |> fix_in_reply_to
|> fix_emoji |> fix_emoji
@ -170,8 +170,14 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
attachments = attachments =
attachment attachment
|> Enum.map(fn data -> |> Enum.map(fn data ->
url = [%{"type" => "Link", "mediaType" => data["mediaType"], "href" => data["url"]}] media_type = data["mediaType"] || data["mimeType"]
Map.put(data, "url", url) href = data["url"] || data["href"]
url = [%{"type" => "Link", "mediaType" => media_type, "href" => href}]
data
|> Map.put("mediaType", media_type)
|> Map.put("url", url)
end) end)
object object
@ -190,7 +196,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> Map.put("url", url["href"]) |> Map.put("url", url["href"])
end 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) first_element = Enum.at(url, 0)
url_string = url_string =

View File

@ -106,7 +106,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || []) favorited = opts[:for] && opts[:for].ap_id in (object["likes"] || [])
attachment_data = object["attachment"] || [] 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) attachments = render_many(attachment_data, StatusView, "attachment.json", as: :attachment)
created_at = Utils.to_masto_date(object["published"]) created_at = Utils.to_masto_date(object["published"])

View File

@ -171,14 +171,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
HTML.filter_tags(content, User.html_filter_policy(opts[:for])) HTML.filter_tags(content, User.html_filter_policy(opts[:for]))
|> Formatter.emojify(object["emoji"]) |> Formatter.emojify(object["emoji"])
video = attachments = object["attachment"] || []
if object["type"] == "Video" do
[object]
else
[]
end
attachments = (object["attachment"] || []) ++ video
reply_parent = Activity.get_in_reply_to_activity(activity) reply_parent = Activity.get_in_reply_to_activity(activity)

View File

@ -303,7 +303,8 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
{summary, content} {summary, content}
end 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"] summary = object["name"] || object["summary"]
content = content =

View File

@ -684,6 +684,36 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
:error = Transmogrifier.handle_incoming(data) :error = Transmogrifier.handle_incoming(data)
end 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 end
describe "prepare outgoing" do describe "prepare outgoing" do

View File

@ -5,6 +5,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
alias Pleroma.User alias Pleroma.User
alias Pleroma.Web.OStatus alias Pleroma.Web.OStatus
alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Activity
import Pleroma.Factory import Pleroma.Factory
import Tesla.Mock import Tesla.Mock
@ -157,6 +159,22 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert represented[:emojis] == [] assert represented[:emojis] == []
end 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 describe "build_tags/1" do
test "it returns a a dictionary tags" do test "it returns a a dictionary tags" do
object_tags = [ object_tags = [

View File

@ -12,6 +12,13 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ActivityPub
import Pleroma.Factory import Pleroma.Factory
import Tesla.Mock
setup do
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
import Mock import Mock
test "a create activity with a html status" do test "a create activity with a html status" do
@ -258,4 +265,18 @@ defmodule Pleroma.Web.TwitterAPI.ActivityViewTest do
assert result == expected assert result == expected
end 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 end