import CDDB
import DiscID
import httplib
import xml.sax
from xml.sax.handler import ContentHandler

#
#
class Freedb2XMLHandler(ContentHandler):
    ##
    def __init__(self):
        ContentHandler.__init__(self)

        self.album = ''
        self.artist = ''
        self.year = ''
        self.genre = ''
        self.trackNames = {}

        self.tmpStr = ''
        self.inTrack = False
        self.trackNo = ''
        
        self.tagDict = {'artist': 0, 'title': 1, 'year': 2,
                        'genre': 3, 'track': 4, 'number': 5 }

    ##
    def startElement(self, name, attrs):
        self.tmpStr = ''
        if name in self.tagDict:
            if self.tagDict[name] == self.tagDict['track']:
                self.inTrack = True
                self.trackNo = ''

    ##
    def endElement(self, name):
        if not name in self.tagDict:
            return

        tagType = self.tagDict[name]
        if tagType == self.tagDict['artist']:
            self.artist += self.tmpStr
        elif tagType == self.tagDict['title']:
            if self.inTrack:
                self.trackNames[int(self.trackNo)] = self.tmpStr
            else:
                self.album += self.tmpStr
        elif tagType == self.tagDict['number']:
            self.trackNo += self.tmpStr
        elif tagType == self.tagDict['year']:
            self.year += self.tmpStr
        elif tagType == self.tagDict['genre']:
            self.genre += self.tmpStr

        if tagType == self.tagDict['track']:
            self.inTrack = False

    ##
    def characters(self, content):
        self.tmpStr += content
        
    ##
    def get_track_name(self, trackNo):
        if trackNo in self.trackNames:
            return self.trackNames[trackNo]

        return ''

def get_cd_category_and_discid(cdDevice, serverURL):
    category = ''
    discID = ''
    try:
        disc = DiscID.open(cdDevice)
        #print disc
        disc_info = DiscID.disc_id(disc)
        #print disc_info
        (status, info) = CDDB.query(disc_info, serverURL)
    except:
        print 'can not get cddb information. '

    # status
    # 200  : success
    # 210  : multiple inexact maches ware found
    # 211  : multiple exact maches ware found
    # other: error
    if status in [210, 211]:
        info = info[0]
        status = 200

    if status == 200:
        category = info['category']
        discID = info['disc_id']

    return (category, discID)

#
#
if __name__ == '__main__':
    (category, discID) = get_cd_category_and_discid('/dev/cdrom',
                                                    'http://tracktype.org:80/~cddb/cddb.cgi')

    if category == '' or discID == '':
        print 'can not get category or discID'
        exit
        
    try:
        con = httplib.HTTPConnection('www.freedb2.org')
        con.request('GET','/xml/%s/%s' % (category, discID),
                    body='',
                    headers={'User-Agent': 'Python/2.5'})
    except:
        print 'can not get xml from freedb2.org'
        exit

    try:
        response = con.getresponse()
        xmldata = response.read()
        #print xmldata
    except:
        print 'can not read xml'
        exit

    try:
        parser = xml.sax.make_parser()
        handler = Freedb2XMLHandler()
        parser.setContentHandler(handler)
        parser.feed(xmldata)
    except:
        print 'parse error occured.'
        exit

    print '============================='
    print 'artist = %s' % handler.artist
    print 'album = %s' % handler.album
    print 'year = %s' % handler.year
    print 'genre = %s' % handler.genre

    cnt = len(handler.trackNames)
    print 'track count = %d' % cnt

    for i in range(cnt):
        print '%d : Name = %s' % (i+1, handler.get_track_name(i+1))

