Example #1
0
class Intents:
    def __init__(self, lisa=None):
        self.lisa = lisa
        self.configuration = configuration
        mongo = MongoClient(host=self.configuration['database']['server'],
                            port=self.configuration['database']['port'])
        self.database = mongo.lisa
        self.wit = Wit(self.configuration['wit_server_token'])

    def list(self, jsonInput):
        intentstr = []
        listintents = self.wit.get_intents()
        for oIntent in oIntents.objects(enabled=True):
            for witintent in listintents:
                if witintent[
                        "name"] == oIntent.name and 'metadata' in witintent:
                    if witintent['metadata']:
                        metadata = json.loads(witintent['metadata'])
                        intentstr.append(metadata['tts'])

        return {
            "plugin":
            "Intents",
            "method":
            "list",
            "body":
            _('I can %(intentslist)s' % {'intentslist': ', '.join(intentstr)})
        }
Example #2
0
class Intents:
    def __init__(self, lisa=None):
        self.lisa = lisa
        self.configuration = configuration
        mongo = MongoClient(host=self.configuration['database']['server'],
                            port=self.configuration['database']['port'])
        self.database = mongo.lisa
        self.wit = Wit(self.configuration['wit_token'])

    def list(self, jsonInput):
        intentstr = []
        listintents = self.wit.get_intents()
        for oIntent in oIntents.objects(enabled=True):
            for witintent in listintents:
                print witintent
                if witintent["name"] == oIntent.name and 'metadata' in witintent:
                    if witintent['metadata']:
                        metadata = json.loads(witintent['metadata'])
                        intentstr.append(metadata['tts'])

        return {"plugin": "Intents",
                "method": "list",
                "body": unicode(_('I can %(intentslist)s' % {'intentslist': ', '.join(intentstr)}))
        }
