diff --git a/test_files/photo-test.vcf b/test_files/photo-test.vcf new file mode 100644 index 0000000..964cd3d --- /dev/null +++ b/test_files/photo-test.vcf @@ -0,0 +1,88 @@ +BEGIN:VCARD +VERSION:2.1 +N:;my former school;;; +FN:should be ok to share +TEL;HOME:+49123456789 +PHOTO;ENCODING=BASE64;JPEG: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 + +END:VCARD diff --git a/tests.py b/tests.py index 7db519e..d3b637a 100644 --- a/tests.py +++ b/tests.py @@ -528,6 +528,14 @@ def test_vcard_3_parsing(self): self.assertEqual(new_card.org.value, card.org.value) card = new_card + def test_photo_serialization(self): + """ + Test for AOSP (Android) exported with attached photos + """ + test_file = get_test_file("photo-test.vcf") + card = base.readOne(test_file) + serialized = card.serialize() + class TestIcalendar(unittest.TestCase): """ diff --git a/vobject/vcard.py b/vobject/vcard.py index 59c87aa..5722508 100644 --- a/vobject/vcard.py +++ b/vobject/vcard.py @@ -130,6 +130,8 @@ def decode(cls, line): line.singletonparams.remove('BASE64') line.encoding_param = cls.base64string encoding = getattr(line, 'encoding_param', None) + if encoding == 'BASE64': + line.encoding_param = cls.base64string if encoding: if isinstance(line.value, bytes): line.value = codecs.decode(line.value, "base64")