Skip to content

Instantly share code, notes, and snippets.

@cblavier
Created February 21, 2023 20:49
Show Gist options
  • Save cblavier/d3f453aaacc19d59e9bd8911e09a1001 to your computer and use it in GitHub Desktop.
Save cblavier/d3f453aaacc19d59e9bd8911e09a1001 to your computer and use it in GitHub Desktop.
Transloadit Elixir client
defmodule Readable.Transloadit do
use Tesla
plug Tesla.Middleware.BaseUrl, "https://api2.transloadit.com/"
plug Tesla.Middleware.JSON
@behaviour Readable.Transloadit.TransloaditAPI
@impl true
def run_assembly(assembly, file_path, source_container, target_container) do
assembly =
apply(Readable.Transloadit.TransloaditAssemblies, assembly, [
file_path,
source_container,
target_container
])
case post("/assemblies", %{params: Jason.encode!(assembly)}) do
{:ok, %Tesla.Env{status: 200, body: body}} -> {:ok, Jason.decode!(body, keys: :atoms)}
{:ok, %Tesla.Env{body: body}} -> {:error, body}
{:error, error} -> {:error, error}
end
end
@impl true
def wait_until_completed(assembly_status_url, opts \\ [wait_time: 500]) do
case get_assembly_status(assembly_status_url) do
{:ok, "ASSEMBLY_COMPLETED"} ->
:ok
{:ok, _} ->
Process.sleep(opts[:wait_time])
wait_until_completed(assembly_status_url, opts)
{:error, error} ->
{:error, error}
end
end
defp get_assembly_status(assembly_status_url) do
with {:ok, %Tesla.Env{status: 200, body: body}} <- Tesla.get(assembly_status_url),
{:ok, body} <- Jason.decode(body),
nil <- Map.get(body, "error") do
{:ok, Map.get(body, "ok")}
else
{:ok, %Tesla.Env{body: body}} -> {:error, body}
error -> {:error, error}
end
end
end
defmodule Readable.Transloadit.TransloaditAPI do
@callback run_assembly(atom(), String.t(), String.t(), String.t()) ::
{:ok, Tesla.Env.t()} | {:error, any()}
@callback wait_until_completed(String.t()) :: :ok | {:error, any()}
@callback wait_until_completed(String.t(), [{atom(), any()}]) :: :ok | {:error, any()}
end
defmodule Readable.Transloadit.TransloaditAssemblies do
@auth_key "key"
def mono_mp3(input_path, source_container, target_container, notify_url \\ nil) do
assembly_template(
"96827bb365e64b7cae04d984c6",
input_path,
source_container,
target_container,
notify_url
)
end
def avatar(input_path, source_container, target_container, notify_url \\ nil) do
assembly_template(
"18dbc2f18120488abdd3cfbd18d",
input_path,
source_container,
target_container,
notify_url
)
end
def cover(input_path, source_container, target_container, notify_url \\ nil) do
assembly_template(
"18f2a04feb414097910e7367762c",
input_path,
source_container,
target_container,
notify_url
)
end
defp assembly_template(template_id, input_path, source_container, target_container, notify_url) do
%{
auth: %{
key: @auth_key
},
template_id: template_id,
steps: %{
import: %{
container: source_container,
path: input_path
},
export: %{
container: target_container
}
},
notify_url: notify_url
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment