diff --git a/ext/bg/js/audio-downloader.js b/ext/bg/js/audio-downloader.js index 171f5944..495b6399 100644 --- a/ext/bg/js/audio-downloader.js +++ b/ext/bg/js/audio-downloader.js @@ -53,7 +53,7 @@ class AudioDownloader { switch (info.type) { case 'url': try { - return await this._downloadAudioFromUrl(info.url); + return await this._downloadAudioFromUrl(info.url, source); } catch (e) { // NOP } @@ -192,7 +192,7 @@ class AudioDownloader { return [{type: 'url', url}]; } - async _downloadAudioFromUrl(url) { + async _downloadAudioFromUrl(url, source) { const response = await this._requestBuilder.fetchAnonymous(url, { method: 'GET', mode: 'cors', @@ -208,18 +208,25 @@ class AudioDownloader { const arrayBuffer = await response.arrayBuffer(); - if (!await this._isAudioBinaryValid(arrayBuffer)) { + if (!await this._isAudioBinaryValid(arrayBuffer, source)) { throw new Error('Could not retrieve audio'); } return this._arrayBufferToBase64(arrayBuffer); } - async _isAudioBinaryValid(arrayBuffer) { - const digest = await this._arrayBufferDigest(arrayBuffer); - switch (digest) { - case 'ae6398b5a27bc8c0a771df6c907ade794be15518174773c58c7c7ddd17098906': // jpod101 invalid audio - return false; + async _isAudioBinaryValid(arrayBuffer, source) { + switch (source) { + case 'jpod101': + { + const digest = await this._arrayBufferDigest(arrayBuffer); + switch (digest) { + case 'ae6398b5a27bc8c0a771df6c907ade794be15518174773c58c7c7ddd17098906': // Invalid audio + return false; + default: + return true; + } + } default: return true; } diff --git a/ext/mixed/js/audio-system.js b/ext/mixed/js/audio-system.js index 584da2b1..ab6011d0 100644 --- a/ext/mixed/js/audio-system.js +++ b/ext/mixed/js/audio-system.js @@ -51,7 +51,7 @@ class AudioSystem { const info = infoList[j]; let audio; try { - audio = await this.createAudioFromInfo(info); + audio = await this.createAudioFromInfo(info, source); } catch (e) { continue; } @@ -72,11 +72,11 @@ class AudioSystem { return this._fallbackAudio; } - createAudio(url) { + createAudio(url, source) { return new Promise((resolve, reject) => { const audio = new Audio(url); audio.addEventListener('loadeddata', () => { - if (!this._isAudioValid(audio)) { + if (!this._isAudioValid(audio, source)) { reject(new Error('Could not retrieve audio')); } else { resolve(audio); @@ -94,10 +94,10 @@ class AudioSystem { return new TextToSpeechAudio(text, voice); } - async createAudioFromInfo(info) { + async createAudioFromInfo(info, source) { switch (info.type) { case 'url': - return await this.createAudio(info.url); + return await this.createAudio(info.url, source); case 'tts': return this.createTextToSpeechAudio(info.text, info.voice); default: @@ -107,12 +107,19 @@ class AudioSystem { // Private - _isAudioValid(audio) { - const duration = audio.duration; - return ( - duration !== 5.694694 && // jpod101 invalid audio (Chrome) - duration !== 5.720718 // jpod101 invalid audio (Firefox) - ); + _isAudioValid(audio, source) { + switch (source) { + case 'jpod101': + { + const duration = audio.duration; + return ( + duration !== 5.694694 && // Invalid audio (Chrome) + duration !== 5.720718 // Invalid audio (Firefox) + ); + } + default: + return true; + } } _getTextToSpeechVoiceFromVoiceUri(voiceUri) {