aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMark Felder <feld@FreeBSD.org>2020-08-30 09:17:24 -0500
committerMark Felder <feld@FreeBSD.org>2020-08-30 09:17:24 -0500
commit2d2af75777ae468fb08a2b09dc5af4636106a04b (patch)
tree9b2154632c34f55e972c3baffa5c676b529964fe /lib
parent24d522c3b366b54b23bebaf07371145d50820d4a (diff)
downloadpleroma-2d2af75777ae468fb08a2b09dc5af4636106a04b.tar.gz
Support PNG previews to preserve alpha channels
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/helpers/media_helper.ex17
-rw-r--r--lib/pleroma/web/media_proxy/media_proxy_controller.ex32
2 files changed, 47 insertions, 2 deletions
diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex
index 5ac75b326..d8a6db4e1 100644
--- a/lib/pleroma/helpers/media_helper.ex
+++ b/lib/pleroma/helpers/media_helper.ex
@@ -23,6 +23,23 @@ defmodule Pleroma.Helpers.MediaHelper do
end
end
+ defp prepare_image_resize_args(
+ %{max_width: max_width, max_height: max_height, format: "png"} = options
+ ) do
+ quality = options[:quality] || 85
+ resize = Enum.join([max_width, "x", max_height, ">"])
+
+ args = [
+ "-resize",
+ resize,
+ "-quality",
+ to_string(quality),
+ "png:-"
+ ]
+
+ {:ok, args}
+ end
+
defp prepare_image_resize_args(%{max_width: max_width, max_height: max_height} = options) do
quality = options[:quality] || 85
resize = Enum.join([max_width, "x", max_height, ">"])
diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex
index 411dc95d0..94fae6cac 100644
--- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex
+++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex
@@ -76,8 +76,12 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
redirect(conn, external: mediaproxy_url)
end
+ defp handle_preview("image/png" <> _ = _content_type, conn, url) do
+ handle_png_preview(conn, url)
+ end
+
defp handle_preview("image/" <> _ = _content_type, conn, url) do
- handle_image_preview(conn, url)
+ handle_jpeg_preview(conn, url)
end
defp handle_preview("video/" <> _ = _content_type, conn, url) do
@@ -88,7 +92,31 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.")
end
- defp handle_image_preview(%{params: params} = conn, url) do
+ defp handle_png_preview(%{params: params} = conn, url) do
+ quality = Config.get!([:media_preview_proxy, :image_quality])
+
+ with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params),
+ {:ok, thumbnail_binary} <-
+ MediaHelper.image_resize(
+ url,
+ %{
+ max_width: thumbnail_max_width,
+ max_height: thumbnail_max_height,
+ quality: quality,
+ format: "png"
+ }
+ ) do
+ conn
+ |> put_resp_header("content-type", "image/png")
+ |> put_resp_header("content-disposition", "inline; filename=\"preview.png\"")
+ |> send_resp(200, thumbnail_binary)
+ else
+ _ ->
+ send_resp(conn, :failed_dependency, "Can't handle preview.")
+ end
+ end
+
+ defp handle_jpeg_preview(%{params: params} = conn, url) do
quality = Config.get!([:media_preview_proxy, :image_quality])
with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params),