chore(release): prepare v0.18.0

This commit is contained in:
2026-07-10 02:03:10 -07:00
parent cab7975a2b
commit beeab564b4
20 changed files with 161 additions and 74 deletions
+31
View File
@@ -1,5 +1,36 @@
# Changelog
## v0.18.0 (2026-07-10)
### Added
- Sentence Audio Normalization: Generated sentence audio is now normalized to -23 LUFS by default, and clips mined from playback mirror mpv's software volume curve with a limiter to prevent clipping. Both behaviors are configurable independently.
- Watch History Command: Added `subminer -H` / `--history` to browse watch history, replay or continue episodes, or pick one via fzf or rofi, with cover art shown in the rofi picker.
### Changed
- Fzf Preview Layout: Moved fzf previews below launcher menus, giving long titles and metadata more room.
- Known-Word Highlighting: Now compares subtitle and Anki-card readings, preventing false matches between homographs and unrelated words that share a reading, while still supporting matching across kana and kanji spellings.
- Annotation Filtering: Standalone suffix tokens (e.g. さん, れる) are now excluded from JLPT/frequency/N+1 highlighting by default, matching how particles and interjections are treated; configurable via the pos2 exclusion setting.
- App Icon: Replaced the app icon with new pixel-art submarine artwork contributed by the community, used across the app icon, tray, notifications, README, docs site, and Stats page.
- Stats Trend Charts: Overhauled 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 tooltips.
### Fixed
- Background Stats Server: `subminer app` background launches now auto-start the stats server when enabled, and skip startup if one is already running.
- Character Name Highlighting: Character dictionaries now split unspaced native names more reliably, and portraits, highlights, and hover lookup survive punctuation, unmatched text, and competing dictionary matches without incorrectly splitting longer words.
- Highlighting Coverage: Frequency/JLPT highlighting and vocabulary stats now include content adverbs (e.g. 確かに, やはり) and kanji nouns MeCab tags as non-independent (e.g. 日, 点, 以外), while still suppressing interjections, pronouns, and grammar fragments; lexicalized kana expressions like かといって keep their annotations.
- Cover Art Fetching: Stats now fetches AniList cover art as soon as a new series starts playing, and backfills missing art for existing series on the next Stats visit.
- Kiku Field Grouping: The manual field-grouping dialog now stays above fullscreen mpv, remains usable across repeated attempts, closes abandoned windows after timeouts, and reports a clear error when the original card can no longer be loaded.
- Karaoke Subtitle Collapse: Secondary subtitles no longer stack dozens of one-syllable lines during openings and endings; repeated events collapse into one line, capped to a strip at the top.
- Unparsed Token Hover: Subtitle text Yomitan can't parse (truncated inflections, elongation runs) remains hoverable, while staying excluded from highlighting, N+1 candidate math, and vocabulary stats.
- YouTube Streaming: Fixed direct YouTube stream extraction that could corrupt signed URLs and cause ffmpeg 403 errors.
<details>
<summary>Internal changes</summary>
### Internal
- Test lanes moved to `scripts/test-lanes.ts` with per-directory discovery and isolated per-file timeouts; CI now covers previously orphaned stats, scripts, plugin process-retry, and runtime-compat suites, plus a new stats lane in the change-verification workflow.
</details>
## v0.17.2 (2026-06-28)
### Fixed
-4
View File
@@ -1,4 +0,0 @@
type: added
area: mining
- 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.
-4
View File
@@ -1,4 +0,0 @@
type: fixed
area: stats
- `subminer app` background launches now start the stats server automatically when `stats.autoStartServer` is enabled, and skip startup when a background stats server is already running.
@@ -1,5 +0,0 @@
type: fixed
area: overlay
- 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,5 +0,0 @@
type: fixed
area: overlay
- 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.
-4
View File
@@ -1,4 +0,0 @@
type: fixed
area: stats
- 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: changed
area: launcher
- Moved fzf previews below launcher menus so long titles and metadata have more horizontal room.
@@ -1,5 +0,0 @@
type: fixed
area: anki
- 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.
@@ -1,5 +0,0 @@
type: changed
area: overlay
- 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.
-4
View File
@@ -1,4 +0,0 @@
type: added
area: launcher
- 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.
-4
View File
@@ -1,4 +0,0 @@
type: changed
area: overlay
- Standalone suffix tokens (MeCab pos2 接尾, e.g. さん, れる) are now excluded from JLPT/frequency/N+1 annotations by default, matching how particles and interjections are treated. Cache-backed known-word highlighting still applies; override via the pos2 exclusion config if you want them annotated.
-4
View File
@@ -1,4 +0,0 @@
type: changed
area: branding
- Replaced the SubMiner app icon with new pixel-art submarine artwork contributed by an anonymous community member, used across the app icon, tray, notifications, README, docs site, and stats page.
@@ -1,4 +0,0 @@
type: fixed
area: overlay
- 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.
-4
View File
@@ -1,4 +0,0 @@
type: changed
area: stats
- 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.
-5
View File
@@ -1,5 +0,0 @@
type: internal
area: testing
- 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.
-4
View File
@@ -1,4 +0,0 @@
type: fixed
area: overlay
- 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.
-4
View File
@@ -1,4 +0,0 @@
type: fixed
area: youtube
- Fixed direct YouTube stream media extraction by parsing mpv EDL stream URLs with their byte-length guards, preventing trailing EDL segment options from corrupting signed googlevideo URLs and causing ffmpeg 403 errors.
+40 -4
View File
@@ -1,12 +1,48 @@
# Changelog
## v0.17.2 (2026-06-28)
## v0.18.0 (2026-07-10)
**Added**
- Sentence Audio Normalization: Generated sentence audio is now normalized to -23 LUFS by default, and clips mined from playback mirror mpv's software volume curve with a limiter to prevent clipping. Both behaviors are configurable independently.
- Watch History Command: Added `subminer -H` / `--history` to browse watch history, replay or continue episodes, or pick one via fzf or rofi, with cover art shown in the rofi picker.
**Changed**
- Fzf Preview Layout: Moved fzf previews below launcher menus, giving long titles and metadata more room.
- Known-Word Highlighting: Now compares subtitle and Anki-card readings, preventing false matches between homographs and unrelated words that share a reading, while still supporting matching across kana and kanji spellings.
- Annotation Filtering: Standalone suffix tokens (e.g. さん, れる) are now excluded from JLPT/frequency/N+1 highlighting by default, matching how particles and interjections are treated; configurable via the pos2 exclusion setting.
- App Icon: Replaced the app icon with new pixel-art submarine artwork contributed by the community, used across the app icon, tray, notifications, README, docs site, and Stats page.
- Stats Trend Charts: Overhauled 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 tooltips.
**Fixed**
- Background Stats Server: `subminer app` background launches now auto-start the stats server when enabled, and skip startup if one is already running.
- Character Name Highlighting: Character dictionaries now split unspaced native names more reliably, and portraits, highlights, and hover lookup survive punctuation, unmatched text, and competing dictionary matches without incorrectly splitting longer words.
- Highlighting Coverage: Frequency/JLPT highlighting and vocabulary stats now include content adverbs (e.g. 確かに, やはり) and kanji nouns MeCab tags as non-independent (e.g. 日, 点, 以外), while still suppressing interjections, pronouns, and grammar fragments; lexicalized kana expressions like かといって keep their annotations.
- Cover Art Fetching: Stats now fetches AniList cover art as soon as a new series starts playing, and backfills missing art for existing series on the next Stats visit.
- Kiku Field Grouping: The manual field-grouping dialog now stays above fullscreen mpv, remains usable across repeated attempts, closes abandoned windows after timeouts, and reports a clear error when the original card can no longer be loaded.
- Karaoke Subtitle Collapse: Secondary subtitles no longer stack dozens of one-syllable lines during openings and endings; repeated events collapse into one line, capped to a strip at the top.
- Unparsed Token Hover: Subtitle text Yomitan can't parse (truncated inflections, elongation runs) remains hoverable, while staying excluded from highlighting, N+1 candidate math, and vocabulary stats.
- YouTube Streaming: Fixed direct YouTube stream extraction that could corrupt signed URLs and cause ffmpeg 403 errors.
<details>
<summary>Internal changes</summary>
**Internal**
- Test lanes moved to `scripts/test-lanes.ts` with per-directory discovery and isolated per-file timeouts; CI now covers previously orphaned stats, scripts, plugin process-retry, and runtime-compat suites, plus a new stats lane in the change-verification workflow.
</details>
## Previous Versions
<details>
<summary>v0.17.x</summary>
<h2>v0.17.2 (2026-06-28)</h2>
**Fixed**
- YouTube Background Cache: Fixed Windows YouTube background media cache startup for YouTube URLs opened directly in mpv, including resolved stream URLs when mpv still exposes the original YouTube playlist entry, so queued Anki media updates can append audio and images after the cache finishes.
- YouTube Subtitle Picker: Manual subtitle picker requests now show an immediate configured notification while SubMiner probes tracks and opens the modal. Subtitle download progress is replaced with a transient success notification after tracks load.
## v0.17.1 (2026-06-27)
<h2>v0.17.1 (2026-06-27)</h2>
**Added**
- YouTube Media Cache Mode: Adds `youtube.mediaCache.mode` with `direct` and `background` options. Background mode uses a yt-dlp cache download when direct stream extraction is unreliable — creates a text-only card immediately, queues media updates for mined notes, and fills audio/image fields once the download finishes. Progress is announced via overlay/OSD notifications. Downloads are capped at 720p by default (`youtube.mediaCache.maxHeight`). Switching back to direct mode cancels any in-flight background download.
@@ -15,7 +51,7 @@
- Log Export: Fixed log filenames to use the local date so exports around UTC midnight include the current day's logs rather than stale prior-day files. Expanded export redaction to mask IPs, emails, auth and cookie headers, yt-dlp cookie arguments, URL credentials, token/key/password fields, and signed YouTube media URL parameters.
- YouTube Card Media: Improved media generation reliability by sending safer ffmpeg options for resolved streams and skipping stale stream maps (including cached YouTube files). Hardened background cache downloads with IPv4 and extractor retry flags; failed downloads now notify the user and clear queued media updates instead of leaving them silently pending. Stale background cache files are cleaned on startup and before each new download.
## v0.17.0 (2026-06-15)
<h2>v0.17.0 (2026-06-15)</h2>
**Changed**
@@ -50,7 +86,7 @@
</details>
## Previous Versions
</details>
<details>
<summary>v0.16.x</summary>
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "subminer",
"productName": "SubMiner",
"desktopName": "SubMiner.desktop",
"version": "0.18.0-beta.4",
"version": "0.18.0",
"description": "All-in-one sentence mining overlay with AnkiConnect and dictionary integration",
"packageManager": "bun@1.3.5",
"main": "dist/main-entry.js",
+89
View File
@@ -0,0 +1,89 @@
## Highlights
### Added
- **Sentence Audio Normalization**
- Generated sentence audio is now normalized to -23 LUFS by default, giving mined clips consistent volume across shows.
- Clips captured from playback can also mirror mpv's software volume curve, with a limiter to prevent clipping when boosted.
- Both behaviors are controlled independently and can be turned off in the Anki Connect media settings.
- **Watch History Browser**
- Added `subminer -H` / `--history` to browse local watch history, replay the last episode, continue to the next one, or jump to any past episode.
- Works with fzf or rofi; the rofi picker shows AniList cover art already stored in the stats database.
### Changed
- **Known-Word Highlighting Accuracy**
- Highlighting now compares subtitle and Anki-card readings, so it no longer confuses homographs like 床/とこ vs 床/ゆか or unrelated kanji that happen to share a reading.
- Standalone suffix words such as さん or れる are now excluded from JLPT/frequency/N+1 annotations by default, matching how particles and interjections are already treated (configurable if you'd rather keep them annotated).
- Cards without readings still fall back to word-only matching; the highlighting cache upgrades automatically with no action needed.
- **Stats Trend Charts**
- Overhauled 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 sortable multi-column tooltips.
- **New App Icon**
- Replaced the SubMiner icon with new pixel-art submarine artwork contributed by an anonymous community member, now used across the app icon, tray, notifications, README, docs site, and stats page.
- **Launcher Preview Layout**
- fzf previews now sit below the launcher menu instead of beside it, giving long titles and metadata more horizontal room.
### Fixed
- **Character Name Recognition**
- Character dictionaries now correctly split unspaced AniList native names and validate readings, so overlay portraits, highlights, and hover lookups work reliably even without MeCab installed.
- Name matches survive punctuation and unmatched text and no longer get overridden by generic dictionary matches or wrongly split from longer words like 空気.
- Existing installs regenerate automatically and upgrade to exact splits once MeCab is available — no action needed.
- **Frequency & JLPT Highlighting Coverage**
- Content adverbs (確かに, やはり) and kanji nouns MeCab tags as non-independent (日, 点, 以外) are now correctly included in frequency/JLPT highlighting and vocabulary stats.
- Lexicalized kana expressions like かといって keep their frequency annotations, while interjections, pronouns, and pure grammar fragments are still filtered out as noise.
- **Unparsed Text Hover Lookup**
- Subtitle text Yomitan can't fully parse — truncated inflections like とこ戻ろ… or elongation runs like ぅ~ — is hoverable again for dictionary lookup.
- These runs stay excluded from frequency/JLPT highlighting and vocabulary stats, same as bracketed captions and punctuation-only text.
- **Karaoke-Style Secondary Subtitles**
- Secondary subtitles no longer flood the screen with dozens of one-syllable lines during karaoke-style openings and endings.
- Repeated events now collapse into a single line, and the secondary subtitle area stays capped to a strip at the top.
- **Kiku Field Grouping Reliability**
- The manual field-grouping dialog now stays above fullscreen mpv on Hyprland/Wayland and keeps working across repeated attempts.
- Abandoned grouping windows close automatically after a timeout or failure, and each attempt now reports a clear success or error, including when the original card can no longer be loaded.
- **Background Stats Server Startup**
- Background `subminer app` launches now start the stats server automatically when enabled, and skip startup if one is already running.
- **AniList Cover Art Timing**
- Stats now fetches the best-match AniList cover as soon as a new series starts playing, so artwork appears in the timeline immediately instead of only after visiting the series page.
- Existing series missing art get backfilled automatically on the next Stats page visit.
- **YouTube Direct Stream Playback**
- Fixed direct YouTube stream extraction so mpv's EDL stream URLs are parsed correctly, preventing corrupted signed video URLs and the resulting ffmpeg 403 errors.
## What's Changed
- fix(youtube): parse mpv EDL stream URLs with byte-length guards by @ksyasuda in #134
- Normalize generated Anki audio by default by @ksyasuda in #135
- feat(launcher): add -H/--history command to browse local watch history by @ksyasuda in #136
- fix(overlay): prevent field grouping modal from freezing overlay on Hyprland by @ksyasuda in #138
- fix(overlay): collapse karaoke syllable spam in secondary subtitles by @ksyasuda in #139
- feat(stats): Trends dashboard overhaul — title visibility, ranking modes, calendar-accurate windows, tooltips by @ksyasuda in #140
- feat(branding): replace app icon with contributed pixel-art set by @ksyasuda in #141
- feat(anki): reading-aware known-word matching (cache v3) by @ksyasuda in #142
- fix(stats): start stats server on background app launch by @ksyasuda in #144
- fix(tokenizer): keep unparsed Yomitan tokens hoverable by @ksyasuda in #145
- fix(overlay): resolve unspaced Japanese name splits and scan recovery by @ksyasuda in #146
- fix(tokenizer): prevent grammar tokens from borrowing known-word highlight via unrelated readings by @ksyasuda in #147
- fix(stats): fetch cover art eagerly at session start instead of on series page visit by @ksyasuda in #148
## Installation
See the README and docs/installation guide for full setup steps.
## Assets
- Linux: `SubMiner.AppImage`
- macOS: `SubMiner-*.dmg` and `SubMiner-*.zip`
- Windows: `SubMiner-*.exe` and `SubMiner-*-win.zip`
- Optional extras: `subminer-assets.tar.gz` and the `subminer` launcher
Note: the `subminer` wrapper script uses Bun (`#!/usr/bin/env bun`), so `bun` must be installed and on `PATH`.