literate-dotfiles/binaries.org

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

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 && \
          dunstify --replace=23198 "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'`;
      dunstify --replace=23198 "VPN" "Connecting to $country...";
      nordvpn connect $country && \
          dunstify --replace=23198 "VPN" "Connected to $country" && \
          echo "on" > $tmpfile;
  fi

bukurun - Open link from Buku

Script taken from here that acts as a buku frontend using Rofi.

  _rofi () {
      rofi -dmenu -i -no-levenshtein-sort -width 1000 "$@"
  }

  # display settings
  display_type=1
  max_str_width=80

  # keybindings
  switch_view="Alt+Tab"
  new_bookmark="Alt+n"
  actions="Alt+a"
  edit="Alt+e"
  delete="Alt+d"

  # colors
  help_color="#334433"

  # source global config
  if [[ -f /etc/buku_run.config ]]
  then
      source /etc/buku_run.config
  fi

  # source local config:
  if [[ -z $XDG_CONFIG_DIR ]]
  then
      if [[ -f $HOME/.config/buku_run/config ]]
      then
          source $HOME/.config/buku_run/config
      else
          echo "User config file \'~/.config/buku_run/config\' not found. using global config"
      fi
  else
      if [[ -f "${XDG_CONFIG_DIR}/buku_run/config" ]]
      then
          source "${XDG_CONFIG_DIR}/buku_run/config"
      else
          echo "User config file \'~/.config/buku_run/config\' not found. using global config"
      fi
  fi


  main () {
      HELP="Welcome to Buku. Use <span color='${help_color}'>${new_bookmark}</span> to add a new Bookmark
  Use <span color='${help_color}'>${switch_view}</span> to switch View. <span color='${help_color}'>${actions}</span> for actions"
      if [[ $mode == "bookmarks" ]]; then
          content=$(parseBuku)
          menu=$(echo "${content}" | _rofi -p '> ' -filter "${filter}" -mesg "${HELP}" -kb-custom-1 "${new_bookmark}" -kb-custom-2 "${switch_view}" -kb-custom-3 "${actions}" -kb-custom-4 "${edit}" -kb-custom-5 "${delete}")
      elif [[ $mode == "tags" ]]; then
          menu=$(buku --np --st | awk '{$NF=""; print $0}' | cut -d ' ' -f2-  | _rofi -p '> ' -mesg "${HELP}" -kb-custom-1 "${new_bookmark}" -kb-custom-2 "${switch_view}" -kb-custom-3 "${actions}" -kb-custom-4 "${edit}" -kb-custom-5 "${delete}")
      fi
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 12 ]]; then
          optionsMenu
      elif [[ $val -eq 10 ]]; then
          addMark
      elif [[ $val -eq 14 ]]; then
          deleteMenu
      elif [[ $val -eq 13 ]]; then
          editMenu
      elif [[ $val -eq 11 ]]; then
          if [[ $mode == "bookmarks" ]]; then
              export mode="tags"
              mode=tags main
          elif [[ $mode == "tags" ]]; then
              export mode="bookmarks"
              mode=bookmarks main
          fi
      elif [[ $val -eq 0 ]]; then
          if [[ $mode == "bookmarks" ]]; then
              id=$(getId "$content" "$menu")
              for bm in ${id}; do
                  buku -o "${bm}"
              done
          elif [[ $mode == "tags" ]]; then
              filter="${menu}" mode="bookmarks" main
          fi
      fi
  }

  optionsMenu () {
      if [[ $mode == "bookmarks" ]]; then
          askmenu=$(echo -e "< Return\n---\n1. Edit\n2. Delete" | _rofi -p '> ' -mesg "Choose Action for bookmark")
          val=$?
          if [[ $val -eq 1 ]]; then
              exit
          elif [[ $val -eq 0 ]]; then
              if [[ $askmenu == "< Return" ]]; then
                  export mode=bookmarks
                  main
              elif [[ $askmenu == "1. Edit" ]]; then
                  editMenu
              elif [[ $askmenu == "2. Delete" ]]; then
                  deleteMenu
              fi
          fi
      elif [[ $mode == "tags" ]]; then
          askmenu=$(echo -e "< Return\n---\n1. Replace Tag\n2. Delete Tag" | _rofi -p '> ' -mesg "Choose Action for tag \"${menu}\"")
          val=$?
          if [[ $val -eq 1 ]]; then
              exit
          elif [[ $val -eq 0 ]]; then
              if [[ $askmenu == "< Return" ]]; then
                  export mode=tags
                  main
              elif [[ $askmenu == "1. Replace Tag" ]]; then
                  newtag=$(echo | _rofi -p '> ' -mesg "Enter new tag name for tag \"${menu}\"")
                  val=$?
                  if [[ $val -eq 1 ]]; then
                      exit
                  elif [[ $val -eq 0 ]]; then
                      if [[ $newtag == "" ]]; then
                          mode=tags main
                      else
                          buku -r "${menu}" "${newtag}"
                          mode=tags main
                      fi
                  fi
              elif [[ $askmenu == "2. Delete Tag" ]]; then
                  delask=$(echo -e "1. Yes\n2. No" | _rofi -p '> ' -mesg "Really delete tag?")
                  val=$?
                  if [[ $val -eq 1 ]]; then
                      exit
                  elif [[ $val -eq 0 ]]; then
                      if [[ $delask == "1. Yes" ]]; then
                          buku -r "${menu}"
                          mode=tags main
                      elif [[ $delask == "2. No" ]]; then
                          mode=tags main
                      fi
                  fi
              fi
          fi
      fi
  }

  deleteMenu () {
      id=$(getId "$content" "$menu")
      delask=$(echo -e "1. Yes\n2. No" | _rofi -p '> ' -mesg "Really delete bookmark?")
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 0 ]]; then
          if [[ $delask == "1. Yes" ]]; then
              buku -d ${id} --tacit
              mode=bookmarks main
          elif [[ $delask == "2. No" ]]; then
              optionsMenu
          fi
      fi
  }

  editMenu () {
      id=$(getId "$content" "$menu")
      title="$(getTitleFromId $id)"
      bookmark="$(getUrlFromId $id)"
      tags="$(getTagsFromId $id)"
      content=$(echo -e "1. title: $title\n2. url: $bookmark\n3. tags: $tags")
      editmenu=$(echo -e "< Return\n---\n${content}" | _rofi -p '> ')
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 0 ]]; then
          if [[ $editmenu == "< Return" ]]; then
              main
          elif [[ $editmenu == "tags: NOTAG" ]]; then
              addTags --update
          elif [[ $editmenu =~ tags:* ]]; then
              tags="${tags}" editTags
          elif [[ $editmenu =~ url:* ]]; then
              editBookmark
          elif [[ $editmenu =~ title:* ]]; then
              editTitle
          fi
      fi
  }

  editTags () {
      edittagsmenu=$(echo | _rofi -filter "${tags}" -p '> ' -mesg "Edit Tags and hit Enter")
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 0 ]]; then
          buku -u ${id} --tag "${edittagsmenu}"
      fi
      mode=bookmarks main
  }

  editBookmark () {
      bmarkmenu=$(echo "" | _rofi -p "> " -filter "${bookmark}" -mesg "Edit Bookmark and hit Enter")
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 0 ]]; then
          if [[ $bmarkmenu == "http"* ]]; then
              buku -u "${id}" --url "${bmarkmenu}"
          else
              echo "" | rofi -e "Not a valid URI, Make sure URLs start with http"
              editBookmark
          fi
      fi
      mode=bookmarks main
  }

  editTitle () {
      titlemenu=$(echo "" | _rofi -p "> " -filter "${title}" -mesg "Edit Title and hit Enter")
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 0 ]]; then
          buku -u "${id}" --title "${titlemenu}"
      fi
      mode=bookmarks main
  }

  addMark () {
      inserturl=$(echo -e "$(xclip -o)" | _rofi -p '> ' -mesg "Use URL below or type manually")
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 0 ]]; then
          addTags
      fi
  }

  addTags () {
      inserttags=$(buku --np --st | awk '{$NF=""; print $0}' | cut -d ' ' -f2- | _rofi -p '> ' -mesg "Add some tags. Separate tags with ', '")
      val=$?
      if [[ $val -eq 1 ]]; then
          exit
      elif [[ $val -eq 0 ]]; then
          if [[ $(echo "${inserttags}" | wc -l) -gt 1 ]]; then
              taglist=$(echo "${inserttags}" | tr '\n' ',')
              tags=()
              for tag in $taglist; do
                  tags+=("$tag")
              done
          else
              tags=${inserttags}
          fi
          if [[ $1 == "--update" ]]; then
              buku -u "${id}" --tag ${tags}
          else
              buku -a ${inserturl} ${tags}
          fi
      fi
  }

  parseBuku () {
      echo "$(buku --nc -p | gawk -v max="$max_str_width" -v type="$display_type" '
  BEGIN {
    RS=""
    FS="\n"
  }
  {
    if ($3 == "")
      $3 = " # NOTAG"
    id = gensub(/([0-9]+)\.(.*)/, "\\1", "g", $1)
    url = substr(gensub(/\s+> (.*)/, "\\1", "g", $2),0,max)
    tags = gensub(/\s+# (.*)/, "\\1", "g", $3)
    title = substr(gensub(/[0-9]+\.\s*(.*)/, "\\1", "g", $1),0,max)

    if (type == 1)
      print id "\t" url "\t" tags
    else
      print id "\t" title "\t" tags
      if (type == 3)
        print " \t" url "\t "
    print ""
  }
  ' | column -t -s $'\t')"
  }

  getId () {
      id=$(echo "${2%% *}")
      if [ -z "$id" ]; then
          prev=""
          IFS=$'\n'
          for line in $1; do
              if [ "$2" = "$line" ]; then
                  id=$(echo "${prev%% *}")
                  break
              else
                  prev="$line"
              fi
          done
      fi
      echo $id
  }

  getTitleFromId () {
      echo "$(buku --nc -p $1 | gawk '
    BEGIN {
      RS=""
      FS="\n"
    }
    {
      print gensub(/[0-9]+\.\s*(.*)/, "\\1", "g", $1)
    }
    ')"
  }

  getUrlFromId () {
      echo "$(buku --nc -p $1 | gawk '
    BEGIN {
      RS=""
      FS="\n"
    }
    {
      print gensub(/\s+> (.*)/, "\\1", "g", $2)
    }
    ')"
  }

  getTagsFromId () {
      echo "$(buku --nc -p $1 | gawk '
    BEGIN {
      RS=""
      FS="\n"
    }
    {
      print gensub(/\s+# (.*)/, "\\1", "g", $3)
    }
    ')"
  }

  mode=bookmarks main

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
      dunstify "'$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
      dunstify "'$chosen' copied to clipboard." &
  fi

linkhandler - Open with Default application

Inspired from linkhandler script (github). This is used to open any type of file with the wanted program. It can be used in newsboat, neomutt and ranger for instance.

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

  case "$1" in
      ,*mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*)
          setsid mpv --input-ipc-server=/tmp/mpvsoc$(date +%s) -quiet "$1" >/dev/null 2>&1 & ;;
      ,*png|*jpg|*jpe|*jpeg|*gif)
          curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///")"  >/dev/null 2>&1 & ;;
      ,*mp3|*flac|*opus|*mp3?source*)
          setsid curl -LO "$1" >/dev/null 2>&1 & ;;
      ,*)
          if [ -f "$1" ]; then "$TERMINAL" -e "$EDITOR $1"
          else setsid $BROWSER "$1" >/dev/null 2>&1 & fi ;;
  esac

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 && \
          dunstify 'Upload' 'Successful' || \
          dunstify --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

