mirror of
https://github.com/algora-io/tv.git
synced 2025-03-17 20:17:45 +02:00
* replace SourceBin with Source + Demuxer + Parser * add Tee.Master * update topology * add copy channel * reorganize spec * fix pad refs * dynamically update pipeline topology for each rtmp sink * implement user defined destinations * validate destination URL * revamp ui * remove dbg calls * remove autocomplete for stream key input * update validation message
46 lines
1.1 KiB
Elixir
46 lines
1.1 KiB
Elixir
defmodule Algora.Accounts.Destination do
|
|
use Ecto.Schema
|
|
import Ecto.Changeset
|
|
|
|
schema "destinations" do
|
|
field :rtmp_url, :string
|
|
field :stream_key, :string, redact: true
|
|
field :active, :boolean, default: true
|
|
belongs_to :user, Algora.Accounts.User
|
|
|
|
timestamps()
|
|
end
|
|
|
|
def changeset(destination, attrs) do
|
|
destination
|
|
|> cast(attrs, [:rtmp_url, :stream_key, :active])
|
|
|> validate_required([:rtmp_url, :stream_key])
|
|
|> validate_rtmp_url()
|
|
end
|
|
|
|
defp validate_rtmp_url(changeset) do
|
|
validate_change(changeset, :rtmp_url, fn :rtmp_url, rtmp_url ->
|
|
case valid_rtmp_url?(rtmp_url) do
|
|
:ok ->
|
|
[]
|
|
|
|
{:error, message} ->
|
|
[rtmp_url: message]
|
|
end
|
|
end)
|
|
end
|
|
|
|
defp valid_rtmp_url?(url) do
|
|
case URI.parse(url) do
|
|
%URI{scheme: scheme, host: host} when scheme in ["rtmp", "rtmps"] ->
|
|
case :inet.gethostbyname(to_charlist(host)) do
|
|
{:ok, _} -> :ok
|
|
{:error, _} -> {:error, "must be a valid URL"}
|
|
end
|
|
|
|
_ ->
|
|
{:error, "must be a valid URL starting with rtmp:// or rtmps://"}
|
|
end
|
|
end
|
|
end
|