diff options
| author | Mark Felder <feld@FreeBSD.org> | 2020-08-27 12:31:55 -0500 | 
|---|---|---|
| committer | Mark Felder <feld@FreeBSD.org> | 2020-08-27 12:31:55 -0500 | 
| commit | ef9d12fcc500d7429bee0d6ccffe3596434aee52 (patch) | |
| tree | f7506e51a39a8848cbb4b28f06e0f6ff32aa8cb6 /lib | |
| parent | 157ecf402230c0b786f5765dd8b709d45c45974a (diff) | |
| download | pleroma-ef9d12fcc500d7429bee0d6ccffe3596434aee52.tar.gz pleroma-ef9d12fcc500d7429bee0d6ccffe3596434aee52.zip | |
Attempt at supporting video thumbnails via ffmpeg
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/helpers/media_helper.ex | 19 | ||||
| -rw-r--r-- | lib/pleroma/web/media_proxy/media_proxy_controller.ex | 17 | 
2 files changed, 33 insertions, 3 deletions
| diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 0299b16ae..7e1af8bac 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -37,6 +37,25 @@ defmodule Pleroma.Helpers.MediaHelper do    defp prepare_image_resize_args(_), do: {:error, :missing_options} +  def video_framegrab(url) do +    with executable when is_binary(executable) <- System.find_executable("ffmpeg"), +         args = [ +           "-i", "-", +           "-vframes", "1", +           "-f", "mjpeg", +           "-loglevel", "error", +           "-" +         ], +         url = Pleroma.Web.MediaProxy.url(url), +         {:ok, env} <- Pleroma.HTTP.get(url), +         {:ok, fifo_path} <- mkfifo() do +      run_fifo(fifo_path, env, executable, args) +    else +      nil -> {:error, {:ffmpeg, :command_not_found}} +      {:error, _} = error -> error +    end +  end +    defp run_fifo(fifo_path, env, executable, args) do      args = List.flatten([fifo_path, args])      pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 736b7db56..7ac1a97e2 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -78,9 +78,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do    end    defp handle_preview("video/" <> _ = _content_type, conn, url) do -    mediaproxy_url = url |> MediaProxy.url() - -    redirect(conn, external: mediaproxy_url) +    handle_video_preview(conn, url)    end    defp handle_preview(content_type, conn, _url) do @@ -106,6 +104,19 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do      end    end +  defp handle_video_preview(conn, url) do +    with {:ok, thumbnail_binary} <- +           MediaHelper.video_framegrab(url) do +      conn +      |> put_resp_header("content-type", "image/jpeg") +      |> put_resp_header("content-disposition", "inline; filename=\"preview.jpg\"") +      |> send_resp(200, thumbnail_binary) +    else +      _ -> +        send_resp(conn, :failed_dependency, "Can't handle preview.") +    end +  end +    defp thumbnail_max_dimensions(params) do      config = Config.get([:media_preview_proxy], []) | 
