示例#1
0
文件: asf.py 项目: kewpdawg/picard
    def _save(self, filename, metadata):
        log.debug("Saving file %r", filename)
        file = ASF(encode_filename(filename))

        if config.setting['clear_existing_tags']:
            file.tags.clear()
        if config.setting['save_images_to_tags']:
            cover = []
            for image in metadata.images:
                if not save_this_image_to_tags(image):
                    continue
                tag_data = pack_image(image["mime"], image["data"],
                                      image_type_as_id3_num(image['type']),
                                      image['desc'])
                cover.append(ASFByteArrayAttribute(tag_data))
            if cover:
                file.tags['WM/Picture'] = cover

        for name, values in metadata.rawitems():
            if name.startswith('lyrics:'):
                name = 'lyrics'
            elif name == '~rating':
                values[0] = int(
                    values[0]) * 99 / (config.setting['rating_steps'] - 1)
            if name not in self.__TRANS:
                continue
            name = self.__TRANS[name]
            file.tags[name] = map(unicode, values)
        file.save()
示例#2
0
文件: asf.py 项目: m42i/picard
    def _save(self, filename, metadata):
        log.debug("Saving file %r", filename)
        file = ASF(encode_filename(filename))

        if config.setting['clear_existing_tags']:
            file.tags.clear()
        if config.setting['save_images_to_tags']:
            cover = []
            for image in metadata.images:
                if not save_this_image_to_tags(image):
                    continue
                tag_data = pack_image(image.mimetype, image.data,
                                      image_type_as_id3_num(image.maintype()),
                                      image.description)
                cover.append(ASFByteArrayAttribute(tag_data))
            if cover:
                file.tags['WM/Picture'] = cover

        for name, values in metadata.rawitems():
            if name.startswith('lyrics:'):
                name = 'lyrics'
            elif name == '~rating':
                values[0] = int(values[0]) * 99 / (config.setting['rating_steps'] - 1)
            if name not in self.__TRANS:
                continue
            name = self.__TRANS[name]
            file.tags[name] = map(unicode, values)
        file.save()
示例#3
0
文件: asf.py 项目: TushRaj/picard
    def _save(self, filename, metadata):
        log.debug("Saving file %r", filename)
        file = ASF(encode_filename(filename))

        if config.setting["clear_existing_tags"]:
            file.tags.clear()
        if config.setting["save_images_to_tags"]:
            cover = []
            for image in metadata.images:
                if not save_this_image_to_tags(image):
                    continue
                tag_data = pack_image(image["mime"], image["data"], image_type_as_id3_num(image["type"]), image["desc"])
                cover.append(ASFByteArrayAttribute(tag_data))
            if cover:
                file.tags["WM/Picture"] = cover

        for name, values in metadata.rawitems():
            if name.startswith("lyrics:"):
                name = "lyrics"
            elif name == "~rating":
                values[0] = int(values[0]) * 99 / (config.setting["rating_steps"] - 1)
            if name not in self.__TRANS:
                continue
            name = self.__TRANS[name]
            file.tags[name] = map(unicode, values)
        file.save()
示例#4
0
 def _save(self, filename, metadata):
     """Save metadata to the file."""
     log.debug("Saving file %r", filename)
     try:
         tags = mutagen.apev2.APEv2(encode_filename(filename))
     except mutagen.apev2.APENoHeaderError:
         tags = mutagen.apev2.APEv2()
     if config.setting["clear_existing_tags"]:
         tags.clear()
     elif config.setting['save_images_to_tags'] and metadata.images:
         for name, value in tags.items():
             if name.lower().startswith(
                     'cover art') and value.kind == mutagen.apev2.BINARY:
                 del tags[name]
     temp = {}
     for name, value in metadata.items():
         if name.startswith("~"):
             continue
         if name.startswith('lyrics:'):
             name = 'Lyrics'
         elif name == "date":
             name = "Year"
         # tracknumber/totaltracks => Track
         elif name == 'tracknumber':
             name = 'Track'
             if 'totaltracks' in metadata:
                 value = '%s/%s' % (value, metadata['totaltracks'])
         # discnumber/totaldiscs => Disc
         elif name == 'discnumber':
             name = 'Disc'
             if 'totaldiscs' in metadata:
                 value = '%s/%s' % (value, metadata['totaldiscs'])
         elif name in ('totaltracks', 'totaldiscs'):
             continue
         # "performer:Piano=Joe Barr" => "Performer=Joe Barr (Piano)"
         elif name.startswith('performer:') or name.startswith('comment:'):
             name, desc = name.split(':', 1)
             name = name.title()
             if desc:
                 value += ' (%s)' % desc
         elif name in self.__rtranslate:
             name = self.__rtranslate[name]
         else:
             name = name.title()
         temp.setdefault(name, []).append(value)
     for name, values in temp.items():
         tags[str(name)] = values
     if config.setting['save_images_to_tags']:
         for image in metadata.images:
             if not save_this_image_to_tags(image):
                 continue
             cover_filename = 'Cover Art (Front)'
             cover_filename += mimetype.get_extension(image["mime"], '.jpg')
             tags['Cover Art (Front)'] = mutagen.apev2.APEValue(
                 cover_filename + '\0' + image["data"],
                 mutagen.apev2.BINARY)
             break  # can't save more than one item with the same name
             # (mp3tags does this, but it's against the specs)
     tags.save(encode_filename(filename))
