Exemple #1
0
    def start(self):
        print "Upnp backend starting"
        # clear device list
        self._removeXML() 

        # config Coherence
        conf = Config(self._configfile)
        c = Coherence({'logmode':'warning'})
        c.setup(conf)        
        #add share folders
        con = ""
        for f in config.share_folders:
            if len(con) > 0:
                con +=","
            con += f
        c.add_plugin('FSStore',name=config.device_name,content=con)

        # start a ControlPoint to start detecting upnp activity
        cp = ControlPoint(c, auto_client=['MediaServer'])
        cp.connect(self.mediaserver_detected, 'Coherence.UPnP.ControlPoint.MediaServer.detected')
        cp.connect(self.mediaserver_removed, 'Coherence.UPnP.ControlPoint.MediaServer.removed')
	
	#self._localdevice = cp.get_device_by_name(self._localdevicename)
	#print "SPRURPDDSOPF            ",self._localdevice.client.get_friendly_name()
        
        print "Upnp loop succesfully started"
        self._handler.start()
        print "DBus loop succesfully started"
Exemple #2
0
    def start(self):
        print "Upnp backend starting"
        # clear device list
        self._removeXML()

        # config Coherence
        conf = Config(self._configfile)
        c = Coherence({'logmode': 'warning'})
        c.setup(conf)
        #add share folders
        con = ""
        for f in config.share_folders:
            if len(con) > 0:
                con += ","
            con += f
        c.add_plugin('FSStore', name=config.device_name, content=con)

        # start a ControlPoint to start detecting upnp activity
        cp = ControlPoint(c, auto_client=['MediaServer'])
        cp.connect(self.mediaserver_detected,
                   'Coherence.UPnP.ControlPoint.MediaServer.detected')
        cp.connect(self.mediaserver_removed,
                   'Coherence.UPnP.ControlPoint.MediaServer.removed')

        #self._localdevice = cp.get_device_by_name(self._localdevicename)
        #print "SPRURPDDSOPF            ",self._localdevice.client.get_friendly_name()

        print "Upnp loop succesfully started"
        self._handler.start()
        print "DBus loop succesfully started"
Exemple #3
0
def start():
    control_point = ControlPoint(Coherence({'logmode': 'warning'}),
                                 auto_client=['MediaServer'])
    control_point.connect(media_server_found,
                          'Coherence.UPnP.ControlPoint.MediaServer.detected')
    control_point.connect(media_server_removed,
                          'Coherence.UPnP.ControlPoint.MediaServer.removed')
class UPNP_Browser():
    def __init__(self):
        self.browse_count = 0
        self.music = Music_DB()
        self.__client = None
        self.control_point = ControlPoint(Coherence({'logmode':'warning'}),
            auto_client=['MediaServer'])
        self.control_point.connect(self.media_server_found,
                'Coherence.UPnP.ControlPoint.MediaServer.detected')
        self.control_point.connect(self.media_server_removed,
                'Coherence.UPnP.ControlPoint.MediaServer.removed')


        # now we should also try to discover the ones that are already there:
        for device in self.control_point.coherence.devices:
            print device

    # called for each media server found
    def media_server_found(self, client, udn):
        print "media_server_found", client
        print "media_server_found", client.device.get_friendly_name()

        self.__client = client
        self.load_children(0)

    # sadly they sometimes get removed as well :(
    def media_server_removed(self, udn):
        print "media_server_removed", udn

    # browse callback
    def process_media_server_browse(self, result, client):
        print "browsing root of", client.device.get_friendly_name()
        print "result contains %d out of %d total matches" % \
                (int(result['NumberReturned']), int(result['TotalMatches']))

        elt = DIDLLite.DIDLElement.fromString(result['Result'])
        for item in elt.getItems():
            if item.upnp_class.startswith("object.container"):
                self.load_children(item.id)

            if item.upnp_class.startswith("object.item"):
                url = None
                duration = None
                size = None

                for res in item.res:
                    remote_protocol,remote_network,remote_content_format,remote_flags = res.protocolInfo.split(':')
                    if remote_protocol == 'http-get':
                        url = res.data
                        duration = res.duration
                        size = res.size
                        break

                self.music.add_song(item, url, duration)

    def load_children(self, id):
        self.browse_count += 1
        d = self.__client.content_directory.browse(id, browse_flag='BrowseDirectChildren', process_result=False, backward_compatibility=False)
        d.addCallback(self.process_media_server_browse, self.__client)
