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