literate-dotfiles/binaries.org
2022-02-06 21:45:56 +01:00

33 KiB

Binaries

dmenumount - Mount USB and Android

Script taken from Luke Smith.

getmount() { \
    [ -z "$chosen" ] && exit 1
    # shellcheck disable=SC2086
    mp="$(find $1 2>/dev/null | dmenu -i -p "Type in mount point.")" || exit 1
    [ "$mp" = "" ] && exit 1
    if [ ! -d "$mp" ]; then
        mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") || exit 1
        [ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp")
    fi
}

mountusb() { \
    chosen="$(echo "$usbdrives" | dmenu -i -p "Mount which drive?")" || exit 1
    chosen="$(echo "$chosen" | awk '{print $1}')"
    sudo -A mount "$chosen" 2>/dev/null && notify-send "💻 USB mounting" "$chosen mounted." && exit 0
    alreadymounted=$(lsblk -nrpo "name,type,mountpoint" | awk '$3!~/\/boot|\/home$|SWAP/&&length($3)>1{printf "-not ( -path *%s -prune ) ",$3}')
    getmount "/mnt /media /mount /home -maxdepth 5 -type d $alreadymounted"
    partitiontype="$(lsblk -no "fstype" "$chosen")"
    case "$partitiontype" in
        "vfat") sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000;;
        ,*) sudo -A mount "$chosen" "$mp"; user="$(whoami)"; ug="$(groups | awk '{print $1}')"; sudo -A chown "$user":"$ug" "$mp";;
    esac
    notify-send "💻 USB mounting" "$chosen mounted to $mp."
}

mountandroid() { \
    chosen="$(echo "$anddrives" | dmenu -i -p "Which Android device?")" || exit 1
    chosen="$(echo "$chosen" | cut -d : -f 1)"
    getmount "$HOME -maxdepth 3 -type d"
    simple-mtpfs --device "$chosen" "$mp"
    echo "OK" | dmenu -i -p "Tap Allow on your phone if it asks for permission and then press enter" || exit 1
    simple-mtpfs --device "$chosen" "$mp"
    notify-send "🤖 Android Mounting" "Android device mounted to $mp."
}

asktype() { \
    choice="$(printf "USB\\nAndroid" | dmenu -i -p "Mount a USB drive or Android device?")" || exit 1
    case $choice in
        USB) mountusb ;;
        Android) mountandroid ;;
    esac
}

anddrives=$(simple-mtpfs -l 2>/dev/null)
usbdrives="$(lsblk -rpo "name,type,size,mountpoint" | awk '$4==""{printf "%s (%s)\n",$1,$3}')"

if [ -z "$usbdrives" ]; then
    [ -z "$anddrives" ] && echo "No USB drive or Android device detected" && exit
    echo "Android device(s) detected."
    mountandroid
else
    if [ -z "$anddrives" ]; then
        echo "USB drive(s) detected."
        mountusb
    else
        echo "Mountable USB drive(s) and Android device(s) detected."
        asktype
    fi
fi

dmenuumount - Unmount USB and Android devices

Script taken from Luke Smith.

unmountusb() {
    [ -z "$drives" ] && exit
    chosen="$(echo "$drives" | dmenu -i -p "Unmount which drive?")" || exit 1
    chosen="$(echo "$chosen" | awk '{print $1}')"
    [ -z "$chosen" ] && exit
    sudo -A umount "$chosen" && notify-send "💻 USB unmounting" "$chosen unmounted."
}

unmountandroid() { \
    chosen="$(awk '/simple-mtpfs/ {print $2}' /etc/mtab | dmenu -i -p "Unmount which device?")" || exit 1
    [ -z "$chosen" ] && exit
    sudo -A umount -l "$chosen" && notify-send "🤖 Android unmounting" "$chosen unmounted."
}

asktype() { \
    choice="$(printf "USB\\nAndroid" | dmenu -i -p "Unmount a USB drive or Android device?")" || exit 1
    case "$choice" in
        USB) unmountusb ;;
        Android) unmountandroid ;;
    esac
}

