summaryrefslogtreecommitdiff
path: root/mac/.config/sketchybar.yabai/plugins/spotify.sh
diff options
context:
space:
mode:
Diffstat (limited to 'mac/.config/sketchybar.yabai/plugins/spotify.sh')
-rwxr-xr-xmac/.config/sketchybar.yabai/plugins/spotify.sh147
1 files changed, 147 insertions, 0 deletions
diff --git a/mac/.config/sketchybar.yabai/plugins/spotify.sh b/mac/.config/sketchybar.yabai/plugins/spotify.sh
new file mode 100755
index 0000000..521ac60
--- /dev/null
+++ b/mac/.config/sketchybar.yabai/plugins/spotify.sh
@@ -0,0 +1,147 @@
+#!/bin/bash
+
+next ()
+{
+ osascript -e 'tell application "Spotify" to play next track'
+}
+
+back ()
+{
+ osascript -e 'tell application "Spotify" to play previous track'
+}
+
+play ()
+{
+ osascript -e 'tell application "Spotify" to playpause'
+}
+
+repeat ()
+{
+ REPEAT=$(osascript -e 'tell application "Spotify" to get repeating')
+ if [ "$REPEAT" = "false" ]; then
+ sketchybar -m --set spotify.repeat icon.highlight=on
+ osascript -e 'tell application "Spotify" to set repeating to true'
+ else
+ sketchybar -m --set spotify.repeat icon.highlight=off
+ osascript -e 'tell application "Spotify" to set repeating to false'
+ fi
+}
+
+shuffle ()
+{
+ SHUFFLE=$(osascript -e 'tell application "Spotify" to get shuffling')
+ if [ "$SHUFFLE" = "false" ]; then
+ sketchybar -m --set spotify.shuffle icon.highlight=on
+ osascript -e 'tell application "Spotify" to set shuffling to true'
+ else
+ sketchybar -m --set spotify.shuffle icon.highlight=off
+ osascript -e 'tell application "Spotify" to set shuffling to false'
+ fi
+}
+
+update ()
+{
+ PLAYING=1
+ if [ "$(echo "$INFO" | jq -r '.["Player State"]')" = "Playing" ]; then
+ PLAYING=0
+ TRACK="$(echo "$INFO" | jq -r .Name)"
+ ARTIST="$(echo "$INFO" | jq -r .Artist)"
+ ALBUM="$(echo "$INFO" | jq -r .Album)"
+ SHUFFLE=$(osascript -e 'tell application "Spotify" to get shuffling')
+ REPEAT=$(osascript -e 'tell application "Spotify" to get repeating')
+ COVER=$(osascript -e 'tell application "Spotify" to get artwork url of current track')
+ fi
+
+ args=()
+ if [ $PLAYING -eq 0 ]; then
+ curl -s --max-time 20 "$COVER" -o /tmp/cover.jpg
+ if [ "$ARTIST" == "" ]; then
+ args+=(--set spotify.title label="$TRACK"
+ --set spotify.album label="Podcast"
+ --set spotify.artist label="$ALBUM" )
+ else
+ args+=(--set spotify.title label="$TRACK"
+ --set spotify.album label="$ALBUM"
+ --set spotify.artist label="$ARTIST")
+ fi
+ args+=(--set spotify.play icon=􀊆
+ --set spotify.shuffle icon.highlight=$SHUFFLE
+ --set spotify.repeat icon.highlight=$REPEAT
+ --set spotify.cover background.image="/tmp/cover.jpg"
+ background.color=0x00000000
+ --set spotify.anchor drawing=on )
+ else
+ args+=(--set spotify.anchor drawing=off popup.drawing=off
+ --set spotify.play icon=􀊄 )
+ fi
+ sketchybar -m "${args[@]}"
+}
+
+scrubbing() {
+ DURATION_MS=$(osascript -e 'tell application "Spotify" to get duration of current track')
+ DURATION=$((DURATION_MS/1000))
+
+ TARGET=$((DURATION*PERCENTAGE/100))
+ osascript -e "tell application \"Spotify\" to set player position to $TARGET"
+ sketchybar --set spotify.state slider.percentage=$PERCENTAGE
+}
+
+scroll() {
+ DURATION_MS=$(osascript -e 'tell application "Spotify" to get duration of current track')
+ DURATION=$((DURATION_MS/1000))
+
+ FLOAT="$(osascript -e 'tell application "Spotify" to get player position')"
+ TIME=${FLOAT%.*}
+
+ sketchybar --animate linear 10 \
+ --set spotify.state slider.percentage="$((TIME*100/DURATION))" \
+ icon="$(date -r $TIME +'%M:%S')" \
+ label="$(date -r $DURATION +'%M:%S')"
+}
+
+mouse_clicked () {
+ case "$NAME" in
+ "spotify.next") next
+ ;;
+ "spotify.back") back
+ ;;
+ "spotify.play") play
+ ;;
+ "spotify.shuffle") shuffle
+ ;;
+ "spotify.repeat") repeat
+ ;;
+ "spotify.state") scrubbing
+ ;;
+ *) exit
+ ;;
+ esac
+}
+
+popup () {
+ sketchybar --set spotify.anchor popup.drawing=$1
+}
+
+routine() {
+ case "$NAME" in
+ "spotify.state") scroll
+ ;;
+ *) update
+ ;;
+ esac
+}
+
+case "$SENDER" in
+ "mouse.clicked") mouse_clicked
+ ;;
+ "mouse.entered") popup on
+ ;;
+ "mouse.exited"|"mouse.exited.global") popup off
+ ;;
+ "routine") routine
+ ;;
+ "forced") exit 0
+ ;;
+ *) update
+ ;;
+esac