eww: dashboard(fake) & spotify player

This commit is contained in:
2025-06-18 13:46:51 +02:00
parent 514cbdabfc
commit 285f7a37b7
37 changed files with 1417 additions and 25 deletions

217
eww/Player/eww.scss Normal file
View File

@@ -0,0 +1,217 @@
* {
all: unset;
transition: 200ms ease-out;
}
.player-main-box {
background-color: $bg;
border-radius: 20px;
border: 3px solid $blue;
}
.spotify-header-logo {
font-size: 24px;
color: $green;
margin: 30px 0px 0px 300px;
}
.spotify-header-title {
font-size: 28px;
color: $green;
font-weight: bold;
margin-top: 30px;
margin-right: 10px;
}
.spotify-header-player {
font-size: 28px;
color: $fg;
font-weight: 200;
margin-top: 30px;
}
.player-cover-box {
background-size: 222px;
min-height: 222px;
min-width: 222px;
border-radius: 20px;
background-repeat: no-repeat;
background-position: center;
margin: 0px 40px 0px 0px;
}
.player-box {
background-color: $bg;
margin: 40px 30px 30px 50px;
}
.player-info-box {
margin: 20px 0px 0px 20px;
font-size: 20px;
}
.player-info-title,
.player-info-artist {
color: $blue;
font-weight: bold;
}
.player-info-album,
.player-info-length {
color: $gray;
}
.player-info-button {
background-color: $gray-alt;
padding: 15px;
border-radius: 20px;
font-weight: bold;
margin-top: 10px;
}
.player-music-slider trough {
background-color: $gray;
}
.player-music-slider highlight {
background-color: $blue;
padding: 3px;
}
.player-volume-slider trough {
background-color: $gray;
border-radius: 15px;
}
.player-volume-slider highlight {
background: linear-gradient(to right, $cyan, $blue);
border-radius: 15px;
padding: 7px;
}
.main-player-control-box {
background-color: $bg-alt;
border-radius: 0px 0px 25px 25px;
padding: 10px;
}
.player-volume-icon {
color: $cyan;
font-size: 24px;
margin-left: 10px;
}
.player-volume-box {
padding-top: 15px;
padding-bottom: 15px;
margin-left: 20px;
margin-right: 20px;
}
.shuffle-btn-on {
color: $green;
font-size: 26px;
font-weight: lighter;
}
.shuffle-btn-off {
color: $gray;
font-size: 26px;
font-weight: lighter;
}
.previous-btn,
.next-btn {
font-size: 30px;
color: $fg;
}
.player-pp-btn {
font-size: 50px;
color: $blue;
}
.current-position {
color: $fg;
font-size: 20px;
margin-left: 20px;
}
.length-of-song {
color: $gray;
font-size: 20px;
margin-right: 20px;
}
.player-album-box {
background-size: 150px;
min-height: 150px;
min-width: 150px;
border-radius: 100px;
background-repeat: no-repeat;
background-position: center;
border: 5px solid $cyan;
margin: 47px 0px 0px 0px;
}
.main-album-box {
background-color: $bg;
}
.visualizer-btn-on {
background-color: $gray-alt;
padding: 5px 15px 5px 10px;
font-size: 24px;
border-radius: 10px;
color: $blue;
box-shadow: 0px 0px 20px 10px rgba(0, 0, 0, 0.3);
}
.visualizer-btn-off {
background-color: $gray-alt;
padding: 5px 15px 5px 10px;
font-size: 24px;
border-radius: 10px;
box-shadow: 0px 0px 20px 10px rgba(0, 0, 0, 0.3);
}
.equalizer-btn-on {
background-color: $gray-alt;
padding: 5px 14px 5px 11px;
font-size: 24px;
border-radius: 10px;
color: $blue;
box-shadow: 0px 0px 20px 10px rgba(0, 0, 0, 0.3);
}
.equalizer-btn-off {
background-color: $gray-alt;
padding: 5px 14px 5px 11px;
font-size: 24px;
border-radius: 10px;
box-shadow: 0px 0px 20px 10px rgba(0, 0, 0, 0.3);
}
.player-buttons {
padding-left: 45px;
text-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
}
.player-length-box {
padding-left: 50px;
}
.player-control-box-right {
padding: 15px 0px 15px 40px;
}
.vz-title {
padding: 0px 0px 0px 0px;
font-size: 22px;
color: $blue;
}
.cavabar {
font-size: 24px;
color: $lavender;
}

