v2.4.1
New features
- Audio quality and format control (#18): Settings, Media now exposes audio codec (MP3 or Opus) and bitrate (32 to 320 kbps). Defaults to MP3 at 192 kbps; opt in to Opus for roughly half the file size at comparable speech quality (useful for the AnkiWeb media quota).
- Multi-dictionary export (#17): new optional Glossary Anki field receives every enabled offline dictionary's hit as Yomitan-format HTML (Senren toggle-UI compatible). MainDefinition keeps first-hit-wins. Jisho is fallback-only. Opt in via Settings, Anki Settings, Glossary Field.
- Bold target word in subtitle sentence (#20): the mined morpheme is wrapped in
<b>…</b>in Sentence and SentenceFurigana fields. Uses the exact MeCab span, so duplicate surfaces in one sentence only bold the mined token. Opt in via Settings, Word Filtering. - Match animated screenshot duration to audio (#13 follow-up): new Media Settings toggle clips animated screenshots to the full audio range instead of the fixed cap. Only active when animated screenshots are enabled.
- Contributing improved: SECURITY.md, PR template, CODEOWNERS, dependabot config, YAML issue forms (bugs/feature ideas) instead of MD, TESTING.md, RELEASING.md.
Changes
- Verbs and adjectives now mine as the dictionary form / lemma (#19).
胸のとこ破れそうnow creates破れる, not破れ. Nouns continue to mine as the surface form (preserves the #5 fix for unidic-lite homograph quirks like豪腕mapping to剛腕). Legacy surface-form cards in user collections are not migrated; re-mining a previously surface-mined verb will create a second card until you reconcile. - AnkiConnect existing-vocabulary lookup is now cached per session. Mining is noticeably faster on episodes with many candidate words. Undo and re-mine invalidate the cache so state stays fresh.
- CONTRIBUTING.md rewritten around workflow (branches, conventional commits, changelog, pre-commit) with cross-links to TESTING / SECURITY / CODE_OF_CONDUCT.
- Black and ruff
line-lengthraised from 100 to 120 inpyproject.toml; codebase reformatted. No behavior changes.
Fixes
- AnkiConnect "duplicate" error no longer aborts batch card creation: the shared cached vocabulary set drops duplicates client-side before the batch endpoint sees them.
- Glossary field label: corrected a helper-text typo on the Glossary field input.
Removed
- Dead-code sweep:
FolderProcessorand same-folder pairing, unusedHistoryServicequery methods,StatsService.get_series_stats/get_series_progress, the orphanqueue_changedsignal, ~20 unused widget setters/properties, single-cardAnkiService.create_card(batch is canonical), servicelookup_batchtest-only methods,DictionaryRegistry.list_dicts,WordListService.get_blacklist/get_whitelist,WordFilterService.filter_by_length, orphanconfig_exists/delete_config/reset_cancellation, the never-raisedNoJapaneseSubsError, and the obsoleteuse_offline_dictconfig field (legacy values silently stripped on load).
Upgrade notes
- Existing surface-form verb cards are not migrated by #19. Re-mining will create a second card with the lemma; reconcile manually if it matters.
- Opus audio requires ffmpeg built with
libopus. The extractor probes once per session and hard-fails with a clear error if the encoder is missing. 5.1 input is downmixed to stereo for Opus only.
Full Changelog: v2.4.0...v2.4.1