drives=$(lsblk -nrpo "name,type,size,mountpoint" | awk '$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}')

if ! grep simple-mtpfs /etc/mtab; then
    [ -z "$drives" ] && echo "No drives to unmount." &&  exit
    echo "Unmountable USB drive detected."
    unmountusb
else
    if [ -z "$drives" ]
    then
        echo "Unmountable Android device detected."
        unmountandroid
    else
        echo "Unmountable USB drive(s) and Android device(s) detected."
        asktype
    fi
fi

dmenukill - Kill program using Dmenu

ps_line=$(ps -u $USER k -size -o pid=,%mem=,%cpu=,comm= | dmenu -i -l 15)

if [ ! -z "$ps_line" ]; then
    pid=$(echo $ps_line | awk '{print $1}')
    name=$(echo $ps_line | awk '{print $4}')

    kill -15 $pid && \
        notify-send "Kill" "$name (PID $pid)" &
fi

nordvpn-toggle - Connect to VPN using NordVPN

To use this this, nordvpn must be installed: yay -S nordvpn-bin.

tmpfile="/tmp/vpnstatus";

if [[ $(nordvpn status) == *"Connected"* ]]; then
    nordvpn disconnect && \
        notify-send "VPN" "Disconnected" && \
        echo "off" > $tmpfile;
else
    # Select Country to connect to
    country=`cat ~/.local/data/nordvpn_countries.txt | rofi -i -dmenu | sed 's/\s/_/g'`;
    notify-send "VPN" "Connecting to $country...";
    nordvpn connect $country && \
        notify-send "VPN" "Connected to $country" && \
        echo "on" > $tmpfile;
fi

i3exit - Manage lock, suspend, reboot, …

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

case "$option" in
    "Lock")
        ~/.local/bin/lockscreen
        ;;
    "Exit")
        pkill -15 -t tty"$XDG_VTNR" Xorg
        ;;
    "Logout")
        loginctl terminate-session `loginctl session-status | head -n 1 | awk '{print $1}'`
        ;;
    "Suspend")
        systemctl suspend && ~/.local/bin/lockscreen
        ;;
    "Hibernate")
        systemctl hibernate && ~/.local/bin/lockscreen
        ;;
    "Reboot")
        confirmation=$(echo -e "Yes\nNo" | rofi -i -p "Are you sure you want to Reboot?" -dmenu)
        case "$confirmation" in
            "Yes")
                systemctl reboot
                ;;
        esac
        ;;
    "Shutdown")
        confirmation=$(echo -e "Yes\nNo" | rofi -i -p "Are you sure you want to Shutdown?" -dmenu)
        case "$confirmation" in
            "Yes")
                systemctl poweroff
                ;;
        esac
        ;;
    ,*)
        echo "== ! i3exit: missing or invalid argument ! =="
        exit 2
esac

exit 0

askpass-rofi - GUI prompt for passwords

Take password prompt from STDIN, print password to STDOUT. The sed piece just removes the colon from the provided prompt: rofi -p already gives us a colon

rofi -dmenu \
     -password \
     -no-fixed-num-lines \
     -p "$(printf "$1" | sed s/://)"

screenshot - Take Screenshot

# Ask for screenshot type
status=$(echo -e "All\nGUI\nSelection\nCropped\nCopy\nPretty\nShadow\nWindow" | rofi -i -dmenu -p "Type")
if [ -z "$status" ]; then
    exit;
fi

# Ask for filename if not copying the image
if [[ $status != "Copy" ]]; then
    name=$(echo -e "screenshot-$(date +"%m-%d-%y_%H-%M-%S")" | rofi -i -dmenu -p "Filename")
    if [ -z "$name" ]; then
        exit;
    fi
    filename=~/Pictures/$name.png
fi

