defmodule ExFrontier do @moduledoc """ Library used for connecting and controlling radios based on [Frontier](https://www.frontiersmart.com/) from the manufacturer website Frontier’s leading SmartRadio modules combine DAB+, FM, Bluetooth with Internet Radio, Podcasts and audio streaming services including Spotify, Amazon Music, Tidal, Qobuz and Deezer. SmartRadios can be controlled with a Smartphone using the Frontier UNDOK™ application. Library is mostly based on sniffing traffic from the android app and also on some documentation found on the internet """ alias ExFrontier.Constants alias ExFrontier.Connector @doc """ creates a connection that needs to be passed to every request """ defdelegate connect, to: Connector @doc """ discards the session_id """ defdelegate disconnect(conn), to: Connector @doc """ returns a list of items about current track """ def get_play_current(conn) do Connector.handle_get_multiple(conn, Constants.play_current()) end @doc """ returns a list of items about play state """ def get_play_info(conn) do Connector.handle_get_multiple(conn, Constants.play_info()) end @doc """ returns a list of items about audio setup """ def get_audio(conn) do Connector.handle_get_multiple(conn, Constants.audio()) end @doc """ returns system info """ def get_info(conn) do Connector.handle_get_multiple(conn, Constants.info()) end @doc """ get a list of items about nav state """ def get_nav(conn) do Connector.handle_get_multiple(conn, Constants.nav()) end @doc """ returns a list of items about wired connection """ def get_wired(conn) do Connector.handle_get_multiple(conn, Constants.wired()) end @doc """ returns a list of items about current network settings """ def get_ipconfig(conn) do Connector.handle_get_multiple(conn, Constants.ipconfig()) end @doc """ returns a list of items about clock """ def get_clock(conn) do Connector.handle_get_multiple(conn, Constants.clock()) end @doc """ returns a list of items about wireless connection """ def get_wlan(conn) do Connector.handle_get_multiple(conn, Constants.wlan()) end @doc """ returns name of current playing item """ def get_play_info_name(conn) do Connector.handle_get(conn, "netRemote.play.info.name") end @doc """ returns description of current playing item """ def get_play_info_text(conn) do Connector.handle_get(conn, "netRemote.play.info.text") end @doc """ returns current artist """ def get_play_info_artist(conn) do Connector.handle_get(conn, "netRemote.play.info.artist") end @doc """ returns current artist """ def get_play_info_album(conn) do Connector.handle_get(conn, "netRemote.play.info.album") end @doc """ returns cover uri """ def get_play_info_graphics(conn) do Connector.handle_get(conn, "netRemote.play.info.graphicUri") end @doc """ returns amount of volume steps """ def get_volume_steps(conn) do Connector.handle_get(conn, "netRemote.sys.caps.volumeSteps") end @doc """ returns playing status """ def get_play_status(conn) do status = Connector.handle_get(conn, "netRemote.play.status") Constants.net_remote_play_states(status) end @doc """ returns current volume """ def get_volume(conn) do Connector.handle_get(conn, "netRemote.sys.audio.volume") end @doc """ returns current mute state """ def get_mute(conn) do Connector.handle_get(conn, "netRemote.sys.audio.mute") end @doc """ returns current mute state """ def get_power(conn) do Connector.handle_get(conn, "netRemote.sys.power") end @doc """ returns friendly name of device """ def get_friendly_name(conn) do Connector.handle_get(conn, "netRemote.sys.info.friendlyName") end @doc """ returns track duration """ def get_duration(conn) do with duration when is_integer(duration) <- Connector.handle_get(conn, "netRemote.play.info.duration") do Time.add(~T[00:00:00], duration, :millisecond) end end @doc """ returns selected playing input mode """ def get_mode(conn) do mode = Connector.handle_get(conn, "netRemote.sys.mode") Enum.find(get_modes(conn), fn %{"key" => key} -> key == mode end) end @doc """ returns list of predefined equalizer modes """ def get_eq_modes(conn) do Connector.handle_list(conn, "netRemote.sys.caps.eqPresets") end @doc """ returns list of wifi networks """ def get_wifi_scan(conn) do Connector.handle_list(conn, "netRemote.sys.net.wlan.scanList") end @doc """ returns list of supported wifi modes """ def get_modes(conn) do Connector.handle_list(conn, "netRemote.sys.caps.validModes") end @doc """ TODO inits the radio """ def init_radio(conn) do play_control(conn, :init) end @doc """ play """ def play(conn) do play_control(conn, :play) end @doc """ pause """ def pause(conn) do play_control(conn, :pause) end @doc """ forward """ def forward(conn) do play_control(conn, :forward) end @doc """ rewind """ def rewind(conn) do play_control(conn, :rewind) end @doc """ play, pause, forward, rewind modes """ def play_control(conn, value) do Connector.handle_set(conn, "netRemote.play.control", Constants.play_control(value)) end @doc """ sets volume in range returned by get_volume_steps """ def set_volume(conn, value) do Connector.handle_set(conn, "netRemote.sys.audio.volume", value) end @doc """ sets device name """ def set_friendly_name(conn, value) do Connector.handle_set(conn, "netRemote.sys.info.friendlyName", value) end @doc """ sets mute state """ def set_mute(conn, value) do Connector.handle_set(conn, "netRemote.sys.audio.mute", value) end @doc """ sets power state """ def set_power(conn, value) do Connector.handle_set(conn, "netRemote.sys.power", value) end @doc """ sets current playack mode """ def set_mode(conn, mode) do Connector.handle_set(conn, "netRemote.sys.mode", mode) end @doc """ navigates to the the root node """ def nav_reset(conn) do nav_to(conn, -1) end @doc """ navigates inside a map map type is 0 """ def nav_to(conn, value) do Connector.handle_set(conn, "netRemote.nav.action.navigate", value) end @doc """ selects current item to play map type is not 0 """ def nav_select(conn, value) do Connector.handle_set(conn, "netRemote.nav.action.selectItem", value) end @doc """ navigates 1 level up """ def nav_back(conn) do nav_to(conn, "0xffffffff") end @doc """ TODO """ def search(conn, value) do Connector.handle_set(conn, "netRemote.nav.searchTerm", value) end @doc """ returns the number of items in current menu """ def nav_num_items(conn) do Connector.handle_get(conn, "netRemote.nav.numItems") end @doc """ returns items in current menu optional pagination params from = default -1 items = default 100 """ def nav_menu(conn) do ExFrontier.Connector.handle_list(conn, "netRemote.nav.list") end @doc """ returns status of the unit 0 - loading 1 - ready """ def get_status(conn) do Connector.handle_get(conn, "netRemote.nav.status") end @doc """ returns navigation state 0 - disabled 1 - enabled """ def nav_state(conn) do Connector.handle_get(conn, "netRemote.nav.state") end @doc """ disables navigation """ def nav_disable(conn) do Connector.handle_set(conn, "netRemote.nav.state", 0) end @doc """ enables navigation """ def nav_enable(conn) do Connector.handle_set(conn, "netRemote.nav.state", 1) end @doc """ returns notifications or timeouts if none are sent """ def get_notifies(conn) do Connector.handle_get_notifies(conn) end end