Rename and organize music

swain

Member
Reputation
0
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()
 
Back
Top