def remove_all(self): if self.backup is True: shutil.copy2(self.filename, self.output) self.filename = self.output mfile = OggVorbis(self.filename) mfile.delete() mfile.save()
def remove_metadata(self): if MUTAGEN: if "MP3" in self.__audio_codec: try: tags = ID3(self.__filepath) except ID3NoHeaderError: return tags.delete(self.__filepath, delete_v1=True, delete_v2=True) elif "ogg" in self.__gst_type: tags = OggVorbis(self.__filepath) tags.delete() elif "flac" in self.__gst_type: tags = FLAC(self.__filepath) tags.delete()
def remove_metadata(self): if MUTAGEN: if "mpeg" in self.__mime_type and "MP3" in self.__audio_codec: try: tags = ID3(self.__filepath) except ID3NoHeaderError: return tags.delete(self.__filepath, delete_v1=True, delete_v2=True) elif "ogg" in self.__mime_type: tags = OggVorbis(self.__filepath) tags.delete() elif "flac" in self.__mime_type: tags = FLAC(self.__filepath) tags.delete()
# Write the tag data for t in tag_data: if t['track_format'] == 'mp3': mp3 = MP3(t['track_fname']) mp3.delete() mp3['TPE1'] = TPE1(encoding=3, text=t['track_artist']) mp3['TALB'] = TALB(encoding=3, text=t['album']) mp3['TDRC'] = TDRC(encoding=3, text=t['year']) mp3['TRCK'] = TRCK(encoding=3, text=t['track_num']) mp3['TIT2'] = TIT2(encoding=3, text=t['track_title']) mp3.save() elif t['track_format'] == 'ogg': ogg = OggVorbis(t['track_fname']) ogg.delete() ogg['artist'] = t['track_artist'] ogg['album'] = t['album'] ogg['date'] = t['date'] ogg['year'] = t['year'] ogg['tracknumber'] = t['track_num'] ogg['title'] = t['track_title'] ogg.save() elif t['track_format'] == 'flac': flac = FLAC(t['track_fname']) flac.delete() flac['artist'] = t['track_artist'] flac['album'] = t['album']
class AudioFile: """An audio file to clean""" # TODO: make this more easily configurable. _id3_tag_whitelist = [ # This is the exact set of tags that EasyTag can manipulate. "COMM::'XXX'", # Comment 'TALB', # Album 'TCOM', # Composer 'TCON', # Genre 'TCOP', # Copyright 'TDRC', # Year 'TENC', # Encoded by 'TIT2', # Title 'TOPE', # Orig. Artist 'TPE1', # Artist 'TPE2', # Album Artist 'TPOS', # CD 'TRCK', # Track #/total tracks 'WXXX:', # URL # These tags are the important tags added by 'mp3gain -s i'. # Uncomment these to preserve ReplayGain ID3 tags. #'TXXX:replaygain_album_gain', #'TXXX:replaygain_album_peak', #'TXXX:replaygain_track_gain', #'TXXX:replaygain_track_peak', ] _ogg_tag_whitelist = [ 'album', 'albumartist', 'artist', 'comment', 'composer', 'copyright', 'date', 'description', # Dupe of comment, but filled in just the same. 'discnumber', 'encoded-by', 'genre', 'license', 'performer', 'title', 'tracknumber', 'tracktotal', ] _comment = re.compile('COMM') def __init__(self, filename, **kwargs): self.filename = filename self.id3 = None self.ape = None self.ogg = None self.quiet = kwargs.get('quiet', False) try: self.id3 = ID3(filename) except IOError: self._warn("error reading file") except ID3NoHeaderError: pass except ID3BadUnsynchData: self._warn("error parsing ID3 tag") try: self.ape = APEv2(filename) except IOError: pass except APENoHeaderError: pass try: self.ogg = OggVorbis(filename) except IOError: pass def _warn(self, message): if not self.quiet: print u"{0}: {1}".format(self.filename, message) def dirty_containers(self): """Return a list of the containers clean() will remove""" c = [] if (self.id3 or self.ogg) and self.ape: if self.ape: c.append(self.ape.__class__.__name__) if self.id3 and self.ogg: if self.ogg: c.append(self.ogg.__class__.__name__) return c def dirty_tags(self): """Return a list of tags clean() will remove""" if self.id3: return [ t for t in self.id3 if t not in AudioFile._id3_tag_whitelist ] if self.ogg: return [ t for t in self.ogg if t not in AudioFile._ogg_tag_whitelist ] def dirty(self): """Return whether the file will be modified if clean() is called""" return bool(self.dirty_containers() or self.dirty_tags()) def _clean_containers(self): cleaned = False dirty_containers = self.dirty_containers() # TODO: be less brittle. if 'APEv2' in dirty_containers: self.ape.delete() self.ape = None cleaned = True if 'OggVorbis' in dirty_containers: self.ogg.delete() self.ogg = None cleaned = True return cleaned def _clean_id3(self): dirty_tags = self.dirty_tags() if dirty_tags: cleaned_comments = False for t in dirty_tags: del self.id3[t] if AudioFile._comment.match(t): cleaned_comments = True self.id3.save() if cleaned_comments: self._warn("removed nonstandard comments") return True return False def _clean_ogg(self): dirty_tags = self.dirty_tags() if dirty_tags: for t in dirty_tags: del self.ogg[t] self.ogg.save() return True return False def clean(self, preserve_time=False): """Remove dirty containers and tags from the file""" stat = os.stat(self.filename) cleaned = self._clean_containers() clean_tags = self._clean_id3 if self.id3 else self._clean_ogg if clean_tags(): cleaned = True if preserve_time and cleaned: # TODO: setting the atime here is worthless. os.utime(self.filename, (stat.st_atime, stat.st_mtime)) return cleaned