mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
- Reference original API documentation source from Bose Corporation - Link to official Bose SoundTouch End-of-Life page - Clarify this is an independent implementation - Add disclaimer about non-affiliation with Bose Corporation - Provide both online and local documentation references
130 lines
3.4 KiB
Go
130 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/gesellix/bose-soundtouch/pkg/models"
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
// getVolume handles getting the current volume level
|
|
func getVolume(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
PrintDeviceHeader("Getting current volume", clientConfig.Host, clientConfig.Port)
|
|
|
|
volume, err := client.GetVolume()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get volume: %w", err)
|
|
}
|
|
|
|
fmt.Printf("Current Volume:\n")
|
|
fmt.Printf(" Device ID: %s\n", volume.DeviceID)
|
|
fmt.Printf(" Current Level: %d (%s)\n", volume.GetLevel(), models.GetVolumeLevelName(volume.GetLevel()))
|
|
fmt.Printf(" Target Level: %d\n", volume.GetTargetLevel())
|
|
fmt.Printf(" Muted: %v\n", volume.IsMuted())
|
|
|
|
if !volume.IsVolumeSync() {
|
|
fmt.Printf(" Note: Volume is adjusting (target: %d, actual: %d)\n", volume.GetTargetLevel(), volume.GetLevel())
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// setVolume handles setting the volume level
|
|
func setVolume(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
level := c.Int("level")
|
|
if level < 0 || level > 100 {
|
|
return fmt.Errorf("volume level must be between 0 and 100, got %d", level)
|
|
}
|
|
|
|
// Safety warning for loud volumes
|
|
if level > 30 {
|
|
PrintWarning(fmt.Sprintf("Setting volume to %d (this is quite loud!)", level))
|
|
fmt.Printf("Proceeding in 2 seconds... Press Ctrl+C to cancel\n")
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Setting volume to %d", level), clientConfig.Host, clientConfig.Port)
|
|
|
|
err = client.SetVolume(level)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to set volume: %w", err)
|
|
}
|
|
|
|
// Get updated volume to confirm
|
|
volume, err := client.GetVolume()
|
|
if err != nil {
|
|
PrintSuccess("Volume set successfully")
|
|
} else {
|
|
PrintSuccess(fmt.Sprintf("Volume set to %d (%s)", volume.GetLevel(), models.GetVolumeLevelName(volume.GetLevel())))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// volumeUp handles increasing the volume
|
|
func volumeUp(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
amount := c.Int("amount")
|
|
if amount < 1 || amount > 10 {
|
|
return fmt.Errorf("volume increase amount must be between 1 and 10, got %d", amount)
|
|
}
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Increasing volume by %d", amount), clientConfig.Host, clientConfig.Port)
|
|
|
|
volume, err := client.IncreaseVolume(amount)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to increase volume: %w", err)
|
|
}
|
|
|
|
PrintSuccess(fmt.Sprintf("Volume increased to %d (%s)", volume.GetLevel(), models.GetVolumeLevelName(volume.GetLevel())))
|
|
|
|
return nil
|
|
}
|
|
|
|
// volumeDown handles decreasing the volume
|
|
func volumeDown(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
amount := c.Int("amount")
|
|
if amount < 1 || amount > 10 {
|
|
return fmt.Errorf("volume decrease amount must be between 1 and 10, got %d", amount)
|
|
}
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Decreasing volume by %d", amount), clientConfig.Host, clientConfig.Port)
|
|
|
|
volume, err := client.DecreaseVolume(amount)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to decrease volume: %w", err)
|
|
}
|
|
|
|
PrintSuccess(fmt.Sprintf("Volume decreased to %d (%s)", volume.GetLevel(), models.GetVolumeLevelName(volume.GetLevel())))
|
|
|
|
return nil
|
|
}
|