From 310303ca1a123a77f9bd116af4dc64ad9c3256c5 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 20 Aug 2022 11:17:24 -0400 Subject: Audio download timeout (#2187) * Add support for an idle timeout when downloading audio * Update eslint rules * Pass idleTimeout to the downloader from DisplayAnki * Add anki.downloadTimeout setting * Update tests * Assign _audioDownloadIdleTimeout using settings * Show info about cancelled downloads * Handle Firefox bug * Improve audio errors * Refactor * Move functions to RequestBuilder --- ext/js/display/display-anki.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'ext/js/display') diff --git a/ext/js/display/display-anki.js b/ext/js/display/display-anki.js index 12133ad0..e2101481 100644 --- a/ext/js/display/display-anki.js +++ b/ext/js/display/display-anki.js @@ -48,6 +48,7 @@ class DisplayAnki { this._screenshotQuality = 100; this._scanLength = 10; this._noteGuiMode = 'browse'; + this._audioDownloadIdleTimeout = null; this._noteTags = []; this._modeOptions = new Map(); this._dictionaryEntryTypeModeMap = new Map([ @@ -133,7 +134,19 @@ class DisplayAnki { _onOptionsUpdated({options}) { const { general: {resultOutputMode, glossaryLayoutMode, compactTags}, - anki: {tags, duplicateScope, duplicateScopeCheckAllModels, suspendNewCards, checkForDuplicates, displayTags, kanji, terms, noteGuiMode, screenshot: {format, quality}}, + anki: { + tags, + duplicateScope, + duplicateScopeCheckAllModels, + suspendNewCards, + checkForDuplicates, + displayTags, + kanji, + terms, + noteGuiMode, + screenshot: {format, quality}, + downloadTimeout + }, scanning: {length: scanLength} } = options; @@ -150,6 +163,7 @@ class DisplayAnki { this._scanLength = scanLength; this._noteGuiMode = noteGuiMode; this._noteTags = [...tags]; + this._audioDownloadIdleTimeout = (Number.isFinite(downloadTimeout) && downloadTimeout > 0 ? downloadTimeout : null); this._modeOptions.clear(); this._modeOptions.set('kanji', kanji); this._modeOptions.set('term-kanji', terms); @@ -536,7 +550,7 @@ class DisplayAnki { const fields = Object.entries(modeOptions.fields); const contentOrigin = this._display.getContentOrigin(); const details = this._ankiNoteBuilder.getDictionaryEntryDetailsForNote(dictionaryEntry); - const audioDetails = (details.type === 'term' ? this._displayAudio.getAnkiNoteMediaAudioDetails(details.term, details.reading) : null); + const audioDetails = this._getAnkiNoteMediaAudioDetails(details); const optionsContext = this._display.getOptionsContext(); const {note, errors, requirements: outputRequirements} = await this._ankiNoteBuilder.createNote({ @@ -586,6 +600,12 @@ class DisplayAnki { return {text, offset}; } + _getAnkiNoteMediaAudioDetails(details) { + if (details.type !== 'term') { return null; } + const {sources, preferredAudioIndex} = this._displayAudio.getAnkiNoteMediaAudioDetails(details.term, details.reading); + return {sources, preferredAudioIndex, idleTimeout: this._audioDownloadIdleTimeout}; + } + // View note functions _onViewNoteButtonClick(e) { -- cgit v1.2.3