#!/usr/bin/python2.2
#$Id: gal2rdf.py,v 1.2 2002/06/04 00:24:19 edmundd Exp $

import sys

"""A script to generate RDF/XML metadata from the gallery application.
See http://gallery.sf.net/ for more info on gallery.  Adjust the
lines in __main__ which compute the base URI and file system location
to suit your installation."""

def readfield(fp):
    field=""
    quotes=0
    while 1:
        c=fp.read(1)
        if len(c)==0:
            return field
        else:
            field=field+c

        if c=='"':
            if quotes==1:
                quotes=0
            else:
                quotes=1
        elif (c in [':', '{', ';', '}']) and quotes==0:
            return field

def parsefile(fname, author_mbox, baseURI):
    fp=file(fname, 'rb')
    done=0
    data={}
    stack=[data]
    state=['top']
    the_index=None
    while not done:
        f=readfield(fp)
        if f=="":
            done=1
        elif f=="O:":
            readfield(fp)
            name=readfield(fp)[1:-2]
            readfield(fp); readfield(fp)
            if the_index!=None:
                name="%s_%s" % (name,the_index)
            stack[-1][name]={}
            stack.append(stack[-1][name])
            #print name,'= new object'
            state.append('object')
            #print state
            #print stack
        elif f=="s:":
            if state[-1]=='object':
                readfield(fp)
                name=readfield(fp)[1:-2]
                type=readfield(fp)
                #print 'object/s (name, type) ==>', name, type
                if type=="a:":
                    readfield(fp); readfield(fp)
                    stack[-1][name]={}
                    stack.append(stack[-1][name])
                    state.append("array")
                    #print name,'= new array'
                elif type=='O:':
                    readfield(fp); readfield(fp)
                    stack[-1][name]={}
                    stack.append(stack[-1][name])
                    state.append("object")
                    #print name,'= new object'
                    readfield(fp); readfield(fp)
                elif type=='s:':
                    readfield(fp)
                    stack[-1][name]=readfield(fp)[1:-2]
                    #print name,'=',stack[-1][name]
                elif type=='i:':
                    stack[-1][name]=readfield(fp)[:-1]
                    #print name,'=',stack[-1][name]
                else:
                    #print 'name',name,'unknown type',type
                    stack[-1][name]=None
            elif state[-1]=='array':
                readfield(fp)
                name=readfield(fp)[1:-2]
                type=readfield(fp)
                if type=='s:':
                    readfield(fp)
                    stack[-1][name]=readfield(fp)[1:-2]
                    #print name,'=',stack[-1][name]
                elif type=='i:':
                    stack[-1][name]=readfield(fp)[:-1]
                    #print name,'=',stack[-1][name]
                elif type=='a:':
                    stack[-1][name]={}
                    #print name,'= new array'
                    stack.append(stack[-1][name])
                    state.append("array")
                else:
                    #print 'name',name,'unknown type',type
                    stack[-1][name]=None
        elif f=='i:':
            # indexed item in an array
            the_index=readfield(fp)[:-1]
            state.append('index')
        elif f=="}":
            stack=stack[:-1]
            state=state[:-1]
            #print state
            #print stack
            the_index=None
        #print f, state[-1], stack[-1]

    fp.close()

    print """<?xml version="1.0"?>

    <rdf:RDF
            xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
            xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
            xmlns:foaf="http://xmlns.com/foaf/0.1/"
            xmlns:dc="http://purl.org/dc/elements/1.1/">

    <rdf:Description rdf:ID="author">"""
    print "  <foaf:mbox rdf:resource=\"%s\" />" % author_mbox
    print "</rdf:Description>\n\n"


    pics=stack[-1]['album']['photos']
    for p in pics.keys():
        pic=pics[p]

        print "<rdf:Description rdf:about=\"%s\">" % (baseURI+'/'+pic['image']['resizedName']+"."+pic['image']['type'])
        print "  <dc:creator rdf:resource=\"#author\" />"
        print "  <dc:date>%s-%s-%s</dc:date>" % (pic['itemCaptureDate']['year'], pic['itemCaptureDate']['mon'], pic['itemCaptureDate']['mday'])
        print "  <dc:description>"+pic['caption']+"</dc:description>"
        print "  <foaf:thumbnail rdf:resource=\"%s\" />" % (baseURI+'/'+pic['thumbnail']['name']+"."+pic['thumbnail']['type'])

        print "</rdf:Description>"
        print ""
        
    print """\n</rdf:RDF>"""

if __name__=='__main__':
    try:
        (author_mbox, galname)=("mailto:"+sys.argv[1], sys.argv[2])
    except:
        print "usage: %s creator-email-address gallery-name" % sys.argv[0]
        sys.exit(1)

    fname="/var/www/photos/albums/%s/album.dat" % galname
    baseURI="http://photos.heddley.com/albums/%s" % galname
    parsefile(fname, author_mbox, baseURI)