readbib - Open Bibliography File

List all pdf files and open selected one with zathura.

  cd ~/Cloud/pdfs/ && ls | rofi -dmenu -lines 20 | xargs -I {} zathura {}

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 && \
          dunstify 'BibTeX' 'Copied to Clipboard' || \
          dunstify --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

convert-file - Convert any file to another filetype

  # 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%.*}

  # 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")
              inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension"
              ;;
          "pdf")
              inkscape --export-type="$out_ext" "$filename_with_extension"
              # pdf2svg file.pdf file.svg
              ;;
      esac
  }

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

      # Ask if crop?

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

      case "$out_ext" in
          "png")
              inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension"
              ;;
          "svg")
              inkscape --export-type="$out_ext" "$filename_with_extension"
              ;;
      esac
  }

  # 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")
              lowriter --convert-to pdf "$filename_with_extension"
              ;;
      esac
  }

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

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

      case "$out_ext" in
          "pdf")
              convert "$filename_with_extension" "$filename_without_extension.pdf"
              ;;
      esac
  }

  # 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")
              make-gif "$filename_with_extension" "$filename_without_extension.gif"
              ;;
      esac
  }

  case "$in_ext" in
      "svg")
          svg2
          ;;
      "pdf")
          pdf2
          ;;
      "mp4")
          mp42
          ;;
      "png")
          png2
          ;;
      "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