def start():
  control_point = ControlPoint(Coherence({'logmode': 'warning'}),
                               auto_client=['MediaServer'])
  control_point.connect(media_server_found, 'Coherence.UPnP.ControlPoint.MediaServer.detected')
  control_point.connect(media_server_removed, 'Coherence.UPnP.ControlPoint.MediaServer.removed')

  # now we should also try to discover the ones that are already there:
  for device in control_point.coherence.devices:
    print device
Exemple #6
0
class Puncher(object):

    def __init__(self,command,config):
        #print "command %r %r %r" %(command,config,config.subOptions)
        self.config = config
        self.locked = False
        if command == None:
            self.command = 'show-devices'
        else:
            self.command = command

        if self.command == 'show-devices':
            self.locked = None

        if self.command == 'add-mapping':
            if self.config.subOptions['internal-host'] == None:
                raise Exception("internal-host parameter missing")
            if self.config.subOptions['internal-port'] == None:
                raise Exception("internal-port parameter missing")
            if self.config.subOptions['protocol'].lower() not in ['tcp','udp']:
                raise Exception("protocol value invalid")
            if self.config.subOptions['active'].lower() in ['y','true','1','yes']:
                self.config.subOptions['active'] = True
            else:
                self.config.subOptions['active'] = False
            if self.config.subOptions['remote-host'].lower() in ['""','any']:
                self.config.subOptions['remote-host'] = ''
            if self.config.subOptions['external-port'] == None:
                self.config.subOptions['external-port'] = self.config.subOptions['internal-port']

        if self.command == 'delete-mapping':
            if self.config.subOptions['remote-host'] == None:
                raise Exception("remote-host parameter missing")
            if self.config.subOptions['external-port'] == None:
                raise Exception("external-port parameter missing")
            if self.config.subOptions['protocol'].lower() not in ['tcp','udp']:
                raise Exception("protocol value invalid")

        coherence_config = {}
        coherence_config['logmode'] = 'none'

        self.control_point = ControlPoint(Coherence(coherence_config),auto_client=['InternetGatewayDevice'])
        self.control_point.connect(self.igd_found, 'Coherence.UPnP.ControlPoint.InternetGatewayDevice.detected')
        self.control_point.connect(self.igd_removed, 'Coherence.UPnP.ControlPoint.InternetGatewayDevice.removed')

        self.timeout = reactor.callLater(int(self.config['timeout']),self.stop)
        self.devices = {}

        self.reports = {'show-devices': self.show_devices,
                        'show-mappings': self.show_mappings,
                        'info': self.show_info}


    def show_devices(self):
        for uuid in self.devices.keys():
            print "%s with uuid:%s" % (self.devices[uuid]['friendly_name'], uuid)

    def show_info(self):
        for uuid in self.devices.keys():
            print "%s with uuid:%s" % (self.devices[uuid]['friendly_name'], uuid)
        if len(self.devices) > 0:
            print "External IP address: ", self.external_ip_address
            print "Number of port-mappings: ", self.port_mapping_number_of_entries

    def show_mappings(self):
        for uuid in self.devices.keys():
            print "%s with uuid:%s" % (self.devices[uuid]['friendly_name'], uuid)
        mappings = self.devices[uuid].get('mappings',None)
        if mappings == None or len(mappings) == 0:
            print "no port-mappings found"
        else:
            print "Ext. Port | Remote Host    | Int. Port | Internal Host   | Prot. | active | duration | description"
            print "=" * 100
            for mapping in mappings:
                if mapping['NewLeaseDuration'] == '0':
                    mapping['NewLeaseDuration'] = 'infinite'
                else:
                    mapping['NewLeaseDuration'] += 'sec'
                if mapping['NewRemoteHost'] == '':
                    mapping['NewRemoteHost'] = 'any'
                if mapping['NewEnabled'] == '1':
                    mapping['NewEnabled'] = 'yes'
                else:
                    mapping['NewEnabled'] = 'no'
                print "    %05s | %-14s |     %05s | %-14s | %5s | %6s | %8s | %s" % (mapping['NewExternalPort'],
                                                                                   mapping['NewRemoteHost'],
                                                                                   mapping['NewInternalPort'],
                                                                                   mapping['NewInternalClient'],
                                                                                   mapping['NewProtocol'],
                                                                                   mapping['NewEnabled'],
                                                                                   mapping['NewLeaseDuration'],
                                                                                   mapping['NewPortMappingDescription'])
            print "=" * 100

    def stop(self,quiet=False):
        try:
            self.timeout.cancel()
        except:
            pass

        if quiet == False:
            if len(self.devices) == 0:
                print "no InternetGatewayDevice found"
            elif len(self.devices) == 1:
                print "1 InternetGatewayDevice found:"
            else:
                print "%d InternetGatewayDevices found:" % len(self.devices)
            self.reports.get(self.command,self.show_devices)()
        print ""
        reactor.stop()

    def append_mappings(self,mappings,device):
        device['mappings'] = mappings
        self.stop()

    def add_mapping_ok(self,result,device):
        print "port-mapping to %s added" %device['friendly_name']
        self.stop(quiet=True)

    def add_mapping_failed(self,result,device):
        print "failed to add port-mapping to %s" %device['friendly_name']
        self.stop(quiet=True)

    def delete_mapping_ok(self,result,device):
        print "port-mapping deleted from %s" %device['friendly_name']
        self.stop(quiet=True)

    def delete_mapping_failed(self,result,device):
        print "failed to delete port-mapping from %s" %device['friendly_name']
        self.stop(quiet=True)

    def igd_found(self,client,udn):
        #print "IGD found", client.device.get_friendly_name()
        if self.locked == True:
            return
        elif self.locked == False:
            self.locked = True
        if(self.config['uuid'] != None and
           client.device.get_uuid().endswith(self.config['uuid']) == False):
            return
        self.devices[client.device.get_uuid()] = {'friendly_name': client.device.get_friendly_name()}
        if self.locked == True:
            wan_ip_connection_service = client.wan_device.wan_connection_device.wan_ip_connection or \
                                        client.wan_device.wan_connection_device.wan_ppp_connection
            if self.command == 'show-mappings':
                dfr = wan_ip_connection_service.get_all_port_mapping_entries()
                dfr.addCallback(self.append_mappings,self.devices[client.device.get_uuid()])
            elif self.command == 'add-mapping':
                dfr = wan_ip_connection_service.add_port_mapping(remote_host=self.config.subOptions['remote-host'],
                             external_port=int(self.config.subOptions['external-port']),
                             protocol=self.config.subOptions['protocol'].upper(),
                             internal_port=int(self.config.subOptions['internal-port']),
                             internal_client=self.config.subOptions['internal-host'],
                             enabled=self.config.subOptions['active'],
                             port_mapping_description=self.config.subOptions['description'],
                             lease_duration=int(self.config.subOptions['lease-duration']))
                dfr.addCallback(self.add_mapping_ok,self.devices[client.device.get_uuid()])
                dfr.addErrback(self.add_mapping_failed,self.devices[client.device.get_uuid()])
            elif self.command == 'delete-mapping':
                dfr = wan_ip_connection_service.delete_port_mapping(remote_host=self.config.subOptions['remote-host'],
                             external_port=int(self.config.subOptions['external-port']),
                             protocol=self.config.subOptions['protocol'].upper())
                dfr.addCallback(self.delete_mapping_ok,self.devices[client.device.get_uuid()])
                dfr.addErrback(self.delete_mapping_failed,self.devices[client.device.get_uuid()])
            elif self.command == 'info':
                self.port_mapping_number_of_entries = None
                self.external_ip_address = None
                wan_ip_connection_service.subscribe_for_variable('PortMappingNumberOfEntries', callback=self.state_variable_change)
                wan_ip_connection_service.subscribe_for_variable('ExternalIPAddress', callback=self.state_variable_change)


    def igd_removed(self,udn):
        #print "IGD removed", udn
        pass

    def state_variable_change(self,variable):
        if variable.name == 'ExternalIPAddress':
            self.external_ip_address = variable.value
        elif variable.name == 'PortMappingNumberOfEntries':
            if variable.value != '':
                self.port_mapping_number_of_entries = int(variable.value)
            else:
                self.port_mapping_number_of_entries = 0
        if(self.port_mapping_number_of_entries != None and
           self.external_ip_address != None):
            self.stop()
