home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / serpentine / xspf.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  4.6 KB  |  144 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """
  5. This is a very simple utility module for retrieving basic XSPF playlist data.
  6. Basically it retrieves the playlist tracks' title, artist, location and duration.
  7. """
  8. from xml.dom import minidom
  9. from xml.xpath import Evaluate
  10. from xml.dom.minidom import getDOMImplementation
  11.  
  12. class _Field(object):
  13.     
  14.     def __init__(self, id = None, convert = None):
  15.         self.id = id
  16.         self.convert = convert
  17.  
  18.     data = None
  19.     
  20.     def toxml(self, doc, root):
  21.         if self.data is not None:
  22.             node = doc.createElement(self.id)
  23.             node.appendChild(doc.createTextNode(str(self.data)))
  24.             root.appendChild(node)
  25.         
  26.  
  27.  
  28.  
  29. class _Struct(object):
  30.     _fields = { }
  31.     
  32.     def __init__(self, **kw):
  33.         for key in kw:
  34.             if not key in self._fields:
  35.                 raise AssertionError
  36.             self._fields[key].data = kw[key]
  37.         
  38.  
  39.     
  40.     def __setattr__(self, attr, value):
  41.         if attr in self._fields:
  42.             self._fields[attr].data = value
  43.         else:
  44.             self.__dict__[attr] = value
  45.  
  46.     
  47.     def __getattr__(self, attr):
  48.         if attr in self._fields:
  49.             return self._fields[attr].data
  50.         else:
  51.             raise AttributeError, "Instance has no attribute '%s'" % attr
  52.  
  53.     
  54.     def toxml(self, doc, root):
  55.         for key in self._fields:
  56.             self._fields[key].toxml(doc, root)
  57.         
  58.  
  59.     
  60.     def _parse_node(self, node):
  61.         for field in self._fields:
  62.             
  63.             try:
  64.                 avail_fields = Evaluate('%s' % field, node)
  65.                 if len(avail_fields) == 0:
  66.                     continue
  67.                 
  68.                 field_node = avail_fields[0]
  69.                 val = Evaluate('string()', field_node).strip()
  70.                 convert = self._fields[field].convert
  71.                 if convert:
  72.                     val = convert(val)
  73.                 
  74.                 self._fields[field].data = val
  75.             continue
  76.             except ValueError:
  77.                 continue
  78.             
  79.  
  80.         
  81.  
  82.  
  83.  
  84. class Track(_Struct):
  85.     
  86.     def __init__(self, **kw):
  87.         self._fields = {
  88.             'title': _Field('title'),
  89.             'creator': _Field('creator'),
  90.             'duration': _Field('duration', int),
  91.             'location': _Field('location') }
  92.         _Struct.__init__(self, **kw)
  93.  
  94.     
  95.     def toxml(self, doc, root):
  96.         node = doc.createElement('track')
  97.         root.appendChild(node)
  98.         return _Struct.toxml(self, doc, node)
  99.  
  100.  
  101.  
  102. class Playlist(_Struct):
  103.     
  104.     def __init__(self, **kw):
  105.         self._fields = {
  106.             'title': _Field('title'),
  107.             'creator': _Field('creator'),
  108.             'duration': _Field('duration', int),
  109.             'location': _Field('location') }
  110.         _Struct.__init__(self, **kw)
  111.         self.tracks = []
  112.  
  113.     
  114.     def toxml(self):
  115.         '''Returns a xml.dom.Document representing the XSPF playlist'''
  116.         DOM = getDOMImplementation()
  117.         doc = DOM.createDocument(None, 'playlist', None)
  118.         root = doc.documentElement
  119.         root.setAttribute('version', '0')
  120.         trackList = doc.createElement('trackList')
  121.         root.appendChild(trackList)
  122.         for t in self.tracks:
  123.             t.toxml(doc, trackList)
  124.         
  125.         return doc
  126.  
  127.     
  128.     def parse(self, file_or_filename):
  129.         root = minidom.parse(file_or_filename)
  130.         for track_node in Evaluate('/playlist/trackList/track', root):
  131.             t = Track()
  132.             t._parse_node(track_node)
  133.             self.tracks.append(t)
  134.         
  135.  
  136.  
  137. if __name__ == '__main__':
  138.     import sys
  139.     p = Playlist()
  140.     for arg in sys.argv[1:]:
  141.         print to_xml_string(p.parse_filename(arg))
  142.     
  143.  
  144.