################### ALIASES ################## alias hc='herbstclient' ################## FUNCTIONS ################## # power off after finishing mpd playlist mpd-sleep() { mpc play while true; do mpc status mpc idle player if [[ -z "$(mpc status | grep playing)" ]]; then poweroff fi done } mpd-cover-convert() { find ~/music -type f -regextype posix-extended -regex ".*cover\.(png|jpg)"\ | while read file; do d=$(dirname "$file") if [[ ! -f "$d/cover-small.png" ]]; then convert "$file" -resize 250x "$d/cover-small.png" fi done } # list stats about mpd library file types, to motivate me # to do better! mpd-filetypes() { total=$(mpc stats | grep Songs | sed 's/Songs: *//') # hackily yoink recognised types from mpd --version types=(); mpd --version \ | sed -n '1h; 1!H; ${g; s/.*Decoders plugins:\(.*\)Output.*/\1/g; p}'\ | tr -s ' ' '\n' | sed -e 's/.*\]//' -e '/^$/d' | sort | uniq\ | while read word; do types[$(( ${#types} + 1 ))]="$word" done types[$(( ${#types} + 1 ))]="other" # find the number of files of each type counts[${#types}]=$total for (( i=1; i < ${#types}; i++ )); do # mpc search is a little faster, but # return bad matches because no regex counts[$i]=$(find ~/music/ -type f -regextype posix-extended -regex ".*\.${types[$i]}" | wc -l) counts[${#types}]=$(( ${counts[${#types}]} - ${counts[$i]} )) done twidth=0 cwidth=0 for (( i=1; i <= ${#types}; i++ )); do if [[ ${counts[$i]} -eq 0 ]]; then percentages[$i]=0 else percentages[$i]=$(calc -p "a=${counts[$i]} * 100 / $total; round(a, 4-digits(a), 16)"\ | tr -d '~') fi # get widths for padding. # exclude when count == 0 if [[ ${counts[$i]} -ne 0 ]]; then if [[ ${#types[$i]} -gt $twidth ]]; then twidth=${#types[$i]} fi if [[ ${#counts[$i]} -gt $cwidth ]]; then cwidth=${#counts[$i]} fi fi done # print non-empty result types for (( i=1; i <= ${#types}; i++ )); do if [[ ${counts[$i]} -ne 0 ]]; then printf "%${twidth}s: " "${types[$i]}" printf "%${cwidth}d" "${counts[$i]}" echo ", %${percentages[$i]}" fi done # print total linelen=$(( $twidth + $cwidth + 10 )) for (( i=0; i < $linelen; i++ )); do echo -n "=" done echo -e "\ntotal: $total" } # capture webm scap() { archey3 sleep .1 if [[ -f '/tmp/out.webm' ]]; then rm /tmp/out.webm fi echo 'recording...' ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 \ -c:v libvpx -b:v 4M -threads 4 /tmp/out.webm > /dev/null 2>&1 } # quickly send a file to hosted tmp dir send() { if [[ "$1" ]]; then scp $@ shmibbles.me:http/tmp/ if [[ $? -eq 0 ]]; then for name in "$@" do basename=$(basename $name) ssh shmibbles.me "cd http/tmp; chmod o+r '$basename'" name=$(echo "https://shmibbles.me/tmp/$basename"\ | sed -e 's/ /%20/g' -e 's/?/%3f/g') echo $name | tr -d '\n' | xclip -i -selection clipboard echo $name | tr -d '\n' | xclip -i -selection primary done fi else echo "specify at least one file to send" fi } # take a screenshot, upload to /img/scrot, and update current symlink ssh-scrot() { archey3 if [[ "$1" != "" ]]; then name=$1 else echo -n "name: " read name fi date=$(date +'%Y-%m-%d') folder="http/img/scrot" ssh shmibbles.me "mkdir -p $folder/$date" if [[ "${?#0}" != "" ]]; then return 1 fi ssh shmibbles.me "rm $folder/current 2>/dev/null; ln -s $folder/$date $folder/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 } # export a section of a video to gif make-gif() { 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 echo -n "start [00:00:00]: " read start if [[ -z "$start" ]]; then start="00:00:00" fi echo -n "length [full]: " read length if [[ -z "$length" ]]; then t="" length="" else t="-t" fi echo -n "fps [10]: " read fps if [[ -z "$fps" ]]; then fps="10" fi echo -n "width [480]: " read width if [[ -z "$width" ]]; then width="480" fi 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 } # um... fuck() { fuck="fuck" while true; do echo -en "\e[$((RANDOM%2));$((RANDOM%8+30))m" for i in {1..4}; 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 }