Packages

A Mux API Wrapper to convert API resonponse to embedded schema

Current section

Files

Jump to
mux_wrapper lib module live_streams.ex
Raw

lib/module/live_streams.ex

defmodule MuxWrapper.LiveStreams do
@moduledoc """
Provides a wrapper of live streaming to manipulate Mux API
"""
alias MuxWrapper.EmbeddedSchema.{LiveStream, Simulcast, Playback}
@privacy %{
public: "public",
private: "signed"
}
@doc """
Provide a function to send a create a public live streming to Mux
## Parameters
- client: provide by `MuxWrapper.client/0`
## Examples
iex> MuxWrapper.client() |> MuxWrapper.LiveStreams.create_public_live_stream()
{:ok,
%MuxWrapper.EmbeddedSchema.LiveStream{
created_at: ~N[2021-03-16 09:59:26],
id: "livestream_id_very_long",
new_asset_settings: %{"playback_policies" => ["public"]},
playback_ids: [
%MuxWrapper.EmbeddedSchema.Playback{
id: "playback_id_very_long",
policy: "public"
}
],
reconnect_window: 60,
status: "idle",
stream_key: "stream_key_very_long"
}
}
"""
@spec create_public_live_stream(%Tesla.Client{}) :: tuple()
def create_public_live_stream(client) do
with {:ok, live_stream, _teslaenv} <-
Mux.Video.LiveStreams.create(client, LiveStream.public()) do
live_stream
|> (&MuxWrapper.cast(&1, %LiveStream{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to send a create a private live streming to Mux
## Parameters
- client: provide by `MuxWrapper.client/0`
## Examples
iex> MuxWrapper.client() |> MuxWrapper.LiveStreams.create_private_live_stream()
{:ok,
%MuxWrapper.EmbeddedSchema.LiveStream{
created_at: ~N[2021-03-16 09:59:26],
id: "livestream_id_very_long",
new_asset_settings: %{"playback_policies" => ["public"]},
playback_ids: [
%MuxWrapper.EmbeddedSchema.Playback{
id: "playback_id_very_long",
policy: "singed"
}
],
reconnect_window: 60,
status: "idle",
stream_key: "stream_key_very_long"
}
}
"""
@spec create_private_live_stream(%Tesla.Client{}) :: tuple()
def create_private_live_stream(client) do
with {:ok, live_stream, _teslaenv} <-
Mux.Video.LiveStreams.create(client, LiveStream.private()) do
live_stream
|> (&MuxWrapper.cast(&1, %LiveStream{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to get a specific live streaming from Mux
## Parameters
- client: provide by `client/0`
- live_stream_id: stream id
## Examples
iex> MuxWrapper.client() |> MuxWrapper.LiveStreams.get("stream_id_very_long")
{:ok,
%MuxWrapper.EmbeddedSchema.LiveStream{
created_at: ~N[2021-03-16 09:59:26],
id: "stream_id_very_long",
new_asset_settings: %{"playback_policies" => ["public"]},
playback_ids: [
%MuxWrapper.EmbeddedSchema.Playback{
id: "playback_id_very_long",
policy: "public"
}
],
reconnect_window: 60,
status: "idle",
stream_key: "stream_key_very_long"
}
}
"""
@spec get(%Tesla.Client{}, String.t()) :: tuple()
def get(client, live_stream_id) do
with {:ok, live_stream, _env} <- Mux.Video.LiveStreams.get(client, live_stream_id) do
live_stream
|> (&MuxWrapper.cast(&1, %LiveStream{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to delete a live stream
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
## Examples
iex> MuxWrapper.client |> MuxWrapper.LiveStreams.delete_live_stream("live_stream_id_very_long")
{:ok}
"""
@spec delete_live_stream(%Tesla.Client{}, String.t()) :: tuple()
def delete_live_stream(client, live_stream_id) do
with {:ok, _data, _env} <- Mux.Video.LiveStreams.delete(client, live_stream_id) do
MuxWrapper.success()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to enable a live stream
## Parameters
- client: provide by `client/1`
- live_stream_id: live stream id
## Examples
iex> MuxWrapper.client() |> MuxWrapper.LiveStreams.enable_live_stream("live_stream_id_very_long")
{:ok}
"""
@spec enable_live_stream(%Tesla.Client{}, String.t()) :: tuple()
def enable_live_stream(client, live_stream_id) do
with {:ok, _, _env} <- Mux.Video.LiveStreams.enable(client, live_stream_id) do
MuxWrapper.success()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to disable a live stream
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
## Examples
iex> MuxWrapper.client() |> MuxWrapper.LiveStreams.disable_live_stream("live_stream_id_very_long")
{:ok}
"""
@spec disable_live_stream(%Tesla.Client{}, String.t()) :: tuple()
def disable_live_stream(client, live_stream_id) do
with {:ok, _, _env} <- Mux.Video.LiveStreams.disable(client, live_stream_id) do
MuxWrapper.success()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to singal a live stream finished
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
## Examples
iex> MuxWrapper.client() |> MuxWrapper.LiveStreams.complete_live_stream("live_stream_id_very_long")
{:ok}
"""
@spec complete_live_stream(%Tesla.Client{}, String.t()) :: tuple()
def complete_live_stream(client, live_stream_id) do
with {:ok, _, _env} <- Mux.Video.LiveStreams.signal_complete(client, live_stream_id) do
MuxWrapper.success()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to list live streams by passing params in Mux, support pagnation see [Mux doc](https://docs.mux.com/api-reference/video#operation/list-live-streams)
## Parameters
- client: provide by `client/0`
- opt: pagnation query params, can pass a Map like this `%{limit: 10, page: 3}`. If don't pass, the default value from Mux is limit: 25 and page: 1
## Example
iex> client = MuxWrapper.client()
%Tesla.Client{
adapter: nil,
fun: nil,
post: [],
pre: [
{Tesla.Middleware.BaseUrl, :call, ["https://api.mux.com"]},
{Tesla.Middleware.BasicAuth, :call,
[
%{
password: "your_password",
username: "your_username"
}
]}
]
}
iex> MuxWrapper.LiveStreams.list(client, %{limit: 1, page: 1})
{:ok,
[
%MuxWrapper.EmbeddedSchema.LiveStream{
created_at: ~N[2021-03-17 16:49:36],
id: "ABYT7nZXRKXLz02rMeWo00bhzLgw34sby6ZcZWR7vboFI",
new_asset_settings: %{"playback_policies" => ["public"]},
playback_ids: [
%MuxWrapper.EmbeddedSchema.Playback{
id: "NbUxpgpd02V00g02JNScdJwCxB9LUzPlvUmcnGHadG1V700",
policy: "public"
},
%MuxWrapper.EmbeddedSchema.Playback{
id: "Lg2lOeX9dmuzGOZBRVPYhcng9008MPUcCxwWA8002brlw",
policy: "signed"
},
%MuxWrapper.EmbeddedSchema.Playback{
id: "cnIcHj02pOmG01aTAE7t2B5iDWjWgQgLUbz8YHkJElBcs",
policy: "public"
}
],
reconnect_window: 60,
status: "idle",
stream_key: "stream_key_very_long"
}
]
}
"""
@spec list(%Tesla.Client{}, Enum.t()) :: tuple()
def list(client, opt \\ %{}) do
with {:ok, live_streams, _env} <- Mux.Video.LiveStreams.list(client, opt) do
live_streams
|> (&MuxWrapper.cast(&1, %LiveStream{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Create a `public` new playback ID by asset id. to Mux, suggest read [Mux doc](https://docs.mux.com/api-reference/video#operation/create-asset-playback-id) first
## Parameters
- client - provid by `MuxWrapper.client/0`
- live_stream_id - live stream id
## Examples
iex> client = MuxWrapper.client()
%Tesla.Client{
adapter: nil,
fun: nil,
post: [],
pre: [
{Tesla.Middleware.BaseUrl, :call, ["https://api.mux.com"]},
{Tesla.Middleware.BasicAuth, :call,
[
%{
password: "your_password",
username: "your_username"
}
]}
]
}
iex> MuxWrapper.Playbacks.create_public_playback_id(client, "live_stream_id_very_long")
{:ok,
%MuxWrapper.EmbeddedSchema.Playback{
id: "UdNWaprxjIA01BUYYDJpaCiDZQu22Ep6tAJLOLA8Sk7A",
policy: "public"
}
}
"""
@spec create_public_playback_id(%Tesla.Client{}, String.t()) :: tuple()
def create_public_playback_id(client, live_stream_id),
do: create_playback_id(client, live_stream_id, %{policy: @privacy.public})
@doc """
Create a `signed` new playback ID by asset id. to Mux, suggest read [Mux doc](https://docs.mux.com/api-reference/video#operation/create-asset-playback-id) first
## Parameters
- client - provid by `MuxWrapper.client/0`
- live_stream_id - live stream id
## Examples
iex> client = MuxWrapper.client()
%Tesla.Client{
adapter: nil,
fun: nil,
post: [],
pre: [
{Tesla.Middleware.BaseUrl, :call, ["https://api.mux.com"]},
{Tesla.Middleware.BasicAuth, :call,
[
%{
password: "your_password",
username: "your_username"
}
]}
]
}
iex> MuxWrapper.Playbacks.create_private_playback_id(client, "live_stream_id_very_long")
{:ok,
%MuxWrapper.EmbeddedSchema.Playback{
id: "yP29YfRnmqr6Ft47nd9FscOTq5Eo63UWB74TJSeo9Es",
policy: "signed"
}
}
"""
@spec create_private_playback_id(%Tesla.Client{}, String.t()) :: tuple()
def create_private_playback_id(client, live_stream_id),
do: create_playback_id(client, live_stream_id, %{policy: @privacy.private})
defp create_playback_id(client, live_stream_id, params) do
with {:ok, playback_id, _env} <-
Mux.Video.LiveStreams.create_playback_id(client, live_stream_id, params) do
playback_id
|> (&MuxWrapper.cast(&1, %Playback{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to delete specfic playback asset from Mux
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
- playback_id: play back id
## Example
iex> client = MuxWrapper.client()
%Tesla.Client{
adapter: nil,
fun: nil,
post: [],
pre: [
{Tesla.Middleware.BaseUrl, :call, ["https://api.mux.com"]},
{Tesla.Middleware.BasicAuth, :call,
[
%{
password: "your_password",
username: "your_username"
}
]}
]
}
iex> MuxWrapper.LiveStreams.delete_playback_id(client, "stream_id_very_long", "playback_id_very_long")
{:ok}
"""
@spec delete_playback_id(%Tesla.Client{}, String.t(), String.t()) :: tuple()
def delete_playback_id(client, live_stream_id, playback_id) do
with {:ok, _, _env} <-
Mux.Video.LiveStreams.delete_playback_id(client, live_stream_id, playback_id) do
MuxWrapper.success()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to create simulcast target, strongly suggest read [Mux doc](https://docs.mux.com/api-reference/video#operation/create-live-stream-simulcast-target) first
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
- params: request body, `MuxWrapper.EmbeddedSchema.Simulcast`
## Example
iex> params = %MuxWrapper.EmbeddedSchema.Simulcast{url: "rtmp://live.example.com/app", stream_key: "abcdefgh"}
%MuxWrapper.EmbeddedSchema.Simulcast{
id: nil,
passthrough: nil,
stream_key: "abcdefgh",
url: "rtmp://live.example.com/app"
}
iex> MuxWrapper.clinet() |> MuxWrapper.LiveStreams.create_simulcast_target("live_stream_id_very_long", params)
{:ok,
%MuxWrapper.EmbeddedSchema.Simulcast{
id: "vuOfW021mz5QA500wYEQ9SeUYvuYnpFz011mqSvski5T8claN02JN9ve2g",
passthrough: "Example 1",
stream_key: "abcdefgh",
url: "rtmp://live.example1.com/app"
}
}
"""
@spec create_simulcast_target(
%Tesla.Client{},
String.t(),
%MuxWrapper.EmbeddedSchema.Simulcast{}
) :: tuple()
def create_simulcast_target(client, live_stream_id, params) do
with {:ok, simulcast_target, _env} <-
Mux.Video.LiveStreams.create_simulcast_target(client, live_stream_id, params) do
simulcast_target
|> (&MuxWrapper.cast(&1, %Simulcast{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to get simulcast target, strongly suggest read [Mux doc](https://hexdocs.pm/mux/Mux.Video.LiveStreams.html#get_simulcast_target/3) first
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
- simulcast_target_id: simulcast target id
## Examples
iex> client = MuxWrapper.client()
%Tesla.Client{
adapter: nil,
fun: nil,
post: [],
pre: [
{Tesla.Middleware.BaseUrl, :call, ["https://api.mux.com"]},
{Tesla.Middleware.BasicAuth, :call,
[
%{
password: "your_password",
username: "your_username"
}
]}
]
}
iex> MuxWrapper.LiveStreams.get_simulcast_target(client, "stream_id_very_long", "simulcast_target_id")
{:ok,
%MuxWrapper.EmbeddedSchema.Simulcast{
id: "vuOfW021mz5QA500wYEQ9SeUYvuYnpFz011mqSvski5T8claN02JN9ve2g",
passthrough: "Example 1",
stream_key: "abcdefgh",
url: "rtmp://live.example1.com/app"
}
}
"""
@spec get_simulcast_target(%Tesla.Client{}, String.t(), String.t()) :: tuple()
def get_simulcast_target(client, live_stream_id, simulcast_target_id) do
with {:ok, simulcast_target, _env} <-
Mux.Video.LiveStreams.get_simulcast_target(client, live_stream_id, simulcast_target_id) do
simulcast_target
|> (&MuxWrapper.cast(&1, %Simulcast{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to delete simulcast targets
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
- simulcast_target_id: simulcast target id
## Example
iex> client = MuxWrapper.client()
%Tesla.Client{
adapter: nil,
fun: nil,
post: [],
pre: [
{Tesla.Middleware.BaseUrl, :call, ["https://api.mux.com"]},
{Tesla.Middleware.BasicAuth, :call,
[
%{
password: "your_password",
username: "your_username"
}
]}
]
}
iex> MuxWrapper.LiveStreams.delete_simulcast_target(client, "stream_id_very_long", "simulcast_target_id")
{:ok}
"""
@spec delete_simulcast_target(%Tesla.Client{}, String.t(), String.t()) :: tuple()
def delete_simulcast_target(client, live_stream_id, simulcast_target_id) do
with {:ok, _, _env} <-
Mux.Video.LiveStreams.delete_simulcast_target(
client,
live_stream_id,
simulcast_target_id
) do
MuxWrapper.success()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
@doc """
Provide a function to reset stream key
## Parameters
- client: provide by `client/0`
- live_stream_id: live stream id
## Examples
iex> MuxWrapper.client() |> MuxWrapper.LiveStreams.reset_stream_key("stream_id_very_long")
{:ok,
%MuxWrapper.EmbeddedSchema.LiveStream{
created_at: ~N[2021-03-17 09:27:39],
id: "009cUTpAr01fQgGQdLHnoy62naafkNhYRGQGTqG6O54kE",
new_asset_settings: %{"playback_policies" => ["public"]},
playback_ids: [
%MuxWrapper.EmbeddedSchema.Playback{
id: "004iSQFtzMHEPnftHqeU8w6UMwUocP1i8nKXtKlHcjI8",
policy: "public"
}
],
reconnect_window: 60,
status: "disabled",
stream_key: "d0c30be3-7e80-de52-5676-53a87a02c54f"
}
}
"""
@spec reset_stream_key(%Tesla.Client{}, String.t()) :: tuple()
def reset_stream_key(client, live_stream_id) do
with {:ok, live_stream, _env} <-
Mux.Video.LiveStreams.reset_stream_key(client, live_stream_id) do
live_stream
|> (&MuxWrapper.cast(&1, %LiveStream{})).()
else
{:error, reason, details} ->
reason
|> MuxWrapper.print_errors(details)
end
end
end