So I was trying to get my pc laptop setup for fudcon which meant a triple boot setup between windows, ubuntu and fedora. I had some troubles importing various important information about my music within iTunes.
Here is a script to remove duplicate songs in an iTunes folder:
import hashlib
import os
import re
import sys
def hash(fnam):
fobj = open(fnam, "r")
hobj = hashlib.sha256()
while (1):
data = fobj.read(2**20)
if (not data):
break
hobj.update(data)
return hobj.hexdigest()
fdic = {}
while (1):
file = sys.stdin.readline()
if (not file):
break
file = file.strip()
uniq = hash(file)
if (uniq in fdic.keys()):
print("removing:",file)
os.unlink(file)
else:
print("found:",file)
fdic[uniq] = file
This script attempts to merge an old iTunes library xml file with a newly imported one. The result is a merged iTunes library xml file that can then be re-imported into iTunes thus restoring some various meta-data about your music. Note: Before you re-import the merged xml playlist file, make sure you delete the current one and disable the check-box stating to copy songs into the media folder.
import os
import re
import sys
if (len(sys.argv) < 3):
print("Usage: %s <source> <merge>" % (sys.argv[0]))
sys.exit(0)
def outp(ordr, dict, line):
for item in ordr:
sys.stdout.write(dict[item][1])
sys.stdout.write(line)
sys.stdout.flush()
def xmlr(fnam, sdic={}):
alen = len(sys.argv)
slen = len(sdic.keys())
xord = []; xdic = {}
xobj = open(fnam, "r")
xdat = {}
while (1):
xlin = xobj.readline()
if (not xlin):
break
slin = xlin.strip("\0\t\r\n ")
xreg = re.match("^<key>([^<]+)</key>(<[^>]+>[^<]+<[^>]+>)$", slin)
try:
xkey = (xdic["Artist"][0] + xdic["Album"][0] + xdic["Name"][0])
except:
xkey = ""
if (slin == "<dict>"):
if (slen > 0):
outp(xord, xdic, xlin)
xord = []; xdic = {}
elif (xreg):
if (xreg.group(1) not in xord):
xord.append(xreg.group(1))
xdic[xreg.group(1)] = [xreg.group(2), xlin]
elif (slin == "</dict>"):
if (slen < 1):
xdat[xkey] = xdic
else:
for x in range(3, alen):
try:
xdic[sys.argv[x]] = sdic[xkey][sys.argv[x]]
if (sys.argv[x] not in xord):
xord.append(sys.argv[x])
except:
#print("error:",sys.exc_info())
pass
outp(xord, xdic, xlin)
xord = []; xdic = {}
else:
if (slen > 0):
outp(xord, xdic, xlin)
xord = []; xdic = {}
return xdat
sdat = xmlr(sys.argv[1])
ddat = xmlr(sys.argv[2], sdic=sdat)
Here’s an example of how to use the command:
python.exe /cygdrive/c/Users/jon/Desktop/itml.py /cygdrive/g/tmp/itunes/iTunes\ Music\ Library0.xml /cygdrive/g/tmp/itunes/iTunes\ Music\ Library.xml 'Date Added' 'Play Count' | unix2dos.exe | tee /cygdrive/g/tmp/itunes/iTunes\ Music\ Library2.xml && cp /cygdrive/g/tmp/itunes/iTunes\ Music\ Library2.xml /cygdrive/g/tmp/itunes/iTunes\ Music\ Library3.xml