From 4ce93d84c06918a20668bcab54f82b2e8bf7a2e6 Mon Sep 17 00:00:00 2001 From: Patrizia Date: Fri, 24 Aug 2018 13:56:28 +0200 Subject: [PATCH] Get definitions, examples, pronunciations, phonetic symbols and derivatives from Oxford API --- addons/fastwq/service/dict/oxford.py | 92 +++++++++++++++++++++----- addons21/fastwq/service/dict/oxford.py | 91 ++++++++++++++++++++----- 2 files changed, 152 insertions(+), 31 deletions(-) diff --git a/addons/fastwq/service/dict/oxford.py b/addons/fastwq/service/dict/oxford.py index 2602c7e..405036a 100644 --- a/addons/fastwq/service/dict/oxford.py +++ b/addons/fastwq/service/dict/oxford.py @@ -1,30 +1,90 @@ #-*- coding:utf-8 -*- - +import os import urllib2 import json from ..base import * +oxford_download_mp3 = True -@register(u"Oxford") +@register(u'Oxford') class Oxford(WebService): def __init__(self): super(Oxford, self).__init__() - def _get_from_api(self, lang="en"): - word = self.word - baseurl = "https://od-api.oxforddictionaries.com/api/v1" - app_id = "45aecf84" - app_key = "bb36fd6a1259e5baf8df6110a2f7fc8f" - headers = {"app_id": app_id, "app_key": app_key} + def _get_from_api(self, lang='en'): + app_id = '45aecf84' + app_key = 'bb36fd6a1259e5baf8df6110a2f7fc8f' + headers = {'app_id': app_id, 'app_key': app_key} + word_id = urllib2.quote(self.word.lower().replace(' ', '_')) + url = u'https://od-api.oxforddictionaries.com/api/v1/entries/' + lang + u'/' + word_id + result = {'lexicalEntries': ''} + try: + result.update(json.loads(self.get_response(url, headers=headers, timeout=10))['results'][0]) + except: + pass + return self.cache_this(result) - word_id = urllib2.quote(word.lower().replace(" ", "_")) - url = baseurl + "/entries/" + lang + "/" + word_id - url = urllib2.Request(url, headers=headers) - response = json.loads(urllib2.urlopen(url).read()) + @export('DEF') + def fld_definition(self): + try: + return self._get_field('lexicalEntries')[0]['entries'][0]['senses'][0]['definitions'][0] + except: + return '' - return response["results"] + def _fld_pron_mp3(self, audio_url): + if oxford_download_mp3 and audio_url: + filename = get_hex_name(self.unique.lower(), audio_url, 'mp3') + if os.path.exists(filename) or self.net_download(filename, audio_url): + return self.get_anki_label(filename, 'audio') + return '' - @export("Lexical Category") - def fld_category(self): - return self._get_from_api()[0]["lexicalEntries"][0]["lexicalCategory"] + @export('PRON') + def fld_pron(self): + try: + entries = self._get_field('lexicalEntries') + prons_mp3 = '' + for entry in entries: + if 'pronunciations' in entry: + prons = entry['pronunciations'] + pos = entry['lexicalCategory'] + prons_mp3 += '
' if prons_mp3 else '' + u'
'.join( + u'{0}({1}) {2}'.format( + pron['dialects'][0] + ' ' if 'dialects' in pron else '', + pos, + self._fld_pron_mp3(pron['audioFile'])) for pron in prons) + return prons_mp3 + except: + return '' + + @export('PHON') + def fld_phon(self): + try: + prons = self._get_field('lexicalEntries')[0]['pronunciations'] + return u'
'.join(u'{0}{1}'.format(pron['dialects'][0] + ': ' if 'dialects' in pron else '', pron['phoneticSpelling']) for pron in prons) + except: + return '' + + @export('EXAMPLE') + def fld_example(self): + try: + entries = self._get_field('lexicalEntries')[0]['entries'][0]['senses'][0]['examples'] + return u'
'.join(entry['text'] for entry in entries) + except: + return '' + + @export(u'Derivatives') + def fld_deriv(self): + try: + entries = self._get_field('lexicalEntries')[0]['derivatives'] + return u', '.join(entry['text'] for entry in entries) + except: + return '' + + @export([u'词性', u'POS']) + def fld_pos(self): + try: + entries = self._get_field('lexicalEntries') + return u', '.join(entry['lexicalCategory'] for entry in entries) + except: + return '' diff --git a/addons21/fastwq/service/dict/oxford.py b/addons21/fastwq/service/dict/oxford.py index cf737a8..41dc56b 100644 --- a/addons21/fastwq/service/dict/oxford.py +++ b/addons21/fastwq/service/dict/oxford.py @@ -1,4 +1,5 @@ #-*- coding:utf-8 -*- +import os try: import urllib2 except: @@ -7,27 +8,87 @@ import json from aqt.utils import showInfo from ..base import WebService, export, register, with_styles +oxford_download_mp3 = True -@register(u"Oxford") +@register(u'Oxford') class Oxford(WebService): def __init__(self): super(Oxford, self).__init__() - def _get_from_api(self, lang="en"): - word = self.word - baseurl = "https://od-api.oxforddictionaries.com/api/v1" - app_id = "45aecf84" - app_key = "bb36fd6a1259e5baf8df6110a2f7fc8f" - headers = {"app_id": app_id, "app_key": app_key} + def _get_from_api(self, lang='en'): + app_id = '45aecf84' + app_key = 'bb36fd6a1259e5baf8df6110a2f7fc8f' + headers = {'app_id': app_id, 'app_key': app_key} + word_id = urllib2.quote(self.word.lower().replace(' ', '_')) + url = u'https://od-api.oxforddictionaries.com/api/v1/entries/' + lang + u'/' + word_id + result = {'lexicalEntries': ''} + try: + result.update(json.loads(self.get_response(url, headers=headers, timeout=10))['results'][0]) + except: + pass + return self.cache_this(result) - word_id = urllib2.quote(word.lower().replace(" ", "_")) - url = baseurl + "/entries/" + lang + "/" + word_id - url = urllib2.Request(url, headers=headers) - response = json.loads(urllib2.urlopen(url).read()) + @export('DEF') + def fld_definition(self): + try: + return self._get_field('lexicalEntries')[0]['entries'][0]['senses'][0]['definitions'][0] + except: + return '' - return response["results"] + def _fld_pron_mp3(self, audio_url): + if oxford_download_mp3 and audio_url: + filename = get_hex_name(self.unique.lower(), audio_url, 'mp3') + if os.path.exists(filename) or self.net_download(filename, audio_url): + return self.get_anki_label(filename, 'audio') + return '' - @export("Lexical Category") - def _fld_category(self): - return self._get_from_api()[0]["lexicalEntries"][0]["lexicalCategory"] + @export('PRON') + def fld_pron(self): + try: + entries = self._get_field('lexicalEntries') + prons_mp3 = '' + for entry in entries: + if 'pronunciations' in entry: + prons = entry['pronunciations'] + pos = entry['lexicalCategory'] + prons_mp3 += '
' if prons_mp3 else '' + u'
'.join( + u'{0}({1}) {2}'.format( + pron['dialects'][0] + ' ' if 'dialects' in pron else '', + pos, + self._fld_pron_mp3(pron['audioFile'])) for pron in prons) + return prons_mp3 + except: + return '' + + @export('PHON') + def fld_phon(self): + try: + prons = self._get_field('lexicalEntries')[0]['pronunciations'] + return u'
'.join(u'{0}{1}'.format(pron['dialects'][0] + ': ' if 'dialects' in pron else '', pron['phoneticSpelling']) for pron in prons) + except: + return '' + + @export('EXAMPLE') + def fld_example(self): + try: + entries = self._get_field('lexicalEntries')[0]['entries'][0]['senses'][0]['examples'] + return u'
'.join(entry['text'] for entry in entries) + except: + return '' + + @export(u'Derivatives') + def fld_deriv(self): + try: + entries = self._get_field('lexicalEntries')[0]['derivatives'] + return u', '.join(entry['text'] for entry in entries) + except: + return '' + + @export([u'词性', u'POS']) + def fld_pos(self): + try: + entries = self._get_field('lexicalEntries') + return u', '.join(entry['lexicalCategory'] for entry in entries) + except: + return ''