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