Example #1
0
class Core(Thread):
    def __init__(self, args, extra_args):
        Thread.__init__(self)
        self._args = args
        self._extra_args = extra_args
        self._threads = []
        self._event_handler = CoreEventHandler()
        if CrossPlatform.get().is_linux():
            signal.signal(signal.SIGCHLD, self.signal_handler)
        signal.signal(signal.SIGTERM, self.signal_handler)

    def is_streaming(self):
        if hasattr(self, '_stream_server') and self._stream_server is not None:
            return True
        return False

    def stream_server_start(self, *args, **kargs):
        if self.is_streaming():
            return
        logging.info('StreamServer start: {}'.format(kargs))
        self._stream_server = StreamServer(kargs, lambda data:
                                           self.handler('server', data))
        self._stream_server.start()

    def stream_server_stop(self):
        if hasattr(self, '_stream_server') and self._stream_server is not None:
            self._stream_server.stop()
            self._stream_server = None

    def playme(self, remote_ip, remote_port, service):
        def myip(remote_ip):
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            s.connect((remote_ip, 0))
            return s.getsockname()[0]

        def xbmc():
            stream_url = self._stream_server.url.format(ip=myip(remote_ip))
            url = 'http://{}:{}/xbmcCmds/xbmcHttp?command=PlayFile({})'.format(
                  remote_ip, remote_port, stream_url)
            req = urllib2.Request(url)
            logging.info('url = {}'.format(url))
            response = urllib2.urlopen(req, None, 5)
            result = response.read()
            logging.info('result: {}'.format(result))

        def desktop_mirror():
            stream_url = self._stream_server.url.format(ip=myip(remote_ip))
            data_as_json = json.dumps({
                'method': 'Player.Open',
                'id': 1, 'jsonrpc': '2.0',
                'params': {'item': {'file': stream_url}}}
            )
            url = 'http://{}:{}/jsonrpc'.format(remote_ip, remote_port)
            logging.info('url = {}'.format(url))
            logging.info('  json = {}'.format(data_as_json))
            req = urllib2.Request(url, data_as_json,
                                  {'Content-Type': 'application/json'})
            response = urllib2.urlopen(req, None, 5)
            result = response.read()
            logging.info('result: {}'.format(result))
            result = json.loads(result)
            #switch back to json with pretty format
            logging.debug(json.dumps(result, indent=4))
        #logging.info('Got streaming url: {}'.
        #             format(self._stream_server.url))
        #if service == '_desktop-mirror._tcp':
        #    desktop_mirror()
        #else:
        #    xbmc()
        desktop_mirror()

    @property
    def targets(self):
        if not hasattr(self, '_avahi_browse'):
            return dict()
        return self._avahi_browse.targets

    @property
    def hosts(self):
        if not hasattr(self, '_avahi_browse'):
            return dict()
        return self._avahi_browse.hosts

    def run(self):
        self._avahi_browse = AvahiService(lambda data:
                                          self.handler('avahi', data))
        self._stream_recever = StreamReceiver(lambda data:
                                              self.handler('srx', data))
        self._threads.append(self._avahi_browse)
        self._threads.append(self._stream_recever)

        for thread in self._threads:
            thread.start()
        for thread in self._threads:
            thread.join()

    def stop(self):
        for thread in self._threads:
            logging.debug('Stopping thread - {}'.format(thread.name))
            thread.stop()
        self.stream_server_stop()

    def launch_selection_area_process(self):
        SelectionArea(lambda data:
                      self.handler('selection', data)).start()

    def register_listener(self, ui_window):
        self._event_handler.register_listener(ui_window)

    def on_event_relay(self, event_name, data):
        self._event_handler.on_event_relay(event_name, data)

    def on_event_stream_ready(self, event_name, data):
        self._event_handler.on_event_stream_ready(event_name, data)

    def handler(self, obj_id, data):
        self._event_handler.handler(obj_id, data)

    def signal_handler(self, signum, frame):
        logging.info('signal: ' + str(signum))
        if signal.SIGTERM == signum:
            self.send_form_destroy()
        try:
            if CrossPlatform.get().is_linux():
                if signal.SIGCHLD == signum:
                    os.waitpid(-1, os.WNOHANG)
        except OSError:
            pass