case "$status" in
    "All")
        maim -u $filename ;;
    "GUI")
        flameshot gui -r > $filename && \
            pkill flameshot;;
    "Selection")
        maim -u -s $filename ;;
    "Cropped")
        maim -u -s $filename && convert -trim $filename $filename ;;
    "Copy")
        maim -u -s | xclip -selection clipboard -t image/png ;;
    "Shadow")
        maim -u -s | convert - \( +clone -background black -shadow 80x3+5+5 \) +swap -background none -layers merge +repage $filename ;;
    "Pretty")
        maim -u -s $filename && \
            convert $filename \( +clone  -alpha extract -draw 'fill black polygon 0,0 0,5 5,0 fill white circle 5,5 5,0' \( +clone -flip \) -compose Multiply -composite \( +clone -flop \) -compose Multiply -composite \) -alpha off -compose CopyOpacity -composite $filename && \
            convert $filename \( +clone -background black -shadow 40x5+0+0 \) +swap -background none -layers merge +repage $filename ;;
    "Window")
        maim -u -i $(xdotool selectwindow) $filename ;;
esac

network-toggle - Toggle Network

Minimal network manager to just toggle the Wifi or Ethernet connection.

result=$(nmcli device | sed '1d' | dmenu -l 20);

interface=$(echo $result | awk -F ' ' '{print $1}');
status=$(echo $result | awk -F ' ' '{print $3}');

if [ $status == 'disconnected' ]; then
  nmcli device connect $interface
else
  nmcli device disconnect $interface
fi

make-gif - Convert an MP4 video to GIF

First argument is the mp4 file and the second argument is the output gif file.

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

yt-audio - Download-Audio from youtube

if [ $TMUX ]; then
  tmux split -v -l 5 "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

yt-video - Download-Video from youtube

if [ $TMUX ]; then
  tmux split -v -l 5 "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

setbg - Set Background

First argument is either:

  • the background file
  • a directory, in such case it will pick a random picture file from that directory
bgloc="${XDG_CACHE_HOME:-$HOME/.cache/}/bg"

# If the argument is a file
[ -f "$1" ] && ln -sf "$(readlink -f "$1")" "$bgloc"

# If the argument is a directory
[ -d "$1" ] && ln -sf "$(find "$(readlink -f "$1")" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc"

# Set the wallpaper
xwallpaper --zoom "$bgloc"

insert-unicode - Insert Unicode Icon

The list of emojis is available here.

# Must have xclip installed to even show menu.
xclip -h 2>/dev/null || exit 1

chosen=$(cut -d ';' -f1 ~/.local/data/emojis | rofi -dmenu -i -l 20 | sed "s/ .*//")

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

# If you run this command with an argument, it will automatically insert the character.
if [ -n "$1" ]; then
    xdotool key Shift+Insert
else
    echo "$chosen" | tr -d '\n' | xsel -ib
    notify-send "'$chosen' copied to clipboard." &
fi

insert-nerd-fonts - Insert Nerd Font Icon

The list of emojis is available here.

# Must have xsel installed to even show menu.
xsel -h 2>/dev/null || exit 1

chosen=$(cat ~/.local/data/nerd-fonts | rofi -dmenu -i -l 20 | sed "s/ .*//")

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

# If you run this command with an argument, it will automatically insert the character.
if [ -n "$1" ]; then
    xdotool key Shift+Insert
else
    echo "$chosen" | tr -d '\n' | xsel -ib
    notify-send "'$chosen' copied to clipboard." &
fi

linkhandler - Open any URL with Default application

Inspired from linkhandler script (github). This is used to open any url with the wanted program.

[ -z "$1" ] && { "$BROWSER"; exit; }

