def _test_invalid_picture(self, invalid_picture_data): png_data = create_fake_png(b'x') tags = { 'WM/Picture': [ ASFByteArrayAttribute(invalid_picture_data), ASFByteArrayAttribute(asf.pack_image( "image/png", png_data)) ] } save_raw(self.filename, tags) metadata = load_metadata(self.filename) self.assertEqual(1, len(metadata.images)) self.assertEqual(png_data, metadata.images[0].data)
def _save(self, filename, metadata, settings): self.log.debug("Saving file %r", filename) file = ASF(encode_filename(filename)) if settings['clear_existing_tags']: file.tags.clear() if settings['save_images_to_tags']: cover = [] for mime, data in metadata.images: tag_data = pack_image(mime, data, 3) 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 / (settings['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() 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 test_ASFByteArrayAttribute_dunder(self): attr = ASFByteArrayAttribute(data=b"\xff") self.assertEqual(bytes(attr), b"\xff") self.assertEqual(text_type(attr), u"[binary data (1 bytes)]") if PY3: self.assertEqual(repr(attr), r"ASFByteArrayAttribute(b'\xff')") else: self.assertEqual(repr(attr), r"ASFByteArrayAttribute('\xff')") self.assertRaises(TypeError, int, attr)
def album_art(self, art_location: str): with open(art_location, 'rb') as image: image_data = image.read() # https://github.com/beetbox/mediafile/blob/master/mediafile.py#L231 value = struct.pack('<bi', 3, len(image_data)) value += file_type(art_location).encode('utf-16-le') + b'\x00\x00' value += 'Cover'.encode('utf-16-le') + b'\x00\x00' value += image_data self.file['WM/Picture'] = ASFByteArrayAttribute(value=value) return self
def pic_to_bin(image): data = image[util.DATA] mime = image.get(util.MIMETYPE) if not mime: mime = get_mime(data) if not mime: return type = image.get(util.IMAGETYPE, 3) description = image.get(util.DESCRIPTION, u'') tag_data = struct.pack("<bi", type, len(data)) tag_data += mime.encode("utf-16-le") + "\x00\x00" tag_data += description.encode("utf-16-le") + "\x00\x00" tag_data += data return ASFByteArrayAttribute(tag_data)
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 test_ASFByteArrayAttribute_compat(self): ba = ASFByteArrayAttribute() ba.value = b"\xff" self.assertEqual(ba._render(), b"\xff")
def test_ASFByteArrayAttribute(self): self.assertRaises(TypeError, ASFByteArrayAttribute, u"foo") self.assertEqual(ASFByteArrayAttribute(data=b"\xff").value, b"\xff")