mirror of
https://github.com/Xevion/go-ha.git
synced 2025-12-05 23:15:07 -06:00
Additionally, removed the context that gets passed into the Services but isn't used in one of them. The websockets APIs also don't have any use for context.
270 lines
7.2 KiB
Go
270 lines
7.2 KiB
Go
package services
|
|
|
|
import (
|
|
ws "saml.dev/gome-assistant/internal/websocket"
|
|
)
|
|
|
|
/* Structs */
|
|
|
|
type MediaPlayer struct {
|
|
conn *ws.WebsocketWriter
|
|
}
|
|
|
|
/* Public API */
|
|
|
|
// Send the media player the command to clear players playlist.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) ClearPlaylist(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "clear_playlist"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Group players together. Only works on platforms with support for player groups.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) Join(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "join"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command for next track.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) Next(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "media_next_track"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command for pause.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) Pause(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "media_pause"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command for play.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) Play(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "media_play"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Toggle media player play/pause state.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) PlayPause(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "media_play_pause"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command for previous track.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) Previous(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "media_previous_track"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command to seek in current playing media.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) Seek(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "media_seek"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the stop command.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) Stop(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "media_stop"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command for playing media.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) PlayMedia(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "play_media"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Set repeat mode. Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) RepeatSet(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "repeat_set"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command to change sound mode.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) SelectSoundMode(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "select_sound_mode"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Send the media player the command to change input source.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) SelectSource(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "select_source"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Set shuffling state.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) Shuffle(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "shuffle_set"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Toggles a media player power state.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) Toggle(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "toggle"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Turn a media player power off.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) TurnOff(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "turn_off"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Turn a media player power on.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) TurnOn(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "turn_on"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Unjoin the player from a group. Only works on
|
|
// platforms with support for player groups.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) Unjoin(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "unjoin"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Turn a media player volume down.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) VolumeDown(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "volume_down"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Mute a media player's volume.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) VolumeMute(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "volume_mute"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Set a media player's volume level.
|
|
// Takes an entityId and an optional
|
|
// map that is translated into service_data.
|
|
func (mp MediaPlayer) VolumeSet(entityId string, serviceData ...map[string]any) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "volume_set"
|
|
if len(serviceData) != 0 {
|
|
req.ServiceData = serviceData[0]
|
|
}
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|
|
|
|
// Turn a media player volume up.
|
|
// Takes an entityId.
|
|
func (mp MediaPlayer) VolumeUp(entityId string) error {
|
|
req := NewBaseServiceRequest(entityId)
|
|
req.Domain = "media_player"
|
|
req.Service = "volume_up"
|
|
|
|
return mp.conn.WriteMessage(req)
|
|
}
|