Skip to content

Commit fbe3429

Browse files
committed
feat: add time left and apply rich presence on startup
1 parent 67723b5 commit fbe3429

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

main.go

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"os"
66
"strings"
7+
"time"
78

89
"github.com/godbus/dbus/v5"
910
"github.com/TorchedSammy/go-mpris"
@@ -20,6 +21,7 @@ func main() {
2021
if err != nil {
2122
panic(err)
2223
}
24+
2325
if len(names) == 0 {
2426
fmt.Println("No MPRIS player found.")
2527
os.Exit(1)
@@ -32,38 +34,66 @@ func main() {
3234
var rules = []string{
3335
"type='signal',member='PropertiesChanged',path='/org/mpris/MediaPlayer2',interface='org.freedesktop.DBus.Properties'",
3436
}
37+
3538
var flag uint = 0
3639

40+
data := dbus.Variant{}
41+
elapsedFromDbus := dbus.Variant{}
42+
conn.Object(name, "/org/mpris/MediaPlayer2").Call("org.freedesktop.DBus.Properties.Get", 0, "org.mpris.MediaPlayer2.Player", "Metadata").Store(&data)
43+
conn.Object(name, "/org/mpris/MediaPlayer2").Call("org.freedesktop.DBus.Properties.Get", 0, "org.mpris.MediaPlayer2.Player", "Position").Store(&elapsedFromDbus)
44+
initialMetadata := data.Value().(map[string]dbus.Variant)
45+
elapsed := elapsedFromDbus.Value().(int64)
46+
3747
call := conn.BusObject().Call("org.freedesktop.DBus.Monitoring.BecomeMonitor", 0, rules, flag)
3848
if call.Err != nil {
3949
fmt.Fprintln(os.Stderr, "Failed to become monitor:", call.Err)
4050
os.Exit(1)
4151
}
4252

4353
client.Login("902662551119224852")
54+
// the reason why we add a subtracted Duration is because
55+
// time.Sub returns a Duration but i need a Time
56+
// confusing huh? thanks go
57+
setPresence(initialMetadata, time.Now().Add(-time.Duration(elapsed) * time.Microsecond))
4458
c := make(chan *dbus.Message, 10)
4559
conn.Eavesdrop(c)
4660
for msg := range c {
4761
if len(msg.Body) <= 1 {
4862
continue
4963
}
50-
bodyMap := msg.Body[1].(map[string]dbus.Variant)
51-
if bodyMap["Metadata"].Value() == nil {
64+
metadata := getMetadata(msg.Body[1])
65+
if metadata == nil {
5266
continue
5367
}
54-
metadata := bodyMap["Metadata"].Value().(map[string]dbus.Variant)
55-
artists := strings.Join(metadata["xesam:artist"].Value().([]string), ", ")
56-
client.SetActivity(client.Activity{
57-
Details: metadata["xesam:title"].Value().(string),
58-
State: "on " + metadata["xesam:album"].Value().(string) + " by " + artists,
59-
LargeImage: "music",
60-
LargeText: "cmus",
61-
SmallImage: "playing",
62-
SmallText: "Playing",
63-
/*Timestamps: &client.Timestamps{
64-
Start: &start,
65-
},*/
66-
})
68+
setPresence(*metadata, time.Now())
6769
}
70+
}
71+
72+
func getMetadata(msgbody interface{}) *map[string]dbus.Variant {
73+
bodyMap := msgbody.(map[string]dbus.Variant)
74+
if bodyMap["Metadata"].Value() == nil {
75+
return nil
76+
}
77+
metadataMap := bodyMap["Metadata"].Value().(map[string]dbus.Variant)
78+
79+
return &metadataMap
80+
}
81+
82+
func setPresence(metadata map[string]dbus.Variant, songstamp time.Time) {
83+
songLength := metadata["mpris:length"].Value().(int64)
84+
stampTime := songstamp.Add(time.Duration(songLength) * time.Microsecond)
6885

86+
artists := strings.Join(metadata["xesam:artist"].Value().([]string), ", ")
87+
client.SetActivity(client.Activity{
88+
Details: metadata["xesam:title"].Value().(string),
89+
State: "on " + metadata["xesam:album"].Value().(string) + " by " + artists,
90+
LargeImage: "music",
91+
LargeText: "cmus",
92+
SmallImage: "playing",
93+
SmallText: "Playing",
94+
Timestamps: &client.Timestamps{
95+
Start: &songstamp,
96+
End: &stampTime,
97+
},
98+
})
6999
}

0 commit comments

Comments
 (0)