示例#5
0
    def _save(self, filename, metadata):
        log.debug("Saving file %r", filename)
        file = MP4(encode_filename(self.filename))
        if file.tags is None:
            file.add_tags()

        if config.setting["clear_existing_tags"]:
            file.tags.clear()

        for name, values in metadata.rawitems():
            if name.startswith('lyrics:'):
                name = 'lyrics'
            if name in self.__r_text_tags:
                file.tags[self.__r_text_tags[name]] = values
            elif name in self.__r_bool_tags:
                file.tags[self.__r_bool_tags[name]] = (values[0] == '1')
            elif name in self.__r_int_tags:
                try:
                    file.tags[self.__r_int_tags[name]] = [
                        int(value) for value in values
                    ]
                except ValueError:
                    pass
            elif name in self.__r_freeform_tags:
                values = [v.encode("utf-8") for v in values]
                file.tags[self.__r_freeform_tags[name]] = values
            elif name == "musicip_fingerprint":
                file.tags["----:com.apple.iTunes:fingerprint"] = [
                    "MusicMagic Fingerprint%s" % str(v) for v in values
                ]

        if "tracknumber" in metadata:
            if "totaltracks" in metadata:
                file.tags["trkn"] = [(int(metadata["tracknumber"]),
                                      int(metadata["totaltracks"]))]
            else:
                file.tags["trkn"] = [(int(metadata["tracknumber"]), 0)]

        if "discnumber" in metadata:
            if "totaldiscs" in metadata:
                file.tags["disk"] = [(int(metadata["discnumber"]),
                                      int(metadata["totaldiscs"]))]
            else:
                file.tags["disk"] = [(int(metadata["discnumber"]), 0)]

        if config.setting['save_images_to_tags']:
            covr = []
            for image in metadata.images:
                if not save_this_image_to_tags(image):
                    continue
                mime = image["mime"]
                if mime == "image/jpeg":
                    covr.append(MP4Cover(image["data"], MP4Cover.FORMAT_JPEG))
                elif mime == "image/png":
                    covr.append(MP4Cover(image["data"], MP4Cover.FORMAT_PNG))
            if covr:
                file.tags["covr"] = covr

        file.save()
