#!/usr/bin/env bash # # Awesomeshot: A command-line screenshot tool written in bash 5.1.16+. # https://github.com/mayTermux/awesomeshot # # Copyright (c) 2021 - 2022 xShin version=1.0.1 XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-${HOME}/.config} config_file="${XDG_CONFIG_HOME}/awesomeshot/awesomeshot.conf" LC_ALL=C LANG=C # Color COLOR_DEFAULT="\e[39m" COLOR_DANGER="\e[91m" COLOR_WARNING="\e[93m" COLOR_SUCCESS="\e[92m" COLOR_SKY="\e[34m" # Awesomeshot default config read -rd '' config <<'EOF' # Make sure when your phone screenshot the result file image # PATH is same with this variable. Default my phone result file # image PATH on "/sdcard/Pictures/Screenshots". If not same, # you can edit this variable value screenshot_result_path="/sdcard/Pictures/Screenshots" # Change this value to "" or whatever for disable function backup="yes" # PATH backup original photo or screenshot path_backup="${HOME}/.config/awesomeshot/backup" # Array Hex Color hex_color=( "#F8F9FA" # white "#000000" # black "#333333" # gray "#A8D7FE" # blue sky ) # Change this value to "" or whatever for disable convert convert_rounded="yes" # Border radius border_radius=10 # Change this value to "" or whatever for disable convert convert_border="yes" # Change this value to "none" for transparent background border_color="${hex_color[0]}" border_size=15 # Shadow # Change this value to "" or whatever for disable convert convert_shadow="yes" shadow_color="${hex_color[1]}" shadow_size="75x30+0+30" # Footer # Change this value to "" or whatever for disable convert convert_footer="yes" footer_text=" Shot by Awesomeshot" footer_position="South" footer_xy="+0+45" footer_font="JetBrains-Mono-Medium-Nerd-Font-Complete" footer_font_size=25 footer_foreground="${hex_color[1]}" footer_background="none" # Convert to PNG if file not PNG convert_to_png="yes" # Open Image when convert done open_image="" EOF # init file_name file_name="" function getUserConfig() { if [ -f "${config_file}" ]; then source "${config_file}" elif [ ! -f "${config_file}" ]; then mkdir -p "${XDG_CONFIG_HOME}/awesomeshot/" printf '%s\n' "$config" > "$config_file" source "${config_file}" fi } function generateDefaultConfig() { if [ ! -f "${config_file}" ]; then if [ ! -d "~/.config/awesomeshot" ]; then mkdir ~/.config/awesomeshot fi printf '%s\n' "$config" > "$config_file" stat "SUCCESS" "Success" "Default config has been generated" exit fi if [ -f "${config_file}" ]; then read -p " Config '~/.config/awesomeshot/awesomeshot.conf' already exists, do you want to generate default config [y/N] " ask case "${ask}" in y|Y ) printf '%s\n' "$config" > "$config_file" stat "SUCCESS" "Success" "Default config has been re-generated" ;; n|N ) exit ;; esac fi } function header() { printf "\n\n %-18s\n\n" "AWESOMESHOT v${version}" } function title() { printf "\n\b\r\033[2K***${1}\n" | sed 's/*/ /g' } function subtitle() { printf "%-45s" "*******${1}" | sed 's/ /./g' | sed 's/*/ /g' } function check() { #   #    if [[ $? -eq 0 && ${PIPESTATUS[0]} -eq 0 ]]; then echo -e " ${COLOR_SUCCESS}${COLOR_DEFAULT} " else echo -e " ${COLOR_DANGER}${COLOR_DEFAULT} " fi } function autoRun() { getUserConfig count=1 header title "${COLOR_SKY}[?] WAITING TO TAKE SCREENSHOT${COLOR_DEFAULT} [${COLOR_WARNING}${count}${COLOR_DEFAULT}]" inotifywait -m -e create ${screenshot_result_path} 2> /dev/null | \ while read get_file_name_result; do get_file_name=$(echo -e "${get_file_name_result}" | awk '{print $3}') if [[ "${screenshot_result_path}/${get_file_name}" != "${file_name}" || -z ${file_name} ]]; then subtitle "[+]*Execute*Program*" file_name="${screenshot_result_path}/${get_file_name}" echo -e "" if [ "${convert_to_png}" == "yes" ]; then convertToPng "${get_file_name}" fi if [ "${backup}" == "yes" ]; then title "${COLOR_SKY}[+] BACKUP${COLOR_DEFAULT}" backupOriginalPhoto "${get_file_name}" fi title "${COLOR_SKY}[+] EDTING IMAGE${COLOR_DEFAULT}" if [ "${convert_rounded}" == "yes" ]; then convertRounded fi if [ "${convert_shadow}" == "yes" ]; then convertShadow fi if [ "${convert_border}" == "yes" ]; then convertBorder fi if [ "${convert_footer}" == "yes" ]; then convertFooter fi termux-media-scan "${file_name}" &> /dev/null termux-toast -b "${hex_color[3]}" -c "${hex_color[1]}" -g middle "${file_name} done" if [ "${open_image}" == "yes" ]; then termux-open "${file_name}" fi count=$(( ${count} + 1 )) title "${COLOR_SKY}[?] WAITING TO TAKE SCREENSHOT${COLOR_DEFAULT} [${COLOR_WARNING}${count}${COLOR_DEFAULT}]" fi done } function manualRun() { getUserConfig header title "${COLOR_SKY}[?] CHECKING FILE${COLOR_DEFAULT}" subtitle "[+]*Set*Status*File*" if [ -f ${file_name} ]; then check if [ "${convert_to_png}" == "yes" ]; then convertToPng "${get_file_name}" fi if [ "${backup}" == "yes" ]; then title "${COLOR_SKY}[+] BACKUP${COLOR_DEFAULT}" backupOriginalPhoto "${get_file_name}" fi title "${COLOR_SKY}[+] EDTING IMAGE${COLOR_DEFAULT}" if [ "${convert_rounded}" == "yes" ]; then convertRounded fi if [ "${convert_shadow}" == "yes" ]; then convertShadow fi if [ "${convert_border}" == "yes" ]; then convertBorder fi if [ "${convert_footer}" == "yes" ]; then convertFooter fi termux-media-scan "${file_name}" &> /dev/null setterm -cursor on if [ "${open_image}" == "yes" ]; then termux-open "${file_name}" fi else echo -e "\n" stat "ERROR" "Danger" "${COLOR_DANGER}${file_name}${COLOR_DEFAULT}: file not found" fi } function backupOriginalPhoto() { change_filename_backup=$(echo $1 | sed 's/.png/_backup.png/g') if [ ! -d ${path_backup} ]; then mkdir -p "${path_backup}" fi cp "${file_name}" "${path_backup}/${change_filename_backup}" if [ -f ${path_backup}/${change_filename_backup} ]; then subtitle "[+]*Backup*File*" check else subtitle "[+]*Backup*File*" check fi } function convertToPng() { title "${COLOR_SKY}[+] CONVERTING EXTENSION IMAGE${COLOR_DEFAULT}" extension="${file_name##*.}" if [ "${extension}" != "png" ]; then subtitle "[+]*Convert*.${extension}*To*.png*" convert "${file_name}" "${file_name%.*}.png" rm "${file_name}" termux-media-scan "${file_name}" &> /dev/null file_name=${file_name%.*}.png check fi } function convertRounded() { subtitle "[+]*Set*Rounded*Corner*" convert "$file_name" \ \( +clone -alpha extract -draw \ "fill black polygon 0,0,0,${border_radius} ${border_radius},0 fill white circle ${border_radius},${border_radius},${border_radius},0" \ \( +clone -flip \) -compose Multiply -composite \ \( +clone -flop \) -compose Multiply -composite \ \) \ -alpha off -compose CopyOpacity -composite "$file_name" check } function convertShadow() { subtitle "[+]*Set*Image*Shadow*" convert "$file_name" \ \( \ +clone \ -background "${shadow_color}" \ -shadow "${shadow_size}" \ \) \ +swap \ -background none \ -layers merge \ +repage "$file_name" check } function convertBorder() { subtitle "[+]*Set*Image*Border*Color*" convert "$file_name" -bordercolor "${border_color}" -border ${border_size} "$file_name" check } function convertFooter() { subtitle "[+]*Set*Image*Footer" echo -n "${footer_text}" | convert "$file_name" \ -gravity ${footer_position} \ -pointsize ${footer_font_size} \ -fill ${footer_foreground} \ -undercolor ${footer_background} \ -font ${footer_font} \ -annotate ${footer_xy} \ @- "$file_name" check } function handleInterruptByUser() { pkill com.termux echo -e " \n [ ${COLOR_WARNING}ERROR${COLOR_DEFAULT} ] > ${COLOR_DANGER}${1}${COLOR_DEFAULT}\n" setterm -cursor on read -n 1 -s -r -p " Press any key to exit " exit 1 } function stat() { if [ "${2}" == "Success" ]; then echo -e " [ ${COLOR_SUCCESS}${1}${COLOR_DEFAULT} ] > ${3}" elif [ "${2}" == "Warning" ]; then echo -e " [ ${COLOR_WARNING}${1}${COLOR_DEFAULT} ] > ${3}" elif [ "${2}" == "Danger" ]; then echo -e " [ ${COLOR_DANGER}${1}${COLOR_DEFAULT} ] > ${3}" fi } function main() { trap "handleInterruptByUser 'Interrupt By User'" 2 setterm -cursor off ${1} ${2} } function help() { echo -e " $(version) A command-line screenshot tool written in bash 5.1.16+ Usage: awesomeshot [args] [file] META OPTIONS: -h, --help Show list of command-line options -v, --version Show version of awesomeshot RUN OPTIONS: -a, --auto Run awesomeshot with automatic while take screenshot -m, --manual Run awesomeshot with manual (this option require filename) -c, --config Generate default config awesomeshot.conf " } function version() { echo -e "awesomeshot v.${version}" } case "${1}" in -a|--auto ) main autoRun ;; -c|--config ) generateDefaultConfig ;; -m|--manual ) if [ ${2} ]; then file_name="${2}" main manualRun else echo "" stat "ERROR" "Danger" "This option require filename" help exit 1 fi ;; -h|--help ) help ;; -v|--version ) version ;; *) help ;; esac