# upload photos to facebook, reading iptc data
# Ian Wienand <ian@wienand.org>
# Public Domain

import facebook
import iptcdata
from optparse import OptionParser

# key file should contain two lines;
# first line is the API key
# second line is the secret key
KEY_FILE='/home/ianw/.fbupload'

def UploadPhotos():

    try:
        keys = open(KEY_FILE)
        api_key = keys.readline().strip()
        secret_key = keys.readline().strip()
    except:
        print "Can't open keys!"
        exit(1)

    usage = "fbupload.py [-a album] [-l location] [-d description] file1.jpg file2.jpg ..."

    parser = OptionParser(usage, version=".1")

    parser.add_option("-a", "--album", dest="album", action="store", type="string",
                      default="New fbupload album", help="Album Name")
    parser.add_option("-l", "--location", dest="location", action="store",
                      type="string", default="", help="Location")
    parser.add_option("-d", "--descr", dest="descr", action="store",
                      default="", help="Album Description")

    (options, args) = parser.parse_args()

    # setup facebook connection
    fb = facebook.Facebook(api_key, secret_key)
    fb.auth.createToken()
    fb.login()
    print 'Press enter when logged in...'
    raw_input()
    fb.auth.getSession()

    todo = []
    done = 0
    part = 1

    # append 60 photos in a todo list.  subsequent albums are "part
    # 2", "part 3" etc
    while done < len(args):
        if (done < 60):
            name = "%s" % (options.album)
        else:
            name = "%s - Part %d" % (options.album, part)

        todo.append((name, args[done:done+60]))
        done+=60
        part+=1

    for (albumname,files) in todo:

        fbalb = fb.photos.createAlbum(albumname,
                                      options.location,
                                      options.descr)
        
        print "Created album <%s>" % (fbalb['aid'])

        for f in files:
            print "Uploading %s ..." % (f)
            iptc = iptcdata.open(f)
            for ds in iptc.datasets:
                # iptc comment tag
                if ds.tag == 120 and ds.record == 2:
                    photocaption = ds.value
                    print "  " + photocaption
            iptc.close()

            fb.photos.upload(f, fbalb['aid'], caption=photocaption)
            print "done"

if __name__ == '__main__':
    UploadPhotos()