示例#6
0
文件: apev2.py 项目: Braingate/picard
 def _save(self, filename, metadata):
     """Save metadata to the file."""
     log.debug("Saving file %r", filename)
     try:
         tags = mutagen.apev2.APEv2(encode_filename(filename))
     except mutagen.apev2.APENoHeaderError:
         tags = mutagen.apev2.APEv2()
     if config.setting["clear_existing_tags"]:
         tags.clear()
     elif config.setting['save_images_to_tags'] and metadata.images:
         for name, value in tags.items():
             if name.lower().startswith('cover art') and value.kind == mutagen.apev2.BINARY:
                 del tags[name]
     temp = {}
     for name, value in metadata.items():
         if name.startswith("~"):
             continue
         if name.startswith('lyrics:'):
             name = 'Lyrics'
         elif name == "date":
             name = "Year"
         # tracknumber/totaltracks => Track
         elif name == 'tracknumber':
             name = 'Track'
             if 'totaltracks' in metadata:
                 value = '%s/%s' % (value, metadata['totaltracks'])
         # discnumber/totaldiscs => Disc
         elif name == 'discnumber':
             name = 'Disc'
             if 'totaldiscs' in metadata:
                 value = '%s/%s' % (value, metadata['totaldiscs'])
         elif name in ('totaltracks', 'totaldiscs'):
             continue
         # "performer:Piano=Joe Barr" => "Performer=Joe Barr (Piano)"
         elif name.startswith('performer:') or name.startswith('comment:'):
             name, desc = name.split(':', 1)
             name = name.title()
             if desc:
                 value += ' (%s)' % desc
         elif name in self.__rtranslate:
             name = self.__rtranslate[name]
         else:
             name = name.title()
         temp.setdefault(name, []).append(value)
     for name, values in temp.items():
         tags[str(name)] = values
     if config.setting['save_images_to_tags']:
         for image in metadata.images:
             if not save_this_image_to_tags(image):
                 continue
             cover_filename = 'Cover Art (Front)'
             cover_filename += mimetype.get_extension(image.mimetype, '.jpg')
             tags['Cover Art (Front)'] = mutagen.apev2.APEValue(cover_filename + '\0' + image.data, mutagen.apev2.BINARY)
             break  # can't save more than one item with the same name
                    # (mp3tags does this, but it's against the specs)
     tags.save(encode_filename(filename))
示例#7
0
文件: mp4.py 项目: hartzell/picard
    def _save(self, filename, metadata):
        log.debug("Saving file %r", filename)
        file = MP4(encode_filename(self.filename))
        if file.tags is None:
            file.add_tags()

        if config.setting["clear_existing_tags"]:
            file.tags.clear()

        for name, values in metadata.rawitems():
            if name.startswith('lyrics:'):
                name = 'lyrics'
            if name in self.__r_text_tags:
                file.tags[self.__r_text_tags[name]] = values
            elif name in self.__r_bool_tags:
                file.tags[self.__r_bool_tags[name]] = (values[0] == '1')
            elif name in self.__r_int_tags:
                try:
                    file.tags[self.__r_int_tags[name]] = [int(value) for value in values]
                except ValueError:
                    pass
            elif name in self.__r_freeform_tags:
                values = [v.encode("utf-8") for v in values]
                file.tags[self.__r_freeform_tags[name]] = values
            elif name == "musicip_fingerprint":
                file.tags["----:com.apple.iTunes:fingerprint"] = ["MusicMagic Fingerprint%s" % str(v) for v in values]

        if "tracknumber" in metadata:
            if "totaltracks" in metadata:
                file.tags["trkn"] = [(int(metadata["tracknumber"]),
                                      int(metadata["totaltracks"]))]
            else:
                file.tags["trkn"] = [(int(metadata["tracknumber"]), 0)]

        if "discnumber" in metadata:
            if "totaldiscs" in metadata:
                file.tags["disk"] = [(int(metadata["discnumber"]),
                                      int(metadata["totaldiscs"]))]
            else:
                file.tags["disk"] = [(int(metadata["discnumber"]), 0)]

        if config.setting['save_images_to_tags']:
            covr = []
            for image in metadata.images:
                if not save_this_image_to_tags(image):
                    continue
                mime = image["mime"]
                if mime == "image/jpeg":
                    covr.append(MP4Cover(image["data"], MP4Cover.FORMAT_JPEG))
                elif mime == "image/png":
                    covr.append(MP4Cover(image["data"], MP4Cover.FORMAT_PNG))
            if covr:
                file.tags["covr"] = covr

        file.save()
