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