Example #2
0
class Core(Thread):
    def __init__(self, args, extra_args):
        Thread.__init__(self)
        self._args = args
        self._extra_args = extra_args
        self._threads = []
        self._event_handler = CoreEventHandler()
        if CrossPlatform.get().is_linux():
            signal.signal(signal.SIGCHLD, self.signal_handler)
        signal.signal(signal.SIGTERM, self.signal_handler)

    def is_streaming(self):
        if hasattr(self, '_stream_server') and self._stream_server is not None:
            return True
        return False

    def stream_server_start(self, *args, **kargs):
        if self.is_streaming():
            return
        logging.info('StreamServer start: {}'.format(kargs))
        self._stream_server = StreamServer(
            kargs, lambda data: self.handler('server', data))
        self._stream_server.start()

    def stream_server_stop(self):
        if hasattr(self, '_stream_server') and self._stream_server is not None:
            self._stream_server.stop()
            self._stream_server = None

    def playme(self, remote_ip, remote_port, service):
        def myip(remote_ip):
            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            s.connect((remote_ip, 0))
            return s.getsockname()[0]

        def xbmc():
            stream_url = self._stream_server.url.format(ip=myip(remote_ip))
            url = 'http://{}:{}/xbmcCmds/xbmcHttp?command=PlayFile({})'.format(
                remote_ip, remote_port, stream_url)
            req = urllib2.Request(url)
            logging.info('url = {}'.format(url))
            response = urllib2.urlopen(req, None, 5)
            result = response.read()
            logging.info('result: {}'.format(result))

        def desktop_mirror():
            stream_url = self._stream_server.url.format(ip=myip(remote_ip))
            data_as_json = json.dumps({
                'method': 'Player.Open',
                'id': 1,
                'jsonrpc': '2.0',
                'params': {
                    'item': {
                        'file': stream_url
                    }
                }
            })
            url = 'http://{}:{}/jsonrpc'.format(remote_ip, remote_port)
            logging.info('url = {}'.format(url))
            logging.info('  json = {}'.format(data_as_json))
            req = urllib2.Request(url, data_as_json,
                                  {'Content-Type': 'application/json'})
            response = urllib2.urlopen(req, None, 5)
            result = response.read()
            logging.info('result: {}'.format(result))
            result = json.loads(result)
            #switch back to json with pretty format
            logging.debug(json.dumps(result, indent=4))

        #logging.info('Got streaming url: {}'.
        #             format(self._stream_server.url))
        #if service == '_desktop-mirror._tcp':
        #    desktop_mirror()
        #else:
        #    xbmc()
        desktop_mirror()

    @property
    def targets(self):
        if not hasattr(self, '_avahi_browse'):
            return dict()
        return self._avahi_browse.targets

    @property
    def hosts(self):
        if not hasattr(self, '_avahi_browse'):
            return dict()
        return self._avahi_browse.hosts

    def run(self):
        self._avahi_browse = AvahiService(
            lambda data: self.handler('avahi', data))
        self._stream_recever = StreamReceiver(
            lambda data: self.handler('srx', data))
        self._threads.append(self._avahi_browse)
        self._threads.append(self._stream_recever)

        for thread in self._threads:
            thread.start()
        for thread in self._threads:
            thread.join()

    def stop(self):
        for thread in self._threads:
            logging.debug('Stopping thread - {}'.format(thread.name))
            thread.stop()
        self.stream_server_stop()

    def launch_selection_area_process(self):
        SelectionArea(lambda data: self.handler('selection', data)).start()

    def register_listener(self, ui_window):
        self._event_handler.register_listener(ui_window)

    def on_event_relay(self, event_name, data):
        self._event_handler.on_event_relay(event_name, data)

    def on_event_stream_ready(self, event_name, data):
        self._event_handler.on_event_stream_ready(event_name, data)

    def handler(self, obj_id, data):
        self._event_handler.handler(obj_id, data)

    def signal_handler(self, signum, frame):
        logging.info('signal: ' + str(signum))
        if signal.SIGTERM == signum:
            self.send_form_destroy()
        try:
            if CrossPlatform.get().is_linux():
                if signal.SIGCHLD == signum:
                    os.waitpid(-1, os.WNOHANG)
        except OSError:
            pass