67
eww/Player/eww.yuck Normal file
View File

@@ -0,0 +1,67 @@
;; variables
(defpoll art :interval "1s" "Player/scripts/player --cover")
(defpoll title :interval "1s" "Player/scripts/music-title --status")
(defpoll artist :interval "1s" "Player/scripts/player --artist")
(defpoll album :interval "1s" "Player/scripts/player --album")
(defpoll current-pos :interval "1s" "Player/scripts/player --current-pos")
(defpoll length-info :interval "1s" "Player/scripts/player --length-info")
(defpoll length :interval "0s" "dbus-send --dest=org.mpris.MediaPlayer2.spotify --print-reply /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Metadata | grep uint | awk '{print $3}'")
(defpoll position :interval "1s" "dbus-send --dest=org.mpris.MediaPlayer2.spotify --print-reply /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:org.mpris.MediaPlayer2.Player string:Position | awk 'FNR==2 {print $3}'")
(defpoll trackid :interval "1s" "playerctl -p spotify metadata mpris:trackid")
(defpoll current-volume :interval "1s" "Player/scripts/player --current-volume")
(defpoll pp-icon :interval "1s" "Player/scripts/music-title --icon")
(defpoll shuffle :interval "1s" "playerctl -p spotify shuffle")
(deflisten eq-status "tail -F Player/status/eq-status")
(deflisten vz-status "tail -F Player/status/vz-status")
(deflisten ly-status "tail -F Player/status/ly-status")
(defvar hover false)
(deflisten cava "Player/scripts/cava")
;; widgets
(defwidget player[]
(box :class "player-main-box" :space-evenly "false" :orientation "v" :hexpand "false" :vexpand "false"
; (box :class "header-box" :hexpand "false" :vexpand "false" :space-evenly "true"
; (box :class "another-header-box" :space-evenly "false"
; (label :class "spotify-header-logo" :text "󰓇 " :halign "center")
; (label :class "spotify-header-title" :text "Spotify" :halign "center")
; (label :class "spotify-header-player" :text "Player" :halign "center")))
(box :class "player-box" :hexpand "false" :vexpand "false" :space-evenly "true"
(box :class "player-info-box" :hexpand "false" :vexpand "false" :space-evenly "false" :orientation "v" :spacing 15
(label :class "player-info-title" :text "󰝚 Title: ${title}" :halign "start" :limit-width 30 :tooltip "${title}")
(label :class "player-info-artist" :text "󰠃 Artist: ${artist}" :halign "start" :limit-width 30 :tooltip "${artist}")
(label :class "player-info-album" :text "󰀥 Album: ${album}" :halign "start" :limit-width 30 :tooltip "${album}")
(label :class "player-info-length" :text "󰦚 Length: ${length-info}" :halign "start" :tooltip "${length-info}"))
(box :class "player-cover-box" :hexpand "false" :halign "end" :vexpand "false" :space-evenly "false" :style "background-image: url('${art}');"))
(box :class "cava-box" :hexpand "false" :vexpand "false"
(label :vexpand "false" :hexpand "false" :space-evenly "false"
:class "cavabar"
:text cava
))
(eventbox :onhover "eww update hover=true"
:onhoverlost "eww update hover=false"
:cursor "pointer"
:space-evenly "false"
(scale :orientation "h" :class "player-music-slider" :min 0 :max length :value position :tooltip current-pos :onchange { hover ? "dbus-send --type=method_call --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.SetPosition objpath:${trackid} int64:{}" : "" }))
(box :class "main-player-control-box" :hexpand "false" :vexpand "false" :space-evenly "false" :orientation "h" :height 70
(box :class "player-volume-box" :space-evenly "false" :hexpand "false" :vexpand "false" :spacing 10
(label :class "player-volume-icon" :text "󰕾")
(scale :class "player-volume-slider" :width 140 :min 0 :max 100 :orientation "h" :value current-volume :halign "start" :onchange "Player/scripts/player --volume {}"))
(box :class "player-buttons" :space-evenly "false" :hexpand "false" :vexpand "false" :spacing 10
(button :class "shuffle-btn ${shuffle == "On" ? "shuffle-btn-on" : "shuffle-btn-off"}" :onclick "Player/scripts/player --shuffle" "󰒟")
(button :class "previous-btn" :onclick "playerctl -p spotify previous" "󰒮")
(button :class "player-pp-btn" :onclick "playerctl -p spotify play-pause" "${pp-icon}")
(button :class "next-btn" :onclick "playerctl -p spotify next" "󰒭"))
(box :class "player-length-box" :space-evenly "false" :hexpand "false" :vexpand "false" :halign "end" :width 150
(label :class "current-position" :text "${current-pos} ")
(label :class "length-of-song" :text "/ ${length-info}"))
(box :class "player-control-box-right" :space-evenly "false" :hexpand "false" :vexpand "false" :spacing 15 :halign "end"
(button :class "equalizer-btn ${eq-status == "On" ? "equalizer-btn-on" : "equalizer-btn-off"}" :onclick "Player/scripts/equalizer" "󰺢")))))
;; windows
(defwindow player
:windowtype "normal"
:wm-ignore true
:monitor 0
:geometry (geometry :anchor "top center" :y 100 :height 400 :width 680)
(player))

