Code:
'''
@author: swain
'''
import argparse
import os
import re
import shutil
from mutagen.easyid3 import EasyID3
from mutagen.easymp4 import EasyMP4
import string
# mp3_ext_re = re.compile(r"\.(mp3)|(.m4a)$",re.IGNORECASE)
mp3_ext_re = re.compile(r"\.(mp3)$",re.IGNORECASE)
mp4_ext_re = re.compile(r"\.(m4a)|(mp4)|(m4b)$",re.IGNORECASE) #
def processFiles(sourcedir,destdir):
for root, dirs, files in os.walk(sourcedir):
processMusicFiles(root,files,destdir)
def getFirstWithDefault(list,default):
if list != None:
return list[0]
return default
valid_chars = " -_.%s%s" % (string.ascii_letters, string.digits)
def cleanName(map,key):
if not map.has_key(key):
name = "unknown"
else:
name = getFirstWithDefault(map[key], "unknown").replace(" ","_").lower()
name = name.replace("&","_and_")
return ''.join(c for c in name if c in valid_chars)
def processMusicFiles(rootdir,files,destdir):
if not os.path.exists(destdir):
os.makedirs(destdir)
for f in files:
if mp3_ext_re.search(f) == None and mp4_ext_re.search(f) == None:
pass
else:
try:
filename = rootdir + os.path.sep + f
extension = os.path.splitext(filename)[1].lower()
if mp3_ext_re.search(f) != None:
audio = EasyID3(filename)
else:
audio = EasyMP4(filename)
album = cleanName(audio,"album")
performer = cleanName(audio,"performer")
artist = cleanName(audio,"artist")
title = cleanName(audio,"title")
# genre = cleanName(audio,"genre")
composer = cleanName(audio,"composer")
# org = cleanName(audio,"organization")
# date = cleanName(audio,"date")
track = cleanName(audio,"tracknumber")
outputfilename = artist + "-" + title + "-" + track + extension
outputdir = os.path.join(destdir,artist,album)
fulloutputpath = os.path.normpath(os.path.join(outputdir,outputfilename))
fulloutputpath = fulloutputpath.replace("_-_","_")
fulloutputpath = fulloutputpath.replace("--","-")
fulloutputpath = fulloutputpath.replace("___","_")
fulloutputpath = fulloutputpath.replace("__","_")
if not os.path.exists(outputdir):
os.makedirs(outputdir)
print "mv " + filename + " " + fulloutputpath
shutil.move(filename, fulloutputpath)
except:
pass
def main():
parser = argparse.ArgumentParser(description='FixMyMusic - organize all your music files')
parser.add_argument('--sourceDir', action="store", dest='sourceDir', default=None)
parser.add_argument('--destDir', action="store", dest='destDir', default = None)
options = parser.parse_args()
if options.sourceDir == None or options.destDir == None:
parser.print_usage()
parser.exit(-1, "Missing arguments, both arguments required\n")
processFiles(options.sourceDir, options.destDir)
if __name__ == "__main__":
main()