{-# LANGUAGE TupleSections #-}
module XMonad.Util.Spotify (
mediaKeys
, audioPrev
, audioNext
, audioPlayPause
) where
import Control.Arrow (first)
import Control.Monad.IO.Class
import qualified Data.Map as M
import DBus
import DBus.Client
import Graphics.X11.ExtraTypes.XF86
import Graphics.X11.Types
import XMonad.Core
mediaKeys :: M.Map (KeyMask, KeySym) (X ()) -> M.Map (KeyMask, KeySym) (X ())
mediaKeys = M.union mediaKeyMap
where mediaKeyMap = M.fromList mediaKeyList
mediaKeyList :: [((KeyMask, KeySym), X ())]
mediaKeyList = go <$> [ (xF86XK_AudioNext, audioNext)
, (xF86XK_AudioPrev, audioPrev)
, (xF86XK_AudioPlay, audioPlayPause)
]
where go = first (0 ,)
spIO :: String -> IO ()
spIO str = do
client <- connectSession
_ <- call_ client (methodCall (objectPath_ "/org/mpris/MediaPlayer2") (interfaceName_ "org.mpris.MediaPlayer2.Player") (memberName_ str))
{ methodCallDestination = Just (busName_ "org.mpris.MediaPlayer2.spotify") }
disconnect client
sp :: String -> X ()
sp = liftIO . spIO
audioNext :: X ()
audioNext = sp "Next"
audioPrev :: X ()
audioPrev = sp "Previous"
audioPlayPause :: X ()
audioPlayPause = sp "PlayPause"