summaryrefslogtreecommitdiffstats
path: root/.local/bin
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin')
-rwxr-xr-x.local/bin/booksplit45
-rwxr-xr-x.local/bin/compiler6
-rwxr-xr-x.local/bin/cron/checkup2
-rwxr-xr-x.local/bin/cron/newsup4
-rwxr-xr-x.local/bin/dmenuhandler14
-rwxr-xr-x.local/bin/dmenumount8
-rwxr-xr-x.local/bin/dmenurecord4
-rwxr-xr-x.local/bin/dmenuumount2
-rwxr-xr-x.local/bin/ext45
-rwxr-xr-x.local/bin/getbib2
-rwxr-xr-x.local/bin/ifinstalled7
-rwxr-xr-x.local/bin/lf-select9
-rwxr-xr-x.local/bin/lfub24
-rwxr-xr-x.local/bin/linkhandler21
-rwxr-xr-x.local/bin/maimpick16
-rwxr-xr-x[-rw-r--r--].local/bin/noisereduce6
-rwxr-xr-x.local/bin/opout2
-rwxr-xr-x.local/bin/otp53
-rwxr-xr-x.local/bin/peertubetorrent6
-rwxr-xr-x.local/bin/qndl2
-rwxr-xr-x.local/bin/queueandnotify4
-rwxr-xr-x.local/bin/remaps12
-rwxr-xr-x.local/bin/samedir6
-rwxr-xr-x.local/bin/setbg15
-rwxr-xr-x.local/bin/shortcuts25
-rwxr-xr-x.local/bin/statusbar/sb-battery7
-rwxr-xr-x.local/bin/statusbar/sb-clock2
-rwxr-xr-x.local/bin/statusbar/sb-doppler414
-rwxr-xr-x.local/bin/statusbar/sb-internet10
-rwxr-xr-x.local/bin/statusbar/sb-mailbox2
-rwxr-xr-x.local/bin/statusbar/sb-music2
-rwxr-xr-x.local/bin/statusbar/sb-nettraf4
-rwxr-xr-x.local/bin/statusbar/sb-price26
-rwxr-xr-x.local/bin/statusbar/sb-volume6
-rwxr-xr-x.local/bin/sysact34
-rwxr-xr-x.local/bin/torwrap2
-rwxr-xr-x.local/bin/tutorialvids34
37 files changed, 496 insertions, 387 deletions
diff --git a/.local/bin/booksplit b/.local/bin/booksplit
index 7730ac2..69e4f36 100755
--- a/.local/bin/booksplit
+++ b/.local/bin/booksplit
@@ -1,46 +1,43 @@
#!/bin/sh
-# Requires ffmpeg (audio splitting) and my `tag` wrapper script.
+# Requires ffmpeg
[ ! -f "$2" ] && printf "The first file should be the audio, the second should be the timecodes.\\n" && exit
echo "Enter the album/book title:"; read -r booktitle
-
echo "Enter the artist/author:"; read -r author
-
echo "Enter the publication year:"; read -r year
inputaudio="$1"
+ext="${1#*.}"
# Get a safe file name from the book.
escbook="$(echo "$booktitle" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
-! mkdir -p "$escbook" && echo "Do you have write access in this directory?" && exit 1
-
-# As long as the extension is in the tag script, it'll work.
-ext="opus"
-#ext="${1#*.}"
+! mkdir -p "$escbook" &&
+ echo "Do you have write access in this directory?" &&
+ exit 1
# Get the total number of tracks from the number of lines.
total="$(wc -l < "$2")"
+cmd="ffmpeg -i \"$inputaudio\" -nostdin -y"
+
while read -r x;
do
- end="$(echo "$x" | cut -d' ' -f1)"
-
- [ -n "$start" ] &&
- echo "From $start to $end; $track $title"
- file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
- [ -n "$start" ] && echo "Splitting \"$title\"..." &&
- ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -to "$end" -vn -c copy "$file" &&
- echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
- title="$(echo "$x" | cut -d' ' -f 2-)"
- esctitle="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
- track="$((track+1))"
- start="$end"
+ end="$(echo "$x" | cut -d' ' -f1)"
+ file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
+ if [ -n "$start" ]; then
+ cmd="$cmd -metadata artist=\"$author\" -metadata title=\"$title\" -metadata album=\"$booktitle\" -metadata year=\"$year\" -metadata track=\"$track\" -metadata total=\"$total\" -ss \"$start\" -to \"$end\" -vn -c:a copy \"$file\" "
+ fi
+ title="$(echo "$x" | cut -d' ' -f2-)"
+ esctitle="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
+ track="$((track+1))"
+ start="$end"
done < "$2"
-# The last track must be done outside the loop.
-echo "From $start to the end: $title"
+
+# Last track must be added out of the loop.
file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
-echo "Splitting \"$title\"..." && ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -vn -c copy "$file" &&
- echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file" \ No newline at end of file
+cmd="$cmd -metadata artist=\"$author\" -metadata title=\"$title\" -metadata album=\"$booktitle\" -metadata year=\"$year\" -metadata track=\"$track\" -ss \"$start\" -vn -c copy \"$file\""
+
+eval "$cmd"
diff --git a/.local/bin/compiler b/.local/bin/compiler
index 39e149e..67992be 100755
--- a/.local/bin/compiler
+++ b/.local/bin/compiler
@@ -4,7 +4,7 @@
# have this script run via vim.
#
# Compiles .tex. groff (.mom, .ms), .rmd, .md, .org. Opens .sent files as sent
-# presentations. Runs scripts based on extention or shebang.
+# presentations. Runs scripts based on extension or shebang.
#
# Note that .tex files which you wish to compile with XeLaTeX should have the
# string "xelatex" somewhere in a comment/command in the first 5 lines.
@@ -37,7 +37,7 @@ case "$ext" in
java) javac -d classes "$file" && java -cp classes "${1%.*}" ;;
m) octave "$file" ;;
md) if [ -x "$(command -v lowdown)" ]; then
- lowdown -d nointem -e super "$file" -Tms | groff -mpdfmark -ms -kept > "$base".pdf
+ lowdown --parse-no-intraemph "$file" -Tms | groff -mpdfmark -ms -kept > "$base".pdf
elif [ -x "$(command -v groffdown)" ]; then
groffdown -i "$file" | groff > "$base.pdf"
else
@@ -53,5 +53,5 @@ case "$ext" in
scad) openscad -o "$base".stl "$file" ;;
sent) setsid -f sent "$file" 2>/dev/null ;;
tex) textype "$file" ;;
- *) head -n1 "$file" | grep "^#!/" | sed "s/^#!//" | xargs -r -I % "$file" ;;
+ *) sed -n '/^#!/s/^#!//p; q' "$file" | xargs -r -I % "$file" ;;
esac
diff --git a/.local/bin/cron/checkup b/.local/bin/cron/checkup
index 4cfb856..bd3c634 100755
--- a/.local/bin/cron/checkup
+++ b/.local/bin/cron/checkup
@@ -2,8 +2,6 @@
# Syncs repositories and downloads updates, meant to be run as a cronjob.
-ping -q -c 1 example.org > /dev/null || exit
-
notify-send "πŸ“¦ Repository Sync" "Checking for package updates..."
sudo pacman -Syyuw --noconfirm || notify-send "Error downloading updates.
diff --git a/.local/bin/cron/newsup b/.local/bin/cron/newsup
index 29f2b3c..ed266d7 100755
--- a/.local/bin/cron/newsup
+++ b/.local/bin/cron/newsup
@@ -3,11 +3,9 @@
# Set as a cron job to check for new RSS entries for newsboat.
# If newsboat is open, sends it an "R" key to refresh.
-ping -q -c 1 example.org > /dev/null || exit
-
/usr/bin/notify-send "πŸ“° Updating RSS feeds..."
-pgrep -f newsboat$ && /usr/bin/xdotool key --window "$(/usr/bin/xdotool search --name newsboat)" R && exit
+pgrep -f newsboat$ && /usr/bin/xdotool key --window "$(/usr/bin/xdotool search --name "^newsboat$")" R && exit
echo πŸ”ƒ > /tmp/newsupdate
pkill -RTMIN+6 "${STATUSBAR:-dwmblocks}"
diff --git a/.local/bin/dmenuhandler b/.local/bin/dmenuhandler
index e5de8ef..1c48f3a 100755
--- a/.local/bin/dmenuhandler
+++ b/.local/bin/dmenuhandler
@@ -4,17 +4,17 @@
# some choice programs to use to open it.
feed="${1:-$(printf "%s" | dmenu -p 'Paste URL or file path')}"
-case "$(printf "Copy URL\\nsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dl\\nqueue yt-dl audio" | dmenu -i -p "Open it with?")" in
- "copy url") echo "$feed" | xclip -selection clipboard ;;
+case "$(printf "Copy URL\\nsxiv\\nsetbg\\nPDF\\nbrowser\\nlynx\\nvim\\nmpv\\nmpv loop\\nmpv float\\nqueue download\\nqueue yt-dlp\\nqueue yt-dlp audio" | dmenu -i -p "Open it with?")" in
+ "Copy URL") echo "$feed" | xclip -selection clipboard ;;
mpv) setsid -f mpv -quiet "$feed" >/dev/null 2>&1 ;;
"mpv loop") setsid -f mpv -quiet --loop "$feed" >/dev/null 2>&1 ;;
"mpv float") setsid -f "$TERMINAL" -e mpv --geometry=+0-0 --autofit=30% --title="mpvfloat" "$feed" >/dev/null 2>&1 ;;
- "queue yt-dl") qndl "$feed" >/dev/null 2>&1 ;;
- "queue yt-dl audio") qndl "$feed" 'youtube-dl --add-metadata -icx -f bestaudio/best' >/dev/null 2>&1 ;;
+ "queue yt-dlp") qndl "$feed" >/dev/null 2>&1 ;;
+ "queue yt-dlp audio") qndl "$feed" 'yt-dlp --embed-metadata -icx -f bestaudio/best' >/dev/null 2>&1 ;;
"queue download") qndl "$feed" 'curl -LO' >/dev/null 2>&1 ;;
- PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
- sxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
- vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 ;;
+ PDF) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && zathura "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
+ sxiv) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
+ vim) curl -sL "$feed" > "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" && setsid -f "$TERMINAL" -e "$EDITOR" "/tmp/$(echo "$feed" | sed "s|.*/||;s/%20/ /g")" >/dev/null 2>&1 ;;
setbg) curl -L "$feed" > $XDG_CACHE_HOME/pic ; xwallpaper --zoom $XDG_CACHE_HOME/pic >/dev/null 2>&1 ;;
browser) setsid -f "$BROWSER" "$feed" >/dev/null 2>&1 ;;
lynx) lynx "$feed" >/dev/null 2>&1 ;;
diff --git a/.local/bin/dmenumount b/.local/bin/dmenumount
index 825ff56..abeb0ce 100755
--- a/.local/bin/dmenumount
+++ b/.local/bin/dmenumount
@@ -9,7 +9,7 @@ getmount() { \
[ -z "$chosen" ] && exit 1
# shellcheck disable=SC2086
mp="$(find $1 2>/dev/null | dmenu -i -p "Type in mount point.")" || exit 1
- [ "$mp" = "" ] && exit 1
+ test -z "$mp" && exit 1
if [ ! -d "$mp" ]; then
mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") || exit 1
[ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp")
@@ -50,11 +50,7 @@ asktype() { \
}
anddrives=$(simple-mtpfs -l 2>/dev/null)
-# Get all block devices which are parents of other devices
-parentnames="$(lsblk -rpo "pkname" | awk 'NR!=1 && $0 != ""' | uniq | xargs printf '^%s$|' | sed 's/|$//')"
-# Get all `part` and `rom` devices, which aren't a parent to another device
-# This allows ommiting partitions which have i.e. crypt or lvm childs
-usbdrives="$(lsblk -rpo "name,type,size,mountpoint" | awk -v parentnames="$parentnames" '$2 ~ "part|rom" && $4=="" && $1 !~ parentnames {printf "%s (%s)\n",$1,$3}')"
+usbdrives="$(lsblk -rpo "name,type,size,label,mountpoint,fstype" | grep -v crypto_LUKS | grep 'part\|rom' | sed 's/ /:/g' | awk -F':' '$5==""{printf "%s (%s) %s\n",$1,$3,$4}')"
if [ -z "$usbdrives" ]; then
[ -z "$anddrives" ] && echo "No USB drive or Android device detected" && exit
diff --git a/.local/bin/dmenurecord b/.local/bin/dmenurecord
index b1a034a..b83a7c5 100755
--- a/.local/bin/dmenurecord
+++ b/.local/bin/dmenurecord
@@ -31,7 +31,7 @@ screencast() { \
ffmpeg -y \
-f x11grab \
-framerate 60 \
- -s "$(xdpyinfo | grep dimensions | awk '{print $2;}')" \
+ -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \
-i "$DISPLAY" \
-f alsa -i default \
-r 30 \
@@ -43,7 +43,7 @@ screencast() { \
video() { ffmpeg \
-f x11grab \
- -s "$(xdpyinfo | grep dimensions | awk '{print $2;}')" \
+ -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \
-i "$DISPLAY" \
-c:v libx264 -qp 0 -r 30 \
"$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
diff --git a/.local/bin/dmenuumount b/.local/bin/dmenuumount
index 26612ef..946d12c 100755
--- a/.local/bin/dmenuumount
+++ b/.local/bin/dmenuumount
@@ -26,7 +26,7 @@ asktype() { \
esac
}
-drives=$(lsblk -nrpo "name,type,size,mountpoint" | awk '$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}')
+drives=$(lsblk -nrpo "name,type,size,mountpoint,label" | awk -F':' '{gsub(/ /,":")}$4!~/\/boot|\/efi|\/home$|SWAP/&&length($4)>1{printf "%s (%s) %s\n",$4,$3,$5}')
if ! grep simple-mtpfs /etc/mtab; then
[ -z "$drives" ] && echo "No drives to unmount." && exit
diff --git a/.local/bin/ext b/.local/bin/ext
deleted file mode 100755
index 927fb5b..0000000
--- a/.local/bin/ext
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/sh
-
-# A general, all-purpose extraction script. Not all extraction programs here
-# are installed by LARBS automatically.
-#
-# Default behavior: Extract archive into new directory
-# Behavior with `-c` option: Extract contents into current directory
-
-while getopts "hc" o; do case "${o}" in
- c) extracthere="True" ;;
- *) printf "Options:\\n -c: Extract archive into current directory rather than a new one.\\n" && exit 1 ;;
-esac done
-
-if [ -z "$extracthere" ]; then
- archive="$(readlink -f "$*")" &&
- directory="$(echo "$archive" | sed 's/\.[^\/.]*$//')" &&
- mkdir -p "$directory" &&
- cd "$directory" || exit 1
-else
- archive="$(readlink -f "$(echo "$*" | cut -d' ' -f2)" 2>/dev/null)"
-fi
-
-[ -z "$archive" ] && printf "Give archive to extract as argument.\\n" && exit 1
-
-if [ -f "$archive" ] ; then
- case "$archive" in
- *.tar.bz2|*.tbz2) tar xvjf "$archive" ;;
- *.tar.xz) tar -xf "$archive" ;;
- *.tar.gz|*.tgz) tar xvzf "$archive" ;;
- *.tar.zst) tar -I zstd -xf "$archive" ;;
- *.lzma) unlzma "$archive" ;;
- *.bz2) bunzip2 "$archive" ;;
- *.rar) unrar x -ad "$archive" ;;
- *.gz) gunzip "$archive" ;;
- *.tar) tar xvf "$archive" ;;
- *.zip) unzip "$archive" ;;
- *.Z) uncompress "$archive" ;;
- *.7z) 7z x "$archive" ;;
- *.xz) unxz "$archive" ;;
- *.exe) cabextract "$archive" ;;
- *) printf "extract: '%s' - unknown archive method\\n" "$archive" ;;
- esac
-else
- printf "File \"%s\" not found.\\n" "$archive"
-fi
diff --git a/.local/bin/getbib b/.local/bin/getbib
index ed441c5..8675aae 100755
--- a/.local/bin/getbib
+++ b/.local/bin/getbib
@@ -11,4 +11,4 @@ else
fi
# Check crossref.org for the bib citation.
-curl -s "http://api.crossref.org/works/$doi/transform/application/x-bibtex" -w "\\n"
+curl -s "https://api.crossref.org/works/$doi/transform/application/x-bibtex" -w "\\n"
diff --git a/.local/bin/ifinstalled b/.local/bin/ifinstalled
index be3ac24..c192eba 100755
--- a/.local/bin/ifinstalled
+++ b/.local/bin/ifinstalled
@@ -5,7 +5,8 @@
# it informs the user that they need that command to continue. This is used in
# various other scripts for clarity's sake.
-for x in "$@";do
- pacman -Qq "$x" >/dev/null 2>&1 ||
- { notify-send "πŸ“¦ $x" "must be installed for this function." && exit 1 ;}
+for x in "$@"; do
+ if ! which "$x" >/dev/null 2>&1 && ! pacman -Qq "$x" >/dev/null 2>&1; then
+ notify-send "πŸ“¦ $x" "must be installed for this function." && exit 1 ;
+ fi
done
diff --git a/.local/bin/lf-select b/.local/bin/lf-select
deleted file mode 100755
index 3b2a17a..0000000
--- a/.local/bin/lf-select
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-
-# Reads file names from stdin and selects them in lf.
-
-while read -r file; do
- [ -z "$file" ] && continue
- lf -remote "send select \"$file\""
- lf -remote "send toggle"
-done
diff --git a/.local/bin/lfub b/.local/bin/lfub
new file mode 100755
index 0000000..9012f50
--- /dev/null
+++ b/.local/bin/lfub
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+# This is a wrapper script for lb that allows it to create image previews with
+# ueberzug. This works in concert with the lf configuration file and the
+# lf-cleaner script.
+
+set -e
+
+cleanup() {
+ exec 3>&-
+ rm "$FIFO_UEBERZUG"
+}
+
+if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
+ lf "$@"
+else
+ [ ! -d "$HOME/.cache/lf" ] && mkdir -p "$HOME/.cache/lf"
+ export FIFO_UEBERZUG="$HOME/.cache/lf/ueberzug-$$"
+ mkfifo "$FIFO_UEBERZUG"
+ ueberzug layer -s <"$FIFO_UEBERZUG" -p json &
+ exec 3>"$FIFO_UEBERZUG"
+ trap cleanup HUP INT QUIT TERM PWR EXIT
+ lf "$@" 3>&-
+fi
diff --git a/.local/bin/linkhandler b/.local/bin/linkhandler
index 04934e5..cc971fc 100755
--- a/.local/bin/linkhandler
+++ b/.local/bin/linkhandler
@@ -6,18 +6,21 @@
# if a music file or pdf, it will download,
# otherwise it opens link in browser.
-# If no url given. Opens browser. For using script as $BROWSER.
-[ -z "$1" ] && { "$BROWSER"; exit; }
+if [ -z "$1" ]; then
+ url="$(xclip -o)"
+else
+ url="$1"
+fi
-case "$1" in
- *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*)
- setsid -f mpv -quiet "$1" >/dev/null 2>&1 ;;
+case "$url" in
+ *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*|*videos.lukesmith.xyz*|*odysee.com*)
+ setsid -f mpv -quiet "$url" >/dev/null 2>&1 ;;
*png|*jpg|*jpe|*jpeg|*gif)
- curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
+ curl -sL "$url" > "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
*pdf|*cbz|*cbr)
- curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
+ curl -sL "$url" > "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$url" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
*mp3|*flac|*opus|*mp3?source*)
- qndl "$1" 'curl -LO' >/dev/null 2>&1 ;;
+ qndl "$url" 'curl -LO' >/dev/null 2>&1 ;;
*)
- [ -f "$1" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$1" >/dev/null 2>&1 || setsid -f "$BROWSER" "$1" >/dev/null 2>&1
+ [ -f "$url" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$url" >/dev/null 2>&1 || setsid -f "$BROWSER" "$url" >/dev/null 2>&1
esac
diff --git a/.local/bin/maimpick b/.local/bin/maimpick
index 7125e61..8ea9f5e 100755
--- a/.local/bin/maimpick
+++ b/.local/bin/maimpick
@@ -4,11 +4,15 @@
# choose the kind of screenshot to take, including copying the image or even
# highlighting an area to copy. scrotcucks on suicidewatch right now.
+# variables
+output="$(date '+%y%m%d-%H%M-%S').png"
+xclip_cmd="xclip -sel clip -t image/png"
+
case "$(printf "a selected area\\ncurrent window\\nfull screen\\na selected area (copy)\\ncurrent window (copy)\\nfull screen (copy)" | dmenu -l 6 -i -p "Screenshot which area?")" in
- "a selected area") maim -s pic-selected-"$(date '+%y%m%d-%H%M-%S').png" ;;
- "current window") maim -i "$(xdotool getactivewindow)" pic-window-"$(date '+%y%m%d-%H%M-%S').png" ;;
- "full screen") maim pic-full-"$(date '+%y%m%d-%H%M-%S').png" ;;
- "a selected area (copy)") maim -s | xclip -selection clipboard -t image/png ;;
- "current window (copy)") maim -i "$(xdotool getactivewindow)" | xclip -selection clipboard -t image/png ;;
- "full screen (copy)") maim | xclip -selection clipboard -t image/png ;;
+ "a selected area") maim -s pic-selected-"${output}" ;;
+ "current window") maim -q -d 0.2 -i "$(xdotool getactivewindow)" pic-window-"${output}" ;;
+ "full screen") maim -q -d 0.2 pic-full-"${output}" ;;
+ "a selected area (copy)") maim -s | ${xclip_cmd} ;;
+ "current window (copy)") maim -q -d 0.2 -i "$(xdotool getactivewindow)" | ${xclip_cmd} ;;
+ "full screen (copy)") maim -q -d 0.2 | ${xclip_cmd} ;;
esac
diff --git a/.local/bin/noisereduce b/.local/bin/noisereduce
index 8d9598c..c344760 100644..100755
--- a/.local/bin/noisereduce
+++ b/.local/bin/noisereduce
@@ -7,8 +7,8 @@ usage ()
}
# Tests for requirements
-ffmpeg -version >/dev/null || { echo >&2 "We require 'ffmpeg' but it's not installed. Install it by 'sudo apt-get install ffmpeg' Aborting."; exit 1; }
-sox --version >/dev/null || { echo >&2 "We require 'sox' but it's not installed. Install it by 'sudo apt-get install sox' Aborting."; exit 1; }
+ifinstalled ffmpeg || { echo >&2 "We require 'ffmpeg' but it's not installed."; exit 1; }
+ifinstalled sox || { echo >&2 "We require 'ffmpeg' but it's not installed."; exit 1; }
if [ "$#" -ne 2 ]
then
@@ -50,7 +50,7 @@ if [ -z "$sampleStart" ] ; then sampleStart="00:00:00"; fi
printf "Sample noise end time [00:00:00.900]: "
read -r sampleEnd
if [ -z "$sampleEnd" ] ; then sampleEnd="00:00:00.900"; fi
-printf "Noise reduction amount [0.21]: "
+printf "Noise reduction amount [0.21]: "
read -r sensitivity
if [ -z "$sensitivity" ] ; then sensitivity="0.21"; fi
diff --git a/.local/bin/opout b/.local/bin/opout
index 7f452df..faf6575 100755
--- a/.local/bin/opout
+++ b/.local/bin/opout
@@ -4,7 +4,7 @@
# usually the pdf of a compiled document. I find this useful especially
# running from vim.
-basename="$(echo "${*}" | sed 's/\.[^\/.]*$//')"
+basename="${1%.*}"
case "${*}" in
*.tex|*.m[dse]|*.[rR]md|*.mom|*.[0-9]) setsid -f xdg-open "$basename".pdf >/dev/null 2>&1 ;;
diff --git a/.local/bin/otp b/.local/bin/otp
new file mode 100755
index 0000000..1726b1a
--- /dev/null
+++ b/.local/bin/otp
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# Get a one-time password, or add a OTP secret to your pass-otp store.
+
+# The assumption of this script is that all otp passwords are stored with the
+# suffix `-otp`. This script automatically appends newly added otps as such.
+
+# For OTP passwords to be generated properly, it is important for the local
+# computer to have its time properly synced. This can be done with the command
+# below which requires the package `ntp`.
+
+ifinstalled pass pass-otp
+
+dir="${PASSWORD_STORE_DIR}"
+
+choice="$({ echo "πŸ†•add" ; echo "πŸ•™sync-time" ; ls ${dir}/*-otp.gpg ;} | sed "s/.*\///;s/-otp.gpg//" | dmenu -p "Pick a 2FA:")"
+
+case $choice in
+ πŸ†•add )
+ ifinstalled maim zbar xclip || exit 1
+
+ temp="$dir/temp.png"
+ otp="otp-test-script"
+ trap 'shred -fu $temp; pass rm $otp' HUP INT QUIT TERM PWR EXIT
+
+ notify-send "Scan the image." "Scan the OTP QR code."
+
+ maim -s "$temp" || exit 1
+ info="$(zbarimg -q "$temp")"
+ info="${info#QR-Code:}"
+ issuer="$(echo "$info" | grep -o "issuer=[A-z0-9]\+")"
+ name="${issuer#issuer=}"
+
+ if echo "$info" | pass otp insert "$otp"; then
+ while true ; do
+ export name="$(dmenu -p "Give this One Time Password a one-word name:")"
+ echo "$name" | grep -q -- "^[A-z0-9-]\+$" && break
+ done
+ pass mv "$otp" "$name-otp"
+ notify-send "Successfully added." "$name-otp has been created."
+ else
+ notify-send "No OTP data found." "Try to scan the image again more precisely."
+ fi
+
+ ;;
+ πŸ•™sync-time )
+ ifinstalled ntp || exit 1
+ notify-send -u low "πŸ•™ Synchronizing Time..." "Synching time with remote NTP servers..."
+ updatedata="$(sudo ntpdate pool.ntp.org)" &&
+ notify-send -u low "πŸ•™ Synchronizing Time..." "Done. Time changed by ${updatedata#*offset }"
+ ;;
+ *) pass otp -c ${choice}-otp ;;
+esac
diff --git a/.local/bin/peertubetorrent b/.local/bin/peertubetorrent
index 56f2476..4d8f630 100755
--- a/.local/bin/peertubetorrent
+++ b/.local/bin/peertubetorrent
@@ -1,7 +1,9 @@
#!/bin/sh
# torrent peertube videos, requires the transadd script
-# first argument is the video link, second is the quality (480 or 1080)
+# first argument is the video link, second is the quality (360, 480 or 1080)
# 13/07/20 - Arthur Bais
-link="$(echo "$1" | sed "s/videos\/watch/download\/torrents/")""-$2.torrent"
+instance=$(echo "$1" | sed "s|/w.\+||")
+vidid=$(echo "$1" | sed "s|.\+/||")
+link=$(curl -s "$instance/api/v1/videos/$vidid" | grep -o "$instance/download/torrents/.\{37\}$2.torrent")
transadd "$link"
diff --git a/.local/bin/qndl b/.local/bin/qndl
index f6fbe87..48bc61e 100755
--- a/.local/bin/qndl
+++ b/.local/bin/qndl
@@ -5,7 +5,7 @@
base="$(basename "$1")"
notify-send "⏳ Queuing $base..."
cmd="$2"
-[ -z "$cmd" ] && cmd="youtube-dl --add-metadata -ic"
+[ -z "$cmd" ] && cmd="yt-dlp --embed-metadata -ic"
idnum="$(tsp $cmd "$1")"
realname="$(echo "$base" | sed "s/?\(source\|dest\).*//;s/%20/ /g")"
tsp -D "$idnum" mv "$base" "$realname"
diff --git a/.local/bin/queueandnotify b/.local/bin/queueandnotify
index a54b13e..1c3025c 100755
--- a/.local/bin/queueandnotify
+++ b/.local/bin/queueandnotify
@@ -2,12 +2,12 @@
# Podboat sucks. This script replaces it.
# It reads the newsboat queue, queuing downloads with taskspooler.
-# It also removes the junk from extentions.
+# It also removes the junk from extensions.
queuefile="${XDG_DATA_HOME:-$HOME/.local/share}/newsboat/queue"
while read -r line; do
[ -z "$line" ] && continue
- url="$(echo "$line" | awk '{print $1}')"
+ url="${line%%[ ]*}"
qndl "$url" "curl -LO"
done < "$queuefile"
diff --git a/.local/bin/remaps b/.local/bin/remaps
index 3cb41e4..c95ac84 100755
--- a/.local/bin/remaps
+++ b/.local/bin/remaps
@@ -1,13 +1,11 @@
#!/bin/sh
# This script is called on startup to remap keys.
-# Increase key speed via a rate change
+# Decrease key repeat delay to 300ms and increase key repeat rate to 50 per second.
xset r rate 300 50
-# Map the caps lock key to super...
-setxkbmap -option caps:super
-# But when it is pressed only once, treat it as escape.
+# Map the caps lock key to super, and map the menu key to right super.
+setxkbmap -option caps:super,altwin:menu_win
+# When caps lock is pressed only once, treat it as escape.
killall xcape 2>/dev/null ; xcape -e 'Super_L=Escape'
-# Map the menu button to right super as well.
-xmodmap -e 'keycode 135 = Super_R'
-# Turn off the caps lock if on since there is no longer a key for it.
+# Turn off caps lock if on since there is no longer a key for it.
xset -q | grep "Caps Lock:\s*on" && xdotool key Caps_Lock
diff --git a/.local/bin/samedir b/.local/bin/samedir
index 73facfd..371ec64 100755
--- a/.local/bin/samedir
+++ b/.local/bin/samedir
@@ -2,7 +2,9 @@
# Open a terminal window in the same directory as the currently active window.
-PID=$(xprop -id "$(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}')" | grep -m 1 PID | cut -d " " -f 3)
-PID="$(pstree -lpA "$PID" | tail -n 1 | awk -F'---' '{print $NF}' | sed -re 's/[^0-9]//g')"
+PID=$(xprop -id "$(xprop -root | xprop -root | sed -n "/_NET_ACTIVE_WINDOW/ s/^.*# // p")" | sed -n "/PID/ s/^.*= // p")
+PID="$(pstree -lpA "$PID")"
+PID="${PID##*"${SHELL##*/}"(}"
+PID="${PID%%)*}"
cd "$(readlink /proc/"$PID"/cwd)" || return 1
"$TERMINAL"
diff --git a/.local/bin/setbg b/.local/bin/setbg
index 8112bcd..2829896 100755
--- a/.local/bin/setbg
+++ b/.local/bin/setbg
@@ -7,7 +7,11 @@
# If wal is installed, also generates a colorscheme.
# Location of link to wallpaper link.
-bgloc="${XDG_DATA_HOME:-$HOME/.local/share/}/bg"
+bgloc="${XDG_DATA_HOME:-$HOME/.local/share}/bg"
+
+# Configuration files of applications that have their themes changed by pywal.
+dunstconf="${XDG_CONFIG_HOME:-$HOME/.config}/dunst/dunstrc"
+zathuraconf="${XDG_CONFIG_HOME:-$HOME/.config}/zathura/zathurarc"
trueloc="$(readlink -f "$1")" &&
case "$(file --mime-type -b "$trueloc")" in
@@ -17,8 +21,13 @@ case "$(file --mime-type -b "$trueloc")" in
esac
# If pywal is installed, use it.
-command -v wal >/dev/null 2>&1 &&
- wal -i "$trueloc" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 &&
+if command -v wal >/dev/null 2>&1 ; then
+ wal -i "$(readlink -f $bgloc)" -o "${XDG_CONFIG_HOME:-$HOME/.config}/wal/postrun" >/dev/null 2>&1 &&
pidof dwm >/dev/null && xdotool key super+F12
+# If pywal is removed, return config files to normal.
+else
+ [ -f "$dunstconf.bak" ] && unlink "$dunstconf" && mv "$dunstconf.bak" "$dunstconf"
+ [ -f "$zathuraconf.bak" ] && unlink "$zathuraconf" && mv "$zathuraconf.bak" "$zathuraconf"
+fi
xwallpaper --zoom "$bgloc"
diff --git a/.local/bin/shortcuts b/.local/bin/shortcuts
index 5497345..8fecea2 100755
--- a/.local/bin/shortcuts
+++ b/.local/bin/shortcuts
@@ -7,13 +7,14 @@ bmfiles="${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-files"
shell_shortcuts="${XDG_CONFIG_HOME:-$HOME/.config}/shell/shortcutrc"
zsh_named_dirs="${XDG_CONFIG_HOME:-$HOME/.config}/shell/zshnameddirrc"
lf_shortcuts="${XDG_CONFIG_HOME:-$HOME/.config}/lf/shortcutrc"
+vim_shortcuts="${XDG_CONFIG_HOME:-$HOME/.config}/nvim/shortcuts.vim"
ranger_shortcuts="/dev/null"
qute_shortcuts="/dev/null"
fish_shortcuts="/dev/null"
vifm_shortcuts="/dev/null"
# Remove, prepare files
-rm -f "$lf_shortcuts" "$ranger_shortcuts" "$qute_shortcuts" "$zsh_named_dirs" 2>/dev/null
+rm -f "$lf_shortcuts" "$ranger_shortcuts" "$qute_shortcuts" "$zsh_named_dirs" "$vim_shortcuts" 2>/dev/null
printf "# vim: filetype=sh\\n" > "$fish_shortcuts"
printf "# vim: filetype=sh\\nalias " > "$shell_shortcuts"
printf "\" vim: filetype=vim\\n" > "$vifm_shortcuts"
@@ -21,20 +22,22 @@ printf "\" vim: filetype=vim\\n" > "$vifm_shortcuts"
# Format the `directories` file in the correct syntax and sent it to all three configs.
eval "echo \"$(cat "$bmdirs")\"" | \
awk "!/^\s*#/ && !/^\s*\$/ {gsub(\"\\\s*#.*$\",\"\");
- printf(\"%s=\42cd %s && ls -a\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ;
- printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ;
- printf(\"abbr %s \42cd %s; and ls -a\42\n\",\$1,\$2) >> \"$fish_shortcuts\" ;
- printf(\"map g%s :cd %s<CR>\nmap t%s <tab>:cd %s<CR><tab>\nmap M%s <tab>:cd %s<CR><tab>:mo<CR>\nmap Y%s <tab>:cd %s<CR><tab>:co<CR> \n\",\$1,\$2, \$1, \$2, \$1, \$2, \$1, \$2) >> \"$vifm_shortcuts\" ;
- printf(\"config.bind(';%s', \42set downloads.location.directory %s ;; hint links download\42) \n\",\$1,\$2) >> \"$qute_shortcuts\" ;
- printf(\"map g%s cd %s\nmap t%s tab_new %s\nmap m%s shell mv -v %%s %s\nmap Y%s shell cp -rv %%s %s \n\",\$1,\$2,\$1,\$2, \$1, \$2, \$1, \$2) >> \"$ranger_shortcuts\" ;
- printf(\"map C%s cd \42%s\42 \n\",\$1,\$2) >> \"$lf_shortcuts\" }"
+ printf(\"%s=\42cd %s && ls -a\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ;
+ printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ;
+ printf(\"abbr %s \42cd %s; and ls -a\42\n\",\$1,\$2) >> \"$fish_shortcuts\" ;
+ printf(\"map g%s :cd %s<CR>\nmap t%s <tab>:cd %s<CR><tab>\nmap M%s <tab>:cd %s<CR><tab>:mo<CR>\nmap Y%s <tab>:cd %s<CR><tab>:co<CR> \n\",\$1,\$2, \$1, \$2, \$1, \$2, \$1, \$2) >> \"$vifm_shortcuts\" ;
+ printf(\"config.bind(';%s', \42set downloads.location.directory %s ;; hint links download\42) \n\",\$1,\$2) >> \"$qute_shortcuts\" ;
+ printf(\"map g%s cd %s\nmap t%s tab_new %s\nmap m%s shell mv -v %%s %s\nmap Y%s shell cp -rv %%s %s \n\",\$1,\$2,\$1,\$2, \$1, \$2, \$1, \$2) >> \"$ranger_shortcuts\" ;
+ printf(\"map C%s cd \42%s\42 \n\",\$1,\$2) >> \"$lf_shortcuts\" ;
+ printf(\"cmap ;%s %s\n\",\$1,\$2) >> \"$vim_shortcuts\" }"
# Format the `files` file in the correct syntax and sent it to both configs.
eval "echo \"$(cat "$bmfiles")\"" | \
awk "!/^\s*#/ && !/^\s*\$/ {gsub(\"\\\s*#.*$\",\"\");
- printf(\"%s=\42\$EDITOR %s\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ;
- printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ;
+ printf(\"%s=\42\$EDITOR %s\42 \\\\\n\",\$1,\$2) >> \"$shell_shortcuts\" ;
+ printf(\"hash -d %s=%s \n\",\$1,\$2) >> \"$zsh_named_dirs\" ;
printf(\"abbr %s \42\$EDITOR %s\42 \n\",\$1,\$2) >> \"$fish_shortcuts\" ;
printf(\"map %s :e %s<CR> \n\",\$1,\$2) >> \"$vifm_shortcuts\" ;
printf(\"map %s shell \$EDITOR %s \n\",\$1,\$2) >> \"$ranger_shortcuts\" ;
- printf(\"map E%s \$\$EDITOR \42%s\42 \n\",\$1,\$2) >> \"$lf_shortcuts\" }"
+ printf(\"map E%s \$\$EDITOR \42%s\42 \n\",\$1,\$2) >> \"$lf_shortcuts\" ;
+ printf(\"cmap ;%s %s\n\",\$1,\$2) >> \"$vim_shortcuts\" }"
diff --git a/.local/bin/statusbar/sb-battery b/.local/bin/statusbar/sb-battery
index 382b31b..93cbe08 100755
--- a/.local/bin/statusbar/sb-battery
+++ b/.local/bin/statusbar/sb-battery
@@ -21,16 +21,17 @@ for battery in /sys/class/power_supply/BAT?*; do
# If non-first battery, print a space separator.
[ -n "${capacity+x}" ] && printf " "
# Sets up the status and capacity
- case "$(cat "$battery/status")" in
+ case "$(cat "$battery/status" 2>&1)" in
"Full") status="⚑" ;;
"Discharging") status="πŸ”‹" ;;
"Charging") status="πŸ”Œ" ;;
"Not charging") status="πŸ›‘" ;;
"Unknown") status="♻️" ;;
+ *) exit 1 ;;
esac
- capacity=$(cat "$battery/capacity")
+ capacity="$(cat "$battery/capacity" 2>&1)"
# Will make a warn variable if discharging and low
[ "$status" = "πŸ”‹" ] && [ "$capacity" -le 25 ] && warn="❗"
# Prints the info
printf "%s%s%d%%" "$status" "$warn" "$capacity"; unset warn
-done && exit 0
+done && printf "\\n"
diff --git a/.local/bin/statusbar/sb-clock b/.local/bin/statusbar/sb-clock
index d25e8d0..e1ca8c7 100755
--- a/.local/bin/statusbar/sb-clock
+++ b/.local/bin/statusbar/sb-clock
@@ -19,7 +19,7 @@ case "$clock" in
esac
case $BLOCK_BUTTON in
- 1) notify-send "This Month" "$(cal --color=always | sed "s/..7m/<b><span color=\"red\">/;s/..27m/<\/span><\/b>/")" && notify-send "Appointments" "$(calcurse -d3)" ;;
+ 1) notify-send "This Month" "$(cal --color=always | sed "s/..7m/<b><span color=\"red\">/;s|..27m|</span></b>|")" && notify-send "Appointments" "$(calcurse -d3)" ;;
2) setsid -f "$TERMINAL" -e calcurse ;;
3) notify-send "πŸ“… Time/date module" "\- Left click to show upcoming appointments for the next three days via \`calcurse -d3\` and show the month via \`cal\`
- Middle click opens calcurse if installed" ;;
diff --git a/.local/bin/statusbar/sb-doppler b/.local/bin/statusbar/sb-doppler
index dc93db0..dabf18b 100755
--- a/.local/bin/statusbar/sb-doppler
+++ b/.local/bin/statusbar/sb-doppler
@@ -1,194 +1,248 @@
#!/bin/sh
-# Show a Doppler RADAR of an American user's preferred location.
+# Show a Doppler RADAR of a user's preferred location.
secs=600 # Download a new doppler radar if one hasn't been downloaded in $secs seconds.
radarloc="${XDG_CACHE_HOME:-$HOME/.cache}/radar"
doppler="${XDG_CACHE_HOME:-$HOME/.cache}/doppler.gif"
-pickloc() { chosen="$(echo "Northeast
-Southeast
-PacNorthWest
-PacSouthWest
-UpperMissVly
-SouthMissVly
-SouthPlains
-NorthRockies
-SouthRockies
-Alaska
-Carib
-Hawaii
-CentGrLakes
-Conus-Large
-KABR: Aberdeen, SD
-KBIS: Bismarck, ND
-KFTG: Denver/Boulder, CO
-KDMX: Des Moines, IA
-KDTX: Detroit, MI
-KDDC: Dodge City, KS
-KDLH: Duluth, MN
-KCYS: Cheyenne, WY
-KLOT: Chicago, IL
-KGLD: Goodland, KS
-KUEX: Hastings, NE
-KGJX: Grand Junction, CO
-KGRR: Grand Rapids, MI
-KMVX: Fargo/Grand Forks, ND
-KGRB: Green Bay, WI
-KIND: Indianapolis, IN
-KJKL: Jackson, KY
-KARX: La Crosse, WI
-KILX: Lincoln/Central Illinois, IL
-KLVX: Louisville, KY
-KMQT: Marquette
-KMKX: Milwaukee, WI
-KMPX: Minneapolis, MN
-KAPX: Gaylord/Alpena, MI
-KLNX: North Platte, NE
-KIWX: N. Webster/Northern, IN
-KOAX: Omaha, NE
-KPAH: Paducah, KY
-KEAX: Pleasant Hill, MO
-KPUX: Pueblo, CO
-KDVN: Quad Cities, IA
-KUDX: Rapid City, SD
-KRIW: Riverton, WY
-KSGF: Springfield, MO
-KLSX: St. LOUIS, MO
-KFSD: Sioux Falls, IA
-KTWX: Topeka, KS
-KICT: Wichita, KS
-KVWX: Paducah, KY
-ICAO: Responsible Wfo
-KLTX: WILMINGTON, NC
-KCCX: State College/Central, PA
-KLWX: Sterling, VA
-KFCX: Blacksburg/Roanoke, VA
-KRAX: Raleigh/Durham, NC
-KGYX: Portland, ME
-KDIX: Mt Holly/Philadelphia, PA
-KPBZ: Pittsburgh, PA
-KAKQ: Wakefield, VA
-KMHX: Morehead City, NC
-KGSP: Greer/Greenville/Sprtbg, SC
-KILN: Wilmington/Cincinnati, OH
-KCLE: Cleveland, OH
-KCAE: Columbia, SC
-KBGM: Binghamton, NY
-KENX: Albany, NY
-KBUF: Buffalo, NY
-KCXX: Burlington, VT
-KCBW: Caribou, ME
-KBOX: Boston /Taunton, MA
-KOKX: New York City, NY
-KCLX: Charleston, SC
-KRLX: Charleston, WV
-ICAO: Responsible WFO
-KBRO: Brownsville, TX
-KABX: Albuquerque, NM
-KAMA: Amarillo, TX
-KFFC: Peachtree City/Atlanta, GA
-KEWX: Austin/Sanantonio, TX
-KBMX: Birmingham, AL
-KCRP: Corpus Christi, TX
-KFWS: Dallas / Ft. Worth, TX
-KEPZ: El Paso, TX
-KHGX: Houston/ Galveston, TX
-KJAX: Jacksonville, FL
-KBYX: Key West, FL
-KMRX: Morristown/knoxville, TN
-KLBB: Lubbock, TX
-KLZK: Little Rock, AR
-KLCH: Lake Charles, LA
-KOHX: Nashville, TN
-KMLB: Melbourne, FL
-KNQA: Memphis, TN
-KAMX: Miami, FL
-KMAF: Midland/odessa, TX
-KTLX: Norman, OK
-KHTX: Huntsville, AL
-KMOB: Mobile, AL
-KTLH: Tallahassee, FL
-KTBW: Tampa Bay Area, FL
-KSJT: San Angelo, TX
-KINX: Tulsa, OK
-KSRX: Tulsa, OK
-KLIX: New Orleans/slidell, LA
-KDGX: Jackson, MS
-KSHV: Shreveport, LA
-ICAO: Responsible WFO
-KLGX: Seattle / Tacoma, WA
-KOTX: Spokane, WA
-KEMX: Tucson, AZ
-KYUX: Phoenix, AZ
-KNKX: San Diego, CA
-KMUX: Monterey/san Francisco, CA
-KHNX: San Joaquin/hanford, CA
-KSOX: San Diego, CA
-KATX: Seattle / Tacoma, WA
-KIWA: Phoenix, AZ
-KRTX: Portland, OR
-KSFX: Pocatello, ID
-KRGX: Reno, NV
-KDAX: Sacramento, CA
-KMTX: Salt Lake City, UT
-KPDT: Pendleton, OR
-KMSX: Missoula, MT
-KESX: Las Vegas, NV
-KVTX: Los Angeles, CA
-KMAX: Medford, OR
-KFSX: Flagstaff, AZ
-KGGW: Glasgow, MT
-KLRX: Elko, NV
-KBHX: Eureka, CA
-KTFX: Great Falls, MT
-KCBX: Boise, ID
-KBLX: Billings, MT
-KICX: Salt Lake City, UT
-ICAO: Responsible Wfo W/ MSCF
-PABC: Anchorage, AK
-PAPD: Fairbanks, AK
-PHKM: Honolulu, HI
-PAHG: Anchorage, AK
-PAKC: Anchorage, AK
-PAIH: Anchorage, AK
-PHMO: Honolulu, HI
-PAEC: Fairbanks, AK
-TJUA: San Juan, PR
-PACG: Juneau, AK
-PHKI: Honolulu, HI
-PHWA: Honolulu, HI
-ICAO: Responsible Wfo W/ MSCF
-KFDR: Norman, OK
-PGUA: Guam
-KBBX: Sacramento, CA
-KFDX: Albuquerque, NM
-KGWX: Jackson, MS
-KDOX: Wakefield, VA
-KDYX: San Angelo, TX
-KEYX: Las Vegas, NV
-KEVX: Mobile, AL
-KHPX: Paducah, KY
-KTYX: Burlington, VT
-KGRK: Dallas / Ft. Worth, TX
-KPOE: Lake Charles, LA
-KEOX: Tallahassee, FL
-KHDX: El Paso, TX
-KDFX: San Antonio, TX
-KMXX: Birmingham, AL
-KMBX: Bismarck, ND
-KVAX: Jacksonville, FL
-KJGX: Peachtree City/atlanta, GA
-KVNX: Norman, OK
-KVBX: Vandenberg Afb: Orcutt, CA" | dmenu -r -i -l 50 -p "Select a National Weather Service radar to use as default:" | sed "s/:.*//" | tr "[:lower:]" "[:upper:]")"
+pickloc() { chosen="$(echo "US: Northeast
+US: Southeast
+US: PacNorthWest
+US: PacSouthWest
+US: UpperMissVly
+US: SouthMissVly
+US: SouthPlains
+US: NorthRockies
+US: SouthRockies
+US: Alaska
+US: Carib
+US: Hawaii
+US: CentGrLakes
+US: Conus-Large
+US: KABR: Aberdeen, SD
+US: KBIS: Bismarck, ND
+US: KFTG: Denver/Boulder, CO
+US: KDMX: Des Moines, IA
+US: KDTX: Detroit, MI
+US: KDDC: Dodge City, KS
+US: KDLH: Duluth, MN
+US: KCYS: Cheyenne, WY
+US: KLOT: Chicago, IL
+US: KGLD: Goodland, KS
+US: KUEX: Hastings, NE
+US: KGJX: Grand Junction, CO
+US: KGRR: Grand Rapids, MI
+US: KMVX: Fargo/Grand Forks, ND
+US: KGRB: Green Bay, WI
+US: KIND: Indianapolis, IN
+US: KJKL: Jackson, KY
+US: KARX: La Crosse, WI
+US: KILX: Lincoln/Central Illinois, IL
+US: KLVX: Louisville, KY
+US: KMQT: Marquette
+US: KMKX: Milwaukee, WI
+US: KMPX: Minneapolis, MN
+US: KAPX: Gaylord/Alpena, MI
+US: KLNX: North Platte, NE
+US: KIWX: N. Webster/Northern, IN
+US: KOAX: Omaha, NE
+US: KPAH: Paducah, KY
+US: KEAX: Pleasant Hill, MO
+US: KPUX: Pueblo, CO
+US: KDVN: Quad Cities, IA
+US: KUDX: Rapid City, SD
+US: KRIW: Riverton, WY
+US: KSGF: Springfield, MO
+US: KLSX: St. LOUIS, MO
+US: KFSD: Sioux Falls, IA
+US: KTWX: Topeka, KS
+US: KICT: Wichita, KS
+US: KVWX: Paducah, KY
+US: ICAO: Responsible Wfo
+US: KLTX: WILMINGTON, NC
+US: KCCX: State College/Central, PA
+US: KLWX: Sterling, VA
+US: KFCX: Blacksburg/Roanoke, VA
+US: KRAX: Raleigh/Durham, NC
+US: KGYX: Portland, ME
+US: KDIX: Mt Holly/Philadelphia, PA
+US: KPBZ: Pittsburgh, PA
+US: KAKQ: Wakefield, VA
+US: KMHX: Morehead City, NC
+US: KGSP: Greer/Greenville/Sprtbg, SC
+US: KILN: Wilmington/Cincinnati, OH
+US: KCLE: Cleveland, OH
+US: KCAE: Columbia, SC
+US: KBGM: Binghamton, NY
+US: KENX: Albany, NY
+US: KBUF: Buffalo, NY
+US: KCXX: Burlington, VT
+US: KCBW: Caribou, ME
+US: KBOX: Boston /Taunton, MA
+US: KOKX: New York City, NY
+US: KCLX: Charleston, SC
+US: KRLX: Charleston, WV
+US: ICAO: Responsible WFO
+US: KBRO: Brownsville, TX
+US: KABX: Albuquerque, NM
+US: KAMA: Amarillo, TX
+US: KFFC: Peachtree City/Atlanta, GA
+US: KEWX: Austin/Sanantonio, TX
+US: KBMX: Birmingham, AL
+US: KCRP: Corpus Christi, TX
+US: KFWS: Dallas / Ft. Worth, TX
+US: KEPZ: El Paso, TX
+US: KHGX: Houston/ Galveston, TX
+US: KJAX: Jacksonville, FL
+US: KBYX: Key West, FL
+US: KMRX: Morristown/knoxville, TN
+US: KLBB: Lubbock, TX
+US: KLZK: Little Rock, AR
+US: KLCH: Lake Charles, LA
+US: KOHX: Nashville, TN
+US: KMLB: Melbourne, FL
+US: KNQA: Memphis, TN
+US: KAMX: Miami, FL
+US: KMAF: Midland/odessa, TX
+US: KTLX: Norman, OK
+US: KHTX: Huntsville, AL
+US: KMOB: Mobile, AL
+US: KTLH: Tallahassee, FL
+US: KTBW: Tampa Bay Area, FL
+US: KSJT: San Angelo, TX
+US: KINX: Tulsa, OK
+US: KSRX: Tulsa, OK
+US: KLIX: New Orleans/slidell, LA
+US: KDGX: Jackson, MS
+US: KSHV: Shreveport, LA
+US: ICAO: Responsible WFO
+US: KLGX: Seattle / Tacoma, WA
+US: KOTX: Spokane, WA
+US: KEMX: Tucson, AZ
+US: KYUX: Phoenix, AZ
+US: KNKX: San Diego, CA
+US: KMUX: Monterey/san Francisco, CA
+US: KHNX: San Joaquin/hanford, CA
+US: KSOX: San Diego, CA
+US: KATX: Seattle / Tacoma, WA
+US: KIWA: Phoenix, AZ
+US: KRTX: Portland, OR
+US: KSFX: Pocatello, ID
+US: KRGX: Reno, NV
+US: KDAX: Sacramento, CA
+US: KMTX: Salt Lake City, UT
+US: KPDT: Pendleton, OR
+US: KMSX: Missoula, MT
+US: KESX: Las Vegas, NV
+US: KVTX: Los Angeles, CA
+US: KMAX: Medford, OR
+US: KFSX: Flagstaff, AZ
+US: KGGW: Glasgow, MT
+US: KLRX: Elko, NV
+US: KBHX: Eureka, CA
+US: KTFX: Great Falls, MT
+US: KCBX: Boise, ID
+US: KBLX: Billings, MT
+US: KICX: Salt Lake City, UT
+US: ICAO: Responsible Wfo W/ MSCF
+US: PABC: Anchorage, AK
+US: PAPD: Fairbanks, AK
+US: PHKM: Honolulu, HI
+US: PAHG: Anchorage, AK
+US: PAKC: Anchorage, AK
+US: PAIH: Anchorage, AK
+US: PHMO: Honolulu, HI
+US: PAEC: Fairbanks, AK
+US: TJUA: San Juan, PR
+US: PACG: Juneau, AK
+US: PHKI: Honolulu, HI
+US: PHWA: Honolulu, HI
+US: ICAO: Responsible Wfo W/ MSCF
+US: KFDR: Norman, OK
+US: PGUA: Guam
+US: KBBX: Sacramento, CA
+US: KFDX: Albuquerque, NM
+US: KGWX: Jackson, MS
+US: KDOX: Wakefield, VA
+US: KDYX: San Angelo, TX
+US: KEYX: Las Vegas, NV
+US: KEVX: Mobile, AL
+US: KHPX: Paducah, KY
+US: KTYX: Burlington, VT
+US: KGRK: Dallas / Ft. Worth, TX
+US: KPOE: Lake Charles, LA
+US: KEOX: Tallahassee, FL
+US: KHDX: El Paso, TX
+US: KDFX: San Antonio, TX
+US: KMXX: Birmingham, AL
+US: KMBX: Bismarck, ND
+US: KVAX: Jacksonville, FL
+US: KJGX: Peachtree City/atlanta, GA
+US: KVNX: Norman, OK
+US: KVBX: Vandenberg Afb: Orcutt, CA
+EU: Europe
+EU: GB: Great Brittain
+EU: SCAN: Scandinavia
+EU: ALPS: The Alps
+EU: NL: The Netherlands
+EU: DE: Germany
+EU: SP: Spain
+EU: FR: France
+EU: IT: Italy
+EU: PL: Poland
+EU: GR: Greece
+EU: TU: Turkey
+EU: RU: Russia
+EU: BA: Bahrain
+EU: BC: Botswana
+EU: SE: Republic of Seychelles
+EU: HU: Hungary
+EU: UK: Ukraine
+AF: AF: Africa
+AF: WA: West Africa
+AF: ZA: South Africa
+AF: DZ: Algeria
+AF: CE: Canary Islands
+AF: NG: Nigeria
+AF: TD: Chad
+AF: CG: Democratic Republic of Congo
+AF: EG: Egypt
+AF: ET: Ethiopia
+AF: CM: Cameroon
+AF: IS: Israel
+AF: LY: Libya
+AF: MG: Madagascar
+AF: MO: Morocco
+AF: BW: Namibia
+AF: SA: Saudi Arabia
+AF: SO: Somalia
+AF: SD: Sudan
+AF: TZ: Tanzania
+AF: TN: Tunisia
+AF: ZM: Zambia
+AF: KE: Kenya
+AF: AO: Angola" | dmenu -r -i -l 50 -p "Select a radar to use as default:" | tr "[:lower:]" "[:upper:]")"
+
+# Set continent code and radar code.
+continentcode=$(echo "$chosen" | sed "s/:.*//")
+radarcode=$(echo "$chosen" | sed "s/..: // ; s/:.*//")
# Sanity check of selection and ensure user did not escape.
-echo "$chosen" | grep -q "^[A-Z]\+$" && echo "$chosen" > "$radarloc" ;}
+echo "$radarcode" | grep -q "^[A-Z]\+$" && printf "%s,%s\\n" "$continentcode" "$radarcode" > "$radarloc" ;}
getdoppler() {
- loc="$(cat "$radarloc")"
+ cont="$(sed "s/,.*//" "$radarloc")"
+ loc="$(cut -c 4- "$radarloc")"
notify-send "🌦️ Doppler RADAR" "Pulling most recent Doppler RADAR for $loc."
- curl -sL "https://radar.weather.gov/ridge/lite/${loc}_loop.gif" > "$doppler" ;}
+ if [ "$cont" = "US" ] ; then
+ curl -sL "https://radar.weather.gov/ridge/lite/${loc}_loop.gif" > "$doppler" ;
+ elif [ "$cont" = "EU" ] ; then
+ curl -sL "https://api.sat24.com/animated/${loc}/rainTMC/2/" > "$doppler" ;
+ elif [ "$cont" = "AF" ] ; then
+ curl -sL "https://api.sat24.com/animated/${loc}/rain/2/" > "$doppler" ;
+ fi
+}
showdoppler() { setsid -f mpv --no-osc --loop=inf --no-terminal "$doppler" ;}
@@ -198,7 +252,7 @@ case $BLOCK_BUTTON in
showdoppler ;;
2) pickloc && getdoppler && showdoppler ;;
3) notify-send "πŸ—ΊοΈ Doppler RADAR module" "\- Left click for local Doppler RADAR.
-- Middle click to update change RADAR location.
+- Middle click to update RADAR location.
After $secs seconds, new clicks will also automatically update the doppler RADAR." ;;
6) "$TERMINAL" -e "$EDITOR" "$0" ;;
esac
diff --git a/.local/bin/statusbar/sb-internet b/.local/bin/statusbar/sb-internet
index ee1a160..94b7da2 100755
--- a/.local/bin/statusbar/sb-internet
+++ b/.local/bin/statusbar/sb-internet
@@ -7,6 +7,7 @@
case $BLOCK_BUTTON in
1) "$TERMINAL" -e nmtui; pkill -RTMIN+4 dwmblocks ;;
3) notify-send "🌐 Internet module" "\- Click to connect
+❌: wifi disabled
πŸ“‘: no wifi connection
πŸ“Ά: wifi connection with quality
❎: no ethernet
@@ -16,9 +17,10 @@ case $BLOCK_BUTTON in
6) "$TERMINAL" -e "$EDITOR" "$0" ;;
esac
-case "$(cat /sys/class/net/w*/operstate 2>/dev/null)" in
- down) wifiicon="πŸ“‘ " ;;
- up) wifiicon="$(awk '/^\s*w/ { print "πŸ“Ά", int($3 * 100 / 70) "% " }' /proc/net/wireless)" ;;
-esac
+if grep -xq 'up' /sys/class/net/w*/operstate 2>/dev/null ; then
+ wifiicon="$(awk '/^\s*w/ { print "πŸ“Ά", int($3 * 100 / 70) "% " }' /proc/net/wireless)"
+elif grep -xq 'down' /sys/class/net/w*/operstate 2>/dev/null ; then
+ grep -xq '0x1003' /sys/class/net/w*/flags && wifiicon="πŸ“‘ " || wifiicon="❌ "
+fi
printf "%s%s%s\n" "$wifiicon" "$(sed "s/down/❎/;s/up/🌐/" /sys/class/net/e*/operstate 2>/dev/null)" "$(sed "s/.*/πŸ”’/" /sys/class/net/tun*/operstate 2>/dev/null)"
diff --git a/.local/bin/statusbar/sb-mailbox b/.local/bin/statusbar/sb-mailbox
index 5a67428..2132184 100755
--- a/.local/bin/statusbar/sb-mailbox
+++ b/.local/bin/statusbar/sb-mailbox
@@ -5,7 +5,7 @@
case $BLOCK_BUTTON in
1) setsid -f "$TERMINAL" -e neomutt ;;
- 2) setsid -f mw sync >/dev/null ;;
+ 2) setsid -f mw -Y >/dev/null ;;
3) notify-send "πŸ“¬ Mail module" "\- Shows unread mail
- Shows πŸ”ƒ if syncing mail
- Left click opens neomutt
diff --git a/.local/bin/statusbar/sb-music b/.local/bin/statusbar/sb-music
index 7504313..7ea7032 100755
--- a/.local/bin/statusbar/sb-music
+++ b/.local/bin/statusbar/sb-music
@@ -1,6 +1,6 @@
#!/bin/sh
-filter() { mpc | sed "/^volume:/d;s/\\&/&amp;/g;s/\\[paused\\].*/⏸/g;/\\[playing\\].*/d" | paste -sd ' ' -;}
+filter() { mpc | sed "/^volume:/d;s/\\&/&amp;/g;s/\\[paused\\].*/⏸/g;/\\[playing\\].*/d;/^ERROR/Q" | paste -sd ' ' -;}
pidof -x sb-mpdup >/dev/null 2>&1 || sb-mpdup >/dev/null 2>&1 &
diff --git a/.local/bin/statusbar/sb-nettraf b/.local/bin/statusbar/sb-nettraf
index eb7a73b..178f677 100755
--- a/.local/bin/statusbar/sb-nettraf
+++ b/.local/bin/statusbar/sb-nettraf
@@ -17,7 +17,7 @@ update() {
read -r i < "$arg"
sum=$(( sum + i ))
done
- cache=${XDG_CACHE_HOME:-$HOME/.cache}/${1##*/}
+ cache=/tmp/${1##*/}
[ -f "$cache" ] && read -r old < "$cache" || old=0
printf %d\\n "$sum" > "$cache"
printf %d\\n $(( sum - old ))
@@ -26,4 +26,4 @@ update() {
rx=$(update /sys/class/net/[ew]*/statistics/rx_bytes)
tx=$(update /sys/class/net/[ew]*/statistics/tx_bytes)
-printf "πŸ”»%4sB πŸ”Ί%4sB\\n" $(numfmt --to=iec $rx) $(numfmt --to=iec $tx)
+printf "πŸ”»%4sB πŸ”Ί%4sB\\n" $(numfmt --to=iec $rx $tx)
diff --git a/.local/bin/statusbar/sb-price b/.local/bin/statusbar/sb-price
index 35b072f..42c84c1 100755
--- a/.local/bin/statusbar/sb-price
+++ b/.local/bin/statusbar/sb-price
@@ -1,19 +1,24 @@
#!/bin/sh
# Usage:
-# price <url> <Name of currency> <icon>
+# price <url> <Name of currency> <icon> <Price to show in>
# price bat "Basic Attention Token" 🦁
# When the name of the currency is multi-word, put it in quotes.
[ -z "$3" ] && exit 1
+
+# use $4 as currency, if not passed in use "usd" as default
+currency="${4:-usd}"
interval="@14d" # History contained in chart preceded by '@' (7d = 7 days)
dir="${XDG_DATA_HOME:-$HOME/.local/share}/crypto-prices"
-pricefile="$dir/$1"
-chartfile="$dir/$1-chart"
+pricefile="$dir/$1-$currency"
+chartfile="$dir/$1-$currency-chart"
-updateprice() { ping -q -c 1 example.org >/dev/null 2>&1 &&
- curl -s "rate.sx/1$1" > "$pricefile" &&
- curl -s "rate.sx/$1$interval" > "$chartfile" ;}
+updateprice() { temp="$(mktemp)"
+ curl -s "$currency.rate.sx/1$1" > "$temp" &&
+ mv -f "$temp" "$pricefile" &&
+ curl -s "$currency.rate.sx/$1$interval" > "$temp" &&
+ mv -f "$temp" "$chartfile" ;}
[ -d "$dir" ] || mkdir -p "$dir"
@@ -35,4 +40,11 @@ case $BLOCK_BUTTON in
6) "$TERMINAL" -e "$EDITOR" "$0" ;;
esac
-printf "$3$%0.2f" "$(cat "$pricefile")"
+case "$currency" in
+ usd) symb="$" ;;
+ gbp) symb="Β£" ;;
+ eur) symb="€" ;;
+ btc) symb="β‚Ώ" ;;
+esac
+
+printf "$3$symb%0.2f$after" "$(cat "$pricefile")"
diff --git a/.local/bin/statusbar/sb-volume b/.local/bin/statusbar/sb-volume
index 61588c3..3cfdc45 100755
--- a/.local/bin/statusbar/sb-volume
+++ b/.local/bin/statusbar/sb-volume
@@ -19,10 +19,12 @@ vol="$(pamixer --get-volume)"
if [ "$vol" -gt "70" ]; then
icon="πŸ”Š"
-elif [ "$vol" -lt "30" ]; then
+elif [ "$vol" -gt "30" ]; then
+ icon="πŸ”‰"
+elif [ "$vol" -gt "0" ]; then
icon="πŸ”ˆ"
else
- icon="πŸ”‰"
+ echo πŸ”‡ && exit
fi
echo "$icon$vol%"
diff --git a/.local/bin/sysact b/.local/bin/sysact
index 5e3acf5..64c2f32 100755
--- a/.local/bin/sysact
+++ b/.local/bin/sysact
@@ -1,22 +1,26 @@
#!/bin/sh
# A dmenu wrapper script for system functions.
-
-# For non-systemd init systems.
+export WM="dwm"
case "$(readlink -f /sbin/init)" in
- *runit*) hib="sudo -A zzz" ;;
- *openrc*) reb="sudo -A openrc-shutdown -r"; shut="sudo -A openrc-shutdown -p 0" ;;
+ *systemd*) ctl='systemctl' ;;
+ *) ctl='loginctl' ;;
esac
-cmds="\
-πŸ”’ lock slock
-πŸšͺ leave dwm kill -TERM $(pgrep -u $USER "\bdwm$")
-β™» renew dwm kill -HUP $(pgrep -u $USER "\bdwm$")
-🐻 hibernate slock ${hib:-systemctl suspend-then-hibernate -i}
-πŸ”ƒ reboot ${reb:-sudo -A reboot}
-πŸ–₯ shutdown ${shut:-sudo -A shutdown -h now}
-πŸ“Ί display off xset dpms force off"
-
-choice="$(echo "$cmds" | cut -d' ' -f 1 | dmenu)" || exit 1
+wmpid(){ # This function is needed if there are multiple instances of the window manager.
+ tree="$(pstree -ps $$)"
+ tree="${tree#*$WM(}"
+ echo "${tree%%)*}"
+}
-`echo "$cmds" | grep "^$choice " | cut -d ' ' -f2-`
+case "$(printf "πŸ”’ lock\nπŸšͺ leave $WM\n♻️ renew $WM\n🐻 hibernate\nπŸ”ƒ reboot\nπŸ–₯️shutdown\nπŸ’€ sleep\nπŸ“Ί display off" | dmenu -i -p 'Action: ')" in
+ 'πŸ”’ lock') slock ;;
+ "πŸšͺ leave $WM") kill -TERM "$(wmpid)" ;;
+ "♻️ renew $WM") kill -HUP "$(wmpid)" ;;
+ '🐻 hibernate') slock $ctl hibernate -i ;;
+ 'πŸ’€ sleep') slock $ctl suspend -i ;;
+ 'πŸ”ƒ reboot') $ctl reboot -i ;;
+ 'πŸ–₯️shutdown') $ctl poweroff -i ;;
+ 'πŸ“Ί display off') xset dpms force off ;;
+ *) exit 1 ;;
+esac
diff --git a/.local/bin/torwrap b/.local/bin/torwrap
index 4f94053..8b20ad4 100755
--- a/.local/bin/torwrap
+++ b/.local/bin/torwrap
@@ -1,6 +1,6 @@
#!/bin/sh
-ifinstalled tremc-git transmission-cli || exit
+ifinstalled tremc transmission-cli || exit
! pidof transmission-daemon >/dev/null && transmission-daemon && notify-send "Starting torrent daemon..."
diff --git a/.local/bin/tutorialvids b/.local/bin/tutorialvids
index 4a35db9..6d4914b 100755
--- a/.local/bin/tutorialvids
+++ b/.local/bin/tutorialvids
@@ -5,22 +5,22 @@
# add/remove videos from this list as I go on.
vidlist="
-dwm (window manager) https://www.youtube.com/watch?v=xnREqY-oyzM
-pacman (installing/managing programs) https://www.youtube.com/watch?v=-dEuXTMzRKs
-status bar https://www.youtube.com/watch?v=UP2QpHmcgyk
-sxiv (image viewer) https://www.youtube.com/watch?v=GYW9i_u5PYs
-st (terminal) https://www.youtube.com/watch?v=9H75enWM22k
-i3 (old window manager) https://www.youtube.com/watch?v=GKviflL9XeI
-neomutt (email) https://www.youtube.com/watch?v=2U3vRbF7v5A
-ncmpcpp (music player) https://www.youtube.com/watch?v=sZIEdI9TS2U
-newsboat (RSS reader) https://www.youtube.com/watch?v=dUFCRqs822w
-ranger (file manager) https://www.youtube.com/watch?v=L6Vu7WPkoJo
-zathura (pdf viewer) https://www.youtube.com/watch?v=V_Iz4zdyRM4
-gpg keys https://www.youtube.com/watch?v=DMGIlj7u7Eo
-calcurse (calendar) https://www.youtube.com/watch?v=hvc-pHjbhdE
-urlview https://www.youtube.com/watch?v=IgzpAjFgbCw
-colorschemes with pywal https://www.youtube.com/watch?v=Es79N_9BblE
-vi mode in shell https://www.youtube.com/watch?v=GqoJQft5R2E
-pass (password manager) https://www.youtube.com/watch?v=sVkURNfxPd4
+dwm (window manager) https://videos.lukesmith.xyz/videos/watch/f6b78db7-b368-4647-bc64-28c08fff1988
+pacman (installing/managing programs) https://videos.lukesmith.xyz/videos/watch/8e7cadb9-0fed-47ce-a2a8-6635fa48614b
+status bar https://videos.lukesmith.xyz/videos/watch/a4d5326b-0aac-496e-bfc3-5acd5cee89f0
+sxiv (image viewer) https://videos.lukesmith.xyz/videos/watch/ad4c8d85-90c3-4f3d-a1f3-89129e64a3c2
+st (terminal) https://videos.lukesmith.xyz/videos/watch/efddd39d-bac5-4599-b572-177beb4ce6e8
+i3 (old window manager) https://videos.lukesmith.xyz/videos/watch/b861525c-7ada-40ee-a2bb-b5e1ffe0f48b
+neomutt (email) https://videos.lukesmith.xyz/videos/watch/83122e83-52d9-4278-ae1a-7d1beeb50c8e
+ncmpcpp (music player) https://videos.lukesmith.xyz/videos/watch/b5ac6f0d-a220-4433-88e3-e98fc791dc0a
+newsboat (RSS reader) https://videos.lukesmith.xyz/videos/watch/bd2c3fff-40fa-47ea-aa98-5b1ec0c903b6
+lf (file manager) https://videos.lukesmith.xyz/w/rKeHsF5ZHDNDbR1buUKB1c
+zathura (pdf viewer) https://videos.lukesmith.xyz/videos/watch/c780f75a-11f6-48a9-a191-d079ebc36ea4
+gpg keys https://videos.lukesmith.xyz/videos/watch/040f5530-4830-4583-9ddc-2080b421531b
+calcurse (calendar) https://videos.lukesmith.xyz/videos/watch/4b937e8b-7654-46e3-8d01-79392ec5b3d1
+urlview https://videos.lukesmith.xyz/videos/watch/31a4918f-633b-4bd6-b08e-956ac75d0324
+colorschemes with pywal https://videos.lukesmith.xyz/videos/watch/1b476003-61b2-4609-ac4b-820c3d128643
+vi mode in shell https://videos.lukesmith.xyz/videos/watch/228aa50c-836f-456f-9f0d-a45157fe4313
+pass (password manager) https://videos.lukesmith.xyz/videos/watch/432fc942-5e28-4682-9beb-f5cb237a1dd6
"
echo "$vidlist" | grep -P "^$(echo "$vidlist" | grep "https:" | sed 's/\t.*//g' | dmenu -i -p "Learn about what? (ESC to cancel)" -l 20 | awk '{print $1}')\s" | sed 's/.*\t//' | xargs -r mpv