style(sync-ui): drop em-dashes from sync window copy

This commit is contained in:
2026-07-11 19:45:47 -07:00
parent 187437b681
commit ac72c23dab
3 changed files with 4 additions and 94 deletions
-89
View File
@@ -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`.
+3 -4
View File
@@ -37,8 +37,7 @@
</div>
<div id="hostList" class="host-list"></div>
<div id="hostListEmpty" class="empty-note hidden">
No saved devices yet — add one below. Hosts you sync from the command line show up here
too.
No saved devices yet. Hosts you sync from the command line show up here too.
</div>
</section>
@@ -78,7 +77,7 @@
on its PATH, or in <code>~/.local/bin</code>).
</li>
<li>
Use <em>Test connection</em> to verify both — it checks SSH and the remote launcher
Use <em>Test connection</em> to verify both. It checks SSH and the remote launcher
in one go.
</li>
</ol>
@@ -108,7 +107,7 @@
</div>
</div>
<p class="panel-hint">
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
<span id="snapshotsDir" class="mono"></span>
</p>
+1 -1
View File
@@ -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);