move to 2.5.5
[anni] / lib / pleroma / upload / filter / mogrify.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Upload.Filter.Mogrify do
6   @behaviour Pleroma.Upload.Filter
7
8   @type conversion :: action :: String.t() | {action :: String.t(), opts :: String.t()}
9   @type conversions :: conversion() | [conversion()]
10
11   @spec filter(Pleroma.Upload.t()) :: {:ok, :atom} | {:error, String.t()}
12   def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
13     try do
14       do_filter(file, Pleroma.Config.get!([__MODULE__, :args]))
15       {:ok, :filtered}
16     rescue
17       e in ErlangError ->
18         {:error, "#{__MODULE__}: #{inspect(e)}"}
19     end
20   end
21
22   def filter(_), do: {:ok, :noop}
23
24   def do_filter(file, filters) do
25     file
26     |> Mogrify.open()
27     |> mogrify_filter(filters)
28     |> Mogrify.save(in_place: true)
29   end
30
31   defp mogrify_filter(mogrify, nil), do: mogrify
32
33   defp mogrify_filter(mogrify, [filter | rest]) do
34     mogrify
35     |> mogrify_filter(filter)
36     |> mogrify_filter(rest)
37   end
38
39   defp mogrify_filter(mogrify, []), do: mogrify
40
41   defp mogrify_filter(mogrify, {action, options}) do
42     Mogrify.custom(mogrify, action, options)
43   end
44
45   defp mogrify_filter(mogrify, action) when is_binary(action) do
46     Mogrify.custom(mogrify, action)
47   end
48 end