#+TITLE: Binaries #+SETUPFILE: ./setup/org-setup-file.org #+PROPERTY: header-args:bash :comments both :mkdirp yes #+PROPERTY: header-args:bash+ :shebang "#!/usr/bin/env bash" #+PROPERTY: header-args:bash+ :tangle-mode (identity #o555) * =dmenukill= - Kill program using Dmenu :PROPERTIES: :CUSTOM_ID: dmenukill :END: #+begin_src bash :tangle ~/.local/bin/dmenukill 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 && \ dunstify "Kill" "$name (PID $pid)" & fi #+end_src * =nordvpn-toggle= - Connect to VPN using NordVPN :PROPERTIES: :CUSTOM_ID: nordvpn-toggle :END: To use this this, =nordvpn= must be installed: =yay -S nordvpn-bin=. In order to populate the country list, =nordvpn countries | tr '\t' '\n' | sed -r '/^\s*$/d' > ~/.local/data/nordvpn_countries.txt=. #+begin_src bash :tangle ~/.local/bin/nordvpn-toggle 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 #+end_src * =i3exit= - Manage lock, suspend, reboot, ... :PROPERTIES: :CUSTOM_ID: i3exit :END: #+begin_src bash :tangle ~/.local/bin/i3exit 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 #+end_src * =askpass-rofi= - GUI prompt for passwords :PROPERTIES: :CUSTOM_ID: askpass-rofi :END: 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 #+BEGIN_SRC bash :tangle ~/.local/bin/askpass-rofi rofi -dmenu \ -password \ -no-fixed-num-lines \ -p "$(printf "$1" | sed s/://)" #+END_SRC * =get-pass= - Get Stored Password :PROPERTIES: :CUSTOM_ID: get-pass :END: #+BEGIN_SRC bash :tangle ~/.local/bin/get-pass pass $1 | sed -n 1p #+END_SRC * =screenshot= - Take Screenshot :PROPERTIES: :CUSTOM_ID: screenshot :END: #+begin_src bash :tangle ~/.local/bin/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=~/Cloud/pictures/screenshots/$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 #+end_src * =network-toggle= - Toggle Network :PROPERTIES: :CUSTOM_ID: network-toggle :END: Minimal network manager to just toggle the Wifi or Ethernet connection. #+begin_src bash :tangle ~/.local/bin/network-toggle 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 #+end_src * =make-gif= - Convert an =MP4= video to =GIF= :PROPERTIES: :CUSTOM_ID: make-gif :END: First argument is the =mp4= file and the second argument is the output =gif= file. #+begin_src bash :tangle ~/.local/bin/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 #+end_src * =yt-audio= - Download-Audio from youtube :PROPERTIES: :CUSTOM_ID: yt-audio :END: #+begin_src bash :tangle ~/.local/bin/yt-audio if [ $TMUX ]; then tmux split -v -l 5 "cd ~/Downloads/ && yt-dlp --add-metadata -xic --audio-format best $1" && tmux select-pane -U else cd ~/Downloads/; setsid nohup yt-dlp --add-metadata -xic --audio-format flac $1 &> /dev/null & fi #+end_src * =yt-video= - Download-Video from youtube :PROPERTIES: :CUSTOM_ID: yt-video :END: #+begin_src bash :tangle ~/.local/bin/yt-video if [ $TMUX ]; then tmux split -v -l 5 "cd ~/Downloads/ && yt-dlp --add-metadata -ic $1" && tmux select-pane -U else cd ~/Downloads/; setsid nohup yt-dlp --add-metadata -ic $1 &> /dev/null & fi #+end_src * =setbg= - Set Background :PROPERTIES: :CUSTOM_ID: setbg :END: First argument is either: - the background file - a directory, in such case it will pick a random picture file from that directory #+begin_src bash :tangle ~/.local/bin/setbg 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" #+end_src * =insert-unicode= - Insert Unicode Icon :PROPERTIES: :CUSTOM_ID: insert-unicode :END: The list of emojis is available [[file:data.org::#emojis][here]]. #+begin_src bash :tangle ~/.local/bin/insert-unicode # 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 #+end_src * =insert-nerd-fonts= - Insert Nerd Font Icon :PROPERTIES: :CUSTOM_ID: insert-nerd-fonts :END: The list of emojis is available [[file:data.org::#nerd-fonts][here]]. #+begin_src bash :tangle ~/.local/bin/insert-nerd-fonts # 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 #+end_src * =linkhandler= - Open any URL with Default application :PROPERTIES: :CUSTOM_ID: linkhandler :END: Inspired from =linkhandler= script ([[https://github.com/LukeSmithxyz/voidrice/][github]]). This is used to open any *url* with the wanted program. #+begin_src bash :tangle ~/.local/bin/linkhandler [ -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 & ;; ,*torrent) stig add "$1" >/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 #+end_src * =open= - Open any file using =rifle= :PROPERTIES: :CUSTOM_ID: filehandler :END: Simple alternative to =xdg-open=, uses the =rifle= program included with =ranger=. The default applications are listed [[file:ranger.org::#rifle][here]]. #+begin_src bash :tangle ~/.local/bin/open rifle -p $(rifle -l "$1" | rofi -dmenu -i | sed -n -e 's/\([0-9]*\):.*/\1/p') "$1" #+end_src * =lockscreen= - Lock Screen :PROPERTIES: :CUSTOM_ID: lockscreen :header-args: :tangle ~/.local/bin/lockscreen :END: A nice lockscreen that uses =i3lock=. It takes a screenshot, pixelize it and overlay an image in the lockscreens folder. #+begin_src bash # 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 #+end_src * =mopidy-restart= - Restart Mopidy :PROPERTIES: :CUSTOM_ID: mopidy-restart :END: Sometimes =mopidy= need to be restarted... #+begin_src bash :tangle ~/.local/bin/mopidy-restart 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" #+end_src * =upload= - Upload Script :PROPERTIES: :CUSTOM_ID: upload :END: Upload a file to https://0x0.st/ and copy the generated url. #+begin_src bash :tangle ~/.local/bin/upload 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 #+end_src * =weather= - Display Weather in terminal :PROPERTIES: :CUSTOM_ID: weather :END: Get the weather from http://wttr.in/. #+begin_src bash :tangle ~/.local/bin/weather 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 #+end_src * =convert-file= - Convert any file to another filetype :PROPERTIES: :CUSTOM_ID: convert-file :header-args: :tangle ~/.local/bin/convert-file :END: ** Get basic information about the file #+begin_src bash # Get filename filename_with_extension=$(basename -- "$1") # Extract extension of the file in_ext="${filename_with_extension##*.}" # To lowercase in_ext="${in_ext,,}" # filename without extension filename_without_extension=${filename_with_extension%.*} #+end_src ** SVG files List of useful programs: - =inkscape= *** SVG to PNG #+begin_src bash svg2png_function() { \ if command -v inkscape &> /dev/null; then inkscape --export-type="png" --export-filename="$filename_without_extension.png" --export-dpi=500 --export-area-drawing "$filename_with_extension" fi } #+end_src *** SVG to PDF #+begin_src bash svg2pdf_function() { \ if command -v inkscape &> /dev/null; then inkscape --export-type="pdf" --export-filename="$filename_without_extension.pdf" "$filename_with_extension" fi } #+end_src *** Main function #+begin_src bash # 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 } #+end_src ** PDF files List of useful programs: - =pdftocairo= - =pdftoppm= - =convert= - =inkscape= - =gs= - =pdfcrop= - =pdftk= *** PDF to PNG #+begin_src bash 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 } #+end_src *** PDF to SVG #+begin_src bash 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 } #+end_src *** PDF Reduce Size #+begin_src bash 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 } #+end_src *** PDF Trim #+begin_src bash pdftrim_function() { \ if command -v pdfcrop &> /dev/null; then pdfcrop "$filename_with_extension" "$filename_with_extension" fi } #+end_src *** PDF Extract Pages #+begin_src bash 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 } #+end_src *** Delete First Page #+begin_src bash 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 } #+end_src *** Remove Annotations #+begin_src bash 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 } #+end_src *** Main function #+begin_src bash # 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 } #+end_src ** DVI files List of useful programs: - =dvisvgm= - =dvipng= *** DVI to PNG #+begin_src bash dvi2png_function() { \ if command -v dvipng &> /dev/null; then dvipng "$filename_with_extension" fi } #+end_src *** DVI to SVG #+begin_src bash dvi2svg_function() { \ if command -v dvisvgm &> /dev/null; then dvisvgm "$filename_with_extension" -o "$filename_without_extension.svg" fi } #+end_src *** Main function #+begin_src bash # 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 } #+end_src ** DOCX/PTTX files *** DOC to PDF #+begin_src bash doc2pdf_function() { \ if command -v lowriter &> /dev/null; then lowriter --convert-to pdf "$filename_with_extension" fi } #+end_src *** Main function #+begin_src bash # 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 } #+end_src ** GIF files *** GIF to PNG #+begin_src bash gif2png_function() { \ if command -v convert &> /dev/null; then convert -coalesce "$filename_with_extension" "$filename_without_extension.png" fi } #+end_src *** GIF to mp4 #+begin_src bash gif2mp4_function() { \ if command -v ffmpeg &> /dev/null; then loop_num=$(rofi -dmenu -p "Number of loops") ffmpeg -stream_loop $loop_num -i $filename_with_extension -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" "$filename_without_extension.mp4" fi } #+end_src *** Main function #+begin_src bash # Convert GIF Files gif2() { \ out_ext=$(echo -e "png\nmp4" | rofi -i -dmenu -p "Convert GIF to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "png") gif2png_function ;; "mp4") gif2mp4_function ;; esac } #+end_src ** PNG files *** PNG to PDF #+begin_src bash png2pdf_function() { \ if command -v convert &> /dev/null; then convert "$filename_with_extension" "$filename_without_extension.pdf" fi } #+end_src *** PNG to JPG #+begin_src bash png2jpg_function() { \ if command -v convert &> /dev/null; then convert "$filename_with_extension" "$filename_without_extension.jpg" fi } #+end_src *** PNG Trim #+begin_src bash pngtrim_function() { \ if command -v convert &> /dev/null; then convert -trim "$filename_with_extension" "$filename_with_extension" fi } #+end_src *** PNG Resize #+begin_src bash 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 } #+end_src *** PNG Crop #+begin_src bash pngcrop_function() { \ if command -v cropgui &> /dev/null; then cropgui "$filename_with_extension" fi } #+end_src *** Main function #+begin_src bash # Convert PNG Files png2() { \ out_ext=$(echo -e "pdf\njpg\ntrim\nresize\ncrop" | rofi -i -dmenu -p "Convert PNG to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "pdf") png2pdf_function ;; "jpg") png2jpg_function ;; "crop") pngcrop_function ;; "trim") pngtrim_function ;; "resize") pngresize_function ;; esac } #+end_src ** JPG files *** JPG to PDF #+begin_src bash jpg2pdf_function() { \ if command -v convert &> /dev/null; then convert "$filename_with_extension" "$filename_without_extension.pdf" fi } #+end_src *** JPG to PNG #+begin_src bash jpg2png_function() { \ if command -v convert &> /dev/null; then convert "$filename_with_extension" "$filename_without_extension.png" fi } #+end_src *** JPG Resize #+begin_src bash 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 } #+end_src *** JPG Rotate #+begin_src bash jpgrotate_function() { \ if command -v convert &> /dev/null; then # convert "$filename_with_extension" -rotate 90 /tmp/output.jpg && mv /tmp/output.jpg "$filename_with_extension" convert "$filename_with_extension" -rotate 90 "$filename_with_extension" fi } #+end_src *** JPG Trim #+begin_src bash jpgtrim_function() { \ if command -v convert &> /dev/null; then convert -trim "$filename_with_extension" "$filename_with_extension" fi } #+end_src *** JPG Crop #+begin_src bash jpgcrop_function() { \ if command -v cropgui &> /dev/null; then cropgui "$filename_with_extension" fi } #+end_src *** Main function #+begin_src bash # Convert JPG Files jpg2() { \ out_ext=$(echo -e "pdf\npng\nresize\ncrop\ntrim\nrotate" | rofi -i -dmenu -p "Convert JPG to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "pdf") jpg2pdf_function ;; "png") jpg2png_function ;; "resize") jpgresize_function ;; "crop") jpgcrop_function ;; "trim") jpgtrim_function ;; "rotate") jpgrotate_function ;; esac } #+end_src ** XOPP files *** XOPP to PDF #+begin_src bash xopp2pdf_function() { \ if command -v xournalpp &> /dev/null; then xournalpp -p "$filename_without_extension.pdf" "$filename_with_extension" fi } #+end_src *** Main function #+begin_src bash # Convert XOPP Files xopp2() { \ out_ext=$(echo -e "pdf" | rofi -i -dmenu -p "Convert XOPP to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "pdf") xopp2pdf_function ;; esac } #+end_src ** MP4 files *** MP4 to GIF #+begin_src bash 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 } #+end_src *** MP4 remove sound #+begin_src bash mp4nosound_function() { \ if command -v ffmpeg &> /dev/null; then ffmpeg -i "$filename_with_extension" -c copy -an "$filename_without_extension-nosound.mp4" fi } #+end_src *** Main function #+begin_src bash # Convert MP4 Files mp42() { \ out_ext=$(echo -e "gif\nremove sound" | rofi -i -dmenu -p "Convert MP4 to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "gif") mp42gif_function ;; "remove sound") mp4nosound_function ;; esac } #+end_src ** Case statement #+begin_src bash case "$in_ext" in "svg") svg2 ;; "gif") gif2 ;; "dvi") dvi2 ;; "pdf") pdf2 ;; "mp4") mp42 ;; "png") png2 ;; "jpg") jpg2 ;; "jpeg") jpg2 ;; "docx") docx2 ;; "pptx") docx2 ;; "xopp") xopp2 ;; esac #+end_src * =preview-file= - Preview any file :PROPERTIES: :CUSTOM_ID: preview-file :header-args: :tangle ~/.local/bin/preview-file :END: ** Get basic information about the file #+begin_src bash # 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%.*} #+end_src ** SVG files #+begin_src bash # Convert SVG Files svg2() { \ if command -v inkscape &> /dev/null; then inkscape --export-type="$out_ext" "$filename_with_extension" --export-filename="/tmp/$filename_without_extension.pdf" && zathura "/tmp/$filename_without_extension.pdf" fi } #+end_src ** DOCX files #+begin_src bash # Convert DOCX/PPTX Files docx2() { \ if command -v lowriter &> /dev/null; then lowriter --convert-to pdf "$filename_with_extension" --outdir /tmp/ && zathura "/tmp/$filename_without_extension.pdf" fi } #+end_src ** Case statement #+begin_src bash 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 #+end_src * =pass-gen= - Generate Random Alphanumeric Password :PROPERTIES: :CUSTOM_ID: pass-gen :END: #+begin_src bash :tangle ~/.local/bin/pass-gen # 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' #+end_src * =sxhkd-help= - List of keybindings using Rofi :PROPERTIES: :CUSTOM_ID: sxhkd-help :END: #+begin_src bash :tangle ~/.local/bin/sxhkd-help awk '/^[a-z]/ && last {print "",$0,"\t",last,""} {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 #+end_src * =qrdecode= - Decode QRcode by taking screenshot To install: #+begin_src bash :tangle no paru -S zbar maim xclip dunstify #+end_src #+begin_src bash :tangle ~/.local/bin/qrdecode image_file="/tmp/ocr.png" # Take screenshot by selecting the area maim -s "$image_file" # Get the exit code of the previous command. # So in this case, it is the screenshot command. If it did not exit with an # exit code 0, then it means the user canceled the process of taking a # screenshot by doing something like pressing the escape key status=$? # If the user pressed the escape key or did something to terminate the proccess # taking a screenshot, then just exit [ $status -ne 0 ] && exit 1 # Use zbarimg to decode the text from the QR code decoded_text=$(zbarimg "$image_file" -q --raw) if [ -z "$decoded_text" ]; then notify-send "qrshot" "no text was detected" rm $image_file && exit 1 fi # Copy text to clipboard printf %b "$decoded_text" | xclip -selection clip # Let us know that something was decoded dunstify "qrshot" "$decoded_text" # Cleaning up the trash that was left behind rm $image_file #+end_src