Example #3
0
class LisaResource(tastyresources.Resource):
    class Meta:
        resource_name = 'lisa'
        allowed_methods = ()
        authorization = authorization.Authorization()
        object_class = Lisa
        authentication = MultiAuthentication(CustomApiKeyAuthentication())
        extra_actions = [
            {
                'name': 'configuration',
                'http_method': 'GET',
                'resource_type': 'list',
                'fields': {}
            },
            {
                'name': 'version',
                'http_method': 'GET',
                'resource_type': 'list',
                'fields': {}
            },
            {
                'name': 'engine/reload',
                'http_method': 'GET',
                'resource_type': 'list',
                'fields': {}
            },
            {
                'name': 'scheduler/reload',
                'http_method': 'GET',
                'resource_type': 'list',
                'fields': {}
            },
            {
                'name': 'witintents',
                'http_method': 'GET',
                'resource_type': 'list',
                'fields': {}
            },
            {
                'name': 'speak',
                'http_method': 'POST',
                'resource_type': 'list',
                'fields': {
                    'message': {
                        'type': 'string',
                        'required': True,
                        'description': 'The message to transmit to client(s)',
                        'paramType': 'body'
                    },
                    'clients_zone': {
                        'type': 'list',
                        'required': True,
                        'description': "Provide a list of zones : ['all','WebSocket','Bedroom'] ...",
                        'paramType': 'body'
                    }
                }
            },
            {
                'name': 'tts-google',
                'http_method': 'POST',
                'resource_type': 'list',
                'fields': {
                    'message': {
                        'type': 'string',
                        'required': True,
                        'description': 'The message to vocalize',
                        'paramType': 'body'
                    },
                    'lang': {
                        'type': 'string',
                        'required': True,
                        'description': 'Lang of the message',
                        'paramType': 'body'
                    }
                }
            },
            {
                'name': 'tts-pico',
                'http_method': 'POST',
                'resource_type': 'list',
                'fields': {
                    'message': {
                        'type': 'string',
                        'required': True,
                        'description': 'The message to vocalize',
                        'paramType': 'body'
                    },
                    'lang': {
                        'type': 'string',
                        'required': True,
                        'description': 'Lang of the message',
                        'paramType': 'body'
                    }
                }
            }


        ]

    def prepend_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/configuration%s$" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('configuration'), name="api_lisa_configuration"),
            url(r"^(?P<resource_name>%s)/version%s$" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('version'), name="api_lisa_version"),
            url(r"^(?P<resource_name>%s)/engine/reload%s$" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('engine_reload'), name="api_lisa_engine_reload"),
            url(r"^(?P<resource_name>%s)/scheduler/reload%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('scheduler_reload'), name="api_lisa_scheduler_reload"),
            url(r"^(?P<resource_name>%s)/tts-google%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_google'), name="api_lisa_tts_google"),
            url(r"^(?P<resource_name>%s)/tts-pico%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_pico'), name="api_lisa_tts_pico"),
            url(r"^(?P<resource_name>%s)/speak%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('speak'), name="api_lisa_speak"),
            url(r"^(?P<resource_name>%s)/witintents%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('witintents'), name="api_lisa_witintents"),
        ]

    def speak(self, request, **kwargs):
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
        message = data.get('message', '')
        clients_zone = data.get('clients_zone', '')

        """
        print request.body

        if request.method == 'POST':
            message = request.POST.get("message")
            clients_zone = request.POST.getlist("clients_zone")
        else:
            message = request.GET.get("message")
            clients_zone = request.GET.getlist("clients_zone")
        """
        jsondata = json.dumps({
                                      'body': message,
                                      'clients_zone': clients_zone,
                                      'from': "API",
                                      'type': "chat"
            })
        LisaProtocolSingleton.get().answerToClient(jsondata=jsondata)

        self.log_throttled_access(request)
        return self.create_response(request, {'status': 'success', 'log': "Message sent"}, HttpAccepted)

    def tts_google(self, request, **kwargs):
        self.method_check(request, allowed=['post'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified
        import re
        import requests
        from django.http import HttpResponse
        combined_sound = []
        try:
            if request.method == 'POST':
                message = request.POST.get("message")
                lang = request.POST.get("lang")
                if not message:
                    # In case there isn't form data, let's check the body
                    post = json.loads(request.body)
                    message = post['message']
                    lang = post['lang']
            #process text into chunks
            text = message.replace('\n', '')
            text_list = re.split('(\.)', text)
            combined_text = []
            for idx, val in enumerate(text_list):
                if idx % 2 == 0:
                    combined_text.append(val)
                else:
                    joined_text = ''.join((combined_text.pop(), val))
                    if len(joined_text) < 100:
                        combined_text.append(joined_text)
                    else:
                        subparts = re.split('( )', joined_text)
                        temp_string = ""
                        temp_array = []
                        for part in subparts:
                            temp_string += part
                            if len(temp_string) > 80:
                                temp_array.append(temp_string)
                                temp_string = ""
                            #append final part
                        temp_array.append(temp_string)
                        combined_text.extend(temp_array)
                #download chunks and write them to the output file
            for idx, val in enumerate(combined_text):
                headers = {"Host": "translate.google.com",
                           "Referer": "https://translate.google.com/",
                           "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"}
                r = requests.get("https://translate.google.com/translate_tts?ie=UTF-8&tl=%s&q=%s&total=%s&idx=%s&client=t&prev=input" % (
                    lang, val, len(combined_text), idx), headers=headers)
                combined_sound.append(r.content)
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'}, HttpNotModified)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound), content_type="audio/mpeg", mimetype="audio/mpeg")

    def tts_pico(self, request, **kwargs):
        import uuid
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        message = request.POST.get("message")
        lang = request.POST.getlist("lang")

        from tastypie.http import HttpAccepted, HttpNotModified
        from django.http import HttpResponse
        from subprocess import call, Popen
        combined_sound = []
        temp = dir_path + "/tmp/" + str(uuid.uuid4()) + ".wav"
        language = str(lang[0])+'-'+str(lang[0]).upper()
        command = ['pico2wave', '-w', temp, '-l', language, '--', message]
        try:
            call(command)
            #combined_sound.append(content)
        except OSError:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        f = open(temp,"rb")
        combined_sound.append(f.read())
        f.close()
        os.remove(temp)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound), content_type="audio/mpeg", mimetype="audio/mpeg")

    def engine_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            LisaFactorySingleton.get().LisaReload()
        except:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, { 'status': 'success', 'log': "L.I.S.A Engine reloaded"}, HttpAccepted)

    def witintents(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        self.wit = Wit(configuration['wit_token'])

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            intents = self.wit.get_intents()
        except:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, { 'status': 'success', 'intents': intents}, HttpAccepted)

    def scheduler_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            LisaFactorySingleton.get().SchedReload()
        except:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, {'status': 'success', 'log': 'L.I.S.A Task Scheduler reloaded'},
                                    HttpAccepted)

    def configuration(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        self.log_throttled_access(request)
        copyconfiguration = configuration
        copyconfiguration['database'] = None
        return self.create_response(request, {'configuration': configuration}, HttpAccepted)

    def version(self, request, **kwargs):
        from tastypie.http import HttpAccepted, HttpNotModified
        from pkg_resources import get_distribution
        import requests

        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        self.log_throttled_access(request)

        local_version = get_distribution('lisa-server').version
        should_upgrade = False

        r = requests.get('https://pypi.python.org/pypi/lisa-server/json')
        if r.status_code == requests.codes.ok:
            remote_version = r.json()['info']['version']
            
        else:
            return self.create_response(request, {'status': 'fail', 'log': 'Problem contacting pypi.python.org'}, HttpAccepted)

        if remote_version > local_version:
            should_upgrade = True

        response = {
            'local_version': get_distribution('lisa-server').version,
            'remote_version': remote_version,
            'should_upgrade': should_upgrade
        }

        return self.create_response(request, response, HttpAccepted)

    def get_object_list(self, request):
        return [Lisa()]
Example #4
0
File: api.py Project: gdumee/LISA
class LisaResource(tastyresources.Resource):
    class Meta:
        resource_name = 'lisa'
        allowed_methods = ()
        authorization = authorization.Authorization()
        object_class = Lisa
        extra_actions = [{
            'name': 'engine/reload',
            'http_method': 'GET',
            'fields': {}
        }, {
            'name': 'scheduler/reload',
            'http_method': 'GET',
            'fields': {}
        }, {
            'name': 'intents',
            'http_method': 'GET',
            'fields': {}
        }, {
            'name': 'speak',
            'http_method': 'POST',
            'fields': {
                'message': {
                    'type': 'string',
                    'required': True,
                    'description': 'The message to transmit to client(s)'
                },
                'clients_zone': {
                    'type':
                    'list',
                    'required':
                    True,
                    'description':
                    "Provide a list of zones : ['all','WebSocket','Bedroom'] ..."
                }
            }
        }, {
            'name': 'tts/google',
            'http_method': 'POST',
            'fields': {
                'message': {
                    'type': 'string',
                    'required': True,
                    'description': 'The message to vocalize'
                },
                'lang': {
                    'type': 'string',
                    'required': True,
                    'description': "Lang of the message"
                }
            }
        }, {
            'name': 'tts/pico',
            'http_method': 'POST',
            'fields': {
                'message': {
                    'type': 'string',
                    'required': True,
                    'description': 'The message to vocalize'
                },
                'lang': {
                    'type': 'string',
                    'required': True,
                    'description': "Lang of the message"
                }
            }
        }]

    def prepend_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/engine/reload%s$" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('engine_reload'),
                name="api_lisa_engine_reload"),
            url(r"^(?P<resource_name>%s)/scheduler/reload%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('scheduler_reload'),
                name="api_lisa_scheduler_reload"),
            url(r"^(?P<resource_name>%s)/tts/google%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_google'),
                name="api_lisa_tts_google"),
            url(r"^(?P<resource_name>%s)/tts/pico%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_pico'),
                name="api_tts_pico"),
            url(r"^(?P<resource_name>%s)/speak%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('speak'),
                name="api_lisa_speak"),
            url(r"^(?P<resource_name>%s)/intents%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('intents'),
                name="api_lisa_intents"),
        ]

    def speak(self, request, **kwargs):
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        if request.POST:
            message = request.POST.get("message")
            clients_zone = request.POST.getlist("clients_zone")
        else:
            message = request.GET.get("message")
            clients_zone = request.GET.getlist("clients_zone")
        jsondata = {'message': message, 'type': "chat"}
        zone_uids = []
        for z in clients_zone:
            zone_uids.append(ClientFactory.getOrCreateZone(z))
        ClientFactory.sendToClients(jsondata=jsondata, zone_uids=zone_uids)

        self.log_throttled_access(request)
        return self.create_response(request, {
            'status': 'success',
            'log': "Message sent"
        }, HttpAccepted)

    def tts_google(self, request, **kwargs):
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified
        import re
        import requests
        from django.http import HttpResponse
        combined_sound = []
        try:
            message = request.POST.get("message")
            lang = request.POST.getlist("lang")
            #process text into chunks
            text = message.replace('\n', '')
            text_list = re.split('(\,|\.)', text)
            combined_text = []
            for idx, val in enumerate(text_list):
                if idx % 2 == 0:
                    combined_text.append(val)
                else:
                    joined_text = ''.join((combined_text.pop(), val))
                    if len(joined_text) < 100:
                        combined_text.append(joined_text)
                    else:
                        subparts = re.split('( )', joined_text)
                        temp_string = ""
                        temp_array = []
                        for part in subparts:
                            temp_string = temp_string + part
                            if len(temp_string) > 80:
                                temp_array.append(temp_string)
                                temp_string = ""
                            #append final part
                        temp_array.append(temp_string)
                        combined_text.extend(temp_array)
                #download chunks and write them to the output file
            for idx, val in enumerate(combined_text):
                headers = {
                    "Host":
                    "translate.google.com",
                    "Referer":
                    "http://translate.google.com/",
                    "User-Agent":
                    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"
                }
                r = requests.get(
                    "http://translate.google.com/translate_tts?tl=%s&q=%s&total=%s&idx=%s"
                    % (str(lang[0]), val, len(combined_text), idx),
                    headers=headers)

                combined_sound.append(r.content)
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound),
                            content_type="audio/mpeg",
                            mimetype="audio/mpeg")

    def tts_pico(self, request, **kwargs):
        import uuid
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        message = request.POST.get("message")
        lang = request.POST.getlist("lang")

        from tastypie.http import HttpAccepted, HttpNotModified
        from django.http import HttpResponse
        from subprocess import call, Popen
        combined_sound = []
        temp = dir_path + "/tmp/" + str(uuid.uuid4()) + ".wav"
        language = str(lang[0]) + '-' + str(lang[0]).upper()
        command = ['pico2wave', '-w', temp, '-l', language, '--', message]
        try:
            call(command)
            #combined_sound.append(content)
        except OSError:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        f = open(temp, "rb")
        combined_sound.append(f.read())
        f.close()
        os.remove(temp)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound),
                            content_type="audio/mpeg",
                            mimetype="audio/mpeg")

    def engine_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            ClientFactory.LisaReload()
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, {
            'status': 'success',
            'log': "Demonstrator Engine reloaded"
        }, HttpAccepted)

    def intents(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        self.wit = Wit(self.configuration['wit_token'])

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            intents = self.wit.get_intents()
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, {
            'status': 'success',
            'intents': intents
        }, HttpAccepted)

    def scheduler_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            ClientFactory.SchedReload()
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(
            request, {
                'status': 'success',
                'log': "Demonstrator Task Scheduler reloaded"
            }, HttpAccepted)

    def get_object_list(self, request):
        return [Lisa()]
