54 lines
1.4 KiB
Python
Executable File
54 lines
1.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
'''
|
|
Extract all profile pictures from a Contacts VCards file (.vcf)
|
|
'''
|
|
import os
|
|
import sys
|
|
from base64 import b64decode
|
|
from argparse import ArgumentParser, FileType
|
|
|
|
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()
|
|
|
|
# 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)
|
|
|
|
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
|
|
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.')
|