UP | HOME

Scripts

Table of Contents

Wallpapers

while true; do
    nitrogen --set-zoom-fill --random ".wallpapers"
    sleep 10m
done

TODO LockScreen

  • [ ] Does not work well with multiple screen

First, turn off dunst

killall -SIGUSR1 dunst && echo "off" > /tmp/dunststatus;

Turn off the music if it is playing.

MPC_STATE=$(mpc | sed -n '2p' | cut -d "[" -f2 | cut -d "]" -f1)
if [[ $MPC_STATE == "playing" ]]; then
  mpc pause
fi

Then take a screenshot and process it.

temp_file="/tmp/screen.png"

rm -f $temp_file

maim $temp_file
convert $temp_file -scale 10% -scale 1000% $temp_file

Finally, lock the screen using i3lock.

i3lock -e -n -i $temp_file && killall -SIGUSR2 dunst && echo "on" > /tmp/dunststatus
revert() {
    xset dpms 0 0 0
}
trap revert HUP INT TERM
# turn off screen after 5 seconds
xset +dpms dpms 5 5 5

# Parameters
temp_file="/tmp/screen.png"
icon="$HOME/Pictures/Evil_Rick_Sprite.png"
width=1920
height=1080
blur_factor=6
lock_blur_factor=0

# Take the screen shot, blur the image and add the icon
ffmpeg -f x11grab -video_size "${width}x${height}" -y -i $DISPLAY -i $icon -filter_complex "boxblur=$blur_factor:$blur_factor,overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2,boxblur=$lock_blur_factor:$lock_blur_factor" -vframes 1 $temp_file

# Alternative
# maim -d 1 $temp_file
# convert -blur 0x8 $temp_file $temp_file
# convert -composite $temp_file $icon -gravity South -geometry -20x1200 $temp_file

# Lock the screen with the image
i3lock --no-unlock-indicator --ignore-empty-password --show-failed-attempts --nofork --image=$temp_file

# Remove the screenshot
rm $temp_file

# Don't turn off screen when back from lock
revert

Delete first page of PDF

The requirement is to have pdftk or stapler installed.

if [[ -f $1 && $1 == *.pdf ]]; then
    # Argument if a file
    if type stapler > /dev/null 2>&1; then
        stapler del "$1" 1 /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$1"
    elif type pdftk > /dev/null 2>&1; then
        pdftk "$1" cat 2-end output /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$1"
    else
        echo "Neither pdftk nor stapler are installed"
    fi
fi

Lock / Exit / Suspend / …

option=$(echo -e "Lock\nExit\nLogout\nSuspend\nHibernate\nReboot\nShutdown" | rofi -i -dmenu)

case "$option" in
    "Lock")
        i3exit lock ;;
    "Exit")
        i3exit switch_user ;;
    "Logout")
        i3exit logout ;;
    "Suspend")
        i3exit suspend ;;
    "Hibernate")
        i3exit hibernate ;;
    "Reboot")
        i3exit reboot ;;
    "Shutdown")
        i3exit shutdown ;;
esac

TODO Copy Figures

Things to do:

  • [ ] Display all the figures at once and ask for confirmation to copy them all
  • [ ] Display the not found figures
latexpath="$HOME/Cloud/thesis/latex/ressources/Figures";

figures=`awk 'match($0, /(fig.*\.(png|svg|pdf))/, a) {print a[1];}' $1 \
      | awk '{ print gensub(/\s*\]\]\s*\|\s*\[\[\s*\.?\/?/, "\n", "g") }'`;

for figure in $figures
do
    figurename=`echo $figure | awk 'match($0, /(fig.*\/)(.*\.(png|svg|pdf))/, a) {print a[2];}'`;
    if [ -f $latexpath/$figurename ]
    then
        figurepath=`echo $figure | awk 'match($0, /(fig.*)\/(.*\.(png|svg|pdf))/, a) {print a[1];}'`;

        # echo $latexpath/$figurename
        # echo $figurepath/$figurename
        cp $latexpath/$figurename $figurepath/$figurename

        # read -r -p "Are You Sure? [Y/n] " input

        # case $input in
        #     [yY][eE][sS]|[yY])
        #         cp $latexpath/$figurename $figurepath/$figurename
        #         ;;
        #     [nN][oO]|[nN])
        #         exit 1
        #         ;;
        #     *)
        #         echo "Invalid input..."
        #         exit 1
        #         ;;
        # esac
    fi
done

NAS

Mount

if [ $1 == "mount" ]; then
    if sudo -A mount 192.168.1.2:/volume1/Downloads/ /mnt/NAS/; then
        dunstify --replace=58249 'NAS' 'Successfully mounted'
    else
        dunstify --replace=58249 'NAS' 'Error while mounted'
    fi
elif [ $1 == "umount" ]; then
    if sudo -A umount /mnt/NAS/; then
        dunstify --replace=58249 'NAS' 'Successfully unmounted'
    else
        dunstify --replace=58249 'NAS' 'Error while unmounted'
    fi
fi

Buku Git Push

cd ~/.local/share/buku/

if [[ ! -z $(git status -s bookmarks.db) ]]
then
    git add bookmarks.db
    git commit -m "Changed bookmarks - $(date +%F)"
    git push
    dunstify --replace=79248 "Buku Git" "Updated"
    exit
fi

Icons Unicode

command -v xclip >/dev/null 2>&1 || { echo >&2 "I require xclip but it's not installed.  Aborting."; exit 1; }

chosen=$(grep -v "#" ~/.config/emoji | dmenu -i -l 20)

[ "$chosen" != "" ] || exit

