diff --git a/release/release-notes.md b/release/release-notes.md deleted file mode 100644 index cb29cc55..00000000 --- a/release/release-notes.md +++ /dev/null @@ -1,89 +0,0 @@ -## 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`. diff --git a/src/syncui/index.html b/src/syncui/index.html index a61daec1..914b692e 100644 --- a/src/syncui/index.html +++ b/src/syncui/index.html @@ -37,8 +37,7 @@
@@ -78,7 +77,7 @@ on its PATH, or in ~/.local/bin).
  • - Use Test connection to verify both — it checks SSH and the remote launcher + Use Test connection to verify both. It checks SSH and the remote launcher in one go.
  • @@ -108,7 +107,7 @@

    - A snapshot is a consistent point-in-time copy of the immersion database — handy as a + A snapshot is a consistent point-in-time copy of the immersion database, handy as a manual backup before big merges. Stored in

    diff --git a/src/syncui/syncui.ts b/src/syncui/syncui.ts index 7f95cf9a..95eb796b 100644 --- a/src/syncui/syncui.ts +++ b/src/syncui/syncui.ts @@ -222,7 +222,7 @@ function renderHostCard(entry: SyncHostEntry): HTMLDivElement { statusText.textContent = entry.lastSyncStatus === null ? 'never synced' - : `${when}${entry.lastSyncDetail ? ` — ${entry.lastSyncDetail}` : ''}`; + : `${when}${entry.lastSyncDetail ? ` · ${entry.lastSyncDetail}` : ''}`; statusText.title = entry.lastSyncDetail ?? ''; status.append(dot, statusText); top.append(id, status);