40
eww/Player/scripts/cava Executable file
View File

@@ -0,0 +1,40 @@
#! /bin/bash
bar="▁▂▃▄▅▆▇█"
dict="s/;//g;"
# creating "dictionary" to replace char with bar
i=0
while [ $i -lt ${#bar} ]
do
dict="${dict}s/$i/${bar:$i:1}/g;"
i=$((i=i+1))
done
# make sure to clean pipe
pipe="/tmp/cava.fifo"
if [ -p $pipe ]; then
unlink $pipe
fi
mkfifo $pipe
# write cava config
config_file="/tmp/waybar_cava_config"
echo "
[general]
bars = 49
[output]
method = raw
raw_target = $pipe
data_format = ascii
ascii_max_range = 7
" > $config_file
# run cava in the background
cava -p $config_file &
# reading data from fifo
while read -r cmd; do
echo $cmd | sed $dict
done < $pipe

View File

@@ -0,0 +1,4 @@
#!/bin/bash
TRACK_ID=$(playerctl -p spotify metadata mpris:trackid)
dbus-send --type=method_call --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.SetPosition objpath:/com/spotify/track/0LnS7aOdOdI1dNKZqdOLz4 int64:120000000

11
eww/Player/scripts/equalizer Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/bash
if pgrep easyeffects; then
pkill easyeffects
echo "Off" > $HOME/.config/eww/Player/status/eq-status
exit 1
else
exec easyeffects --gapplication-service &
echo "On" > $HOME/.config/eww/Player/status/eq-status
fi
exit

32
eww/Player/scripts/music-album Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
# Set the source audio player here.
# Players supporting the MPRIS spec are supported.
# Examples: spotify, vlc, chrome, mpv and others.
# Use `playerctld` to always detect the latest player.
# See more here: https://github.com/altdesktop/playerctl/#selecting-players-to-control
PLAYER="playerctld"
# Format of the information displayed
# Eg. {{ artist }} - {{ album }} - {{ title }}
# See more attributes here: https://github.com/altdesktop/playerctl/#printing-properties-and-metadata
FORMAT="{{ album }}"
PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
STATUS=$PLAYERCTL_STATUS
else
STATUS="No Album"
fi
if [ "$STATUS" = "Stopped" ]; then
echo "No Album"
elif [ "$STATUS" = "Paused" ]; then
playerctl --player=$PLAYER metadata --format "$FORMAT"
elif [ "$STATUS" = "No Alnum" ]; then
echo "$STATUS"
else
playerctl --player=$PLAYER metadata --format "$FORMAT"
fi

22
eww/Player/scripts/music-art Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
tmp_dir="$HOME/.config/eww/Main/images"
tmp_cover_path=$tmp_dir/cover.png
tmp_temp_path=$tmp_dir/temp.png
if [ ! -d $tmp_dir ]; then
mkdir -p $tmp_dir
fi
artlink="$(playerctl -p spotify,$any,mpd,firefox,chromium,brave metadata mpris:artUrl | sed -e 's/open.spotify.com/i.scdn.co/g')"
artFromBrowser=$(playerctl metadata mpris:artUrl | sed 's/file:\/\///g')
if [ $(playerctl -p spotify,%any,firefox,chromium,brave,mpd metadata mpris:artUrl) ]; then
curl -s "$artlink" --output $tmp_temp_path
echo $tmp_temp_path
elif [[ -n $artFromBrowser ]]; then
cp $artFromBrowser $tmp_temp_path
echo $tmp_temp_path
else
echo Main/images/default-music.svg
fi

32
eww/Player/scripts/music-artist Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
# Set the source audio player here.
# Players supporting the MPRIS spec are supported.
# Examples: spotify, vlc, chrome, mpv and others.
# Use `playerctld` to always detect the latest player.
# See more here: https://github.com/altdesktop/playerctl/#selecting-players-to-control
PLAYER="playerctld"
# Format of the information displayed
# Eg. {{ artist }} - {{ album }} - {{ title }}
# See more attributes here: https://github.com/altdesktop/playerctl/#printing-properties-and-metadata
FORMAT="{{ artist }}"
PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
STATUS=$PLAYERCTL_STATUS
else
STATUS="No Artist"
fi
if [ "$STATUS" = "Stopped" ]; then
echo "No Artist"
elif [ "$STATUS" = "Paused" ]; then
playerctl --player=$PLAYER metadata --format "$FORMAT"
elif [ "$STATUS" = "No Artist" ]; then
echo "$STATUS"
else
playerctl --player=$PLAYER metadata --format "$FORMAT"
fi

32
eww/Player/scripts/music-length Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
# Set the source audio player here.
# Players supporting the MPRIS spec are supported.
# Examples: spotify, vlc, chrome, mpv and others.
# Use `playerctld` to always detect the latest player.
# See more here: https://github.com/altdesktop/playerctl/#selecting-players-to-control
PLAYER="playerctld"
# Format of the information displayed
# Eg. {{ artist }} - {{ album }} - {{ title }}
# See more attributes here: https://github.com/altdesktop/playerctl/#printing-properties-and-metadata
FORMAT="{{ duration(position) }} / {{ duration(mpris:length) }}"
PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
STATUS=$PLAYERCTL_STATUS
else
STATUS="--:-- / --:--"
fi
if [ "$STATUS" = "Stopped" ]; then
echo "--:-- / --:--"
elif [ "$STATUS" = "Paused" ]; then
playerctl --player=$PLAYER metadata --format "$FORMAT"
elif [ "$STATUS" = "--:-- / --:--" ]; then
echo "$STATUS"
else
playerctl --player=$PLAYER metadata --format "$FORMAT"
fi

View File

@@ -0,0 +1,32 @@
#!/bin/bash
# Set the source audio player here.
# Players supporting the MPRIS spec are supported.
# Examples: spotify, vlc, chrome, mpv and others.
# Use `playerctld` to always detect the latest player.
# See more here: https://github.com/altdesktop/playerctl/#selecting-players-to-control
PLAYER="playerctld"
# Format of the information displayed
# Eg. {{ artist }} - {{ album }} - {{ title }}
# See more attributes here: https://github.com/altdesktop/playerctl/#printing-properties-and-metadata
FORMAT="{{ duration(mpris:length) }}"
PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
STATUS=$PLAYERCTL_STATUS
else
STATUS="--:--"
fi
if [ "$STATUS" = "Stopped" ]; then
echo "--:--"
elif [ "$STATUS" = "Paused" ]; then
playerctl --player=$PLAYER metadata --format "$FORMAT"
elif [ "$STATUS" = "--:--" ]; then
echo "$STATUS"
else
playerctl --player=$PLAYER metadata --format "$FORMAT"
fi

View File

@@ -0,0 +1,4 @@
#!/bin/bash
POS=$(playerctl -p spotify position)
python -c "print(float($POS*1000000))"

43
eww/Player/scripts/music-title Executable file
View File

@@ -0,0 +1,43 @@
#!/bin/bash
# Set the source audio player here.
# Players supporting the MPRIS spec are supported.
# Examples: spotify, vlc, chrome, mpv and others.
# Use `playerctld` to always detect the latest player.
# See more here: https://github.com/altdesktop/playerctl/#selecting-players-to-control
PLAYER="playerctld"
# Format of the information displayed
# Eg. {{ artist }} - {{ album }} - {{ title }}
# See more attributes here: https://github.com/altdesktop/playerctl/#printing-properties-and-metadata
FORMAT="{{ title }}"
PLAYERCTL_STATUS=$(playerctl --player=$PLAYER status 2>/dev/null)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
STATUS=$PLAYERCTL_STATUS
else
STATUS="Nothing is playing"
fi
if [ "$1" == "--status" ]; then
if [ "$STATUS" = "Stopped" ]; then
echo "Nothing is playing"
elif [ "$STATUS" = "Paused" ]; then
playerctl --player=$PLAYER metadata --format "$FORMAT"
elif [ "$STATUS" = "Nothing is playing" ]; then
echo "$STATUS"
else
playerctl --player=$PLAYER metadata --format "$FORMAT"
fi
fi
if [ "$1" == "--icon" ]; then
if [[ $STATUS == "Playing" ]]; then
echo "󰏤"
else
echo "󰐊"
fi
fi

57
eww/Player/scripts/player Executable file
View File

@@ -0,0 +1,57 @@
#!/bin/bash
if [[ $1 == "--length" ]]; then
playerctl -p spotify metadata mpris:length
fi
if [[ $1 == "--open" ]]; then
URL=$(playerctl -p spotify metadata xesam:url)
echo "$URL?go=1&utm_medium=desktop"
fi
if [[ $1 == "--artist" ]]; then
"$HOME/.config/eww/Player/scripts/music-artist"
fi
if [[ $1 == "--length-time" ]]; then
"$HOME/.config/eww/Player/scripts/music-length"
fi
if [[ $1 == "--length-info" ]]; then
"$HOME/.config/eww/Player/scripts/music-length-info"
fi
if [[ $1 == "--cover" ]]; then
"$HOME/.config/eww/Player/scripts/music-art"
fi
if [[ $1 == "--album" ]]; then
"$HOME/.config/eww/Player/scripts/music-album"
fi
if [[ $1 == "--current-volume" ]]; then
VOLUME=$(playerctl -p spotify volume)
echo $(python -c "print(float("$VOLUME")*100)")
fi
if [[ $1 == "--volume" ]]; then
CURRENT_VOLUME=$2
NOW_VOLUME=$(python -c "print(float($CURRENT_VOLUME)/100)")
playerctl -p spotify volume "$NOW_VOLUME"
fi
if [[ $1 == "--shuffle" ]]; then
if [[ $(playerctl -p spotify shuffle) == "On" ]]; then
playerctl -p spotify shuffle off
else
playerctl -p spotify shuffle On
fi
fi
if [[ $1 == "--current-pos" ]]; then
playerctl -p spotify position --format '{{ duration(position) }}'
fi
if [[ $1 == "--launch-lyrics" ]]; then
eww open --toggle lyrics
fi

View File

@@ -0,0 +1 @@
On