aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorhref <href@random.sh>2020-05-14 21:36:31 +0200
committerhref <href@random.sh>2020-06-16 15:15:50 +0200
commitec1452fd1cdb9cb1db9b8bad872916d3213489e2 (patch)
treebe89364e07901a2fcaf5b943ac3492e71463b1df /lib
parent1e49bfa9acb4176a161181edcaf04e886c638c42 (diff)
downloadpleroma-ec1452fd1cdb9cb1db9b8bad872916d3213489e2.tar.gz
Pleroma.MIME: use gen_magic
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/application.ex1
-rw-r--r--lib/pleroma/mime.ex84
2 files changed, 23 insertions, 62 deletions
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 9d3d92b38..c74255629 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -80,6 +80,7 @@ defmodule Pleroma.Application do
[
Pleroma.Stats,
Pleroma.JobQueueMonitor,
+ Pleroma.MIME,
{Oban, Config.get(Oban)}
] ++
task_children(@env) ++
diff --git a/lib/pleroma/mime.ex b/lib/pleroma/mime.ex
index 6ee055f50..3b406630e 100644
--- a/lib/pleroma/mime.ex
+++ b/lib/pleroma/mime.ex
@@ -6,8 +6,21 @@ defmodule Pleroma.MIME do
@moduledoc """
Returns the mime-type of a binary and optionally a normalized file-name.
"""
- @default "application/octet-stream"
@read_bytes 35
+ @pool __MODULE__.GenMagicPool
+
+ def child_spec(_) do
+ pool_size = Pleroma.Config.get!([:gen_magic_pool, :size])
+ name = @pool
+
+ %{
+ id: __MODULE__,
+ start: {GenMagic.Pool, :start_link, [[name: name, pool_size: pool_size]]},
+ type: :worker,
+ restart: :permanent,
+ shutdown: 500
+ }
+ end
@spec file_mime_type(String.t(), String.t()) ::
{:ok, content_type :: String.t(), filename :: String.t()} | {:error, any()} | :error
@@ -20,9 +33,10 @@ defmodule Pleroma.MIME do
@spec file_mime_type(String.t()) :: {:ok, String.t()} | {:error, any()} | :error
def file_mime_type(filename) do
- File.open(filename, [:read], fn f ->
- check_mime_type(IO.binread(f, @read_bytes))
- end)
+ case GenMagic.Pool.perform(@pool, filename) do
+ {:ok, %GenMagic.Result{mime_type: content_type}} -> {:ok, content_type}
+ error -> error
+ end
end
def bin_mime_type(binary, filename) do
@@ -34,13 +48,14 @@ defmodule Pleroma.MIME do
@spec bin_mime_type(binary()) :: {:ok, String.t()} | :error
def bin_mime_type(<<head::binary-size(@read_bytes), _::binary>>) do
- {:ok, check_mime_type(head)}
+ case GenMagic.Pool.perform(@pool, {:bytes, head}) do
+ {:ok, %GenMagic.Result{mime_type: content_type}} -> {:ok, content_type}
+ error -> error
+ end
end
def bin_mime_type(_), do: :error
- def mime_type(<<_::binary>>), do: {:ok, @default}
-
defp fix_extension(filename, content_type) do
parts = String.split(filename, ".")
@@ -62,59 +77,4 @@ defmodule Pleroma.MIME do
Enum.join([new_filename, String.split(content_type, "/") |> List.last()], ".")
end
end
-
- defp check_mime_type(<<0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, _::binary>>) do
- "image/png"
- end
-
- defp check_mime_type(<<0x47, 0x49, 0x46, 0x38, _, 0x61, _::binary>>) do
- "image/gif"
- end
-
- defp check_mime_type(<<0xFF, 0xD8, 0xFF, _::binary>>) do
- "image/jpeg"
- end
-
- defp check_mime_type(<<0x1A, 0x45, 0xDF, 0xA3, _::binary>>) do
- "video/webm"
- end
-
- defp check_mime_type(<<0x00, 0x00, 0x00, _, 0x66, 0x74, 0x79, 0x70, _::binary>>) do
- "video/mp4"
- end
-
- defp check_mime_type(<<0x49, 0x44, 0x33, _::binary>>) do
- "audio/mpeg"
- end
-
- defp check_mime_type(<<255, 251, _, 68, 0, 0, 0, 0, _::binary>>) do
- "audio/mpeg"
- end
-
- defp check_mime_type(
- <<0x4F, 0x67, 0x67, 0x53, 0x00, 0x02, 0x00, 0x00, _::size(160), 0x80, 0x74, 0x68, 0x65,
- 0x6F, 0x72, 0x61, _::binary>>
- ) do
- "video/ogg"
- end
-
- defp check_mime_type(<<0x4F, 0x67, 0x67, 0x53, 0x00, 0x02, 0x00, 0x00, _::binary>>) do
- "audio/ogg"
- end
-
- defp check_mime_type(<<"RIFF", _::binary-size(4), "WAVE", _::binary>>) do
- "audio/wav"
- end
-
- defp check_mime_type(<<"RIFF", _::binary-size(4), "WEBP", _::binary>>) do
- "image/webp"
- end
-
- defp check_mime_type(<<"RIFF", _::binary-size(4), "AVI.", _::binary>>) do
- "video/avi"
- end
-
- defp check_mime_type(_) do
- @default
- end
end