forked from AkkomaGang/akkoma
Merge branch 'metadata-for-all' into 'develop'
Support metadata for video files too See merge request pleroma/pleroma!3441
This commit is contained in:
commit
1175023687
5 changed files with 57 additions and 4 deletions
|
@ -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.
|
- 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`.
|
- 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.
|
- Attachment dimensions and blurhashes are federated when available.
|
||||||
- Pinned posts federation
|
- Pinned posts federation
|
||||||
|
|
||||||
|
|
|
@ -168,7 +168,8 @@ defp check_system_commands!(:ok) do
|
||||||
check_filter(Pleroma.Upload.Filter.Mogrify, "mogrify"),
|
check_filter(Pleroma.Upload.Filter.Mogrify, "mogrify"),
|
||||||
check_filter(Pleroma.Upload.Filter.Mogrifun, "mogrify"),
|
check_filter(Pleroma.Upload.Filter.Mogrifun, "mogrify"),
|
||||||
check_filter(Pleroma.Upload.Filter.AnalyzeMetadata, "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 =
|
preview_proxy_commands_status =
|
||||||
|
|
|
@ -33,6 +33,23 @@ def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _} = upload)
|
||||||
end
|
end
|
||||||
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}
|
def filter(_), do: {:ok, :noop}
|
||||||
|
|
||||||
defp get_blurhash(file) do
|
defp get_blurhash(file) do
|
||||||
|
@ -42,4 +59,25 @@ defp get_blurhash(file) do
|
||||||
_ -> nil
|
_ -> nil
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
BIN
test/fixtures/video.mp4
vendored
Normal file
BIN
test/fixtures/video.mp4
vendored
Normal file
Binary file not shown.
|
@ -6,7 +6,7 @@ defmodule Pleroma.Upload.Filter.AnalyzeMetadataTest do
|
||||||
use Pleroma.DataCase, async: true
|
use Pleroma.DataCase, async: true
|
||||||
alias Pleroma.Upload.Filter.AnalyzeMetadata
|
alias Pleroma.Upload.Filter.AnalyzeMetadata
|
||||||
|
|
||||||
test "adds the image dimensions" do
|
test "adds the dimensions and blurhash for images" do
|
||||||
upload = %Pleroma.Upload{
|
upload = %Pleroma.Upload{
|
||||||
name: "an… image.jpg",
|
name: "an… image.jpg",
|
||||||
content_type: "image/jpeg",
|
content_type: "image/jpeg",
|
||||||
|
@ -14,6 +14,20 @@ test "adds the image dimensions" do
|
||||||
tempfile: Path.absname("test/fixtures/image.jpg")
|
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
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue