home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import rb
- import rhythmdb
- import gobject
- import gtk
- from coherence import __version_info__ as coherence_version
- from coherence import log
- from coherence.upnp.core import DIDLLite
-
- class UpnpSource(rb.BrowserSource, log.Loggable):
- logCategory = 'rb_media_store'
- __gproperties__ = {
- 'plugin': (rb.Plugin, 'plugin', 'plugin', gobject.PARAM_WRITABLE | gobject.PARAM_CONSTRUCT_ONLY),
- 'client': (gobject.TYPE_PYOBJECT, 'client', 'client', gobject.PARAM_WRITABLE | gobject.PARAM_CONSTRUCT_ONLY),
- 'udn': (gobject.TYPE_PYOBJECT, 'udn', 'udn', gobject.PARAM_WRITABLE | gobject.PARAM_CONSTRUCT_ONLY) }
-
- def __init__(self):
- rb.BrowserSource.__init__(self)
- self._UpnpSource__db = None
- self._UpnpSource__activated = False
- self.container_watch = []
- if coherence_version < (0, 5, 1):
- self.process_media_server_browse = self.old_process_media_server_browse
- else:
- self.process_media_server_browse = self.new_process_media_server_browse
-
-
- def do_set_property(self, property, value):
- if property.name == 'plugin':
- self._UpnpSource__plugin = value
- elif property.name == 'client':
- self._UpnpSource__client = value
- self.props.name = self._UpnpSource__client.device.get_friendly_name()
- elif property.name == 'udn':
- self._UpnpSource__udn = value
- else:
- raise AttributeError, 'unknown property %s' % property.name
- return property.name == 'plugin'
-
-
- def do_impl_activate(self):
- if not self._UpnpSource__activated:
- print 'activating upnp source'
- self._UpnpSource__activated = True
- shell = self.get_property('shell')
- self._UpnpSource__db = shell.get_property('db')
- self._UpnpSource__entry_type = self.get_property('entry-type')
- self.load_db(0)
- self._UpnpSource__client.content_directory.subscribe_for_variable('ContainerUpdateIDs', self.state_variable_change)
- self._UpnpSource__client.content_directory.subscribe_for_variable('SystemUpdateID', self.state_variable_change)
-
-
-
- def load_db(self, id):
- d = self._UpnpSource__client.content_directory.browse(id, browse_flag = 'BrowseDirectChildren', process_result = False, backward_compatibility = False)
- d.addCallback(self.process_media_server_browse, self._UpnpSource__udn)
-
-
- def state_variable_change(self, variable, udn = None):
- self.info('%s changed from >%s< to >%s<', variable.name, variable.old_value, variable.value)
- if variable.old_value == '':
- return None
- if variable.name == 'SystemUpdateID':
- self.load_db(0)
- elif variable.name == 'ContainerUpdateIDs':
- changes = variable.value.split(',')
- while len(changes) > 1:
- container = changes.pop(0).strip()
- update_id = changes.pop(0).strip()
- if container in self.container_watch:
- self.info('we have a change in %r, container needs a reload', container)
- self.load_db(container)
- continue
-
-
-
- def new_process_media_server_browse(self, results, udn):
- didl = DIDLLite.DIDLElement.fromString(results['Result'])
- for item in didl.getItems():
- self.info('process_media_server_browse %r %r', item.id, item)
- if item.upnp_class.startswith('object.container'):
- self.load_db(item.id)
-
- if item.upnp_class.startswith('object.item.audioItem'):
- url = None
- duration = None
- size = None
- bitrate = None
- for res in item.res:
- (remote_protocol, remote_network, remote_content_format, remote_flags) = res.protocolInfo.split(':')
- self.info('%r %r %r %r', remote_protocol, remote_network, remote_content_format, remote_flags)
- if remote_protocol == 'http-get':
- url = res.data
- duration = res.duration
- size = res.size
- bitrate = res.bitrate
- break
- continue
-
- if url is not None:
- self.info('url %r %r', url, item.title)
- entry = self._UpnpSource__db.entry_lookup_by_location(url)
- if entry == None:
- entry = self._UpnpSource__db.entry_new(self._UpnpSource__entry_type, url)
-
- self._UpnpSource__db.set(entry, rhythmdb.PROP_TITLE, item.title)
-
- try:
- if item.artist is not None:
- self._UpnpSource__db.set(entry, rhythmdb.PROP_ARTIST, item.artist)
- except AttributeError:
- pass
-
-
- try:
- if item.album is not None:
- self._UpnpSource__db.set(entry, rhythmdb.PROP_ALBUM, item.album)
- except AttributeError:
- pass
-
-
- try:
- self.info('%r %r', item.title, item.originalTrackNumber)
- if item.originalTrackNumber is not None:
- self._UpnpSource__db.set(entry, rhythmdb.PROP_TRACK_NUMBER, int(item.originalTrackNumber))
- except AttributeError:
- pass
-
- if duration is not None:
- (h, m, s) = duration.split(':')
- seconds = int(h) * 3600 + int(m) * 60 + int(s)
- self.info('%r %r:%r:%r %r', duration, h, m, s, seconds)
- self._UpnpSource__db.set(entry, rhythmdb.PROP_DURATION, seconds)
-
- if size is not None:
- self._UpnpSource__db.set(entry, rhythmdb.PROP_FILE_SIZE, int(size))
-
- self._UpnpSource__db.commit()
-
- url is not None
-
-
-
- gobject.type_register(UpnpSource)
-