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.
asciinema.org/lib/asciinema_web/controllers/asciicast_image_controller.ex

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