diff options
| -rw-r--r-- | Dockerfile | 4 | ||||
| -rw-r--r-- | lib/pleroma/helpers/media_helper.ex | 57 | ||||
| -rw-r--r-- | mix.exs | 1 | ||||
| -rw-r--r-- | mix.lock | 1 | 
4 files changed, 17 insertions, 46 deletions
diff --git a/Dockerfile b/Dockerfile index d2a3e3573..aba6ebbf1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ COPY . .  ENV MIX_ENV=prod -RUN apk add git gcc g++ musl-dev make cmake file-dev &&\ +RUN apk add git gcc g++ musl-dev make cmake file-dev vips &&\  	echo "import Config" > config/prod.secret.exs &&\  	mix local.hex --force &&\  	mix local.rebar --force &&\ @@ -37,7 +37,7 @@ ARG HOME=/opt/pleroma  ARG DATA=/var/lib/pleroma  RUN apk update &&\ -	apk add exiftool ffmpeg imagemagick libmagic ncurses postgresql-client &&\ +	apk add exiftool ffmpeg vips libmagic ncurses postgresql-client &&\  	adduser --system --shell /bin/false --home ${HOME} pleroma &&\  	mkdir -p ${DATA}/uploads &&\  	mkdir -p ${DATA}/static &&\ diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 24c845fcd..07dfea55b 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -8,11 +8,12 @@ defmodule Pleroma.Helpers.MediaHelper do    """    alias Pleroma.HTTP +  alias Vix.Vips.Operation    require Logger    def missing_dependencies do -    Enum.reduce([imagemagick: "convert", ffmpeg: "ffmpeg"], [], fn {sym, executable}, acc -> +    Enum.reduce([ffmpeg: "ffmpeg"], [], fn {sym, executable}, acc ->        if Pleroma.Utils.command_available?(executable) do          acc        else @@ -22,54 +23,22 @@ defmodule Pleroma.Helpers.MediaHelper do    end    def image_resize(url, options) do -    with executable when is_binary(executable) <- System.find_executable("convert"), -         {:ok, args} <- prepare_image_resize_args(options), -         {:ok, env} <- HTTP.get(url, [], pool: :media), -         {:ok, fifo_path} <- mkfifo() do -      args = List.flatten([fifo_path, args]) -      run_fifo(fifo_path, env, executable, args) +    with {:ok, env} <- HTTP.get(url, [], pool: :media), +         {:ok, resized} <- +           Operation.thumbnail_buffer(env.body, options.max_width, +             height: options.max_height, +             size: :VIPS_SIZE_DOWN +           ) do +      if options[:format] == "png" do +        Operation.pngsave_buffer(resized, Q: options[:quality]) +      else +        Operation.jpegsave_buffer(resized, Q: options[:quality], interlace: true) +      end      else -      nil -> {:error, {:convert, :command_not_found}}        {:error, _} = error -> error      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, ">"]) - -    args = [ -      "-interlace", -      "Plane", -      "-resize", -      resize, -      "-quality", -      to_string(quality), -      "jpg:-" -    ] - -    {:ok, args} -  end - -  defp prepare_image_resize_args(_), do: {:error, :missing_options} -    # Note: video thumbnail is intentionally not resized (always has original dimensions)    def video_framegrab(url) do      with executable when is_binary(executable) <- System.find_executable("ffmpeg"), @@ -193,6 +193,7 @@ defmodule Pleroma.Mixfile do        {:eblurhash, "~> 1.2.2"},        {:open_api_spex, "~> 3.16"},        {:ecto_psql_extras, "~> 0.6"}, +      {:vix, "~> 0.14.0"},        ## dev & test        {:ex_doc, "~> 0.22", only: :dev, runtime: false}, @@ -132,6 +132,7 @@    "ueberauth": {:hex, :ueberauth, "0.10.5", "806adb703df87e55b5615cf365e809f84c20c68aa8c08ff8a416a5a6644c4b02", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "3efd1f31d490a125c7ed453b926f7c31d78b97b8a854c755f5c40064bf3ac9e1"},    "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},    "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"}, +  "vix": {:hex, :vix, "0.14.0", "f84eaf28191514d385829580db4e1c971e75ecfa771538a40159c18d88340049", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:kino, "~> 0.7", [hex: :kino, repo: "hexpm", optional: true]}], "hexpm", "964003b93351b51d0a5b80d80b3d568da4546e6ecbb1ee0bd0fb0a5c8d6e8cc9"},    "web_push_encryption": {:hex, :web_push_encryption, "0.3.1", "76d0e7375142dfee67391e7690e89f92578889cbcf2879377900b5620ee4708d", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.1", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "4f82b2e57622fb9337559058e8797cb0df7e7c9790793bdc4e40bc895f70e2a2"},    "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"},    "websock_adapter": {:hex, :websock_adapter, "0.5.5", "9dfeee8269b27e958a65b3e235b7e447769f66b5b5925385f5a569269164a210", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "4b977ba4a01918acbf77045ff88de7f6972c2a009213c515a445c48f224ffce9"},  | 
