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" }