Example #5
0
class LisaResource(tastyresources.Resource):
    class Meta:
        resource_name = 'lisa'
        allowed_methods = ()
        authorization = authorization.Authorization()
        object_class = Lisa
        authentication = MultiAuthentication(CustomApiKeyAuthentication())
        extra_actions = [{
            'name': 'configuration',
            'http_method': 'GET',
            'resource_type': 'list',
            'fields': {}
        }, {
            'name': 'version',
            'http_method': 'GET',
            'resource_type': 'list',
            'fields': {}
        }, {
            'name': 'engine/reload',
            'http_method': 'GET',
            'resource_type': 'list',
            'fields': {}
        }, {
            'name': 'scheduler/reload',
            'http_method': 'GET',
            'resource_type': 'list',
            'fields': {}
        }, {
            'name': 'witintents',
            'http_method': 'GET',
            'resource_type': 'list',
            'fields': {}
        }, {
            'name': 'speak',
            'http_method': 'POST',
            'resource_type': 'list',
            'fields': {
                'message': {
                    'type': 'string',
                    'required': True,
                    'description': 'The message to transmit to client(s)',
                    'paramType': 'body'
                },
                'clients_zone': {
                    'type': 'list',
                    'required': True,
                    'description':
                    "Provide a list of zones : ['all','WebSocket','Bedroom'] ...",
                    'paramType': 'body'
                }
            }
        }, {
            'name': 'tts-google',
            'http_method': 'POST',
            'resource_type': 'list',
            'fields': {
                'message': {
                    'type': 'string',
                    'required': True,
                    'description': 'The message to vocalize',
                    'paramType': 'body'
                },
                'lang': {
                    'type': 'string',
                    'required': True,
                    'description': 'Lang of the message',
                    'paramType': 'body'
                }
            }
        }, {
            'name': 'tts-pico',
            'http_method': 'POST',
            'resource_type': 'list',
            'fields': {
                'message': {
                    'type': 'string',
                    'required': True,
                    'description': 'The message to vocalize',
                    'paramType': 'body'
                },
                'lang': {
                    'type': 'string',
                    'required': True,
                    'description': 'Lang of the message',
                    'paramType': 'body'
                }
            }
        }]

    def prepend_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/configuration%s$" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('configuration'),
                name="api_lisa_configuration"),
            url(r"^(?P<resource_name>%s)/version%s$" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('version'),
                name="api_lisa_version"),
            url(r"^(?P<resource_name>%s)/engine/reload%s$" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('engine_reload'),
                name="api_lisa_engine_reload"),
            url(r"^(?P<resource_name>%s)/scheduler/reload%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('scheduler_reload'),
                name="api_lisa_scheduler_reload"),
            url(r"^(?P<resource_name>%s)/tts-google%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_google'),
                name="api_lisa_tts_google"),
            url(r"^(?P<resource_name>%s)/tts-pico%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_pico'),
                name="api_lisa_tts_pico"),
            url(r"^(?P<resource_name>%s)/speak%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('speak'),
                name="api_lisa_speak"),
            url(r"^(?P<resource_name>%s)/witintents%s" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('witintents'),
                name="api_lisa_witintents"),
        ]

    def speak(self, request, **kwargs):
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        data = self.deserialize(request,
                                request.body,
                                format=request.META.get(
                                    'CONTENT_TYPE', 'application/json'))
        message = data.get('message', '')
        clients_zone = data.get('clients_zone', '')
        """
        print request.body

        if request.method == 'POST':
            message = request.POST.get("message")
            clients_zone = request.POST.getlist("clients_zone")
        else:
            message = request.GET.get("message")
            clients_zone = request.GET.getlist("clients_zone")
        """
        jsondata = json.dumps({
            'body': message,
            'clients_zone': clients_zone,
            'from': "API",
            'type': "chat"
        })
        LisaProtocolSingleton.get().answerToClient(jsondata=jsondata)

        self.log_throttled_access(request)
        return self.create_response(request, {
            'status': 'success',
            'log': "Message sent"
        }, HttpAccepted)

    def tts_google(self, request, **kwargs):
        self.method_check(request, allowed=['post'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified
        import re
        import requests
        from django.http import HttpResponse
        combined_sound = []
        try:
            if request.method == 'POST':
                message = request.POST.get("message")
                lang = request.POST.get("lang")
                if not message:
                    # In case there isn't form data, let's check the body
                    post = json.loads(request.body)
                    message = post['message']
                    lang = post['lang']
            #process text into chunks
            text = message.replace('\n', '')
            text_list = re.split('(\.)', text)
            combined_text = []
            for idx, val in enumerate(text_list):
                if idx % 2 == 0:
                    combined_text.append(val)
                else:
                    joined_text = ''.join((combined_text.pop(), val))
                    if len(joined_text) < 100:
                        combined_text.append(joined_text)
                    else:
                        subparts = re.split('( )', joined_text)
                        temp_string = ""
                        temp_array = []
                        for part in subparts:
                            temp_string += part
                            if len(temp_string) > 80:
                                temp_array.append(temp_string)
                                temp_string = ""
                            #append final part
                        temp_array.append(temp_string)
                        combined_text.extend(temp_array)
                #download chunks and write them to the output file
            for idx, val in enumerate(combined_text):
                headers = {
                    "Host":
                    "translate.google.com",
                    "Referer":
                    "https://translate.google.com/",
                    "User-Agent":
                    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"
                }
                r = requests.get(
                    "https://translate.google.com/translate_tts?ie=UTF-8&tl=%s&q=%s&total=%s&idx=%s&client=t&prev=input"
                    % (lang, val, len(combined_text), idx),
                    headers=headers)
                combined_sound.append(r.content)
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound),
                            content_type="audio/mpeg",
                            mimetype="audio/mpeg")

    def tts_pico(self, request, **kwargs):
        import uuid
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        message = request.POST.get("message")
        lang = request.POST.getlist("lang")

        from tastypie.http import HttpAccepted, HttpNotModified
        from django.http import HttpResponse
        from subprocess import call, Popen
        combined_sound = []
        temp = dir_path + "/tmp/" + str(uuid.uuid4()) + ".wav"
        language = str(lang[0]) + '-' + str(lang[0]).upper()
        command = ['pico2wave', '-w', temp, '-l', language, '--', message]
        try:
            call(command)
            #combined_sound.append(content)
        except OSError:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        f = open(temp, "rb")
        combined_sound.append(f.read())
        f.close()
        os.remove(temp)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound),
                            content_type="audio/mpeg",
                            mimetype="audio/mpeg")

    def engine_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            LisaFactorySingleton.get().LisaReload()
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, {
            'status': 'success',
            'log': "L.I.S.A Engine reloaded"
        }, HttpAccepted)

    def witintents(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        self.wit = Wit(configuration['wit_server_token'])

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            intents = self.wit.get_intents()
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, {
            'status': 'success',
            'intents': intents
        }, HttpAccepted)

    def scheduler_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            LisaFactorySingleton.get().SchedReload()
        except:
            log.err()
            return self.create_response(request, {'status': 'failure'},
                                        HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, {
            'status': 'success',
            'log': 'L.I.S.A Task Scheduler reloaded'
        }, HttpAccepted)

    def configuration(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        self.log_throttled_access(request)
        copyconfiguration = configuration
        copyconfiguration['database'] = None
        return self.create_response(request, {'configuration': configuration},
                                    HttpAccepted)

    def version(self, request, **kwargs):
        from tastypie.http import HttpAccepted, HttpNotModified
        from pkg_resources import get_distribution
        import requests

        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        self.log_throttled_access(request)

        local_version = get_distribution('lisa-server').version
        should_upgrade = False

        r = requests.get('https://pypi.python.org/pypi/lisa-server/json')
        if r.status_code == requests.codes.ok:
            remote_version = r.json()['info']['version']

        else:
            return self.create_response(
                request, {
                    'status': 'fail',
                    'log': 'Problem contacting pypi.python.org'
                }, HttpAccepted)

        if remote_version > local_version:
            should_upgrade = True

        response = {
            'local_version': get_distribution('lisa-server').version,
            'remote_version': remote_version,
            'should_upgrade': should_upgrade
        }

        return self.create_response(request, response, HttpAccepted)

    def get_object_list(self, request):
        return [Lisa()]
Example #6
0
File: api.py Project: gdumee/LISA
class LisaResource(tastyresources.Resource):
    class Meta:
        resource_name = 'lisa'
        allowed_methods = ()
        authorization = authorization.Authorization()
        object_class = Lisa
        extra_actions = [
            {
                'name': 'engine/reload',
                'http_method': 'GET',
                'fields': {}
            },
            {
                'name': 'scheduler/reload',
                'http_method': 'GET',
                'fields': {}
            },
            {
                'name': 'intents',
                'http_method': 'GET',
                'fields': {}
            },
            {
                'name': 'speak',
                'http_method': 'POST',
                'fields':{
                    'message': {
                        'type': 'string',
                        'required': True,
                        'description': 'The message to transmit to client(s)'
                    },
                    'clients_zone': {
                        'type': 'list',
                        'required': True,
                        'description': "Provide a list of zones : ['all','WebSocket','Bedroom'] ..."
                    }
                }
            },
            {
                'name': 'tts/google',
                'http_method': 'POST',
                'fields':{
                    'message': {
                        'type': 'string',
                        'required': True,
                        'description': 'The message to vocalize'
                    },
                    'lang': {
                        'type': 'string',
                        'required': True,
                        'description': "Lang of the message"
                    }
                }
            },
            {
                'name': 'tts/pico',
                'http_method': 'POST',
                'fields':{
                    'message': {
                        'type': 'string',
                        'required': True,
                        'description': 'The message to vocalize'
                    },
                    'lang': {
                        'type': 'string',
                        'required': True,
                        'description': "Lang of the message"
                    }
                }
            }


        ]

    def prepend_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/engine/reload%s$" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('engine_reload'), name="api_lisa_engine_reload"),
            url(r"^(?P<resource_name>%s)/scheduler/reload%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('scheduler_reload'), name="api_lisa_scheduler_reload"),
            url(r"^(?P<resource_name>%s)/tts/google%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_google'), name="api_lisa_tts_google"),
            url(r"^(?P<resource_name>%s)/tts/pico%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('tts_pico'), name="api_tts_pico"),
            url(r"^(?P<resource_name>%s)/speak%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('speak'), name="api_lisa_speak"),
            url(r"^(?P<resource_name>%s)/intents%s" % (self._meta.resource_name, trailing_slash()),
                self.wrap_view('intents'), name="api_lisa_intents"),
        ]

    def speak(self, request, **kwargs):
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        if request.POST:
            message = request.POST.get("message")
            clients_zone = request.POST.getlist("clients_zone")
        else:
            message = request.GET.get("message")
            clients_zone = request.GET.getlist("clients_zone")
        jsondata = {'message': message, 'type': "chat"}
        zone_uids = []
        for z in clients_zone:
            zone_uids.append(ClientFactory.getOrCreateZone(z))
        ClientFactory.sendToClients(jsondata = jsondata, zone_uids = zone_uids)

        self.log_throttled_access(request)
        return self.create_response(request, { 'status': 'success', 'log': "Message sent"}, HttpAccepted)

    def tts_google(self, request, **kwargs):
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified
        import re
        import requests
        from django.http import HttpResponse
        combined_sound = []
        try:
            message = request.POST.get("message")
            lang = request.POST.getlist("lang")
            #process text into chunks
            text = message.replace('\n','')
            text_list = re.split('(\,|\.)', text)
            combined_text = []
            for idx, val in enumerate(text_list):
                if idx % 2 == 0:
                    combined_text.append(val)
                else:
                    joined_text = ''.join((combined_text.pop(),val))
                    if len(joined_text) < 100:
                        combined_text.append(joined_text)
                    else:
                        subparts = re.split('( )', joined_text)
                        temp_string = ""
                        temp_array = []
                        for part in subparts:
                            temp_string = temp_string + part
                            if len(temp_string) > 80:
                                temp_array.append(temp_string)
                                temp_string = ""
                            #append final part
                        temp_array.append(temp_string)
                        combined_text.extend(temp_array)
                #download chunks and write them to the output file
            for idx, val in enumerate(combined_text):
                headers = {"Host":"translate.google.com",
                           "Referer":"http://translate.google.com/",
                           "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"}
                r = requests.get("http://translate.google.com/translate_tts?tl=%s&q=%s&total=%s&idx=%s" % (str(lang[0]), val, len(combined_text), idx),
                                 headers=headers)

                combined_sound.append(r.content)
        except:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound), content_type="audio/mpeg", mimetype="audio/mpeg")

    def tts_pico(self, request, **kwargs):
        import uuid
        self.method_check(request, allowed=['post', 'get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        message = request.POST.get("message")
        lang = request.POST.getlist("lang")


        from tastypie.http import HttpAccepted, HttpNotModified
        from django.http import HttpResponse
        from subprocess import call, Popen
        combined_sound = []
        temp = dir_path + "/tmp/" + str(uuid.uuid4()) + ".wav"
        language = str(lang[0])+'-'+str(lang[0]).upper()
        command = ['pico2wave', '-w', temp, '-l', language, '--', message]
        try:
            call(command)
            #combined_sound.append(content)
        except OSError:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        f = open(temp,"rb")
        combined_sound.append(f.read())
        f.close()
        os.remove(temp)
        self.log_throttled_access(request)
        return HttpResponse(''.join(combined_sound), content_type="audio/mpeg", mimetype="audio/mpeg")

    def engine_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            ClientFactory.LisaReload()
        except:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, { 'status': 'success', 'log': "Demonstrator Engine reloaded"}, HttpAccepted)

    def intents(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)
        self.wit = Wit(self.configuration['wit_token'])

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            intents = self.wit.get_intents()
        except:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, { 'status': 'success', 'intents': intents}, HttpAccepted)

    def scheduler_reload(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        from tastypie.http import HttpAccepted, HttpNotModified

        try:
            ClientFactory.SchedReload()
        except:
            log.err()
            return self.create_response(request, { 'status' : 'failure' }, HttpNotModified)
        self.log_throttled_access(request)
        return self.create_response(request, { 'status': 'success', 'log': "Demonstrator Task Scheduler reloaded"},
                                    HttpAccepted)

    def get_object_list(self, request):
        return [Lisa()]