121 lines
2.6 KiB
Go
121 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"html"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/godbus/dbus/v5"
|
|
)
|
|
|
|
var HEADSET_PATH = dbus.ObjectPath("/org/bluez/hci0/dev_" + strings.ReplaceAll(HEADSET, ":", "_"))
|
|
|
|
func dbus_system_handler(feedback chan bool) {
|
|
// watches for BT headset connections
|
|
headsetObjectPath := "/org/bluez/hci0/dev_" + strings.ReplaceAll(HEADSET, ":", "_")
|
|
|
|
err := CONN.dbusSystem.AddMatchSignal(
|
|
dbus.WithMatchObjectPath(dbus.ObjectPath(headsetObjectPath)),
|
|
dbus.WithMatchInterface("org.freedesktop.DBus.Properties"),
|
|
)
|
|
if err != nil {
|
|
warn("Failed to add match signal", err)
|
|
return
|
|
}
|
|
|
|
sigs := make(chan *dbus.Signal, 1)
|
|
CONN.dbusSystem.Signal(sigs)
|
|
|
|
for range sigs {
|
|
CACHE.Delete(CACHE_BT_CONNECTED)
|
|
CACHE.Delete(CACHE_BT_BATTERY)
|
|
feedback <- true
|
|
}
|
|
}
|
|
|
|
func dbus_session_handler(feedback chan bool) {
|
|
// watches for media changes
|
|
err := CONN.dbusSession.AddMatchSignal(
|
|
dbus.WithMatchObjectPath("/org/mpris/MediaPlayer2"),
|
|
dbus.WithMatchInterface("org.freedesktop.DBus.Properties"),
|
|
)
|
|
if err != nil {
|
|
warn("Failed to add match signal", err)
|
|
return
|
|
}
|
|
|
|
sigs := make(chan *dbus.Signal, 1)
|
|
CONN.dbusSession.Signal(sigs)
|
|
|
|
for range sigs {
|
|
CACHE.Delete(CACHE_MEDIA)
|
|
feedback <- true
|
|
}
|
|
}
|
|
|
|
func get_bt_headset_connected() bool {
|
|
obj := CONN.dbusSystem.Object("org.bluez", HEADSET_PATH)
|
|
|
|
status, err := obj.GetProperty("org.bluez.Device1.Connected")
|
|
if err == nil {
|
|
if status.String() == "true" {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func get_bt_headset_battery() string {
|
|
obj := CONN.dbusSystem.Object("org.bluez", HEADSET_PATH)
|
|
|
|
status, err := obj.GetProperty("org.bluez.Battery1.Percentage")
|
|
if err == nil {
|
|
return fmt.Sprintf("%v", status.Value())
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
func get_playing_spotify_media() string {
|
|
var output strings.Builder
|
|
obj := CONN.dbusSession.Object("org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2")
|
|
|
|
metadata, err := obj.GetProperty("org.mpris.MediaPlayer2.Player.Metadata")
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
status, err := obj.GetProperty("org.mpris.MediaPlayer2.Player.PlaybackStatus")
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
if status.String() != "\"Playing\"" {
|
|
output.WriteString("‖ ")
|
|
}
|
|
|
|
metadataMap := metadata.Value().(map[string]dbus.Variant)
|
|
artists := make([]string, 1)
|
|
metadataMap["xesam:artist"].Store(&artists)
|
|
title := metadataMap["xesam:title"].String()
|
|
|
|
titleUnquoted, err := strconv.Unquote(title)
|
|
if err != nil {
|
|
titleUnquoted = "bug: strconv unquoting fail"
|
|
}
|
|
|
|
if titleUnquoted == "" {
|
|
return ""
|
|
}
|
|
|
|
output.WriteString(fmt.Sprintf(
|
|
"%s - %s",
|
|
strings.Join(artists, ", "),
|
|
titleUnquoted,
|
|
))
|
|
|
|
return html.EscapeString(output.String())
|
|
}
|