#!/bin/bash show_help() { # echo "Usage: `basename $0` [--no-abort-on-found] [--parallel] [--custom-grep-search|-c ]" 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/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