philomena/lib/philomena/processors/svg.ex

51 lines
1.3 KiB
Elixir
Raw Normal View History

2019-11-26 01:06:40 +01:00
defmodule Philomena.Processors.Svg do
2019-11-26 03:57:47 +01:00
alias Philomena.Intensities
2019-11-26 01:06:40 +01:00
def versions(sizes) do
sizes
|> Enum.map(fn {name, _} -> "#{name}.png" end)
|> Kernel.++(["rendered.png", "full.png"])
end
def process(_analysis, file, versions) do
2019-11-26 03:57:47 +01:00
preview = preview(file)
2019-11-26 01:06:40 +01:00
2019-11-26 03:57:47 +01:00
{:ok, intensities} = Intensities.file(preview)
scaled = Enum.flat_map(versions, &scale(preview, &1))
full = [{:copy, preview, "full.png"}]
2019-11-26 01:06:40 +01:00
2019-11-26 03:57:47 +01:00
%{
intensities: intensities,
thumbnails: scaled ++ full ++ [{:copy, preview, "rendered.png"}]
2019-11-26 03:57:47 +01:00
}
2019-11-26 01:06:40 +01:00
end
2019-11-26 03:57:47 +01:00
def post_process(_analysis, _file), do: %{}
2019-11-29 01:11:05 +01:00
def intensities(_analysis, file) do
{:ok, intensities} = Intensities.file(preview(file))
intensities
end
2019-11-26 03:57:47 +01:00
defp preview(file) do
2019-11-26 01:06:40 +01:00
preview = Briefly.create!(extname: ".png")
2020-01-11 05:20:19 +01:00
{_output, 0} = System.cmd("safe-rsvg-convert", [file, preview])
2019-11-26 01:06:40 +01:00
2019-11-26 03:57:47 +01:00
preview
2019-11-26 01:06:40 +01:00
end
defp scale(preview, {thumb_name, {width, height}}) do
2019-11-26 01:06:40 +01:00
scaled = Briefly.create!(extname: ".png")
scale_filter = "scale=w=#{width}:h=#{height}:force_original_aspect_ratio=decrease"
{_output, 0} =
2019-11-27 02:45:57 +01:00
System.cmd("ffmpeg", ["-loglevel", "0", "-y", "-i", preview, "-vf", scale_filter, scaled])
2020-01-11 05:20:19 +01:00
{_output, 0} = System.cmd("optipng", ["-i0", "-o1", "-quiet", "-clobber", scaled])
2019-11-26 01:06:40 +01:00
[{:copy, scaled, "#{thumb_name}.png"}]
2019-11-26 01:06:40 +01:00
end
2020-01-11 05:20:19 +01:00
end