mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-03-01 06:22:44 -08:00
update docs/backlog
This commit is contained in:
@@ -6,6 +6,7 @@ title: >-
|
|||||||
status: Done
|
status: Done
|
||||||
assignee: []
|
assignee: []
|
||||||
created_date: '2026-02-28 02:38'
|
created_date: '2026-02-28 02:38'
|
||||||
|
updated_date: '2026-02-28 22:36'
|
||||||
labels: []
|
labels: []
|
||||||
dependencies: []
|
dependencies: []
|
||||||
references:
|
references:
|
||||||
@@ -19,6 +20,7 @@ references:
|
|||||||
- src/renderer/renderer.ts
|
- src/renderer/renderer.ts
|
||||||
- docs/plans/2026-02-26-secondary-subtitles-main-overlay.md
|
- docs/plans/2026-02-26-secondary-subtitles-main-overlay.md
|
||||||
priority: medium
|
priority: medium
|
||||||
|
ordinal: 1000
|
||||||
---
|
---
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
---
|
|
||||||
id: TASK-70
|
|
||||||
title: Polish YouTube subtitle generation pipeline
|
|
||||||
status: To Do
|
|
||||||
assignee: []
|
|
||||||
created_date: '2026-02-26 07:37'
|
|
||||||
labels: []
|
|
||||||
dependencies: []
|
|
||||||
---
|
|
||||||
|
|
||||||
## Description
|
|
||||||
|
|
||||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
|
||||||
$Current YouTube subtitle generation in launcher/youtube.ts is functional but has implicit behavior, low observability, and unnecessary full-file work. This task modernizes the existing pipeline without changing core architecture.
|
|
||||||
|
|
||||||
Scope:
|
|
||||||
- Make track selection explicit (manual > auto > whisper per primary/secondary) with deterministic reasons.
|
|
||||||
- Avoid running whisper/audio work when a track is already satisfied.
|
|
||||||
- Add bounded execution for yt-dlp and whisper subprocesses.
|
|
||||||
- Improve stage-level logging for both automatic and preprocess modes.
|
|
||||||
- Make secondary track fallback decisions explicit and not implicit.
|
|
||||||
- Preserve existing user behavior except where policy is clarified.
|
|
||||||
|
|
||||||
Files expected:
|
|
||||||
- launcher/youtube.ts
|
|
||||||
- launcher/commands/playback-command.ts (if mode/status behavior requires)
|
|
||||||
- launcher/types.ts (if schema updates needed)
|
|
||||||
- launcher/config/args-normalizer.ts (if timeout/config options added)
|
|
||||||
- launcher/util.ts (if runExternalCommand timeout controls added)
|
|
||||||
- Add/update launcher subtitle-generation tests
|
|
||||||
<!-- SECTION:DESCRIPTION:END -->
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
<!-- AC:BEGIN -->
|
|
||||||
- [ ] #1 Define deterministic track priority for each track: manual, then auto, then whisper (per track) and record source choice with reason.
|
|
||||||
- [ ] #2 If manual or auto satisfies a track, skip whisper for that same track and avoid unrelated full extraction/transcription work.
|
|
||||||
- [ ] #3 Introduce timeout or budget caps for yt-dlp and whisper calls; timeout should fail safe and unblock automatic playback.
|
|
||||||
- [ ] #4 Emit explicit status logs at each stage: metadata load, manual sub fetch, auto sub fetch, whisper audio extraction, whisper run, publish/load, final success/failure summary.
|
|
||||||
- [ ] #5 Make secondary handling explicit: transcribe target and translate target must only run when required by config and not by side-effect of primary logic.
|
|
||||||
- [ ] #6 Keep preprocess and automatic modes stable in success paths while making behavior in failure paths explicit and bounded.
|
|
||||||
- [ ] #7 Add tests for track-combination cases: primary available, secondary available, both missing, partial fallback, both missing with missing whisper config, timeout/error behavior.
|
|
||||||
- [ ] #8 Document any behavior changes if user-visible, especially fallback order, timeout behavior, and fallback disablement.
|
|
||||||
<!-- AC:END -->
|
|
||||||
@@ -6,6 +6,7 @@ title: >-
|
|||||||
status: Done
|
status: Done
|
||||||
assignee: []
|
assignee: []
|
||||||
created_date: '2026-02-28 02:38'
|
created_date: '2026-02-28 02:38'
|
||||||
|
updated_date: '2026-02-28 22:36'
|
||||||
labels: []
|
labels: []
|
||||||
dependencies: []
|
dependencies: []
|
||||||
references:
|
references:
|
||||||
@@ -18,6 +19,7 @@ references:
|
|||||||
- docs/anki-integration.md
|
- docs/anki-integration.md
|
||||||
- config.example.jsonc
|
- config.example.jsonc
|
||||||
priority: medium
|
priority: medium
|
||||||
|
ordinal: 2000
|
||||||
---
|
---
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ title: 'macOS config validation UX: show full warning details in native dialog'
|
|||||||
status: Done
|
status: Done
|
||||||
assignee: []
|
assignee: []
|
||||||
created_date: '2026-02-28 02:38'
|
created_date: '2026-02-28 02:38'
|
||||||
|
updated_date: '2026-02-28 22:36'
|
||||||
labels: []
|
labels: []
|
||||||
dependencies: []
|
dependencies: []
|
||||||
references:
|
references:
|
||||||
@@ -12,6 +13,7 @@ references:
|
|||||||
- src/main/runtime/startup-config.ts
|
- src/main/runtime/startup-config.ts
|
||||||
- docs/configuration.md
|
- docs/configuration.md
|
||||||
priority: low
|
priority: low
|
||||||
|
ordinal: 3000
|
||||||
---
|
---
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
---
|
---
|
||||||
id: TASK-73
|
id: TASK-73
|
||||||
title: 'MPV plugin: split into modules and optimize startup/command runtime'
|
title: 'MPV plugin: split into modules and optimize startup/command runtime'
|
||||||
status: In Progress
|
status: Done
|
||||||
assignee: []
|
assignee: []
|
||||||
created_date: '2026-02-28 20:50'
|
created_date: '2026-02-28 20:50'
|
||||||
|
updated_date: '2026-02-28 22:36'
|
||||||
labels: []
|
labels: []
|
||||||
dependencies: []
|
dependencies: []
|
||||||
references:
|
references:
|
||||||
@@ -32,6 +33,7 @@ references:
|
|||||||
- docs/architecture.md
|
- docs/architecture.md
|
||||||
- README.md
|
- README.md
|
||||||
priority: medium
|
priority: medium
|
||||||
|
ordinal: 4000
|
||||||
---
|
---
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
id: TASK-75
|
||||||
|
title: 'Tokenizer: configurable POS exclusions for N+1 and frequency annotations'
|
||||||
|
status: Done
|
||||||
|
assignee: []
|
||||||
|
created_date: '2026-03-01 01:23'
|
||||||
|
updated_date: '2026-03-01 01:32'
|
||||||
|
labels: []
|
||||||
|
dependencies: []
|
||||||
|
priority: medium
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||||
|
N+1 and frequency highlighting should ignore non-learning tokens (e.g., particles/auxiliary forms) based on MeCab POS1 tags, while remaining user-configurable.
|
||||||
|
|
||||||
|
Problem example: for subtitle phrase containing になれば, the highlighted N+1 target should not be the non-useful inflection/token piece when POS indicates an excluded class.
|
||||||
|
|
||||||
|
Implement configurable exclusion defaults with add/remove overrides so users can tune behavior without code changes.
|
||||||
|
<!-- SECTION:DESCRIPTION:END -->
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
<!-- AC:BEGIN -->
|
||||||
|
- [x] #1 Default exclusion set omits non-useful POS1 classes from both N+1 candidate selection and frequency highlighting.
|
||||||
|
- [x] #2 Users can add extra POS1 exclusions and remove defaults via config.
|
||||||
|
- [x] #3 Tokenizer/annotation tests cover default behavior and config add/remove overrides.
|
||||||
|
<!-- AC:END -->
|
||||||
|
|
||||||
|
## Final Summary
|
||||||
|
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||||
|
Implemented configurable annotation POS exclusions with defaults+add/remove for both MeCab POS1 and POS2, wired to N+1 candidate selection and frequency highlighting. Added POS2 default exclusion (非自立), expanded POS1 defaults for function words, added Yomitan->MeCab enrichment to carry pos2/pos3 metadata, updated config docs/examples, and added regression tests including になれば case.
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
id: TASK-76
|
||||||
|
title: 'Tokenizer: remove POS exclusion config surface and keep hardcoded defaults'
|
||||||
|
status: Done
|
||||||
|
assignee: []
|
||||||
|
created_date: '2026-03-01 02:45'
|
||||||
|
updated_date: '2026-03-01 02:51'
|
||||||
|
labels: []
|
||||||
|
dependencies: []
|
||||||
|
priority: medium
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||||
|
Remove user-facing config keys for annotation POS exclusions. Keep N+1/frequency POS exclusion behavior as built-in defaults with no config required.
|
||||||
|
|
||||||
|
Scope: remove config parsing/registry/docs/example for annotationFilters.pos1Exclusions/pos2Exclusions while preserving runtime filtering behavior.
|
||||||
|
<!-- SECTION:DESCRIPTION:END -->
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
<!-- AC:BEGIN -->
|
||||||
|
- [x] #1 No user-facing config option exists for annotation POS exclusions.
|
||||||
|
- [x] #2 Runtime N+1/frequency exclusion behavior remains active via built-in defaults.
|
||||||
|
- [x] #3 Config/docs/example/tests updated accordingly.
|
||||||
|
<!-- AC:END -->
|
||||||
|
|
||||||
|
## Final Summary
|
||||||
|
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||||
|
Removed user-facing subtitleStyle.annotationFilters POS exclusion configuration (schema/resolver/options/docs/example). POS-based N+1/frequency filtering now always uses built-in defaults in runtime. Preserved robust exclusion behavior including merged-token overlap POS handling and N+1-only MeCab enrichment path.
|
||||||
|
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||||
@@ -564,6 +564,8 @@ See `config.example.jsonc` for detailed configuration options and more examples.
|
|||||||
| Key | Command | Description |
|
| Key | Command | Description |
|
||||||
| ----------------- | -------------------------- | ------------------------------------- |
|
| ----------------- | -------------------------- | ------------------------------------- |
|
||||||
| `Space` | `["cycle", "pause"]` | Toggle pause |
|
| `Space` | `["cycle", "pause"]` | Toggle pause |
|
||||||
|
| `KeyJ` | `["cycle", "sid"]` | Cycle primary subtitle track |
|
||||||
|
| `Shift+KeyJ` | `["cycle", "secondary-sid"]` | Cycle secondary subtitle track |
|
||||||
| `ArrowRight` | `["seek", 5]` | Seek forward 5 seconds |
|
| `ArrowRight` | `["seek", 5]` | Seek forward 5 seconds |
|
||||||
| `ArrowLeft` | `["seek", -5]` | Seek backward 5 seconds |
|
| `ArrowLeft` | `["seek", -5]` | Seek backward 5 seconds |
|
||||||
| `ArrowUp` | `["seek", 60]` | Seek forward 60 seconds |
|
| `ArrowUp` | `["seek", 60]` | Seek forward 60 seconds |
|
||||||
@@ -780,9 +782,9 @@ Lookup behavior:
|
|||||||
- If `sourcePath` is missing or empty, SubMiner searches default install/runtime locations for `frequency-dictionary` directories (for example app resources, user data paths, and current working directory).
|
- If `sourcePath` is missing or empty, SubMiner searches default install/runtime locations for `frequency-dictionary` directories (for example app resources, user data paths, and current working directory).
|
||||||
- In both cases, only terms with a valid `frequencyRank` are used; everything else falls back to no highlighting.
|
- In both cases, only terms with a valid `frequencyRank` are used; everything else falls back to no highlighting.
|
||||||
- `frequencyDictionary.matchMode` controls which token text is used for frequency lookups: `headword` (dictionary form) or `surface` (visible subtitle text).
|
- `frequencyDictionary.matchMode` controls which token text is used for frequency lookups: `headword` (dictionary form) or `surface` (visible subtitle text).
|
||||||
|
- Frequency highlighting skips tokens that look like non-lexical SFX/interjection noise (for example kana reduplication or short kana endings like `っ`), even when dictionary ranks exist.
|
||||||
|
|
||||||
In `single` mode all highlights use `singleColor`; in `banded` mode tokens map to five ascending color bands from most common to least common inside the topX window.
|
In `single` mode all highlights use `singleColor`; in `banded` mode tokens map to five ascending color bands from most common to least common inside the topX window.
|
||||||
- Frequency highlighting skips tokens that look like non-lexical SFX/interjection noise (for example kana reduplication or short kana endings like `っ`), even when dictionary ranks exist.
|
|
||||||
|
|
||||||
Secondary subtitle defaults: `fontFamily: "Manrope, Inter"`, `fontSize: 24`, `fontColor: "#cad3f5"`, `backgroundColor: "transparent"`. Any property not set in `secondary` falls back to the CSS defaults.
|
Secondary subtitle defaults: `fontFamily: "Manrope, Inter"`, `fontSize: 24`, `fontColor: "#cad3f5"`, `backgroundColor: "transparent"`. Any property not set in `secondary` falls back to the CSS defaults.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user