case "$1" in
    ,*mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*gif)
        setsid mpv -quiet "$1" >/dev/null 2>&1 & ;;
    ,*png|*jpg|*jpe|*jpeg)
        curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
    ,*pdf|*cbz|*cbr)
        curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
    ,*svg)
        curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && inkview "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;;
    ,*mp3|*flac|*opus|*mp3?source*)
        setsid curl -LO "$1" >/dev/null 2>&1 & ;;
    ,*)
        [ -f "$1" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$1" >/dev/null 2>&1 || setsid -f "$BROWSER" "$1" >/dev/null 2>&1
esac

open - Open any file using rifle

Simple alternative to xdg-open, uses the rifle program included with ranger. The default applications are listed here.

rifle -p $(rifle -l "$1" | rofi -dmenu -i | sed -n -e 's/\([0-9]*\):.*/\1/p') "$1"

lockscreen - Lock Screen

A nice lockscreen that uses i3lock. It takes a screenshot, pixelize it and overlay an image in the lockscreens folder.

# 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

# Take the screenshot and process it nicely
temp_file="/tmp/screen.png"
rm -f $temp_file
maim $temp_file && \
    # Pixelize the Screenshot
    convert $temp_file -scale 10% -scale 1000% $temp_file && \
    # Overlay a random image in the lockscreens folder
    composite -gravity center $(find ~/.local/data/lockscreens/ -type f | shuf -n 1) $temp_file $temp_file;

# Finally, lock the screen using =i3lock=
i3lock --ignore-empty-password --nofork --image=$temp_file && \
    # When unlocking, restart dunst
    killall -SIGUSR2 dunst && echo "on" > /tmp/dunststatus

mopidy-restart - Restart Mopidy

Sometimes mopidy need to be restarted…

pids=( $(pgrep -f mopidy) )

for pid in "${pids[@]}"; do
    if [[ $pid != $$ ]]; then
        kill "$pid"
    fi
done
echo "Killed mopidy."

echo "Restarting mopidy..."
mopidy --config ~/.config/mopidy/mopidy.conf >/dev/null 2>&1 &
echo "Done"

upload - Upload Script

Upload a file to https://0x0.st/ and copy the generated url.

if [ $TMUX ]; then
    tmux split -v -l 1 "curl --progress-bar -F\"file=@$1\" https://0x0.st | xsel -ib;" && tmux select-pane -U
else
    curl --progress-bar -F"file=@$1" https://0x0.st | xsel -ib && \
        notify-send 'Upload' 'Successful' || \
        notify-send --urgency=critical 'Upload' 'Failed'
fi

weather - Display Weather in terminal

Get the weather from http://wttr.in/.

if [ -n "$*" ]; then
    address="wttr.in/"
    address+=$*
else
    address="wttr.in/"
fi

if type sxiv > /dev/null 2>&1; then
    address+=".png"

    wget -qO- "$address" > /tmp/weather.png && \
        sxiv -b /tmp/weather.png
elif type feh > /dev/null 2>&1; then
    address+=".png"

    wget -qO- "$address" | feh -
else
    curl "$address"
fi

pdf2bib - Extract bibtex entry from PDF file

pdf2doi () {
    pdfinfo "$1" | grep -io "doi:.*" | grep -Poi "10.\d+/[^\s]+" || \
        pdftotext "$1" 2>/dev/null - | grep -io "doi:.*" -m 1 | grep -Poi "10.\d+/[^\s]+" || \
        pdftotext "$1" 2>/dev/null - | grep -Poi "10.\d+/[^\s]+"
}

doi2bib () {
    # curl -LHs "Accept: application/x-bibtex" http://dx.doi.org/$1 -w "\\n"
    curl -s "http://api.crossref.org/works/$1/transform/application/x-bibtex" -w "\\n"
}

# If a file is specified, try to extract DOI from the file
if [ -f "$1" ]; then
    doi=$(pdf2doi "$1")
fi

if hash rofi 2>/dev/null; then
    doi=$(echo "$doi" | rofi -i -dmenu -p "DOI")
else
    doi=$(echo "$doi" | dmenu -i -p "DOI")
fi

if [ -n "$1" ]; then
    doi2bib $doi | xsel -ib && \
        notify-send 'BibTeX' 'Copied to Clipboard' || \
        notify-send --urgency=critical 'BibTeX' 'Failed'
fi

pdf2png - Convert a PDF to PNG

# Check if the input argumetn is a PDF file
if [[ -f "$1" && "$1" == *.pdf ]]; then
    pdftoppm -png "$1" > "$(echo "$1" | cut -f 1 -d '.' | sed 's/$/.png/')"
fi

TODO convert-file - Convert any file to another filetype

Get basic information about the file

# Get filename
filename_with_extension=$(basename -- "$1")
# Extract extension of the file
in_ext="${filename_with_extension##*.}"
# filename without extension
filename_without_extension=${filename_with_extension%.*}

SVG files

List of useful programs:

  • inkscape

SVG to PNG

svg2png_function() { \
    if command -v inkscape &> /dev/null; then
        inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension"
    fi
}

SVG to PDF

svg2pdf_function() { \
    if command -v inkscape &> /dev/null; then
        inkscape --export-type="$out_ext" "$filename_with_extension"
    fi
}

Main function

# Convert SVG Files
svg2() { \
    out_ext=$(echo -e "pdf\npng" | rofi -i -dmenu -p "Convert SVG to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "png")
            svg2png_function
            ;;
        "pdf")
            svg2pdf_function
            ;;
    esac
}

PDF files

List of useful programs:

  • pdftocairo
  • pdftoppm
  • convert
  • inkscape
  • gs
  • pdfcrop
  • pdftk

PDF to PNG

pdf2png_function() { \
    if command -v pdftocairo &> /dev/null; then
        pdftocairo -png -singlefile -cropbox "$filename_with_extension" "$filename_without_extension"
    elif command -v pdftoppm &> /dev/null; then
        pdftoppm -png "$filename_with_extension" > "$filename_without_extension.png"
    elif command -v convert &> /dev/null; then
        convert -density 100 -trim -antialias "$filename_with_extension" -quality 100 "$filename_without_extension.png"
    elif command -v inkscape &> /dev/null; then
        inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension"
    fi
}

PDF to SVG

pdf2svg_function() { \
    if command -v pdftocairo &> /dev/null; then
        pdftocairo -svg "$filename_with_extension" "$filename_without_extension.svg"
    elif command -v pdf2svg &> /dev/null; then
        pdf2svg "$filename_with_extension" "$filename_without_extension.svg"
    elif command -v inkscape &> /dev/null; then
        inkscape --export-type="$out_ext" "$filename_with_extension"
    fi
}

PDF Reduce Size

pdfreduce_function() { \
    if command -v gs &> /dev/null; then
        # Maybe ask for new filename?
        gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$filename_without_extension.red.pdf" "$filename_with_extension"
    fi
}

PDF Trim

pdftrim_function() { \
    if command -v pdfcrop &> /dev/null; then
        pdfcrop "$filename_with_extension" "$filename_with_extension"
    fi
}

PDF Extract Pages

pdfextract_function() { \
    if command -v pdftk &> /dev/null; then
        pages=$(echo -e "get first\ndelete first\nextract i-j" | rofi -i -dmenu -p "Extract pages")

        if [ -z "$pages" ]; then
            exit;
        fi

        case "$pages" in
            "get first")
                if command -v pdftk &> /dev/null; then
                    pdftk "$filename_with_extension" cat 1-1 output "$filename_without_extension.first.pdf"
                fi
                ;;
            "delete first")
                if command -v pdftk &> /dev/null; then
                    pdftk "$filename_with_extension" cat 2-end output "$filename_with_extension"
                fi
                ;;
            "extract i-j")
                # TODO
                page_i=$(rofi -dmenu -p "From")
                page_j=$(rofi -dmenu -p "To")
                if command -v pdftk &> /dev/null; then
                    pdftk "$filename_with_extension" cat "$page_i-$page_j" output "$filename_with_extension.slice.pdf"
                fi
                ;;
        esac
    fi
}

