From 0867aa7fcad43db19a8a8a77cc0b7c24001c4de2 Mon Sep 17 00:00:00 2001 From: S4NKALP Date: Wed, 24 Jan 2024 20:15:59 +0545 Subject: [PATCH] Huge Update --- config/hypr/UserConfigs/Startup_Apps.conf | 5 +- config/hypr/UserConfigs/UserKeybinds.conf | 2 +- .../{scripts => configs}/batterynotify.conf | 0 .../hypr/{scripts/Emoji.sh => configs/emojis} | 8 - config/hypr/scripts/BatteryNotify.sh | 2 +- config/hypr/scripts/Brightness.sh | 4 +- config/hypr/scripts/Device_cmd.sh | 56 ++- config/hypr/scripts/HeatSensors.sh | 65 --- config/hypr/scripts/Ref.sh | 6 + config/hypr/scripts/Rofi_cmd.sh | 6 +- config/hypr/scripts/RunCMD.sh | 1 + config/hypr/scripts/Widget.sh | 141 +++++++ config/hypr/scripts/Xmenu.sh | 2 +- config/rofi/config-panel.rasi | 178 ++++++++ config/swaync/config.json | 6 +- config/waybar/configs/[BOT & Left] southWest | 2 +- config/waybar/configs/[BOT & Right] southeast | 2 +- config/waybar/configs/[BOT] default | 2 +- config/waybar/configs/[BOT] gardenia | 3 +- config/waybar/configs/[BOT] peony | 2 +- config/waybar/configs/[TOP & BOT] summitsplit | 2 +- config/waybar/modules | 80 ++-- config/waybar/style.css | 4 +- misc/bin/pipes | 385 ++++++++++++++++++ misc/bin/rain | 128 ++++++ misc/bin/yt | 214 ++++++++++ 26 files changed, 1182 insertions(+), 124 deletions(-) rename config/hypr/{scripts => configs}/batterynotify.conf (100%) rename config/hypr/{scripts/Emoji.sh => configs/emojis} (99%) mode change 100755 => 100644 delete mode 100755 config/hypr/scripts/HeatSensors.sh create mode 100755 config/hypr/scripts/Widget.sh create mode 100644 config/rofi/config-panel.rasi create mode 100755 misc/bin/pipes create mode 100755 misc/bin/rain create mode 100644 misc/bin/yt diff --git a/config/hypr/UserConfigs/Startup_Apps.conf b/config/hypr/UserConfigs/Startup_Apps.conf index 2271b822..4fdfefd5 100644 --- a/config/hypr/UserConfigs/Startup_Apps.conf +++ b/config/hypr/UserConfigs/Startup_Apps.conf @@ -21,7 +21,7 @@ exec-once = $scriptsDir/Polkit.sh # Battery Notification exec-once = $scriptsDir/BatteryNotify.sh -# Welcome Notification +# Welcome Message exec-once = $RunCMD welcome # starup apps @@ -30,7 +30,8 @@ exec-once = swaync & exec-once = blueman-applet & exec-once = nm-applet --indicator & exec-once = udiskie & -exec-once = blueman-applet & +#exec-once = blueman-applet & +exec-once = bluetoothctl power off & #clipboard manager exec-once = wl-paste --type text --watch cliphist store diff --git a/config/hypr/UserConfigs/UserKeybinds.conf b/config/hypr/UserConfigs/UserKeybinds.conf index 1ea0b000..4ea0b2b1 100644 --- a/config/hypr/UserConfigs/UserKeybinds.conf +++ b/config/hypr/UserConfigs/UserKeybinds.conf @@ -33,7 +33,7 @@ bind = $mainMod_SHIFT, Slash, exec, codium --disable-gpu bind = SHIFT_ALT, R, exec, $RunCMD reload bind = $mainMod, X, exec, $RunCMD powermenu bind = $mainMod_SHIFT, A, exec, $RunCMD gamemode -bind = ALT, slash, exec, $scriptsDir/Emoji.sh +bind = ALT, slash, exec, $RunCMD emoji bind = ALT, F1, exec, $RunCMD kb bind = $mainMod_SHIFT, Q, exec, $RunCMD blur bind = $mainMod, space, exec, $RunCMD layout diff --git a/config/hypr/scripts/batterynotify.conf b/config/hypr/configs/batterynotify.conf similarity index 100% rename from config/hypr/scripts/batterynotify.conf rename to config/hypr/configs/batterynotify.conf diff --git a/config/hypr/scripts/Emoji.sh b/config/hypr/configs/emojis old mode 100755 new mode 100644 similarity index 99% rename from config/hypr/scripts/Emoji.sh rename to config/hypr/configs/emojis index b0238257..30cca5a8 --- a/config/hypr/scripts/Emoji.sh +++ b/config/hypr/configs/emojis @@ -1,11 +1,3 @@ -#!/bin/bash - -sed '1,/^### DATA ###$/d' $0 | -rofi -dmenu -config ~/.config/rofi/config-long.rasi| -cut -d ' ' -f 1 | tr -d '\n' | wl-copy - -exit -### DATA ### šŸ˜€ grinning face, grin 😃 grinning face with big eyes, mouth open smile šŸ˜„ grinning face with smiling eyes eye, mouth open smile diff --git a/config/hypr/scripts/BatteryNotify.sh b/config/hypr/scripts/BatteryNotify.sh index c458601f..e37b2918 100755 --- a/config/hypr/scripts/BatteryNotify.sh +++ b/config/hypr/scripts/BatteryNotify.sh @@ -1,6 +1,6 @@ #!/bin/bash -batterynotify_conf=$HOME/.config/hypr/scripts/batterynotify.conf +batterynotify_conf=$HOME/.config/hypr/configs/batterynotify.conf config_info() { cat << EOF diff --git a/config/hypr/scripts/Brightness.sh b/config/hypr/scripts/Brightness.sh index 92c931df..94f2b830 100755 --- a/config/hypr/scripts/Brightness.sh +++ b/config/hypr/scripts/Brightness.sh @@ -39,10 +39,10 @@ case "$1" in get_backlight ;; "--inc") - change_backlight "+10%" + change_backlight "+5%" ;; "--dec") - change_backlight "10%-" + change_backlight "5%-" ;; "--get-kbd") get_kbd_backlight diff --git a/config/hypr/scripts/Device_cmd.sh b/config/hypr/scripts/Device_cmd.sh index dca6a08c..7d0f514a 100755 --- a/config/hypr/scripts/Device_cmd.sh +++ b/config/hypr/scripts/Device_cmd.sh @@ -25,16 +25,26 @@ touchpad() { # Toggle Wifi wifi() { - wifi="$(nmcli r wifi | awk 'FNR = 2 {print $1}')" - if [ -n "$wifi" ]; then - rfkill block all & + wifi_status=$(nmcli radio wifi) + if [ "$wifi_status" == "enabled" ]; then + nmcli radio wifi off notify-send -u low -i "$notif" 'Airplane mode: OFF' else - rfkill unblock all & + nmcli radio wifi on notify-send -u low -i "$notif" 'Airplane mode: ON' fi } +# Toggle Bluetooth +bluetooth() { + if [ "$bluetooth_status" == "no" ]; then + bluetoothctl power on + notify-send -u low -i "$notif" 'Bluetooth ON' + else + bluetoothctl power off + notify-send -u low -i "$notif" 'Bluetooth OFF' + fi +} # Reload Waybar, Rofi, Swaync, and Rainbowborder.sh (SHIFT ALT R) reload() { @@ -109,3 +119,41 @@ disable_edp1() { enable_edp1() { hyprctl keyword monitor eDP-1,preferred,auto,1 } + +weather() { + city=kohalpur + cachedir=~/.cache/rbn + cachefile=${0##*/}-$1 + + mkdir -p $cachedir + touch $cachedir/$cachefile + + SAVEIFS=$IFS;IFS=$'\n' + cacheage=$(($(date +%s) - $(stat -c '%Y' "$cachedir/$cachefile"))) + [ $cacheage -gt 1740 ] || [ ! -s $cachedir/$cachefile ] && { + data=($(curl -s https://en.wttr.in/"$city"$1\?0qnT 2>&1)) + for i in {1..2}; do echo ${data[$i]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile; done + } + IFS=$SAVEIFS + + weather=($(cat $cachedir/$cachefile)) + temperature=$(echo ${weather[2]} | sed -E 's/([[:digit:]]+)\.\./\1 to /g') + + case $(echo ${weather[1]##*,} | tr '[:upper:]' '[:lower:]') in + clear|sunny) condition="īŒ" ;; + partly\ cloudy) condition="󰖕" ;; + cloudy) condition="īŒ’" ;; + overcast) condition="" ;; + fog|freezing\ fog) condition="īŒ“" ;; + patchy\ rain\ possible|patchy\ light\ drizzle|light\ drizzle|patchy\ light\ rain|light\ rain|light\ rain\ shower|mist|rain) condition="ó°¼³" ;; + moderate\ rain\ at\ times|moderate\ rain|heavy\ rain\ at\ times|heavy\ rain|moderate\ or\ heavy\ rain\ shower|torrential\ rain\ shower|rain\ shower) condition="" ;; + patchy\ snow\ possible|patchy\ sleet\ possible|patchy\ freezing\ drizzle\ possible|freezing\ drizzle|heavy\ freezing\ drizzle|light\ freezing\ rain|moderate\ or\ heavy\ freezing\ rain|light\ sleet|ice\ pellets|light\ sleet\ showers|moderate\ or\ heavy\ sleet\ showers) condition="󰼓" ;; + blowing\ snow|moderate\ or\ heavy\ sleet|patchy\ light\ snow|light\ snow|light\ snow\ showers) condition="󰙿" ;; + blizzard|patchy\ moderate\ snow|moderate\ snow|patchy\ heavy\ snow|heavy\ snow|moderate\ or\ heavy\ snow\ with\ thunder|moderate\ or\ heavy\ snow\ showers) condition="īž" ;; + thundery\ outbreaks\ possible|patchy\ light\ rain\ with\ thunder|moderate\ or\ heavy\ rain\ with\ thunder|patchy\ light\ snow\ with\ thunder) condition="īŒ" ;; + *) condition="" ;; + esac + + echo -e "{\"text\":\""$temperature $condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}" +} + diff --git a/config/hypr/scripts/HeatSensors.sh b/config/hypr/scripts/HeatSensors.sh deleted file mode 100755 index a674af27..00000000 --- a/config/hypr/scripts/HeatSensors.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/sh - -##################################### -# # -# @author : 00xZ4CKX # -# ļ‚› GitHub : @S4NKALP # -# ļ„” Developer : Sankalp Tharu # -# ļ«„ Copyright : Sankalp Tharu # -# # -##################################### - - -# Select the right temperature file. # -for temp_dir in /sys/class/hwmon/*; do - [[ "$(< "${temp_dir}/name")" =~ (coretemp|fam15h_power|k10temp) ]] && { - - temp_dirs=("$temp_dir"/temp*_input) - temp_dir=${temp_dirs[0]} - break - - } - -done - - -# Get CPU temp. # -[[ -f "$temp_dir" ]] && deg="$(($(< "$temp_dir") * 100 / 10000))" - -# Add CPU temp to the output. # -if [[ "$cpu_temp" != "off" && "$deg" ]]; then - deg="${deg//.}" - - # Convert to Fahrenheit if enabled - [[ "$cpu_temp" == "F" ]] && deg="$((deg * 90 / 50 + 320))" - - deg_no_format="${deg/${deg: -1}}" - - # Format the output - deg="${deg/${deg: -1}}°${cpu_temp:-C}" - - -fi - -# from 0°C to 40°C print -> ļ‹‹ -if [[ "$deg_no_format" -le 40 ]] - then - echo -e "ļ‹‹ $deg" - -# from 40°C to 60°C print ->  -elif [[ "$deg_no_format" -le 60 ]] - then - echo -e " $deg" - - -# from 60°C to 85°C print -> ļ‹ˆ -elif [[ "$deg_no_format" -le 85 ]] - then - echo -e "ļ‹ˆ $deg" - -# from 85°C to +... print ->  -elif [[ "$deg_no_format" -gt 85 ]] - then - # the ' -n "%{F#FF0008}" ' -> red font as 85°C to +... is the default warn temperature - echo -e "${BRed} $deg" -fi diff --git a/config/hypr/scripts/Ref.sh b/config/hypr/scripts/Ref.sh index 2dc1516c..54f53ff2 100755 --- a/config/hypr/scripts/Ref.sh +++ b/config/hypr/scripts/Ref.sh @@ -67,3 +67,9 @@ NOTES_EDITOR="kitty nvim" # Misc lock="$SCRIPTSDIR/device_cmd.sh lockscreen" +# For panel +theme="$HOME/.config/rofi/config-panel.rasi" + +# For Bluetooth +bluetooth_status=$(bluetoothctl show | grep "Powered" | awk '{print $2}') + diff --git a/config/hypr/scripts/Rofi_cmd.sh b/config/hypr/scripts/Rofi_cmd.sh index a2829257..1d5d5444 100755 --- a/config/hypr/scripts/Rofi_cmd.sh +++ b/config/hypr/scripts/Rofi_cmd.sh @@ -209,4 +209,8 @@ CONFIG=$(rofi -show file-browser-extended -file-browser-stdout -file-browser-dir hyprctl dispatch exec "[float;size 45% 80%;center 1] kitty keyb -k '$CONFIG'" } - +# Emoji (ALT SLASH) +emoji() { + A="$(rofi -dmenu -l 10 -p "Emoji:" -config ~/.config/rofi/config-long.rasi < "$HOME/.config/hypr/configs/emojis" | cut -d' ' -f1 | tr -d '\n')" +[[ -n "$A" ]] && wl-copy -- "$A" +} diff --git a/config/hypr/scripts/RunCMD.sh b/config/hypr/scripts/RunCMD.sh index b6446f0d..8909517e 100755 --- a/config/hypr/scripts/RunCMD.sh +++ b/config/hypr/scripts/RunCMD.sh @@ -4,6 +4,7 @@ source ~/.config/hypr/scripts/Ui_cmd.sh source ~/.config/hypr/scripts/Device_cmd.sh source ~/.config/hypr/scripts/Rofi_cmd.sh source ~/.config/hypr/scripts/Music_cmd.sh +source ~/.config/hypr/scripts/Widget.sh help() { declare -F diff --git a/config/hypr/scripts/Widget.sh b/config/hypr/scripts/Widget.sh new file mode 100755 index 00000000..9858bc44 --- /dev/null +++ b/config/hypr/scripts/Widget.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash + +# Source the configuration file. +CONFIG_FILE=~/.config/hypr/scripts/Ref.sh +source "$CONFIG_FILE" + +panel(){ +# Theme Elements +prompt='Panel' + +list_col='2' +list_row='2' +win_width='450px' + +# Options +bluetooth_status=$(bluetoothctl show | awk '/Powered:/ {print $2}') +bluetooth_icon="ļˆ„" +[ "$bluetooth_status" = "yes" ] && bluetooth_icon="ļˆ…" + +wifi_status=$(nmcli radio wifi) +wifi_icon="ļˆ„" +[ "$wifi_status" = "enabled" ] && wifi_icon="ļˆ…" + +layout=$(grep 'USE_ICON' "$theme" | cut -d'=' -f2) +if [[ "$layout" == 'NO' ]]; then + option_1="ļ—€" + option_2="ļ—€" + option_3="ļ—€" + option_4="ļ—€" +else + option_1=" ${wifi_icon}" # Wifi + option_2=" āø" # Play pause + option_3="ļŠ” ${bluetooth_icon}" # Bluetooth + option_4="" # Settings +fi + +# Rofi CMD +rofi_cmd() { + rofi -theme-str "window {width: $win_width;}" \ + -theme-str "listview {columns: $list_col; lines: $list_row;}" \ + -theme-str 'textbox-prompt-colon {str: " ";}' \ + -dmenu -p "$prompt" -markup-rows -theme "$theme" -hover-select +} + +# Pass variables to rofi dmenu +run_rofi() { + echo -e "$option_1\n$option_2\n$option_3\n$option_4" | rofi_cmd +} + +# Execute Command +run_cmd() { + case $1 in + '--opt1') $SCRIPTSDIR/RunCMD.sh wifi ;; + '--opt2') playerctl play-pause ;; + '--opt3') $SCRIPTSDIR/RunCMD.sh bluetooth ;; + '--opt4') $SCRIPTSDIR/RunCMD.sh panelsetting ;; + esac +} + +# Actions +chosen=$(run_rofi) +case $chosen in + $option_1) run_cmd --opt1 ;; + $option_2) run_cmd --opt2 ;; + $option_3) run_cmd --opt3 ;; + $option_4) run_cmd --opt4 ;; +esac +} + +panelsetting(){ +# Theme Elements +prompt='Panel Settings' + + +list_col='2' +list_row='2' +win_width='450px' + +# Options + +layout=`cat ${theme} | grep 'USE_ICON' | cut -d'=' -f2` +if [[ "$layout" == 'NO' ]]; then + option_1="ļ—€" + option_2="ļ—€" + option_3="ļ—€" + option_4="ļ—€" +else + option_1="" # Wifi + option_2="" # Back + option_3="ļŠ”" # Bluetooth + option_4="ļ…¼" # Hyprconf +fi + +# Rofi CMD +rofi_cmd() { + rofi \ + -theme-str "window {width: $win_width;}" \ + -theme-str "listview {columns: $list_col; lines: $list_row;}" \ + -theme-str 'textbox-prompt-colon {str: " ";}' \ + -dmenu \ + -p "$prompt" \ + -markup-rows \ + -theme ${theme} \ + -hover-select +} + +# Pass variables to rofi dmenu +run_rofi() { + echo -e "$option_1\n$option_2\n$option_3\n$option_4" | rofi_cmd +} + +# Execute Command +run_cmd() { + if [[ "$1" == '--opt1' ]]; then + kitty nmtui + elif [[ "$1" == '--opt2' ]]; then + $SCRIPTSDIR/RunCMD.sh panel + elif [[ "$1" == '--opt3' ]]; then + blueberry + elif [[ "$1" == '--opt4' ]]; then + $SCRIPTSDIR/RunCMD.sh edit + fi +} + +# Actions +chosen="$(run_rofi)" +case ${chosen} in + $option_1) + run_cmd --opt1 + ;; + $option_2) + run_cmd --opt2 + ;; + $option_3) + run_cmd --opt3 + ;; + $option_4) + run_cmd --opt4 + ;; +esac +} diff --git a/config/hypr/scripts/Xmenu.sh b/config/hypr/scripts/Xmenu.sh index 0677e8e2..d707f420 100755 --- a/config/hypr/scripts/Xmenu.sh +++ b/config/hypr/scripts/Xmenu.sh @@ -32,7 +32,7 @@ declare -A menu_options=( ["; Launcher"]="rofi -show drun -modi drun,filebrowser,run,window -theme $HOME/.config/rofi/launcher.rasi" ["cb Clipboard"]="$RunCMD clip" ["rm RunCMDMusic"]="$scriptsDir/Music_cmd.sh -m" - ["emj RunCMDEmoji"]="$scriptsDir/Emoji.sh" + ["emj RunCMDEmoji"]="$RunCMD emoji" ["cc Calculator"]="$RunCMD calc" ["td Todo"]="$RunCMD todo" ["tx Tmux"]="$RunCMD tmux" diff --git a/config/rofi/config-panel.rasi b/config/rofi/config-panel.rasi new file mode 100644 index 00000000..808e98f8 --- /dev/null +++ b/config/rofi/config-panel.rasi @@ -0,0 +1,178 @@ +/** + * + * Author : Aditya Shakya (adi1090x) + * Github : @adi1090x + * + * Rofi Theme File + * Rofi Version: 1.7.3 + **/ + +/*****----- Configuration -----*****/ +configuration { + show-icons: false; +} + +/*****----- Global Properties -----*****/ +* { + font: "JetBrains Mono Nerd Font 10"; + background: #1E1D2FFF; + background-alt: #282839FF; + foreground: #D9E0EEFF; + selected: #7AA2F7FF; + active: #ABE9B3FF; + urgent: #F28FADFF; +} + +/* +USE_BUTTONS=YES +*/ + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 115px; + x-offset: -15px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + margin: 0px; + padding: 0px; + border: 2px; + border-radius: 10px; + border-color: @selected; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 15px; + margin: 0px; + padding: 15px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: transparent; + children: [ "listview" ]; + background-image: url("~/.config/rofi/.current_wallpaper", width); +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 0px; + margin: 0px; + padding: 0px; + border: 0px; + border-radius: 10px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + children: [ "textbox-prompt-colon", "prompt"]; +} + +dummy { + background-color: transparent; +} + +textbox-prompt-colon { + enabled: true; + expand: false; + str: ""; + padding: 12px 16px; + border-radius: 10px; + background-color: @urgent; + text-color: @background; +} +prompt { + enabled: true; + padding: 12px; + border-radius: 10px; + background-color: @active; + text-color: @background; +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 12px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: @background-alt; + text-color: @foreground; +} +textbox { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; + placeholder-color: @foreground; + blink: true; + markup: true; +} +error-message { + padding: 12px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: @background; + text-color: @foreground; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 1; + lines: 5; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 15px; + margin: 0px; + padding: 0px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 0px; + margin: 0px; + padding: 20px 0px; + border: 0px solid; + border-radius: 10px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element-text { + font: "feather bold 24"; + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; +} +element selected.normal { + background-color: var(selected); + text-color: var(background); +} diff --git a/config/swaync/config.json b/config/swaync/config.json index d56ecd79..27868dc2 100755 --- a/config/swaync/config.json +++ b/config/swaync/config.json @@ -55,10 +55,10 @@ "image-radius": 0 }, "volume": { - "label": "󰕾" + "label": "šŸ”‰" }, "backlight": { - "label": "󰃟" + "label": "šŸ”…" }, "buttons-grid": { "actions": [ @@ -72,7 +72,7 @@ }, { "label": "󰌾", - "command": "~/.config/hypr/scripts/RunCMD.sh lockscreen" + "command": "~/.config/hypr/scripts/RunCMD.sh lock" }, { "label": "󰍃", diff --git a/config/waybar/configs/[BOT & Left] southWest b/config/waybar/configs/[BOT & Left] southWest index cb809aaa..45a956f5 100644 --- a/config/waybar/configs/[BOT & Left] southWest +++ b/config/waybar/configs/[BOT & Left] southWest @@ -18,7 +18,7 @@ "modules-left": [ "custom/menu", "cpu", - "custom/CpuTemp", + "temperature", "memory", "disk", ], diff --git a/config/waybar/configs/[BOT & Right] southeast b/config/waybar/configs/[BOT & Right] southeast index 81a462f8..f281fdaf 100644 --- a/config/waybar/configs/[BOT & Right] southeast +++ b/config/waybar/configs/[BOT & Right] southeast @@ -18,7 +18,7 @@ "modules-left": [ "custom/menu", "cpu", - "custom/CpuTemp", + "temperature", "memory", "disk", ], diff --git a/config/waybar/configs/[BOT] default b/config/waybar/configs/[BOT] default index a7e4dc6d..ed601d0f 100644 --- a/config/waybar/configs/[BOT] default +++ b/config/waybar/configs/[BOT] default @@ -18,7 +18,7 @@ "custom/separator#dot-line", "cpu", "custom/separator#dot-line", - "custom/CpuTemp", + "temperature", "custom/separator#dot-line", "memory", "custom/separator#dot-line", diff --git a/config/waybar/configs/[BOT] gardenia b/config/waybar/configs/[BOT] gardenia index 79044124..4c6b3972 100644 --- a/config/waybar/configs/[BOT] gardenia +++ b/config/waybar/configs/[BOT] gardenia @@ -62,7 +62,8 @@ "backlight#gar": { "device": "intel_backlight", "format": "{icon}", - "format-icons": ["󰛩", "󱩎", "󱩏", "󱩑", "󱩒", "󱩓", "󱩔", "󱩕", "󰛨"], + //"format-icons": ["󰛩", "󱩎", "󱩏", "󱩑", "󱩒", "󱩓", "󱩔", "󱩕", "󰛨"], + "format-icons": ["šŸ”…", "šŸ”†", "ā˜€ļø"], "tooltip-format": "{percent}%" }, diff --git a/config/waybar/configs/[BOT] peony b/config/waybar/configs/[BOT] peony index cca28843..85f1b379 100644 --- a/config/waybar/configs/[BOT] peony +++ b/config/waybar/configs/[BOT] peony @@ -25,7 +25,7 @@ "custom/separator#blank", "pulseaudio", "custom/separator#blank", - "custom/CpuTemp", + "temperature", "custom/separator#blank", "network#peony", "custom/swaync"], diff --git a/config/waybar/configs/[TOP & BOT] summitsplit b/config/waybar/configs/[TOP & BOT] summitsplit index 30e6ce1d..0d793cff 100644 --- a/config/waybar/configs/[TOP & BOT] summitsplit +++ b/config/waybar/configs/[TOP & BOT] summitsplit @@ -17,7 +17,7 @@ "modules-left": [ "cpu", - "custom/CpuTemp", + "temperature", "memory", "disk", ], diff --git a/config/waybar/modules b/config/waybar/modules index a36a4476..6fc4f158 100644 --- a/config/waybar/modules +++ b/config/waybar/modules @@ -137,7 +137,7 @@ "modules": [ "cpu", "memory", - "custom/CpuTemp", + "temperature", "disk", ] }, @@ -164,8 +164,10 @@ "rotate": 0, //"format": "{icon} {percent}%", //"format-icons": ["󰃞", "󰃟", "󰃠"], + //"format-icons": ["󰛩", "󱩎", "󱩏", "󱩑", "󱩒", "󱩓", "󱩔", "󱩕", "󰛨"], + // "format-icons": ["īŽ", "ī“", "ī‘", "ī", "īŽ", "ī", "īŠ", "īˆ", "īŽ›"], "format": "{icon}", - "format-icons": ["󰛩", "󱩎", "󱩏", "󱩑", "󱩒", "󱩓", "󱩔", "󱩕", "󰛨"], + "format-icons": ["šŸ”…", "šŸ”†", "ā˜€ļø"], "tooltip-format": "backlight {percent}%", "icon-size": 10, "on-click": "", @@ -216,9 +218,11 @@ "clock": { "interval": 1, - "format": " {:%I:%M %p}", + //"format": " {:%I:%M %p}", //"format": " {:%H:%M:%S}", - "format-alt": " {:%H:%M  %Y, %d %B, %A}", + //"format-alt": " {:%I:%M  %Y, %d %B, %A}", + "format": "{:šŸ•°ļø %I:%M %p šŸ“… %d/%m}", + "format-alt": "šŸ•°ļø {:%I:%M %B %d, %Y %A} šŸ—“ļø", "tooltip-format": "{calendar}", "calendar": { "mode" : "year", @@ -243,10 +247,11 @@ }, "cpu": { - "format": "󰍛 {usage}%", + //"format": "󰍛 {usage}%", + "format": "šŸ“Š {usage}%", "interval": 1, "format-alt-click": "click", - "format-alt": "{icon0}{icon1}{icon2}{icon3} {usage:>2}% 󰍛", + "format-alt": "{icon0}{icon1}{icon2}{icon3} {usage:>2}% šŸ“Š", "format-icons": ["▁", "ā–‚", "ā–ƒ", "ā–„", "ā–…", "ā–†", "ā–‡", "ā–ˆ"], "on-click-right": "gnome-system-monitor", }, @@ -256,7 +261,7 @@ //"format": "󰋊", "path": "/", //"format-alt-click": "click", - "format": "󰋊 {percentage_used}%", + "format": "ļ‚  {percentage_used}%", //"tooltip": true, "tooltip-format": "{used} used out of {total} on {path} ({percentage_used}%)", }, @@ -308,11 +313,12 @@ "memory": { "interval": 1, - "format": "󰾆 {used:0.1f}G", - "format-alt": "󰾆 {percentage}%", + //"format": "󰾆 {used:0.1f}G", + //"format-alt": "󰾆 {percentage}%", + "format": "🧬 {used:0.1f}G/{total:0.1f}G", + "format-alt": "🧬 {percentage}%", "format-alt-click": "click", "tooltip": true, - "tooltip-format": "{used:0.1f}GB/{total:0.1f}G", "on-click-right": "kitty --title btop sh -c 'btop'" }, @@ -462,14 +468,23 @@ "tooltip":true, "format": "{icon} {}", "format-icons": { - "notification": "", - "none": "ļ‚¢", - "dnd-notification": "", - "dnd-none": "", - "inhibited-notification": "", - "inhibited-none": "ļ‚¢", - "dnd-inhibited-notification": "", - "dnd-inhibited-none": "" + "notification": "šŸ””ļ‘„", + "none": "šŸ””", + "dnd-notification": "šŸ”•ļ‘„", + "dnd-none": "šŸ”•", + "inhibited-notification": "šŸ””ļ‘„", + "inhibited-none": "šŸ””", + "dnd-inhibited-notification": "šŸ”•ļ‘„", + "dnd-inhibited-none": "šŸ”•" + + //"none": "ļ‚¢", + //"notification": "", + //"dnd-notification": "", + //"dnd-none": "", + //"inhibited-notification": "", + //"inhibited-none": "ļ‚¢", + //"dnd-inhibited-notification": "", + //"dnd-inhibited-none": "" }, "return-type": "json", "exec-if": "which swaync-client", @@ -545,11 +560,16 @@ "tooltip": false, "interval": 900 }, -"custom/CpuTemp":{ - "exec": "~/.config/hypr/scripts/HeatSensors.sh", - "interval": 10, - "format": "{} 󰈸", - "tooltip": false, +"temperature": { + "interval": 10, + "tooltip": true, + "hwmon-path": ["/sys/class/hwmon/hwmon7/temp1_input"], + //"thermal-zone": 0, + "critical-threshold": 82, + "format-critical": "{temperatureC}°C {icon}", + "format": "{temperatureC}°C {icon}", + "format-icons": ["šŸ”„", "ā¤ļøā€šŸ”„", "šŸŒ”ļø"], + "on-click-right": "kitty --title nvtop sh -c 'nvtop'" }, // Separators @@ -596,7 +616,7 @@ "align": 0.4, "rotate": 1, "format": "{icon}", - "format-icons": ["󰃞", "󰃟", "󰃠"], + "format-icons": ["šŸ”…", "šŸ”†", "ā˜€ļø"], "on-click": "", "on-click-middle": "", "on-click-right": "", @@ -609,8 +629,9 @@ "clock#vertical": { //"format": "{:\n%H\n%M\n%S\n\n \n%d\n%m\n%y}", + //"format": "{:\n%I\n%M\n%p\n\n \n%d\n%m\n%y}", + "format": "{:šŸ•°ļø\n%I\n%M\n%p\n\nšŸ—“ \n%d\n%m\n%y}", "interval": 1, - "format": "{:\n%I\n%M\n%p\n\n \n%d\n%m\n%y}", "tooltip": true, "tooltip-format": "{calendar}", "calendar": { @@ -622,15 +643,18 @@ } }, "cpu#vertical": { - "format": "󰍛\n{usage}%", + //"format": "󰍛\n{usage}%", + "format": "šŸ“Š\n{usage}%", "interval": 1, "on-click-right": "gnome-system-monitor", }, "memory#vertical": { "interval": 10, - "format": "󰾆\n{percentage}%", - "format-alt": "󰾆\n{used:0.1f}G", + "format": "🧬\n{percentage}%", + //"format": "󰾆\n{percentage}%", + "format-alt": "🧬\n{used:0.1f}G", + //"format-alt": "󰾆\n{used:0.1f}G", "format-alt-click": "click", "tooltip": true, "tooltip-format": "{used:0.1f}GB/{total:0.1f}G", diff --git a/config/waybar/style.css b/config/waybar/style.css index 5652ea5b..0f31c00e 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -133,11 +133,11 @@ window#waybar.empty { #taskbar, #tray, #window, +#temperature, #wireplumber, #workspaces, #custom-keybinds, #custom-keyboard, -#custom-CpuTemp, #custom-cycle_wall, #custom-backlight, #custom-music, @@ -213,7 +213,7 @@ window#waybar.empty { color: @sapphire; } -#custom-CpuTemp { +#temperature { color: @teal; } diff --git a/misc/bin/pipes b/misc/bin/pipes new file mode 100755 index 00000000..73346ef2 --- /dev/null +++ b/misc/bin/pipes @@ -0,0 +1,385 @@ +#!/usr/bin/env bash +# pipes.sh: Animated pipes terminal screensaver. +# https://github.com/pipeseroni/pipes.sh +# +# Copyright (c) 2015-2018 Pipeseroni/pipes.sh contributors +# Copyright (c) 2013-2015 Yu-Jie Lin +# Copyright (c) 2010 Matthew Simpson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +VERSION=1.3.0 + +M=32768 # Bash RANDOM maximum + 1 +p=1 # number of pipes +f=75 # frame rate +s=13 # probability of straight fitting +r=2000 # characters limit +t=0 # iteration counter for -r character limit +w=80 # terminal size +h=24 + +# ab -> sets[][idx] = a*4 + b +# 0: up, 1: right, 2: down, 3: left +# 00 means going up , then going up -> ā”ƒ +# 12 means going right, then going down -> ┓ +sets=( + "ā”ƒā” ┓┛━┓ ā”—ā”ƒā”›ā”— ā”ā”" + "│╭ ╮╯─╮ ╰│╯╰ ╭─" + "ā”‚ā”Œ ā”ā”˜ā”€ā” ā””ā”‚ā”˜ā”” ā”Œā”€" + "ā•‘ā•” ā•—ā•ā•ā•— ā•šā•‘ā•ā•š ╔═" + "|+ ++-+ +|++ +-" + "|/ \/-\ \|/\ /-" + ".. .... .... .." + ".o oo.o o.oo o." + "-\ /\|/ /-\/ \|" # railway + "ā•æā” ā”‘ā”šā•¼ā”’ ┕╽┙┖ ā”Žā•¾" # knobby pipe +) +SETS=() # rearranged all pipe chars into individul elements for easier access + +# pipes' +x=() # current position +y=() +l=() # current directions + # 0: up, 1: right, 2: down, 3: left +n=() # new directions +v=() # current types +c=() # current escape codes + +# selected pipes' +V=() # types (indexes to sets[]) +C=() # color indices for tput setaf +VN=0 # number of selected types +CN=0 # number of selected colors +E=() # pre-generated escape codes from BOLD, NOCOLOR, and C + +# switches +RNDSTART=0 # randomize starting position and direction +BOLD=1 +NOCOLOR=0 +KEEPCT=0 # keep pipe color and type + + +# print help message in 72-char width +print_help() { + local cgap + printf -v cgap '%*s' $((15 - ${#COLORS})) '' + cat <= 0 + is_N() { + [[ -n $1 && -z ${1//[0-9]} ]] + } + + + # test if $1 is a hexadecimal string + is_hex() { + [[ -n $1 && -z ${1//[0-9A-Fa-f]} ]] + } + + + # print error message for invalid argument to standard error, this + # - mimics getopts error message + # - use all positional parameters as error message + # - has a newline appended + # $arg and $OPTARG are the option name and argument set by getopts. + pearg() { + printf "%s: -$arg invalid argument -- $OPTARG; %s\n" "$0" "$*" >&2 + } + + + OPTIND=1 + while getopts "p:t:c:f:s:r:RBCKhv" arg; do + case $arg in + p) + if is_N "$OPTARG" && ((OPTARG > 0)); then + p=$OPTARG + else + pearg 'must be an integer and greater than 0' + return 1 + fi + ;; + t) + if [[ "$OPTARG" = c???????????????? ]]; then + V+=(${#sets[@]}) + sets+=("${OPTARG:1}") + elif is_N "$OPTARG" && ((OPTARG < ${#sets[@]})); then + V+=($OPTARG) + else + pearg 'must be an integer and from 0 to' \ + "$((${#sets[@]} - 1)); or a custom type" + return 1 + fi + ;; + c) + if [[ $OPTARG == '#'* ]]; then + if ! is_hex "${OPTARG:1}"; then + pearg 'unrecognized hexadecimal string' + return 1 + fi + if ((16$OPTARG >= COLORS)); then + pearg 'hexadecimal must be from #0 to' \ + "#$(printf '%X' $((COLORS - 1)))" + return 1 + fi + C+=($((16$OPTARG))) + elif is_N "$OPTARG" && ((OPTARG < COLORS)); then + C+=($OPTARG) + else + pearg "must be an integer and from 0 to $((COLORS - 1));" \ + 'or a hexadecimal string with # prefix' + return 1 + fi + ;; + f) + if is_N "$OPTARG" && ((OPTARG >= 20 && OPTARG <= 100)); then + f=$OPTARG + else + pearg 'must be an integer and from 20 to 100' + return 1 + fi + ;; + s) + if is_N "$OPTARG" && ((OPTARG >= 5 && OPTARG <= 15)); then + s=$OPTARG + else + pearg 'must be an integer and from 5 to 15' + return 1 + fi + ;; + r) + if is_N "$OPTARG"; then + r=$OPTARG + else + pearg 'must be a non-negative integer' + return 1 + fi + ;; + R) RNDSTART=1;; + B) BOLD=0;; + C) NOCOLOR=1;; + K) KEEPCT=1;; + h) + print_help + exit 0 + ;; + v) echo "$(basename -- "$0") $VERSION" + exit 0 + ;; + *) + return 1 + esac + done + + shift $((OPTIND - 1)) + if (($#)); then + printf "$0: illegal arguments -- $*; no arguments allowed\n" >&2 + return 1 + fi +} + + +cleanup() { + # clear out standard input + read -t 0.001 && cat /dev/null + + tput reset # fix for konsole, see pipeseroni/pipes.sh#43 + tput rmcup + tput cnorm + stty echo + printf "$SGR0" + exit 0 +} + + +resize() { + w=$(tput cols) h=$(tput lines) +} + + +init_pipes() { + # +_CP_init_pipes + local i + + ci=$((KEEPCT ? 0 : CN * RANDOM / M)) + vi=$((KEEPCT ? 0 : VN * RANDOM / M)) + for ((i = 0; i < p; i++)); do + (( + n[i] = 0, + l[i] = RNDSTART ? RANDOM % 4 : 0, + x[i] = RNDSTART ? w * RANDOM / M : w / 2, + y[i] = RNDSTART ? h * RANDOM / M : h / 2, + v[i] = V[vi] + )) + c[i]=${E[ci]} + ((ci = (ci + 1) % CN, vi = (vi + 1) % VN)) + done + # -_CP_init_pipes +} + + +init_screen() { + stty -echo + tput smcup + tput civis + tput clear + trap cleanup HUP TERM + + resize + trap resize SIGWINCH +} + + +main() { + # simple pre-check of TERM, tput's error message should be enough + tput -T "$TERM" sgr0 >/dev/null || return $? + + # +_CP_init_termcap_vars + COLORS=$(tput colors) # COLORS - 1 == maximum color index for -c argument + SGR0=$(tput sgr0) + SGR_BOLD=$(tput bold) + # -_CP_init_termcap_vars + + parse "$@" || return $? + + # +_CP_init_VC + # set default values if not by options + ((${#V[@]})) || V=(0) + VN=${#V[@]} + ((${#C[@]})) || C=(1 2 3 4 5 6 7 0) + CN=${#C[@]} + # -_CP_init_VC + + # +_CP_init_E + # generate E[] based on BOLD (SGR_BOLD), NOCOLOR, and C for each element in + # C, a corresponding element in E[] = + # SGR0 + # + SGR_BOLD, if BOLD + # + tput setaf C, if !NOCOLOR + local i + for ((i = 0; i < CN; i++)) { + E[i]=$SGR0 + ((BOLD)) && E[i]+=$SGR_BOLD + ((NOCOLOR)) || E[i]+=$(tput setaf ${C[i]}) + } + # -_CP_init_E + + # +_CP_init_SETS + local i j + for ((i = 0; i < ${#sets[@]}; i++)) { + for ((j = 0; j < 16; j++)) { + SETS+=("${sets[i]:j:1}") + } + } + unset i j + # -_CP_init_SETS + + init_screen + init_pipes + + # any key press exits the loop and this script + trap 'break 2' INT + + local i + while REPLY=; do + read -t 0.0$((1000 / f)) -n 1 2>/dev/null + case "$REPLY" in + P) ((s = s < 15 ? s + 1 : s));; + O) ((s = s > 3 ? s - 1 : s));; + F) ((f = f < 100 ? f + 1 : f));; + D) ((f = f > 20 ? f - 1 : f));; + B) ((BOLD = (BOLD + 1) % 2));; + C) ((NOCOLOR = (NOCOLOR + 1) % 2));; + K) ((KEEPCT = (KEEPCT + 1) % 2));; + ?) break;; + esac + for ((i = 0; i < p; i++)); do + # New position: + # l[] direction = 0: up, 1: right, 2: down, 3: left + # +_CP_newpos + ((l[i] % 2)) && ((x[i] += -l[i] + 2, 1)) || ((y[i] += l[i] - 1)) + # -_CP_newpos + + # Loop on edges (change color on loop): + # +_CP_warp + ((!KEEPCT && (x[i] >= w || x[i] < 0 || y[i] >= h || y[i] < 0))) \ + && { c[i]=${E[CN * RANDOM / M]}; ((v[i] = V[VN * RANDOM / M])); } + ((x[i] = (x[i] + w) % w, + y[i] = (y[i] + h) % h)) + # -_CP_warp + + # new turning direction: + # $((s - 1)) in $s, going straight, therefore n[i] == l[i]; + # and 1 in $s that pipe makes a right or left turn + # + # s * RANDOM / M - 1 == 0 + # n[i] == -1 + # => n[i] == l[i] + 1 or l[i] - 1 + # +_CP_newdir + (( + n[i] = s * RANDOM / M - 1, + n[i] = n[i] >= 0 ? l[i] : l[i] + (2 * (RANDOM % 2) - 1), + n[i] = (n[i] + 4) % 4 + )) + # -_CP_newdir + + # Print: + # +_CP_print + printf '\e[%d;%dH%s%s' \ + $((y[i] + 1)) $((x[i] + 1)) ${c[i]} \ + "${SETS[v[i] * 16 + l[i] * 4 + n[i]]}" + # -_CP_print + l[i]=${n[i]} + done + ((r > 0 && t * p >= r)) && tput reset && tput civis && t=0 || ((t++)) + done + + cleanup +} + + +# when being sourced, $0 == bash, only invoke main when they are the same +[[ "$0" != "$BASH_SOURCE" ]] || main "$@" diff --git a/misc/bin/rain b/misc/bin/rain new file mode 100755 index 00000000..12775374 --- /dev/null +++ b/misc/bin/rain @@ -0,0 +1,128 @@ +#!/bin/bash +# Let it Rain! +# Copyright (C) 2011, 2013 by Yu-Jie Lin +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# Blog: https://yjlv.blogstpo.com/2013/07/let-it-rain.html +# Gif : https://lh5.googleusercontent.com/-0WJ1vSZcFPs/UdadOwdPEXI/AAAAAAAAE-c/6kuH9hP3cUo/s800/rain.sh.gif +# Clip: https://youtu.be/EssRgAh2w_c +# +# Modified from falling-<3s.sh: +# https://yjlv.blogstpo.com/2011/02/time-to-have-falling-hearts-screensaver.html + +RAINS=("|" "│" "ā”ƒ" "┆" "┇" "ā”Š" "┋" "╽" "╿") +COLORS=("\e[37m" "\e[37;1m") +# More from 256 color mode +for i in {244..255}; do + COLORS=("${COLORS[@]}" "\e[38;5;${i}m") +done +NRAINS=${#RAINS[@]} +NCOLORS=${#COLORS[@]} +NUM_RAIN_METADATA=5 + + +sigwinch() { + TERM_WIDTH=$(tput cols) + TERM_HEIGHT=$(tput lines) + STEP_DURATION=0.025 + ((MAX_RAINS = TERM_WIDTH * TERM_HEIGHT / 4)) + ((MAX_RAIN_LENGTH = TERM_HEIGHT < 10 ? 1 : TERM_HEIGHT / 10)) + # In percentage + ((NEW_RAIN_ODD = TERM_HEIGHT > 50 ? 100 : TERM_HEIGHT * 2)) + ((NEW_RAIN_ODD = NEW_RAIN_ODD * 75 / 100)) + ((FALLING_ODD = TERM_HEIGHT > 25 ? 100 : TERM_HEIGHT * 4)) + ((FALLING_ODD = FALLING_ODD * 90 / 100)) + } + +do_exit() { + echo -ne "\e[${TERM_HEIGHT};1H\e[0K" + + # Show cursor and echo stdin + echo -ne "\e[?25h" + stty echo + exit 0 + } + +do_render() { + # Clean screen first + for ((idx = 0; idx < num_rains * NUM_RAIN_METADATA; idx += NUM_RAIN_METADATA)); do + X=${rains[idx]} + Y=${rains[idx + 1]} + LENGTH=${rains[idx + 4]} + for ((y = Y; y < Y + LENGTH; y++)); do + (( y < 1 || y > TERM_HEIGHT )) && continue + echo -ne "\e[${y};${X}H " + done + done + + for ((idx = 0; idx < num_rains * NUM_RAIN_METADATA; idx += NUM_RAIN_METADATA)); do + if ((100 * RANDOM / 32768 < FALLING_ODD)); then + # Falling + if ((++rains[idx + 1] > TERM_HEIGHT)); then + # Out of screen, bye sweet <3 + rains=("${rains[@]:0:idx}" + "${rains[@]:idx+NUM_RAIN_METADATA:num_rains*NUM_RAIN_METADATA}") + ((num_rains--)) + continue + fi + fi + X=${rains[idx]} + Y=${rains[idx + 1]} + RAIN=${rains[idx + 2]} + COLOR=${rains[idx + 3]} + LENGTH=${rains[idx + 4]} + for ((y = Y; y < Y + LENGTH; y++)); do + (( y < 1 || y > TERM_HEIGHT )) && continue + echo -ne "\e[${y};${X}H${COLOR}${RAIN}" + done + done + } + +trap do_exit TERM INT +trap sigwinch WINCH +# No echo stdin and hide the cursor +stty -echo +echo -ne "\e[?25l" + +echo -ne "\e[2J" +rains=() +sigwinch +while :; do + read -n 1 -t $STEP_DURATION ch + case "$ch" in + q|Q) + do_exit + ;; + esac + + if ((num_rains < MAX_RAINS)) && ((100 * RANDOM / 32768 < NEW_RAIN_ODD)); then + # Need new |, 1-based + RAIN="${RAINS[NRAINS * RANDOM / 32768]}" + COLOR="${COLORS[NCOLORS * RANDOM / 32768]}" + LENGTH=$((MAX_RAIN_LENGTH * RANDOM / 32768 + 1)) + X=$((TERM_WIDTH * RANDOM / 32768 + 1)) + Y=$((1 - LENGTH)) + rains=("${rains[@]}" "$X" "$Y" "$RAIN" "$COLOR" "$LENGTH") + ((num_rains++)) + fi + + # Let rain fall! + do_render +done diff --git a/misc/bin/yt b/misc/bin/yt new file mode 100644 index 00000000..963c9ab6 --- /dev/null +++ b/misc/bin/yt @@ -0,0 +1,214 @@ +#!/bin/bash + +# DISCLAIMER: this script has been started solely by me (sayan01) +# and has had contributions from others like Nicholas-Baron and +# juanCortelezzi (refer to contributors on github for details) +# this script is not based off of any other work by anyone else, +# nor is it made in association with anyone else, regardless of +# their claims. + +# Dependencies: mpv youtube-dl fzf rofi/dmenu gnu-grep + +# NOTE: if you don't have gnu grep, you can replace grep with rg + +# Explain usage +function usage () { + printf "usage: yt\n" + printf " -h help\n" + printf " -c channels/subscriptions\n" + printf " -s query search\n" + printf " -g / -r gui mode (rofi/dmenu)\n" + printf " -m music mode (audio only) [dont use with -r]\n" + printf " nothing use defaults (search from prompt)\n" + printf "\n" + printf "add channel names to the file %s to show them\n" "$sublistpath" + printf "in yt -c option. First word should be channel url, optionally\n" + printf "followed by tab and then anything else (channel name/description)\n" + printf "channels not in sublist can be viewed by typing their url in the prompt\n" + printf "\n" + printf "example file format:\n" + printf "markrober Mark Rober\n" + printf "vsauce1 VSauce Michael Steven's Channel\n" + printf "BlackGryph0n Black Gryph0n Gabriel Brown signs stuff\n" + printf "TomScottGo Tom Scott\n" + printf "danielthrasher Daniel Thrasher\n" + exit 0 +} + +# Use defaults if no arguments provided +useDefaults="f" +if [[ ${#} -eq 0 ]]; then + useDefaults="t" +fi + +# Available flags +optstring=":s:cgrhm" + +defcmd="fzf" +defaction="s" +guicmd="rofi -dmenu -i" # uncomment next line for dmenu +# guicmd="dmenu -i -l 15" + +# Defaults +promptcmd="$defcmd" +action="$defaction" +isGui="f" +query="" +mpv_options="" + +max_resolution="480" +max_fps="30" +ignore_codec="" +ytdlformats="bestvideo" + +if [ -n "$max_resolution" ] ; then + ytdlformats+="[height<=?$max_resolution]" +fi +if [ -n "$max_fps" ] ; then + ytdlformats+="[fps<=?$max_fps]" +fi +if [ -n "$ignore_codec" ] ; then + ytdlformats+="[vcodec!=$ignore_codec]" +fi +ytdlformats+="+bestaudio/best" + +# Subscription list +mkdir -p "${HOME:-}/.config/yt" +sublistpath="${HOME:-}/.config/yt/sublist" +sublist="" +[ -f "$sublistpath" ] && sublist=$(cat "$sublistpath") + +# If not using defaults, search for flags +if [[ $useDefaults = "f" ]]; then + while getopts ${optstring} arg; do + case "${arg}" in + s) + # Search in YouTube for a query + action="s" + query="${OPTARG}" ;; + c) + # Search in subscriptions for a specific channel + action="c" + query="${OPTARG}" ;; + g|r) + # Set gui mode to true and change the prompt to gui prompt + isGui="t" + promptcmd="$guicmd" ;; + m) + # Make the mpv headless + mpv_options+="--no-video" ;; + h) + # Display help / usage + usage ;; + \?|:) + # Wrong args -> exit with explanation of usage + echo "invalid option: -${OPTARG}" + echo + usage + exit 1 ;; + esac + done +fi + +# If no query is set with flags, then ask for one +if [ -z "$query" ]; then + # Ask for a channel + if [[ $action = "c" ]]; then + # If in gui mode, use gui prompt + if [[ $isGui = "t" ]]; then + query=$($promptcmd -p "Channel: " <<< "$sublist") + promptcmd="$promptcmd -p Video:" + else + query=$($promptcmd --print-query <<< "$sublist" | tail -n1) + fi + query=$(echo "$query" | awk '{print $1}') + else + # Ask for a query + # If in gui mode, use gui prompt + if [[ $isGui = "t" ]]; then + query=$(echo | $promptcmd -p "Search: ") + promptcmd="$promptcmd -p Video:" + else + echo -n "Search: " + read -r query + fi + fi +fi + +# Program cancelled -> exit +if [ -z "$query" ]; then exit; fi + +# Clean query / channel +query=$(sed \ + -e 's|+|%2B|g'\ + -e 's|#|%23|g'\ + -e 's|&|%26|g'\ + -e 's| |+|g' <<< "$query") + +# If channel, look for channel vids +if [[ $action = "c" ]]; then + response=$(curl -s "https://www.youtube.com/c/$query/videos" |\ + sed "s/{\"gridVideoRenderer/\n\n&/g" |\ + sed "s/}]}}}]}}/&\n\n/g" |\ + awk -v ORS="\n\n" '/gridVideoRenderer/') + + # If unable to fetch the YouTube results page, inform and exit + if ! grep -q "gridVideoRenderer" <<< "$response"; then echo "unable to fetch yt"; exit 1; fi + + # Regex expression to match video entries from YouTube channel page + # Get the list of videos and their ids to ids + ids=$(awk -F '[""]' '{print $6 "\t" $50;}' <<< "$response" | grep "^\S") + + # URL prefix for videos + videolink="https://youtu.be/" + + # Prompt the results to user infinitely until they exit (escape) + while true; do + choice=$(echo -e "$ids" | cut -d' ' -f2 | $promptcmd) # Don't show id + if [ -z "$choice" ]; then exit; fi # If esc-ed then exit + id=$(echo -e "$ids" | grep -Fwm1 "$choice" | cut -d' ' -f1) # Get id of choice + echo -e "$choice\t($id)" + case $id in + ???????????) mpv "$videolink$id" "$mpv_options" --ytdl-format="$ytdlformats";; + *) exit ;; + esac + done +else + # If in search, show query result vids + response="$(curl -s "https://www.youtube.com/results?search_query=$query" |\ + sed 's|\\.||g')" + # If unable to fetch the YouTube results page, inform and exit + if ! grep -q "script" <<< "$response"; then echo "unable to fetch yt"; exit 1; fi + # Regex expression to match video and playlist entries from YouTube result page + vgrep='"videoRenderer":{"videoId":"\K.{11}".+?"text":".+?[^\\](?=")' + pgrep='"playlistRenderer":{"playlistId":"\K.{34}?","title":{"simpleText":".+?[^\"](?=")' + # Grep the id and title + # Return them in format id (type) title + getresults() { + grep -oP "$1" <<< "$response" |\ + awk -F\" -v p="$2" '{ print $1 "\t" p " " $NF}' + } + # Get the list of videos/playlists and their ids in videoids and playlistids + videoids=$(getresults "$vgrep") + playlistids=$(getresults "$pgrep" "(playlist)") + # If there are playlists or videos, append them to list + [ -n "$playlistids" ] && ids="$playlistids\n" + [ -n "$videoids" ] && ids="$ids$videoids" + # URL prefix for videos and playlists + videolink="https://youtu.be/" + playlink="https://youtube.com/playlist?list=" + # Prompt the results to user infinitely until they exit (escape) + while true; do + choice=$(echo -e "$ids" | cut -d' ' -f2 | $promptcmd) # Don't show id + if [ -z "$choice" ]; then exit; fi # If esc-ed then exit + id=$(echo -e "$ids" | grep -Fwm1 "$choice" | cut -d' ' -f1) # Get id of choice + echo -e "$choice\t($id)" + case $id in + # 11 digit id = video + ???????????) mpv "$videolink$id" $mpv_options --ytdl-format="$ytdlformats";; + # 34 digit id = playlist + ??????????????????????????????????) mpv "$playlink$id" $mpv_options --ytdl-format="$ytdlformats";; + *) exit ;; + esac + done +fi