Exemple #7
0
class ManagedControlPoint(object):
	DEVICE_TYPE_SATIP_SERVER = "SatIPServer"
	DEVICE_TYPE_DREAMBOX = "Dreambox"
	URI_BASE_DREAMBOX = "urn:dreambox-de:device"

	def __init__(self):
		self.coherence = None
		self._controlPoint = None
		self.__mediaServerClients = {}
		self.__mediaRendererClients = {}
		self.__mediaDevices = {}
		self.__devices = []
		self.onMediaServerDetected = []
		self.onMediaServerRemoved  = []
		self.onMediaRendererDetected = []
		self.onMediaRendererRemoved = []
		self.onMediaDeviceDectected = []
		self.onMediaDeviceRemoved = []
		self.onSatIpServerDetected = []
		self.onSatIpServerRemoved = []
		self.onDreamboxDetected = []
		self.onDreamboxRemoved = []
		self._session = None
		self.__deferredShutDown = None
		self._startPending = False

	def _onShutdownFinished(self, *args, **kwargs):
		self.__deferredShutDown = None
		if self._startPending:
			self.start()

	def start(self):
		def doStart(*args, **kwargs):
			if self._controlPoint:
				Log.w("already running!")
				return
			Log.i("starting now!")
			self._startPending = False
			self.coherence = Coherence({
				'logging': {
					'level' : 'warning', 
					'subsystem' : [
						{'name' : 'msearch', 'level' : 'warning'},
						{'name' : 'ssdp', 'level' : 'warning'}
					]}
				})
			self._controlPoint = ControlPoint(self.coherence, auto_client=['MediaServer','MediaRenderer'])
			self.coherence.ctrl = self._controlPoint
			self.__mediaServerClients = {}
			self.__mediaRendererClients = {}
			self.__mediaDevices = {}
			self.__devices = []
			self._controlPoint.connect(self._onMediaServerDetected, 'Coherence.UPnP.ControlPoint.MediaServer.detected')
			self._controlPoint.connect(self._onMediaServerRemoved, 'Coherence.UPnP.ControlPoint.MediaServer.removed')
			self._controlPoint.connect(self._onMediaRendererDetected, 'Coherence.UPnP.ControlPoint.MediaRenderer.detected')
			self._controlPoint.connect(self._onMediaRendererRemoved, 'Coherence.UPnP.ControlPoint.MediaRenderer.removed')
			self._controlPoint.connect(self._onMediaDeviceDectected, 'Coherence.UPnP.Device.detection_completed')
			self._controlPoint.connect(self._onMediaDeviceRemoved, 'Coherence.UPnP.RootDevice.removed')
			self.__deferredShutDown = None
			if self._session:
				self._callPlugins(reason=0)
		if self.__deferredShutDown:
			Log.w("deferring start until shutdown is finished")
			if not self._startPending:
				self._startPending = True
		else:
			doStart()

	def restart(self):
		Log.i()
		if not self.__deferredShutDown:
			self.shutdown()
		self.start()

	def setSession(self, session):
		self._session = session
		if self.coherence:
			self._callPlugins(reason=0)

	def _callPlugins(self, reason=0):
		for plugin in plugins.getPlugins(PluginDescriptor.WHERE_UPNP):
			plugin(reason, session=self._session)

	def _onMediaServerDetected(self, client, udn):
		print "[DLNA] MediaServer Detected: %s (%s)" % (client.device.get_friendly_name(), client.device.get_friendly_device_type())
		self.__mediaServerClients[udn] = client
		for fnc in self.onMediaServerDetected:
			fnc(udn, client)

	def _onMediaServerRemoved(self, udn):
		if self.__mediaServerClients.get(udn, None) != None:
			del self.__mediaServerClients[udn]
			for fnc in self.onMediaServerRemoved:
				fnc(udn)

	def _onMediaRendererDetected(self, client, udn):
		print "[DLNA] MediaRenderer detected: %s (%s, %s)" % (client.device.get_friendly_name(), client.device.get_friendly_device_type(), udn)
		self.__mediaRendererClients[udn] = client
		for fnc in self.onMediaRendererDetected:
			fnc(udn, client)

	def _onMediaRendererRemoved(self, udn):
		print "[DLNA] MediaRenderer removed: %s" % (udn)
		if self.__mediaRendererClients.get(udn, None) != None:
			del self.__mediaRendererClients[udn]
			for fnc in self.onMediaRendererRemoved:
				fnc(udn)

	def _onMediaDeviceDectected(self, device):
		if device.udn in self.__mediaDevices:
			return
		self.__mediaDevices[device.udn] = device
		device_type = device.get_friendly_device_type()
		if device_type == self.DEVICE_TYPE_SATIP_SERVER:
			Log.i("New SAT>IP Server found: %s (%s - %s)" %(device.get_friendly_name(), device.get_friendly_device_type(), device.get_satipcap()))
			for fnc in self.onSatIpServerDetected:
				fnc(device)
		elif device_type == self.DEVICE_TYPE_DREAMBOX:
			Log.i("New Dreambox found: %s (%s - %s)" %(device.get_friendly_name(), device.get_friendly_device_type(), device.get_presentation_url()))
			for fnc in self.onDreamboxDetected:
				fnc(device)
		else:
			Log.i("New Device found: %s (%s)" % (device.get_friendly_name(), device.get_friendly_device_type()))

	def _onMediaDeviceRemoved(self, usn):
		if usn in self.__mediaDevices:
			print "[DLNA] Device removed: %s" % (usn)
			device = self.__mediaDevices[usn]
			device_type = device.get_friendly_device_type()
			if device_type == self.DEVICE_TYPE_SATIP_SERVER:
				for fnc in self.onSatIpServerRemoved:
					fnc(device)
			elif device_type == self.DEVICE_TYPE_DREAMBOX:
				for fnc in self.onDreamboxRemoved:
					fnc(device)
			for fnc in self.onMediaDeviceRemoved:
				fnc(device)
			del self.__mediaDevices[usn]

	def registerRenderer(self, classDef, **kwargs):
		renderer = MediaRenderer(self.coherence, classDef, no_thread_needed=True, **kwargs)
		self.__devices.append(renderer)
		return renderer

	def registerServer(self, classDef, **kwargs):
		server = MediaServer(self.coherence, classDef, no_thread_needed=True, **kwargs)
		self.__devices.append(server)
		return server

	def registerDevice(self, instance, **kwargs):
		self.__devices.append(instance)
		return instance

	def getServerList(self):
		return self.__mediaServerClients.values()

	def getRenderingControlClientList(self):
		return self.__mediaRendererClients.values()

	def getDeviceName(self, client):
		return Item.ue(client.device.get_friendly_name())

	def getSatIPDevices(self):
		devices = []
		for device in self.__mediaDevices.itervalues():
			if device.get_friendly_device_type() == self.DEVICE_TYPE_SATIP_SERVER:
				devices.append(device)
		return devices

	def getDreamboxes(self):
		devices = []
		for device in self.__mediaDevices.itervalues():
			if device.get_friendly_device_type() == self.DEVICE_TYPE_DREAMBOX:
				devices.append(device)
		return devices

	def getDevice(self, uuid):
		for device in self.__devices:
			if device.uuid == uuid:
				return device
		return None

	def removeDevice(self, uuid):
		device = self.getDevice(uuid)
		if device:
			device.unregister()
			self.__devices.remove(device)
			return True
		return False

	def shutdown(self):
		Log.i("%s" %(self.coherence,))
		if True:
			Log.w("shutdown is broken... will continue running. please restart enigma2 instead!")
			return
		if self.coherence:
			self._callPlugins(reason=1)
			self.__mediaServerClients = {}
			self.__mediaRendererClients = {}
			self.__mediaDevices = {}
			self.__devices = []
			self.__deferredShutDown = self.coherence.shutdown(force=True)
			self.__deferredShutDown.addCallback(self._onShutdownFinished)
			self._controlPoint.disconnect(self._onMediaServerDetected, 'Coherence.UPnP.ControlPoint.MediaServer.detected')
			self._controlPoint.disconnect(self._onMediaServerRemoved, 'Coherence.UPnP.ControlPoint.MediaServer.removed')
			self._controlPoint.disconnect(self._onMediaRendererDetected, 'Coherence.UPnP.ControlPoint.MediaRenderer.detected')
			self._controlPoint.disconnect(self._onMediaRendererRemoved, 'Coherence.UPnP.ControlPoint.MediaRenderer.removed')
			self._controlPoint.disconnect(self._onMediaDeviceDectected, 'Coherence.UPnP.Device.detection_completed')
			self._controlPoint.disconnect(self._onMediaDeviceRemoved, 'Coherence.UPnP.RootDevice.removed')
			self.coherence = None
			self._controlPoint = None