示例#8
0
文件: id3.py 项目: TushRaj/picard
    def _save(self, filename, metadata):
        """Save metadata to the file."""
        log.debug("Saving file %r", filename)
        try:
            tags = compatid3.CompatID3(encode_filename(filename))
        except mutagen.id3.ID3NoHeaderError:
            tags = compatid3.CompatID3()

        if config.setting['clear_existing_tags']:
            tags.clear()
        if config.setting['save_images_to_tags'] and metadata.images:
            tags.delall('APIC')

        if config.setting['write_id3v1']:
            v1 = 2
        else:
            v1 = 0
        encoding = {'utf-8': 3, 'utf-16': 1}.get(config.setting['id3v2_encoding'], 0)

        if 'tracknumber' in metadata:
            if 'totaltracks' in metadata:
                text = '%s/%s' % (metadata['tracknumber'], metadata['totaltracks'])
            else:
                text = metadata['tracknumber']
            tags.add(id3.TRCK(encoding=0, text=text))

        if 'discnumber' in metadata:
            if 'totaldiscs' in metadata:
                text = '%s/%s' % (metadata['discnumber'], metadata['totaldiscs'])
            else:
                text = metadata['discnumber']
            tags.add(id3.TPOS(encoding=0, text=text))

        if config.setting['save_images_to_tags']:
            # This is necessary because mutagens HashKey for APIC frames only
            # includes the FrameID (APIC) and description - it's basically
            # impossible to save two images, even of different types, without
            # any description.
            counters = defaultdict(lambda: 0)
            for image in metadata.images:
                desc = desctag = image['desc']
                if not save_this_image_to_tags(image):
                    continue
                if counters[desc] > 0:
                    if desc:
                        desctag = "%s (%i)" % (desc, counters[desc])
                    else:
                        desctag = "(%i)" % counters[desc]
                counters[desc] += 1
                tags.add(id3.APIC(encoding=0,
                                  mime=image["mime"],
                                  type=image_type_as_id3_num(image['type']),
                                  desc=desctag,
                                  data=image["data"]))

        tmcl = mutagen.id3.TMCL(encoding=encoding, people=[])
        tipl = mutagen.id3.TIPL(encoding=encoding, people=[])

        tags.delall('TCMP')
        for name, values in metadata.rawitems():
            if name.startswith('performer:'):
                role = name.split(':', 1)[1]
                for value in values:
                    tmcl.people.append([role, value])
            elif name.startswith('comment:'):
                desc = name.split(':', 1)[1]
                if desc.lower()[:4] == "itun":
                    tags.delall('COMM:' + desc)
                    tags.add(id3.COMM(encoding=0, desc=desc, lang='eng', text=[v + u'\x00' for v in values]))
                else:
                    tags.add(id3.COMM(encoding=encoding, desc=desc, lang='eng', text=values))
            elif name.startswith('lyrics:') or name == 'lyrics':
                if ':' in name:
                    desc = name.split(':', 1)[1]
                else:
                    desc = ''
                for value in values:
                    tags.add(id3.USLT(encoding=encoding, desc=desc, text=value))
            elif name in self._rtipl_roles:
                for value in values:
                    tipl.people.append([self._rtipl_roles[name], value])
            elif name == 'musicbrainz_recordingid':
                tags.add(id3.UFID(owner='http://musicbrainz.org', data=str(values[0])))
            elif name == '~rating':
                # Search for an existing POPM frame to get the current playcount
                for frame in tags.values():
                    if frame.FrameID == 'POPM' and frame.email == config.setting['rating_user_email']:
                        count = getattr(frame, 'count', 0)
                        break
                else:
                    count = 0

                # Convert rating to range between 0 and 255
                rating = int(round(float(values[0]) * 255 / (config.setting['rating_steps'] - 1)))
                tags.add(id3.POPM(email=config.setting['rating_user_email'], rating=rating, count=count))
            elif name in self.__rtranslate:
                frameid = self.__rtranslate[name]
                if frameid.startswith('W'):
                    valid_urls = all([all(urlparse(v)[:2]) for v in values])
                    if frameid == 'WCOP':
                        # Only add WCOP if there is only one license URL, otherwise use TXXX:LICENSE
                        if len(values) > 1 or not valid_urls:
                            tags.add(id3.TXXX(encoding=encoding, desc=self.__rtranslate_freetext[name], text=values))
                        else:
                            tags.add(id3.WCOP(url=values[0]))
                    elif frameid == 'WOAR' and valid_urls:
                        for url in values:
                            tags.add(id3.WOAR(url=url))
                elif frameid.startswith('T'):
                    tags.add(getattr(id3, frameid)(encoding=encoding, text=values))
                    if frameid == 'TSOA':
                        tags.delall('XSOA')
                    elif frameid == 'TSOP':
                        tags.delall('XSOP')
                    elif frameid == 'TSO2':
                        tags.delall('TXXX:ALBUMARTISTSORT')
            elif name in self.__rtranslate_freetext:
                tags.add(id3.TXXX(encoding=encoding, desc=self.__rtranslate_freetext[name], text=values))
            elif name.startswith('~id3:'):
                name = name[5:]
                if name.startswith('TXXX:'):
                    tags.add(id3.TXXX(encoding=encoding, desc=name[5:], text=values))
                else:
                    frameclass = getattr(id3, name[:4], None)
                    if frameclass:
                        tags.add(frameclass(encoding=encoding, text=values))
            # don't save private / already stored tags
            elif not name.startswith("~") and not name in self.__other_supported_tags:
                tags.add(id3.TXXX(encoding=encoding, desc=name, text=values))

        if tmcl.people:
            tags.add(tmcl)
        if tipl.people:
            tags.add(tipl)

        if config.setting['write_id3v23']:
            tags.update_to_v23(join_with=config.setting['id3v23_join_with'])
            tags.save(encode_filename(filename), v2=3, v1=v1)
        else:
            tags.update_to_v24()
            tags.save(encode_filename(filename), v2=4, v1=v1)

        if self._IsMP3 and config.setting["remove_ape_from_mp3"]:
            try:
                mutagen.apev2.delete(encode_filename(filename))
            except:
                pass
