#!/usr/bin/env python
#
# This downloads google contacts and groups into a crude text format.
#
# This requires GData from:
#
#   http://code.google.com/p/gdata-python-client/
#
# I tested it with version 1.2.4.

import sys
from getopt import getopt
import atom
import gdata.contacts
import gdata.contacts.service

user = None
passwd = None

opts, args = getopt(sys.argv[1:], 'u:p:')

for opt, val in opts:
    if opt == "-u":
        user = val
    if opt == "-p":
        passwd = val

if not (user and passwd):
    raise "Usage: getgooglecontacts -u user@gmail.com -p password"

# Log in
gd_client = gdata.contacts.service.ContactsService()
gd_client.ClientLogin(user, passwd)

#
# Print contacts
#
print '\nContacts'
def PrintFeed(feed):
  for i, entry in enumerate(feed.entry):
    print '\n%s %s' % (i+1, entry.title.text)
    if entry.content:
      print '    %s' % (entry.content.text)
    # Display the email addresses for the contact.
    for email in entry.email:
      if email.primary and email.primary == 'true':
        print '    %s (primary)' % (email.address)
      else:
        print '    %s' % (email.address)
    # Display the phone numbers for the contact.
    for phone in entry.phone_number:
        print '    %s: %s' %  (phone.rel, phone.text)
    # Show the contact groups that this contact is a member of.
    for group in entry.group_membership_info:
      print '    Member of group: %s' % (group.href)

query = gdata.contacts.service.ContactsQuery()
query.max_results = 10000
feed = gd_client.GetContactsFeed(query.ToUri())
PrintFeed(feed)

#
# Print groups
#
print '\nGroups'
def PrintGroupsFeed(feed):
  for i, entry in enumerate(feed.entry):
    print '\n%s %s' % (i+1, entry.title.text)
    # Display the group id which can be used to query the contacts feed.
    print '    Group ID: %s' % entry.id.text

feed = gd_client.GetGroupsFeed()
PrintGroupsFeed(feed)
