diff --git a/backlog/tasks/task-70 - Overlay-runtime-refactor-remove-invisible-mode-and-bind-visible-overlay-to-mpv-subtitles.md b/backlog/tasks/task-70 - Overlay-runtime-refactor-remove-invisible-mode-and-bind-visible-overlay-to-mpv-subtitles.md index 0013712..c01de78 100644 --- a/backlog/tasks/task-70 - Overlay-runtime-refactor-remove-invisible-mode-and-bind-visible-overlay-to-mpv-subtitles.md +++ b/backlog/tasks/task-70 - Overlay-runtime-refactor-remove-invisible-mode-and-bind-visible-overlay-to-mpv-subtitles.md @@ -6,6 +6,7 @@ title: >- status: Done assignee: [] created_date: '2026-02-28 02:38' +updated_date: '2026-02-28 22:36' labels: [] dependencies: [] references: @@ -19,6 +20,7 @@ references: - src/renderer/renderer.ts - docs/plans/2026-02-26-secondary-subtitles-main-overlay.md priority: medium +ordinal: 1000 --- ## Description diff --git a/backlog/tasks/task-70 - Polish-YouTube-subtitle-generation-pipeline.md b/backlog/tasks/task-70 - Polish-YouTube-subtitle-generation-pipeline.md deleted file mode 100644 index ed674ae..0000000 --- a/backlog/tasks/task-70 - Polish-YouTube-subtitle-generation-pipeline.md +++ /dev/null @@ -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 - - -$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 - - -## Acceptance Criteria - -- [ ] #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. - diff --git a/backlog/tasks/task-71 - Anki-integration-add-local-AnkiConnect-proxy-transport-for-push-based-auto-enrichment.md b/backlog/tasks/task-71 - Anki-integration-add-local-AnkiConnect-proxy-transport-for-push-based-auto-enrichment.md index cd44f4c..9f76b9b 100644 --- a/backlog/tasks/task-71 - Anki-integration-add-local-AnkiConnect-proxy-transport-for-push-based-auto-enrichment.md +++ b/backlog/tasks/task-71 - Anki-integration-add-local-AnkiConnect-proxy-transport-for-push-based-auto-enrichment.md @@ -6,6 +6,7 @@ title: >- status: Done assignee: [] created_date: '2026-02-28 02:38' +updated_date: '2026-02-28 22:36' labels: [] dependencies: [] references: @@ -18,6 +19,7 @@ references: - docs/anki-integration.md - config.example.jsonc priority: medium +ordinal: 2000 --- ## Description diff --git a/backlog/tasks/task-72 - macOS-config-validation-UX-show-full-warning-details-in-native-dialog.md b/backlog/tasks/task-72 - macOS-config-validation-UX-show-full-warning-details-in-native-dialog.md index 4c819a7..533b7bb 100644 --- a/backlog/tasks/task-72 - macOS-config-validation-UX-show-full-warning-details-in-native-dialog.md +++ b/backlog/tasks/task-72 - macOS-config-validation-UX-show-full-warning-details-in-native-dialog.md @@ -4,6 +4,7 @@ title: 'macOS config validation UX: show full warning details in native dialog' status: Done assignee: [] created_date: '2026-02-28 02:38' +updated_date: '2026-02-28 22:36' labels: [] dependencies: [] references: @@ -12,6 +13,7 @@ references: - src/main/runtime/startup-config.ts - docs/configuration.md priority: low +ordinal: 3000 --- ## Description diff --git a/backlog/tasks/task-73 - MPV-plugin-split-into-modules-and-optimize-startup-command-runtime.md b/backlog/tasks/task-73 - MPV-plugin-split-into-modules-and-optimize-startup-command-runtime.md index afd9e43..54cf8ad 100644 --- a/backlog/tasks/task-73 - MPV-plugin-split-into-modules-and-optimize-startup-command-runtime.md +++ b/backlog/tasks/task-73 - MPV-plugin-split-into-modules-and-optimize-startup-command-runtime.md @@ -1,9 +1,10 @@ --- id: TASK-73 title: 'MPV plugin: split into modules and optimize startup/command runtime' -status: In Progress +status: Done assignee: [] created_date: '2026-02-28 20:50' +updated_date: '2026-02-28 22:36' labels: [] dependencies: [] references: @@ -32,6 +33,7 @@ references: - docs/architecture.md - README.md priority: medium +ordinal: 4000 --- ## Description diff --git a/backlog/tasks/task-75 - Tokenizer-configurable-POS-exclusions-for-N1-and-frequency-annotations.md b/backlog/tasks/task-75 - Tokenizer-configurable-POS-exclusions-for-N1-and-frequency-annotations.md new file mode 100644 index 0000000..3d0afe6 --- /dev/null +++ b/backlog/tasks/task-75 - Tokenizer-configurable-POS-exclusions-for-N1-and-frequency-annotations.md @@ -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 + + +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. + + +## Acceptance Criteria + +- [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. + + +## Final Summary + + +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. + diff --git a/backlog/tasks/task-76 - Tokenizer-remove-POS-exclusion-config-surface-and-keep-hardcoded-defaults.md b/backlog/tasks/task-76 - Tokenizer-remove-POS-exclusion-config-surface-and-keep-hardcoded-defaults.md new file mode 100644 index 0000000..c6a389d --- /dev/null +++ b/backlog/tasks/task-76 - Tokenizer-remove-POS-exclusion-config-surface-and-keep-hardcoded-defaults.md @@ -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 + + +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. + + +## Acceptance Criteria + +- [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. + + +## Final Summary + + +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. + diff --git a/docs/configuration.md b/docs/configuration.md index f0bfa8e..0466e71 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -564,6 +564,8 @@ See `config.example.jsonc` for detailed configuration options and more examples. | Key | Command | Description | | ----------------- | -------------------------- | ------------------------------------- | | `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 | | `ArrowLeft` | `["seek", -5]` | Seek backward 5 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). - 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). +- 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. -- 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.