61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
# I frequently discover that there are crappy songs hidden in my music library.
 | 
						|
# I ain't havin' none o' that! So I file them away in my 1-star.m3u playlist.
 | 
						|
# This script reads that playlist, delete those songs, and cleans up any empty
 | 
						|
# folders it leaves behind. It will also remove duplicates from all playlists.
 | 
						|
#
 | 
						|
# Usage: cleanup-music
 | 
						|
 | 
						|
set -e
 | 
						|
shopt -s nullglob
 | 
						|
 | 
						|
music_dir=$(awk '/music_directory/ { print gensub(/"/, "", "g", $2); }' "$HOME/.config/mpd/mpd.conf")
 | 
						|
music_dir="${music_dir/#\~/$HOME}"
 | 
						|
playlist_dir=$(awk '/playlist_directory/ { print gensub(/"/, "", "g", $2); }' "$HOME/.config/mpd/mpd.conf")
 | 
						|
playlist_dir="${playlist_dir/#\~/$HOME}"
 | 
						|
 | 
						|
playlist_file="${playlist_dir}/1-star.m3u"
 | 
						|
 | 
						|
# Delete designated songs
 | 
						|
IFS=$'\n'
 | 
						|
declare -a to_delete=()
 | 
						|
while read -r song; do
 | 
						|
  songpath="${music_dir}/${song}"
 | 
						|
  [[ -f $songpath ]] && to_delete+=("$songpath")
 | 
						|
done < "$playlist_file"
 | 
						|
 | 
						|
if (( ${#to_delete[@]} == 0 )); then
 | 
						|
  echo "Nothing to delete"
 | 
						|
  exit
 | 
						|
fi
 | 
						|
 | 
						|
# List songs to delete and ask for confirmation
 | 
						|
printf "Deleting %s songs:\n\n%s\n\nConfirm? (y/n) " \
 | 
						|
  "${#to_delete[@]}" \
 | 
						|
  "$(IFS=$'\n'; printf "%s" "${to_delete[*]}")"
 | 
						|
read -r confirm
 | 
						|
case $confirm in
 | 
						|
  y|Y)
 | 
						|
    echo "Deleting..."
 | 
						|
    for file in "${to_delete[@]}"; do
 | 
						|
      rm -fv "$file"
 | 
						|
    done
 | 
						|
    ;;
 | 
						|
  n|N) echo "Aborted"; exit ;;
 | 
						|
  *) echo "Invalid" ;;
 | 
						|
esac
 | 
						|
:>"$playlist_file"
 | 
						|
 | 
						|
# Remove duplicates across playlists
 | 
						|
for playlist in ${playlist_dir}/*.m3u; do
 | 
						|
  awk '!seen[$0]++' "${playlist}" > "${playlist}.tmp"
 | 
						|
  if [[ -f "${playlist}.tmp" ]]; then
 | 
						|
    rm -f "$playlist"
 | 
						|
    mv "${playlist}.tmp" "$playlist"
 | 
						|
  fi
 | 
						|
done
 | 
						|
 | 
						|
# Remove empty directories
 | 
						|
find "$music_dir" -type d -empty -delete
 |