import sys,os
from ID3 import ID3
from twisted.spread import pb
from twisted.internet import reactor, defer
from twisted.python import util,log

sys.path.append("./")
from index import *

PORTNUM=44268
ID3FIELDS = ["TITLE", "ALBUM", "ARTIST"]
K=1

def trace(x):
    print "TRACE"
    return x

def printArg(x):
    print x

@typechecked(str)
def metadataFromID3(filename):
    """Return a metadata block built from the ID3 tags of the
    specified file."""
    id3 = ID3(filename)

    m = Metadata()

    for field in ID3FIELDS:
        try:
            val = id3[field]
            m.setMetadatum(Metadatum(field.lower(), val, True))
        except KeyError:
            pass
    m.setMetadatum(Metadatum("filename", filename, False))

    return m

def metadataFromMP3Files(root):
    """Return a list of metadata blocks, built from the ID3 tags of
    all the Mp3 files in the specified directory."""
    metadatas = []
    for dirpath, dirname, filenames in os.walk(root):
        for filename in filenames:
            if filename.endswith(".mp3"):
                md = metadataFromID3(os.path.join(dirpath, filename))
                if md.getMetadatum("title") != None:
                    # Ignore anything without a title. Don't know
                    # where these come from exactly.
                    metadatas.append(md)
    return metadatas

            


factory = pb.PBClientFactory()
reactor.connectTCP("localhost", PORTNUM, factory)
d = factory.getRootObject()
d.addErrback(log.err)

def printRes(res):
    print res
    for x in res:
        print x
        
def runQuery(obj):
    q = Query()
    q.addKeyword("title", "god")
    q.addKeyword("title", "wrote")
    q.addKeyword("title", "in")
    q.addKeyword("title", "lisp")
    q.addKeyword("title", "code")
    indName = indexNameFromSet(q.getIndexKeywordSet(K))
    print "Searching index", indName
    resDef = obj.callRemote("recursiveSearch",
                            indName, q)
    resDef.addCallback(printRes)
    resDef.addErrback(log.err)
    reactor.callLater(30, lambda : runQuery(obj))


md = metadataFromMP3Files("/usr/home/dan/arptestmusic/")
print "Built metadata"

def registerMetadata(obj):
    print "Registering metadata"
    deferreds = []
    for x in md:
        deferreds.append(obj.callRemote("recursiveAdd",
                                        x))
    dlist = defer.DeferredList(deferreds)
    dlist.addCallback(lambda ignore: runQuery(obj))
                         
d.addCallback(registerMetadata)
d.addErrback(log.err)
reactor.run()



    

