chore(release): prepare v0.21.1

- Bump version to 0.21.1 and add changelog and release notes
- Follow mpv sub-delay in mining, sidebar, navigation, and replay
- Redesign the expanded stats session view with a reading density chart
- Default ankiConnect.fields.audio to SentenceAudio
- Add missing AniList entries on exact or pinned matches
- Keep the AppImage mount alive under uutils coreutils
This commit is contained in:
sudacode committed 2026-10-29 22:55:00 -07:00
commit 626023217e
58 files changed
+1428 -1023

No files matched your search

+2 -2
View File
@@ -29,7 +29,7 @@ An episode counts as watched after 85% of its length and at least 10 minutes of
2. Finds the matching AniList entry. For season 2 and later, it follows the show's sequels.
3. Sets your progress to that episode and marks the entry Watching, or Completed on the final episode.
The show must already be on your Planning or Watching list. SubMiner does not add new entries, and it never lowers your progress.
If the show is not on your list yet, SubMiner adds it as Watching, but only when the file title exactly matches an AniList title or you pinned the entry with the character dictionary's AniList override. For a looser match, add the show to Planning or Watching yourself. SubMiner never changes entries marked Completed, Paused, Dropped, or Rewatching, and it never lowers your progress.
Failed updates are saved and retried in the background, up to 8 times with growing delays. The queue survives restarts.
@@ -61,7 +61,7 @@ Character dictionary settings live under `anilist.characterDictionary` and are c
**No update after an episode.** Check that `anilist.enabled` is `true` and that you watched at least 85% of the episode.
**"AniList update not possible."** Add the show to your Planning or Watching list, then mark the episode watched again.
**"AniList update not possible."** The show is marked Completed, Paused, Dropped, or Rewatching, or it is not on your list and the title match was not exact. Add the show to your Planning or Watching list, or pin it with the character dictionary's AniList override, then mark the episode watched again.
**Wrong show or episode.** Install guessit and make sure it is on your `PATH`. Unusual file names parse poorly without it.
+1 -1
View File
@@ -103,7 +103,7 @@ Field names are matched case-insensitively. A mapped field that is missing from
Hachidori prepares downloadable word audio before it saves a note through the proxy, so the animated image delay works on the first mine. Set a downloadable pronunciation source in Hachidori's Audio settings. Browser speech cannot be saved to Anki. Without word audio, Hachidori shows a warning and the card gets no word-audio hold.
`fields.audio` gets sentence audio, not word audio. Yomitan writes its own dictionary audio into your note, so point `fields.audio` at a separate field such as `SentenceAudio`. The default, `ExpressionAudio`, is the field many note types use for Yomitan's word audio, so leaving it would overwrite that audio.
`fields.audio` gets sentence audio, not word audio. Yomitan writes its own dictionary audio into your note (often `ExpressionAudio`), so keep `fields.audio` pointed at a separate field such as the default `SentenceAudio`. Pointing it at Yomitan's word-audio field would overwrite that audio.
`ankiConnect.tags` adds tags to every mined or updated card. Set it to `[]` to add none.
+23
View File
@@ -1,5 +1,28 @@
# Changelog
## v0.21.1 (2026-10-26)
**Changed**
- **Stats Session View**: Redesigned the expanded session view in the stats dashboard.
- New stat tiles show pace, lines, known-word rate, lookups, and paused time.
- A reading density chart of known and unknown words replaces the cumulative chart.
- Yomitan lookups and mined cards now appear in their own lane below the chart.
**Fixed**
- **Subtitle Retiming**: Mining, the subtitle sidebar, subtitle navigation, and replay now use the timing you set with mpv's subtitle delay keys (z/x and sub-step), so mined audio and images match the retimed line.
- **Subtitle Sidebar**: mpv keys and mouse actions, like volume keys and double-click fullscreen, work again while the sidebar is open.
**Docs**
- **README**: Refreshed the anime screenshots using the current build.
<details>
<summary>Internal changes</summary>
**Internal**
- **Packaging Layout**: Packaging inputs now live under `packaging/`, and all build output lands in `dist/`, with packaged apps in `dist/release/`.
</details>
## v0.21.0 (2026-10-24)
**Added**
+9 -9
View File
@@ -338,15 +338,15 @@ Creates and updates Anki cards with sentence, audio, and screenshot. Needs the [
**Fields**
| Key | Default | What it does |
| ------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `ankiConnect.fields.word` | `"Expression"` | Word field |
| `ankiConnect.fields.audio` | `"ExpressionAudio"` | Field that receives sentence audio. Set a separate field such as `SentenceAudio` so it does not overwrite Yomitan's word audio |
| `ankiConnect.fields.wordAudio` | `"ExpressionAudio"` | Existing word-audio field, read only to time animated images |
| `ankiConnect.fields.image` | `"Picture"` | Screenshot field |
| `ankiConnect.fields.sentence` | `"Sentence"` | Sentence field |
| `ankiConnect.fields.miscInfo` | `"MiscInfo"` | Metadata field. `null` disables |
| `ankiConnect.metadata.pattern` | `"[SubMiner] %f (%t)"` | MiscInfo template: `%f` filename, `%F` filename with extension, `%t` time, `%T` time with ms, `<br>` newline |
| Key | Default | What it does |
| ------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `ankiConnect.fields.word` | `"Expression"` | Word field |
| `ankiConnect.fields.audio` | `"SentenceAudio"` | Field that receives sentence audio. Keep it separate from Yomitan's word-audio field so it does not overwrite that audio |
| `ankiConnect.fields.wordAudio` | `"ExpressionAudio"` | Existing word-audio field, read only to time animated images |
| `ankiConnect.fields.image` | `"Picture"` | Screenshot field |
| `ankiConnect.fields.sentence` | `"Sentence"` | Sentence field |
| `ankiConnect.fields.miscInfo` | `"MiscInfo"` | Metadata field. `null` disables |
| `ankiConnect.metadata.pattern` | `"[SubMiner] %f (%t)"` | MiscInfo template: `%f` filename, `%F` filename with extension, `%t` time, `%T` time with ms, `<br>` newline |
**Media**
+1 -1
View File
@@ -70,7 +70,7 @@ Charts for watch time, cards, words, and sessions per day or month, running tota
### Sessions
Session history with new-word activity and pause, seek, and card markers. The **↗** button on a row opens that show's detail view.
Session history. Expand a session for its pace, lines, known-word rate, lookups, and paused time, plus a reading density chart of known and unknown words over the session with Yomitan lookup ticks and clickable card-mined markers underneath. The **↗** button on a row opens that show's detail view.
![Stats Sessions](/screenshots/stats-sessions.png)
+1 -1
View File
@@ -586,7 +586,7 @@
"deck": "", // Restrict duplicate detection and card enrichment to this Anki deck. Leave empty to use the Yomitan mining deck when available.
"fields": {
"word": "Expression", // Card field for the mined word or expression text.
"audio": "ExpressionAudio", // Card field that receives generated sentence audio.
"audio": "SentenceAudio", // Card field that receives generated sentence audio.
"wordAudio": "ExpressionAudio", // Existing word-audio field read to time the frozen first frame of animated images. This mapping is only used for synchronization.
"image": "Picture", // Card field that receives the captured screenshot or animated image.
"sentence": "Sentence", // Card field that receives the source sentence text.