total rebase
[anni] / lib / pleroma / upload / filter / analyze_metadata.ex
old mode 100755 (executable)
new mode 100644 (file)
index 9a76a99..7ee6432
@@ -8,27 +8,28 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadata do
   """
   require Logger
 
+  alias Vix.Vips.Image
+  alias Vix.Vips.Operation
+
   @behaviour Pleroma.Upload.Filter
 
   @spec filter(Pleroma.Upload.t()) ::
           {:ok, :filtered, Pleroma.Upload.t()} | {:ok, :noop} | {:error, String.t()}
   def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _} = upload) do
     try do
-      image =
-        file
-        |> Mogrify.open()
-        |> Mogrify.verbose()
+      {:ok, image} = Image.new_from_file(file)
+      {width, height} = {Image.width(image), Image.height(image)}
 
       upload =
         upload
-        |> Map.put(:width, image.width)
-        |> Map.put(:height, image.height)
-        |> Map.put(:blurhash, get_blurhash(file))
+        |> Map.put(:width, width)
+        |> Map.put(:height, height)
+        |> Map.put(:blurhash, get_blurhash(image))
 
       {:ok, :filtered, upload}
     rescue
       e in ErlangError ->
-        Logger.warn("#{__MODULE__}: #{inspect(e)}")
+        Logger.warning("#{__MODULE__}: #{inspect(e)}")
         {:ok, :noop}
     end
   end
@@ -45,7 +46,7 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadata do
       {:ok, :filtered, upload}
     rescue
       e in ErlangError ->
-        Logger.warn("#{__MODULE__}: #{inspect(e)}")
+        Logger.warning("#{__MODULE__}: #{inspect(e)}")
         {:ok, :noop}
     end
   end
@@ -53,7 +54,7 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadata do
   def filter(_), do: {:ok, :noop}
 
   defp get_blurhash(file) do
-    with {:ok, blurhash} <- :eblurhash.magick(file) do
+    with {:ok, blurhash} <- vips_blurhash(file) do
       blurhash
     else
       _ -> nil
@@ -77,7 +78,28 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadata do
       %{width: width, height: height}
     else
       nil -> {:error, {:ffprobe, :command_not_found}}
-      {:error, _} = error -> error
+      error -> {:error, error}
+    end
+  end
+
+  defp vips_blurhash(%Vix.Vips.Image{} = image) do
+    with {:ok, resized_image} <- Operation.thumbnail_image(image, 100),
+         {height, width} <- {Image.height(resized_image), Image.width(resized_image)},
+         max <- max(height, width),
+         {x, y} <- {max(round(width * 5 / max), 1), max(round(height * 5 / max), 1)} do
+      {:ok, rgb} =
+        if Image.has_alpha?(resized_image) do
+          # remove alpha channel
+          resized_image
+          |> Operation.extract_band!(0, n: 3)
+          |> Image.write_to_binary()
+        else
+          Image.write_to_binary(resized_image)
+        end
+
+      Blurhash.encode(rgb, width, height, x, y)
+    else
+      _ -> nil
     end
   end
 end