Exemple #8
0
class ManagedControlPoint(object):
	def __init__(self):
		self.coherence = Coherence({'logmode':'warning'})
		self._controlPoint = ControlPoint(self.coherence, auto_client=['MediaServer','MediaRenderer'])
		self._controlPoint.connect(self._onMediaServerDetected, 'Coherence.UPnP.ControlPoint.MediaServer.detected')
		self._controlPoint.connect(self._onMediaServerRemoved, 'Coherence.UPnP.ControlPoint.MediaServer.removed')
		self._controlPoint.connect(self._onMediaRendererDetected, 'Coherence.UPnP.ControlPoint.MediaRenderer.detected')
		self._controlPoint.connect(self._onMediaRendererRemoved, 'Coherence.UPnP.ControlPoint.MediaRenderer.removed')
		self._controlPoint.connect(self._onMediaDeviceDectected, 'Coherence.UPnP.Device.detection_completed')

		self.__mediaServerClients = {}
		self.__mediaRendererClients = {}
		self.__mediaDevices = {}

		self.__browser = []
		self.__devices = []

		self.onMediaServerDetected = []
		self.onMediaServerRemoved  = []
		self.onMediaRendererDetected = []
		self.onMediaRendererRemoved = []
		self.onMediaDeviceDectected = []

	def _onMediaServerDetected(self, client, udn):
		print "[DLNA] MediaServer Detected: %s (%s)" % (client.device.get_friendly_name(), client.device.get_friendly_device_type())
		self.__mediaServerClients[udn] = client
		for fnc in self.onMediaServerDetected:
			fnc(udn, client)

	def _onMediaServerRemoved(self, udn):
		if self.__mediaServerClients.get(udn, None) != None:
			del self.__mediaServerClients[udn]
			for fnc in self.onMediaServerRemoved:
				fnc(udn)

	def _onMediaRendererDetected(self, client, udn):
		print "[DLNA] MediaRenderer detected: %s (%s, %s)" % (client.device.get_friendly_name(), client.device.get_friendly_device_type(), udn)
		self.__mediaRendererClients[udn] = client
		for fnc in self.onMediaRendererDetected:
			fnc(udn, client)

	def _onMediaRendererRemoved(self, udn):
		print "[DLNA] MediaRenderer removed: %s" % (udn)
		if self.__mediaRendererClients.get(udn, None) != None:
			del self.__mediaRendererClients[udn]
			for fnc in self.onMediaRendererRemoved:
				fnc(udn)

	def _onMediaDeviceDectected(self, device):
		print "[DLNA] Device found: %s (%s)" % (device.get_friendly_name(), device.get_friendly_device_type())
		self.__mediaDevices[device.udn] = device

	def registerRenderer(self, classDef, **kwargs):
		renderer = MediaRenderer(self.coherence, classDef, no_thread_needed=True, **kwargs)
		self.__devices.append(renderer)
		return renderer

	def registerServer(self, classDef, **kwargs):
		server = MediaServer(self.coherence, classDef, no_thread_needed=True, **kwargs)
		self.__devices.append(server)
		return server

	def getServerList(self):
		return self.__mediaServerClients.values()

	def getRenderingControlClientList(self):
		return self.__mediaRendererClients.values()

	def getDeviceName(self, client):
		return Item.ue(client.device.get_friendly_name())

	def shutdown(self):
		for device in self.__devices:
			device.unregister()
		self._controlPoint.shutdown()
