aboutsummaryrefslogtreecommitdiffstats
path: root/.config/init/funcs
diff options
context:
space:
mode:
Diffstat (limited to '.config/init/funcs')
-rwxr-xr-x.config/init/funcs/b2h14
-rwxr-xr-x.config/init/funcs/make-gif97
-rwxr-xr-x.config/init/funcs/mpd-filetypes99
-rwxr-xr-x.config/init/funcs/spam25
-rwxr-xr-x.config/init/funcs/ssh-scrot45
5 files changed, 280 insertions, 0 deletions
diff --git a/.config/init/funcs/b2h b/.config/init/funcs/b2h
new file mode 100755
index 0000000..3a8d15a
--- /dev/null
+++ b/.config/init/funcs/b2h
@@ -0,0 +1,14 @@
+#!/usr/bin/env zsh
+# convert bits to human-readable value
+
+local suffixes=( 'B' 'K' 'M' 'G' 'T' 'P' 'E' 'Z' 'Y' )
+local sindex=1
+local val=$1
+[[ -z $(echo $1 | grep "^[0-9]*$") ]] && read val
+
+while [[ $(echo $val / 1024 | bc) -ne 0 ]]; do
+ val=$(echo "scale=2; $val / 1024" | bc)
+ let sindex=sindex+1
+done
+
+echo "${val}${suffixes[$sindex]}"
diff --git a/.config/init/funcs/make-gif b/.config/init/funcs/make-gif
new file mode 100755
index 0000000..7b3145c
--- /dev/null
+++ b/.config/init/funcs/make-gif
@@ -0,0 +1,97 @@
+#!/usr/bin/env zsh
+# export a clip from a video as a gif
+
+local callstr="$0"
+
+usage() {
+ [[ "$1" != "" ]] && echo -e "\e[1;31merror:\e[0m $1\n"
+ echo "Usage: $callstr [OPTIONS...] <infile> <outfile>"
+ echo ""
+ echo "description option default val"
+ echo "start time -s <time> 00:00:00"
+ echo "length in seconds -t <int> full length"
+ echo "gif fps -f <int> 10"
+ echo "gif pixel width -w <int> 480"
+ echo "use subtitles -b"
+ echo "print this help -h"
+ exit 1
+}
+
+local start="00:00:00"
+local length=""
+local fps=10
+local width=480
+local subs=""
+
+local timepat='^(([0-9][0-9]:){1,2}[0-9][0-9]|[0-9]+)$'
+local intpat='^[0-9][0-9]*$'
+
+local t=""
+
+while getopts s:t:f:w:bh opt; do
+ case "$opt" in
+ s)
+ [[ ! $(echo $OPTARG | grep -oE "$timepat") ]] \
+ && usage "malformed start timestamp"
+ start="$OPTARG"
+ ;;
+ t)
+ [[ ! $(echo $OPTARG | grep -oE "$intpat") ]] \
+ && usage "length must be an integer"
+ length=$OPTARG
+ t="-t"
+ ;;
+ f)
+ [[ ! $(echo $OPTARG | grep -oE "$intpat") ]] \
+ && usage "start time must be an integer"
+ fps=$OPTARG
+ ;;
+ w)
+ [[ ! $(echo $OPTARG | grep -oE "$intpat") ]] \
+ && usage "fps must be an integer"
+ width=$OPTARG
+ ;;
+ b) subs=true ;;
+ h) usage ;;
+ [?]) usage ;;
+ esac
+done
+shift $OPTIND-1
+
+[[ ${#@} -gt 2 ]] && usage "trailing arguments detected"
+
+[[ ${#@} -lt 2 ]] && usage "no output file specified"
+
+[[ "${2:e}" != "gif" ]] && usage "output file must have a .gif file extension"
+
+[[ ! -f "$1" ]] && usage "input file not found"
+
+
+rm -f make-gif-palette.png
+rm -f make-gif-in
+
+ln -s "$1" make-gif-in
+
+if [[ $subs ]]; then
+ echo "pass 1..."
+ ffmpeg -loglevel 16 -y -ss $start $t $length -i "$1" -copyts \
+ -vf "subtitles=make-gif-in,fps=$fps,scale=$width:-1:flags=lanczos,palettegen" \
+ make-gif-palette.png
+ [[ $? -eq 0 ]] && echo "pass 2..." && ffmpeg -loglevel 24 \
+ -ss $start $t $length -i "$1" -i make-gif-palette.png \
+ -copyts -filter_complex \
+ "subtitles=make-gif-in,fps=$fps,scale=$width:-1:flags=lanczos[x];[x][1:v]paletteuse" \
+ out.gif
+else
+ echo "pass 1..."
+ ffmpeg -loglevel 16 -y -ss "$start" $t $length -i "$1" \
+ -vf "fps=$fps,scale=$width:-1:flags=lanczos,palettegen" \
+ make-gif-palette.png
+ [[ $? -eq 0 ]] && echo "pass 2..." && ffmpeg -loglevel 24 \
+ -ss $start $t $length -i "$1" -i make-gif-palette.png -filter_complex \
+ "fps=$fps,scale=$width:-1:flags=lanczos[x];[x][1:v]paletteuse" \
+ out.gif
+fi
+
+rm -f make-gif-palette.png
+rm -f make-gif-in
diff --git a/.config/init/funcs/mpd-filetypes b/.config/init/funcs/mpd-filetypes
new file mode 100755
index 0000000..0bc93d2
--- /dev/null
+++ b/.config/init/funcs/mpd-filetypes
@@ -0,0 +1,99 @@
+#!/usr/bin/env zsh
+# list stats about mpd library file types, to motivate me
+# to do better!
+
+local pattern
+
+# if args exist, read them as file extensions in a pattern
+if
+if [[ ! -z "$@" ]]; then
+ pattern=$(echo "$@" | sed -e 's/\s/|/g' -e 's/\(.*\)/(\1)/')
+else
+# else hackily yoink recognised types from mpd --version
+ pattern=$(mpd --version \
+ | sed -n '1h; 1!H; ${g; s/.*Decoders plugins:\(.*\)Output.*/\1/g; p}' \
+ | sed -e 's/.*\]//' | tr -d '\n' \
+ | sed -e 's/^ //' -e 's/\s/|/g' -e 's/\(.*\)/(\1)/')
+fi
+
+# find file counts
+local i=1
+local total=0
+local totalstr='total'
+local counts=()
+local types=()
+find ~/music -type f -regextype posix-extended \
+ -regex ".*\.$pattern" | grep -oE "\.$pattern$" \
+ | sort | uniq -c | sed -e 's/^\s*\([0-9]* \)\./\1/' | \
+while read -A line; do
+ counts[$i]=${line[1]}
+ types[$i]=${line[2]}
+ total=$(( $total + ${line[1]} ))
+ i=$(( $i + 1 ))
+done
+
+# calculate percentages
+local twidth=0
+local cwidth=0
+local percentages=()
+for i in {1..${#types}}; do
+ percentages[$i]="%$(calc -p \
+ "a=${counts[$i]} * 100 / $total; round(a, 5-digits(a), 16)" \
+ | tr -d '~')"
+
+done
+
+types=( 'type' "${types[@]}" 'total' )
+counts=( 'count' "${counts[@]}" $total )
+percentages=( 'percent' "${percentages[@]}" ' ')
+
+# calculate padding widths
+for i in {1..${#types}}; do
+ if [[ ${#types[$i]} -gt $twidth ]]; then
+ twidth=${#types[$i]}
+ fi
+
+ if [[ ${#counts[$i]} -gt $cwidth ]]; then
+ cwidth=${#counts[$i]}
+ fi
+done
+
+
+# print results
+local linelen=$(( $twidth + $cwidth + 13 ))
+local j
+echo -n "┌"
+for (( j=0; j < $linelen; j++ )); do
+ echo -n "─"
+done
+echo "┐"
+
+for i in {1..${#types}}; do
+ if [[ $i -eq 2 || $i -eq ${#types} ]]; then
+ echo -n "├"
+ for (( j=0; j < $linelen; j++ )); do
+ echo -n "─"
+ done
+ echo "┤"
+ fi
+
+ if [[ $i -eq 1 ]]; then
+ printf "│ %${twidth}s " "${types[$i]}"
+ else
+ printf "│ %${twidth}s: " "${types[$i]}"
+ fi
+
+ printf "%${cwidth}s" "${counts[$i]}"
+
+ if [[ $i -eq 1 || $i -eq ${#types} ]]; then
+ printf " %-7s │\n" "${percentages[$i]}"
+ else
+ printf ", %-7s │\n" "${percentages[$i]}"
+ fi
+done
+
+echo -n "└"
+for (( j=0; j < $linelen; j++ )); do
+ echo -n "─"
+done
+echo "┘"
diff --git a/.config/init/funcs/spam b/.config/init/funcs/spam
new file mode 100755
index 0000000..77fa872
--- /dev/null
+++ b/.config/init/funcs/spam
@@ -0,0 +1,25 @@
+#!/usr/bin/env zsh
+# um...
+
+if [[ $# -eq 0 ]]; then
+ local spam="┐(笑)_(笑)┌"
+else
+ local spam="$@"
+fi
+
+
+while true; do
+ echo -en "\e[$((RANDOM%2));$((RANDOM%8+30))m"
+
+ for i in {1..${#spam}}; do
+ if [[ $((RANDOM%2)) -eq 1 ]]; then
+ echo -n $spam[$i] | tr '[:lower:]' '[:upper:]'
+ else
+ echo -n $spam[$i]
+ fi
+ done
+
+ for i in {1..$((RANDOM%20))}; do
+ echo -n " "
+ done
+done
diff --git a/.config/init/funcs/ssh-scrot b/.config/init/funcs/ssh-scrot
new file mode 100755
index 0000000..1e6a90c
--- /dev/null
+++ b/.config/init/funcs/ssh-scrot
@@ -0,0 +1,45 @@
+#!/usr/bin/env zsh
+# take a screenshot, upload to /img/scrot, and update current symlink
+
+archey3
+
+local name
+if [[ "$1" != "" ]]; then
+ name=$1
+else
+ echo -n "name: "
+ read name
+fi
+
+local date=$(date +'%Y-%m-%d')
+
+local folder="http/img/scrot"
+ssh shmibbles.me "mkdir -p $folder/$date"
+
+if [[ "${?#0}" != "" ]]; then
+ return 1
+fi
+
+ssh shmibbles.me "cd $folder; rm current 2>/dev/null; ln -s $date current"
+
+for i in {3..1}; do
+ echo -n "$i "
+ sleep 1
+done
+
+echo 'cheese!'
+sleep .1
+
+scrot /tmp/$name.png
+convert -scale 250x /tmp/$name.png /tmp/${name}_small.png
+
+scp /tmp/$name.png /tmp/${name}_small.png shmibbles.me:http/img/scrot/$date
+
+echo "https://shmibbles.me/img/scrot/$date/$name.png" | tr -d '\n' | xclip -i -selection clipboard
+echo "https://shmibbles.me/img/scrot/$date/$name.png" | tr -d '\n' | xclip -i -selection primary
+echo "https://shmibbles.me/img/scrot/$date/${name}_small.png" | tr -d '\n' | xclip -i -selection clipboard
+echo "https://shmibbles.me/img/scrot/$date/${name}_small.png" | tr -d '\n' | xclip -i -selection primary
+
+echo 'sent!'
+
+rm /tmp/$name.png /tmp/${name}_small.png