################### ALIASES ################## alias ssh-socks='ssh -C2qTnN -D 9853 shmibbles.me' alias sx='startx' if [[ "$(whence sshfs)" != "" ]] then alias smounth='mkdir -p ~/shmibbles.me; sshfs shmibbles.me: ~/shmibbles.me' alias smountw='mkdir -p ~/shmibbles.me; sshfs shmibbles.me:/usr/local/www/apache24/data/ ~/shmibbles.me' alias sumount='fusermount -u ~/shmibbles.me; rmdir ~/shmibbles.me' fi ################## FUNCTIONS ################## # list stats about mpd library file types, to motivate me # to do better! mpd-filetypes() { 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 "┘" } # take a screenshot, upload to /img/scrot, and update current symlink ssh-scrot() { 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 } make-gif-old() { if [[ -z "$1" ]]; then break fi rm -f make-gif-palette.png rm -f make-gif-palette.png rm -f make-gif-in rm -f make-gif-in ln -s "$1" make-gif-in local start echo -n "start [00:00:00]: " read start if [[ -z "$start" ]]; then start="00:00:00" fi local length echo -n "length [full]: " read length if [[ -z "$length" ]]; then t="" length="" else t="-t" fi local fps echo -n "fps [10]: " read fps if [[ -z "$fps" ]]; then fps="10" fi local width echo -n "width [480]: " read width if [[ -z "$width" ]]; then width="480" fi local subs echo -n "use subtitles? [y/N]: " read subs if [[ "$subs" == "y" || "$subs" == "Y" ]]; then subs="true" else subs="" fi if [[ $subs ]]; then ffmpeg -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 ffmpeg -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 ffmpeg -y -ss "$start" $t "$length" -i "$1" \ -vf "fps=$fps,scale=$width:-1:flags=lanczos,palettegen" make-gif-palette.png ffmpeg -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 } # export a section of a video to gif make-gif() { local i local infile="" local outfile="out.gif" local start="00:00:00" local t="" local length="" local fps="10" typeset -i fps local width="480" typeset -i width local subs="n" # parse args local assign=false local assignopt="" local interact=true for i in "$@"; do if [[ $assign ]]; then assign=false case $assignopt in # output -o) outfile="$i" ;; # start -s) start="$i" ;; # length -l) t="-t"; length="$i" ;; # fps -f) fps="$i" ;; # width -w) width="$i" ;; # subs? -t) subs="y" ;; *) >&2 echo "err: unrecognised option" return ;; esac else case $i in -*) assign=true assignopt="$i" interact=false ;; *) if [[ -z "$infile" ]]; then infile="$i" else >&2 echo "err: multiple inputs specified" return fi ;; esac fi done if [[ $assign ]]; then >&2 echo "err: malformed arg" return fi if [[ -z "$infile" ]]; then >&2 echo "err: no input specified" return fi # interactive prompting if [[ $interact ]]; then read "i?start [00:00:00]: " if [[ "$i" ]]; then start="$i" fi read "i?length [full]: " if [[ "$i" ]]; then t="-t" length="$i" fi read "i?fps [10]: " if [[ "$i" ]]; then fps="$i" fi read "i?width [480]: " if [[ "$i" ]]; then width="$i" fi read -q "subs?use subtitles? [y/N]: " >&2 echo -e "\n" read "i?write to: " if [[ "$i" ]]; then outfile="$i" fi fi rm -f make-gif-palette.png rm -f make-gif-palette.png rm -f make-gif-in ln -s "$infile" make-gif-in >&2 echo "converting..." if [[ "$subs" == "y" ]]; then ffmpeg -loglevel 0 -y -ss "$start" $t "$length" -i "$infile" \ -copyts -vf "subtitles=make-gif-in,fps=$fps,scale=$width:-1:flags=lanczos,palettegen" make-gif-palette.png ffmpeg -loglevel 0 -ss "$start" $t "$length" -i "$infile" -i make-gif-palette.png \ -copyts -filter_complex \ "subtitles=make-gif-in,fps=$fps,scale=$width:-1:flags=lanczos[x];[x][1:v]paletteuse" \ make-gif-out else ffmpeg -loglevel 0 -y -ss "$start" $t "$length" -i "$infile" \ -vf "fps=$fps,scale=$width:-1:flags=lanczos,palettegen" make-gif-palette.png ffmpeg -loglevel 0 -ss "$start" $t "$length" -i "$infile" -i make-gif-palette.png -filter_complex \ "fps=$fps,scale=$width:-1:flags=lanczos[x];[x][1:v]paletteuse" \ make-gif-out fi >&2 echo "optimising..." rm -f make-gif-palette.png rm -f make-gif-in gifsicle -O3 -o "$outfile" make-gif-out rm -f make-gif-out >&2 echo "done!" } # um... fuck() { local fuck="fuck" while true; do echo -en "\e[$((RANDOM%2));$((RANDOM%8+30))m" for i in {1..${#fuck}}; do if [[ $((RANDOM%2)) -eq 1 ]]; then echo -n $fuck[$i] | tr '[:lower:]' '[:upper:]' else echo -n $fuck[$i] fi done for i in {1..$((RANDOM%20))}; do echo -n " " done done } tmr() { transmission-daemon sleep 1 transmission-remote-cli transmission-remote localhost --exit }