defmodule SEO.OpenGraph.Audio do @moduledoc """ Data describing an audio file. """ use Phoenix.Component alias SEO.Utils defstruct [ :url, :secure_url, :type ] @type t :: %__MODULE__{ url: URI.t() | String.t(), secure_url: URI.t() | String.t(), type: mime() } @type mime :: String.t() @doc """ The `og:audio` property has some optional structured properties: - `:url` - The url with metadata that describes the audio. - `:secure_url` - An alternate url to use if the webpage requires HTTPS. - `:type` - A MIME type for this audio, eg, `"audio/mpeg"`. """ def build(attrs, default \\ nil) def build(attrs, default) do __MODULE__ |> Utils.merge_defaults(attrs, default) |> maybe_put_secure_url() end defp maybe_put_secure_url(audio) do case audio.url do %URI{scheme: "https"} = uri -> %{audio | secure_url: uri} "https" <> _ = url -> %{audio | secure_url: url} _ -> audio end end attr(:content, :any, required: true) def meta(assigns) do case assigns[:content] do nil -> ~H"" %__MODULE__{} -> ~H""" <%= if @content.url do %> <%= if @content.secure_url do %> <% end %><%= if @content.type do %> <% end %> <% end %> """ _url -> ~H""" """ end end end