docs(changes): consolidate and tighten changelog entries

- Merge related fix entries into single files (name-match-span-merge into character-name-split-and-scan-recovery, kanji-non-independent-noun-annotations + lexicalized-expression-frequency into content-adverb-annotation-stop-list, greedy-name-parsing-priority into character-name-split-and-scan-recovery, kiku-field-grouping-cancel-double-toast into kiku-field-grouping-modal-recovery, history-rofi-cover-art into launcher-history-command)
- Rewrite remaining entries for brevity and reclassify stats-trend-title-limits as "changed"
This commit is contained in:
2026-07-10 01:04:01 -07:00
parent 8712780d08
commit 846292809c
17 changed files with 18 additions and 47 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
type: added
area: mining
- Normalized generated card audio and mirrored mpv's cubic software-volume curve by default during media extraction, with a `-1 dBFS` limiter for amplified clips and live `ankiConnect.media.normalizeAudio` and `ankiConnect.media.mirrorMpvVolume` toggles to control both behaviors independently.
- Generated sentence audio is now normalized to `-23 LUFS` by default. Clips mined from playback also mirror mpv's cubic software-volume curve, with a `-1 dBFS` limiter for amplification. The live `ankiConnect.media.normalizeAudio` and `ankiConnect.media.mirrorMpvVolume` settings control each behavior independently.
@@ -1,6 +1,5 @@
type: fixed
area: overlay
- Fixed character-dictionary surname/given-name splitting for unspaced AniList native names where romanized reading length misled the boundary guess (東紫乃 split as 東紫+乃, 渡辺真奈美 as 渡辺真+奈美), so surnames like 東 and 渡辺 were never highlighted with character portraits and unmatched leading kanji (渡) lost hover lookup entirely. Name parts are now resolved with MeCab person-name POS tags and reading validation when MeCab is available; without MeCab, terms are generated for both plausible boundaries so the real surname still matches. Existing snapshots regenerate automatically (format version bump), and snapshots built without MeCab are upgraded to exact MeCab splits once MeCab is detected.
- Fixed subtitle tokenization dropping a character entirely when Yomitan's greedy scan consumed trailing punctuation/whitespace past the term (e.g. 平 in 「(東)平 (平)え?」 matched across the paren with no exact-source headword). The scanner now retries shorter windows so the prefix term still tokenizes with its name match and portrait.
- Fixed character-name highlights being stripped when MeCab's context-dependent POS tag put the token in the annotation noise filter (e.g. 平 tagged as prefix 接頭詞 in 「あっ 平 これ…」 lost its highlight and portrait even though hover lookup showed the character). Confirmed name matches now survive the POS exclusion filter, and name matching alone keeps the annotation stage active when all other annotations are disabled.
- Character dictionaries now split unspaced AniList native names with MeCab person-name tags and reading validation, while installations without MeCab index both plausible boundaries. Existing snapshots regenerate automatically and upgrade to exact MeCab splits when MeCab becomes available.
- Character-name portraits, highlights, and hover lookup now survive punctuation, unmatched text, context-dependent POS exclusions, and competing generic dictionary matches. Name matches take priority without splitting a strictly longer word such as 空気.
@@ -1,4 +1,5 @@
type: fixed
area: overlay
- Removed 確かに and やはり from the annotation stop-word list so they get frequency/JLPT highlighting again and count toward vocabulary stats; the list now only covers interjections, pronouns, and grammar fragments.
- Frequency/JLPT highlighting and vocabulary stats now include content adverbs such as 確かに and やはり, plus kanji-bearing nouns that MeCab tags as non-independent such as 日, 点, and 以外. The noise filters still suppress interjections, pronouns, grammar fragments, and kana grammar nouns.
- Lexicalized kana expressions such as `かといって` retain their frequency annotations when their merged MeCab parts include particles.
+1 -1
View File
@@ -1,4 +1,4 @@
type: fixed
area: stats
- Cover art is now fetched eagerly when a new series starts playing, instead of waiting for the first visit to its series detail page, so the stats timeline shows the best-guess AniList image right away. The stats covers endpoint also backfills missing series art in the background, so existing series without an image pick one up on the next stats page load.
- Stats now fetches the best-match AniList cover when a new series starts playing, so artwork appears in the timeline before anyone visits the series page. Existing series with missing art are backfilled on the next Stats page load.
-4
View File
@@ -1,4 +0,0 @@
type: fixed
area: overlay
- Fixed character names being swallowed by longer generic dictionary matches during subtitle tokenization (e.g. ヨータ in 美姫とヨータ was lost because とヨー normalizes to とよう and matched 渡洋), so the name never tokenized and got no highlight, portrait, or hover lookup. Character-dictionary matches now claim their spans in a greedy pre-pass before the left-to-right scan, and re-segmented name spans override the parse tokenization on merge. A name only claims its span when no strictly longer generic word starts at the same position, so a character named 空 no longer splits 空気 (ties still go to the name). The pre-pass runs only when a SubMiner character dictionary is enabled in the active Yomitan profile.
-4
View File
@@ -1,4 +0,0 @@
type: added
area: launcher
- Show cover art icons in the rofi watch-history picker, reusing AniList covers already stored in the stats database (extracted to `~/.cache/subminer/covers`).
@@ -1,4 +0,0 @@
type: fixed
area: overlay
- Kanji-bearing nouns that MeCab tags as non-independent (非自立) — e.g. 日 in いい日だったな, 点, 以外 — now keep frequency/JLPT highlighting and count toward vocabulary stats. Yomitan segments them as standalone vocabulary tokens, so the MeCab POS filter only suppresses kana grammar nouns (こと, もの, とき) it was meant for.
@@ -1,4 +0,0 @@
type: fixed
area: anki
- Fixed cancelling the Kiku field grouping dialog showing two "Field grouping cancelled" notifications when grouping was started via the trigger shortcut: the manual workflow already notifies about its outcome (cancelled, UI unavailable, failed), and the trigger path re-notified on top of it. The workflow now owns all outcome notifications, and a previously silent failure (the original card no longer loadable) gets its own message.
@@ -1,6 +1,5 @@
type: fixed
area: overlay
area: anki
- Fixed Kiku manual field grouping freezing the overlay after adding a duplicate card: the field grouping modal now reliably appears above fullscreen mpv on Hyprland/Wayland by re-asserting window placement until the compositor maps the modal window, instead of a single post-show attempt that raced the async map and left the dialog invisible.
- Fixed manual field grouping staying broken after the first attempt: the request resolver is now always cleared once a choice is made or the request is abandoned, so later grouping attempts no longer short-circuit to an instant "Field grouping cancelled".
- Fixed a timed-out or failed field grouping request leaving an orphaned, invisible modal window covering mpv: abandoned requests now tear down the modal window and close the dialog so the overlay recovers immediately.
- Kiku manual field grouping now keeps its dialog above fullscreen mpv on Hyprland/Wayland, remains usable across repeated attempts, and closes abandoned modal windows after timeouts or failures so the overlay recovers.
- Each grouping attempt now reports its outcome once, including a dedicated error when SubMiner can no longer load the original card.
+2 -4
View File
@@ -1,7 +1,5 @@
type: changed
area: overlay
- New reading-aware subtitle parsing and known-word matching: the known-word cache now stores each Anki card's word together with its reading (cache format v3), and a token only gets the known-word highlight when its parsed reading agrees with the card. The cache and the stats server upgrade automatically.
- Fixes words being highlighted green as known when a same-spelled Anki card taught a different reading (e.g. とこ parsed as 床 "bed" no longer matches a known 床/ゆか "floor" card). Cards without a reading field keep matching in any reading as before.
- Single-kana grammar tokens (よ in 全然いいよ, standalone え) no longer borrow the reading of an unrelated card (such as 夜 or 絵) and get painted as known: reading-only matching requires at least two kana, while single-kana cards still match by their word field.
- Kanji words no longer count as known just because a different mined kanji word shares their reading (渓谷/けいこく no longer matches a known 警告/けいこく card). Words mined in kana form still highlight their kanji spelling in subtitles, and kana subtitle text still matches cards mined in kanji form.
- Known-word highlighting now compares subtitle and Anki-card readings, preventing false matches between homographs such as 床/とこ and 床/ゆか, unrelated kanji words with the same reading, and single-kana grammar tokens that only share a card's reading.
- Cards without readings retain word-only matching, and matching still works across kana and kanji spellings. The cache refreshes from v2 to v3 automatically, and Stats reads the new format without migration.
+1 -1
View File
@@ -1,4 +1,4 @@
type: added
area: launcher
- Added `subminer -H` / `--history` to browse local watch history, replay the last watched episode, continue to the next episode, or browse episodes with fzf/rofi.
- Added `subminer -H` / `--history` to browse local watch history, replay the last watched episode, continue to the next episode, or pick an episode with fzf or rofi. The rofi picker shows cover art from AniList images already stored in the stats database.
@@ -1,4 +0,0 @@
type: fixed
area: overlay
- Fixed lexicalized kana expressions such as `かといって` losing frequency annotations when their merged MeCab parts included particles.
-4
View File
@@ -1,4 +0,0 @@
type: fixed
area: overlay
- Fixed character-name annotations dropping for an entire subtitle line when it contained any chunk the dictionary scanner could not match (e.g. an interjection like やほっ before a name): scanner metadata is now merged per token into the parseText segmentation instead of being discarded on any span mismatch.
+1 -1
View File
@@ -1,4 +1,4 @@
type: fixed
area: overlay
- Fixed secondary subtitles stacking dozens of one-syllable lines down the screen during karaoke-typeset openings/endings, which made the hover-pause band cover the whole video: karaoke-like event spam is now collapsed into a single deduped line, and the secondary subtitle area is height-capped so it always stays a strip at the top.
- Karaoke-style secondary subtitles no longer stack dozens of one-syllable lines down the screen during openings and endings. Repeated events collapse into one deduplicated line, and the secondary subtitle area remains capped to a strip at the top.
+2 -2
View File
@@ -1,4 +1,4 @@
type: fixed
type: changed
area: stats
- Show all trend chart titles by default, persist hidden-title choices, and add a per-chart top-title limit selector.
- Overhauled Stats trend charts with persisted title visibility, per-chart title limits, `top` and `most recent` ranking modes, an option to show or hide empty days, calendar-aligned periods, and value-sorted multi-column tooltips.
+2 -4
View File
@@ -1,7 +1,5 @@
type: internal
area: testing
- Test lanes are now defined once in `scripts/test-lanes.ts` and discovered by directory instead of hand-maintained file lists in `package.json`; the unused `test:core:*`/`test:config:dist`/`test:full` scripts were removed.
- `scripts/run-test-lane.mjs` runs each test file in an isolated `bun test` process with a wall timeout, so a hanging test or leaked global can no longer cascade failures across the lane.
- Previously orphaned suites now run in CI: the stats dashboard tests (`bun run test:stats`), the `scripts/**` tests (`bun run test:scripts`, including the change-verification skill tests), the `test-plugin-process-start-retries.lua` plugin test, and the runtime-compat dist slice (now part of `bun run test:fast`).
- The change-verification skill gained a `stats` lane for `stats/` edits.
- Test lanes now live in `scripts/test-lanes.ts`, discover tests by directory, and run each Bun test file in an isolated process with a wall timeout.
- CI now covers the previously orphaned stats, scripts, plugin process-retry, and runtime-compat suites. The SubMiner change-verification workflow also gained a stats lane.
+1 -1
View File
@@ -1,4 +1,4 @@
type: fixed
area: overlay
- Fixed subtitle text that Yomitan's parser cannot match (truncated inflections like the volitional in とこ戻ろ…, elongation runs like ぅ~/ぉ〜) being rendered as plain, non-interactive text with no hover lookup. Unparsed runs are now kept as hoverable tokens matching Yomitan's own segmentation, while being fully ignored by frequency/JLPT highlighting, the N+1 candidate math, and vocabulary stats. Bracketed SFX/speaker captions and punctuation-only runs are still skipped.
- Subtitle text that Yomitan cannot parse, including truncated inflections such as とこ戻ろ… and elongation runs such as ぅ~ or ぉ〜, now remains hoverable using Yomitan's segmentation. These runs are excluded from frequency/JLPT highlighting, N+1 candidate math, and vocabulary stats; bracketed captions and punctuation-only runs remain skipped.