aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorraeno <just.raeno@gmail.com>2018-12-10 23:08:02 +0400
committerraeno <just.raeno@gmail.com>2018-12-13 22:17:53 +0100
commit8902942128e3aee814c215d700e2eaee21b491e9 (patch)
treed7a4cacd3d91a89550589e46ea2faefbf8f5e491 /lib
parent21afdf6d9966265de95df860d90d250c76bdbe08 (diff)
downloadpleroma-8902942128e3aee814c215d700e2eaee21b491e9.tar.gz
WIP. Implement oembed route and handle both json/xml for "Note" type activity
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/formatter.ex16
-rw-r--r--lib/pleroma/web/oembed/activity_representer.ex25
-rw-r--r--lib/pleroma/web/oembed/oembed.ex23
-rw-r--r--lib/pleroma/web/oembed/oembed_controller.ex26
-rw-r--r--lib/pleroma/web/oembed/views/note_view.ex21
-rw-r--r--lib/pleroma/web/ostatus/ostatus.ex2
-rw-r--r--lib/pleroma/web/ostatus/ostatus_controller.ex1
-rw-r--r--lib/pleroma/web/templates/o_embed/note.xml.eex10
8 files changed, 119 insertions, 5 deletions
diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex
index 133683794..b63f592fb 100644
--- a/lib/pleroma/formatter.ex
+++ b/lib/pleroma/formatter.ex
@@ -163,4 +163,20 @@ defmodule Pleroma.Formatter do
String.replace(result_text, uuid, replacement)
end)
end
+
+ def truncate(text, opts \\ []) do
+ max_length = opts[:max_length] || 200
+ omission = opts[:omission] || "..."
+
+ cond do
+ not String.valid?(text) ->
+ text
+ String.length(text) < max_length ->
+ text
+ true ->
+ length_with_omission = max_length - String.length(omission)
+
+ "#{String.slice(text, 0, length_with_omission)}#{omission}"
+ end
+ end
end
diff --git a/lib/pleroma/web/oembed/activity_representer.ex b/lib/pleroma/web/oembed/activity_representer.ex
new file mode 100644
index 000000000..0e65090ee
--- /dev/null
+++ b/lib/pleroma/web/oembed/activity_representer.ex
@@ -0,0 +1,25 @@
+defmodule Pleroma.Web.OEmbed.ActivityRepresenter do
+ alias Pleroma.{Activity, User, Object}
+ alias Pleroma.Web.OStatus.UserRepresenter
+
+ def to_simple_form(%{data: %{"object" => %{"type" => "Note"}}} = activity, user, with_author) do
+ h = fn str -> [to_charlist(str)] end
+
+ content = if activity.data["object"]["content"] do
+ [{:content, [], h.(activity.data["object"]["content"])}]
+ else
+ []
+ end
+
+ [
+ {:version, ["1.0"]},
+ {:type, ["link"]},
+ ] ++ content
+
+ end
+
+ def wrap_with_entry(simple_form) do
+ [ { :oembed, [], simple_form } ]
+ end
+
+end
diff --git a/lib/pleroma/web/oembed/oembed.ex b/lib/pleroma/web/oembed/oembed.ex
new file mode 100644
index 000000000..a52aa6004
--- /dev/null
+++ b/lib/pleroma/web/oembed/oembed.ex
@@ -0,0 +1,23 @@
+defmodule Pleroma.Web.OEmbed do
+ alias Pleroma.{Repo, Object, Activity, User}
+ alias Pleroma.Formatter
+
+ def recognize_path(url) do
+ details = Regex.named_captures(~r/.+\/(?<route>.+)\/(?<id>\w+).*$/, url)
+
+ case details do
+ %{ "route" => "notice", "id" => id } ->
+ %{type: :activity, entity: Repo.get(Activity, id) }
+ %{ "route" => "users", "id" => nickname } ->
+ %{type: :user, entity: User.get_by_nickname(nickname) }
+ _ ->
+ { :error, "no matching route"}
+ end
+ end
+
+ def truncated_content(activity) do
+ content = activity.data['object']['content']
+ IO.puts(content)
+ Formatter.truncate(content)
+ end
+end
diff --git a/lib/pleroma/web/oembed/oembed_controller.ex b/lib/pleroma/web/oembed/oembed_controller.ex
index e9030049e..d63d3c58c 100644
--- a/lib/pleroma/web/oembed/oembed_controller.ex
+++ b/lib/pleroma/web/oembed/oembed_controller.ex
@@ -1,11 +1,31 @@
defmodule Pleroma.Web.OEmbed.OEmbedController do
use Pleroma.Web, :controller
+ alias Pleroma.Web.OEmbed
+ alias Pleroma.Web.OEmbed.{NoteView, ActivityRepresenter}
+ alias Pleroma.Web.MediaProxy
alias Pleroma.Repo
+ alias Pleroma.User
- def url(conn, %{ "url" => uri} ) do
+ def url(conn, %{ "url" => url} ) do
+ case format = get_format(conn) do
+ _ ->
+ result = OEmbed.recognize_path(url)
+ render_oembed(conn, format, result)
+ end
+ end
+
+ def render_oembed(conn, format \\ "json", result)
+ def render_oembed(conn, "json", result) do
conn
|> put_resp_content_type("application/json")
- |> json(%{ status: "success"} )
+ |> json(NoteView.render("note.json", result))
+ end
+
+ def render_oembed(conn, "xml", result) do
+ conn
+ |> put_resp_content_type("application/xml")
+ |> NoteView.render("note.json", result)
+
end
-end \ No newline at end of file
+end
diff --git a/lib/pleroma/web/oembed/views/note_view.ex b/lib/pleroma/web/oembed/views/note_view.ex
new file mode 100644
index 000000000..ecdabc04b
--- /dev/null
+++ b/lib/pleroma/web/oembed/views/note_view.ex
@@ -0,0 +1,21 @@
+defmodule Pleroma.Web.OEmbed.NoteView do
+ use Pleroma.Web, :view
+ alias Pleroma.{User, Activity}
+ alias Pleroma.Web.OEmbed
+
+ def render("note.json", %{type: type, entity: activity }) do
+ oembed_data(activity)
+ end
+
+ def oembed_data(activity) do
+ with %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]),
+ image = User.avatar_url(user) |> MediaProxy.url() do
+ %{
+ version: "1.0",
+ type: "link",
+ title: OEmbed.truncated_content(activity),
+ provider_url: "https://pleroma.site",
+ thumbnail_url: image,
+ }
+ end
+end
diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex
index 8ec92d5f1..0f6756d16 100644
--- a/lib/pleroma/web/ostatus/ostatus.ex
+++ b/lib/pleroma/web/ostatus/ostatus.ex
@@ -31,7 +31,7 @@ defmodule Pleroma.Web.OStatus do
def oembed_links(url) do
Enum.map(["xml", "json"], fn format ->
href = oembed_path(url, format)
- "<link rel=\"alternate\" type=\"application/#{format}+oembed\" href=\"#{href}\""
+ "<link rel=\"alternate\" type=\"application/#{format}+oembed\" href=\"#{href}\">"
end)
|> Enum.join("\r\n")
end
diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex
index 635189619..27ec24f57 100644
--- a/lib/pleroma/web/ostatus/ostatus_controller.ex
+++ b/lib/pleroma/web/ostatus/ostatus_controller.ex
@@ -9,7 +9,6 @@ defmodule Pleroma.Web.OStatus.OStatusController do
alias Pleroma.Web.ActivityPub.ObjectView
alias Pleroma.Web.ActivityPub.ActivityPubController
alias Pleroma.Web.ActivityPub.ActivityPub
- alias Pleroma.Router.Helpers, as: Routes
plug(Pleroma.Web.FederatingPlug when action in [:salmon_incoming])
action_fallback(:errors)
diff --git a/lib/pleroma/web/templates/o_embed/note.xml.eex b/lib/pleroma/web/templates/o_embed/note.xml.eex
new file mode 100644
index 000000000..e814a4cb3
--- /dev/null
+++ b/lib/pleroma/web/templates/o_embed/note.xml.eex
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<oembed>
+ <version>1.0</version>
+ <type>link</type>
+ <author_name>raeno</author_name>
+ <author_url>http://iamcal.com/</author_url>
+ <cache_age>86400</cache_age>
+ <provider_name>iamcal.com</provider_name>
+ <provider_url>http://iamcal.com/</provider_url>
+</oembed> \ No newline at end of file