diff --git a/.scripts/toggle-player.sh b/.scripts/toggle-player.sh new file mode 100755 index 0000000..264dc52 --- /dev/null +++ b/.scripts/toggle-player.sh @@ -0,0 +1,7 @@ +#!/bin/env bash + +if [ -n "$(eww active-windows | grep -i "player")" ]; then + eww close player +elif [ -n "$(pgrep -i "spotify")" ]; then + eww open player +fi \ No newline at end of file diff --git a/.scripts/wp-vol b/.scripts/wp-vol new file mode 100755 index 0000000..9ac60ba --- /dev/null +++ b/.scripts/wp-vol @@ -0,0 +1,8 @@ +#!/bin/sh + +# Get the volume level and convert it to a percentage +volume=$(wpctl get-volume @DEFAULT_AUDIO_SINK@) +volume=$(echo "$volume" | awk '{print $2}') +volume=$(echo "( $volume * 100 ) / 1" | bc) + +notify-send -t 1000 -a 'wp-vol' -h int:value:$volume "Volume: ${volume}%" diff --git a/cava/config b/cava/config index fd54a3f..f133c4e 100644 --- a/cava/config +++ b/cava/config @@ -229,15 +229,15 @@ foreground = '#b4befe' # Gradient mode, only hex defined colors are supported, # background must also be defined in hex or remain commented out. 1 = on, 0 = off. # You can define as many as 8 different colors. They range from bottom to top of screen -; gradient = 0 -; gradient_color_1 = '#59cc33' -; gradient_color_2 = '#80cc33' -; gradient_color_3 = '#a6cc33' -; gradient_color_4 = '#cccc33' -; gradient_color_5 = '#cca633' -; gradient_color_6 = '#cc8033' -; gradient_color_7 = '#cc5933' -; gradient_color_8 = '#cc3333' +gradient = 1 +gradient_color_1 = '#94e2d5' +gradient_color_2 = '#89dceb' +gradient_color_3 = '#74c7ec' +gradient_color_4 = '#89b4fa' +gradient_color_5 = '#cba6f7' +gradient_color_6 = '#f5c2e7' +gradient_color_7 = '#eba0ac' +gradient_color_8 = '#f38ba8' @@ -273,8 +273,8 @@ foreground = '#b4befe' # This one is tricky. You can have as much keys as you want. # Remember to uncomment more than one key! More keys = more precision. # Look at readme.md on github for further explanations and examples. -1 = 2 # bass -2 = 1.5 +1 = 1.5 # bass +2 = 1 3 = 1 # midtone -4 = 1 +4 = 0.5 5 = 0.5 # treble diff --git a/eww/Main/eww.scss b/eww/Main/eww.scss new file mode 100644 index 0000000..0f8d301 --- /dev/null +++ b/eww/Main/eww.scss @@ -0,0 +1,216 @@ +* { + all: unset; + transition: 200ms ease-out; +} + +.main-window { + background-color: $bg; + font-family: 'Fira Sans Semibold', 'Font Awesome 6 Free', FontAwesome; + border-radius: 20px; + border: 3px solid $blue; +} + +.date-box { + background-color: $gray-alt; + margin: 20px 20px 0px 20px; + min-width: 290px; + padding: 20px 10px 20px 10px; + border-radius: 15px; + color: $fg; +} + +.time { + font-weight: bold; + font-size: 80px; + margin-top: 10px; +} + +.date { + font-family: 'Noto Sans'; + font-size: 24px; + margin-top: 20px; +} + +.weather-box { + background-color: $gray-alt; + margin: 20px 20px 0px 0px; + padding: 20px 20px 20px 10px; + border-radius: 15px; +} + +.weather-desc { + font-family: 'Noto Sans'; + color: $fg-alt; + font-size: 20px; +} + +.weather-temp { + font-size: 30px; + color: $fg; + padding-top: 10px; +} + +.weather-icon { + font-family: 'JetBrainsMono Nerd Font'; + font-size: 60px; +} + +.stats-box { + background-color: $gray-alt; + margin: 20px 20px 0px 20px; + padding: 20px 35px 20px 25px; + border-radius: 15px; +} + +.stats-header { + font-size: 20px; + font-weight: bold; + color: $gray; +} + +.volume-icon, +.brightness-icon, +.cpu-icon, +.memory-icon { + font-size: 20px; + color: $fg; +} + +.volume-scale trough, +.brightness-scale trough, +.cpu-scale trough, +.memory-scale trough { + all: unset; + background-color: $gray; + min-height: 10px; + border-radius: 15px; + margin-left: 10px; +} + +.volume-scale highlight { + background-color: $green; + border-radius: 15px; +} + +.brightness-scale highlight { + background-color: $yellow; + border-radius: 15px; +} + +.cpu-scale highlight { + background-color: $red; + border-radius: 15px; +} + +.memory-scale highlight { + background-color: $blue; + border-radius: 15px; +} + +.fortune-box { + background-color: $gray-alt; + margin: 20px 20px 0px 0px; + padding: 20px 35px 20px 25px; + border-radius: 15px; +} + +.fortune-header { + font-size: 20px; + font-weight: bold; + color: $gray; +} + +.fortune-text { + font-family: 'Noto Sans'; + font-size: 14px; + color: $fg; + margin-top: 10px; +} + +.music-art-box { + background-size: cover; + background-repeat: no-repeat; + min-width: 455px; + min-height: 200px; + border-radius: 17px; + background-position: center; + margin: 20px 0px 0px 20px; +} + +.music-title { + margin: 20px 0px 0px 20px; + font-size: 28px; + font-weight: bold; + color: $fg; +} + +.music-artist { + margin: 10px 0px 0px 20px; + font-size: 20px; + color: $fg-alt; +} + +.music-length { + margin: 90px 0px 0px 20px; + font-size: 18px; + font-weight: bold; + color: $fg-alt; +} + +.music-stuff-box { + min-height: 200px; + border-radius: 15px; + background: linear-gradient(to right, $bg-alt, transparent); +} + +.music-controls-box { + margin: 20px 20px 0px 20px; + background-color: $gray-alt; + padding: 0px 23px 0px 23px; + border-radius: 15px; + text-shadow: 0px 0px 10px rgba(0, 0, 0, 1); +} + +.music-next, +.music-previous { + font-size: 30px; +} + +.music-pp { + font-size: 44px; + color: $fg; +} + +.music-next:hover, +.music-previous:hover, +.music-pp:hover { + color: $orange; +} + +.profile-stuff-box { + margin: 20px 20px 0px 20px; + background-color: $gray-alt; + border-radius: 15px; + padding: 15px 20px 15px 20px; +} + +.profile-img { + border-radius: 10px; + background-repeat: no-repeat; + background-size: cover; + background-position: center; + min-width: 90px; + box-shadow: 0px 0px 30px rgba(0, 0, 0, 1); +} + +.profile-stuff { + font-family: 'Noto Sans'; + padding: 7px 0px 0px 30px; + font-size: 16px; + color: $fg; +} + +.profile-name { + font-family: 'Fira Sans Semibold', 'Font Awesome 6 Free', FontAwesome; + font-weight: bold; +} diff --git a/eww/Main/eww.yuck b/eww/Main/eww.yuck new file mode 100644 index 0000000..90d4bd1 --- /dev/null +++ b/eww/Main/eww.yuck @@ -0,0 +1,83 @@ +;; variables +(defvar window false) +(defpoll time :interval "1s" "date '+%I %M'") +(defpoll date :interval "1s" "date '+%A, %B %d'") +(deflisten notifications-cards "Main/scripts/logger.zsh subscribe") +(defpoll notifications-crits :interval "1s" "Main/scripts/logger.zsh crits") +(defpoll weather-icon :interval "20m" "Main/scripts/weather --icon") +(defpoll weather-temp :interval "20m" "Main/scripts/weather --temp") +(defpoll weather-desc :interval "20m" "Main/scripts/weather --stat") +(deflisten weather-color :initial "#7aa2f7" "Main/scripts/weather --hex") +(defpoll calendar-day :interval "20h" "+%d") +(defpoll calendar-year :interval "20h" "+%Y") +(defpoll calendar-month :interval "20h" "%+B") +(defpoll cpu :interval "1s" "Main/scripts/system --cpu") +(defpoll memory :interval "1s" "Main/scripts/system --mem") +(defpoll profile-image :interval "10h" "Main/scripts/details --image") +(defpoll profile-username :interval "1h" "whoami") +(defpoll profile-name :interval "1h" "Main/scripts/details --name") +(defpoll profile-kernel :interval "1h" "Main/scripts/details --kernel") +(defpoll profile-os :interval "1h" "Main/scripts/details --os") +(defpoll music-length :interval "1s" "Main/scripts/music-length") +(defpoll music-title :interval "1s" "Main/scripts/music-title --status") +(defpoll music-pp :interval "1s" "Main/scripts/music-title --icon") +(defpoll music-artist :interval "1s" "Main/scripts/music-artist") +(defpoll music-art :interval "1s" "Main/scripts/music-art") +(defpoll volume :interval "1s" "Main/scripts/system --vol") +(defpoll brightness :interval "1s" "Main/scripts/system --bri") +(defpoll fortune :interval "1h" "Main/scripts/fortune.py 32 9") + + +;; widgets +(defwidget main [] + (box :class "main-window" :space-evenly "false" :orientation "v" + (box :class "top-row" :orientation "h" :space-evenly "false" + (box :class "date-box" :space-evenly "false" :orientation "v" :hexpand "false" :vexpand "false" + (label :class "time" :text time) + (label :class "date" :text date)) + (box :class "weather-box" :space-evenly "false" :hexpand "true" :orientation "v" + (label :class "weather-desc" :halign "start" :text weather-desc) + (label :class "weather-temp" :halign "start" :text weather-temp) + (label :class "weather-icon" :halign "end" :valign "end" :text weather-icon :style "color: ${weather-color}"))) + (box :class "second-row" :orientation "h" :space-evenly "false" + (box :class "stats-box" :space-evenly "false" :orientation "v" :spacing 8 + (label :class "stats-header" :halign "start" :text "Stats") + (box :class "volume-stats" :hexpand "false" :vexpand "false" :space-evenly "false" + (label :tooltip "${volume}%" :class "volume-icon" :text "󰕾") + (scale :min 0 :max 101 :active false :value {volume == "" ? 0 : volume} :class "volume-scale" :width 150)) + (box :class "brightness-stats" :hexpand "false" :vexpand "false" :space-evenly "false" + (label :tooltip "${brightness}%" :class "brightness-icon" :text "󰃠") + (scale :min 0 :max 101 :active false :value {brightness == "" ? 0 : brightness} :class "brightness-scale" :width 150)) + (box :class "cpu-stats" :hexpand "false" :vexpand "false" :space-evenly "false" + (label :tooltip "${cpu}%" :class "cpu-icon" :text "󰘚") + (scale :min 0 :max 101 :active false :value {cpu == "" ? 0 : cpu} :class "cpu-scale" :width 150)) + (box :class "memory-stats" :hexpand "false" :vexpand "false" :space-evenly "false" + (label :tooltip "${memory}%" :class "memory-icon" :text "󰍛") + (scale :min 0 :max 101 :active false :value {memory == "" ? 0 : memory} :class "memory-scale" :width 150))) + (box :class "fortune-box" :space-evenly "false" :hexpand "true" :orientation "v" + (label :class "fortune-header" :halign "start" :text "Fortune") + (label :class "fortune-text" :halign "start" :text fortune :show-truncated true :wrap true))) + (box :class "third-row" :orientation "h" :space-evenly "false" + (box :class "music-art-box" :space-evenly "false" :orientation "v" :hexpand "false" :vexpand "false" :style "background-image: url(\"${music-art}\");" + (box :class "music-stuff-box" :space-evenly "false" :hexpand "false" :vexpand "false" :orientation "v" + (label :class "music-title" :text music-title :halign "start" :limit-width 22 :tooltip music-title) + (label :class "music-artist" :text music-artist :halign "start" :limit-width 22 :tooltip music-artist) + (label :class "music-length" :text music-length :halign "start" :valign "end"))) + (box :class "music-controls-box" :space-evenly "true" :hexpand "true" :vexpand "false" :orientation "v" + (button :class "music-previous" :halign "center" :onclick "playerctl previous" "󰒮") + (button :class "music-pp" :halign "center" :onclick "playerctl play-pause" "${music-pp}") + (button :class "music-next" :halign "center" :onclick "playerctl next" "󰒭"))) + (box :class "profile-stuff-box" :space-evenly "false" :hexpand "false" :vexpand "false" :orientation "h" :height 140 + (box :class "profile-img" :space-evenly "false" :hexpand "false" :vexpand "false" :orientation "v" :style "background-image: url(\"${profile-image}\");") + (box :class "profile-stuff" :orientation "v" :space-evenly "false" :hexpand "false" :vexpand "false" :spacing 8 + (label :class "profile-name" :text profile-name :halign "start") + (label :class "profile-os" :text profile-os :halign "start") + (label :class "profile-kernel" :text profile-kernel :halign "start"))))) + +;; windows +(defwindow main + :windowtype "normal" + :wm-ignore true + :monitor 0 + :geometry (geometry :x 2 :y 0 :width 600 :height 846) + (main)) diff --git a/eww/Main/images/.gitignore b/eww/Main/images/.gitignore new file mode 100644 index 0000000..071d41d --- /dev/null +++ b/eww/Main/images/.gitignore @@ -0,0 +1 @@ +temp* \ No newline at end of file diff --git a/eww/Main/images/default-music.svg b/eww/Main/images/default-music.svg new file mode 100644 index 0000000..db21a99 --- /dev/null +++ b/eww/Main/images/default-music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/eww/Main/images/no-notifications.svg b/eww/Main/images/no-notifications.svg new file mode 100644 index 0000000..5f94c39 --- /dev/null +++ b/eww/Main/images/no-notifications.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/eww/Main/images/profile.png b/eww/Main/images/profile.png new file mode 100644 index 0000000..308e88a Binary files /dev/null and b/eww/Main/images/profile.png differ diff --git a/eww/Main/scripts/details b/eww/Main/scripts/details new file mode 100755 index 0000000..d9aa392 --- /dev/null +++ b/eww/Main/scripts/details @@ -0,0 +1,28 @@ +#!/bin/bash + +if [[ $1 == "--image" ]]; then + FILE=$HOME/.face + if [[ -f "$FILE" ]]; then + echo "../../.face" + else + echo "Main/images/profile.png" + fi +fi + + +if [[ $1 == "--name" ]]; then + fullname=$(getent passwd "$(whoami)" | cut -d ':' -f 5 | cut -d ',' -f 1 | tr -d "\n") + if [ -z "$fullname" ]; then + echo "$(whoami)@$(hostnamectl | awk 'FNR==1 {print $3}')" + else + echo "$fullname" + fi +fi + +if [[ $1 == "--kernel" ]]; then + echo "$(uname -r)" +fi + +if [[ $1 == "--os" ]]; then + echo "$(cat /etc/os-release | awk 'NR==1'| awk -F '"' '{print $2}')" +fi \ No newline at end of file diff --git a/eww/Main/scripts/fortune.py b/eww/Main/scripts/fortune.py new file mode 100755 index 0000000..9503682 --- /dev/null +++ b/eww/Main/scripts/fortune.py @@ -0,0 +1,92 @@ +#!/bin/env python3 + +import sys +import subprocess + + +def wrap(text, width, height): + lines = [] + + paragraphs = text.split('\n') + + for paragraph in paragraphs: + if len(lines) >= height: + return [] + + # Skip empty paragraphs + if not paragraph.strip(): + lines.append('') + continue + + current_line = '' + words = paragraph.split() + + for word in words: + if current_line: + test_line = current_line + ' ' + word + else: + test_line = word + + if len(test_line) <= width: + current_line = test_line + else: + if current_line: + lines.append(current_line) + current_line = word + else: + while len(word) > width: + lines.append(word[:width]) + word = word[width:] + current_line = word + + if current_line: + lines.append(current_line) + + return lines + + +RETRY_LIMIT = 10 + + +def main(): + if len(sys.argv) != 3: + print("Usage: fortune.py ") + sys.exit(1) + + try: + width = int(sys.argv[1]) + if width <= 0: + raise ValueError() + height = int(sys.argv[2]) + if height <= 0: + raise ValueError() + except ValueError: + print("Invalid argument.") + sys.exit(1) + + i = 0 + while True: + if i >= RETRY_LIMIT: + print("Failed to get fortune after multiple attempts.") + sys.exit(1) + i += 1 + + try: + buffer = subprocess.check_output(['fortune', '-s'], text=True) + except subprocess.CalledProcessError as e: + print(f"Error running fortune: {e}") + sys.exit(1) + + lines = wrap(buffer, width, height) + + if lines: + break + else: + print("retrying...") + + for line in lines: + print(line) + + +if __name__ == "__main__": + main() diff --git a/eww/Main/scripts/music-art b/eww/Main/scripts/music-art new file mode 100755 index 0000000..0f4e609 --- /dev/null +++ b/eww/Main/scripts/music-art @@ -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 \ No newline at end of file diff --git a/eww/Main/scripts/music-artist b/eww/Main/scripts/music-artist new file mode 100755 index 0000000..9b702ce --- /dev/null +++ b/eww/Main/scripts/music-artist @@ -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 diff --git a/eww/Main/scripts/music-length b/eww/Main/scripts/music-length new file mode 100755 index 0000000..a28db0f --- /dev/null +++ b/eww/Main/scripts/music-length @@ -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 diff --git a/eww/Main/scripts/music-title b/eww/Main/scripts/music-title new file mode 100755 index 0000000..c17655d --- /dev/null +++ b/eww/Main/scripts/music-title @@ -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 \ No newline at end of file diff --git a/eww/Main/scripts/system b/eww/Main/scripts/system new file mode 100755 index 0000000..ff6e73a --- /dev/null +++ b/eww/Main/scripts/system @@ -0,0 +1,66 @@ +#!/bin/bash + +## Files and Data +PREV_TOTAL=0 +PREV_IDLE=0 +cpuFile="/tmp/.cpu_usage" + +## Get CPU usage +get_cpu() { + if [[ -f "${cpuFile}" ]]; then + fileCont=$(cat "${cpuFile}") + PREV_TOTAL=$(echo "${fileCont}" | head -n 1) + PREV_IDLE=$(echo "${fileCont}" | tail -n 1) + fi + + CPU=(`cat /proc/stat | grep '^cpu '`) # Get the total CPU statistics. + unset CPU[0] # Discard the "cpu" prefix. + IDLE=${CPU[4]} # Get the idle CPU time. + + # Calculate the total CPU time. + TOTAL=0 + + for VALUE in "${CPU[@]:0:4}"; do + let "TOTAL=$TOTAL+$VALUE" + done + + if [[ "${PREV_TOTAL}" != "" ]] && [[ "${PREV_IDLE}" != "" ]]; then + # Calculate the CPU usage since we last checked. + let "DIFF_IDLE=$IDLE-$PREV_IDLE" + let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL" + let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10" + echo "${DIFF_USAGE}" + else + echo "?" + fi + + # Remember the total and idle CPU times for the next check. + echo "${TOTAL}" > "${cpuFile}" + echo "${IDLE}" >> "${cpuFile}" +} + +## Get Used memory +get_mem() { + printf "%.0f\n" "$(free -m | grep Mem | awk '{print ($3/$2)*100}')" +} + +## Get Volume +get_vol() { + pamixer --get-volume +} + +## Get Brightness +get_brightness() { + brightnessctl i --machine-readable -d intel_backlight | tr ',' ' ' | awk '{print $4}' | tr -d '%' +} + +## Execute accordingly +if [[ "$1" == "--cpu" ]]; then + get_cpu +elif [[ "$1" == "--mem" ]]; then + get_mem +elif [[ "$1" == "--vol" ]]; then + get_vol +elif [[ "$1" == "--bri" ]]; then + get_brightness +fi \ No newline at end of file diff --git a/eww/Main/scripts/weather b/eww/Main/scripts/weather new file mode 100755 index 0000000..10dda7d --- /dev/null +++ b/eww/Main/scripts/weather @@ -0,0 +1,132 @@ +#!/bin/bash + +## Collect data +cache_dir="$HOME/.cache/eww/weather" +cache_weather_stat=${cache_dir}/weather-stat +cache_weather_degree=${cache_dir}/weather-degree +cache_weather_hex=${cache_dir}/weather-hex +cache_weather_icon=${cache_dir}/weather-icon + +if [[ -z "$OPENWEATHER_API_KEY" ]]; then + echo "Please set the OPENWEATHER_API_KEY environment variable." + exit 1 +fi +if [[ -z "$OPENWEATHER_LAT" ]]; then + echo "Please set the OPENWEATHER_LAT environment variable." + exit 1 +fi +if [[ -z "$OPENWEATHER_LON" ]]; then + echo "Please set the OPENWEATHER_LON environment variable." + exit 1 +fi + +## Weather data +KEY=$OPENWEATHER_API_KEY +LAT=$OPENWEATHER_LAT +LON=$OPENWEATHER_LON +UNITS=metric + +## Make cache dir +if [[ ! -d "$cache_dir" ]]; then + mkdir -p ${cache_dir} +fi + +## Get data +get_weather_data() { + weather=`curl -sf "http://api.openweathermap.org/data/3.0/onecall?lat=${LAT}&lon=${LON}&exclude=minutely,hourly,daily&appid=${KEY}&units=${UNITS}" | jq -r ".current"` + echo ${weather} + + if [ ! -z "$weather" ]; then + weather_temp=`echo "$weather" | jq ".temp" | cut -d "." -f 1` + weather_icon_code=`echo "$weather" | jq -r ".weather[].icon" | head -1` + weather_description=`echo "$weather" | jq -r ".weather[].description" | head -1 | sed -e "s/\b\(.\)/\u\1/g"` + + #Big long if statement of doom + if [ "$weather_icon_code" == "50d" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "50n" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "01d" ]; then + weather_icon=" " + weather_hex="#e0af68" + elif [ "$weather_icon_code" == "01n" ]; then + weather_icon=" " + weather_hex="#c0caf5" + elif [ "$weather_icon_code" == "02d" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "02n" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "03d" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "03n" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "04d" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "04n" ]; then + weather_icon=" " + weather_hex="#7aa2f7" + elif [ "$weather_icon_code" == "09d" ]; then + weather_icon="" + weather_hex="#7dcfff" + elif [ "$weather_icon_code" == "09n" ]; then + weather_icon="" + weather_hex="#7dcfff" + elif [ "$weather_icon_code" == "10d" ]; then + weather_icon="" + weather_hex="#7dcfff" + elif [ "$weather_icon_code" == "10n" ]; then + weather_icon="" + weather_hex="#7dcfff" + elif [ "$weather_icon_code" == "11d" ]; then + weather_icon="" + weather_hex="#ff9e64" + elif [ "$weather_icon_code" == "11n" ]; then + weather_icon="" + weather_hex="#ff9e64" + elif [ "$weather_icon_code" == "13d" ]; then + weather_icon=" " + weather_hex="#c0caf5" + elif [ "$weather_icon_code" == "13n" ]; then + weather_icon=" " + weather_hex="#c0caf5" + elif [ "$weather_icon_code" == "40d" ]; then + weather_icon=" " + weather_hex="#7dcfff" + elif [ "$weather_icon_code" == "40n" ]; then + weather_icon=" " + weather_hex="#7dcfff" + else + weather_icon=" " + weather_hex="#c0caf5" + fi + echo "$weather_icon" > ${cache_weather_icon} + echo "$weather_description" > ${cache_weather_stat} + echo "$weather_temp""°C" > ${cache_weather_degree} + echo "$weather_hex" > ${cache_weather_hex} + else + echo "Weather Unavailable" > ${cache_weather_stat} + echo " " > ${cache_weather_icon} + echo "-" > ${cache_weather_degree} + echo "#adadff" > ${cache_weather_hex} + fi +} + +## Execute +if [[ "$1" == "--getdata" ]]; then + get_weather_data +elif [[ "$1" == "--icon" ]]; then + cat ${cache_weather_icon} +elif [[ "$1" == "--temp" ]]; then + cat ${cache_weather_degree} +elif [[ "$1" == "--hex" ]]; then + tail -F ${cache_weather_hex} +elif [[ "$1" == "--stat" ]]; then + cat ${cache_weather_stat} +fi \ No newline at end of file diff --git a/eww/Player/eww.scss b/eww/Player/eww.scss new file mode 100644 index 0000000..f87f1b6 --- /dev/null +++ b/eww/Player/eww.scss @@ -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; +} diff --git a/eww/Player/eww.yuck b/eww/Player/eww.yuck new file mode 100644 index 0000000..4cdc177 --- /dev/null +++ b/eww/Player/eww.yuck @@ -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)) \ No newline at end of file diff --git a/eww/Player/scripts/cava b/eww/Player/scripts/cava new file mode 100755 index 0000000..63b1e7b --- /dev/null +++ b/eww/Player/scripts/cava @@ -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 \ No newline at end of file diff --git a/eww/Player/scripts/change-music b/eww/Player/scripts/change-music new file mode 100755 index 0000000..7c4986c --- /dev/null +++ b/eww/Player/scripts/change-music @@ -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 \ No newline at end of file diff --git a/eww/Player/scripts/equalizer b/eww/Player/scripts/equalizer new file mode 100755 index 0000000..320f399 --- /dev/null +++ b/eww/Player/scripts/equalizer @@ -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 diff --git a/eww/Player/scripts/music-album b/eww/Player/scripts/music-album new file mode 100755 index 0000000..25db975 --- /dev/null +++ b/eww/Player/scripts/music-album @@ -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 diff --git a/eww/Player/scripts/music-art b/eww/Player/scripts/music-art new file mode 100755 index 0000000..0f4e609 --- /dev/null +++ b/eww/Player/scripts/music-art @@ -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 \ No newline at end of file diff --git a/eww/Player/scripts/music-artist b/eww/Player/scripts/music-artist new file mode 100755 index 0000000..9b702ce --- /dev/null +++ b/eww/Player/scripts/music-artist @@ -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 diff --git a/eww/Player/scripts/music-length b/eww/Player/scripts/music-length new file mode 100755 index 0000000..a28db0f --- /dev/null +++ b/eww/Player/scripts/music-length @@ -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 diff --git a/eww/Player/scripts/music-length-info b/eww/Player/scripts/music-length-info new file mode 100755 index 0000000..07efcb2 --- /dev/null +++ b/eww/Player/scripts/music-length-info @@ -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 diff --git a/eww/Player/scripts/music-position b/eww/Player/scripts/music-position new file mode 100755 index 0000000..554cdd9 --- /dev/null +++ b/eww/Player/scripts/music-position @@ -0,0 +1,4 @@ +#!/bin/bash + +POS=$(playerctl -p spotify position) +python -c "print(float($POS*1000000))" \ No newline at end of file diff --git a/eww/Player/scripts/music-title b/eww/Player/scripts/music-title new file mode 100755 index 0000000..c17655d --- /dev/null +++ b/eww/Player/scripts/music-title @@ -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 \ No newline at end of file diff --git a/eww/Player/scripts/player b/eww/Player/scripts/player new file mode 100755 index 0000000..97b583a --- /dev/null +++ b/eww/Player/scripts/player @@ -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 \ No newline at end of file diff --git a/eww/Player/status/eq-status b/eww/Player/status/eq-status new file mode 100644 index 0000000..0f5ec10 --- /dev/null +++ b/eww/Player/status/eq-status @@ -0,0 +1 @@ +On diff --git a/eww/eww.scss b/eww/eww.scss new file mode 100644 index 0000000..862ea1b --- /dev/null +++ b/eww/eww.scss @@ -0,0 +1,18 @@ +/** Colors *******************************************/ +$bg: #1e1e2e; +$bg-alt: #181825; +$fg: #cdd6f4; +$fg-alt: #a6adc8; +$red: #f38ba8; +$green: #a6e3a1; +$yellow: #f9e2af; +$orange: #fab387; +$blue: #89b4fa; +$purple: #cba6f7; +$cyan: #89dceb; +$gray: #585b70; +$gray-alt: #313244; +$lavender: #b4befe; + +@import './Player/eww.scss'; +@import './Main/eww.scss'; diff --git a/eww/eww.yuck b/eww/eww.yuck new file mode 100644 index 0000000..296aaed --- /dev/null +++ b/eww/eww.yuck @@ -0,0 +1,2 @@ +(include "./Player/eww.yuck") +(include "./Main/eww.yuck") diff --git a/hypr/hyprland/env.conf b/hypr/hyprland/env.conf index b32f997..df25458 100755 --- a/hypr/hyprland/env.conf +++ b/hypr/hyprland/env.conf @@ -10,7 +10,7 @@ env = INPUT_METHOD, fcitx # ############ Themes ############# env = QT_QPA_PLATFORM, wayland env = QT_QPA_PLATFORMTHEME, qt5ct -env = QT_STYLE_OVERRIDE,kvantum +env = QT_STYLE_OVERRIDE, kvantum # env = WLR_NO_HARDWARE_CURSORS, 1 # ######## Screen tearing ######### diff --git a/hypr/hyprland/keybinds.conf b/hypr/hyprland/keybinds.conf index 107010b..2e5c6ea 100755 --- a/hypr/hyprland/keybinds.conf +++ b/hypr/hyprland/keybinds.conf @@ -61,12 +61,11 @@ bindl= ,XF86AudioPause, exec, playerctl play-pause # [hidden] #! ##! Sound & Brightness -bindl = Alt ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle # [hidden] -bindl = Super ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle # [hidden] -bindl = ,XF86AudioMute, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 0% # [hidden] -bindl = Super+Shift,M, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 0% # [hidden] -bindle=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ # [hidden] -bindle=, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- # [hidden] +bindl = ,XF86AudioMute, exec, pamixer --toggle-mute # [hidden] +bindl = Super+Shift,M, exec, pamixer --toggle-mute # [hidden] +bindle=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ && wp-vol # [hidden] +bindle=, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && wp-vol # [hidden] + bindle=, XF86MonBrightnessUp, exec, brightnessctl -d intel_backlight set 5%+ # [hidden] bindle=, XF86MonBrightnessDown, exec, brightnessctl -d intel_backlight set 5%- # [hidden] diff --git a/mako/config b/mako/config index 2c92741..f3353c7 100644 --- a/mako/config +++ b/mako/config @@ -13,4 +13,17 @@ border-color=#89b4fa progress-color=over #313244 [urgency=high] -border-color=#fab387 \ No newline at end of file +border-color=#fab387 + +[app-name=wp-vol] +layer=overlay +history=0 +anchor=top-center +# Group all volume notifications together +group-by=app-name +# Hide the group-index +format=%s\n%b + +[app-name=volume group-index=0] +# Only show last notification +invisible=0 \ No newline at end of file diff --git a/waybar/config.jsonc b/waybar/config.jsonc index 95548bb..8a20dc6 100644 --- a/waybar/config.jsonc +++ b/waybar/config.jsonc @@ -61,9 +61,10 @@ "custom/rofi": { "format": "", "tooltip": false, - "on-click-right": "fuzzel -l 0 -p '>> ' | xargs -r sh -c", - "on-click": "fuzzel", - "on-click-middle": "pkill -9 fuzzel", + // "on-click-right": "fuzzel -l 0 -p '>> ' | xargs -r sh -c", + // "on-click": "fuzzel", + // "on-click-middle": "pkill -9 fuzzel", + "on-click": "eww open main --toggle", "min-length": 2, "max-length": 2 }, @@ -221,14 +222,14 @@ "active-only": false }, "hyprland/window": { - "max-length": 40, + "max-length": 100, "separate-outputs": true, "hide-empty-text": true }, "custom/mediaplayer": { "format": "{text}", "return-type": "json", - "max-length": 40, + "max-length": 100, "format-icons": { "spotify": "", "default": "" @@ -236,6 +237,7 @@ "escape": true, "exec": "$HOME/.config/waybar/modules/mediaplayer.py 2> /dev/null", "on-click": "playerctl play-pause", + "on-click-right": "eww open --toggle player", "on-scroll-up": "playerctl next", "on-scroll-down": "playerctl previous" },