|
- #!/usr/bin/env python
- # Copyright 2009 John-Mark Gurney <jmg@funkthat.com>
-
- __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)
|