summaryrefslogtreecommitdiffhomepage
path: root/src/Xmobar/Plugins/Monitors
diff options
context:
space:
mode:
authorClaudio Bley <claudio.bley@gmail.com>2025-03-31 17:07:19 +0200
committerClaudio Bley <claudio.bley@gmail.com>2025-03-31 17:07:22 +0200
commitc6976e852e4c9a8cd590c1c87eb6d7d9c6ce23c0 (patch)
tree220f0c7ff57141c86312e109cc26423caa76c33c /src/Xmobar/Plugins/Monitors
parent7390d759240785f660cbdb0ca55898732aa12c98 (diff)
downloadxmobar-c6976e852e4c9a8cd590c1c87eb6d7d9c6ce23c0.tar.gz
xmobar-c6976e852e4c9a8cd590c1c87eb6d7d9c6ce23c0.tar.bz2
mpris: Read track length from Word64 too
According to the MPRIS v2 spec, the length of a track "must be given in microseconds, and be represented as a signed 64-bit integer". [1] But Spotify does not follow the spec and represents it as an unsigned 64-bit integer: ``` $ dbus-send --session --print-reply --reply-timeout=150 --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata method return time=1743433787.301824 sender=:1.142 -> destination=:1.178 serial=1071 reply_serial=2 variant array [ dict entry( string "mpris:length" variant uint64 152000000 ) ... ``` This always made the `length` template argument end up empty, but allowing a Word64 for this attribute fixes this problem. [1]: https://specifications.freedesktop.org/mpris-spec/latest/Track_List_Interface.html#Mapping:Metadata_Map
Diffstat (limited to 'src/Xmobar/Plugins/Monitors')
-rw-r--r--src/Xmobar/Plugins/Monitors/Mpris.hs10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/Xmobar/Plugins/Monitors/Mpris.hs b/src/Xmobar/Plugins/Monitors/Mpris.hs
index ee30ad3..eb9595b 100644
--- a/src/Xmobar/Plugins/Monitors/Mpris.hs
+++ b/src/Xmobar/Plugins/Monitors/Mpris.hs
@@ -28,7 +28,7 @@ import qualified DBus.Client as DC
import Control.Arrow ((***))
import Data.Maybe ( fromJust )
import Data.Int ( Int32, Int64 )
-import Data.Word ( Word32 )
+import Data.Word ( Word32, Word64 )
import System.IO.Unsafe ( unsafePerformIO )
import Control.Exception (try)
@@ -136,17 +136,17 @@ makeList version md = map getStr (fieldsList version) where
"xesam:trackNumber" -> printf "%02d" num
_ -> (show::Int32 -> String) num
pw32 v = printf "%02d" (fromVar v::Word32)
- plen str v = let num = fromVar v in
- case str of
+ plen str num = case str of
"mpris:length" -> formatTime (num `div` 1000000)
- _ -> (show::Int64 -> String) num
+ _ -> show num
getStr str = case lookup str md of
Nothing -> ""
Just v -> case variantType v of
TypeString -> fromVar v
TypeInt32 -> pInt str v
TypeWord32 -> pw32 v
- TypeInt64 -> plen str v
+ TypeWord64 -> plen str (fromVar v :: Word64)
+ TypeInt64 -> plen str (fromVar v :: Int64)
TypeArray TypeString ->
let x = arrayItems (fromVar v) in
if null x then "" else fromVar (head x)