aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/js/audio-downloader.js23
-rw-r--r--ext/mixed/js/audio-system.js29
2 files changed, 33 insertions, 19 deletions
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) {