literate-dotfiles/binaries.org

32 KiB

Binaries

displayselect - Select Screen

Script taken from Luke Smith.

  twoscreen() { # If multi-monitor is selected and there are two screens.

      mirror=$(printf "no\\nyes" | dmenu -i -p "Mirror displays?")
      # Mirror displays using native resolution of external display and a scaled
      # version for the internal display
      if [ "$mirror" = "yes" ]; then
          external=$(echo "$screens" | dmenu -i -p "Optimize resolution for:")
          internal=$(echo "$screens" | grep -v "$external")

          res_external=$(xrandr --query | sed -n "/^$external/,/\+/p" | \
              tail -n 1 | awk '{print $1}')
          res_internal=$(xrandr --query | sed -n "/^$internal/,/\+/p" | \
              tail -n 1 | awk '{print $1}')

          res_ext_x=$(echo "$res_external" | sed 's/x.*//')
          res_ext_y=$(echo "$res_external" | sed 's/.*x//')
          res_int_x=$(echo "$res_internal" | sed 's/x.*//')
          res_int_y=$(echo "$res_internal" | sed 's/.*x//')

          scale_x=$(echo "$res_ext_x / $res_int_x" | bc -l)
          scale_y=$(echo "$res_ext_y / $res_int_y" | bc -l)

          xrandr --output "$external" --auto --scale 1.0x1.0 \
              --output "$internal" --auto --same-as "$external" \
              --scale "$scale_x"x"$scale_y"
      else

          primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
          secondary=$(echo "$screens" | grep -v "$primary")
          direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
          xrandr --output "$primary" --auto --scale 1.0x1.0 --output "$secondary" --"$direction"-of "$primary" --auto --scale 1.0x1.0
      fi
  }

  morescreen() { # If multi-monitor is selected and there are more than two screens.
      primary=$(echo "$screens" | dmenu -i -p "Select primary display:")
      secondary=$(echo "$screens" | grep -v "$primary" | dmenu -i -p "Select secondary display:")
      direction=$(printf "left\\nright" | dmenu -i -p "What side of $primary should $secondary be on?")
      tertiary=$(echo "$screens" | grep -v "$primary" | grep -v "$secondary" | dmenu -i -p "Select third display:")
      xrandr --output "$primary" --auto --output "$secondary" --"$direction"-of "$primary" --auto --output "$tertiary" --"$(printf "left\\nright" | grep -v "$direction")"-of "$primary" --auto
  }

  multimon() { # Multi-monitor handler.
      case "$(echo "$screens" | wc -l)" in
          2) twoscreen ;;
          ,*) morescreen ;;
      esac ;}

  onescreen() { # If only one output available or chosen.
      xrandr --output "$1" --auto --scale 1.0x1.0 "$(echo "$allposs" | grep -v "$1" | awk '{print "--output", $1, "--off"}' | paste -sd ' ')"
  }

  postrun() { # Stuff to run to clean up.
      setbg    # Fix background if screen size/arangement has changed.
      $HOME/.config/polybar/scripts/launch.sh # restart polybar
      { killall dunst ; setsid -f dunst ;} >/dev/null 2>&1 # Restart dunst to ensure proper location on screen
  }

  # Get all possible displays
  allposs=$(xrandr -q | grep "connected")

  # Get all connected screens.
  screens=$(echo "$allposs" | awk '/ connected/ {print $1}')

  # If there's only one screen
  [ "$(echo "$screens" | wc -l)" -lt 2 ] &&
      { onescreen "$screens"; postrun; notify-send "💻 Only one screen detected." "Using it in its optimal settings...";  exit ;}

  # Get user choice including multi-monitor and manual selection:
  chosen=$(printf "%s\\nmulti-monitor\\nmanual selection" "$screens" | dmenu -i -p "Select display arangement:") &&
      case "$chosen" in
          "manual selection") arandr ; exit ;;
          "multi-monitor") multimon ;;
          ,*) onescreen "$chosen" ;;
      esac

  postrun

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

vpntoggle - Connect to VPN using NordVPN

  if [[ $(nordvpn status) == *"Connected"* ]]; then
    nordvpn disconnect && dunstify --replace=23198 "VPN" "Disconnected";
  else
    country=`cat ~/.local/data/nordvpn_countries.txt | sed 's/\s*\t\s*/ /g ; s/\s/\n/g ; s/_/ /g ; /^[a-zA-Z]/!d ; s/\(.*\)/\L\1/' | rofi -i -dmenu | sed 's/\s/_/g'`;
    dunstify --replace=23198 "VPN" "Connecting to $country...";
    nordvpn connect $country && dunstify --replace=23198 "VPN" "Connected to $country";
  fi

bukurun - Open link from Buku

  _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")
          dm-tool switch-to-greeter
          ;;
      "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

  status=$(echo -e "All\nGUI\nSelection\nCropped\nCopy\nShadow\nActive" | rofi -i -dmenu -p "Type")
  if [ -z "$status" ]; then
    exit;
  fi

  name=$(echo -e "screenshot-$(date +"%m-%d-%y_%H-%M-%S")" | rofi -i -dmenu -p "Filename")
  if [ -z "$name" ]; then
    exit;
  fi

  case "$status" in
      "All")
          maim ~/Pictures/$name.png ;;
      "GUI")
          flameshot gui -r > ~/Pictures/$name.png ;;
      "Selection")
          maim -s ~/Pictures/$name.png ;;
      "Cropped")
          maim -s ~/Pictures/$name.png && convert -trim ~/Pictures/$name.png ~/Pictures/$name.png;;
      "Copy")
          maim -s | xclip -selection clipboard -t image/png ;;
      "Shadow")
          maim -st 9999999 | convert - \( +clone -background black -shadow 80x3+5+5 \) +swap -background none -layers merge +repage ~/Pictures/$name.png ;;
      "Active")
          maim -i $(xdotool getactivewindow) ~/Pictures/$name.png ;;
  esac

network-toggle - Toggle Network

  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 - Make GIF

  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

  bgloc="${XDG_CACHE_HOME:-$HOME/.cache/}/bg"

  [ -f "$1" ] && ln -sf "$(readlink -f "$1")" "$bgloc"

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

  xwallpaper --zoom "$bgloc"

insert-unicode - Insert Unicode Icon

  # 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

  # 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 https://github.com/LukeSmithxyz/voidrice/ This is used in newsboat to handle links

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

  case "$1" in
      ,*mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*)
          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 tsp 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 - LockScreen

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 --no-unlock-indicator --ignore-empty-password --nofork --image=$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

mopidy-restart - Restart Mopidy

  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

  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

  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

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

readnotes - Open Note File

  cd ~/Cloud/thesis/ressources/notes/pdfs/ && ls *.pdf | 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

  if [[ -f "$1" && "$1" == *.pdf ]]; then
      pdftoppm -png "$1" > "$(echo "$1" | cut -f 1 -d '.' | sed 's/$/.png/')"
  fi

pdf-shrink - 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"

pdf-delete-annotations - Delete Annotations from PDFs

From: https://gist.github.com/stefanschmidt/5248592

  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

pdf-delete-first-page - 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

rofi-calc - Simple Calculation using Rofi

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

pass-gen - Generate Random Alphanumeric Password

  num=$(rofi -dmenu -p "Number of 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

  printf "$pass" | xclip -sel clip &&  \
      dunstify 'Password' 'Generated'