Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions test_files/photo-test.vcf
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down
2 changes: 2 additions & 0 deletions vobject/vcard.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down