{-# 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
mediaKeys :: MonadIO m => M.Map (KeyMask, KeySym) (m ()) -> M.Map (KeyMask, KeySym) (m ())
mediaKeys = M.union mediaKeyMap
where mediaKeyMap = M.fromList mediaKeyList
mediaKeyList :: MonadIO m => [((KeyMask, KeySym), m ())]
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 :: MonadIO m => String -> m ()
sp = liftIO . spIO
audioNext :: MonadIO m => m ()
audioNext = sp "Next"
audioPrev :: MonadIO m => m ()
audioPrev = sp "Previous"
audioPlayPause :: MonadIO m => m ()
audioPlayPause = sp "PlayPause"