示例#9
0
文件: vorbis.py 项目: m42i/picard
    def _save(self, filename, metadata):
        """Save metadata to the file."""
        log.debug("Saving file %r", filename)
        file = self._File(encode_filename(filename))
        if file.tags is None:
            file.add_tags()
        if config.setting["clear_existing_tags"]:
            file.tags.clear()
        if self._File == mutagen.flac.FLAC and (
            config.setting["clear_existing_tags"] or
                (config.setting['save_images_to_tags'] and metadata.images)):
            file.clear_pictures()
        tags = {}
        for name, value in metadata.items():
            if name == '~rating':
                # Save rating according to http://code.google.com/p/quodlibet/wiki/Specs_VorbisComments
                if config.setting['rating_user_email']:
                    name = 'rating:%s' % config.setting['rating_user_email']
                else:
                    name = 'rating'
                value = unicode(float(value) / (config.setting['rating_steps'] - 1))
            # don't save private tags
            elif name.startswith("~"):
                continue
            if name.startswith('lyrics:'):
                name = 'lyrics'
            elif name == "date" or name == "originaldate":
                # YYYY-00-00 => YYYY
                value = sanitize_date(value)
            elif name.startswith('performer:') or name.startswith('comment:'):
                # transform "performer:Piano=Joe Barr" to "performer=Joe Barr (Piano)"
                name, desc = name.split(':', 1)
                if desc:
                    value += ' (%s)' % desc
            elif name == "musicip_fingerprint":
                name = "fingerprint"
                value = "MusicMagic Fingerprint%s" % value
            elif name in self.__rtranslate:
                name = self.__rtranslate[name]
            tags.setdefault(name.upper().encode('utf-8'), []).append(value)

        if "totaltracks" in metadata:
            tags.setdefault(u"TRACKTOTAL", []).append(metadata["totaltracks"])
        if "totaldiscs" in metadata:
            tags.setdefault(u"DISCTOTAL", []).append(metadata["totaldiscs"])

        if config.setting['save_images_to_tags']:
            for image in metadata.images:
                if not save_this_image_to_tags(image):
                    continue
                picture = mutagen.flac.Picture()
                picture.data = image.data
                picture.mime = image.mimetype
                picture.desc = image.description
                picture.type = image_type_as_id3_num(image.maintype())
                if self._File == mutagen.flac.FLAC:
                    file.add_picture(picture)
                else:
                    tags.setdefault(u"METADATA_BLOCK_PICTURE", []).append(
                        base64.standard_b64encode(picture.write()))
        file.tags.update(tags)
        kwargs = {}
        if self._File == mutagen.flac.FLAC and config.setting["remove_id3_from_flac"]:
            kwargs["deleteid3"] = True
        try:
            file.save(**kwargs)
        except TypeError:
            file.save()
