diff options
Diffstat (limited to '.config/init/funcs')
-rwxr-xr-x | .config/init/funcs/b2h | 14 | ||||
-rwxr-xr-x | .config/init/funcs/make-gif | 97 | ||||
-rwxr-xr-x | .config/init/funcs/mpd-filetypes | 99 | ||||
-rwxr-xr-x | .config/init/funcs/spam | 25 | ||||
-rwxr-xr-x | .config/init/funcs/ssh-scrot | 45 |
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 |