Skip to content

Instantly share code, notes, and snippets.

@jaseg
Last active December 25, 2016 16:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jaseg/97fd37f12aa0232e429bdcb391006d97 to your computer and use it in GitHub Desktop.
Save jaseg/97fd37f12aa0232e429bdcb391006d97 to your computer and use it in GitHub Desktop.
Convert mailbox.org/openXchange contact exports to Fritzbox Phonebook backup files
#!/usr/bin/env python3
# coding: utf-8
import csv
import argparse
avm_xml_template = '''<?xml version="1.0" encoding="utf-8"?>
<phonebooks>
<phonebook>
{entries}
</phonebook>
</phonebooks>'''
contact_xml_template = '''<contact>
<category />
<person>
<realName>{name}</realName>
</person>
<telephony nid="1">
<number prio="1" type="home" id="0">{number}</number>
</telephony>
<services />
<setup />
<uniqueid>{uid}</uniqueid>
</contact>'''
defaultget = lambda entry, fields: next(entry[field] for field in fields if entry.get(field))
make_name = lambda entry: entry.get('Display name') or ' '.join([val for val in map(entry.get, ['Given name', 'Middle name', 'Sur name']) if val]) or entry.get('Company') or entry.get('Unnamed, blame converter script')
def convert_file(infile):
return avm_xml_template.format(entries='\n'.join(convert_entries(infile)))
def convert_entries(infile):
reader = csv.DictReader(infile)
telephone_fields = [n for n in reader.fieldnames if 'elephone' in n]
for uid, entry in enumerate(list(reader), 11):
try:
yield contact_xml_template.format(name=make_name(entry), number=defaultget(entry, telephone_fields), uid=uid)
except StopIteration:
# Contact has no phone number
print('No phone number found for', make_name(entry))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('infile', type=str)
parser.add_argument('outfile', type=str)
args = parser.parse_args()
with open(args.infile, 'r') as infile:
with open(args.outfile, 'w') as outfile:
outfile.write(convert_file(infile))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment