feat: use argparse for CLI

This commit is contained in:
relikd
2023-02-21 20:11:02 +01:00
parent 768b9c09fc
commit 4e9e70f341
2 changed files with 75 additions and 53 deletions

View File

@@ -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.')

View File

@@ -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.')