nix-configs

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

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 }