From cae6b657ab418a1cafedcb1cf72d0e793fa5178b Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 2 May 2020 12:50:16 -0400 Subject: Anki audio download (#477) * Update how audio is added to Anki cards * Upgrade Anki templates * Update comments --- ext/bg/js/anki-note-builder.js | 47 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 24 deletions(-) (limited to 'ext/bg/js/anki-note-builder.js') diff --git a/ext/bg/js/anki-note-builder.js b/ext/bg/js/anki-note-builder.js index dc1e9427..1f9c6ed2 100644 --- a/ext/bg/js/anki-note-builder.js +++ b/ext/bg/js/anki-note-builder.js @@ -42,25 +42,6 @@ class AnkiNoteBuilder { note.fields[fieldName] = await this.formatField(fieldValue, definition, mode, context, options, templates, null); } - if (!isKanji && definition.audio) { - const audioFields = []; - - for (const [fieldName, fieldValue] of modeOptionsFieldEntries) { - if (fieldValue.includes('{audio}')) { - audioFields.push(fieldName); - } - } - - if (audioFields.length > 0) { - note.audio = { - url: definition.audio.url, - filename: definition.audio.filename, - skipHash: '7e2c2f954ef6051373ba916f000168dc', // hash of audio data that should be skipped - fields: audioFields - }; - } - } - return note; } @@ -88,18 +69,31 @@ class AnkiNoteBuilder { }); } - async injectAudio(definition, fields, sources, details) { + async injectAudio(definition, fields, sources, customSourceUrl) { if (!this._containsMarker(fields, 'audio')) { return; } try { const expressions = definition.expressions; const audioSourceDefinition = Array.isArray(expressions) ? expressions[0] : definition; - const {uri} = await this._audioSystem.getDefinitionAudio(audioSourceDefinition, sources, details); const filename = this._createInjectedAudioFileName(audioSourceDefinition); - if (filename !== null) { - definition.audio = {url: uri, filename}; - } + if (filename === null) { return; } + + const {audio} = await this._audioSystem.getDefinitionAudio( + audioSourceDefinition, + sources, + { + textToSpeechVoice: null, + customSourceUrl, + binary: true, + disableCache: true + } + ); + + const data = AnkiNoteBuilder.arrayBufferToBase64(audio); + await this._anki.storeMediaFile(filename, data); + + definition.audioFileName = filename; } catch (e) { // NOP } @@ -129,6 +123,7 @@ class AnkiNoteBuilder { if (reading) { filename += `_${reading}`; } if (expression) { filename += `_${expression}`; } filename += '.mp3'; + filename = filename.replace(/\]/g, ''); return filename; } @@ -152,6 +147,10 @@ class AnkiNoteBuilder { return false; } + static arrayBufferToBase64(arrayBuffer) { + return window.btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); + } + static stringReplaceAsync(str, regex, replacer) { let match; let index = 0; -- cgit v1.2.3