Exemple #9
0
class UpnpRapp(object):
    def __init__(self):

        # configuration setup
        self.gconf = gconf.client_get_default()
        self.conf = {
            "autoconnect": self.gconf.get_bool(gconf_keys["autoconnect"]),
            "udn": self.gconf.get_string(gconf_keys["udn"]),
            "mmkeys": self.gconf.get_bool(gconf_keys["mmkeys"]),
        }

        # coherence setup
        self.coherence = Coherence({"logmode": "warning"})
        self.ctp = ControlPoint(self.coherence, auto_client=["MediaRenderer"])

        # internals setup
        self.client = MediaRendererClient(self.coherence)

        self.gui = StatusIconController(self)
        self.gui.connect(self.client)

        self.mmkeys = MMKeysController(name="MUPnPApp")
        # hack to make it start
        if True or self.conf["mmkeys"]:
            self.mmkeys.connect(self.client)

        # signal connection
        self.ctp.connect(self._renderer_found, "Coherence.UPnP.ControlPoint.MediaRenderer.detected")

        self.ctp.connect(self._renderer_removed, "Coherence.UPnP.ControlPoint.MediaRenderer.removed")

    def _renderer_found(self, device=None, udn=None, client=None):
        # FIXME: take care about the auto connect if not connected yet
        # instead of just connecting
        if not device:
            device = self.coherence.get_device_with_id(udn)

        self.gui.device_found(device, udn)
        if not self.client.device and self.conf["autoconnect"]:
            if device.udn == self.conf["udn"]:
                self.connect(device)

    def _renderer_removed(self, device=None, udn=None):
        return
        self.gui.renderer_removed(device, udn)

    def set_autoconnect(self, value):
        self.conf["autoconnect"] = value
        self.gconf.set_bool(gconf_keys["autoconnect"], value)

    def set_mmkeys(self, value):
        self.conf["mmkeys"] = value
        self.gconf.set_bool(gconf_keys["mmkeys"], value)
        # reloading
        if not value:
            self.mmkeys.disconnect()
        else:
            self.mmkeys.connect(self.client)

    def quit(self, value=0):
        # FIXME: we should disconnect and stuff here
        sys.exit(value)

    def connect(self, device):
        print "connecting to %s" % device.get_friendly_name()
        self.gconf.set_string(gconf_keys["udn"], str(device.udn))

        self.client.disconnect()
        self.client.connect(device)
        # HACK!
        self.gui._connection_state_changed(True, device)
