* fix(jellyfin): show overlay, inject plugin, and fix stats title on playb - Show visible overlay automatically during Jellyfin playback so subtitleStyle applies - Inject bundled mpv plugin on auto-launch so keybindings work without overlay focus - Group Jellyfin playback stats under item metadata (jellyfin://host/item/id) instead of stream URLs so episodes merge with matching local titles - Mark ffsubsync unavailable in subsync modal for remote media paths - Drain queued second-instance commands even when onReady throws * fix(overlay): stabilize macOS focus handoff and sidebar Yomitan pause - Keep overlay visible during macOS foreground probe after overlay blur - Hold sidebar hover-pause while a Yomitan lookup popup remains open * fix(jellyfin): fix discovery loop, device identity, tray state, and Disc - Derive device identity from OS hostname; remove legacy configurable client/device fields - Prevent discovery playback from reloading active item, misreporting pause state, and duplicate overlay restores - Restart stale tray discovery sessions without re-login when server drops SubMiner cast target - Sync tray discovery checkbox state on Linux after CLI/startup/remote-session changes - Stop Discord presence falling back to stream URLs; prime title before tokenized stream loads - Fix picker library discovery when log level is above info - Fix config.example.jsonc trailing commas and array formatting * docs(release): trim and consolidate prerelease notes for 0.15.0 - Remove breaking changes section and several redundant bullet points - Consolidate per-platform updater notes into a single entry - Normalize em-dash separators to hyphens in section headers * fix(config): remove trailing commas from config.example.jsonc - Strip trailing commas throughout both config.example.jsonc copies - Reformat inline arrays to multi-line for JSON strictness - Update Jellyfin subtitle preload and playback launch tests and impl * fix(tokenizer): preserve known-word highlight when POS filters suppress - Known-word cache matches now set isKnown=true even for tokens excluded by POS filters - POS exclusion gate suppresses N+1, frequency, and JLPT only; known status is computed before the gate - Jellyfin subtitle preload continues after cleanup failures instead of aborting - Update config docs and option description to document the known-word bypass behavior * fix(jellyfin): send explicit hide/show overlay instead of toggle - Track overlay visibility in plugin state; y-t uses explicit hide/show commands when state is known - Prevent paused Jellyfin playback from resuming on overlay hide - Fix subtitle cache cleanup to only remove dirs after successful cleanup * fix(jellyfin): fix remote progress sync, seek reporting, and startup sto - arm active playback before loadfile with loadedMediaPath: null to suppress premature stop events - force immediate progress report on seek-like position jumps at the mpv time-pos level - send positionTicks and failed=false in reportStopped payload - remove EventName from HTTP timeline payloads (websocket-only field) - add startup grace window to drop stop events before media finishes loading * fix(jellyfin): fix overlay toggle sync, redirect reload, and AppImage bi - Sync visible-overlay state back to plugin via script messages to avoid toggle/hide drift - Collapse duplicate toggle events within 250ms to prevent hide-then-show on single keypress - Preserve manual hide across Jellyfin path-changing redirects even when media-title drops - Rearm managed subtitle defaults on path-changing redirects - Route toggleVisibleOverlay session binding through plugin toggle instead of app-side IPC - Show Linux/Hyprland overlay passively (showInactive) to avoid stealing mpv keyboard focus - Fix AppImage binary resolution to prefer $APPIMAGE env over mounted inner binary - Add stats window layer management so delete/update dialogs appear above stats window - Fix Jellyfin remote progress sync during Linux websocket reconnect windows * Fix CodeRabbit review feedback * fix(jellyfin): subtitle timing, resume progress, and overlay sync - Add per-stream subtitle delay persistence and auto timeline-offset correction - Strip server-selected subtitle stream from mpv load URL; suppress plugin subtitle rearm and auto-start during app-managed preload - Fix resume position lost when mpv resets on stop; use last known position for final progress/stopped reports - Keep Play vs Resume distinct to avoid early seek race on normal play - Fix discovery resume when remote play sends StartPositionTicks=0 despite saved progress - Deduplicate show/hide overlay commands using recorded visibility state - Rewrite docs-site Jellyfin page around cast-to-device UX * test: update lifecycle cleanup assertion * fix: clear aborted playback state, fix overlay passthrough, and guard du - Reset app_managed_playback_pending on lifecycle cleanup to prevent state leak into next item - Record visible overlay action only after command succeeds, not before - Non-native passive overlay now always click-through on re-show (fix isNonNativePassiveOverlay ordering) - Defer activeParsedSubtitleMediaPath assignment until after prefetch completes - Move autoplay gate release into the hide branch of toggleVisibleOverlay - Clear active Jellyfin playback when stopping media that never loaded - Reset managed subtitle delay and delay key when no external tracks are available - Await async removeDir in subtitle cache cleanup - Guard duplicate delete clicks in MediaDetailView and SessionsTab with refs - Escape key in DeleteConfirmDialog now calls stopPropagation and stopImmediatePropagation
8.8 KiB
This is a prerelease build for testing. Stable changelog and docs-site updates remain pending until the final stable release.
Highlights
Added
-
Settings Window: A dedicated Settings window is now available via
subminer --settingsorsubminer settings. Options are organized into Appearance, Behavior, Anki, Input, and Integration sections with learned keybinding controls, AnkiConnect-backed deck/field/note-type pickers, and live reload for stats keys, logging level, Jimaku, Subsync, YouTube language defaults, and Anki field mappings. AI and translation fields remain supported in config files only. -
Auto-Updater: SubMiner can now check for and apply updates from the system tray or by running
subminer -u. Checks include checksum verification, configurable notifications, and an opt-in channel for prerelease builds. Thesubminerlauncher and Linux rofi theme are also updated automatically. -
First-Run Setup: A new optional setup flow installs Bun and the
subminercommand-line launcher on Linux, macOS, and Windows. Windows users get asubminer.cmdPATH shim sosubminerworks in any terminal without manually addingSubMiner.exeto PATH. First-run setup also includes an Open SubMiner Settings button. -
Launcher:
subminer --version/subminer -vnow prints the installed SubMiner app version.
Changed
-
Subtitle Appearance: Primary and secondary subtitle appearance now use color controls plus CSS declaration editors, saved as
subtitleStyle.cssandsubtitleStyle.secondary.css. Existing configs are migrated automatically. Sidebar appearance is now configured viasubtitleSidebar.css; the default subtitle font is updated toHiragino Sans, M PLUS 1, Source Han Sans JP, Noto Sans CJK JP. -
Known-Word Colors: Known-word and N+1 annotation colors moved to
subtitleStyle.knownWordColorandsubtitleStyle.nPlusOneColor. Legacy Anki color keys are still accepted with deprecation warnings. Existing configs that had known-word highlighting enabled retain N+1 highlighting; new configs leave N+1 disabled unlessankiConnect.nPlusOne.enabledis explicitly set. -
Linux Updater: Tray "Check for Updates" now automatically installs the new AppImage via
electron-updater, matching the macOS and Windows tray flow. AppImages managed by a system package (e.g. AUR/opt/SubMiner) and non-AppImage launches fall back to the GitHub-asset flow. -
Jellyfin: The server presets dropdown in Jellyfin setup is removed; setup now shows a single editable server URL field.
-
AniSkip: The key binding setting now uses click-to-learn key capture instead of raw text entry.
-
Setup: The bundled mpv runtime plugin readiness card is removed from first-run setup; the legacy mpv plugin removal notice still appears when needed.
-
Defaults: Jellyfin remote-session startup warmup and character-name subtitle highlighting now default to off.
Fixed
-
macOS Overlay: Significantly improved overlay focus and stability: the overlay now hides when mpv loses focus or is minimized, stays stable through transient window-tracking misses, remains correctly layered during stats mouse passthrough, and opens over fullscreen mpv without switching Spaces. Passthrough is fixed so mpv controls stay clickable before hovering a subtitle bar. Background tracking overhead is reduced while mpv is stably focused.
-
Subtitle Sync Modal: Fixed a macOS issue where opening the subtitle sync modal would flash and disappear on the first attempt, or leave stale state after syncing.
-
Controller: Controller config and debug shortcuts now stay closed while controller support is disabled, with a notice to enable
controller.enabled. Learn mode can be entered from the edit pencil or binding badge, remaps are saved per controller profile, and individual bindings can be reset to their defaults. -
AniList Progress: Progress threshold checks now use fresh playback position data so updates fire correctly when playback reaches or skips past the watched threshold. Season-specific results are preferred for multi-season files, and a clear message is shown when the matched season is not in Planning or Watching status.
-
Character Dictionary: Cached media matches are reused when loading a title with an existing snapshot, avoiding redundant AniList search requests on repeat visits.
-
Updater: Update checks are more stable across platforms: Linux uses GitHub release metadata instead of the native Electron updater,
subminer -ucan update independently of the tray app, macOS update dialogs come to the front reliably, unsupported builds show a manual-install message, and Windows keeps the native NSIS update path while routing updater HTTP through the main process. GitHub release lookups now avoid Electron networking on Linux and macOS. -
Setup - macOS: First-run setup now recognizes existing
subminerlauncher installs in Homebrew or user PATH directories, and manual setup avoids writing into Homebrew-owned paths.subminer app --setupopens the setup flow even when SubMiner is already running in the background. The standalone setup app quits after completing first-run setup, andsubminer settingsexits cleanly when the window is closed - both return control to the terminal without requiring Ctrl+C. -
Tray App: Fixed several lifecycle issues with tray-launched Yomitan settings: the tray stays running when settings are closed; settings loading no longer blocks other tray actions; the settings window uses a close-only menu to prevent accidentally quitting the tray app; an in-page close button is provided on Hyprland where native window controls are unavailable; the embedded popup preview is disabled to prevent renderer hangs during sidebar navigation; extension refreshes at startup are serialized to prevent race conditions; and the session help modal can now close correctly without mpv running.
-
Launcher - Linux: First-run launcher installs are now built with a valid Bun shebang, fixing installs that previously failed silently.
-
Launcher: Launcher-opened videos now reuse an already-running background SubMiner instance and correctly reapply preferred subtitles on warm launches. Videos stay paused when attaching to a running background app until subtitle priming and tokenization readiness complete. Launcher-owned tray apps close after playback ends.
-
Playback: The first subtitle is primed before autoplay resumes so the overlay can render text before video playback begins.
-
Subtitle Frequency: Frequency highlighting is preserved for determiner-led noun compounds like
その場while standalone determiners are still filtered. -
macOS Shortcuts: Native mpv menu shortcuts are disabled during managed macOS playback so configured SubMiner shortcuts work while mpv has focus. Session shortcuts including
stats.markWatchedKeyare now correctly wired through mpv. -
Overlay Restart: The visible overlay and subtitle stream now stay alive after restarting SubMiner from the
y-rshortcut, with correct bounds reapplication on Linux and user-paused playback preserved through readiness gates. -
WebSocket: The subtitle WebSocket is now plain-text only; annotation spans and token metadata are sent exclusively on the annotation WebSocket.
-
Jellyfin: Fixed the setup popup login path on Windows using an IPC bridge, with immediate login progress feedback and a timeout for unreachable server attempts.
-
Windows: Startup failures now show a native error dialog and write fatal details to the app log instead of exiting silently.
-
Yomitan: Fixed Yomitan popups not opening when overlay startup races the Yomitan extension load.
-
Settings: Settings window search now searches across all categories, narrows correctly on multi-word terms, and hides settings with dedicated editors. Live saves for subtitle CSS declarations apply immediately to open overlays. Legacy subtitle appearance options and hover token colors are automatically migrated into
subtitleStyle.css. -
Build - Linux: Fixed one-shot
make clean build installflows so the install step correctly picks up the AppImage produced earlier in the same make invocation.
Docs
- Versioned Docs: Stable docs are now published at the site root with current development docs under
/main/. Fixed versioned docs navigation so archived pages keep local links under the selected version, the version switcher no longer nests paths incorrectly, local dev version routes serve warmed archive files instead of redirecting to production, and internal README files no longer break archived builds.
Installation
See the README and docs/installation guide for full setup steps.
Assets
- Linux:
SubMiner.AppImage - macOS:
SubMiner-*.dmgandSubMiner-*.zip - Optional extras:
subminer-assets.tar.gzand thesubminerlauncher
Note: the subminer wrapper script uses Bun (#!/usr/bin/env bun), so bun must be installed and on PATH.