Download
(require 'dbus)
(defgroup mpris nil
"Media player remote control via dbus,
goto http://wiki.xmms2.xmms.se/wiki/MPRIS for detail."
:group 'multimedia
:group 'applications)
(defcustom mpris-service
"org.mpris.audacious"
"Default MPRIS dbus service."
:type 'string
:group 'mpris)
(defcustom mpris-timeout
2000
"Default MPRIS dbus timeout(in milliseconds)."
:type 'integer
:group 'mpris)
(defun mpris-call (interface method &rest args)
"Make mpris dbus call."
(apply 'dbus-call-method
(append `(:session
,mpris-service
,interface
"org.freedesktop.MediaPlayer"
,method
:timeout
,mpris-timeout)
args)))
(defun mpris-track-list-call (method &rest args)
"Call /TrackList object method."
(apply 'mpris-call
(append `("/TrackList" ,method) args)))
(defun mpris-player-call (method &rest args)
"Call /Player object method."
(apply 'mpris-call
(append `("/Player" ,method) args)))
(defun mpris-identity ()
(mpris-call "/" "Identity"))
(defun mpris-quit ()
(mpris-call "/" "Quit"))
(defun mpris-version ()
(interactive)
(mpris-call "/" "MprisVersion"))
(defun mpris-get-metadata (&optional pos)
(if pos (mpris-track-list-call "GetMetadata" :int32 pos)
(mpris-player-call "GetMetadata")))
(defun mpris-get-current-track ()
(mpris-track-list-call "GetCurrentTrack"))
(defun mpris-get-length ()
(mpris-track-list-call "GetLength"))
(defun mpris-add-track (file instantly)
(mpris-track-list-call "AddTrack"
:string file
:boolean instantly))
(defun mpris-del-track (pos)
(mpris-track-list-call "DelTrack"
:int32 pos))
(defun mpris-set-loop (set-loop)
(mpris-track-list-call "SetLoop" :boolean set-loop))
(defun mpris-set-random (set-random)
(mpris-track-list-call "SetRandom" :boolean set-random))
(defun mpris-next ()
(interactive)
(mpris-player-call "Next"))
(defun mpris-prev ()
(interactive)
(mpris-player-call "Prev"))
(defun mpris-pause ()
(interactive)
(mpris-player-call "Pause"))
(defun mpris-stop ()
(interactive)
(mpris-player-call "Stop"))
(defun mpris-play ()
(interactive)
(mpris-player-call "Play"))
(defun mpris-repeat (set-repeat)
(mpris-player-call "Repeat" :boolean set-repeat))
(defun mpris-get-status ()
(mpris-player-call "GetStatus"))
(defun mpris-get-caps ()
(mpris-player-call "GetCaps"))
(defun mpris-volume-get ()
(mpris-player-call "VolumeGet"))
(defun mpris-volume-set (volume)
(interactive "nvolume:")
(mpris-player-call "VolumeSet" :int32 volume))
(defun mpris-position-get ()
(mpris-player-call "PositionGet"))
(defun mpris-position-set (pos)
(interactive "nposition(in ms):")
(mpris-player-call "PositionSet" :int32 pos))
(defun mpris-simplify-metadata (data)
"Simpify metadata from format ((keyword (value))) to ((keyword . value))"
(mapcar (lambda (i)
(let ((field (intern (car i)))
(value (caadr i)))
(when (and (member field '(audio-bitrate
audio-samplerate
mtime
time
tracknumber))
(stringp value))
(setq value (string-to-number value)))
(cons field value)))
data))
(defun mpris-toggle-play ()
"Toggle play/pause, when not stop."
(interactive)
(let ((p (car (mpris-get-status))))
(when (< p 2)
(if (= p 0) (mpris-pause)
(mpris-play)))))
(provide 'mpris-dbus)