349 lines
8.3 KiB
Bash
Executable File
349 lines
8.3 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 feh xdotool)
|
|
|
|
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/downloads-furry
|
|
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
|
|
|
|
ignore_paths=("artists" "kinks" "ideas" "irl")
|
|
find_command="find * -type d"
|
|
|
|
for path in "${ignore_paths[@]}"; do
|
|
find_command+=" -not -path $path"
|
|
done
|
|
|
|
existing_folders=($(eval $find_command))
|
|
|
|
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"
|
|
}
|
|
|
|
should_colored_output=true
|
|
|
|
if $should_colored_output; then
|
|
# Define color codes for up to 6 levels
|
|
color_reset="\033[0m"
|
|
color_level_1="\033[1;34m" # Blue for the first level
|
|
color_level_2="\033[1;32m" # Green for the second level
|
|
color_level_3="\033[1;36m" # Cyan for the third level
|
|
color_level_4="\033[1;33m" # Yellow for the fourth level
|
|
color_level_5="\033[1;35m" # Magenta for the fifth level
|
|
color_level_6="\033[1;31m" # Red for the sixth level
|
|
|
|
# Array of colors to apply to subfolder levels
|
|
colors=("$color_level_1" "$color_level_2" "$color_level_3" "$color_level_4" "$color_level_5" "$color_level_6")
|
|
|
|
if [ -z "$selected_folder" ]; then
|
|
printf "\n"
|
|
echo "[INFO] Folders:"
|
|
for ((i = 0; i < ${#existing_folders[@]}; i++)); do
|
|
foldername=${existing_folders[$i]}
|
|
|
|
# Split the foldername by slashes and color each part
|
|
IFS='/' read -ra parts <<<"$foldername"
|
|
colored_foldername="${colors[0]}${parts[0]}${color_reset}"
|
|
for j in "${!parts[@]}"; do
|
|
if [ $j -gt 0 ]; then
|
|
# Apply colors cyclically based on the depth level
|
|
color_index=$((j % ${#colors[@]}))
|
|
colored_foldername+="/${colors[$color_index]}${parts[$j]}${color_reset}"
|
|
fi
|
|
done
|
|
|
|
echo -e " $i) $colored_foldername" # Use -e flag for echo
|
|
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
|
|
else
|
|
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
|
|
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=()
|
|
files_count=${#files[@]}
|
|
for ((i = 0; i < files_count; )); do
|
|
file="${files[$i]}"
|
|
file="${file#./}"
|
|
|
|
echo ""
|
|
echo "($((i + 1))/${files_count}) 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
|