예제 #1
0
    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()
예제 #2
0
    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()
예제 #3
0
 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()
예제 #4
0
 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()
예제 #5
0
# 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']
예제 #6
0
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