wikipedia.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import logging
  2. from core.NeuronModule import NeuronModule, InvalidParameterException
  3. import wikipedia
  4. logging.basicConfig()
  5. logger = logging.getLogger("kalliope")
  6. class Wikipedia(NeuronModule):
  7. def __init__(self, **kwargs):
  8. # we don't need the TTS cache for this neuron
  9. cache = kwargs.get('cache', None)
  10. if cache is None:
  11. cache = False
  12. kwargs["cache"] = cache
  13. super(Wikipedia, self).__init__(**kwargs)
  14. # get parameters form the neuron
  15. self.query = kwargs.get('query', None)
  16. self.language = kwargs.get('language', None)
  17. self.sentences = kwargs.get('sentences', None)
  18. self.may_refer = None
  19. self.returncode = None
  20. # check parameters
  21. if self._is_parameters_ok():
  22. # set the language
  23. wikipedia.set_lang(self.language)
  24. # do the summary search
  25. try:
  26. summary = wikipedia.summary(self.query, auto_suggest=True, sentences=self.sentences)
  27. # if we are here, no exception raised, we got a summary
  28. self.returncode = "SummaryFound"
  29. except wikipedia.exceptions.DisambiguationError, e:
  30. # Exception raised when a page resolves to a Disambiguation page.
  31. # The options property contains a list of titles of Wikipedia pages that the query may refer to.
  32. self.may_refer = e.options
  33. # Removing duplicates in lists.
  34. self.may_refer = list(set(self.may_refer))
  35. self.returncode = "DisambiguationError"
  36. summary = ""
  37. except wikipedia.exceptions.PageError:
  38. # Exception raised when no Wikipedia matched a query.
  39. self.returncode = "PageError"
  40. summary = ""
  41. message = {
  42. "summary": summary,
  43. "may_refer": self.may_refer,
  44. "returncode": self.returncode
  45. }
  46. logger.debug("Wikipedia returned message: %s" % str(message))
  47. self.say(message)
  48. def _is_parameters_ok(self):
  49. """
  50. Check if received parameters are ok to perform operations in the neuron
  51. :return: true if parameters are ok, raise an exception otherwise
  52. .. raises:: InvalidParameterException
  53. """
  54. if self.query is None:
  55. raise InvalidParameterException("Wikipedia needs a query")
  56. if self.language is None:
  57. raise InvalidParameterException("Wikipedia needs a language")
  58. valid_language = wikipedia.languages().keys()
  59. if self.language not in valid_language:
  60. raise InvalidParameterException("Wikipedia needs a valid language: %s" % valid_language)
  61. return True