diff --git a/Readme.md b/Readme.md index e196c68..9cc3d36 100644 --- a/Readme.md +++ b/Readme.md @@ -2,6 +2,8 @@ A set of scripts to download profile images from Google and write them to vcards. Useful for completing the migration from Google to Nextcloud or ownCloud. +As a fallback, if a user doesn't have a Google profile photo, the script will check [Gravatar](https://www.gravatar.com). + ## Setup To run, you first need to set up a few config files diff --git a/google_photo_to_vcard/add_photo.py b/google_photo_to_vcard/add_photo.py index f9eb8bb..a28344c 100644 --- a/google_photo_to_vcard/add_photo.py +++ b/google_photo_to_vcard/add_photo.py @@ -5,6 +5,7 @@ import vobject from google_photo_to_vcard.util import build_photo_path from google_photo_to_vcard.util import download_url_to_path +from google_photo_to_vcard.util import generate_gravatar_url from google_photo_to_vcard.util import read_email_photo_json @@ -52,15 +53,25 @@ def generate_cards(): def main(): email_to_photo = read_email_photo_json() for card, card_path in generate_cards(): + if hasattr(card, 'photo'): + logging.info('%s has photo', card.fn.value) + continue for email_elem in card.contents.get('email', []): email = email_elem.value photo_path = Path(build_photo_path(email)) - if not photo_path.exists() and email in email_to_photo: - download_url_to_path(email_to_photo[email], photo_path) + if not photo_path.exists(): + if email in email_to_photo: + logging.debug('Downloading google photo for %s', card.fn.value) + download_url_to_path(email_to_photo[email], photo_path) + else: + logging.debug('Downloading Gravatar photo for %s', card.fn.value) + gravatar_url = generate_gravatar_url(email) + download_url_to_path(gravatar_url, photo_path) if photo_path.exists(): if maybe_add_photo(card, photo_path): write_card_to_path(card, card_path) logging.info('Added photo to %s', card.fn.value) + break if __name__ == '__main__': diff --git a/google_photo_to_vcard/util.py b/google_photo_to_vcard/util.py index cf983a6..afe95cc 100644 --- a/google_photo_to_vcard/util.py +++ b/google_photo_to_vcard/util.py @@ -2,6 +2,7 @@ import json import logging import urllib.request as request from urllib.error import HTTPError +from hashlib import md5 EMAIL_TO_PHOTO_JSON_PATH = 'build/email_to_photo.json' @@ -18,14 +19,22 @@ def read_email_photo_json(): def build_photo_path(email): - return 'build/photos/{}.jpeg'.format(email) + return 'build/photos/{}.jpeg'.format(email.lower()) def download_url_to_path(url, path): try: - with open(path, mode='xb') as f, request.urlopen(url) as r: - f.write(r.read()) + with request.urlopen(url) as r: + with open(path, mode='xb') as f: + f.write(r.read()) return path except HTTPError as e: logging.error(e) return None + + +def generate_gravatar_url(email, size=200, default='404'): + email_hash = md5(email.lower().encode('utf-8')).hexdigest() + return 'https://www.gravatar.com/avatar/{}?s={}&d={}'.format( + email_hash, str(size), default + )