nix-configs

Personal NixOS and home-manager configuration files
Log | Files | Refs

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 }