File indexing completed on 2024-03-24 16:59:45

0001 import re
0002 import sys
0003 import json
0004 import time
0005 from datetime import datetime
0006 import arrow
0007 import requests
0008 from os.path import dirname, join
0009 from bs4 import BeautifulSoup
0010 from adapt.intent import IntentBuilder
0011 from mycroft import MycroftSkill, intent_handler, intent_file_handler
0012 from mycroft.messagebus.message import Message
0013 
0014 zurl = "https://www.wikidata.org/entity/"
0015 entity_json = ""
0016 
0017 class WikidataSkill(MycroftSkill):
0018     """
0019     Wikidata Skill
0020     """
0021     def __init__(self):
0022         super(WikidataSkill, self).__init__(name="WikidataSkill")
0023     
0024     def initialize(self):
0025         self.add_event('skill-wikidata.aiix.home', self.showHome)
0026 
0027     @intent_file_handler('show.wikidata.home.intent')
0028     def showHome(self, message):
0029         self.gui.clear()
0030         self.displayHome()
0031 
0032     def displayHome(self):
0033         self.gui.show_page("homepage.qml", override_idle=True)
0034 
0035     @intent_file_handler('birth.place.of.person.intent')
0036     def handle_wikidata_birthplace_intent(self, message):
0037         """
0038         Wikidata BirthPlace Intent
0039         """
0040         global entity_json
0041         entity_id = self.getEntityId(message.data['person'])
0042         person_name = message.data['person']
0043         thumb_image = self.always_get_image(entity_id)
0044         try:
0045             get_entity_birth_place_id = entity_json['entities'][entity_id]['claims']['P19'][0]['mainsnak']['datavalue']['value']['id']
0046             try:
0047                 get_entity_birth_place_response = requests.get(zurl+get_entity_birth_place_id)
0048                 entity_birth_place_json =  get_entity_birth_place_response.json()
0049                 entity_birth_place = entity_birth_place_json['entities'][get_entity_birth_place_id]['labels']['en']['value']
0050                 result_speak = self.translate('birthplace', {'person': person_name, 'place': entity_birth_place})
0051                 self.gui.clear()
0052                 self.gui["personContext"] = person_name
0053                 self.gui["answerData"] = result_speak
0054                 self.gui["imgLink"] = thumb_image
0055                 self.gui.show_page("answer.qml", override_idle=30)
0056                 self.speak(result_speak)
0057             except Exception as e:
0058                 notFoundMessage = self.translate('birthplace.not.found',
0059                                                  {'person': person_name})
0060                 self.speak(notFoundMessage)
0061                 entity_birth_place = False
0062         except:
0063             notFoundMessage = self.translate('birthplace.not.found',
0064                                              {'person': person_name})
0065             self.speak(notFoundMessage)
0066             get_entity_birth_place_id = False
0067 
0068     @intent_file_handler('death.place.of.person.intent')
0069     def handle_wikidata_deathplace_intent(self, message):
0070         """
0071         Wikidata DeathPlace Intent
0072         """
0073         global entity_json
0074         entity_id = self.getEntityId(message.data['person'])
0075         person_name = message.data['person']
0076         thumb_image = self.always_get_image(entity_id)
0077         try:
0078             get_entity_death_place_id = entity_json['entities'][entity_id]['claims']['P20'][0]['mainsnak']['datavalue']['value']['id']
0079             try:
0080                 get_entity_death_place_response = requests.get(zurl+get_entity_death_place_id)
0081                 entity_death_place_json = get_entity_death_place_response.json()
0082                 entity_death_place = entity_death_place_json['entities'][get_entity_death_place_id]['labels']['en']['value']
0083                 result_speak = self.translate('deathplace',
0084                                               {'person': person_name,
0085                                                'place': entity_death_place})
0086                 self.gui.clear()
0087                 self.gui["personContext"] = person_name
0088                 self.gui["answerData"] = result_speak
0089                 self.gui["imgLink"] = thumb_image
0090                 self.gui.show_page("answer.qml", override_idle=30)
0091                 self.speak(result_speak)
0092             except Exception as e:
0093                 notFoundMessage = self.translate('deathplace.not.found',
0094                                                  {'person': person_name})
0095                 self.speak(notFoundMessage)
0096                 entity_death_place = False
0097         except:
0098             notFoundMessage = self.translate('deathplace.not.found',
0099                                              {'person': person_name})
0100             self.speak(notFoundMessage)
0101             get_entity_death_place_id = False
0102 
0103     @intent_file_handler('how.old.is.person.intent')
0104     def handle_wikidata_age_intent(self, message):
0105         """
0106         Wikidata SearchAge Intent
0107         """
0108         global entity_json
0109         entity_id = self.getEntityId(message.data['person'])
0110         person_name = message.data['person']
0111         thumb_image = self.always_get_image(entity_id)
0112         try:
0113             get_entity_dob_id = entity_json['entities'][entity_id]['claims']['P569'][0]['mainsnak']['datavalue']['value']['time']
0114             try:
0115                 fix_gedid = get_entity_dob_id.replace("+", "") 
0116                 a = arrow.get(fix_gedid)
0117                 birth_date = a.format("DD/MM/YYYY")
0118                 dob = birth_date
0119                 dob = datetime.strptime(dob, '%d/%m/%Y')
0120                 age = ("%d" % ((datetime.today() - dob).days/365))
0121                 result_msg = self.translate('age', {'person': person_name,
0122                                                     'age': age})
0123                 self.gui.clear()
0124                 self.gui["personContext"] = person_name
0125                 self.gui["answerData"] = result_msg
0126                 self.gui["imgLink"] = thumb_image
0127                 self.gui.show_page("answer.qml", override_idle=30)
0128                 self.speak(result_msg)
0129             except Exception as e:
0130                 notFoundMessage = self.translate('age.not.found',
0131                                                  {'person': person_name})
0132                 self.speak(notFoundMessage)
0133                 entity_death_place = False
0134         except:
0135             notFoundMessage = self.translate('age.not.found',
0136                                              {'person': person_name})
0137             self.speak(notFoundMessage)
0138             get_entity_death_place_id = False
0139 
0140     @intent_file_handler('what.is.the.gender.intent')
0141     def handle_wikidata_gender_intent(self, message):
0142         """
0143         Wikidata Gender Intent
0144         """
0145         global entity_json
0146         entity_id = self.getEntityId(message.data['person'])
0147         person_name = message.data['person']
0148         thumb_image = self.always_get_image(entity_id)
0149         try:
0150             get_entity_gender_id = entity_json['entities'][entity_id]['claims']['P21'][0]['mainsnak']['datavalue']['value']['id']
0151             try:
0152                 get_entity_gender_id_response = requests.get(zurl+get_entity_gender_id)
0153                 entity_gender_id_json =  get_entity_gender_id_response.json()
0154                 entity_gender = entity_gender_id_json['entities'][get_entity_gender_id]['labels']['en']['value']
0155                 self.speak(entity_gender)
0156                 self.gui.clear()
0157                 self.gui["personContext"] = person_name
0158                 self.gui["answerData"] = entity_gender
0159                 self.gui["imgLink"] = thumb_image
0160                 self.gui.show_page("answer.qml", override_idle=30)
0161                 self.speak(entity_gender)
0162             except Exception as e:
0163                 notFoundMessage = self.translate('gender.not.found',
0164                                                  {'person': person_name})
0165                 self.speak(notFoundMessage)
0166                 entity_gender_id = False
0167         except:
0168             notFoundMessage = self.translate('gender.not.found',
0169                                              {'person': person_name})
0170             self.speak(notFoundMessage)
0171             get_entity_gender_id = False
0172 
0173     @intent_file_handler('who.is.the.spouse.intent')
0174     def handle_wikidata_spouse_intent(self, message):
0175         """
0176         Wikidata Spouse Intent
0177         """
0178         global entity_json
0179         entity_id = self.getEntityId(message.data['person'])
0180         person_name = message.data['person']
0181         thumb_image = self.always_get_image(entity_id)
0182         try:
0183             get_entity_spouse_id = entity_json['entities'][entity_id]['claims']['P26'][0]['mainsnak']['datavalue']['value']['id']
0184             try:
0185                 get_entity_spouse_id_response = requests.get(zurl+get_entity_spouse_id)
0186                 entity_spouse_id_json = get_entity_spouse_id_response.json()
0187                 entity_spouse_id = entity_spouse_id_json['entities'][get_entity_spouse_id]['labels']['en']['value']
0188                 self.gui.clear()
0189                 self.gui["personContext"] = person_name
0190                 self.gui["answerData"] = entity_spouse_id
0191                 self.gui["imgLink"] = thumb_image
0192                 self.gui.show_page("answer.qml", override_idle=30)
0193                 self.speak(entity_spouse_id)
0194             except Exception as e:
0195                 notFoundMessage = self.translate('spouse.not.found',
0196                                                  {'person': person_name})
0197                 self.speak(notFoundMessage)
0198                 entity_spouse_id = False
0199         except:
0200             notFoundMessage = self.translate('spouse.not.found',
0201                                              {'person': person_name})
0202             self.speak(notFoundMessage)
0203             get_entity_spouse_id = False
0204 
0205     @intent_file_handler('which.country.is.from.intent')
0206     def handle_wikidata_country_citizenship(self, message):
0207         """
0208         Wikidata Country Citizenship
0209         """
0210         global entity_json
0211         entity_id = self.getEntityId(message.data['person'])
0212         person_name = message.data['person']
0213         thumb_image = self.always_get_image(entity_id)
0214         try:
0215             get_entity_country_citizenship_id = entity_json['entities'][entity_id]['claims']['P27'][0]['mainsnak']['datavalue']['value']['id']
0216             try:
0217                 get_entity_country_citizenship_id_response = requests.get(zurl+get_entity_country_citizenship_id)
0218                 entity_country_citizenship_json = get_entity_country_citizenship_id_response.json()
0219                 entity_country_citizenship = entity_country_citizenship_json['entities'][get_entity_country_citizenship_id]['labels']['en']['value']
0220                 self.gui.clear()
0221                 self.gui["personContext"] = person_name
0222                 self.gui["answerData"] = entity_country_citizenship
0223                 self.gui["imgLink"] = thumb_image
0224                 self.gui.show_page("answer.qml", override_idle=30)
0225                 self.speak(entity_country_citizenship)
0226             except Exception as e:
0227                 notFoundMessage = self.translate('country.not.found',
0228                                                  {'person': person_name})
0229                 self.speak(notFoundMessage)
0230                 entity_country_citizenship = False
0231         except:
0232             notFoundMessage = self.translate('country.not.found',
0233                                              {'person': person_name})
0234             self.speak(notFoundMessage)
0235             get_entity_country_citizenship_id = False
0236 
0237     @intent_file_handler('what.children.name.intent')
0238     def handle_wikidata_child_name(self, message):
0239         """
0240         Wikidata Child Name
0241         """
0242         global entity_json
0243         entity_id = self.getEntityId(message.data['person'])
0244         person_name = message.data['person']
0245         thumb_image = self.always_get_image(entity_id)
0246         try:
0247             get_entity_child_id = entity_json['entities'][entity_id]['claims']['P40'][0]['mainsnak']['datavalue']['value']['id']
0248             try:
0249                 get_entity_child_id_response = requests.get(zurl+get_entity_child_id)
0250                 entity_child_id_json = get_entity_child_id_response.json()
0251                 entity_child_id = entity_child_id_json = entity_child_id_json['entities'][get_entity_child_id]['labels']['en']['value']
0252                 self.gui.clear()
0253                 self.gui["personContext"] = person_name
0254                 self.gui["answerData"] = entity_child_id
0255                 self.gui["imgLink"] = thumb_image
0256                 self.gui.show_page("answer.qml", override_idle=30)
0257                 self.speak(entity_child_id)
0258             except Exception as e:
0259                 notFoundMessage = self.translate('children.not.found',
0260                                                  {'person': person_name})
0261                 self.speak(notFoundMessage)
0262                 entity_child_id = False
0263         except:
0264             notFoundMessage = self.translate('children.not.found',
0265                                              {'person': person_name})
0266             self.speak(notFoundMessage)
0267             get_entity_child_id = False
0268 
0269     @intent_file_handler('what.occupation.intent')
0270     def handle_wikidata_occupation(self, message):
0271         """
0272         Wikidata Occupation
0273         """
0274         global entity_json
0275         entity_id = self.getEntityId(message.data['person'])
0276         person_name = message.data['person']
0277         thumb_image = self.always_get_image(entity_id)
0278         try:
0279             get_entity_occupation_id = entity_json['entities'][entity_id]['claims']['P106'][0]['mainsnak']['datavalue']['value']['id']
0280             try:
0281                 get_entity_occupation_id_response = requests.get(zurl+get_entity_occupation_id)
0282                 entity_occupation_id_json = get_entity_occupation_id_response.json()
0283                 entity_occupation_id = entity_occupation_id_json['entities'][get_entity_occupation_id]['labels']['en']['value']
0284                 self.gui.clear()
0285                 self.gui["personContext"] = person_name
0286                 self.gui["answerData"] = entity_occupation_id
0287                 self.gui["imgLink"] = thumb_image
0288                 self.gui.show_page("answer.qml", override_idle=30)
0289                 self.speak(entity_occupation_id)
0290             except Exception as e:
0291                 notFoundMessage = self.translate('occupation.not.found',
0292                                                  {'person': person_name})
0293                 self.speak(notFoundMessage)
0294                 entity_occupation_id = False
0295         except:
0296             notFoundMessage = self.translate('occupation.not.found',
0297                                              {'person': person_name})
0298             self.speak(notFoundMessage)
0299             get_entity_occupation_id = False
0300 
0301     @intent_file_handler('burial.location.intent')
0302     def handle_wikidata_place_of_burial(self, message):
0303         """
0304         Wikidata Place Of Burial
0305         """
0306         global entity_json
0307         entity_id = self.getEntityId(message.data['person'])
0308         person_name = message.data['person']
0309 
0310         try:
0311             get_entity_place_of_burial_id = entity_json['entities'][entity_id]['claims']['P119'][0]['mainsnak']['datavalue']['value']['id']
0312             try:
0313                 get_entity_place_of_burial_id_response = requests.get(zurl+get_entity_place_of_burial_id)
0314                 entity_place_of_burial_id_json = get_entity_place_of_burial_id_response.json()
0315                 entity_place_of_burial_id = entity_place_of_burial_id_json['entities'][get_entity_place_of_burial_id]['labels']['en']['value']
0316                 self.gui.clear()
0317                 self.gui["personContext"] = person_name
0318                 self.gui["answerData"] = entity_place_of_burial_id
0319                 self.gui["imgLink"] = thumb_image
0320                 self.gui.show_page("answer.qml", override_idle=30)
0321                 self.speak(entity_place_of_burial_id)
0322             except Exception as e:
0323                 notFoundMessage = self.translate('burial.not.found',
0324                                                  {'person': person_name})
0325                 self.speak(notFoundMessage)
0326                 entity_place_of_burial_id = False
0327         except:
0328             notFoundMessage = self.translate('burial.not.found',
0329                                              {'person': person_name})
0330             self.speak(notFoundMessage)
0331             get_entity_place_of_burial_id = False
0332 
0333     @intent_file_handler('date.of.birth.intent')
0334     def handle_wikidata_date_of_birth(self, message):
0335         """
0336         Wikidata Date of Birth
0337         """
0338         global entity_json
0339         entity_id = self.getEntityId(message.data['person'])
0340         person_name = message.data['person']
0341         thumb_image = self.always_get_image(entity_id)
0342         try:
0343             get_entity_dob_id = entity_json['entities'][entity_id]['claims']['P569'][0]['mainsnak']['datavalue']['value']['time']
0344             try:
0345                 fix_gedobid = get_entity_dob_id.replace("+", "")
0346                 a = arrow.get(fix_gedobid)
0347                 birth_date = a.format("DD,MM,YYYY")
0348                 birth_date_breakup = birth_date.split(",")
0349                 person_name = message.data['person']
0350                 day = birth_date_breakup[0]
0351                 month = birth_date_breakup[1]
0352                 year = birth_date_breakup[2]
0353                 birth_date_to_speak = self.translate('date.of.birth',
0354                                                      {'person': person_name,
0355                                                       'day': day,
0356                                                       'month': month,
0357                                                       'year': year})
0358                 self.gui.clear()
0359                 self.gui["personContext"] = person_name
0360                 self.gui["answerData"] = birth_date
0361                 self.gui["imgLink"] = thumb_image
0362                 self.gui.show_page("answer.qml", override_idle=30)
0363                 self.speak(birth_date_to_speak)
0364             except Exception as e:
0365                 notFoundMessage = self.translate('date.of.birth.not.found',
0366                                                  {'person': person_name})
0367                 self.speak(notFoundMessage)
0368                 entity_dob = False
0369         except:
0370             notFoundMessage = self.translate('date.of.birth.not.found',
0371                                              {'person': person_name})
0372             self.speak(notFoundMessage)
0373             get_entity_dob_id = False
0374 
0375     @intent_file_handler('date.of.death.intent')
0376     def handle_wikidata_date_of_death(self, message):
0377         """
0378         Wikidata Date of Death
0379         """
0380         global entity_json
0381         entity_id = self.getEntityId(message.data['person'])
0382         person_name = message.data['person']
0383         thumb_image = self.always_get_image(entity_id)
0384         try:
0385             get_entity_dod_id = entity_json['entities'][entity_id]['claims']['P570'][0]['mainsnak']['datavalue']['value']['time']
0386             try:
0387                 fix_gedodid = get_entity_dod_id.replace("+", "")
0388                 a = arrow.get(fix_gedodid)
0389                 death_date = a.format("DD,MM,YYYY")
0390                 death_date_breakup = death_date.split(",")
0391                 person_name = message.data['person']
0392                 day = death_date_breakup[0]
0393                 month = death_date_breakup[1]
0394                 year = death_date_breakup[2]
0395                 death_date_to_speak = self.translate('date.of.death',
0396                                                      {'person': person_name,
0397                                                       'day': day,
0398                                                       'month': month,
0399                                                       'year': year})
0400                 self.gui.clear()
0401                 self.gui["personContext"] = person_name
0402                 self.gui["answerData"] = death_date
0403                 self.gui["imgLink"] = thumb_image
0404                 self.gui.show_page("answer.qml", override_idle=30)
0405                 self.speak(death_date_to_speak)
0406             except Exception as e:
0407                 notFoundMessage = self.translate('date.of.death.not.found',
0408                                                  {'person': person_name})
0409                 self.speak(notFoundMessage)
0410                 entity_dod = False
0411         except:
0412             notFoundMessage = self.translate('date.of.death.not.found',
0413                                              {'person': person_name})
0414             self.speak(notFoundMessage)
0415             get_entity_dob_id = False
0416 
0417     def getAge(self, dateofbirth):
0418         d = datetime.strptime(s, '%d %B, %Y')
0419         print(d.strftime('%Y-%m-%d'))
0420         return d.strftime('%Y-%m-%d')
0421 
0422     def get_info_wikidata(self, datavalue):
0423         name = datavalue.strip()
0424         wikidataObject = self._wikidata(name)
0425         r = wikidataObject['search'][0]['concepturi']
0426         return r
0427 
0428     def _wikidata(self, name):
0429         url = "http://www.wikidata.org/w/api.php"
0430         params = {
0431             "search": name,
0432             "action": "wbsearchentities",
0433             "format": "json",
0434             "language": "en",
0435             "type": "item",
0436             "continue": "0",
0437             "limit": "10"
0438         }
0439         return requests.get(url, params=params).json()
0440 
0441 
0442     def getEntityId(self, itemcontext):
0443         item = itemcontext
0444         global entity_json
0445         try:
0446             result = self.get_info_wikidata(item)
0447             if result != None:
0448                 entity_result = requests.get(result)
0449                 entity_json = entity_result.json()
0450                 for key in entity_json['entities'].keys():
0451                     entity_id = key
0452                     return entity_id
0453         except:
0454             return False
0455 
0456     def always_get_image(self, datakey):
0457             global entity_json
0458             entity_id = datakey
0459             try:
0460                 get_entity_pic_link = entity_json['entities'][entity_id]['claims']['P18'][0]['mainsnak']['datavalue']['value']
0461                 get_entity_pic = get_entity_pic_link.replace(" ", "_")
0462                 get_entity_pic_hyperlink = "https://commons.wikimedia.org/wiki/File:{0}".format(get_entity_pic)
0463                 get_entity_pic_content = requests.get(get_entity_pic_hyperlink)
0464                 soup = BeautifulSoup(get_entity_pic_content.content, 'html.parser')
0465                 imagelist = []
0466                 for link in soup.find_all('div', class_="fullImageLink"):
0467                     for x in link.find_all('a'):
0468                         r = x.get('href')
0469                         imagelist.append(r)
0470 
0471                 return imagelist[0]
0472             except:
0473                 get_entity_pic_link = False
0474                 print(get_entity_pic_link)
0475                 return False
0476 
0477     def stop(self):
0478         pass
0479 
0480 
0481 def create_skill():
0482     return WikidataSkill()