def __init__(self, _filename): self.filename = _filename self.basename = path.basename(_filename) tag = Tag() tag.link(self.filename) for t in DESIRED_TAGS: # e.g: self.tags['Artist'] = tag.getArtist() if t == 'Genre': self.tags[t] = tag.getGenre().getName() if tag.getGenre() else "Unknown Genre" elif t == 'TrackNum' or t == 'DiscNum': self.tags[t] = eval('tag.get%s()' % t)[0] # Tuple: (TrackNum, TotalTracks) else: self.tags[t] = eval('tag.get%s()' % t) # by default the new tags are the same as the old ones self.new_tags = copy(self.tags.copy)
class MusicFile: def __init__(self, filename = None): self.t = Tag() if filename: self.open(filename) def open(self, filename): if not isinstance(filename, unicode): filename = filename.decode(detect(filename)['encoding']) self.t.link(filename) self.filename = filename def __getattr__(self, name): if name == 'album': return self.t.getAlbum() elif name == 'artist': return self.t.getArtist() elif name == 'comment': return self.t.getComment() elif name == 'comments': return self.t.getComments() elif name == 'disc': return self.t.getDiscNum() elif name == 'genre': return self.t.getGenre() elif name == 'images': return self.t.getImages() elif name == 'lyric': return self.t.getLyrics()[0] elif name == 'playcount': return self.t.getPlayCount() elif name == 'publisher': return self.t.getPublisher() elif name == 'title': return self.t.getTitle() elif name == 'track': return self.t.getTrackNum() elif name == 'ver': return self.t.getVersionStr() elif name == 'year': return self.t.getYear() else: raise NameError def __repr__(self): return self.filename.encode(Encoding) def getNewname(self, pattern): if not isinstance(pattern, unicode): pattern = pattern.decode(detect(pattern)['encoding']) newname = pattern for match in re.compile('(#\\((title|album|artist|track|genre)(:(\\d*))?\\))').finditer(newname): newname = newname.replace(match.group(), self.__getattr__(match.groups()[1]) [:int(match.groups()[3]) if match.groups()[3] else None] ) return reduce(lambda s, x: s.replace(x, ''), [newname, '/', ':', '*', '?', '"', '<', '>', '|']) def rename(self, pattern): newname = self.getNewname() newpath = dirname(self.filename) + newname + '.' + self.filename.split('.')[-1] os.rename(self.filename, newpath.encode(Encoding)) self.open(newpath.encode(Encoding)) return self
tposHeader = FrameHeader(tag.header) tposHeader.id = "TPOS" tpos = TextFrame(tposHeader) tpos.text = "%d/%d" % discMeta.discNumber tag.frames.append(tpos) # Also update the TRCK to be in x/y format tag.frames["TRCK"][0].text = "%d/%d" % (trackNum, len(discMeta.tracks)) needsUpdate = True if discMeta.releaseDate and not tag.getDate(): print "Setting release year" tag.setDate(discMeta.releaseDate) needsUpdate = True if hasattr(discMeta, "genre") and discMeta.genre and not tag.getGenre(): print "Setting genre" tag.setGenre(discMeta.genre) needsUpdate = True if needsUpdate: try: tag.setTextEncoding(UTF_8_ENCODING) tag.update() except: print "FAILED first time -- trying again" try: sleep(1.0) tag.update() except: print "MEGA FAIL!"
tpos = TextFrame(tposHeader) tpos.text = "%d/%d" % discMeta.discNumber tag.frames.append(tpos) # Also update the TRCK to be in x/y format tag.frames["TRCK"][0].text = "%d/%d" % ( trackNum, len(discMeta.tracks)) needsUpdate = True if discMeta.releaseDate and not tag.getDate(): print "Setting release year" tag.setDate(discMeta.releaseDate) needsUpdate = True if hasattr(discMeta, "genre") and discMeta.genre and not tag.getGenre(): print "Setting genre" tag.setGenre(discMeta.genre) needsUpdate = True if needsUpdate: try: tag.setTextEncoding(UTF_8_ENCODING) tag.update() except: print "FAILED first time -- trying again" try: sleep(1.0) tag.update() except: print "MEGA FAIL!"
print "Updating TSO2 fields" tpe2Header = FrameHeader(tag.header) tpe2Header.id = "TSO2" tpe2 = TextFrame(tpe2Header) tpe2.text = discMeta.artistSort tag.frames.append(tpe2) needsUpdate = True except: print "SOMETHING WENT BAD :(" if discMeta.releaseDate and not tag.getDate(): print "Setting release year" tag.setDate(discMeta.releaseDate) needsUpdate = True if hasattr(discMeta, "genre") and discMeta.genre and not tag.getGenre(): print "Setting genre" tag.setGenre(discMeta.genre) needsUpdate = True if needsUpdate: try: tag.setTextEncoding(UTF_8_ENCODING) tag.update() except: print "FAILED first time -- trying again" try: sleep(1.0) tag.update() except: print "MEGA FAIL!"