mirror of
https://github.com/algora-io/tv.git
synced 2025-03-17 20:17:45 +02:00
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
|