From 7514985feb17ba0bbca02a7c297ecbb87f228ffe Mon Sep 17 00:00:00 2001 From: sudacode Date: Fri, 3 Apr 2026 21:35:18 -0700 Subject: [PATCH] [codex] Make Windows mpv shortcut self-contained (#40) --- CHANGELOG.md | 46 ++- README.md | 8 +- assets/SubMiner-square.png | Bin 0 -> 1546600 bytes assets/SubMiner.ico | Bin 0 -> 67010 bytes ...ress-PR-40-CodeRabbit-review-follow-ups.md | 39 +++ ...ake-Windows-mpv-shortcut-self-contained.md | 30 ++ ...uto-selection-and-startup-pause-release.md | 56 ++++ ...nonical-mpv-plugin-is-already-installed.md | 53 ++++ changes/251-docs-site-sidebar.md | 6 - changes/252-youtube-playback-socket-path.md | 5 - changes/253-aur-release-best-effort.md | 5 - changes/259-texthooker-integrated-startup.md | 5 - changes/260-playlist-browser.md | 5 - changes/261-macos-overlay-passthrough.md | 5 - changes/262-anilist-post-watch-dedupe.md | 5 - changes/267-yomitan-kiku-popup.md | 6 - .../fix-first-run-setup-plugin-detection.md | 5 + config.example.jsonc | 17 +- docs-site/architecture.md | 2 +- docs-site/changelog.md | 16 ++ docs-site/configuration.md | 7 +- docs-site/installation.md | 6 +- docs-site/launcher-script.md | 2 +- docs-site/mpv-plugin.md | 2 +- docs-site/public/config.example.jsonc | 17 +- docs-site/usage.md | 28 +- launcher/commands/playback-command.ts | 10 + launcher/config/args-normalizer.test.ts | 1 + launcher/config/args-normalizer.ts | 13 +- launcher/config/cli-parser-builder.test.ts | 8 +- launcher/config/cli-parser-builder.ts | 5 +- launcher/mpv.test.ts | 270 ++++++++++++++++-- launcher/mpv.ts | 121 ++++++-- launcher/setup-gate.test.ts | 95 +++++- launcher/setup-gate.ts | 21 +- launcher/smoke.e2e.test.ts | 4 +- launcher/types.ts | 2 +- launcher/util.ts | 14 +- package.json | 15 +- plugin/subminer.conf | 2 +- plugin/subminer/lifecycle.lua | 14 +- scripts/run-coverage-lane.ts | 21 +- scripts/test-plugin-start-gate.lua | 42 +++ src/anki-integration.ts | 8 +- src/anki-integration/anki-connect-proxy.ts | 17 +- src/anki-integration/card-creation.ts | 14 +- src/anki-integration/duplicate.test.ts | 34 ++- src/anki-integration/duplicate.ts | 8 +- src/cli/help.test.ts | 2 +- src/cli/help.ts | 2 +- src/config/config.test.ts | 2 +- src/config/definitions.ts | 3 +- .../definitions/defaults-integrations.ts | 4 + .../definitions/domain-registry.test.ts | 2 + src/config/definitions/options-core.ts | 3 +- .../definitions/options-integrations.ts | 7 + src/config/definitions/template-sections.ts | 14 +- src/config/resolve/integrations.test.ts | 31 ++ src/config/resolve/integrations.ts | 16 ++ src/core/services/discord-presence.ts | 13 +- .../services/immersion-tracker-service.ts | 30 +- .../immersion-tracker/__tests__/query.test.ts | 117 ++++---- .../services/immersion-tracker/lifetime.ts | 11 +- .../immersion-tracker/maintenance.test.ts | 6 +- .../services/immersion-tracker/maintenance.ts | 13 +- .../immersion-tracker/query-lexical.ts | 8 +- .../immersion-tracker/query-maintenance.ts | 4 +- .../immersion-tracker/query-sessions.ts | 28 +- .../immersion-tracker/query-shared.ts | 23 +- .../immersion-tracker/query-trends.ts | 27 +- src/core/services/mpv-protocol.test.ts | 33 +++ src/core/services/mpv-protocol.ts | 109 ++++++- src/core/services/stats-server.ts | 13 +- src/core/services/subsync.test.ts | 46 +++ src/core/services/subsync.ts | 32 ++- .../tokenizer/yomitan-parser-runtime.ts | 3 +- src/core/services/yomitan-extension-paths.ts | 13 +- .../services/youtube/metadata-probe.test.ts | 34 ++- src/core/services/youtube/metadata-probe.ts | 3 +- .../services/youtube/playback-resolve.test.ts | 9 +- src/core/services/youtube/playback-resolve.ts | 4 +- .../services/youtube/track-download.test.ts | 149 +++++++++- src/core/services/youtube/track-download.ts | 5 +- src/core/services/youtube/track-probe.test.ts | 75 ++++- src/core/services/youtube/track-probe.ts | 7 +- src/core/services/youtube/ytdlp-command.ts | 44 +++ src/main-entry-runtime.test.ts | 74 +++++ src/main-entry-runtime.ts | 103 ++++++- src/main-entry.ts | 42 ++- src/main.ts | 100 +++++-- src/main/boot/services.test.ts | 22 +- src/main/boot/services.ts | 13 +- .../character-dictionary-runtime/zip.test.ts | 15 +- src/main/character-dictionary-runtime/zip.ts | 6 +- src/main/runtime/autoplay-ready-gate.test.ts | 71 ++++- src/main/runtime/autoplay-ready-gate.ts | 23 +- .../composers/anilist-setup-composer.test.ts | 4 +- .../composers/cli-startup-composer.test.ts | 9 +- .../runtime/composers/cli-startup-composer.ts | 4 +- .../composers/headless-startup-composer.ts | 36 +-- .../jellyfin-remote-composer.test.ts | 8 +- .../composers/mpv-runtime-composer.test.ts | 5 +- .../overlay-visibility-runtime-composer.ts | 3 +- src/main/runtime/discord-rpc-client.ts | 12 +- .../runtime/first-run-setup-plugin.test.ts | 74 ++++- src/main/runtime/first-run-setup-plugin.ts | 28 +- .../runtime/first-run-setup-service.test.ts | 71 ++++- src/main/runtime/first-run-setup-service.ts | 62 ++-- .../runtime/first-run-setup-window.test.ts | 103 ++++++- src/main/runtime/first-run-setup-window.ts | 118 ++++++-- .../runtime/local-subtitle-selection.test.ts | 77 +++++ src/main/runtime/local-subtitle-selection.ts | 263 +++++++++++++++++ src/main/runtime/playlist-browser-ipc.ts | 9 +- .../runtime/playlist-browser-runtime.test.ts | 161 +++++++++-- src/main/runtime/playlist-browser-runtime.ts | 42 ++- src/main/runtime/windows-mpv-launch.test.ts | 170 +++++++++-- src/main/runtime/windows-mpv-launch.ts | 150 ++++++++-- .../runtime/windows-mpv-shortcuts.test.ts | 2 +- src/main/runtime/windows-mpv-shortcuts.ts | 2 +- .../runtime/youtube-playback-runtime.test.ts | 4 +- src/main/runtime/youtube-playback-runtime.ts | 8 +- src/renderer/handlers/keyboard.ts | 19 +- .../modals/playlist-browser-renderer.ts | 7 +- src/renderer/modals/playlist-browser.test.ts | 26 +- src/renderer/modals/playlist-browser.ts | 8 +- src/renderer/style.css | 11 +- src/renderer/utils/dom.ts | 8 +- src/runtime-options.test.ts | 11 +- src/shared/setup-state.test.ts | 27 +- src/shared/setup-state.ts | 4 +- src/types/config.ts | 8 + 131 files changed, 3367 insertions(+), 716 deletions(-) create mode 100644 assets/SubMiner-square.png create mode 100644 assets/SubMiner.ico create mode 100644 backlog/completed/task-272 - Assess-and-address-PR-40-CodeRabbit-review-follow-ups.md create mode 100644 backlog/tasks/task-270 - Make-Windows-mpv-shortcut-self-contained.md create mode 100644 backlog/tasks/task-271 - Fix-local-playback-subtitle-auto-selection-and-startup-pause-release.md create mode 100644 backlog/tasks/task-273 - Fix-first-run-setup-false-positive-when-canonical-mpv-plugin-is-already-installed.md delete mode 100644 changes/251-docs-site-sidebar.md delete mode 100644 changes/252-youtube-playback-socket-path.md delete mode 100644 changes/253-aur-release-best-effort.md delete mode 100644 changes/259-texthooker-integrated-startup.md delete mode 100644 changes/260-playlist-browser.md delete mode 100644 changes/261-macos-overlay-passthrough.md delete mode 100644 changes/262-anilist-post-watch-dedupe.md delete mode 100644 changes/267-yomitan-kiku-popup.md create mode 100644 changes/fix-first-run-setup-plugin-detection.md create mode 100644 src/config/resolve/integrations.test.ts create mode 100644 src/core/services/youtube/ytdlp-command.ts create mode 100644 src/main/runtime/local-subtitle-selection.test.ts create mode 100644 src/main/runtime/local-subtitle-selection.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 214a470f..b0924d68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,51 @@ # Changelog -## Unreleased +## v0.11.0 (2026-04-03) + +### Added +- Overlay: Added a playlist browser overlay modal for browsing sibling video files and the live mpv queue during playback. +- Overlay: Added the default `Ctrl+Alt+P` keybinding to open the playlist browser and manage queue order without leaving playback. + +### Changed +- Setup: Made mpv plugin installation mandatory in the first-run setup flow, removed the skip path, and kept Finish disabled until the plugin is installed. +- Setup: Clarified that the mpv plugin requirement applies to setup on every platform, while the optional `SubMiner mpv` shortcut remains the recommended Windows playback entry point. ### Fixed -- AniList: Stopped post-watch tracking from sending a second progress update when the current episode was already satisfied by a ready retry item in the same watch-completion pass. +- Main: Resolve the YouTube playback socket path lazily so startup honors CLI and config overrides. +- Main: Add regression coverage for the lazy socket-path lookup during Windows mpv startup. +- Main: Keep integrated `--start --texthooker` launches on the full app-ready startup path so the texthooker page and websocket servers start together during normal playback startup. +- Main: Stop the mpv/plugin auto-start flow from spawning a separate standalone texthooker helper during normal `subminer