|
|
|
@ -20,8 +20,11 @@ defmodule Asciinema.Asciicasts do
|
|
|
|
|
Repo.one!(q)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def create_asciicast(user, %Plug.Upload{path: path, filename: filename} = upload) do
|
|
|
|
|
def create_asciicast(user, params, user_agent \\ nil)
|
|
|
|
|
|
|
|
|
|
def create_asciicast(user, %Plug.Upload{path: path, filename: filename} = upload, user_agent) do
|
|
|
|
|
asciicast = %Asciicast{user_id: user.id,
|
|
|
|
|
user_agent: user_agent,
|
|
|
|
|
file: filename,
|
|
|
|
|
private: user.asciicasts_private_by_default}
|
|
|
|
|
|
|
|
|
@ -31,8 +34,8 @@ defmodule Asciinema.Asciicasts do
|
|
|
|
|
{:ok, attrs} <- extract_attrs(attrs),
|
|
|
|
|
changeset = Asciicast.create_changeset(asciicast, attrs),
|
|
|
|
|
{:ok, %Asciicast{} = asciicast} <- Repo.insert(changeset) do
|
|
|
|
|
put_file(asciicast, upload)
|
|
|
|
|
# TODO: generate snapshot and poster
|
|
|
|
|
save_file(asciicast, :file, upload)
|
|
|
|
|
generate_poster(asciicast)
|
|
|
|
|
{:ok, asciicast}
|
|
|
|
|
else
|
|
|
|
|
{:error, :invalid} ->
|
|
|
|
@ -45,6 +48,30 @@ defmodule Asciinema.Asciicasts do
|
|
|
|
|
result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def create_asciicast(user, %{"meta" => attrs,
|
|
|
|
|
"stdout" => %Plug.Upload{filename: d_filename} = data,
|
|
|
|
|
"stdout_timing" => %Plug.Upload{filename: t_filename} = timing}, _user_agent) do
|
|
|
|
|
attrs = Map.put(attrs, "version", 0)
|
|
|
|
|
asciicast = %Asciicast{user_id: user.id,
|
|
|
|
|
stdout_data: d_filename,
|
|
|
|
|
stdout_timing: t_filename,
|
|
|
|
|
private: user.asciicasts_private_by_default}
|
|
|
|
|
|
|
|
|
|
changeset = Asciicast.create_changeset(asciicast, attrs)
|
|
|
|
|
{_, result} = Repo.transaction(fn ->
|
|
|
|
|
with {:ok, %Asciicast{} = asciicast} <- Repo.insert(changeset) do
|
|
|
|
|
save_file(asciicast, :stdout_data, data)
|
|
|
|
|
save_file(asciicast, :stdout_timing, timing)
|
|
|
|
|
generate_poster(asciicast)
|
|
|
|
|
{:ok, asciicast}
|
|
|
|
|
else
|
|
|
|
|
otherwise -> otherwise
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
result
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
defp extract_attrs(%{"version" => 1} = attrs) do
|
|
|
|
|
attrs = %{version: attrs["version"],
|
|
|
|
|
duration: attrs["duration"],
|
|
|
|
@ -60,8 +87,12 @@ defmodule Asciinema.Asciicasts do
|
|
|
|
|
{:error, :unknown_format}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
defp put_file(asciicast, %{path: tmp_file_path, content_type: content_type}) do
|
|
|
|
|
file_store_path = Asciicast.json_store_path(asciicast)
|
|
|
|
|
defp save_file(asciicast, type, %{path: tmp_file_path, content_type: content_type}) do
|
|
|
|
|
file_store_path = Asciicast.file_store_path(asciicast, type)
|
|
|
|
|
:ok = FileStore.put_file(file_store_path, tmp_file_path, content_type)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
defp generate_poster(_asciicast) do
|
|
|
|
|
# TODO
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|