示例#10
0
文件: id3.py 项目: kewpdawg/picard
    def _save(self, filename, metadata):
        """Save metadata to the file."""
        log.debug("Saving file %r", filename)
        try:
            tags = compatid3.CompatID3(encode_filename(filename))
        except mutagen.id3.ID3NoHeaderError:
            tags = compatid3.CompatID3()

        if config.setting['clear_existing_tags']:
            tags.clear()
        if config.setting['save_images_to_tags'] and metadata.images:
            tags.delall('APIC')

        if config.setting['write_id3v1']:
            v1 = 2
        else:
            v1 = 0
        encoding = {
            'utf-8': 3,
            'utf-16': 1
        }.get(config.setting['id3v2_encoding'], 0)

        if 'tracknumber' in metadata:
            if 'totaltracks' in metadata:
                text = '%s/%s' % (metadata['tracknumber'],
                                  metadata['totaltracks'])
            else:
                text = metadata['tracknumber']
            tags.add(id3.TRCK(encoding=0, text=text))

        if 'discnumber' in metadata:
            if 'totaldiscs' in metadata:
                text = '%s/%s' % (metadata['discnumber'],
                                  metadata['totaldiscs'])
            else:
                text = metadata['discnumber']
            tags.add(id3.TPOS(encoding=0, text=text))

        if config.setting['save_images_to_tags']:
            # This is necessary because mutagens HashKey for APIC frames only
            # includes the FrameID (APIC) and description - it's basically
            # impossible to save two images, even of different types, without
            # any description.
            counters = defaultdict(lambda: 0)
            for image in metadata.images:
                desc = desctag = image['desc']
                if not save_this_image_to_tags(image):
                    continue
                if counters[desc] > 0:
                    if desc:
                        desctag = "%s (%i)" % (desc, counters[desc])
                    else:
                        desctag = "(%i)" % counters[desc]
                counters[desc] += 1
                tags.add(
                    id3.APIC(encoding=0,
                             mime=image["mime"],
                             type=image_type_as_id3_num(image['type']),
                             desc=desctag,
                             data=image["data"]))

        tmcl = mutagen.id3.TMCL(encoding=encoding, people=[])
        tipl = mutagen.id3.TIPL(encoding=encoding, people=[])

        tags.delall('TCMP')
        for name, values in metadata.rawitems():
            if name.startswith('performer:'):
                role = name.split(':', 1)[1]
                for value in values:
                    tmcl.people.append([role, value])
            elif name.startswith('comment:'):
                desc = name.split(':', 1)[1]
                if desc.lower()[:4] == "itun":
                    tags.delall('COMM:' + desc)
                    tags.add(
                        id3.COMM(encoding=0,
                                 desc=desc,
                                 lang='eng',
                                 text=[v + u'\x00' for v in values]))
                else:
                    tags.add(
                        id3.COMM(encoding=encoding,
                                 desc=desc,
                                 lang='eng',
                                 text=values))
            elif name.startswith('lyrics:') or name == 'lyrics':
                if ':' in name:
                    desc = name.split(':', 1)[1]
                else:
                    desc = ''
                for value in values:
                    tags.add(id3.USLT(encoding=encoding, desc=desc,
                                      text=value))
            elif name in self._rtipl_roles:
                for value in values:
                    tipl.people.append([self._rtipl_roles[name], value])
            elif name == 'musicbrainz_recordingid':
                tags.add(
                    id3.UFID(owner='http://musicbrainz.org',
                             data=str(values[0])))
            elif name == '~rating':
                # Search for an existing POPM frame to get the current playcount
                for frame in tags.values():
                    if frame.FrameID == 'POPM' and frame.email == config.setting[
                            'rating_user_email']:
                        count = getattr(frame, 'count', 0)
                        break
                else:
                    count = 0

                # Convert rating to range between 0 and 255
                rating = int(
                    round(
                        float(values[0]) * 255 /
                        (config.setting['rating_steps'] - 1)))
                tags.add(
                    id3.POPM(email=config.setting['rating_user_email'],
                             rating=rating,
                             count=count))
            elif name in self.__rtranslate:
                frameid = self.__rtranslate[name]
                if frameid.startswith('W'):
                    valid_urls = all([all(urlparse(v)[:2]) for v in values])
                    if frameid == 'WCOP':
                        # Only add WCOP if there is only one license URL, otherwise use TXXX:LICENSE
                        if len(values) > 1 or not valid_urls:
                            tags.add(
                                id3.TXXX(encoding=encoding,
                                         desc=self.__rtranslate_freetext[name],
                                         text=values))
                        else:
                            tags.add(id3.WCOP(url=values[0]))
                    elif frameid == 'WOAR' and valid_urls:
                        for url in values:
                            tags.add(id3.WOAR(url=url))
                elif frameid.startswith('T'):
                    tags.add(
                        getattr(id3, frameid)(encoding=encoding, text=values))
                    if frameid == 'TSOA':
                        tags.delall('XSOA')
                    elif frameid == 'TSOP':
                        tags.delall('XSOP')
                    elif frameid == 'TSO2':
                        tags.delall('TXXX:ALBUMARTISTSORT')
            elif name in self.__rtranslate_freetext:
                tags.add(
                    id3.TXXX(encoding=encoding,
                             desc=self.__rtranslate_freetext[name],
                             text=values))
            elif name.startswith('~id3:'):
                name = name[5:]
                if name.startswith('TXXX:'):
                    tags.add(
                        id3.TXXX(encoding=encoding, desc=name[5:],
                                 text=values))
                else:
                    frameclass = getattr(id3, name[:4], None)
                    if frameclass:
                        tags.add(frameclass(encoding=encoding, text=values))
            # don't save private / already stored tags
            elif not name.startswith(
                    "~") and not name in self.__other_supported_tags:
                tags.add(id3.TXXX(encoding=encoding, desc=name, text=values))

        if tmcl.people:
            tags.add(tmcl)
        if tipl.people:
            tags.add(tipl)

        if config.setting['write_id3v23']:
            tags.update_to_v23(join_with=config.setting['id3v23_join_with'])
            tags.save(encode_filename(filename), v2=3, v1=v1)
        else:
            tags.update_to_v24()
            tags.save(encode_filename(filename), v2=4, v1=v1)

        if self._IsMP3 and config.setting["remove_ape_from_mp3"]:
            try:
                mutagen.apev2.delete(encode_filename(filename))
            except:
                pass
