mirror of
https://github.com/algora-io/tv.git
synced 2025-03-17 20:17:45 +02:00
57 lines
1.5 KiB
Elixir
57 lines
1.5 KiB
Elixir
defmodule Algora.Storage do
|
|
def endpoint_url do
|
|
%{scheme: scheme, host: host} = Application.fetch_env!(:ex_aws, :s3) |> Enum.into(%{})
|
|
"#{scheme}#{host}"
|
|
end
|
|
|
|
def upload_to_bucket(contents, remote_path, bucket, opts \\ []) do
|
|
op = Algora.config([:buckets, bucket]) |> ExAws.S3.put_object(remote_path, contents, opts)
|
|
ExAws.request(op, [])
|
|
end
|
|
|
|
def upload_from_filename_to_bucket(
|
|
local_path,
|
|
remote_path,
|
|
bucket,
|
|
cb \\ fn _ -> nil end,
|
|
opts \\ []
|
|
) do
|
|
%{size: size} = File.stat!(local_path)
|
|
|
|
chunk_size = 5 * 1024 * 1024
|
|
|
|
ExAws.S3.Upload.stream_file(local_path, [{:chunk_size, chunk_size}])
|
|
|> Stream.map(fn chunk ->
|
|
cb.(%{stage: :persisting, done: chunk_size, total: size})
|
|
chunk
|
|
end)
|
|
|> ExAws.S3.upload(Algora.config([:buckets, bucket]), remote_path, opts)
|
|
|> ExAws.request([])
|
|
end
|
|
|
|
def upload(contents, remote_path, opts \\ []) do
|
|
upload_to_bucket(contents, remote_path, :media, opts)
|
|
end
|
|
|
|
def upload_from_filename(local_path, remote_path, cb \\ fn _ -> nil end, opts \\ []) do
|
|
upload_from_filename_to_bucket(
|
|
local_path,
|
|
remote_path,
|
|
:media,
|
|
cb,
|
|
opts
|
|
)
|
|
end
|
|
|
|
def update_object!(bucket, object, opts) do
|
|
bucket = Algora.config([:buckets, bucket])
|
|
|
|
with {:ok, %{body: body}} <- ExAws.S3.get_object(bucket, object) |> ExAws.request(),
|
|
{:ok, res} <- ExAws.S3.put_object(bucket, object, body, opts) |> ExAws.request() do
|
|
res
|
|
else
|
|
err -> err
|
|
end
|
|
end
|
|
end
|