#!/usr/bin/env python # Copyright 2009 John-Mark Gurney __version__ = '$Change$' # $Id$ import FileDIDL import xml.dom.minidom from DIDLLite import StorageFolder, Item, Resource, ResourceList from FSStorage import FSObject, registerklassfun def getElementText(elm, strip=True): s = ''.join(x.nodeValue for x in elm.childNodes) if strip: s = s.strip() return s class ItemObject(FSObject, Item): def __init__(self, *args, **kwargs): path = kwargs.pop('path') dom = kwargs.pop('dom') FSObject.__init__(self, path) Item.__init__(self, *args, **kwargs) self.checkUpdate(dom=dom) _attrconv = [ ('size', 'size', int), ('bitrate', 'bitrate', int), ('sampleFrequency', 'sampleFrequency', int), ('nrAudioChannels', 'nrAudioChannels', int), ] @staticmethod def _addattrib(res, attr, dom, element, fun=lambda x: x): data = dom.getElementsByTagName(element) if data: setattr(res, attr, fun(getElementText(data[0]))) def doUpdate(self, dom=None): if dom is None: dom = xml.dom.minidom.parse(open(self.FSpath)) obj = dom.getElementsByTagName('Object')[0] self.res = ResourceList() for i in obj.getElementsByTagName('res'): mtel = i.getElementsByTagName('mimetype') rtpel = i.getElementsByTagName('rtppayloadtype') if mtel: mt = getElementText(mtel[0]) pi = 'http-get:*:%s:*' % mt elif rtpel: pt = getElementText(rtpel[0]) pi = 'rtsp-rtp-udp:*:%s:*' % pt else: print 'missing mimetype or rtppayloadtype element, skipping...' continue url = getElementText(i.getElementsByTagName('url')[0]) r = Resource(url, pi) for j in self._attrconv: self._addattrib(r, j[0], i, j[1], *j[2:]) self.res.append(r) super(ItemObject, self).doUpdate() def canHandle(fobj): # XXX - create schema and validate dom = xml.dom.minidom.parse(fobj) #print 'ch:', `dom` obj = dom.getElementsByTagName('Object')[0] mtel = obj.getElementsByTagName('mimetype') rtpel = obj.getElementsByTagName('rtpmimetype') if mtel: mt = getElementText(mtel[0]) elif rtpel: mt = getElementText(rtpel[0]) else: raise ValueError('failed to find mimetpe or rtppayloadtype') #print 'ch:', `obj`, `mt` return dom, mt def detectitem(path, fobj): #print 'di:', `path`, `fobj` try: dom, mt = canHandle(fobj) except: #import traceback #traceback.print_exc() return None, None klass, mt = FileDIDL.buildClassMT(ItemObject, path, mimetype=mt) #print 'match:', `klass`, `mt` return klass, { 'path': path, 'dom': dom } registerklassfun(detectitem)