示例#11
0
    def _save(self, filename, metadata):
        """Save metadata to the file."""
        log.debug("Saving file %r", filename)
        file = self._File(encode_filename(filename))
        if file.tags is None:
            file.add_tags()
        if config.setting["clear_existing_tags"]:
            file.tags.clear()
        if self._File == mutagen.flac.FLAC and (
            config.setting["clear_existing_tags"] or
            (config.setting['save_images_to_tags'] and metadata.images)):
            file.clear_pictures()
        tags = {}
        for name, value in metadata.items():
            if name == '~rating':
                # Save rating according to http://code.google.com/p/quodlibet/wiki/Specs_VorbisComments
                if config.setting['rating_user_email']:
                    name = 'rating:%s' % config.setting['rating_user_email']
                else:
                    name = 'rating'
                value = unicode(float(value) / (config.setting['rating_steps'] - 1))
            # don't save private tags
            elif name.startswith("~"):
                continue
            if name.startswith('lyrics:'):
                name = 'lyrics'
            elif name == "date" or name == "originaldate":
                # YYYY-00-00 => YYYY
                value = sanitize_date(value)
            elif name.startswith('performer:') or name.startswith('comment:'):
                # transform "performer:Piano=Joe Barr" to "performer=Joe Barr (Piano)"
                name, desc = name.split(':', 1)
                if desc:
                    value += ' (%s)' % desc
            elif name == "musicip_fingerprint":
                name = "fingerprint"
                value = "MusicMagic Fingerprint%s" % value
            elif name in self.__rtranslate:
                name = self.__rtranslate[name]
            tags.setdefault(name.upper().encode('utf-8'), []).append(value)

        if "totaltracks" in metadata:
            tags.setdefault(u"TRACKTOTAL", []).append(metadata["totaltracks"])
        if "totaldiscs" in metadata:
            tags.setdefault(u"DISCTOTAL", []).append(metadata["totaldiscs"])

        if config.setting['save_images_to_tags']:
            for image in metadata.images:
                if not save_this_image_to_tags(image):
                    continue
                picture = mutagen.flac.Picture()
                picture.data = image["data"]
                picture.mime = image["mime"]
                picture.desc = image['desc']
                picture.type = image_type_as_id3_num(image['type'])
                if self._File == mutagen.flac.FLAC:
                    file.add_picture(picture)
                else:
                    tags.setdefault(u"METADATA_BLOCK_PICTURE", []).append(
                        base64.standard_b64encode(picture.write()))
        file.tags.update(tags)
        kwargs = {}
        if self._File == mutagen.flac.FLAC and config.setting["remove_id3_from_flac"]:
            kwargs["deleteid3"] = True
        try:
            file.save(**kwargs)
        except TypeError:
            file.save()