diff options
| author | Claudio Bley <claudio.bley@gmail.com> | 2025-03-31 17:07:19 +0200 | 
|---|---|---|
| committer | Claudio Bley <claudio.bley@gmail.com> | 2025-03-31 17:07:22 +0200 | 
| commit | c6976e852e4c9a8cd590c1c87eb6d7d9c6ce23c0 (patch) | |
| tree | 220f0c7ff57141c86312e109cc26423caa76c33c /src/Xmobar/Plugins/Monitors | |
| parent | 7390d759240785f660cbdb0ca55898732aa12c98 (diff) | |
| download | xmobar-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.hs | 10 | 
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) | 
