diff options
| author | Stefan Vuković <stefanvukovic44@gmail.com> | 2024-07-01 11:51:10 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-01 09:51:10 +0000 | 
| commit | 9261a70a564034badf2c2b8c6859c46b295adb3d (patch) | |
| tree | 1517f37d5d368db2104fa0b5d38677cb65705803 /ext | |
| parent | f243608010746b8268f8658b40bd38bc4e337a98 (diff) | |
make non-ja audio work without configuration (#1152)
* add audio source for wiktionary format filenames on commons
* allow region codes
* fix files being saved in anki as mp3
* wip
* refactor _getAvailableAudioSourceTypes
* update docs
* wording
* single line list
* fix no anki audio
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/data/schemas/options-schema.json | 8 | ||||
| -rw-r--r-- | ext/js/display/display-audio.js | 30 | ||||
| -rw-r--r-- | ext/js/media/audio-downloader.js | 28 | ||||
| -rw-r--r-- | ext/js/pages/settings/audio-controller.js | 34 | 
4 files changed, 75 insertions, 25 deletions
diff --git a/ext/data/schemas/options-schema.json b/ext/data/schemas/options-schema.json index 4bd7625a..2fb1c9c3 100644 --- a/ext/data/schemas/options-schema.json +++ b/ext/data/schemas/options-schema.json @@ -419,13 +419,7 @@                                                  }                                              }                                          }, -                                        "default": [ -                                            { -                                                "type": "jpod101", -                                                "url": "", -                                                "voice": "" -                                            } -                                        ] +                                        "default": []                                      }                                  }                              }, diff --git a/ext/js/display/display-audio.js b/ext/js/display/display-audio.js index bb30c944..4fcabf06 100644 --- a/ext/js/display/display-audio.js +++ b/ext/js/display/display-audio.js @@ -166,16 +166,15 @@ export class DisplayAudio {       * @param {import('display').EventArgument<'optionsUpdated'>} details       */      _onOptionsUpdated({options}) { -        const {enabled, autoPlay, volume, sources} = options.audio; +        const { +            general: {language}, +            audio: {enabled, autoPlay, volume, sources}, +        } = options;          this._autoPlay = enabled && autoPlay;          this._playbackVolume = Number.isFinite(volume) ? Math.max(0, Math.min(1, volume / 100)) : 1;          /** @type {Set<import('settings').AudioSourceType>} */ -        const requiredAudioSources = new Set([ -            'jpod101', -            'jpod101-alternate', -            'jisho', -        ]); +        const requiredAudioSources = this._getRequiredAudioSources(language);          /** @type {Map<string, import('display-audio').AudioSource[]>} */          const nameMap = new Map();          this._audioSources.length = 0; @@ -188,11 +187,28 @@ export class DisplayAudio {          }          const data = document.documentElement.dataset; -        data.audioEnabled = `${enabled && sources.length > 0}`; +        data.audioEnabled = enabled.toString();          this._cache.clear();      } +    /** +     * @param {string} language +     * @returns {Set<import('settings').AudioSourceType>} +     */ +    _getRequiredAudioSources(language) { +        return language === 'ja' ? +            new Set([ +                'jpod101', +                'jpod101-alternate', +                'jisho', +            ]) : +            new Set([ +                'lingua-libre', +                'wiktionary', +            ]); +    } +      /** */      _onContentClear() {          this._entriesToken = {}; diff --git a/ext/js/media/audio-downloader.js b/ext/js/media/audio-downloader.js index 99ca1dfd..17911c3e 100644 --- a/ext/js/media/audio-downloader.js +++ b/ext/js/media/audio-downloader.js @@ -90,7 +90,8 @@ export class AudioDownloader {       */      async downloadTermAudio(sources, preferredAudioIndex, term, reading, idleTimeout, languageSummary) {          const errors = []; -        for (const source of sources) { +        const requiredAudioSources = this._getRequiredAudioSources(languageSummary.iso, sources); +        for (const source of [...sources, ...requiredAudioSources]) {              let infoList = await this.getTermAudioInfoList(source, term, reading, languageSummary);              if (typeof preferredAudioIndex === 'number') {                  infoList = (preferredAudioIndex >= 0 && preferredAudioIndex < infoList.length ? [infoList[preferredAudioIndex]] : []); @@ -116,6 +117,31 @@ export class AudioDownloader {      // Private      /** +     * @param {string} language +     * @param {import('audio').AudioSourceInfo[]} sources +     * @returns {import('audio').AudioSourceInfo[]} +     */ +    _getRequiredAudioSources(language, sources) { +        /** @type {Set<import('settings').AudioSourceType>} */ +        const requiredSources = language === 'ja' ? +            new Set([ +                'jpod101', +                'jpod101-alternate', +                'jisho', +            ]) : +            new Set([ +                'lingua-libre', +                'wiktionary', +            ]); + +        for (const {type} of sources) { +            requiredSources.delete(type); +        } + +        return [...requiredSources].map((type) => ({type, url: '', voice: ''})); +    } + +    /**       * @param {string} url       * @param {string} base       * @returns {string} diff --git a/ext/js/pages/settings/audio-controller.js b/ext/js/pages/settings/audio-controller.js index b89ae2ba..defef16e 100644 --- a/ext/js/pages/settings/audio-controller.js +++ b/ext/js/pages/settings/audio-controller.js @@ -47,6 +47,8 @@ export class AudioController extends EventDispatcher {          this._voiceTestTextInput = querySelectorNotNull(document, '#text-to-speech-voice-test-text');          /** @type {import('audio-controller').VoiceInfo[]} */          this._voices = []; +        /** @type {string} */ +        this._language = 'ja';      }      /** @type {import('./settings-controller.js').SettingsController} */ @@ -121,12 +123,18 @@ export class AudioController extends EventDispatcher {       * @param {import('settings-controller').EventArgument<'optionsChanged'>} details       */      _onOptionsChanged({options}) { +        const { +            general: {language}, +            audio: {sources}, +        } = options; + +        this._language = language; +          for (const entry of this._audioSourceEntries) {              entry.cleanup();          }          this._audioSourceEntries = []; -        const {sources} = options.audio;          for (let i = 0, ii = sources.length; i < ii; ++i) {              this._createAudioSourceEntry(i, sources[i]);          } @@ -216,15 +224,7 @@ export class AudioController extends EventDispatcher {       * @returns {import('settings').AudioSourceType}       */      _getUnusedAudioSourceType() { -        /** @type {import('settings').AudioSourceType[]} */ -        const typesAvailable = [ -            'jpod101', -            'jpod101-alternate', -            'jisho', -            'lingua-libre', -            'wiktionary', -            'custom', -        ]; +        const typesAvailable = this._getAvailableAudioSourceTypes();          for (const type of typesAvailable) {              if (!this._audioSourceEntries.some((entry) => entry.type === type)) {                  return type; @@ -233,6 +233,20 @@ export class AudioController extends EventDispatcher {          return typesAvailable[0];      } +    /** +     * @returns {import('settings').AudioSourceType[]} +     */ +    _getAvailableAudioSourceTypes() { +        /** @type {import('settings').AudioSourceType[]} */ +        const generalAudioSources = ['lingua-libre', 'wiktionary', 'text-to-speech', 'custom']; +        if (this._language === 'ja') { +            /** @type {import('settings').AudioSourceType[]} */ +            const japaneseAudioSources = ['jpod101', 'jpod101-alternate', 'jisho']; +            return [...japaneseAudioSources, ...generalAudioSources]; +        } +        return generalAudioSources; +    } +      /** */      async _addAudioSource() {          const type = this._getUnusedAudioSourceType();  |