Delete First Page

pdf_delete_first_page_function() { \
    if command -v stapler &> /dev/null; then
        stapler del "$filename_with_extension" 1 /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$filename_with_extension"
    elif command -v pdftk &> /dev/null; then
        pdftk "$filename_with_extension" cat 2-end output /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$filename_with_extension"
    fi
}

Remove Annotations

pdf_remove_annotations_function() { \
    if command -v pdftk &> /dev/null; then
        pdftk "$filename_with_extension" output /tmp/uncompressed.pdf uncompress
        LANG=C sed -n '/^\/Annots/!p' /tmp/uncompressed.pdf > /tmp/stripped.pdf
        pdftk /tmp/stripped.pdf output "$filename_with_extension" compress
    fi
}

Main function

# Convert PDF Files
pdf2() { \
    out_ext=$(echo -e "svg\npng\nreduce size\ntrim\nextract pages\ndelete first page\nremove annotations" | rofi -i -dmenu -p "Convert PDF to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "svg")
            pdf2svg_function
            ;;
        "png")
            pdf2png_function
            ;;
        "reduce size")
            pdfreduce_function
            ;;
        "trim")
            pdftrim_function
            ;;
        "extract pages")
            pdfextract_function
            ;;
        "delete first page")
            pdf_delete_first_page_function
            ;;
        "remove annotations")
            pdf_remove_annotations_function
            ;;
    esac
}