c=$(echo "$chosen" | sed "s/ .*//")
echo "$c" | tr -d '\n' | xclip -selection clipboard
dunstify --replace=05896 "'$c' copied to clipboard." &

Make GIF

http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html

palette="/tmp/palette.png"

filters="fps=15,scale=320:-1:flags=lanczos"

ffmpeg -v warning -i $1 -vf "$filters,palettegen" -y $palette
ffmpeg -v warning -i $1 -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y $2

Org-Capture

xclip -o -selection primary | xclip -o -selection clipboard -i
emacsclient -ne '(org-capture "" "Q")' && dunstify "Emacs" "Text Successfully Captured"

Download-Audio

if [ $TMUX ]; then
    tmux split -v -l 1 "cd ~/Downloads/ && youtube-dl --add-metadata -xic -f bestaudio/best $1" && tmux select-pane -U
else
    cd ~/Downloads/;
    setsid nohup youtube-dl --add-metadata -xic -f bestaudio/best $1 &> /dev/null &
fi

Download-Video

if [ $TMUX ]; then
    tmux split -v -l 1 "cd ~/Downloads/ && youtube-dl --add-metadata -ic $1" && tmux select-pane -U
else
    cd ~/Downloads/;
    setsid nohup youtube-dl --add-metadata -ic $1 &> /dev/null &
fi

Org-Protocol-Capture-HTML

Defaults

heading="link"
template="pu"
url="https://google.com/"

Functions

function debug {
    if [[ -n $debug ]]
    then
        function debug {
            echo "DEBUG: $@" >&2
        }
        debug "$@"
    else
        function debug {
            true
        }
    fi
}
function die {
    echo "$@" >&2
    exit 1
}
function urlencode {
    python -c "
from __future__ import print_function
try:
    from urllib import quote  # Python 2
except ImportError:
    from urllib.parse import quote  # Python 3
import sys
print(quote(sys.stdin.read()[:-1], safe=''))"
}

Documentation

function usage {
    cat <<EOF
$0 [OPTIONS] [HTML]
html | $0 [OPTIONS]
Send HTML to Emacs through org-protocol, passing it through Pandoc to
convert HTML to Org-mode.  HTML may be passed as an argument or
through STDIN.  If only URL is given, it will be downloaded and its
contents used.
Options:
    -h, --heading HEADING     Heading
    -t, --template TEMPLATE   org-capture template key (default: pu)
    -u, --url URL             URL
    --debug  Print debug info
    --help   I need somebody!
EOF
}

Arguments

args=$(getopt -n "$0" -o dh:rt:u: -l debug,help,heading:,template:,url: -- "$@") \
    || die "Unable to parse args.  Is getopt installed?"
eval set -- "$args"

while true
do
    case "$1" in
        -d|--debug)
            debug=true
            debug "Debugging on"
            ;;
        --help)
            usage
            exit
            ;;
        -h|--heading)
            shift
            heading="$1"
            ;;
        -t|--template)
            shift
            template="$1"
            ;;
        -u|--url)
            shift
            url="$1"
            ;;
        --)
            # Remaining args
            shift
            rest=("$@")
            break
            ;;
    esac

    shift
done

debug "ARGS: $args"
debug "Remaining args: ${rest[@]}"

Get HTML

if [[ -n $@ ]]
then
    debug "Text from args"

    body="$@"
fi

URL-encode

heading=$(urlencode <<<"$heading") || die "Unable to urlencode heading."
url=$(urlencode <<<"$url") || die "Unable to urlencode URL."
body=$(urlencode <<<"$body") || die "Unable to urlencode text."

Send to Emacs

emacsclient "org-protocol://capture?template=$template&url=$url&title=$heading&body=$body"

Pdf Shrink

shrink ()
{
gs \
  -q -dNOPAUSE -dBATCH -dSAFER \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.3 \
  -dPDFSETTINGS=/screen \
  -dEmbedAllFonts=true \
  -dSubsetFonts=true \
  -dAutoRotatePages=/None \
  -dColorImageDownsampleType=/Bicubic \
  -dColorImageResolution=$3 \
  -dGrayImageDownsampleType=/Bicubic \
  -dGrayImageResolution=$3 \
  -dMonoImageDownsampleType=/Subsample \
  -dMonoImageResolution=$3 \
  -sOutputFile="$2" \
  "$1"
}

check_smaller ()
{
# If $1 and $2 are regular files, we can compare file sizes to
# see if we succeeded in shrinking. If not, we copy $1 over $2:
if [ ! -f "$1" -o ! -f "$2" ]; then
return 0;
fi
ISIZE="$(echo $(wc -c "$1") | cut -f1 -d\ )"
OSIZE="$(echo $(wc -c "$2") | cut -f1 -d\ )"
if [ "$ISIZE" -lt "$OSIZE" ]; then
echo "Input smaller than output, doing straight copy" >&2
cp "$1" "$2"
fi
}

usage ()
{
echo "Reduces PDF filesize by lossy recompressing with Ghostscript."
echo "Not guaranteed to succeed, but usually works."
echo "  Usage: $1 infile [outfile] [resolution_in_dpi]"
}

IFILE="$1"

# Need an input file:
if [ -z "$IFILE" ]; then
usage "$0"
exit 1
fi

# Output filename defaults to "-" (stdout) unless given:
if [ ! -z "$2" ]; then
OFILE="$2"
else
OFILE="-"
fi

# Output resolution defaults to 72 unless given:
if [ ! -z "$3" ]; then
res="$3"
else
res="90"
fi

shrink "$IFILE" "$OFILE" "$res" || exit $?

check_smaller "$IFILE" "$OFILE"

Author: Dehaeze Thomas

Created: 2020-01-28 mar. 21:32