MP3 tagrenamer.py

akx 02.02.08 23:02

http://mureakuha.com/koodikirjasto/1057 luettuani muistin että tein itsekin samankaltaisen. python tagrenamer.py -f "Järjestellyt\(album)\(artist)\(title)" sekomusat\*.mp3 esimerkiksi. (Suosittelen käyttämään dry-runia ennen oikeaa ajoa.)

 Tekstiversio  Arvo: 1 (1 ääntä)  Äänestä: +  -
import eyeD3,optparse,os,sys,glob,re
def log(s,*e):
        if op.verbose:
                print s%e

rre=re.compile(r"\{(?P<pre>[^(]*)\((?P<var>[^)]+)\)(?P<suf>[^}]*)\}")

fieldmap={
                "artist":"getArtist",
                "track":"getTrackNum",
                "title":"getTitle",
                "album":"getAlbum"
        }
       

def replacer(m):
        vs=m.groupdict()
        prefix,var,suffix=vs['pre'],vs['var'],vs['suf']
        if var.startswith("!"):
                negate=True
                var=var[1:]
        else:
                negate=False
        if "|" in var:
                var,fmt=var.split("|",2)
        else:
                fmt=None
       
        if var in fieldmap:
                val=getattr(currentTag,fieldmap[var])()
        else:
                try:
                        val=currentTag.frames[var]
                except:
                        val=None
        if type(val)==tuple:
                val=val[0]

        if val==None or val==u'' or val=='':
                exist=False
        else:
                exist=True
        if not exist:
                if negate:
                        return prefix+suffix
                return ""
        else:
                if fmt:
                        val=fmt%val
                else:
                        val=val
                try:
                        val=val.encode("iso-8859-1")
                except:
                        pass
                return prefix+val+suffix

forbidden="/&\\"
def delforbidden(s,repl=" "):
        for c in forbidden:
                s=s.replace(c,repl)
        while "  " in s:
                s=s.replace("  "," ")
        return s


parser=optparse.OptionParser()
parser.add_option("-f","--format",dest="format",default="{(track|%02d) }{(artist) - }{(title)}",help="Sets the format to rename the files to. Default: %default")
parser.add_option("-d","--dry-run",action="store_true",dest="dry",default=False)
parser.add_option("-v","--verbose",action="store_true",dest="verbose",default=False)
op,ar=parser.parse_args()
if len(ar)==0:
        parser.error("No files specified.")
for mask in ar:
        if os.path.exists(mask):
                files=[mask]
        else:
                files=glob.glob(mask)
                log("Mask %s yielded %d files",mask,len(files))
        for f in files:
                log("Processing file %s...",f)
                tag=eyeD3.Tag()
                tag.link(f)
                if len(tag.frames)==0:
                        log("No frames, skipping file")
                else:
                        s=op.format
                        currentTag=tag
                        s=delforbidden(rre.sub(replacer,s)).strip()     
                        dirname,filename=os.path.split(f)
                        cn,cex=os.path.splitext(os.path.basename(f))
                        #log("%s --> %s",cn,s)
                        if cn!=s:
                                newname=os.path.join(dirname,s+cex)
                                log("Renaming %s to %s...",f,newname)
                                if not op.dry:
                                        os.rename(f,newname)
                                else:
                                        log("Dry run, no action performed")
                        else:
                                log("File already named per format")

akx 23:18 2.2.08 
Muoks: Tuosta näyttää nykyisellään vielä puuttuvan hakemistojen luonti. os.makedirs(dirname) oikeaan paikkaan auttanee.