gdbus is used in Gnome, but it also works with KDE.
Script is using mpc (media player client) to control the playback.
Script is using mpc (media player client) to control the playback.
It supports:
- parameter play starts the mpd daemon, if the daemon was already started then toggles playback
- parameter stop stops the playback, kill the daemon
- parameter next and prev skip to the next and previous song
- parameter current returns 0 when actual song exists or 1 if the song was removed
- parameter del remove actual playing song, you can use del y for skipping any prompts for confirmation
- parameter help diplays script options
- notifications are shown when the song has change or when the mpd state has changed (using play and stop parameters) and when the playing song was removed.
Here's the script:
#!/bin/bash
if [ $# -eq 0 ];then
echo Invalid count of parameters, type \'$0 help\' for help.;
exit 1;
fi
MPCCMD="mpc"
MUSICDIR=~/music
ICONDIR=~/.icons/
#display notification (parameters: $1=appname; $2=summary; $3=body; $4=icon)
dbusnotify(){
stat=`$MPCCMD | sed -n '2p' | cut -d " " -f 1`
title=`$MPCCMD | head -n 1`
#store actual song number for song change notification
$MPCCMD | sed -n '2p' | cut -d "#" -f 2 | cut -d "/" -f 1 > /tmp/mpdsong
case "$1" in
"play" ) if [ "$stat" == "[playing]" ]; then icon=player_play; else icon=player_pause; fi ;;
"stop" ) icon=player_stop; stat="[stopped]" ;;
"prev" ) icon=player_start ;;
"next" ) icon=player_end ;;
"current" ) icon=reload ;;
"del" ) icon=remove; stat="[removed]" ;;
* ) icon=messagebox_warning; stat=$MPCCMDctrl; title="Unknown operation";;
esac
notify-send "$stat" \ "$title" -t 5000 -i $icon
###
# uncomment following lines to enable notification via dbus, don't forget to comment previous line 'notify-send'
###
# msgid=`gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify "mpc" 42 "$ICONDIR$icon" "$stat" "$title" [] {} 3000 | cut -d " " -f 2 | cut -d "," -f 1`
###
# no need to kill in KDE4
###
# #kill previous msg
# let prevmsgid=$msgid-1
#
# gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification $prevmsgid > /dev/null
#
# #time to wait before closing notification
# (sleep 3
# gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification $msgid > /dev/null) &
}
#enabling notifications (0|1)
notifications=1
case "$1" in
"play" )
#if mpd is not started, 0 is returned
run=$($MPCCMD stats | grep -c "")
#if mpd is not started, start it and play music
#else toggle play/pause
if [ "$run" == "0" ];then
mpd ~/.mpd/mpd.conf; sleep 1;
$MPCCMD play;
if [ $notifications -eq 1 ]; then
dbusnotify play
fi
else
$MPCCMD toggle
if [ $notifications -eq 1 ]; then
dbusnotify play
fi
fi
;;
"stop" )
#if mpc is in state 'stopped', 1 is returned, otherwise some greater number is returned
stopped=$($MPCCMD | grep -c "")
stopplaying="$MPCCMD stop"
if [ "$stopped" == "1" ];then
mpd --kill;
else
$MPCCMD stop;
if [ $notifications -eq 1 ]; then
dbusnotify stop
fi
fi
;;
"next" )
#stopped=$($MPCCMD | grep -c "")
#if [ "$stopped" != "0" ];then
$MPCCMD next;
if [ $notifications -eq 1 ]; then
dbusnotify next
fi
;;
"prev" )
#stopped=$($MPCCMD | grep -c "")
#if [ "$stopped" != "0" ];then
$MPCCMD prev;
if [ $notifications -eq 1 ]; then
dbusnotify prev
fi
;;
"current" )
#path to currently playing song
pathtofile=$($MPCCMD --format "%file%" | head -n 1)
#move to Music DIR, because pathtofile works from here
cd $MUSICDIR;
exists=$(ls "$pathtofile" 2>/dev/null)
#if $MPCCMD is stopped, 1 is returned
stopped=$($MPCCMD | grep -c "")
if [ "$pathtofile" != "$exists" ] && [ "$stopped" != "1" ];then
#number 1 is indicating that current playing song is removed (does not exist)
echo 1;
else echo 0;
fi
#notify if song has changed
#song number in file
songnr=`cat /tmp/mpdsong 2>/dev/null`
#actual song number
actual=`$MPCCMD | sed -n '2p' | cut -d "#" -f 2 | cut -d "/" -f 1`
if [ ! -f /tmp/mpdsong ] || [ "$songnr" != "$actual" ]; then
dbusnotify current
fi
;;
"del" )
#store current song name
current=$($MPCCMD current)
#path to current song
pathtofile=$($MPCCMD --format "%file%" | head -n 1)
cd $MUSICDIR;
#if 'del y' was given at the cmd line, delete file without any question
if [ "$2" == 'y' ]; then
echo "File removed.";
if [ $notifications -eq 1 ]; then
dbusnotify del
fi
exec rm "$pathtofile";
fi
echo ""
#ask for confirmation
echo "Type 'y' if you want to remove this file > " $current;
read del;
if [ 'y' == "$del" ]; then
echo "File removed.";
exec rm "$pathtofile";
else
echo File not removed.;
fi
;;
"help" )
echo ""
echo "KrisKo 2010"
echo ""
echo "Usage: mpcctrl [OPTION]"
echo ""
echo "Script accepts following options:"
echo "play start mpd and toggle between play/pause"
echo "stop stop mpd playback and end mpd"
echo "next play next song"
echo "prev play previous song"
echo "current display if current song is removed"
echo "del delete current song"
echo "del y delete current song without prompt"
echo "help display this help"
echo ""
;;
* )
echo "Unrecognized parameter. Type '$0 help' for help"
;;
esac
exit 0
______________________________________________________________________________________I use this script with conky which displays playback information...
Here's my conkyrc:
______________________________________________________________________________________
#define variables
template0 0
template1 1
TEXT
$if_mpd_playing${color blue}${mpd_status} ${color white}${mpd_elapsed}/${mpd_length} ${color blue}Volume:${color white}${mpd_vol}% ${color blue}Shuffle:${color white}${mpd_random} ${color blue}Random:${color white}${mpd_repeat} ${color blue}Bitrate:${color white}${mpd_bitrate}kbps
${color blue}${mpd_bar 3 450}
${color white}${if_match ${template1} == ${exec mpcctrl current}}${color red}${endif}${mpd_smart}${endif}

I'm getting
ReplyDelete"
sleep: invalid option -- '-'
Try `sleep --help' for more information.
"
I guess its because of line 29.
Hi, yes there is an error an the line 29.
ReplyDeletethe gdbus should be on a new line:
(sleep 3
gdbus call...
or you can put ';' behind sleep:
sleep 3; gdbus...