diff --git a/abcddb2vcard.py b/abcddb2vcard.py index db3b164..81c8467 100755 --- a/abcddb2vcard.py +++ b/abcddb2vcard.py @@ -1,21 +1,43 @@ #!/usr/bin/env python3 +''' +Extract data from AddressBook database (.abcddb) to Contacts VCards file (.vcf) +''' +import os import sys from ABCDDB import ABCDDB from pathlib import Path +from argparse import ArgumentParser -if len(sys.argv) != 2: - print(' Usage:', Path(__file__).name, 'outfile.vcf') - exit(0) -outfile = Path(sys.argv[1]) -if not outfile.parent.exists(): - print('Output directory does not exist.', file=sys.stderr) +DB_FILE = str(Path.home().joinpath( + 'Library', 'Application Support', 'AddressBook', 'AddressBook-v22.abcddb')) + +cli = ArgumentParser(description=__doc__) +cli.add_argument('output', type=str, metavar='outfile.vcf', + help='VCard output file.') +cli.add_argument('-f', '--force', action='store_true', + help='Overwrite existing output file.') +cli.add_argument('-i', '--input', type=str, metavar='AddressBook.abcddb', + default=DB_FILE, help='Specify another abcddb input file.' + ' Default: ' + DB_FILE) +args = cli.parse_args() + +# check input args +if not os.path.isfile(args.input): + print('AddressBook "{}" does not exist.'.format(args.input), + file=sys.stderr) + exit(1) +elif not os.path.isdir(os.path.dirname(args.output) or os.curdir): + print('Output parent directory does not exist.', file=sys.stderr) + exit(1) +elif os.path.isfile(args.output) and not args.force: + print('Output file already exist. Use -f to force overwrite.', + file=sys.stderr) exit(1) -contacts = ABCDDB.load(Path.home().joinpath( - 'Library/Application Support/AddressBook/AddressBook-v22.abcddb')) -# contacts = [list(contacts)[-1]] # test on last imported contact -with open(outfile, 'w') as f: +# perform export +contacts = ABCDDB.load(args.input) +with open(args.output, 'w') as f: for rec in contacts: f.write(rec.makeVCard()) print(len(contacts), 'contacts.') diff --git a/vcard2image.py b/vcard2image.py index 79a8b1b..16c9685 100755 --- a/vcard2image.py +++ b/vcard2image.py @@ -1,53 +1,53 @@ #!/usr/bin/env python3 +''' +Extract all profile pictures from a Contacts VCards file (.vcf) +''' import os import sys from base64 import b64decode -from pathlib import Path +from argparse import ArgumentParser, FileType -if len(sys.argv) != 3: - print(' Usage:', Path(__file__).name, 'infile.vcf', 'outdir/') - exit(0) +cli = ArgumentParser(description=__doc__) +cli.add_argument('input', type=FileType('r'), metavar='infile.vcf', + help='VCard input file.') +cli.add_argument('outdir', type=str, help='Output directory.') +args = cli.parse_args() -infile = Path(sys.argv[1]) -outdir = Path(sys.argv[2]) -if not infile.exists(): - print('Does not exist: ', infile, file=sys.stderr) +# check input args +if not os.path.isdir(os.path.dirname(args.outdir) or os.curdir): + print('Output parent directory does not exist.', file=sys.stderr) exit(1) -elif not outdir.exists(): - if not outdir.parent.exists(): - print('Output directory does not exist.', file=sys.stderr) - exit(1) - else: - os.mkdir(outdir) -with open(infile, 'r') as f: - c1 = 0 - c2 = 0 - name = '' - img = '' - collect = False - for line in f.readlines(): - line = line.rstrip() - if line == 'BEGIN:VCARD': - c1 += 1 - name = '' - img = '' +os.makedirs(args.outdir, exist_ok=True) + +# perform export +c1 = 0 +c2 = 0 +name = '' +img = '' +collect = False +for line in args.input.readlines(): + line = line.rstrip() + if line == 'BEGIN:VCARD': + c1 += 1 + name = '' + img = '' + collect = False + elif line.startswith('FN:'): + name = line.split(':', 1)[1] + elif line.startswith('PHOTO;'): + img = line.split(':', 1)[1] + collect = True + elif collect: + if line[0] == ' ': + img += line[1:] + else: collect = False - elif line.startswith('FN:'): - name = line.split(':', 1)[1] - elif line.startswith('PHOTO;'): - img = line.split(':', 1)[1] - collect = True - elif collect: - if line[0] == ' ': - img += line[1:] - else: - collect = False - if line == 'END:VCARD' and img: - c2 += 1 - name = name.replace('\\,', ',').replace('\\;', ';').replace( - '/', '-') - with open(outdir.joinpath(name + '.jpg'), 'wb') as fw: - fw.write(b64decode(img)) + if line == 'END:VCARD' and img: + c2 += 1 + name = name.replace('\\,', ',').replace('\\;', ';').replace( + '/', '-') + with open(os.path.join(args.outdir, name + '.jpg'), 'wb') as fw: + fw.write(b64decode(img)) - print(c1, 'contacts.', c2, 'images.') +print(c1, 'contacts.', c2, 'images.')