This script only works for older versions of Spotify for Linux.
An actively developed admute script for Spotify on Linux can be found here: https://github.com/SecUpwN/Spotify-AdKiller
This script only works for older versions of Spotify for Linux.
An actively developed admute script for Spotify on Linux can be found here: https://github.com/SecUpwN/Spotify-AdKiller
#!/bin/bash | |
#Linux Spotify Ad Mute v2 | |
#Put this script in the directory the "spotify" binary is in (e.g. /usr/share/spotify). | |
#To open Spotify, run it instead of the "spotify" binary. | |
#System sound will be muted as soon as an ad plays | |
#Find updated versions at: http://pcworldsoftware.kilu.net/files/link_spotify-admute.php and/or https://gist.github.com/pcworld | |
#On Debian, you need the package "pulseaudio-utils" for the command line util "pactl" which used in this script | |
# | |
#Update: For newer 0.8.x versions (x>4; such as 0.8.8), use this script: https://gist.github.com/pcworld/3198763/#comment-813440 | |
#For 0.9.x: https://gist.github.com/pcworld/3198763/#comment-857143 | |
# | |
#Copyright (c) 2012, "pcworld", [email protected] | |
#All rights reserved. | |
# | |
#Redistribution and use in source and binary forms, with or without | |
#modification, are permitted provided that the following conditions are met: | |
# * Redistributions of source code must retain the above copyright | |
# notice, this list of conditions and the following disclaimer. | |
# * Redistributions in binary form must reproduce the above copyright | |
# notice, this list of conditions and the following disclaimer in the | |
# documentation and/or other materials provided with the distribution. | |
# * Neither the name of the author nor the | |
# names of its contributors may be used to endorse or promote products | |
# derived from this software without specific prior written permission. | |
# | |
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY | |
#DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # http://stackoverflow.com/a/246128 | |
dbus-monitor "type='signal',path='/org/mpris/MediaPlayer2',member='PropertiesChanged'" | grep --line-buffered 'string "Metadata"' | | |
while read -r line ; do | |
if ! [[ "`dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify / org.freedesktop.MediaPlayer2.GetMetadata`" == *'string "mpris:artUrl"'* ]] | |
then | |
pactl set-sink-mute 0 yes | |
else | |
pactl set-sink-mute 0 no | |
fi | |
done & | |
$DIR/spotify "$@" & | |
wait $! && | |
test -z "`jobs -p`" || kill `jobs -p` # http://stackoverflow.com/a/2618497 |
@Feltzer, thank you for your updated version of the script. I especially like the one where local music is being played instead of an Ad. Unfrtunately, it doesn't work yet. Maybe because I have no Music in my local directory? Do I have to use the wrapper script or is it OK if I just modify the Spotify-Launcher to launch the full script (my current setup)? It would be awesome if you could update it once more the following way:
Is this possible for you? Thanks ahead! And just for anyone reading my post and being interested in security for your Android device: Have a look at the Android IMSI-Catcher Detector. You can thank me later. 😸
:(
it didn't worked for me neither.
I tryed with the two scripts. I made sure that the mp3 file/folder is there.
No idea what could be. :/
@Feltzer: Thanks for the nice script! I experienced the problem that no muting/unmuting was performed (I did not see "Unmuting sink ..." or "Muting sink ..." in the output), although the ad detection worked fine.
It turned out that this was a locale issue:
pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | cut -d \# -f2 \
uses a locale-dependent regular expression. So, to everyone having the same problem: As other users have pointed out before me, a better way would be to replace the line by a language-independent version:
LC_ALL=C pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | cut -d \# -f2 \
I feel like this script deserves its own Repository, so that more people can develop on it.
Welcome to the all-new and fresh Spotify-AdKiller-Project! 😈 LET'S PIMP IT UP!
Proper credit will be given - please tell me ASAP if you have any problem with anything.
@hairyheron Thanks for the fix!
@SecUpwN I think it's a great idea. Feel free to go ahead :)
@rhoconlinux As far as the playback issue is concerned, please check out my comment on the new issue tracker.
@SecUpwN i try it, and work perfectly.
thx very much for a comprehensible installation.
I executed this script with the while loop of the first comment and now no sound is coming when I play music! How can I revert what I just did?
Those scripts did not work for me anymore (I use ubuntu 14.04 and spotify 0.9.11.26) with the newest spotify version. So I went and modified them.
You have to start my script parallel to spotify and it will mute every commercial:
#!/bin/bash
# set commercial mute, so we do not neet to listen to them
echo "----------------------------------------------------------"
echo ""
echo " Mute spotify commercial"
echo ""
echo "----------------------------------------------------------"
WMTITLE="Spotify - Linux Preview"
xprop -spy -name "$WMTITLE" WM_ICON_NAME |
while read -r XPROPOUTPUT; do
XPROP_TRACKDATA="$(echo "$XPROPOUTPUT" | cut -d \" -f 2 )"
DBUS_TRACKDATA="$(dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify / \
org.freedesktop.MediaPlayer2.GetMetadata | grep xesam:title -A 1 | grep variant | cut -d \" -f 2)"
# show something
echo "XPROP: $XPROP_TRACKDATA"
echo "DBUS: $DBUS_TRACKDATA"
# first song should not be commerical
if [ "$OLD_XPROP" != "" ]
then
# check if old DBUS is the same as the new, if true then we have a commercial, so mute
if [ "$OLD_DBUS" = "$DBUS_TRACKDATA" ]
then
echo "commercial: yes"
amixer -D pulse set Master mute >> /dev/null
else
echo "commercial: no"
amixer -D pulse set Master unmute >> /dev/null
fi
else
echo "commercial: we don't know yet"
fi
echo "----------------------------------------------------------"
OLD_XPROP=$XPROP_TRACKDATA
OLD_DBUS=$DBUS_TRACKDATA
done
exit 0
It is based on the script of Feltzer
@openpaul your script assumes a commercial is playing when pausing and unpausing. I changed your second if statement to get around this.
if [ "$OLD_DBUS" = "$DBUS_TRACKDATA" ] && [ "$OLD_XPROP" != "Spotify" ]
@debrandt it is useful not to mute master volume, when you pause spotify.
i extended the if statement to the following
if [ "$OLD_DBUS" = "$DBUS_TRACKDATA" ] && [ "$OLD_XPROP" != "Spotify" ] && [ "$XPROP_TRACKDATA" != "Spotify" ]
❗ TO EVERYONE: This script has MATURED and MOVED into Spotify-AdKiller!
@SecUpwN i try it, and work perfectly.
thx very much for a comprehensible installation.
Thank you very much for your kind words. Unfortunately mentions are not possible within Gist, so I bet you'll never know how thankful I'm for this. Please join the development in my repository mentioned above. Cheers!
thanks to @felzer and others who have contributed.
I edited the version 1 to work with nuvolaplayer's spotify app on ubuntu 18.04. enjoy!
be sure to change the Player and Looptrack!
`
flatpak run eu.tiliado.NuvolaAppSpotify
#!/bin/bash
# spotify-automute-simple
# - automatically mute Spotify when ad comes on and loop short track
# - automatically switch back to Spotify when ad over
# Settings
#PLAYER="mpv --loop=inf"
#PLAYER = "mpv --no-audio"
PLAYER="mpv"
LOOPTRACK=""
# VAR
WM_NAME="Spotify"
ADMUTE=0
PAUSED=0
# FCT
get_pactl_nr(){
pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | cut -d \# -f2 \
| grep -v Spotify
}
# MAIN
xprop -spy -name "$WM_NAME" WM_ICON_NAME |
while read -r XPROPOUTPUT; do
XPROP_TRACKDATA="$(echo "$XPROPOUTPUT" | cut -d \" -f 2 )"
DBUS_TRACKDATA="$(dbus-send --print-reply --dest=org.mpris.MediaPlayer2.NuvolaAppSpotify /org/mpris/MediaPlayer2 \
org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | grep xesam:title -A 1 | grep variant | cut -d \" -f 2)"
echo "XPROP: $XPROP_TRACKDATA"
echo "DBUS: $DBUS_TRACKDATA"
if [[ "$DBUS_TRACKDATA" = "Spotify" ]]
then
echo "--PAUSED--"
PAUSED="1"
else
PAUSED=0
echo "--NOTPAUSED--"
fi
if [[ "$PAUSED" = 0 ]]
then
# || "$XPROP_TRACKDATA" =~ "$DBUS_TRACKDATA" ]]
echo "--NOAD--"
echo "ADMUTE: $ADMUTE"
echo "PAUSED: $PAUSED"
if [[ "$ADMUTE" = "1" ]]
then
sleep 0.5
kill -s TERM "$ALTPID"
for PACTLNR in $(get_pactl_nr); do
pactl set-sink-input-mute "$PACTLNR" no > /dev/null 2>&1
echo "Unmuting sink $PACTLNR"
done
fi
ADMUTE=0
else
echo "--AD--"
echo "ADMUTE: $ADMUTE"
echo "PAUSED: $PAUSED"
if [[ "$ADMUTE" != "1" ]]
then
for PACTLNR in $(get_pactl_nr); do
pactl set-sink-input-mute "$PACTLNR" yes > /dev/null 2>&1
echo "Muting sink $PACTLNR"
done
$PLAYER "$LOOPTRACK" > /dev/null 2>&1 &
ALTPID="$!"
fi
ADMUTE="1"
fi
done
echo "Spotify not active. Exiting."
exit 0
`
I did some changes to the script from @vvsarana:
Enjoy :)
#!/bin/bash
# spotify-automute-simple
# - automatically mute Spotify when ad comes on and loop short track
# - automatically switch back to Spotify when ad over
# Settings
# VAR
ADMUTE=0
PAUSED=0
# FCT
get_pactl_nr(){
pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | cut -d \# -f2 \
| grep -v Spotify
}
# Find window id
WM_ID=$(xdotool search --class "spotify" | sed -n 2p)
# MAIN
xprop -spy -id "$WM_ID" WM_NAME |
while read -r XPROPOUTPUT; do
XPROP_TRACKDATA="$(echo "$XPROPOUTPUT" | cut -d \" -f 2 )"
DBUS_TRACKDATA="$(dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | grep xesam:title -A 1 | grep variant | cut -d \" -f 2)"
echo "XPROP: $XPROP_TRACKDATA"
echo "DBUS: $DBUS_TRACKDATA"
if [[ "$DBUS_TRACKDATA" = "Advertisement" ]]
then
echo "--PAUSED--"
PAUSED="1"
else
PAUSED=0
echo "--NOTPAUSED--"
fi
if [[ "$PAUSED" = 0 ]]
then
# || "$XPROP_TRACKDATA" =~ "$DBUS_TRACKDATA" ]]
echo "--NOAD--"
echo "ADMUTE: $ADMUTE"
echo "PAUSED: $PAUSED"
if [[ "$ADMUTE" = "1" ]]
then
sleep 0.5
for PACTLNR in $(get_pactl_nr); do
pactl set-sink-input-mute "$PACTLNR" no > /dev/null 2>&1
echo "Unmuting sink $PACTLNR"
done
fi
ADMUTE=0
else
echo "--AD--"
echo "ADMUTE: $ADMUTE"
echo "PAUSED: $PAUSED"
if [[ "$ADMUTE" != "1" ]]
then
for PACTLNR in $(get_pactl_nr); do
pactl set-sink-input-mute "$PACTLNR" yes > /dev/null 2>&1
echo "Muting sink $PACTLNR"
done
fi
ADMUTE="1"
fi
done
echo "Spotify not active. Exiting."
exit 0
Does anybody here have version 0.8.4 of Spotify for AMD64? I can only find i386 versions.
Hey, @maximvl!
Could you please help me out with your code? I'm new to linux, though I hate commercials.
So, I'm running Xubuntu 18.04.4 and when I try to run your script with spotify already running I get the following mesange:
./spotify-admute.sh: line 20: xdotool: command not found
xprop: error: Invalid window id format: .
Spotify not active. Exiting.
Will be supper grateful for your help.
Maksym
hey, @bim9262
I used the piece of code you suggested in script.
Somehow I ran this script in wrong directory and now spotify has no sound. It does not matter how I launch spotify or how many times I remove and reinstall it.I appreciate any idea that might help.
Try:
num=$(pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | awk '/Spotify/ {print a} {a = $0}' | cut -c 13-)
pactl set-sink-input-mute $num no
Otherwise if you use something gui to control your volume, look at the per application volumes and set Spotify back to a non-zero value.
I add changed some parts of your script @vvsarana and @maximvl.
It captures more ads
#!/bin/bash
# Based on https://gist.github.com/pcworld/3198763
# Mute spotify when it starts advertisement
# Run like this
# nohup bash ~/bin/spotify/mute.sh > /tmp/spotify_mute.log &
# Settings
# VAR
ADMUTE=0
PAUSED=0
# FCT
get_pactl_nr(){
pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | cut -d \# -f2 \
| grep -v Spotify
}
# Find window id
WM_ID=$(xdotool search --class "spotify" | sed -n 2p)
# MAIN
xprop -spy -id "$WM_ID" WM_NAME |
while read -r XPROPOUTPUT; do
XPROP_TRACKDATA="$(echo "$XPROPOUTPUT" | cut -d \" -f 2 )"
DBUS_TRACKDATA="$(dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | grep xesam:title -A 1 | grep variant | cut -d \" -f 2)"
echo "XPROP: $XPROP_TRACKDATA"
echo "DBUS: $DBUS_TRACKDATA"
if [[ "$DBUS_TRACKDATA" =~ ^(Advertisement|Spotify)$ ]]
then
echo "--PAUSED--"
PAUSED="1"
else
PAUSED=0
echo "--NOTPAUSED--"
fi
if [[ "$PAUSED" = 0 ]]
then
# || "$XPROP_TRACKDATA" =~ "$DBUS_TRACKDATA" ]]
echo "--NO ADS--"
echo "ADMUTE: $ADMUTE"
echo "PAUSED: $PAUSED"
if [[ "$ADMUTE" = "1" ]]
then
sleep 0.5
num=$(pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | awk '/Spotify/ {print a} {a = $0}' | cut -c 13-)
pactl set-sink-input-mute $num no
echo "UnMuting"
fi
ADMUTE=0
else
echo "--ADS--"
echo "ADMUTE: $ADMUTE"
echo "PAUSED: $PAUSED"
if [[ "$ADMUTE" != "1" ]]
then
num=$(pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | awk '/Spotify/ {print a} {a = $0}' | cut -c 13-)
pactl set-sink-input-mute $num yes
echo "Muting"
fi
ADMUTE="1"
fi
done
echo "Spotify not active. Exiting."
exit 0
Hey guys, thanks for the useful script. As per good open source tradition, I've improved the script and pasting here.
#!/bin/bash
# Based on https://gist.github.com/pcworld/3198763
# Mute spotify when it starts advertisement
# Run like this
# nohup bash ~/bin/spotify/mute.sh > /tmp/spotify_mute.log &
# Link: https://gist.github.com/pcworld/3198763/af2a4981c6f26075c0a16a261f5294f2cf5e5da5#gistcomment-3384837
# Settings
PAUSE_BEFORE_UNMUTE=2
PAUSE_NOT_ACTIVE=5
# VAR
AD_MUTED=0
AD_DETECTED=0
# FCT
get_pactl_nr() {
pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | cut -d \# -f2 \
| grep -v Spotify
}
mute_player() {
num=$(pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | awk '/Spotify/ {print a} {a = $0}' | cut -c 13- | tail -n 1)
pactl set-sink-input-mute $num yes
}
unmute_player() {
num=$(pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | awk '/Spotify/ {print a} {a = $0}' | cut -c 13- | tail -n 1)
pactl set-sink-input-mute $num no
}
log() {
local line=${1}
echo \[$( date "+%H:%M:%S" )\] $line
}
# Unmute just in case this script crashed the previous time
unmute_player
# Endless loop, sort of service
while [ 1 ]; do
# Find window id
WM_ID=$(xdotool search --class "spotify" | sed -n 2p)
if [ -z "$WM_ID" ]; then
log "Spotify not active"
sleep $PAUSE_NOT_ACTIVE
continue
fi
# MAIN
xprop -spy -id "$WM_ID" WM_NAME |
while read -r XPROPOUTPUT; do
XPROP_TRACKDATA="$(echo "$XPROPOUTPUT" | cut -d \" -f 2 )"
DBUS_TRACKDATA="$(dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata' | grep xesam:title -A 1 | grep variant | cut -d \" -f 2)"
if [[ "$DBUS_TRACKDATA" =~ ^(Advertisement|Spotify)$ ]]; then
log "AD detected"
AD_DETECTED="1"
else
AD_DETECTED="0"
log "No AD detected"
fi
# Debug (uncomment if you need to debug the script)
# echo "XPROP: \"$XPROP_TRACKDATA\""
# echo "DBUS: \"$DBUS_TRACKDATA\""
# echo "Debug: AD_MUTED = $AD_MUTED, AD_DETECTED = $AD_DETECTED"
if [[ "$AD_DETECTED" = "0" ]] && [[ "$AD_MUTED" = "1" ]]; then
log "Unmuting (AD_MUTED = $AD_MUTED, AD_DETECTED = $AD_DETECTED)"
sleep $PAUSE_BEFORE_UNMUTE
unmute_player
AD_MUTED="0"
log "Unmuted"
elif [[ "$AD_DETECTED" = "1" ]] && [[ "$AD_MUTED" = "0" ]]; then
log "Muting (AD_MUTED = $AD_MUTED, AD_DETECTED = $AD_DETECTED)"
mute_player
AD_MUTED="1"
log "Muted"
fi
done
log "Spotify is not active, unmuting"
unmute_player
AD_MUTED="1"
done
log "Something went wrong. Exiting."
exit 1
I've put this to my space too - https://gist.github.com/logical-and/825bab160d604d82bf6ad9ebd3a6410d. Will update there when needed (bugfixes, incompatibilities with Spotify updates)
#!/bin/bash # spotify-automute-simple # - automatically mute Spotify when ad comes on and loop short track # - automatically switch back to Spotify when ad over # Settings PLAYER="mpv --loop=inf" LOOPTRACK="$HOME/Music/Alerts/Jeopardy_loop.mp3" # VAR WMTITLE="Spotify - Linux Preview" ADMUTE=0 PAUSED=0 # FCT get_pactl_nr(){ pactl list | grep -E '(^Sink Input)|(media.name = \"Spotify\"$)' | cut -d \# -f2 \ | grep -v Spotify } # MAIN xprop -spy -name "$WMTITLE" WM_ICON_NAME | while read -r XPROPOUTPUT; do XPROP_TRACKDATA="$(echo "$XPROPOUTPUT" | cut -d \" -f 2 )" DBUS_TRACKDATA="$(dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify / \ org.freedesktop.MediaPlayer2.GetMetadata | grep xesam:title -A 1 | grep variant | cut -d \" -f 2)" echo "XPROP: $XPROP_TRACKDATA" echo "DBUS: $DBUS_TRACKDATA" if [[ "$XPROP_TRACKDATA" = "Spotify" ]] then echo "--PAUSED--" PAUSED="1" else PAUSED=0 echo "--NOTPAUSED--" fi if [[ "$PAUSED" = "1" || "$XPROP_TRACKDATA" =~ "$DBUS_TRACKDATA" ]] then echo "--NOAD--" if [[ "$ADMUTE" = "1" ]] then sleep 0.5 kill -s TERM "$ALTPID" for PACTLNR in $(get_pactl_nr); do pactl set-sink-input-mute "$PACTLNR" no > /dev/null 2>&1 echo "Unmuting sink $PACTLNR" done fi ADMUTE=0 else echo "--AD--" if [[ "$ADMUTE" != "1" ]] then for PACTLNR in $(get_pactl_nr); do pactl set-sink-input-mute "$PACTLNR" yes > /dev/null 2>&1 echo "Muting sink $PACTLNR" done $PLAYER "$LOOPTRACK" > /dev/null 2>&1 & ALTPID="$!" fi ADMUTE=1 fi done echo "Spotify not active. Exiting." exit 0
I'm getting this error Error org.freedesktop.DBus.Error.UnknownMethod: Object does not exist at path “/”
@SecUpwN :
Here are two solutions that might be what you are looking for. They are based on the fantastic work by @pcworld, @OlegSmelov, @AmpGod and all the others in this thread.
Script 1: spotify-automute-simple
This script will automatically mute Spotify when an ad comes on and loop an audio file until it's over. Make sure to change PLAYER and LOOPTRACK for your system.
Script 2: spotify-automute-continuous
This script deals with ads slightly differently. It will automatically mute Spotify and play a random MP3 found in LOCALMUSIC. Instead of unmuting Spotify as soon as the ad is over this script will wait until the local MP3 is played fully before switching Spotify back on. This way you can have a continuous stream of music with no interruption whatsoever.
Installation of the scripts
I would recommend moving one (or both) of these script to your PATH (e.g. $HOME/bin on Ubuntu) and then writing a wrapper script to start them automatically when Spotify gets started. You don't have to worry about terminating them when Spotify exits because that happens automatically.
Here is the wrapper script I am using:
Some notes:
Make sure to replace the script name in the wrapper with its name on your system!
One last reminder
Spotify is a fantastic service and worth every penny. I am a premium subscriber myself but I wrote these scripts for my parents who are still a bit reluctant and hesitant with these things.
Please do consider switching to premium, especially if you are planning to use Spotify on the go.
Anyway, I hope you found this useful.