diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/application_requirements.ex | 3 | ||||
| -rw-r--r-- | lib/pleroma/upload/filter/analyze_metadata.ex | 38 | 
2 files changed, 40 insertions, 1 deletions
| diff --git a/lib/pleroma/application_requirements.ex b/lib/pleroma/application_requirements.ex index ee6ee9516..a56311a65 100644 --- a/lib/pleroma/application_requirements.ex +++ b/lib/pleroma/application_requirements.ex @@ -168,7 +168,8 @@ defmodule Pleroma.ApplicationRequirements do        check_filter(Pleroma.Upload.Filter.Mogrify, "mogrify"),        check_filter(Pleroma.Upload.Filter.Mogrifun, "mogrify"),        check_filter(Pleroma.Upload.Filter.AnalyzeMetadata, "mogrify"), -      check_filter(Pleroma.Upload.Filter.AnalyzeMetadata, "convert") +      check_filter(Pleroma.Upload.Filter.AnalyzeMetadata, "convert"), +      check_filter(Pleroma.Upload.Filter.AnalyzeMetadata, "ffprobe")      ]      preview_proxy_commands_status = diff --git a/lib/pleroma/upload/filter/analyze_metadata.ex b/lib/pleroma/upload/filter/analyze_metadata.ex index 8c23076d4..c89c30fc1 100644 --- a/lib/pleroma/upload/filter/analyze_metadata.ex +++ b/lib/pleroma/upload/filter/analyze_metadata.ex @@ -33,6 +33,23 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadata do      end    end +  def filter(%Pleroma.Upload{tempfile: file, content_type: "video" <> _} = upload) do +    try do +      result = media_dimensions(file) + +      upload = +        upload +        |> Map.put(:width, result.width) +        |> Map.put(:height, result.height) + +      {:ok, :filtered, upload} +    rescue +      e in ErlangError -> +        Logger.warn("#{__MODULE__}: #{inspect(e)}") +        {:ok, :noop} +    end +  end +    def filter(_), do: {:ok, :noop}    defp get_blurhash(file) do @@ -42,4 +59,25 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadata do        _ -> nil      end    end + +  defp media_dimensions(file) do +    with executable when is_binary(executable) <- System.find_executable("ffprobe"), +         args = [ +           "-v", +           "error", +           "-show_entries", +           "stream=width,height", +           "-of", +           "csv=p=0:s=x", +           file +         ], +         {result, 0} <- System.cmd(executable, args), +         [width, height] <- +           String.split(String.trim(result), "x") |> Enum.map(&String.to_integer(&1)) do +      %{width: width, height: height} +    else +      nil -> {:error, {:ffprobe, :command_not_found}} +      {:error, _} = error -> error +    end +  end  end | 
