This commit is contained in:
Alex Yatskov 2017-03-22 22:28:22 -07:00
parent 046b1b45a5
commit 80d864d6b1

View File

@ -23,6 +23,7 @@ class Display {
this.container = container;
this.definitions = [];
this.audioCache = {};
this.resultCache = {};
this.sequence = 0;
}
@ -80,7 +81,7 @@ class Display {
$('.action-play-audio').click(e => {
e.preventDefault();
const index = Display.entryIndexFind($(e.currentTarget));
this.audioPlay(this.definitions[index], this.audioCache);
this.audioPlay(this.definitions[index]);
});
$('.kanji-link').click(e => {
e.preventDefault();
@ -184,18 +185,18 @@ class Display {
}).catch(this.handleError.bind(this)).then(() => this.spinner.hide());
}
audioPlay(definition, cache) {
audioPlay(definition) {
this.spinner.show();
for (const key in cache) {
const audio = cache[key];
for (const key in this.audioCache) {
const audio = this.audioCache[key];
if (audio !== null) {
audio.pause();
}
}
Display.audioBuildUrl(definition).then(url => {
let audio = cache[url];
this.audioBuildUrl(definition).then(url => {
let audio = this.audioCache[url];
if (audio) {
audio.currentTime = 0;
audio.play();
@ -206,23 +207,21 @@ class Display {
audio = new Audio('/mixed/mp3/button.mp3');
}
cache[url] = audio;
this.audioCache[url] = audio;
audio.play();
};
}
}).catch(this.handleError.bind(this)).then(() => this.spinner.hide());
}
static entryIndexFind(element) {
return $('.entry').index(element.closest('.entry'));
}
static adderButtonFind(index, mode) {
return $('.entry').eq(index).find(`.action-add-note[data-mode="${mode}"]`);
}
static audioBuildUrl(definition) {
audioBuildUrl(definition) {
return new Promise((resolve, reject) => {
const response = this.resultCache[definition.expression];
if (response) {
resolve(response);
return;
}
const data = {
post: 'dictionary_reference',
match_type: 'exact',
@ -235,10 +234,14 @@ class Display {
}
const xhr = new XMLHttpRequest();
xhr.addEventListener('error', () => reject('failed to execute network request'));
xhr.addEventListener('load', () => resolve(xhr.responseText));
xhr.open('POST', 'https://www.japanesepod101.com/learningcenter/reference/dictionary_post');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.addEventListener('error', () => reject('failed to execute network request'));
xhr.addEventListener('load', () => {
this.resultCache[definition.expression] = xhr.responseText;
resolve(xhr.responseText);
});
xhr.send(params.join('&'));
}).then(response => {
const dom = new DOMParser().parseFromString(response, 'text/html');
@ -270,30 +273,6 @@ class Display {
});
}
static audioBuildUrlOld(definition) {
let kana = definition.reading;
let kanji = definition.expression;
if (!kana && !kanji) {
return null;
}
if (!kana && wanakana.isHiragana(kanji)) {
kana = kanji;
kanji = null;
}
const params = [];
if (kanji) {
params.push(`kanji=${encodeURIComponent(kanji)}`);
}
if (kana) {
params.push(`kana=${encodeURIComponent(kana)}`);
}
return `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?${params.join('&')}`;
}
static audioBuildFilename(definition) {
if (!definition.reading && !definition.expression) {
return null;
@ -309,4 +288,12 @@ class Display {
return filename += '.mp3';
}
static entryIndexFind(element) {
return $('.entry').index(element.closest('.entry'));
}
static adderButtonFind(index, mode) {
return $('.entry').eq(index).find(`.action-add-note[data-mode="${mode}"]`);
}
}