Update audio validity checks to be based on the source (#1290)

This commit is contained in:
toasted-nutbread 2021-01-22 21:09:43 -05:00 committed by GitHub
parent 55df9dc7cd
commit a51a591c40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 19 deletions

View File

@ -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;
}

View File

@ -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) {