DVI files

List of useful programs:

  • dvisvgm
  • dvipng

DVI to PNG

dvi2png_function() { \
    if command -v dvipng &> /dev/null; then
        dvipng "$filename_with_extension"
    fi
}

DVI to SVG

dvi2svg_function() { \
    if command -v dvisvgm &> /dev/null; then
        dvisvgm "$filename_with_extension" -o "$filename_without_extension.svg"
    fi
}

Main function

# Convert DVI Files
dvi2() { \
    out_ext=$(echo -e "svg\npng" | rofi -i -dmenu -p "Convert DVI to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "svg")
            dvi2svg_function
            ;;
        "png")
            dvi2png_function
            ;;
    esac
}

DOCX/PTTX files

DOC to PDF

doc2pdf_function() { \
    if command -v lowriter &> /dev/null; then
        lowriter --convert-to pdf "$filename_with_extension"
    fi
}

Main function

# Convert DOCX/PPTX Files
docx2() { \
    out_ext=$(echo -e "pdf" | rofi -i -dmenu -p "Convert DOCX/PPTX to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "pdf")
            doc2pdf_function
            ;;
    esac
}

GIF files

GIF to PNG

gif2png_function() { \
    if command -v convert &> /dev/null; then
        convert -coalesce "$filename_with_extension" "$filename_without_extension.png"
    fi
}

Main function

# Convert GIF Files
gif2() { \
    out_ext=$(echo -e "png" | rofi -i -dmenu -p "Convert GIF to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "png")
            gif2png_function
            ;;
    esac
}

PNG files

PNG to PDF

png2pdf_function() { \
    if command -v convert &> /dev/null; then
        convert "$filename_with_extension" "$filename_without_extension.pdf"
    fi
}

PNG to JPG

png2jpg_function() { \
    if command -v convert &> /dev/null; then
        convert "$filename_with_extension" "$filename_without_extension.jpg"
    fi
}

PNG Trim

pngtrim_function() { \
    if command -v convert &> /dev/null; then
        convert -trim "$filename_with_extension" "$filename_with_extension"
    fi
}

PNG Resize

pngresize_function() { \
    if command -v convert &> /dev/null; then
         size_type=$(echo -e "width\nheight" | rofi -i -dmenu -p "Maximum:")
         size_px=$(rofi -dmenu -p "Number of px:")

         if [ "$size_type" = "width" ]; then
             convert -resize "$size_px"x "$filename_with_extension" "$filename_with_extension"
         elif [ "$size_type" = "height" ]; then
             convert -resize x"$size_px" "$filename_with_extension" "$filename_with_extension"
         fi
    fi
}

Main function

# Convert PNG Files
png2() { \
    out_ext=$(echo -e "pdf\njpg\ntrim\nresize" | rofi -i -dmenu -p "Convert PNG to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "pdf")
            png2pdf_function
            ;;
        "jpg")
            png2jpg_function
            ;;
        "trim")
            pngtrim_function
            ;;
        "resize")
            pngresize_function
            ;;
    esac
}

JPG files

JPG to PDF

jpg2pdf_function() { \
    if command -v convert &> /dev/null; then
        convert "$filename_with_extension" "$filename_without_extension.pdf"
    fi
}

JPG Resize

