From 4e3792aba319b52f957c70347e859f677972e4e2 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Sun, 5 Feb 2017 16:39:40 -0800 Subject: handle content script and background script desync on version update --- ext/fg/js/frame.js | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'ext/fg/js/frame.js') diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index 66fa131d..dba59000 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -44,7 +44,7 @@ class Frame { window.scrollTo(0, 0); renderText(context, 'terms.html').then(content => { - $('.content').html(content); + $('#content').html(content); $('.action-add-note').click(this.onAddNote.bind(this)); $('.kanji-link').click(e => { @@ -59,6 +59,8 @@ class Frame { }); this.updateAddNoteButtons(['term_kanji', 'term_kana'], sequence); + }).catch(error => { + this.handleError(error); }); } @@ -74,13 +76,20 @@ class Frame { window.scrollTo(0, 0); renderText(context, 'kanji.html').then(content => { - $('.content').html(content); + $('#content').html(content); $('.action-add-note').click(this.onAddNote.bind(this)); this.updateAddNoteButtons(['kanji'], sequence); + }).catch(error => { + this.handleError(error); }); } + api_showOrphaned() { + $('#content').hide(); + $('#orphan').show(); + } + findAddNoteButton(index, mode) { return $(`.action-add-note[data-index="${index}"][data-mode="${mode}"]`); } @@ -98,10 +107,10 @@ class Frame { const button = this.findAddNoteButton(index, mode); button.addClass('disabled'); } else { - window.alert('Note could not be added'); + showError('note could not be added'); } }).catch(error => { - window.alert('Error: ' + error); + this.handleError(error); }).then(() => { this.showSpinner(false); }); @@ -129,6 +138,8 @@ class Frame { button.removeClass('pending'); } }); + }).catch(error => { + this.handleError(error); }); } @@ -155,6 +166,14 @@ class Frame { audio.currentTime = 0; audio.play(); } + + handleError(error) { + if (window.orphaned) { + this.api_showOrphaned(); + } else { + showError(error); + } + } } window.frame = new Frame(); -- cgit v1.2.3 From 2e3aec9ba11b15d7ac2b5d99af2dacac88e9c276 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Wed, 8 Feb 2017 20:13:45 -0800 Subject: fix "url" not being set on kanji cards, add more fields --- ext/bg/js/options-form.js | 2 +- ext/fg/js/driver.js | 6 +++++- ext/fg/js/frame.js | 10 +++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) (limited to 'ext/fg/js/frame.js') diff --git a/ext/bg/js/options-form.js b/ext/bg/js/options-form.js index 4470d105..91c6f140 100644 --- a/ext/bg/js/options-form.js +++ b/ext/bg/js/options-form.js @@ -351,7 +351,7 @@ function populateAnkiFields(element, options) { const markers = { 'terms': ['audio', 'dictionary', 'expression', 'furigana', 'glossary', 'reading', 'sentence', 'tags', 'url'], - 'kanji': ['character', 'dictionary', 'glossary', 'kunyomi', 'onyomi', 'url'] + 'kanji': ['character', 'dictionary', 'glossary', 'kunyomi', 'onyomi', 'sentence', 'tags', 'url'] }[tabId] || {}; return anki().getModelFieldNames(modelName).then(names => { diff --git a/ext/fg/js/driver.js b/ext/fg/js/driver.js index 7facda0a..cb7f2ea6 100644 --- a/ext/fg/js/driver.js +++ b/ext/fg/js/driver.js @@ -167,7 +167,11 @@ class Driver { if (definitions.length === 0) { return false; } else { - definitions.forEach(definition => definition.url = window.location.href); + const sentence = extractSentence(textSource, this.options.anki.sentenceExt); + definitions.forEach(definition => { + definition.url = window.location.href; + definition.sentence = sentence; + }); this.popup.showNextTo(textSource.getRect()); this.popup.showKanjiDefs(definitions, this.options); diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index dba59000..df8ca894 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -49,7 +49,15 @@ class Frame { $('.kanji-link').click(e => { e.preventDefault(); - findKanji($(e.target).text()).then(kdefs => this.api_showKanjiDefs({options, definitions: kdefs})); + const character = $(e.target).text(); + findKanji(character).then(kdefs => { + kdefs.forEach(kdef => { + kdef.url = definitions[0].url; + kdef.sentence = definitions[0].sentence; + }); + + this.api_showKanjiDefs({options, definitions: kdefs}); + }); }); $('.action-play-audio').click(e => { -- cgit v1.2.3 From 78d5b511278cd9b8f9319220bec55b8628f6cb36 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Fri, 10 Feb 2017 20:45:01 -0800 Subject: fix url and sentence tags on kanji cards --- ext/fg/js/driver.js | 16 ++++++---------- ext/fg/js/frame.js | 31 +++++++++++++++++-------------- ext/fg/js/popup.js | 8 ++++---- 3 files changed, 27 insertions(+), 28 deletions(-) (limited to 'ext/fg/js/frame.js') diff --git a/ext/fg/js/driver.js b/ext/fg/js/driver.js index cb7f2ea6..c84805d7 100644 --- a/ext/fg/js/driver.js +++ b/ext/fg/js/driver.js @@ -143,13 +143,11 @@ class Driver { textSource.setEndOffset(length); const sentence = extractSentence(textSource, this.options.anki.sentenceExt); - definitions.forEach(definition => { - definition.url = window.location.href; - definition.sentence = sentence; - }); + const url = window.location.href; this.popup.showNextTo(textSource.getRect()); - this.popup.showTermDefs(definitions, this.options); + this.popup.showTermDefs(definitions, this.options, {sentence, url}); + this.lastTextSource = textSource; if (this.options.scanning.selectText) { textSource.select(); @@ -168,13 +166,11 @@ class Driver { return false; } else { const sentence = extractSentence(textSource, this.options.anki.sentenceExt); - definitions.forEach(definition => { - definition.url = window.location.href; - definition.sentence = sentence; - }); + const url = window.location.href; this.popup.showNextTo(textSource.getRect()); - this.popup.showKanjiDefs(definitions, this.options); + this.popup.showKanjiDefs(definitions, this.options, {sentence, url}); + this.lastTextSource = textSource; if (this.options.scanning.selectText) { textSource.select(); diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index df8ca894..83d6d7ef 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -30,34 +30,32 @@ class Frame { }); } - api_showTermDefs({definitions, options}) { + api_showTermDefs({definitions, options, context}) { const sequence = ++this.sequence; - const context = { + const params = { definitions, grouped: options.general.groupResults, addable: options.ankiMethod !== 'disabled', playback: options.general.audioPlayback }; + definitions.forEach(definition => { + definition.sentence = context.sentence; + definition.url = context.url; + }); + this.definitions = definitions; this.showSpinner(false); window.scrollTo(0, 0); - renderText(context, 'terms.html').then(content => { + renderText(params, 'terms.html').then(content => { $('#content').html(content); $('.action-add-note').click(this.onAddNote.bind(this)); $('.kanji-link').click(e => { e.preventDefault(); const character = $(e.target).text(); - findKanji(character).then(kdefs => { - kdefs.forEach(kdef => { - kdef.url = definitions[0].url; - kdef.sentence = definitions[0].sentence; - }); - - this.api_showKanjiDefs({options, definitions: kdefs}); - }); + findKanji(character).then(definitions => this.api_showKanjiDefs({definitions, options, context})); }); $('.action-play-audio').click(e => { @@ -72,18 +70,23 @@ class Frame { }); } - api_showKanjiDefs({definitions, options}) { + api_showKanjiDefs({definitions, options, context}) { const sequence = ++this.sequence; - const context = { + const params = { definitions, addable: options.ankiMethod !== 'disabled' }; + definitions.forEach(definition => { + definition.sentence = context.sentence; + definition.url = context.url; + }); + this.definitions = definitions; this.showSpinner(false); window.scrollTo(0, 0); - renderText(context, 'kanji.html').then(content => { + renderText(params, 'kanji.html').then(content => { $('#content').html(content); $('.action-add-note').click(this.onAddNote.bind(this)); diff --git a/ext/fg/js/popup.js b/ext/fg/js/popup.js index 74e25c7d..751c6acc 100644 --- a/ext/fg/js/popup.js +++ b/ext/fg/js/popup.js @@ -68,12 +68,12 @@ class Popup { return this.container.style.visibility !== 'hidden'; } - showTermDefs(definitions, options) { - this.invokeApi('showTermDefs', {definitions, options}); + showTermDefs(definitions, options, context) { + this.invokeApi('showTermDefs', {definitions, options, context}); } - showKanjiDefs(definitions, options) { - this.invokeApi('showKanjiDefs', {definitions, options}); + showKanjiDefs(definitions, options, context) { + this.invokeApi('showKanjiDefs', {definitions, options, context}); } showOrphaned() { -- cgit v1.2.3 From 701c91ea66852631ccc6e7bfb23b49578646ff33 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Sat, 11 Feb 2017 12:16:14 -0800 Subject: block placeholder audio with a short audio clip --- ext/fg/js/frame.js | 23 +++++++++++++++++++---- ext/fg/mp3/button.mp3 | Bin 0 -> 17735 bytes ext/manifest.json | 5 +++-- 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 ext/fg/mp3/button.mp3 (limited to 'ext/fg/js/frame.js') diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index 83d6d7ef..ca0636f9 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -170,12 +170,27 @@ class Frame { } for (const key in this.audioCache) { - this.audioCache[key].pause(); + const audio = this.audioCache[key]; + if (audio !== null) { + audio.pause(); + } } - const audio = this.audioCache[url] || new Audio(url); - audio.currentTime = 0; - audio.play(); + let audio = this.audioCache[url]; + if (audio) { + audio.currentTime = 0; + audio.play(); + } else { + audio = new Audio(url); + audio.onloadeddata = () => { + if (audio.duration === 5.694694) { + audio = new Audio('mp3/button.mp3'); + } + + this.audioCache[url] = audio; + audio.play(); + }; + } } handleError(error) { diff --git a/ext/fg/mp3/button.mp3 b/ext/fg/mp3/button.mp3 new file mode 100644 index 00000000..7a9728d1 Binary files /dev/null and b/ext/fg/mp3/button.mp3 differ diff --git a/ext/manifest.json b/ext/manifest.json index 1c80435f..0a1301c1 100644 --- a/ext/manifest.json +++ b/ext/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "Yomichan", - "version": "1.0.12", + "version": "1.0.13", "description": "Japanese dictionary with Anki integration", "icons": {"16": "img/icon16.png", "48": "img/icon48.png", "128": "img/icon128.png"}, @@ -31,13 +31,14 @@ ], "web_accessible_resources": [ "fg/css/frame.css", + "fg/frame.html", "fg/img/add_kanji.png", "fg/img/add_term_kana.png", "fg/img/add_term_kanji.png", "fg/img/play_audio.png", "fg/img/spinner.gif", "fg/js/frame.js", - "fg/frame.html", + "fg/mp3/button.mp3", "fg/ttf/kanji-stroke-orders.ttf", "fg/ttf/vl-gothic-regular.ttf" ] -- cgit v1.2.3 From 1a52a2d8d5f5ea5c106ae244ca1e5bbf0da22b6e Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Sat, 18 Feb 2017 19:12:39 -0800 Subject: fix not being able to play audio for kana only terms --- ext/fg/frame.html | 1 + ext/fg/js/frame.js | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) (limited to 'ext/fg/js/frame.js') diff --git a/ext/fg/frame.html b/ext/fg/frame.html index b7e2b41a..bf7f0f7b 100644 --- a/ext/fg/frame.html +++ b/ext/fg/frame.html @@ -17,6 +17,7 @@ + diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index ca0636f9..4f4a6378 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -164,11 +164,6 @@ class Frame { } playAudio(definition) { - let url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?kanji=${encodeURIComponent(definition.expression)}`; - if (definition.reading) { - url += `&kana=${encodeURIComponent(definition.reading)}`; - } - for (const key in this.audioCache) { const audio = this.audioCache[key]; if (audio !== null) { @@ -176,6 +171,28 @@ class Frame { } } + let kana = definition.reading; + let kanji = definition.expression; + if (!kana) { + if (!kanji) { + return; + } + + if (wanakana.isHiragana(kanji)) { + kana = kanji; + kanji = null; + } + } + + const params = []; + if (kanji) { + params.push(`kanji=${encodeURIComponent(kanji)}`); + } + if (kana) { + params.push(`kana=${encodeURIComponent(kana)}`); + } + + const url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?${params.join('&')}`; let audio = this.audioCache[url]; if (audio) { audio.currentTime = 0; -- cgit v1.2.3 From 64db42d536318cc4b91ed5a7484de302db7979f4 Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Sun, 19 Feb 2017 10:09:15 -0800 Subject: switch to new ankiconnect interface --- ext/bg/js/ankiconnect.js | 2 +- ext/bg/js/yomichan.js | 27 +++++++++++++++------------ ext/fg/js/frame.js | 34 +++++++++++++--------------------- ext/fg/js/util.js | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 34 deletions(-) (limited to 'ext/fg/js/frame.js') diff --git a/ext/bg/js/ankiconnect.js b/ext/bg/js/ankiconnect.js index f6f94329..3a6e3690 100644 --- a/ext/bg/js/ankiconnect.js +++ b/ext/bg/js/ankiconnect.js @@ -20,7 +20,7 @@ class AnkiConnect { constructor(server) { this.server = server; this.asyncPools = {}; - this.localVersion = 1; + this.localVersion = 2; this.remoteVersion = null; } diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index 80a67588..4c70bf0f 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -100,20 +100,23 @@ class Yomichan { note.deckName = this.options.anki.terms.deck; note.modelName = this.options.anki.terms.model; - const audio = { - kanji: definition.expression, - kana: definition.reading, - fields: [] - }; - - for (const name in fields) { - if (fields[name].includes('{audio}')) { - audio.fields.push(name); + if (definition.audio) { + const audio = { + url: definition.audio.url, + filename: definition.audio.filename, + skipHash: '7e2c2f954ef6051373ba916f000168dc', + fields: [] + }; + + for (const name in fields) { + if (fields[name].includes('{audio}')) { + audio.fields.push(name); + } } - } - if (audio.fields.length > 0) { - note.audio = audio; + if (audio.fields.length > 0) { + note.audio = audio; + } } } diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index 4f4a6378..1028f0f6 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -113,7 +113,16 @@ class Frame { const index = link.data('index'); const mode = link.data('mode'); - addDefinition(this.definitions[index], mode).then(success => { + const definition = this.definitions[index]; + if (mode !== 'kanji') { + const url = buildAudioUrl(definition); + const filename = buildAudioFilename(definition); + if (url && filename) { + definition.audio = {url, filename}; + } + } + + addDefinition(definition, mode).then(success => { if (success) { const button = this.findAddNoteButton(index, mode); button.addClass('disabled'); @@ -171,28 +180,11 @@ class Frame { } } - let kana = definition.reading; - let kanji = definition.expression; - if (!kana) { - if (!kanji) { - return; - } - - if (wanakana.isHiragana(kanji)) { - kana = kanji; - kanji = null; - } - } - - const params = []; - if (kanji) { - params.push(`kanji=${encodeURIComponent(kanji)}`); - } - if (kana) { - params.push(`kana=${encodeURIComponent(kana)}`); + const url = buildAudioUrl(definition); + if (!url) { + return; } - const url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?${params.join('&')}`; let audio = this.audioCache[url]; if (audio) { audio.currentTime = 0; diff --git a/ext/fg/js/util.js b/ext/fg/js/util.js index aeda36b5..c9ee4ed7 100644 --- a/ext/fg/js/util.js +++ b/ext/fg/js/util.js @@ -166,3 +166,43 @@ function extractSentence(source, extent) { return content.substring(startPos, endPos).trim(); } + +function buildAudioUrl(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('&')}`; +} + +function buildAudioFilename(definition) { + if (!definition.reading && !definition.expression) { + return null; + } + + let filename = 'yomichan'; + if (definition.reading) { + filename += `_${definition.reading}`; + } + if (definition.expression) { + filename += `_${definition.expression}`; + } + + return filename += '.mp3'; +} -- cgit v1.2.3