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()
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() cover = [] for image in metadata.images_to_be_saved_to_tags: tag_data = pack_image(image.mimetype, image.data, image_type_as_id3_num(image.maintype), image.comment) 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) elif name == 'discnumber' and 'totaldiscs' in metadata: values[0] = '%s/%s' % (metadata['discnumber'], metadata['totaldiscs']) if name not in self.__TRANS: continue name = self.__TRANS[name] file.tags[name] = map(unicode, values) file.save()
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() cover = [] for image in metadata.images_to_be_saved_to_tags: tag_data = pack_image(image.mimetype, image.data, image_type_as_id3_num(image.maintype), image.comment) 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) elif name == 'discnumber' and 'totaldiscs' in metadata: values[0] = '%s/%s' % (metadata['discnumber'], metadata['totaldiscs']) if name not in self.__TRANS: continue name = self.__TRANS[name] file.tags[name] = map(unicode, values) file.save()
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()
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()
def _save(self, filename, metadata): log.debug("Saving file %r", filename) config = get_config() file = ASF(encode_filename(filename)) tags = file.tags if config.setting['clear_existing_tags']: cover = tags['WM/Picture'] if config.setting[ 'preserve_images'] else None tags.clear() if cover: tags['WM/Picture'] = cover cover = [] for image in metadata.images.to_be_saved_to_tags(): tag_data = pack_image(image.mimetype, image.data, image_type_as_id3_num(image.maintype), image.comment) cover.append(ASFByteArrayAttribute(tag_data)) if cover: tags['WM/Picture'] = cover for name, values in metadata.rawitems(): if name.startswith('lyrics:'): name = 'lyrics' elif name == '~rating': values = [ int(values[0]) * 99 // (config.setting['rating_steps'] - 1) ] elif name == 'discnumber' and 'totaldiscs' in metadata: values = [ '%s/%s' % (metadata['discnumber'], metadata['totaldiscs']) ] if name in self.__TRANS: name = self.__TRANS[name] elif name in self.__TRANS_CI: if name in self.__casemap: name = self.__casemap[name] else: name = self.__TRANS_CI[name] delall_ci(tags, name) else: continue tags[name] = values self._remove_deleted_tags(metadata, tags) file.save()
def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) is_flac = self._File == mutagen.flac.FLAC file = self._File(encode_filename(filename)) if file.tags is None: file.add_tags() if config.setting["clear_existing_tags"]: file.tags.clear() if (is_flac and (config.setting["clear_existing_tags"] or metadata.images_to_be_saved_to_tags)): 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 = string_( float(value) / (config.setting['rating_steps'] - 1)) # don't save private tags elif name.startswith("~"): continue elif 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(), []).append(value) if "totaltracks" in metadata: tags.setdefault("TRACKTOTAL", []).append(metadata["totaltracks"]) if "totaldiscs" in metadata: tags.setdefault("DISCTOTAL", []).append(metadata["totaldiscs"]) for image in metadata.images_to_be_saved_to_tags: picture = mutagen.flac.Picture() picture.data = image.data picture.mime = image.mimetype picture.desc = image.comment picture.type = image_type_as_id3_num(image.maintype) if self._File == mutagen.flac.FLAC: file.add_picture(picture) else: tags.setdefault("METADATA_BLOCK_PICTURE", []).append( base64.b64encode(picture.write()).decode('ascii')) file.tags.update(tags) self._remove_deleted_tags(metadata, file.tags) kwargs = {} if is_flac and config.setting["remove_id3_from_flac"]: kwargs["deleteid3"] = True try: file.save(**kwargs) except TypeError: file.save()
def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) is_flac = self._File == mutagen.flac.FLAC file = self._File(encode_filename(filename)) if file.tags is None: file.add_tags() if config.setting["clear_existing_tags"]: channel_mask = file.tags.get('waveformatextensible_channel_mask', None) file.tags.clear() if channel_mask: file.tags['waveformatextensible_channel_mask'] = channel_mask images_to_save = list(metadata.images.to_be_saved_to_tags()) if is_flac and (config.setting["clear_existing_tags"] or images_to_save): 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 user_email = sanitize_key(config.setting['rating_user_email']) if user_email: name = 'rating:%s' % user_email else: name = 'rating' value = str( float(value) / (config.setting['rating_steps'] - 1)) # don't save private tags elif name.startswith("~") or not self.supports_tag(name): continue elif 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(), []).append(value) if "totaltracks" in metadata: tags.setdefault("TRACKTOTAL", []).append(metadata["totaltracks"]) if "totaldiscs" in metadata: tags.setdefault("DISCTOTAL", []).append(metadata["totaldiscs"]) for image in images_to_save: picture = mutagen.flac.Picture() picture.data = image.data picture.mime = image.mimetype picture.desc = image.comment picture.width = image.width picture.height = image.height picture.type = image_type_as_id3_num(image.maintype) if is_flac: # See https://xiph.org/flac/format.html#metadata_block_picture expected_block_size = (8 * 4 + len(picture.data) + len(picture.mime) + len(picture.desc.encode('UTF-8'))) if expected_block_size > FLAC_MAX_BLOCK_SIZE: log.error( 'Failed saving image to %r: Image size of %d bytes exceeds maximum FLAC block size of %d bytes', filename, expected_block_size, FLAC_MAX_BLOCK_SIZE) continue file.add_picture(picture) else: tags.setdefault("METADATA_BLOCK_PICTURE", []).append( base64.b64encode(picture.write()).decode('ascii')) file.tags.update(tags) self._remove_deleted_tags(metadata, file.tags) if is_flac: flac_sort_pics_after_tags(file.metadata_blocks) kwargs = {} if is_flac and config.setting["remove_id3_from_flac"]: kwargs["deleteid3"] = True try: file.save(**kwargs) except TypeError: file.save()
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()
def test_image_type_as_id3_num(self): self.assertEqual(id3.image_type_as_id3_num('other'), 0) self.assertEqual(id3.image_type_as_id3_num('front'), 3) self.assertEqual(id3.image_type_as_id3_num('medium'), 6) self.assertEqual(id3.image_type_as_id3_num('track'), 6) self.assertEqual(id3.image_type_as_id3_num('unknowntype'), 0)
def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) is_flac = self._File == mutagen.flac.FLAC file = self._File(encode_filename(filename)) if file.tags is None: file.add_tags() if config.setting["clear_existing_tags"]: channel_mask = file.tags.get('waveformatextensible_channel_mask', None) file.tags.clear() if channel_mask: file.tags['waveformatextensible_channel_mask'] = channel_mask images_to_save = list(metadata.images.to_be_saved_to_tags()) if is_flac and (config.setting["clear_existing_tags"] or images_to_save): 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 user_email = sanitize_key(config.setting['rating_user_email']) if user_email: name = 'rating:%s' % user_email else: name = 'rating' value = str(float(value) / (config.setting['rating_steps'] - 1)) # don't save private tags elif name.startswith("~") or not self.supports_tag(name): continue elif 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(), []).append(value) if "totaltracks" in metadata: tags.setdefault("TRACKTOTAL", []).append(metadata["totaltracks"]) if "totaldiscs" in metadata: tags.setdefault("DISCTOTAL", []).append(metadata["totaldiscs"]) for image in images_to_save: picture = mutagen.flac.Picture() picture.data = image.data picture.mime = image.mimetype picture.desc = image.comment picture.width = image.width picture.height = image.height picture.type = image_type_as_id3_num(image.maintype) if self._File == mutagen.flac.FLAC: file.add_picture(picture) else: tags.setdefault("METADATA_BLOCK_PICTURE", []).append( base64.b64encode(picture.write()).decode('ascii')) file.tags.update(tags) self._remove_deleted_tags(metadata, file.tags) kwargs = {} if is_flac and config.setting["remove_id3_from_flac"]: kwargs["deleteid3"] = True try: file.save(**kwargs) except TypeError: file.save()