61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.7 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
 |