Files
SubMiner/docs-site/index.md
sudacode 5feed360ca feat: add app-owned YouTube subtitle flow with absPlayer-style parsing (#31)
* fix: harden preload argv parsing for popup windows

* fix: align youtube playback with shared overlay startup

* fix: unwrap mpv youtube streams for anki media mining

* docs: update docs for youtube subtitle and mining flow

* refactor: unify cli and runtime wiring for startup and youtube flow

* feat: update subtitle sidebar overlay behavior

* chore: add shared log-file source for diagnostics

* fix(ci): add changelog fragment for immersion changes

* fix: address CodeRabbit review feedback

* fix: persist canonical title from youtube metadata

* style: format stats library tab

* fix: address latest review feedback

* style: format stats library files

* test: stub launcher youtube deps in CI

* test: isolate launcher youtube flow deps

* test: stub launcher youtube deps in failing case

* test: force x11 backend in launcher ci harness

* test: address latest review feedback

* fix(launcher): preserve user YouTube ytdl raw options

* docs(backlog): update task tracking notes

* fix(immersion): special-case youtube media paths in runtime and tracking

* feat(stats): improve YouTube media metadata and picker key handling

* fix(ci): format stats media library hook

* fix: address latest CodeRabbit review items

* docs: update youtube release notes and docs

* feat: auto-load youtube subtitles before manual picker

* fix: restore app-owned youtube subtitle flow

* docs: update youtube playback docs and config copy

* refactor: remove legacy youtube launcher mode plumbing

* fix: refine youtube subtitle startup binding

* docs: clarify youtube subtitle startup behavior

* fix: address PR #31 latest review follow-ups

* fix: address PR #31 follow-up review comments

* test: harden youtube picker test harness

* udpate backlog

* fix: add timeout to youtube metadata probe

* docs: refresh youtube and stats docs

* update backlog

* update backlog

* chore: release v0.9.0
2026-03-24 00:01:24 -07:00

9.8 KiB

layout, title, titleTemplate, hero, features
layout title titleTemplate hero features
home SubMiner Immersion Mining Workflow for MPV
name text tagline image actions
SubMiner Immersion Mining for MPV Watch media, mine vocabulary, and craft anki cards without leaving the scene.
src alt
/assets/SubMiner.png SubMiner logo
theme text link
brand Install /installation
theme text link
alt Explore workflow /mining-workflow
icon title details link linkText
src alt
/assets/mpv.svg mpv icon
Built for mpv Tracks subtitles via mpv IPC in real time. Launch with the wrapper script or the mpv plugin — no external bridge needed. /usage How it works
icon title details link linkText
src alt
/assets/yomitan-icon.svg Yomitan logo
Bundled Yomitan Ships with a built-in Yomitan instance for instant word lookups and context-aware card creation directly from subtitle text. /mining-workflow Mining workflow
icon title details link linkText
src alt
/assets/anki-card.svg Anki card icon
Anki Card Enrichment Auto-fills card fields with sentence, audio clip, screenshot, and translation so you can focus on learning. /anki-integration Anki integration
icon title details link linkText
src alt
/assets/highlight.svg Highlight icon
Reading Annotations N+1 targeting, character-name matching, frequency highlighting, and JLPT tagging — all layered on subtitle text in real time. /subtitle-annotations Annotation details
icon title details link linkText
src alt
/assets/video.svg Video playback icon
YouTube Playback Play YouTube URLs or ytsearch targets directly — SubMiner automatically selects and loads subtitles for the video. /usage#youtube-playback YouTube playback
icon title details link linkText
src alt
/assets/jellyfin.svg Jellyfin icon
Jellyfin Integration Browse your Jellyfin library, pick media interactively, and play through mpv with full subtitle and mining support. /jellyfin-integration Jellyfin setup
icon title details link linkText
src alt
/assets/subtitle-download.svg Subtitle download icon
Subtitle Download & Sync Search and pull subtitles from Jimaku, then auto-sync timing with alass or ffsubsync — all from the overlay. /configuration#jimaku Jimaku integration
icon title details link linkText
src alt
/assets/tokenization.svg Tracking chart icon
Stats Dashboard Browse session history, streak calendars, vocabulary frequency, and per-series progress in a local dashboard — then mine cards straight from your viewing history. /immersion-tracking Dashboard & tracking
icon title details link linkText
src alt
/assets/cross-platform.svg Cross-platform icon
Cross-Platform Runs on Linux (Hyprland, Sway, X11), macOS, and Windows with compositor-aware window positioning and platform-native integration. /installation Platform setup
<script setup> const demoAssetVersion = '20260223-2'; </script>

How it fits together

01
Start
Launch with the wrapper or existing mpv setup and keep subtitles in sync.
02
Lookup
Hover a token in the interactive overlay, then trigger Yomitan lookup to open context.
03
Mine
Create cards from Yomitan or mine sentence cards directly from subtitle lines.
04
Enrich
Automatically attach timing-accurate audio, sentence text, and visual evidence.
05
Track
Open the stats dashboard to review sessions, vocabulary trends, and mine cards from past viewing history.

See it in action

Subtitles, lookup flow, and card enrichment from a real playback session.

subminer -- playback
<style> .landing-shell { max-width: 1120px; margin: 0 auto; padding: 0.5rem 1rem 4rem; } .landing-shell, .landing-shell .step-title, .landing-shell h1, .landing-shell h2 { font-family: var(--tui-font-mono); } .VPHome :deep(.VPFeature), .VPHome :deep(.VPButton), .landing-shell .workflow-step, .landing-shell .demo-window, .landing-shell .demo-window__bar { border-radius: 8px; } .step-title, .step-number { font-family: var(--tui-font-mono); letter-spacing: -0.01em; } /* === Workflow === */ .workflow-section { margin: 2.4rem auto 0; padding: 0; } .workflow-section h2, .demo-section h2 { font-size: 1.45rem; font-weight: 600; letter-spacing: -0.01em; margin-bottom: 1rem; padding-bottom: 4px; } .workflow-section h2::after, .demo-section h2::after { content: ''; display: block; margin-top: 6px; height: 1px; background: repeating-linear-gradient( to right, var(--vp-c-divider) 0, var(--vp-c-divider) 1ch, transparent 1ch, transparent 1.5ch ); } .workflow-steps { display: flex; align-items: stretch; gap: 0; border: 1px solid var(--vp-c-divider); border-radius: 8px; overflow: hidden; } .workflow-step { flex: 1; padding: 1.2rem 1.25rem; background: var(--vp-c-bg-soft); animation: step-enter 400ms ease-out both; position: relative; transition: background 180ms ease; } .workflow-step:hover { background: hsla(232, 23%, 18%, 0.6); } .workflow-step:hover .step-number { color: var(--vp-c-brand-1); text-shadow: 0 0 12px hsla(267, 83%, 80%, 0.3); } .workflow-connector { width: 1px; background: var(--vp-c-divider); flex-shrink: 0; } .workflow-step .step-number { display: inline-block; font-size: 0.7rem; font-weight: 700; letter-spacing: 0.05em; color: var(--vp-c-text-3); margin-bottom: 0.5rem; font-variant-numeric: tabular-nums; transition: color 180ms ease, text-shadow 180ms ease; } .workflow-step .step-number::before { content: '$ '; color: var(--vp-c-text-3); } .workflow-step .step-title { font-weight: 600; font-size: 1rem; margin-bottom: 0.35rem; } .workflow-step .step-desc { font-size: 0.85rem; color: var(--vp-c-text-2); line-height: 1.5; } @keyframes step-enter { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 960px) { .workflow-steps { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px; background: var(--vp-c-divider); } .workflow-step { min-width: 0; } .workflow-step:last-child { grid-column: 1 / -1; } .workflow-connector { display: none; } } @media (max-width: 640px) { .workflow-steps { grid-template-columns: 1fr; } .workflow-step:last-child { grid-column: auto; } } /* === Demo === */ .demo-section { max-width: 960px; margin: 3rem auto 0; padding: 0; } .demo-section p { color: var(--vp-c-text-2); margin: 0 0 1.2rem; line-height: 1.6; } .demo-window { border: 1px solid var(--vp-c-divider); border-radius: 8px; overflow: hidden; animation: step-enter 400ms ease-out 300ms both; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18), 0 20px 48px rgba(0, 0, 0, 0.14); } .demo-window__bar { display: flex; align-items: center; gap: 6px; padding: 8px 12px; background: var(--vp-c-bg-soft); border-bottom: 1px solid var(--vp-c-divider); } .demo-window__dot { width: 10px; height: 10px; border-radius: 50%; } .demo-window__dot:nth-child(1) { background: #ed8796; } .demo-window__dot:nth-child(2) { background: #eed49f; } .demo-window__dot:nth-child(3) { background: #a6da95; } .demo-window__title { font-family: var(--tui-font-mono); font-size: 11px; color: var(--vp-c-text-3); margin-left: 6px; } .demo-window video { width: 100%; display: block; border: none; border-radius: 0; box-shadow: none; margin: 0; } </style>