Last active
January 4, 2025 00:51
-
-
Save jetfir3/d66f491d0683e2bdbdf9f60068e9984b to your computer and use it in GitHub Desktop.
Temporarily enable developer mode for the Spotify desktop client on Linux and macOS.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Temporarily enable developer mode for the Spotify desktop client on Linux and macOS. | |
showHelp () { | |
echo -e \ | |
"Usage: ./tmpdevmodify.sh [option]\n | |
Options: | |
-c, --clearcache Clear Spotify app cache | |
-d, --debug Add Debug Tools to user dropdown menu | |
--help Print this help message | |
--remove Remove developer mode" | |
} | |
clear="\033[0m" | |
red="\033[0;31m" | |
while getopts ':cd-:' flag; do | |
case "${flag}" in | |
-) | |
case "${OPTARG}" in | |
clearcache) clearCache='true' ;; | |
debug) debug='true' ;; | |
help) showHelp; exit 0 ;; | |
remove) remove='true' ;; | |
*) echo -e "${red}Error:${clear} '--""${OPTARG}""' not supported\n\n$(showHelp)\n" >&2; exit 1 ;; | |
esac ;; | |
c) clearCache='true' ;; | |
d) debug='true' ;; | |
\?) echo -e "${red}Error:${clear} '-""${OPTARG}""' not supported\n\n$(showHelp)\n" >&2; exit 1 ;; | |
esac | |
done | |
command -v perl >/dev/null || { echo -e "\n${red}Error:${clear} perl command not found.\nInstall perl on your system then try again.\n" >&2; exit 1; } | |
searchCacheLinux () { | |
local timeout=7 | |
local paths=("$HOME/.cache" "$HOME" "/") | |
for path in "${paths[@]}"; do | |
local path="${path}" | |
local timeLimit=$(($(date +%s) + timeout)) | |
while (( $(date +%s) < "${timeLimit}" )); do | |
cachePath=$(find "${path}" -type d -path "*cache/spotify*" -print -quit 2>/dev/null) | |
[[ -n "${cachePath}" ]] && return 0 | |
pgrep -x find > /dev/null || break | |
sleep 1 | |
done | |
done | |
return 1 | |
} | |
searchPrefsLinux () { | |
local timeout=7 | |
local paths=("$HOME/.config" "$HOME" "/") | |
for path in "${paths[@]}"; do | |
local path="${path}" | |
local timeLimit=$(($(date +%s) + timeout)) | |
while (( $(date +%s) < "${timeLimit}" )); do | |
prefsPath=$(find "${path}" -type f -path "*/spotify/prefs" -print -quit 2>/dev/null) | |
[[ -n "${prefsPath}" ]] && return 0 | |
pgrep -x find > /dev/null || break | |
sleep 1 | |
done | |
done | |
return 1 | |
} | |
case $(uname | tr '[:upper:]' '[:lower:]') in | |
darwin*) platformType='macOS' ;; | |
*) platformType='Linux' ;; | |
esac | |
if [[ "${platformType}" == "macOS" ]]; then | |
cachePath="${HOME}/Library/Caches/com.spotify.client" | |
offlineBnk="${HOME}/Library/Application Support/Spotify/PersistentCache/offline.bnk" | |
prefsPath="${HOME}/Library/Application Support/Spotify/prefs" | |
else | |
searchCacheLinux | |
offlineBnk="${cachePath}/offline.bnk" | |
fi | |
command pgrep [sS]potify 2>/dev/null | xargs kill -9 2>/dev/null | |
[[ "${clearCache}" ]] && { rm -rf "${cachePath}/Browser" 2>/dev/null; rm -rf "${cachePath}/Data" 2>/dev/null; rm "${cachePath}/LocalPrefs.json" 2>/dev/null; } | |
if [[ "${remove}" ]]; then | |
[[ "${platformType}" == "Linux" ]] && searchPrefsLinux | |
[[ -f "${prefsPath}" ]] && perl -pi -e 'print unless /app.enable-developer-mode=true/' "${prefsPath}" | |
[[ -f "${offlineBnk}" ]] && { | |
perl -pi -w -e 's|\x01\x08\x65\x6D\x70\x6C\x6F\x79\x65\x65\x09\x01\x31\x78||' "${offlineBnk}" | |
perl -pi -w -e 's#\x70\x65\x72\x3E\K\x33|\x70\x65\x72\x09\x01\K\x33#\x30#g' "${offlineBnk}" | |
} | |
echo -e "Spotify developer options are removed until script is used again.\n" | |
exit 0 | |
fi | |
if [[ "${debug}" ]]; then | |
[[ "${platformType}" == "Linux" ]] && searchPrefsLinux | |
[[ ! -f "${prefsPath}" ]] && { echo -e "${red}prefs not found!${clear} Run Spotify once then try again.\n" >&2; exit 1; } | |
[[ ! -f "${offlineBnk}" ]] && { echo -e "${red}offline.bnk not found!${clear} Run Spotify once then try again.\n" >&2; exit 1; } | |
echo "app.enable-developer-mode=true" >> "${prefsPath}" | |
perl -pi -w -e 's|\x01\x2A\x63\x6F\x6D\x2E\x73\x70\x6F\x74\x69\x66\x79\x2E\x6D\x61\x64\x70\x72\x6F\x70\x73\x2E\x75\x73\x65\x2E\x75\x63\x73\x2E\x70\x72\x6F\x64\x75\x63\x74\x2E\x73\x74\x61\x74\x65\x09\x01[\x30\x31]\x78||' "${offlineBnk}" | |
perl -pi -w -e 's|\x01\x0D\x61\x70\x70\x2D\x64\x65\x76\x65\x6C\x6F\x70\x65\x72\x09\x01[\x30\x31\x32\x33]\x78|\x01\x08\x65\x6D\x70\x6C\x6F\x79\x65\x65\x09\x01\x31\x78\x01\x2A\x63\x6F\x6D\x2E\x73\x70\x6F\x74\x69\x66\x79\x2E\x6D\x61\x64\x70\x72\x6F\x70\x73\x2E\x75\x73\x65\x2E\x75\x63\x73\x2E\x70\x72\x6F\x64\x75\x63\x74\x2E\x73\x74\x61\x74\x65\x09\x01\x31\x78|' "${offlineBnk}" | |
else | |
[[ ! -f "${offlineBnk}" ]] && { echo -e "${red}offline.bnk not found!${clear} Run Spotify once then try again.\n" >&2; exit 1; } | |
perl -pi -w -e 's#\x70\x65\x72\x3E\K[\x30\x31]|\x70\x65\x72\x09\x01\K[\x30\x31]#\x33#g' "${offlineBnk}" | |
fi | |
echo -e "Finished! Spotify developer options will be enabled on next run.\n" | |
exit 0 |
Awesome!
Android seems to use the same thing someone should make this for Android
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-c
/--clearcache
to wipe app cache, reverting any changes made in dev mode.-d
/--debug
to add Debug Tools menu item under the user icon dropdown.--remove
to remove developer options forcefully*Run directly with:
More devmode-related scripts on github...
*As of client version ~1.2.30.x or so, closing/opening the client no longer removes developer mode like it did previously. This could be seen as a nice bonus for some.. but for others this may not be ideal.