aboutsummaryrefslogtreecommitdiff
path: root/ext/mixed/js/audio.js
diff options
context:
space:
mode:
authorAlex Yatskov <alex@foosoft.net>2017-08-15 21:36:30 -0700
committerAlex Yatskov <alex@foosoft.net>2017-08-15 21:36:30 -0700
commite19933f9804abf4e64d96143bbb58f8059de5b38 (patch)
tree97a4f486203b06be4281fff20ad0dc81aa770dce /ext/mixed/js/audio.js
parente079e5f252ee39b222f3eb78e81d0a6bab6626d2 (diff)
jisho.org audio support
Diffstat (limited to 'ext/mixed/js/audio.js')
-rw-r--r--ext/mixed/js/audio.js30
1 files changed, 29 insertions, 1 deletions
diff --git a/ext/mixed/js/audio.js b/ext/mixed/js/audio.js
index eb8fde94..0952887e 100644
--- a/ext/mixed/js/audio.js
+++ b/ext/mixed/js/audio.js
@@ -79,7 +79,35 @@ async function audioBuildUrl(definition, mode, cache={}) {
}
}
});
- } else {
+ } else if (mode === 'jisho') {
+ return new Promise((resolve, reject) => {
+ const response = cache[definition.expression];
+ if (response) {
+ resolve(response);
+ } else {
+ const xhr = new XMLHttpRequest();
+ xhr.open('GET', `http://jisho.org/search/${definition.expression}`);
+ xhr.addEventListener('error', () => reject('failed to scrape audio data'));
+ xhr.addEventListener('load', () => {
+ cache[definition.expression] = xhr.responseText;
+ resolve(xhr.responseText);
+ });
+
+ xhr.send();
+ }
+ }).then(response => {
+ try {
+ const dom = new DOMParser().parseFromString(response, 'text/html');
+ const audio = dom.getElementById(`audio_${definition.expression}:${definition.reading}`);
+ if (audio) {
+ return audio.getElementsByTagName('source').item(0).getAttribute('src');
+ }
+ } catch (e) {
+ // NOP
+ }
+ });
+ }
+ else {
return Promise.resolve();
}
}