Create a gist now

Instantly share code, notes, and snippets.

@wandernauta /sp
Last active Mar 27, 2017

sp is a command-line client for Spotify's dbus interface. Play, pause, skip and search tracks from the comfort of your command line.
#!/usr/bin/env bash
# This is sp, the command-line Spotify controller. It talks to a running
# instance of the Spotify Linux client over dbus, providing an interface not
# unlike mpc.
# Put differently, it allows you to control Spotify without leaving the comfort
# of your command line, and without a custom client or Premium subscription.
# As an added bonus, it also works with ssh, at and cron.
# Example:
# $ sp weather girls raining men
# $ sp current
# Album 100 Hits Of The '80s
# Artist The Weather Girls
# Title It's Raining Men
# $ sp pause
# Alarm clock example:
# $ at 7:45 <<< 'sp bangarang'
# Remote example:
# $ ssh vader@prod02.nomoon.ta 'sp imperial march'
# Copyright (C) 2013 Wander Nauta
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software, to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject to the following
# conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# The software is provided "as is", without warranty of any kind, express or
# implied, including but not limited to the warranties of merchantability,
# fitness for a particular purpose and noninfringement. In no event shall the
# authors or copyright holders be liable for any claim, damages or other
# liability, whether in an action of contract, tort or otherwise, arising from,
# out of or in connection with the software or the use or other dealings in the
# software.
shopt -s expand_aliases
function require {
hash $1 2>/dev/null || {
echo >&2 "Error: '$1' is required, but was not found."; exit 1;
# We need dbus-send to talk to Spotify.
require dbus-send
# Assert standard Unix utilities are available.
require grep
require sed
require cut
require tr
function sp-dbus {
# Sends the given method to Spotify over dbus.
dbus-send --print-reply --dest=$SP_DEST $SP_PATH $SP_MEMB.$1 ${*:2} > /dev/null
function sp-open {
# Opens the given spotify: URI in Spotify.
sp-dbus OpenUri string:$1
function sp-metadata {
# Prints the currently playing track in a parseable format.
dbus-send \
--print-reply `# We need the reply.` \
--dest=$SP_DEST \
org.freedesktop.DBus.Properties.Get \
string:"$SP_MEMB" string:'Metadata' \
| grep -Ev "^method" `# Ignore the first line.` \
| grep -Eo '("(.*)")|(\b[0-9][a-zA-Z0-9.]*\b)' `# Filter interesting fiels.`\
| sed -E '2~2 a|' `# Mark odd fields.` \
| tr -d '\n' `# Remove all newlines.` \
| sed -E 's/\|/\n/g' `# Restore newlines.` \
| sed -E 's/(xesam:)|(mpris:)//' `# Remove ns prefixes.` \
| sed -E 's/^"//' `# Strip leading...` \
| sed -E 's/"$//' `# ...and trailing quotes.` \
| sed -E 's/"+/|/' `# Regard "" as seperator.` \
| sed -E 's/ +/ /g' `# Merge consecutive spaces.`
function sp-current {
# Prints the currently playing track in a friendly format.
require column
sp-metadata \
| grep --color=never -E "(title)|(album)|(artist)" \
| sed 's/^\(.\)/\U\1/' \
| column -t -s'|'
function sp-eval {
# Prints the currently playing track as shell variables, ready to be eval'ed
require sort
sp-metadata \
| grep --color=never -E "(title)|(album)|(artist)|(trackid)|(trackNumber)" \
| sort -r \
| sed 's/^\([^|]*\)\|/\U\1/' \
| sed -E 's/\|/="/' \
| sed -E 's/$/"/' \
| sed -E 's/^/SPOTIFY_/'
function sp-art {
# Prints the artUrl.
sp-metadata | grep "artUrl" | cut -d'|' -f2
function sp-display {
# Calls display on the artUrl.
require display
display $(sp-art)
function sp-feh {
# Calls feh on the artURl.
require feh
feh $(sp-art)
function sp-url {
# Prints the HTTP url.
TRACK=$(sp-metadata | grep "url" | cut -d'|' -f2 | cut -d':' -f3)
echo "$TRACK"
function sp-clip {
# Copies the HTTP url.
require xclip
sp-url | xclip
function sp-http {
# xdg-opens the HTTP url.
require xdg-open
xdg-open $(sp-url)
function sp-help {
# Prints usage information.
echo "Usage: sp [command]"
echo "Control a running Spotify instance from the command line."
echo ""
echo " sp play - Play/pause Spotify"
echo " sp pause - Pause Spotify"
echo " sp next - Go to next track"
echo " sp prev - Go to previous track"
echo ""
echo " sp current - Format the currently playing track"
echo " sp metadata - Dump the current track's metadata"
echo " sp eval - Return the metadata as a shell script"
echo ""
echo " sp art - Print the URL to the current track's album artwork"
echo " sp display - Display the current album artwork with \`display\`"
echo " sp feh - Display the current album artwork with \`feh\`"
echo ""
echo " sp url - Print the HTTP URL for the currently playing track"
echo " sp clip - Copy the HTTP URL to the X clipboard"
echo " sp http - Open the HTTP URL in a web browser"
echo ""
echo " sp open <uri> - Open a spotify: uri"
echo " sp search <q> - Start playing the best search result for the given query"
echo ""
echo " sp version - Show version information"
echo " sp help - Show this information"
echo ""
echo "Any other argument will start a search (i.e. 'sp foo' will search for foo)."
function sp-search {
# Searches for tracks, plays the first result.
require curl
curl -s -G --data-urlencode "q=$Q"\?type=track \
| grep -E -o "spotify:track:[a-zA-Z0-9]+" -m 1 \
sp-open $SPTFY_URI
function sp-version {
# Prints version information.
echo "sp $SP_VERSION"
echo "Copyright (C) 2013 Wander Nauta"
echo "License MIT"
alias sp-play=" sp-dbus PlayPause"
alias sp-pause=" sp-dbus Pause"
alias sp-next=" sp-dbus Next"
alias sp-prev=" sp-dbus Previous"
# First, we connect to the dbus session spotify is on. This isn't really needed
# when running locally, but is crucial when we don't have an X display handy
# (for instance, when running sp over ssh.)
SPOTIFY_PID="$(pidof -s spotify || pidof -s .spotify-wrapped)"
if [[ -z "$SPOTIFY_PID" ]]; then
echo "Error: Spotify is not running."
exit 1
QUERY_ENVIRON="$(cat /proc/${SPOTIFY_PID}/environ | tr '\0' '\n' | grep "DBUS_SESSION_BUS_ADDRESS" | cut -d "=" -f 2-)"
if [[ "${QUERY_ENVIRON}" != "" ]]; then
# Then we dispatch the command.
if [[ -z "$subcommand" ]]; then
# No arguments given, print help.
# Arguments given, check if it's a command.
if $(type sp-$subcommand > /dev/null 2> /dev/null); then
# It is. Run it.
eval "sp-$subcommand $@"
# It's not. Try a search.
eval "sp-search $@"

This works perfectly. Super handy. Thanks!


finally got my xfce4 pause/next/play key bindings to work with spotify.


Works great! Would there by an easy way to integrate login and logout into this script?

Ps0ke commented Nov 23, 2014

I've created an AUR package for Arch Linux users:


Nice script thank you for that !

ekyl commented May 10, 2015

How do I install this?


Thank!! 😄

jamespo commented Jun 14, 2015

Fantastic script


@wandernauta Thanks so much for this script! I've been using it to debug DBus support in the 1.x Spotify Linux client, it's been a real lifesaver. ;)

jianinz commented Sep 6, 2015

This is great, thank you so much!

johannfr commented Sep 8, 2015

Great script! Created another script that pauses spotify and then locks my (enlightenment) screen (which is also done over DBus). :D

juesato commented Dec 21, 2015

thanks a bunch - this works great!


still works! thanks!

kloga commented Apr 12, 2016
Excellent script to control Spotify from command line, to make shorcuts con media keys, and even automatize or integrate with Conky. Thank you so much :D

Thanks for the script! I found the search functionality broken due to Spotify deprecating their API, so I forked and fixed it:


Excellent stuff! Works like a boss with xbindkeys to replace the media keys on my work keyboard. Thanks so much.


Thanks! :)

dedeibel commented Sep 14, 2016 edited

Hi, any idea how to find out if spotify is currently playing or in pause state? Metatada does always return the currently active song.
Edit: I found this "solution" ... but it works

stumash commented Sep 14, 2016 edited

search does not work for me, it takes a moment and does/says nothing. open does work, though.
It looks like the Metadata API has been discontinued by Spotify so your search function does not work with the most recent version of Spotify for linux. They have a page on migrating from the old 'metadata api' to the new 'web api'


In order for the search to work, you'll have to update line 215 to the new API url @wandernauta.

curl -s -G --data-urlencode "q=$Q"\?type=track \

Thanks for this awesome utility!


Thank you, @leothelocust! That works like a charm. I've updated the gist.

Mladia commented Feb 8, 2017 edited

Brilliant! 👍


I'm usually on linux, but at my current job I have to use windows (.NET) and I was wondering if anyone knew of a way that I could do this same thing on windows?

dakujem commented Mar 1, 2017 edited

Still works!
This allows to have 2 or more keyboard shortcuts to play/pause spotify - by default the standard media keys will work and you can create a new shortcut to do run sp play in keyboard settings > shortcuts > custom shortcuts section and assing it to whatever other keyboard shortcut (useful with Ubuntu notebooks when switching between external keyboard and an integrated one that does not have media keys).


is there a way to save the current song to the library?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment