You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
28 lines
827 B
Elixir
28 lines
827 B
Elixir
defmodule AsciinemaWeb.AsciicastImageController do
|
|
use AsciinemaWeb, :controller
|
|
alias Asciinema.{Asciicasts, PngGenerator}
|
|
alias Asciinema.Asciicasts.Asciicast
|
|
alias Plug.MIME
|
|
|
|
@max_age 604800 # 7 days
|
|
|
|
def show(conn, %{"id" => id} = _params) do
|
|
asciicast = Asciicasts.get_asciicast!(id)
|
|
user = Repo.preload(asciicast, :user).user
|
|
png_params = Asciicast.png_params(asciicast, user)
|
|
|
|
case PngGenerator.generate(asciicast, png_params) do
|
|
{:ok, png_path} ->
|
|
conn
|
|
|> put_resp_header("content-type", MIME.path(png_path))
|
|
|> put_resp_header("cache-control", "public, max-age=#{@max_age}")
|
|
|> send_file(200, png_path)
|
|
|> halt
|
|
{:error, :busy} ->
|
|
conn
|
|
|> put_resp_header("retry-after", "5")
|
|
|> send_resp(503, "")
|
|
end
|
|
end
|
|
end
|