Files
dotfiles/scripts/shell/images-indexer.sh
2024-07-08 00:00:56 -03:00

292 lines
6.9 KiB
Bash
Executable File

#!/bin/bash
show_help() {
# echo "Usage: `basename $0` [--no-abort-on-found] [--parallel] [--custom-grep-search|-c <string>]"
echo "Usage: `basename $0` [--help|-h] [--filter-mode|-f]"
echo "Options:"
echo " --help | -h (optional) Display script's help text"
echo " --filter-mode | -f (optional) The script iterate over the files of a selected folder and store the ones that should be deleted"
}
filter_mode=false
while [ "$#" -gt 0 ]; do
case "$1" in
--help|-h) show_help; exit ;;
--filter-mode|-f) filter_mode=true; shift;;
*) shift ;;
esac
done
# commands_to_check=(gallery-dl gdl.sh xdotool)
commands_to_check=(gallery-dl gdl.sh)
commands_not_found=()
for command in ${commands_to_check[@]}; do
if ! command -v "$command" &> /dev/null; then
commands_not_found+=("$command")
fi
done
if [ ${#commands_not_found[@]} -ne 0 ]; then
echo 'The following commands are necessary in order to run the script, but were not found:'
for command in ${commands_not_found[@]}; do
echo " \"$command\""
done
exit 1
fi
cur_dir=`pwd`
furry_commission_ideas_path=/mnt/e/home/documents/data-hoarding/furry-commission-ideas
furry_commission_ideas_urls_filename="urls.txt"
scripts_path=/home/cloud/repos/personal-devboot/scripts/shell
if [ ! -d $furry_commission_ideas_path ]; then
echo "[ERROR] The images folder was not found (\"$furry_commission_ideas_path\")"
exit 1
fi
if [ ! -d $scripts_path ]; then
echo "[ERROR] The scripts folder was not found (\"$scripts_path\")"
exit 1
fi
input_media_url() {
read -p "[INFO] Please inform the media's url: " media_url
echo "$media_url"
}
media_url=''
if ! $filter_mode; then
media_url=`input_media_url`
while [ -z "$media_url" ]; do
media_url=`input_media_url`
done
# remove trailing slashes
media_url=`sed 's:/*$::' <<< "$media_url"`
url_regex='(https?)://[-[:alnum:]\+&@#/%?=~_|!:,.;]*[-[:alnum:]\+&@#/%=~_|]'
if [[ ! $media_url =~ $url_regex ]]; then
echo "The URL informed is not valid."
exit 1
fi
fi
cd $furry_commission_ideas_path
existing_folders=($(find * -type d -not -path artists -not -path kinks -not -path ideas))
filtered_existing_folders=()
# removing artists folder depth 2 only
for folder in "${existing_folders[@]}"; do
if [[ ! $folder =~ ^artists/[^/]+$ ]]; then
filtered_existing_folders+=( "$folder" )
fi;
done
existing_folders=("${filtered_existing_folders[@]}")
input_create_folder() {
read -p "[INFO] Please create one: " new_foldername
echo "$new_foldername"
}
selected_folder=''
if [ -z "${existing_folders}" ]; then
echo "[INFO] There are no folders in the 'furry-commission-ideas' folder."
new_foldername=$(input_create_folder)
while [ -z "$new_foldername" ]; do
new_foldername=$(input_create_folder)
done
mkdir --parents "$new_foldername"
selected_folder="$new_foldername"
fi
input_create_folder() {
read -p "[INFO] Please informe a name for the new folder: " new_foldername
echo "$new_foldername"
}
input_select_folder() {
read -p "[INFO] Please inform the desired option: " selected_option
if [ "$selected_option" == 'n' ]; then
selected_folder=`input_create_folder`
while [ -z "$selected_folder" ]; do
selected_folder=`input_create_folder`
done
mkdir --parents "$selected_folder"
else
selected_folder=${existing_folders[$selected_option]}
fi
echo "$selected_folder"
}
if [ -z "$selected_folder" ]; then
printf "\n"
echo "[INFO] Folders:"
for ((i = 0; i < ${#existing_folders[@]}; i++)); do
foldername=${existing_folders[$i]}
echo " $i) $foldername"
done
echo " n) (create a new folder)"
printf "\n"
selected_folder=`input_select_folder`
while [ -z "$selected_folder" ]; do
selected_folder=`input_select_folder`
done
fi
cd $selected_folder
function confirm() {
while true; do
read -n 1 yn
case $yn in
[Yy]* ) return 0;;
[Nn]* ) return 1;;
[Uu]* ) return 2;;
[Cc]* ) exit;;
* ) echo "Please answer YES, NO, or CANCEL.";;
esac
done
}
escape_string() {
local input="$1"
local escaped=""
# Iterate over each character in the input string
while IFS= read -r -n1 char; do
case "$char" in
' '|'\'|'$'|'`'|'!'|'&'|'|'|';'|'<'|'>'|'"'|"'"|'*'|'?'|'['|']'|'{'|'}'|'('|')'|'#')
escaped="${escaped}\\${char}"
;;
*)
escaped="${escaped}${char}"
;;
esac
done <<< "$input"
echo "$escaped"
}
if $filter_mode; then
files=()
eval_string=''
for file in ./*; do
if [[ "$file" != *.png && "$file" != *.jpeg && "$file" != *.jpg ]]; then
continue
fi
files+=("$file")
eval_string+=$(escape_string "$file")
eval_string+=' '
done
# eval "feh --geometry 1280x1440+1280+0 --auto-zoom --scale-down $eval_string &"
eval "feh --geometry 1200x1250+1308+28 --auto-zoom --scale-down $eval_string &"
files_to_delete=()
for ((i = 0; i < ${#files[@]};)); do
file="${files[$i]}"
file="${file#./}"
echo ""
echo "File: $file"
echo -n "Should this file be deleted? (y/n): "
confirm
confirm_result=$?
should_undo=false
case $confirm_result in
0)
if [[ ! ${files_to_delete[@]} =~ $file ]]; then
files_to_delete+=("$file")
fi
;;
1)
;;
2)
if (( i - 1 < 0 )); then
echo ""
echo ""
echo "Can't undo because this is the first image"
continue
else
((i--))
xdotool search --name feh key p
files_to_delete=("${files_to_delete[@]/$file}")
continue
fi
;;
esac
xdotool search --name feh key n
((i++))
done
echo ""
pkill feh
# debug
if false; then
echo "Files to be deleted:"
for ((i = 0; i < ${#files_to_delete[@]}; i++)); do
file="${files_to_delete[$i]}"
echo " $file"
done
echo ""
exit 0
fi
for ((i = 0; i < ${#files_to_delete[@]}; i++)); do
file="${files_to_delete[$i]}"
rm "$file"
filename_escaped=$(escape_string "${file}")
sed -i "/$filename_escaped/d" urls.txt
done
else
if [ -f "$furry_commission_ideas_urls_filename" ] && grep -qE "$media_url" -i "$furry_commission_ideas_urls_filename"; then
printf "\n"
echo "[INFO] This folder already has the media informed."
echo "[INFO] Exiting..."
exit 0
fi
if ! command_output=$($scripts_path/gdl.sh $media_url); then
exit 1
fi
media_filenames=()
for ((i = 0; i < ${#command_output[@]}; i++)); do
filename=${command_output[$i]}
media_filenames+=$(basename "$filename")
done
for ((i = 0; i < ${#media_filenames[@]}; i++)); do
media_filename=${media_filenames[$i]}
echo "$media_filename: $media_url" >> $furry_commission_ideas_urls_filename
done
fi