diff options
| -rw-r--r-- | lib/pleroma/upload.ex | 9 | ||||
| -rw-r--r-- | lib/pleroma/upload/filter/set_meta.ex | 36 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/status_view.ex | 16 | ||||
| -rw-r--r-- | test/pleroma/upload/filter/set_meta_test.exs | 19 | ||||
| -rw-r--r-- | test/pleroma/web/mastodon_api/views/status_view_test.exs | 5 | 
5 files changed, 83 insertions, 2 deletions
diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 654711351..4d58abd48 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -23,6 +23,8 @@ defmodule Pleroma.Upload do      is once created permanent and changing it (especially in uploaders) is probably a bad idea!    * `:tempfile` - path to the temporary file. Prefer in-place changes on the file rather than changing the    path as the temporary file is also tracked by `Plug.Upload{}` and automatically deleted once the request is over. +  * `:width` - width of the media in pixels +  * `:height` - height of the media in pixels    Related behaviors: @@ -32,6 +34,7 @@ defmodule Pleroma.Upload do    """    alias Ecto.UUID    alias Pleroma.Config +  alias Pleroma.Maps    require Logger    @type source :: @@ -53,9 +56,11 @@ defmodule Pleroma.Upload do            name: String.t(),            tempfile: String.t(),            content_type: String.t(), +          width: integer(), +          height: integer(),            path: String.t()          } -  defstruct [:id, :name, :tempfile, :content_type, :path] +  defstruct [:id, :name, :tempfile, :content_type, :width, :height, :path]    defp get_description(opts, upload) do      case {opts[:description], Pleroma.Config.get([Pleroma.Upload, :default_description])} do @@ -89,6 +94,8 @@ defmodule Pleroma.Upload do               "mediaType" => upload.content_type,               "href" => url_from_spec(upload, opts.base_url, url_spec)             } +           |> Maps.put_if_present("width", upload.width) +           |> Maps.put_if_present("height", upload.height)           ],           "name" => description         }} diff --git a/lib/pleroma/upload/filter/set_meta.ex b/lib/pleroma/upload/filter/set_meta.ex new file mode 100644 index 000000000..cccb6c371 --- /dev/null +++ b/lib/pleroma/upload/filter/set_meta.ex @@ -0,0 +1,36 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Upload.Filter.SetMeta do +  @moduledoc """ +  Extracts metadata about the upload, such as width/height +  """ +  require Logger + +  @behaviour Pleroma.Upload.Filter + +  @spec filter(Pleroma.Upload.t()) :: +          {:ok, :filtered, Pleroma.Upload.t()} | {:ok, :noop} | {:error, String.t()} +  def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _} = upload) do +    try do +      image = +        file +        |> Mogrify.open() +        |> Mogrify.verbose() + +      upload = +        upload +        |> Map.put(:width, image.width) +        |> Map.put(:height, image.height) + +      {:ok, :filtered, upload} +    rescue +      e in ErlangError -> +        Logger.warn("#{__MODULE__}: #{inspect(e)}") +        {:ok, :noop} +    end +  end + +  def filter(_), do: {:ok, :noop} +end diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index bac897a57..5dbdc309e 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -426,10 +426,26 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do        type: type,        description: attachment["name"],        pleroma: %{mime_type: media_type}, +      meta: render("attachment_meta.json", %{attachment: attachment}),        blurhash: attachment["blurhash"]      }    end +  def render("attachment_meta.json", %{ +        attachment: %{"url" => [%{"width" => width, "height" => height} | _]} +      }) +      when is_integer(width) and is_integer(height) do +    %{ +      original: %{ +        width: width, +        height: height, +        aspect: width / height +      } +    } +  end + +  def render("attachment_meta.json", _), do: %{} +    def render("context.json", %{activity: activity, activities: activities, user: user}) do      %{ancestors: ancestors, descendants: descendants} =        activities diff --git a/test/pleroma/upload/filter/set_meta_test.exs b/test/pleroma/upload/filter/set_meta_test.exs new file mode 100644 index 000000000..650e527b4 --- /dev/null +++ b/test/pleroma/upload/filter/set_meta_test.exs @@ -0,0 +1,19 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Upload.Filter.SetMetaTest do +  use Pleroma.DataCase, async: true +  alias Pleroma.Upload.Filter.SetMeta + +  test "adds the image dimensions" do +    upload = %Pleroma.Upload{ +      name: "an… image.jpg", +      content_type: "image/jpeg", +      path: Path.absname("test/fixtures/image.jpg"), +      tempfile: Path.absname("test/fixtures/image.jpg") +    } + +    assert {:ok, :filtered, %{width: 1024, height: 768}} = SetMeta.filter(upload) +  end +end diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs index 2de3afc4f..e6c37e782 100644 --- a/test/pleroma/web/mastodon_api/views/status_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs @@ -458,7 +458,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        "url" => [          %{            "mediaType" => "image/png", -          "href" => "someurl" +          "href" => "someurl", +          "width" => 200, +          "height" => 100          }        ],        "blurhash" => "UJJ8X[xYW,%Jtq%NNFbXB5j]IVM|9GV=WHRn", @@ -474,6 +476,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do        text_url: "someurl",        description: nil,        pleroma: %{mime_type: "image/png"}, +      meta: %{original: %{width: 200, height: 100, aspect: 2}},        blurhash: "UJJ8X[xYW,%Jtq%NNFbXB5j]IVM|9GV=WHRn"      }  | 
