def set_replaygain(self, rg_type, gain, peak): self.tags.add(mutagen.id3.COMM(encoding=3, lang='eng', desc='iTunNORM', text=replay_gain_to_soundcheck(gain, peak))) self.tags.add(mutagen.id3.RVA2(desc=rg_type, channel=1, gain=float(gain.replace(' dB', '')), peak=float(peak))) # For foobar and Rockbox self.tags.add(mutagen.id3.TXXX(encoding=3, desc='replaygain_%s_gain' % rg_type, text=str(gain))) self.tags.add(mutagen.id3.TXXX(encoding=3, desc='replaygain_%s_peak' % rg_type, text=str(peak)))
def set_replaygain(self, rg_type, gain, peak): self.tags.add( mutagen.id3.COMM(encoding=3, lang='eng', desc='iTunNORM', text=replay_gain_to_soundcheck(gain, peak))) self.tags.add( mutagen.id3.RVA2(desc=rg_type, channel=1, gain=float(gain.replace(' dB', '')), peak=float(peak))) # For foobar and Rockbox self.tags.add( mutagen.id3.TXXX(encoding=3, desc='replaygain_%s_gain' % rg_type, text=str(gain))) self.tags.add( mutagen.id3.TXXX(encoding=3, desc='replaygain_%s_peak' % rg_type, text=str(peak)))
def write_metadata(self, filename, force=False): # MP4 needs these attributes as TXXX. for value in ('original album', 'original_artist', 'original_year'): self.txxx[value.upper().replace('_', ' ')] = value track = self.track log.debug("Writing metadata for: %s", filename) if os.path.exists(filename) is False: log.warn("Couldn't find MP4 file!: %s", filename) return None self.tags = mutagen.mp4.MP4(filename) if not force and self.is_up_to_date(): log.debug('Up to date: "%s"' % filename) return None # Clear out any old data. self.tags.clear() # Basics first. for atom, key in self.attributes.items(): if hasattr(track, key): value = getattr(track, key, None) log.debug("Trying: key: %s (%s)", key, value) if isinstance(value, str): value = value.encode('utf-8') # 'tmpo' needs to be a list of integers. if key == 'bpm' and value is not None: value = [int(value)] if value is not None: self.tags[atom] = value # Hack alert.. not sure how better to "detect" this. if track.genre: for genre in list(track.genre): if genre in self.gapless: self.tags["pgap"] = True if track.compilation: self.tags["cpil"] = True if track.tracknumber and track.tracktotal: self.tags["trkn"] = [(track.tracknumber, track.tracktotal)] elif track.tracknumber: self.tags["trkn"] = [(track.tracknumber, 0)] # Convert RG tags into iTunes SoundCheck # TODO: Find what tags aacgain uses as well. if track.replaygain_album_gain: self.tags['----:com.apple.iTunes:iTunNORM'] = replay_gain_to_soundcheck(track.replaygain_album_gain, track.replaygain_album_peak) elif track.replaygain_track_gain: self.tags['----:com.apple.iTunes:iTunNORM'] = replay_gain_to_soundcheck(track.replaygain_track_gain, track.replaygain_track_peak) # if track.discnumber and track.disctotal: try: self.tags["disk"] = [(track.discnumber, track.disctotal)] except ValueError: pass elif track.disctotal: self.tags["disk"] = [(track.disctotal, track.disctotal)] # Artwork time.. if track.cover_file and os.path.exists(track.cover_file): with open(track.cover_file, 'rb') as fh: if track.cover_file.endswith(".png"): self.tags["covr"] = [ MP4Cover(fh.read(), MP4Cover.FORMAT_PNG) ] elif track.cover_file.endswith(".jpg"): self.tags["covr"] = [ MP4Cover(fh.read(), MP4Cover.FORMAT_JPEG) ] # Always add the check & time stamp for next time. if track.checksum: self.tags['----:com.sully.flac2mp4:checksum'] = str(track.checksum) self.tags['----:com.sully.flac2mp4:flacmtime'] = str(track.mtime) # Convert all user defined tags. for tag, attribute in self.txxx.items(): if getattr(track, attribute, None): self.tags['----:com.apple.iTunes:' + tag] = getattr(track, attribute).encode('utf-8') try: self.tags.save(filename) except Exception as e: log.warn("Couldn't save file %s: %s", filename, e)