lib/media/ver10/get_stream_uri.ex

defmodule Onvif.Media.Ver10.GetStreamUri do
  import SweetXml
  import XmlBuilder

  alias Onvif.Device

  def soap_action, do: "http://www.onvif.org/ver10/media/wsdl/GetStreamUri"

  @spec request(Device.t(), list) :: {:ok, any} | {:error, map()}
  def request(device, args),
    do: Onvif.Media.Ver10.Media.request(device, args, __MODULE__)

  def request_body(profile_token, stream_type \\ "RTP-Unicast", protocol \\ "RTSP") do
    element(:"s:Body", [
      element(:"trt:GetStreamUri", [
        element(:"trt:StreamSetup", [
          element(:"tt:Stream", stream_type),
          element(:"tt:Transport", [
            element(:"tt:Protocol", protocol)
          ])
        ]),
        element(:"trt:ProfileToken", profile_token)
      ])
    ])
  end

  def response(xml_response_body) do
    doc = parse(xml_response_body, namespace_conformant: true, quiet: true)

    stream_uri =
      xpath(
        doc,
        ~x"//s:Envelope/s:Body/trt:GetStreamUriResponse/trt:MediaUri/tt:Uri/text()"s
        |> add_namespace("s", "http://www.w3.org/2003/05/soap-envelope")
        |> add_namespace("trt", "http://www.onvif.org/ver10/media/wsdl")
        |> add_namespace("tt", "http://www.onvif.org/ver10/schema")
      )

    {:ok, stream_uri}
  end
end