giant massive dep upgrade and dialyxir-found error emporium (#371)
[akkoma] / lib / pleroma / helpers / media_helper.ex
index 5ac75b326b146fca0a6ccd3b65611577547bd971..cb95d0e68c45dee9c5aa4a02919c4485ddd3f70e 100644 (file)
@@ -1,5 +1,5 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Helpers.MediaHelper do
@@ -7,13 +7,24 @@ defmodule Pleroma.Helpers.MediaHelper do
   Handles common media-related operations.
   """
 
-  @tmp_base "/tmp/pleroma-media_preview-pipe"
+  alias Pleroma.HTTP
+
+  require Logger
+
+  def missing_dependencies do
+    Enum.reduce([imagemagick: "convert", ffmpeg: "ffmpeg"], [], fn {sym, executable}, acc ->
+      if Pleroma.Utils.command_available?(executable) do
+        acc
+      else
+        [sym | acc]
+      end
+    end)
+  end
 
   def image_resize(url, options) do
     with executable when is_binary(executable) <- System.find_executable("convert"),
          {:ok, args} <- prepare_image_resize_args(options),
-         url = Pleroma.Web.MediaProxy.url(url),
-         {:ok, env} <- Pleroma.HTTP.get(url),
+         {:ok, env} <- HTTP.get(url, [], []),
          {:ok, fifo_path} <- mkfifo() do
       args = List.flatten([fifo_path, args])
       run_fifo(fifo_path, env, executable, args)
@@ -23,6 +34,23 @@ defmodule Pleroma.Helpers.MediaHelper do
     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, ">"])
@@ -42,10 +70,10 @@ defmodule Pleroma.Helpers.MediaHelper do
 
   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"),
-         url = Pleroma.Web.MediaProxy.url(url),
-         {:ok, env} <- Pleroma.HTTP.get(url),
+         {:ok, env} <- HTTP.get(url, [], []),
          {:ok, fifo_path} <- mkfifo(),
          args = [
            "-y",
@@ -76,17 +104,17 @@ defmodule Pleroma.Helpers.MediaHelper do
         args: args
       ])
 
-    fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out])
+    fifo = File.open!(fifo_path, [:append, :binary])
     fix = Pleroma.Helpers.QtFastStart.fix(env.body)
-    true = Port.command(fifo, fix)
-    :erlang.port_close(fifo)
+    IO.binwrite(fifo, fix)
+    File.close(fifo)
     loop_recv(pid)
   after
     File.rm(fifo_path)
   end
 
-  defp mkfifo() do
-    path = "#{@tmp_base}#{to_charlist(:erlang.phash2(self()))}"
+  defp mkfifo do
+    path = Path.join(System.tmp_dir!(), "pleroma-media-preview-pipe-#{Ecto.UUID.generate()}")
 
     case System.cmd("mkfifo", [path]) do
       {_, 0} ->