audiobook-cleaner.nix (2003B)
1 { 2 pkgs, 3 domain, 4 ... 5 }: let 6 audiobook-cleaner = pkgs.writeShellScriptBin "audiobook-cleaner" '' 7 # variables 8 list_file="$HOME/vault/src/blog.${domain}/content/reading-list.md" 9 media_dir="/mnt/media/literature/audiobooks" 10 11 trim() { 12 local var="$*" 13 var="''${var#"''${var%%[![:space:]]*}"}" 14 var="''${var%"''${var##*[![:space:]]}"}" 15 echo -n "$var" 16 } 17 18 normalize() { 19 echo "$1" \ 20 | tr '[:upper:]' '[:lower:]' \ 21 | sed "s/['’\"]//g" \ 22 | sed 's/[^a-z0-9]/ /g' \ 23 | tr -s ' ' \ 24 | sed 's/^ *//;s/ *$//' 25 } 26 27 echo "Generating file list from $media_dir ..." 28 mapfile -t file_list < <(find "$media_dir" -type f) 29 30 declare -a lc_file_names 31 for i in "''${!file_list[@]}"; do 32 lc_file_names[$i]=$(normalize "$(basename "''${file_list[$i]}")") 33 done 34 35 declare -a matched_files 36 declare -a matched_info 37 38 while IFS= read -r line; do 39 author=$(cut -d'-' -f1 <<< "$line") 40 author=$(trim "$author") 41 42 title=$(cut -d'-' -f2- <<< "$line") 43 title=$(trim "$title") 44 45 lauthor=$(normalize "$author") 46 ltitle=$(normalize "$title") 47 48 for i in "''${!file_list[@]}"; do 49 lfile="''${lc_file_names[$i]}" 50 if [[ "$lfile" == *"$lauthor"* && "$lfile" == *"$ltitle"* ]]; then 51 matched_files+=("''${file_list[$i]}") 52 matched_info+=("$author - $title") 53 fi 54 done 55 56 done < <(grep -oP '(?<=<li>).*?(?=</li>)' "$list_file") 57 58 total="''${#matched_files[@]}" 59 echo "Found $total matching files." 60 61 for i in "''${!matched_files[@]}"; do 62 file="''${matched_files[$i]}" 63 info="''${matched_info[$i]}" 64 index=$((i + 1)) 65 abridged=$(echo "$file" | awk -F/ '{print $(NF-1) "/" $NF}') 66 67 echo "" 68 echo "[$index of $total] Match: $info" 69 echo "Delete file? $abridged (y/N)" 70 read -r ans </dev/tty 71 if [[ "$ans" =~ ^[Yy]$ ]]; then 72 rm "$file" && echo "Deleted $abridged" 73 else 74 echo "Skipped $abridged" 75 fi 76 done 77 ''; 78 in { 79 environment.systemPackages = [audiobook-cleaner]; 80 }