6.4 KiB
YouTube Integration
SubMiner auto-loads Japanese subtitles when you play a YouTube URL, giving you the same sentence-mining overlay experience as local video files. It probes available subtitle tracks via yt-dlp, selects the best primary and secondary tracks, downloads them, and loads them into mpv before playback resumes.
Requirements
- yt-dlp must be installed and on
PATH(or setSUBMINER_YTDLP_BINto its path) - mpv with
--input-ipc-serverconfigured (handled automatically by thesubminerlauncher)
How It Works
When SubMiner detects a YouTube URL (or ytsearch: target), it pauses mpv at startup and runs a subtitle pipeline before resuming playback:
- Probe ---
yt-dlp --dump-single-jsonextracts all available subtitle tracks (manual uploads and auto-generated captions) along with video metadata. - Discover --- Each track is normalized into a
YoutubeTrackOptionwith language code, kind (manualorauto), display label, and direct download URL. - Select --- SubMiner picks the best primary track (Japanese, preferring manual over auto) and secondary track (English, preferring manual over auto).
- Download --- Selected tracks are fetched via direct URL when available, falling back to
yt-dlp --write-subs/--write-auto-subs. YouTube TimedText XML formats (srv1/srv2/srv3) are converted to VTT on the fly. Auto-generated VTT captions are normalized to remove rolling-caption duplication. - Load --- Subtitle files are injected into mpv via
sub-add. Playback resumes once the primary track is ready; secondary failures do not block.
Pipeline Diagram
flowchart TD
classDef step fill:#c6a0f6,stroke:#494d64,color:#24273a
classDef action fill:#8aadf4,stroke:#494d64,color:#24273a
classDef result fill:#a6da95,stroke:#494d64,color:#24273a
classDef enrich fill:#8bd5ca,stroke:#494d64,color:#24273a
classDef ext fill:#eed49f,stroke:#494d64,color:#24273a
A[YouTube URL detected]:::step
B[yt-dlp probe]:::ext
C[Track discovery]:::action
D{Auto or manual selection?}:::step
E[Auto-select best tracks]:::action
F[Manual picker — Ctrl+Alt+C]:::action
G[Download subtitle files]:::action
H[Convert TimedText to VTT]:::enrich
I[Normalize auto-caption duplicates]:::enrich
K[sub-add into mpv]:::action
L[Overlay renders subtitles]:::result
A --> B
B --> C
C --> D
D -- startup --> E
D -- user request --> F
E --> G
F --> G
G --> H
H --> I
I --> K
K --> L
Auto-Load Flow
On startup with a YouTube URL:
- mpv launches paused.
- SubMiner calls
yt-dlp --dump-single-jsonto probe all subtitle tracks. - Tracks are split into manual (human-uploaded) and auto (machine-generated) categories.
- The selection algorithm picks:
- Primary: first Japanese manual track, then Japanese auto track, then any manual track, then first available track.
- Secondary: first English manual track, then English auto track (excluding the primary).
- If mpv already exposes an authoritative matching track, SubMiner reuses it instead of downloading again.
- Missing tracks are downloaded to a temp directory and loaded via
sub-add. - Playback unpauses once the primary subtitle is ready.
Manual Subtitle Picker
Press Ctrl+Alt+C during YouTube playback to open the subtitle picker overlay. This lets you:
- Browse all discovered tracks (manual and auto-generated)
- Select different primary and secondary tracks
- Retry track loading if the auto-load failed or picked the wrong track
The picker displays each track with its language, kind (manual/auto), and title when available.
Subtitle Format Handling
SubMiner handles several YouTube subtitle formats transparently:
| Format | Handling |
|---|---|
srt, vtt |
Used directly (preferred for manual tracks) |
srv1, srv2, srv3 |
YouTube TimedText XML --- converted to VTT automatically |
| Auto-generated VTT | Normalized to remove rolling-caption text duplication |
For auto-generated tracks, SubMiner prefers srv3 > srv2 > srv1 > vtt (TimedText XML produces cleaner output). For manual tracks, srt > vtt is preferred.
Configuration Reference
Primary Subtitle Languages
{
"youtube": {
"primarySubLanguages": ["ja", "jpn"]
}
}
| Option | Type | Description |
|---|---|---|
primarySubLanguages |
string[] |
Language priority for YouTube primary subtitle auto-loading (default ["ja", "jpn"]) |
Secondary Subtitle Languages
Secondary track selection uses the shared secondarySub config:
{
"secondarySub": {
"secondarySubLanguages": ["eng", "en"],
"autoLoadSecondarySub": true,
"defaultMode": "hover"
}
}
| Option | Type | Description |
|---|---|---|
secondarySubLanguages |
string[] |
Language codes for secondary subtitle auto-loading (default: English) |
autoLoadSecondarySub |
boolean |
Auto-detect and load matching secondary track |
defaultMode |
"hidden" / "visible" / "hover" |
Initial display mode for secondary subtitles (default: "hover") |
Precedence: CLI flag > environment variable > config.jsonc > built-in default.
Limitations and Troubleshooting
- No subtitles found: The video may not have Japanese subtitles. Open the picker with
Ctrl+Alt+Cto see all available tracks. - yt-dlp not found: Install
yt-dlpand ensure it is onPATH, or setSUBMINER_YTDLP_BINto the binary path. - Probe timeout:
yt-dlphas a 15-second timeout per operation. Slow connections or rate-limited IPs may hit this. Retry or updateyt-dlp. - Auto-caption quality: YouTube auto-generated captions vary in quality. Manual subtitles (when available) are always preferred.
ytsearch:targets:subminer ytsearch:"keyword"plays the first search result. Subtitle availability depends on the matched video.- Secondary subtitle fails: Secondary track failures never block playback. The primary subtitle loads independently.
- Native mpv secondary rendering: Stays hidden during YouTube flows so the SubMiner overlay remains the visible secondary subtitle surface.