logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git
commit: 1175023687aa7ce33f6b1ee90acb932cfbd58025
parent 939b3bfe43b8985c93d2dfa15ef600facd8db730
Author: feld <feld@feld.me>
Date:   Tue,  8 Jun 2021 20:30:55 +0000

Merge branch 'metadata-for-all' into 'develop'

Support metadata for video files too

See merge request pleroma/pleroma!3441

Diffstat:

MCHANGELOG.md2+-
Mlib/pleroma/application_requirements.ex3++-
Mlib/pleroma/upload/filter/analyze_metadata.ex38++++++++++++++++++++++++++++++++++++++
Atest/fixtures/video.mp40
Mtest/pleroma/upload/filter/analyze_metadata_test.exs18++++++++++++++++--
5 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md @@ -18,7 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - MRF (`FollowBotPolicy`): New MRF Policy which makes a designated local Bot account attempt to follow all users in public Notes received by your instance. Users who require approving follower requests or have #nobot in their profile are excluded. - Return OAuth token `id` (primary key) in POST `/oauth/token`. -- `AnalyzeMetadata` upload filter for extracting attachment dimensions and generating blurhashes. +- `AnalyzeMetadata` upload filter for extracting image/video attachment dimensions and generating blurhashes for images. Blurhashes for videos are not generated at this time. - Attachment dimensions and blurhashes are federated when available. - Pinned posts federation diff --git 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 @@ -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 diff --git a/test/fixtures/video.mp4 b/test/fixtures/video.mp4 Binary files differ. diff --git a/test/pleroma/upload/filter/analyze_metadata_test.exs b/test/pleroma/upload/filter/analyze_metadata_test.exs @@ -6,7 +6,7 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadataTest do use Pleroma.DataCase, async: true alias Pleroma.Upload.Filter.AnalyzeMetadata - test "adds the image dimensions" do + test "adds the dimensions and blurhash for images" do upload = %Pleroma.Upload{ name: "an… image.jpg", content_type: "image/jpeg", @@ -14,6 +14,20 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadataTest do tempfile: Path.absname("test/fixtures/image.jpg") } - assert {:ok, :filtered, %{width: 1024, height: 768}} = AnalyzeMetadata.filter(upload) + {:ok, :filtered, meta} = AnalyzeMetadata.filter(upload) + + assert %{width: 1024, height: 768} = meta + assert meta.blurhash + end + + test "adds the dimensions for videos" do + upload = %Pleroma.Upload{ + name: "coolvideo.mp4", + content_type: "video/mp4", + path: Path.absname("test/fixtures/video.mp4"), + tempfile: Path.absname("test/fixtures/video.mp4") + } + + assert {:ok, :filtered, %{width: 480, height: 480}} = AnalyzeMetadata.filter(upload) end end