jpgresize_function() { \
    if command -v convert &> /dev/null; then
         size_type=$(echo -e "width\nheight" | rofi -i -dmenu -p "Maximum:")
         size_px=$(rofi -dmenu -p "Number of px:")

         if [ "$size_type" = "width" ]; then
             convert -resize "$size_px"x "$filename_with_extension" "$filename_with_extension"
         elif [ "$size_type" = "height" ]; then
             convert -resize x"$size_px" "$filename_with_extension" "$filename_with_extension"
         fi
    fi
}

Main function

# Convert JPG Files
jpg2() { \
    out_ext=$(echo -e "pdf\nresize" | rofi -i -dmenu -p "Convert JPG to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "pdf")
            jpg2pdf_function
            ;;
        "resize")
            jpgresize_function
            ;;
    esac
}

MP4 files

MP4 to GIF

mp42gif_function() { \
    if command -v ffmpeg &> /dev/null; then
         palette="/tmp/palette.png"

         width=$(echo -e "auto" | rofi -i -dmenu -p "GIF width")
         if [ "$width" = "auto" ]; then
             filters="fps=15"
         else
             filters="fps=15,scale=$width:-1:flags=lanczos"
         fi

         # Generate optimal pallette of colors
         ffmpeg -v warning -i "$filename_with_extension" -vf "$filters,palettegen" -y $palette
         # Convert
         ffmpeg -v warning -i "$filename_with_extension" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$filename_without_extension.gif"
    fi
}

Main function

# Convert MP4 Files
mp42() { \
    out_ext=$(echo -e "gif" | rofi -i -dmenu -p "Convert MP4 to")

    if [ -z "$out_ext" ]; then
        exit;
    fi

    case "$out_ext" in
        "gif")
            mp42gif_function
            ;;
    esac
}

Case statement

case "$in_ext" in
    "svg")
        svg2
        ;;
    "gif")
        gif2
        ;;
    "dvi")
        dvi2
        ;;
    "pdf")
        pdf2
        ;;
    "mp4")
        mp42
        ;;
    "png")
        png2
        ;;
    "jpg")
        jpg2
        ;;
    "jpeg")
        jpg2
        ;;
    "docx")
        docx2
        ;;
    "pttx")
        docx2
        ;;
esac

pdf-shrink - Pdf Shrink

Simply reduces the size of a given pdf file.

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 90 unless given:
if [ ! -z "$3" ]; then
    res="$3"
else
    res="90"
fi

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

check_smaller "$IFILE" "$OFILE"

pdf-delete-annotations - Delete Annotations from PDFs

Taken from this gist.

# Check if the input argumetn is a PDF file
if [[ -f "$1" && "$1" == *.pdf ]]; then
    pdftk $1 output /tmp/uncompressed.pdf uncompress
    LANG=C sed -n '/^\/Annots/!p' /tmp/uncompressed.pdf > /tmp/stripped.pdf
    pdftk /tmp/stripped.pdf output $1 compress
fi

pdf-delete-first-page - Delete first page of PDF

The requirement is to have pdftk or stapler installed.

# Check if the input argumetn is a PDF file
if [[ -f $1 && $1 == *.pdf ]]; then
    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

rofi-calc - Simple Calculation using Rofi

Run some simple calculations with rofi.

rofi -show calc -mode calc -no-show-match -no-sort

pass-gen - Generate Random Alphanumeric Password

# Ask for the wanted number of caracters
num=$(rofi -dmenu -p "Number of caracters")

# Random generation of alphanumeric caracters
pass=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)

re='^[0-9]+$'
if [[ $num =~ $re ]] ; then
    pass=${pass:0:$num}
fi

# Send the password to the clipboard
printf "$pass" | xclip -sel clip &&  \
    dunstify 'Password' 'Generated'

sxhkd-help - List of keybindings using Rofi

awk '/^[a-z]/ && last {print "<small>",$0,"\t",last,"</small>"} {last=""} /^#/{last=$0}' ~/.config/sxhkd/sxhkdrc{,.i3} |
    column -t -s $'\t' |
    rofi -dmenu -i -markup-rows -no-show-icons -width 1000 -lines 15 -yoffset 40