diff options
author | Mark Felder <feld@feld.me> | 2022-11-10 11:07:49 -0500 |
---|---|---|
committer | Mark Felder <feld@feld.me> | 2023-11-13 15:41:39 -0500 |
commit | 481b6ac0d5c610e840fc4b88a357efa28f510ab8 (patch) | |
tree | 507edd3f01412e78380b0609b9e15963e679641d /lib | |
parent | 13baba90f6deb27b0d6301a705db753cc32bb141 (diff) | |
download | pleroma-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.ex | 36 |
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 |