Exemplo n.º 1
0
Arquivo: mp3.py Projeto: dsully/trax
  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)))
Exemplo n.º 2
0
    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)))
Exemplo n.º 3
0
  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)