Files
literate-dotfiles/binaries.org

1482 lines
37 KiB
Org Mode

#+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
* =get-otp=
#+begin_src bash :tangle ~/.local/bin/get-otp
passname=$(ls ~/.local/share/pass/totp-* | xargs -n 1 basename | sed -e 's/\..*$//' | rofi -p "TOPT" -dmenu)
if [ -n "$passname" ]; then
otpnumber=`pass otp $passname`
echo $otpnumber | xsel -i
dunstify 'OTP' "$otpnumber" &
fi
#+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")" && nsxiv -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..."
~/.local/soft/mopidy-jellyfin/env/bin/mopidy -v >/tmp/mopidy.log 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 nsxiv > /dev/null 2>&1; then
address+=".png"
wget -qO- "$address" > /tmp/weather.png && \
nsxiv -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 JPG
#+begin_src bash
svg2jpg_function() { \
if command -v inkscape &> /dev/null; then
inkscape --export-type="png" --export-filename=- --export-dpi=500 --export-area-drawing "$filename_with_extension" | convert - "$filename_without_extension.jpg"
fi
}
#+end_src
*** 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
*** SVG to EMF
#+begin_src bash
svg2emf_function() { \
if command -v inkscape &> /dev/null; then
inkscape --export-type="emf" --export-filename="$filename_without_extension.emf" "$filename_with_extension"
fi
}
#+end_src
*** Main function
#+begin_src bash
# Convert SVG Files
svg2() { \
out_ext=$(echo -e "pdf\njpg\npng\nemf" | rofi -i -dmenu -p "Convert SVG to")
if [ -z "$out_ext" ]; then
exit;
fi
case "$out_ext" in
"jpg")
svg2jpg_function
;;
"png")
svg2png_function
;;
"pdf")
svg2pdf_function
;;
"emf")
svg2emf_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=500 --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 to EMF
#+begin_src bash
pdf2emf_function() { \
if command -v inkscape &> /dev/null; then
inkscape --export-type="emf" --export-filename="$filename_without_extension.emf" "$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
*** Rasterize
#+begin_src bash
pdf_rasterize_function() { \
if command -v convert &> /dev/null; then
convert -density 600 +antialias "$filename_with_extension" /tmp/pdf_rasterized.pdf && \
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$filename_without_extension.red.pdf" /tmp/pdf_rasterized.pdf
fi
}
#+end_src
*** Main function
#+begin_src bash
# Convert PDF Files
pdf2() { \
out_ext=$(echo -e "svg\npng\nemf\nreduce size\ntrim\nextract pages\ndelete first page\nrasterize\nremove annotations" | rofi -i -dmenu -p "Convert PDF to")
if [ -z "$out_ext" ]; then
exit;
fi
case "$out_ext" in
"svg")
pdf2svg_function
;;
"emf")
pdf2emf_function
;;
"png")
pdf2png_function
;;
"reduce size")
pdfreduce_function
;;
"trim")
pdftrim_function
;;
"extract pages")
pdfextract_function
;;
"delete first page")
pdf_delete_first_page_function
;;
"rasterize")
pdf_rasterize_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:")
# Check if size_px is indeed a number
re='^[0-9]+$'
if [[ $size_px =~ $re ]] ; then
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
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:")
# Check if size_px is indeed a number
re='^[0-9]+$'
if [[ $size_px =~ $re ]] ; then
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
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 Horizontal Flip
#+begin_src bash
jpgfliphor_function() { \
if command -v convert &> /dev/null; then
convert -flop "$filename_with_extension" "$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\nflip" | 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
;;
"flip")
jpgfliphor_function
;;
esac
}
#+end_src
** BMP files
*** BMP to PNG
#+begin_src bash
bmp2png_function() { \
if command -v convert &> /dev/null; then
convert "$filename_with_extension" "$filename_without_extension.png"
fi
}
#+end_src
*** Main function
#+begin_src bash
# Convert BMP Files
bmp2() { \
out_ext=$(echo -e "png" | rofi -i -dmenu -p "Convert BMP to")
if [ -z "$out_ext" ]; then
exit;
fi
case "$out_ext" in
"png")
bmp2png_function
;;
esac
}
#+end_src
** WEBP files
*** WEBP to PNG
#+begin_src bash
webp2png_function() { \
if command -v convert &> /dev/null; then
convert "$filename_with_extension" "$filename_without_extension.png"
fi
}
#+end_src
*** Main function
#+begin_src bash
# Convert WEBP Files
webp2() { \
out_ext=$(echo -e "png" | rofi -i -dmenu -p "Convert WEBP to")
if [ -z "$out_ext" ]; then
exit;
fi
case "$out_ext" in
"png")
webp2png_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 AVI (powerpoint)
#+begin_src bash
mp42avi_powerpoint_function() { \
if command -v ffmpeg &> /dev/null; then
ffmpeg -v warning -i "$filename_with_extension" -q:a 2 -q:v 4 -vcodec wmv2 -an -y "$filename_without_extension.avi"
fi
}
#+end_src
*** 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 to GIF Loop
#+begin_src bash
mp42gifloop_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 -i "$filename_with_extension" -filter_complex "[0]reverse[r];[0][r]concat=n=2:v=1:a=0,split[s0][s1];[s0]palettegen[p];[s1][p]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\ngif loop\nremove sound\navi" | rofi -i -dmenu -p "Convert MP4 to")
if [ -z "$out_ext" ]; then
exit;
fi
case "$out_ext" in
"gif")
mp42gif_function
;;
"gif loop")
mp42gifloop_function
;;
"avi")
mp42avi_powerpoint_function
;;
"remove sound")
mp4nosound_function
;;
esac
}
#+end_src
** AVI files
*** Crop AVI
#+begin_src bash
avi2crop_function() { \
if command -v ffmpeg &> /dev/null; then
cropvalue=$(ffmpeg -i "$filename_with_extension" -frames:v 3 -vf "negate,cropdetect=limit=0:round=2" -f null - 2>&1 | awk '/crop/ { print $NF }' | tail -1)
# Step 2: Apply crop
if [ -n "$cropvalue" ]; then
ffmpeg -i "$filename_with_extension" -q:a 2 -q:v 4 -vcodec wmv2 -an -y -vf "$cropvalue" "${filename_without_extension}_crop.avi"
else
echo "Could not detect crop value."
fi
fi
}
#+end_src
*** AVI to MP4
#+begin_src bash
avi2mp4_function() { \
if command -v ffmpeg &> /dev/null; then
ffmpeg -i "$filename_with_extension" -c:v copy -c:a copy "$filename_without_extension.mp4"
fi
}
#+end_src
*** AVI to GIF
#+begin_src bash
avi2gif_function() { \
if command -v ffmpeg &> /dev/null; then
palette="/tmp/palette.png"
mp4tmp="/tmp/avi2gif.mp4"
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
ffmpeg -i "$filename_with_extension" -c:v copy -c:a copy -y "$mp4tmp"
# Generate optimal pallette of colors
ffmpeg -v warning -i "$mp4tmp" -vf "$filters,palettegen" -y $palette
# Convert
ffmpeg -v warning -i "$mp4tmp" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$filename_without_extension.gif"
fi
}
#+end_src
*** AVI to GIF loop
#+begin_src bash
avi2gifloop_function() { \
if command -v ffmpeg &> /dev/null; then
palette="/tmp/palette.png"
mp4tmp="/tmp/avi2gif.mp4"
ffmpeg -i "$filename_with_extension" -c:v copy -c:a copy -y "$mp4tmp"
ffmpeg -i "$filename_with_extension" -filter_complex "[0]reverse[r];[0][r]concat=n=2:v=1:a=0,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -y "$filename_without_extension.gif"
fi
}
#+end_src
*** Main function
#+begin_src bash
# Convert AVI Files
avi2() { \
out_ext=$(echo -e "gif\ngif loop\nmp4\ncrop" | rofi -i -dmenu -p "Convert AVI to")
if [ -z "$out_ext" ]; then
exit;
fi
case "$out_ext" in
"gif")
avi2gif_function
;;
"gif loop")
avi2gifloop_function
;;
"mp4")
avi2mp4_function
;;
"crop")
avi2crop_function
;;
esac
}
#+end_src
** Case statement
#+begin_src bash
case "$in_ext" in
"svg")
svg2
;;
"gif")
gif2
;;
"dvi")
dvi2
;;
"pdf")
pdf2
;;
"avi")
avi2
;;
"mp4")
mp42
;;
"png")
png2
;;
"jpg")
jpg2
;;
"jpeg")
jpg2
;;
"docx")
docx2
;;
"webp")
webp2
;;
"bmp")
bmp2
;;
"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 "<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
#+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