[#2497] Added support for :eimp for image resizing.

This commit is contained in:
Ivan Tashkinov 2020-05-14 20:18:31 +03:00
parent 1b23acf164
commit f1f588fd52
3 changed files with 56 additions and 14 deletions

View file

@ -393,7 +393,9 @@
# Note: media preview proxy depends on media proxy to be enabled # Note: media preview proxy depends on media proxy to be enabled
config :pleroma, :media_preview_proxy, config :pleroma, :media_preview_proxy,
enabled: false, enabled: false,
limit_dimensions: "400x200", enable_eimp: true,
thumbnail_max_width: 400,
thumbnail_max_height: 200,
proxy_opts: [ proxy_opts: [
head_request_max_read_duration: 5_000, head_request_max_read_duration: 5_000,
max_read_duration: 10_000 max_read_duration: 10_000

View file

@ -62,24 +62,64 @@ defp handle_preview(conn, url) do
end end
end end
defp thumbnail_max_dimensions(params) do
config = Config.get([:media_preview_proxy], [])
thumbnail_max_width =
if w = params["thumbnail_max_width"] do
String.to_integer(w)
else
Keyword.fetch!(config, :thumbnail_max_width)
end
thumbnail_max_height =
if h = params["thumbnail_max_height"] do
String.to_integer(h)
else
Keyword.fetch!(config, :thumbnail_max_height)
end
{thumbnail_max_width, thumbnail_max_height}
end
defp thumbnail_binary(url, body, params) do
{thumbnail_max_width, thumbnail_max_height} = thumbnail_max_dimensions(params)
with true <- Config.get([:media_preview_proxy, :enable_eimp]),
{:ok, [type: image_type, width: source_width, height: source_height]} <-
:eimp.identify(body),
scale_factor <-
Enum.max([source_width / thumbnail_max_width, source_height / thumbnail_max_height]),
{:ok, thumbnail_binary} =
:eimp.convert(body, image_type, [
{:scale, {round(source_width / scale_factor), round(source_height / scale_factor)}}
]) do
{:ok, thumbnail_binary}
else
_ ->
mogrify_dimensions = "#{thumbnail_max_width}x#{thumbnail_max_height}"
with {:ok, path} <- MogrifyHelper.store_as_temporary_file(url, body),
%Mogrify.Image{} <-
MogrifyHelper.in_place_resize_to_limit(path, mogrify_dimensions),
{:ok, thumbnail_binary} <- File.read(path),
_ <- File.rm(path) do
{:ok, thumbnail_binary}
else
_ -> :error
end
end
end
defp handle_preview("image/" <> _ = content_type, %{params: params} = conn, url) do defp handle_preview("image/" <> _ = content_type, %{params: params} = conn, url) do
with {:ok, %{status: status, body: body}} when status in 200..299 <- with {:ok, %{status: status, body: image_contents}} when status in 200..299 <-
url url
|> MediaProxy.url() |> MediaProxy.url()
|> Tesla.get(opts: [adapter: [timeout: preview_timeout()]]), |> Tesla.get(opts: [adapter: [timeout: preview_timeout()]]),
{:ok, path} <- MogrifyHelper.store_as_temporary_file(url, body), {:ok, thumbnail_binary} <- thumbnail_binary(url, image_contents, params) do
resize_dimensions <-
Map.get(
params,
"limit_dimensions",
Config.get([:media_preview_proxy, :limit_dimensions])
),
%Mogrify.Image{} <- MogrifyHelper.in_place_resize_to_limit(path, resize_dimensions),
{:ok, image_binary} <- File.read(path),
_ <- File.rm(path) do
conn conn
|> put_resp_header("content-type", content_type) |> put_resp_header("content-type", content_type)
|> send_resp(200, image_binary) |> send_resp(200, thumbnail_binary)
else else
{_, %{status: _}} -> {_, %{status: _}} ->
send_resp(conn, :failed_dependency, "Can't fetch the image.") send_resp(conn, :failed_dependency, "Can't fetch the image.")

View file

@ -139,7 +139,7 @@ defp deps do
github: "ninenines/gun", ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc", override: true}, github: "ninenines/gun", ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc", override: true},
{:jason, "~> 1.0"}, {:jason, "~> 1.0"},
{:mogrify, "~> 0.6.1"}, {:mogrify, "~> 0.6.1"},
{:eimp, ">= 0.0.0"}, {:eimp, "~> 1.0.14"},
{:ex_aws, "~> 2.1"}, {:ex_aws, "~> 2.1"},
{:ex_aws_s3, "~> 2.0"}, {:ex_aws_s3, "~> 2.0"},
{:sweet_xml, "~> 0.6.6"}, {:sweet_xml, "~> 0.6.6"},