There are more elegant ways to do this but I got bored and thought I’d do something that is only done with base Mac OSX tools
#!/bin/sh # Read_iTunes_PlayList.sh # # Get only the artist list - remove duplicates # Read_iTunes_PlayList.sh 1 iTunesPlayListFileName ~/Desktop # # Get Artist and Song Name # Read_iTunes_PlayList.sh 2 iTunesPlayListFileName ~/Desktop # # Created by David Kittell on 12/27/16. # clear XMLOption=$1 XMLFileName=$2 XMLFilePath=$3 case $XMLOption in 1) # Only Get the Artist clear #echo $XMLOption #echo $XMLFileName #echo $XMLFilePath rm -rf $(echo $XMLFilePath/$XMLFileName).txt || : #echo "Parsing XML" music=`grep 'Artist' $(echo $XMLFilePath/$XMLFileName.xml) | \ sed 's/<key>Artist<\/key><string>//g'| sed 's/<\/string>//g' \ | sed 's/%20/ /g' | sort`; old_IFS=$IFS # IFS by default is space tab return, and stands for # Internal Field Separator. IFS=' ' for i in $music do `echo $i >> $(echo $XMLFilePath/$XMLFileName.txt)`; done IFS=$old_IFS cat $(echo $XMLFilePath/$XMLFileName.txt) | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' > $(echo $XMLFilePath/$XMLFileName_01.txt) sed -i -e "s|&|\&|g" $(echo $XMLFilePath/$XMLFileName_01.txt) sed -i -e "s|<|\<|g" $(echo $XMLFilePath/$XMLFileName_01.txt) sed -i -e "s|>|\>|g" $(echo $XMLFilePath/$XMLFileName_01.txt) sort $(echo $XMLFilePath/$XMLFileName_01.txt) | uniq | grep -v '<key>' > $(echo $XMLFilePath/$XMLFileName.txt) rm -f $(echo $XMLFilePath/$XMLFileName_01.txt) cat $(echo $XMLFilePath/$XMLFileName.txt) ;; 2) # Get the Artist and Song clear #echo $XMLOption #echo $XMLFileName #echo $XMLFilePath rm -rf $(echo $XMLFilePath/$XMLFileName).txt || : #echo "Parsing XML" grep -E '<key>Artist</key>|<key>Name</key>' iPhone.xml | sed 's/<key>Artist<\/key><string>/|/g'| sed 's/<\/string>//g' | sed 's/%20//g' | sed 's/<key>Name<\/key><string>/~/g'| sed 's/<\/string>//g' | sed 's/%20//g' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' | sed -e "s|&|\&|g" | sed -e "s|<|\<|g" | sed -e "s|>|\>|g" | tr '~' '\n' | sort > $(echo $XMLFilePath/$XMLFileName).txt #cat $XMLFilePath/$XMLFileName.txt #echo "Cleaning List - Start" IFS=$'\n' for next in `cat $filename` do song=$(echo $next | cut -d '|' -f1 | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') artist=$(echo $next | cut -d '|' -f2 | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') echo "$artist \t $song" >> $(echo $XMLFilePath/$XMLFileName)Filtered.txt done < $XMLFilePath/$XMLFileName.txt #echo "Cleaning List - Stop" #echo "Remove iTunes PlayList name" sed -i '' -e '$ d' $(echo $XMLFilePath/$XMLFileName)Filtered.txt #echo "Sort the results" cat $(echo $XMLFilePath/$XMLFileName)Filtered.txt | sort > $(echo $XMLFilePath/$XMLFileName).txt cat $(echo $XMLFilePath/$XMLFileName).txt ;; esac
Last Updated on March 6, 2017