lib/hikvision/streaming.ex

defmodule Hikvision.Streaming do
  @moduledoc """
  Streaming operations
  """

  alias Hikvision.{Parsers, Operation}

  @type channel :: integer() | binary()

  @prefix "/ISAPI/Streaming"

  @doc """
  Get encoding configuration of the available channels
  """
  @spec channels() :: Operation.t()
  def channels() do
    Operation.new("#{@prefix}/channels", parser: &Parsers.parse_channels_config/1)
  end

  @doc """
  Get encoding configuration of a channel
  """
  @spec channel(channel()) :: Operation.t()
  def channel(channel) do
    Operation.new("#{@prefix}/channels/#{channel}", parser: &Parsers.parse_channel_config/1)
  end

  @doc """
  Get a picture from a live feed.

  The channel is ignored by ISAPI when the device is a **Camera**. Otherwise it must be supplied
  in the hundred format (e.g. `201` second channel, main stream. `102` first channel, sub stream)

  The following options can be supplied:
    * *width* - The width of the picture, it's only working with NVR
    * *height* - The height of the picture, it's only working with NVR
  """
  @spec snapshot(channel(), Keyword.t()) :: Hikvision.Operation.t()
  def snapshot(channel, opts \\ []) do
    query_params = %{
      videoResolutionWidth: Keyword.get(opts, :width),
      videoResolutionHeight: Keyword.get(opts, :height)
    }

    Operation.new("#{@prefix}/channels/#{channel}/picture",
      params: query_params,
      parser: &Parsers.body/1
    )
  end
end