summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMark Felder <feld@feld.me>2022-11-10 11:07:49 -0500
committerMark Felder <feld@feld.me>2023-11-13 15:41:39 -0500
commit481b6ac0d5c610e840fc4b88a357efa28f510ab8 (patch)
tree507edd3f01412e78380b0609b9e15963e679641d /lib
parent13baba90f6deb27b0d6301a705db753cc32bb141 (diff)
downloadpleroma-481b6ac0d5c610e840fc4b88a357efa28f510ab8.tar.gz
pleroma-481b6ac0d5c610e840fc4b88a357efa28f510ab8.zip
Add Pleroma.Upload.Filter.HeifToJpeg based on vips
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/upload/filter/heif_to_jpeg.ex36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/pleroma/upload/filter/heif_to_jpeg.ex b/lib/pleroma/upload/filter/heif_to_jpeg.ex
new file mode 100644
index 000000000..a2095ba01
--- /dev/null
+++ b/lib/pleroma/upload/filter/heif_to_jpeg.ex
@@ -0,0 +1,36 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Upload.Filter.HeifToJpeg do
+ @behaviour Pleroma.Upload.Filter
+ alias Pleroma.Upload
+ alias Vix.Vips.Operation
+
+ @type conversion :: action :: String.t() | {action :: String.t(), opts :: String.t()}
+ @type conversions :: conversion() | [conversion()]
+
+ @spec filter(Pleroma.Upload.t()) :: {:ok, :atom} | {:error, String.t()}
+ def filter(%Pleroma.Upload{content_type: "image/avif"} = upload), do: apply_filter(upload)
+ def filter(%Pleroma.Upload{content_type: "image/heic"} = upload), do: apply_filter(upload)
+ def filter(%Pleroma.Upload{content_type: "image/heif"} = upload), do: apply_filter(upload)
+
+ def filter(_), do: {:ok, :noop}
+
+ defp apply_filter(%Pleroma.Upload{name: name, path: path, tempfile: tempfile} = upload) do
+ ext = String.split(path, ".") |> List.last()
+
+ try do
+ name = name |> String.replace_suffix(ext, "jpg")
+ path = path |> String.replace_suffix(ext, "jpg")
+ {:ok, {vixdata, _vixflags}} = Operation.heifload(tempfile)
+ {:ok, jpegdata} = Operation.jpegsave_buffer(vixdata)
+ :ok = File.write(tempfile, jpegdata)
+
+ {:ok, :filtered, %Upload{upload | name: name, path: path, content_type: "image/jpeg"}}
+ rescue
+ e in ErlangError ->
+ {:error, "#{__MODULE__}: #{inspect(e)}"}
+ end
+ end
+end