lib/compresser.ex

defmodule Webp.Compressor do
  @behaviour Phoenix.Digester.Compressor

  require Logger

  def compress_file(file_path, content) do
    valid_extension =
      Path.extname(file_path) in Application.get_env(:webp, :image_extensions, [
        ".png",
        ".jpg",
        ".jpeg"
      ])

    case valid_extension do
      true ->
        compressed_content =
          convert(content, :webp, file_path)

        case compressed_content do
          {:ok, data} ->
            {:ok, data}

          _ ->
            :error
        end

      false ->
        :error
    end
  end

  def file_extensions do
    [".webp"]
  end

  defp convert(content, options, file_path) do
    cond do
      Code.ensure_loaded?(:eimp) and function_exported?(:eimp, :convert, 2) ->
        :eimp.convert(content, options)

      false ->
        location = Application.get_env(:webp, :destination)
        params = %{location: location}
        Webp.convert(file_path, params)
        :error
    end
  end
end