79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
|
package chromecast
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"forge.cadoles.com/arcad/edge/pkg/module/cast"
|
||
|
gcast "github.com/barnybug/go-cast"
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
type Client struct {
|
||
|
client *gcast.Client
|
||
|
}
|
||
|
|
||
|
// Close implements cast.Client.
|
||
|
func (c *Client) Close() error {
|
||
|
c.client.Close()
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Load implements cast.Client.
|
||
|
func (c *Client) Load(ctx context.Context, url string) error {
|
||
|
controller, err := c.client.URL(ctx)
|
||
|
if err != nil {
|
||
|
return errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
// Ignore context.DeadlineExceeded errors. github.com/barnybug/go-cast bug ?
|
||
|
if _, err := controller.LoadURL(ctx, url); err != nil && !isLoadURLContextExceeded(err) {
|
||
|
return errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Status implements cast.Client.
|
||
|
func (c *Client) Status(ctx context.Context) (cast.DeviceStatus, error) {
|
||
|
ctrlStatus, err := c.client.Receiver().GetStatus(ctx)
|
||
|
if err != nil {
|
||
|
return nil, errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
status := &DeviceStatus{
|
||
|
CurrentApp: DeviceStatusCurrentApp{
|
||
|
ID: "",
|
||
|
DisplayName: "",
|
||
|
StatusText: "",
|
||
|
},
|
||
|
Volume: DeviceStatusVolume{
|
||
|
Level: *ctrlStatus.Volume.Level,
|
||
|
Muted: *ctrlStatus.Volume.Muted,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
if len(ctrlStatus.Applications) > 0 {
|
||
|
status.CurrentApp.ID = *ctrlStatus.Applications[0].AppID
|
||
|
status.CurrentApp.DisplayName = *ctrlStatus.Applications[0].DisplayName
|
||
|
status.CurrentApp.StatusText = *ctrlStatus.Applications[0].StatusText
|
||
|
}
|
||
|
|
||
|
return status, nil
|
||
|
}
|
||
|
|
||
|
// Unload implements cast.Client.
|
||
|
func (c *Client) Unload(ctx context.Context) error {
|
||
|
if _, err := c.client.Receiver().QuitApp(ctx); err != nil {
|
||
|
return errors.WithStack(err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
var _ cast.Client = &Client{}
|
||
|
|
||
|
// False positive workaround.
|
||
|
func isLoadURLContextExceeded(err error) bool {
|
||
|
return err.Error() == "Failed to send load command: context deadline exceeded"
|
||
|
}
|