Exemple #10
0
class ManagedControlPoint(object):
    DEVICE_TYPE_SATIP_SERVER = "SatIPServer"
    DEVICE_TYPE_DREAMBOX = "Dreambox"
    URI_BASE_DREAMBOX = "urn:dreambox-de:device"

    def __init__(self):
        self.coherence = None
        self._controlPoint = None
        self.__mediaServerClients = {}
        self.__mediaRendererClients = {}
        self.__mediaDevices = {}
        self.__devices = []
        self.onMediaServerDetected = []
        self.onMediaServerRemoved = []
        self.onMediaRendererDetected = []
        self.onMediaRendererRemoved = []
        self.onMediaDeviceDectected = []
        self.onMediaDeviceRemoved = []
        self.onSatIpServerDetected = []
        self.onSatIpServerRemoved = []
        self.onDreamboxDetected = []
        self.onDreamboxRemoved = []
        self._session = None
        self.__deferredShutDown = None
        self._startPending = False

    def _onShutdownFinished(self, *args, **kwargs):
        self.__deferredShutDown = None
        if self._startPending:
            self.start()

    def start(self):
        def doStart(*args, **kwargs):
            if self._controlPoint:
                Log.w("already running!")
                return
            Log.i("starting now!")
            self._startPending = False
            self.coherence = Coherence({
                'logging': {
                    'level':
                    'warning',
                    'subsystem': [{
                        'name': 'msearch',
                        'level': 'warning'
                    }, {
                        'name': 'ssdp',
                        'level': 'warning'
                    }]
                }
            })
            self._controlPoint = ControlPoint(
                self.coherence, auto_client=['MediaServer', 'MediaRenderer'])
            self.coherence.ctrl = self._controlPoint
            self.__mediaServerClients = {}
            self.__mediaRendererClients = {}
            self.__mediaDevices = {}
            self.__devices = []
            self._controlPoint.connect(
                self._onMediaServerDetected,
                'Coherence.UPnP.ControlPoint.MediaServer.detected')
            self._controlPoint.connect(
                self._onMediaServerRemoved,
                'Coherence.UPnP.ControlPoint.MediaServer.removed')
            self._controlPoint.connect(
                self._onMediaRendererDetected,
                'Coherence.UPnP.ControlPoint.MediaRenderer.detected')
            self._controlPoint.connect(
                self._onMediaRendererRemoved,
                'Coherence.UPnP.ControlPoint.MediaRenderer.removed')
            self._controlPoint.connect(
                self._onMediaDeviceDectected,
                'Coherence.UPnP.Device.detection_completed')
            self._controlPoint.connect(self._onMediaDeviceRemoved,
                                       'Coherence.UPnP.RootDevice.removed')
            self.__deferredShutDown = None
            if self._session:
                self._callPlugins(reason=0)

        if self.__deferredShutDown:
            Log.w("deferring start until shutdown is finished")
            if not self._startPending:
                self._startPending = True
        else:
            doStart()

    def restart(self):
        Log.i()
        if not self.__deferredShutDown:
            self.shutdown()
        self.start()

    def setSession(self, session):
        self._session = session
        if self.coherence:
            self._callPlugins(reason=0)

    def _callPlugins(self, reason=0):
        for plugin in plugins.getPlugins(PluginDescriptor.WHERE_UPNP):
            plugin(reason, session=self._session)

    def _onMediaServerDetected(self, client, udn):
        print "[DLNA] MediaServer Detected: %s (%s)" % (
            client.device.get_friendly_name(),
            client.device.get_friendly_device_type())
        self.__mediaServerClients[udn] = client
        for fnc in self.onMediaServerDetected:
            fnc(udn, client)

    def _onMediaServerRemoved(self, udn):
        if self.__mediaServerClients.get(udn, None) != None:
            del self.__mediaServerClients[udn]
            for fnc in self.onMediaServerRemoved:
                fnc(udn)

    def _onMediaRendererDetected(self, client, udn):
        print "[DLNA] MediaRenderer detected: %s (%s, %s)" % (
            client.device.get_friendly_name(),
            client.device.get_friendly_device_type(), udn)
        self.__mediaRendererClients[udn] = client
        for fnc in self.onMediaRendererDetected:
            fnc(udn, client)

    def _onMediaRendererRemoved(self, udn):
        print "[DLNA] MediaRenderer removed: %s" % (udn)
        if self.__mediaRendererClients.get(udn, None) != None:
            del self.__mediaRendererClients[udn]
            for fnc in self.onMediaRendererRemoved:
                fnc(udn)

    def _onMediaDeviceDectected(self, device):
        if device.udn in self.__mediaDevices:
            return
        self.__mediaDevices[device.udn] = device
        device_type = device.get_friendly_device_type()
        if device_type == self.DEVICE_TYPE_SATIP_SERVER:
            Log.i("New SAT>IP Server found: %s (%s - %s)" %
                  (device.get_friendly_name(),
                   device.get_friendly_device_type(), device.get_satipcap()))
            for fnc in self.onSatIpServerDetected:
                fnc(device)
        elif device_type == self.DEVICE_TYPE_DREAMBOX:
            Log.i(
                "New Dreambox found: %s (%s - %s)" %
                (device.get_friendly_name(), device.get_friendly_device_type(),
                 device.get_presentation_url()))
            for fnc in self.onDreamboxDetected:
                fnc(device)
        else:
            Log.i("New Device found: %s (%s)" %
                  (device.get_friendly_name(),
                   device.get_friendly_device_type()))

    def _onMediaDeviceRemoved(self, usn):
        if usn in self.__mediaDevices:
            print "[DLNA] Device removed: %s" % (usn)
            device = self.__mediaDevices[usn]
            device_type = device.get_friendly_device_type()
            if device_type == self.DEVICE_TYPE_SATIP_SERVER:
                for fnc in self.onSatIpServerRemoved:
                    fnc(device)
            elif device_type == self.DEVICE_TYPE_DREAMBOX:
                for fnc in self.onDreamboxRemoved:
                    fnc(device)
            for fnc in self.onMediaDeviceRemoved:
                fnc(device)
            del self.__mediaDevices[usn]

    def registerRenderer(self, classDef, **kwargs):
        renderer = MediaRenderer(self.coherence,
                                 classDef,
                                 no_thread_needed=True,
                                 **kwargs)
        self.__devices.append(renderer)
        return renderer

    def registerServer(self, classDef, **kwargs):
        server = MediaServer(self.coherence,
                             classDef,
                             no_thread_needed=True,
                             **kwargs)
        self.__devices.append(server)
        return server

    def registerDevice(self, instance, **kwargs):
        self.__devices.append(instance)
        return instance

    def getServerList(self):
        return self.__mediaServerClients.values()

    def getRenderingControlClientList(self):
        return self.__mediaRendererClients.values()

    def getDeviceName(self, client):
        return Item.ue(client.device.get_friendly_name())

    def getSatIPDevices(self):
        devices = []
        for device in self.__mediaDevices.itervalues():
            if device.get_friendly_device_type(
            ) == self.DEVICE_TYPE_SATIP_SERVER:
                devices.append(device)
        return devices

    def getDreamboxes(self):
        devices = []
        for device in self.__mediaDevices.itervalues():
            if device.get_friendly_device_type() == self.DEVICE_TYPE_DREAMBOX:
                devices.append(device)
        return devices

    def getDevice(self, uuid):
        for device in self.__devices:
            if device.uuid == uuid:
                return device
        return None

    def removeDevice(self, uuid):
        device = self.getDevice(uuid)
        if device:
            device.unregister()
            self.__devices.remove(device)
            return True
        return False

    def shutdown(self):
        Log.i("%s" % (self.coherence, ))
        if True:
            Log.w(
                "shutdown is broken... will continue running. please restart enigma2 instead!"
            )
            return
        if self.coherence:
            self._callPlugins(reason=1)
            self.__mediaServerClients = {}
            self.__mediaRendererClients = {}
            self.__mediaDevices = {}
            self.__devices = []
            self.__deferredShutDown = self.coherence.shutdown(force=True)
            self.__deferredShutDown.addCallback(self._onShutdownFinished)
            self._controlPoint.disconnect(
                self._onMediaServerDetected,
                'Coherence.UPnP.ControlPoint.MediaServer.detected')
            self._controlPoint.disconnect(
                self._onMediaServerRemoved,
                'Coherence.UPnP.ControlPoint.MediaServer.removed')
            self._controlPoint.disconnect(
                self._onMediaRendererDetected,
                'Coherence.UPnP.ControlPoint.MediaRenderer.detected')
            self._controlPoint.disconnect(
                self._onMediaRendererRemoved,
                'Coherence.UPnP.ControlPoint.MediaRenderer.removed')
            self._controlPoint.disconnect(
                self._onMediaDeviceDectected,
                'Coherence.UPnP.Device.detection_completed')
            self._controlPoint.disconnect(self._onMediaDeviceRemoved,
                                          'Coherence.UPnP.RootDevice.removed')
            self.coherence = None
            self._controlPoint = None