rendered paste body#!/usr/bin/python -OOimport os.pathimport sysimport mutagen.easyid3import mutagen.id3import mutagen.mp4import mutagen.flacif len(sys.argv) < 3: print 'USAGE: %s [root source dir] [destination dir]' % sys.argv[0] raise SystemExitsrc, dest = sys.argv[1:]if not os.path.exists(src): print 'ERROR: Source dir %s does not exist.' % src raise SystemExitif not os.path.exists(dest): print 'Creating destination dir `%s`.' % dest os.makedirs(dest)def flac(fname): info = dict(mutagen.flac.Open(fname)) info['tracknumber'] = int(info.get('tracknumber', ['0/0'])[0].split('/')[0]) return infodef mp3(fname): info = dict(mutagen.easyid3.Open(fname)) info['tracknumber'] = int(info.get('tracknumber', ['0/0'])[0].split('/')[0]) return infodef m4a(fname): info = dict(mutagen.mp4.Open(fname)) info = { 'tracknumber': info.get('trkn', [(0,0)])[0][0], 'title': info.get(r'\xa9nam', 'Unknown Title'), 'artist': info.get(r'\xa9ART', 'Unknown Artist'), 'album': info.get(r'\xa9alb', 'Unknown Album') } return infohandlers = { 'flac': flac, 'mp3': mp3, 'm4a': m4a, 'm4p': m4a }for root,dirs,files in os.walk(src): for file in files: fullpath = os.path.join(root, file) ext = file.split('.')[-1] try: tags = handlers.get(ext, lambda x:'')(fullpath) if tags != '': val = lambda x,y : tags.get(x, [y])[0].strip() artist = val('artist', 'Unknown Artist') album = val('album', 'Unknown Album') title = val('title', 'Unknown Track') tracknumber = '%.2d' % tags.get('tracknumber', 0) #title() Capitalizes Strings Like This artist = artist.title() album = album.title() dir = os.path.join(dest, artist, album) if not os.path.exists(dir): os.makedirs(dir) endfile = os.path.join(dir, '%s - %s.%s' % (tracknumber, title.replace('/',''), ext)) if not os.path.exists(endfile): try: os.popen(u'ln "%s" "%s"' % (fullpath, endfile)) except: print fullpath, endfile, ':(' except mutagen.id3.ID3NoHeaderError, KeyError: #error loading tags pass